class TPPlus::Nodes::WhileNode
Public Class Methods
new(condition_node, block)
click to toggle source
# File lib/tp_plus/nodes/while_node.rb, line 4 def initialize(condition_node, block) @condition_node = condition_node @block = block.flatten.reject {|n| n.is_a?(TerminatorNode) } end
Public Instance Methods
block(context)
click to toggle source
# File lib/tp_plus/nodes/while_node.rb, line 31 def block(context) @block.inject("") {|s,n| s << "#{n.eval(context)} ;\n" } end
bottom_label(context)
click to toggle source
# File lib/tp_plus/nodes/while_node.rb, line 13 def bottom_label(context) @bottom_label ||= context.next_label end
condition(context)
click to toggle source
# File lib/tp_plus/nodes/while_node.rb, line 27 def condition(context) @condition_node.eval(context, opposite: true) end
eval(context)
click to toggle source
# File lib/tp_plus/nodes/while_node.rb, line 35 def eval(context) "LBL[#{top_label(context)}] ;\n#{if_statement(context)}#{block(context)}JMP LBL[#{top_label(context)}] ;\nLBL[#{bottom_label(context)}]" end
if_statement(context)
click to toggle source
# File lib/tp_plus/nodes/while_node.rb, line 23 def if_statement(context) "IF #{parens(condition(context), context)},JMP LBL[#{bottom_label(context)}] ;\n" end
parens(s, context)
click to toggle source
# File lib/tp_plus/nodes/while_node.rb, line 17 def parens(s, context) return s unless @condition_node.requires_mixed_logic?(context) "(#{s})" end
top_label(context)
click to toggle source
# File lib/tp_plus/nodes/while_node.rb, line 9 def top_label(context) @top_label ||= context.next_label end