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