Class: Atomy::Code::Assign

Inherits:
Object show all
Defined in:
lib/atomy/code/assign.rb

Instance Method Summary collapse

Constructor Details

#initialize(pattern, value) ⇒ Assign

Returns a new instance of Assign.



4
5
6
7
# File 'lib/atomy/code/assign.rb', line 4

def initialize(pattern, value)
  @pattern = pattern
  @value = value
end

Instance Method Details

#bytecode(gen, mod) ⇒ Object



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# 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