class CodeTools::AST::Flip2
Public Class Methods
new(line, start, finish)
click to toggle source
# File lib/rubinius/code/ast/control_flow.rb, line 224 def initialize(line, start, finish) @line = line @start = start @finish = finish end
Public Instance Methods
bytecode(g)
click to toggle source
# File lib/rubinius/code/ast/control_flow.rb, line 238 def bytecode(g) done = g.new_label on_label = g.new_label index = g.state.flip_flops g.state.push_flip_flop get_flip_flop(g, index) g.goto_if_true on_label @start.bytecode(g) g.dup g.goto_if_false done g.pop set_flip_flop(g, index, true) if exclusive? g.goto done else g.pop end on_label.set! g.push_true @finish.bytecode(g) g.goto_if_false done set_flip_flop(g, index, false) g.pop done.set! end
exclusive?()
click to toggle source
# File lib/rubinius/code/ast/control_flow.rb, line 234 def exclusive? false end
get_flip_flop(g, index)
click to toggle source
# File lib/rubinius/code/ast/control_flow.rb, line 269 def get_flip_flop(g, index) g.push_rubinius g.find_const :Runtime g.push_scope g.push_int index g.send(:get_flip_flop, 2) end
set_flip_flop(g, index, value)
click to toggle source
# File lib/rubinius/code/ast/control_flow.rb, line 277 def set_flip_flop(g, index, value) g.push_rubinius g.find_const :Runtime g.push_scope g.push_int index if value g.push_true else g.push_false end g.send(:set_flip_flop, 3) end
sexp_name()
click to toggle source
# File lib/rubinius/code/ast/control_flow.rb, line 230 def sexp_name :flip2 end
to_sexp()
click to toggle source
# File lib/rubinius/code/ast/control_flow.rb, line 290 def to_sexp [sexp_name, @start.to_sexp, @finish.to_sexp] end