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