Class: Atomy::Code::Assign
Instance Method Summary collapse
- #bytecode(gen, mod) ⇒ Object
-
#initialize(pattern, value) ⇒ Assign
constructor
A new instance of Assign.
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 |