class Atomy::Code::Assign

Public Class Methods

new(pattern, value) click to toggle source
# File lib/atomy/code/assign.rb, line 4
def initialize(pattern, value)
  @pattern = pattern
  @value = value
end

Public Instance Methods

bytecode(gen, mod) click to toggle source
# File lib/atomy/code/assign.rb, line 9
def bytecode(gen, mod)
  pattern = mod.pattern(@pattern)

  # [value]
  mod.compile(gen, @value)

  # [value, value]
  gen.dup
  # [pattern, value, value]
  mod.compile(gen, pattern)
  # [value, pattern, value]
  gen.swap

  # [value, pattern, value, pattern, value]
  gen.dup_many(2)

  mismatch = gen.new_label
  done = gen.new_label

  # [bool, value, pattern, value]
  gen.send(:matches?, 1)

  # [value, pattern, value]
  gen.goto_if_false(mismatch)

  # [value, pattern, value]
  pattern.assign(gen)

  # [value]
  gen.pop_many(2)

  # [value]
  gen.goto(done)

  # [value, pattern, value]
  mismatch.set!

  # [::, value, pattern, value]
  gen.push_cpath_top
  # [::Atomy, value, pattern, value]
  gen.find_const(:Atomy)
  # [::Atomy::PatternMismatch, value, pattern, value]
  gen.find_const(:PatternMismatch)
  # [value, pattern, ::Atomy::PatternMismatch, value]
  gen.move_down(2)
  # [#<Atomy::PatternMismatch>, value]
  gen.send(:new, 2)
  # exception
  gen.raise_exc

  # [value]
  done.set!
end