class Atomy::Code::DefineFunction

Public Instance Methods

bytecode(gen, mod) click to toggle source
# File lib/atomy/code/define_function.rb, line 7
def bytecode(gen, mod)
  var = assignment_local(gen, :"#{@name}:function")

  gen.push_rubinius
  gen.find_const(:BlockEnvironment)
  gen.find_const(:AsMethod)

  gen.push_rubinius
  gen.find_const(:BlockEnvironment)
  gen.send(:new, 0)

  if @body
    gen.push_variables

    gen.push_cpath_top
    gen.find_const(:Atomy)
    gen.push_scope
    gen.push_literal(@name)
    push_branch(gen, mod)
    gen.send(:register_branch, 3)
    gen.send(:first, 0)
    gen.send(:build, 0)

    gen.send(:under_context, 2)
  end

  gen.send(:new, 1)

  var.set_bytecode(gen)
end

Private Instance Methods

assignment_local(gen, name) click to toggle source
# File lib/atomy/code/define_function.rb, line 40
def assignment_local(gen, name)
  var = gen.state.scope.search_local(name)

  if var && var.depth == 0
    var
  else
    gen.state.scope.new_local(name).nested_reference
  end
end