class TPPlus::Nodes::ConditionalNode

Public Class Methods

new(type,condition,true_block,false_block) click to toggle source
# File lib/tp_plus/nodes/conditional_node.rb, line 4
def initialize(type,condition,true_block,false_block)
  @type        = type
  @condition   = condition
  @true_block  = true_block.flatten.reject  {|n| n.is_a? TerminatorNode }
  @false_block = false_block.flatten.reject {|n| n.is_a? TerminatorNode }
end

Public Instance Methods

can_be_inlined?() click to toggle source
# File lib/tp_plus/nodes/conditional_node.rb, line 31
def can_be_inlined?
  return false unless @false_block.empty?
  return false unless @true_block.length == 1

  @true_block.first.can_be_inlined?
end
end_label(context) click to toggle source
# File lib/tp_plus/nodes/conditional_node.rb, line 15
def end_label(context)
  @end_label ||= context.next_label
end
eval(context, options={}) click to toggle source
# File lib/tp_plus/nodes/conditional_node.rb, line 48
def eval(context, options={})
  return InlineConditionalNode.new(@type,@condition,@true_block.first).eval(context) if can_be_inlined?

  if @false_block.empty?
    "IF #{parens(@condition.eval(context,opposite: opposite?), context)},JMP LBL[#{true_label(context)}] ;\n#{true_block(context)}LBL[#{true_label(context)}]"
  else
    # could be if-else or unless-else
    "IF #{parens(@condition.eval(context,opposite: opposite?), context)},JMP LBL[#{true_label(context)}] ;\n#{true_block(context)}JMP LBL[#{end_label(context)}] ;\nLBL[#{true_label(context)}] ;\n#{false_block(context)}LBL[#{end_label(context)}]"
  end
end
false_block(context) click to toggle source
# File lib/tp_plus/nodes/conditional_node.rb, line 23
def false_block(context)
  @f ||= string_for(@false_block,context)
end
opposite?() click to toggle source
# File lib/tp_plus/nodes/conditional_node.rb, line 38
def opposite?
  @type == "if"
end
parens(s, context) click to toggle source
# File lib/tp_plus/nodes/conditional_node.rb, line 42
def parens(s, context)
  return s unless @condition.requires_mixed_logic?(context) || !@condition.is_a?(ExpressionNode)

  "(#{s})"
end
string_for(block,context) click to toggle source
# File lib/tp_plus/nodes/conditional_node.rb, line 27
def string_for(block,context)
  block.inject("") {|s,n| s << "#{n.eval(context)} ;\n" }
end
true_block(context) click to toggle source
# File lib/tp_plus/nodes/conditional_node.rb, line 19
def true_block(context)
  @t ||= string_for(@true_block,context)
end
true_label(context) click to toggle source
# File lib/tp_plus/nodes/conditional_node.rb, line 11
def true_label(context)
  @true_label ||= context.next_label
end