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