rubinius-compiler 2.1.0 → 2.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (91) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +8 -0
  3. data/lib/rubinius/compiler/compiled_file.rb +32 -32
  4. data/lib/rubinius/compiler/version.rb +2 -2
  5. data/rubinius-compiler.gemspec +6 -0
  6. data/spec/alias_spec.rb +39 -0
  7. data/spec/and_spec.rb +44 -0
  8. data/spec/array_spec.rb +110 -0
  9. data/spec/attrasgn_spec.rb +186 -0
  10. data/spec/back_ref_spec.rb +11 -0
  11. data/spec/call_spec.rb +580 -0
  12. data/spec/case_spec.rb +576 -0
  13. data/spec/cdecl_spec.rb +70 -0
  14. data/spec/class_spec.rb +120 -0
  15. data/spec/colon2_spec.rb +8 -0
  16. data/spec/colon3_spec.rb +8 -0
  17. data/spec/const_spec.rb +7 -0
  18. data/spec/custom/guards/profiler.rb +18 -0
  19. data/spec/custom/helpers/generator.rb +828 -0
  20. data/spec/custom/matchers/compile_as.rb +46 -0
  21. data/spec/custom/mspec.rb +15 -0
  22. data/spec/custom/runner/actions/debug.rb +10 -0
  23. data/spec/custom/runner/actions/gcstats.rb +17 -0
  24. data/spec/custom/runner/actions/memory.rb +11 -0
  25. data/spec/custom/runner/actions/parser.rb +14 -0
  26. data/spec/custom/runner/actions/profiler.rb +19 -0
  27. data/spec/custom/runner/relates.rb +86 -0
  28. data/spec/custom/utils/options.rb +40 -0
  29. data/spec/custom/utils/script.rb +50 -0
  30. data/spec/cvar_spec.rb +39 -0
  31. data/spec/cvasgn_spec.rb +33 -0
  32. data/spec/cvdecl_spec.rb +17 -0
  33. data/spec/defined_spec.rb +616 -0
  34. data/spec/defn_spec.rb +732 -0
  35. data/spec/defs_spec.rb +113 -0
  36. data/spec/dot2_spec.rb +16 -0
  37. data/spec/dot3_spec.rb +17 -0
  38. data/spec/dregx_spec.rb +160 -0
  39. data/spec/dstr_spec.rb +424 -0
  40. data/spec/dsym_spec.rb +18 -0
  41. data/spec/dxstr_spec.rb +24 -0
  42. data/spec/ensure_spec.rb +196 -0
  43. data/spec/false_spec.rb +7 -0
  44. data/spec/flip2_spec.rb +21 -0
  45. data/spec/flip3_spec.rb +12 -0
  46. data/spec/for_spec.rb +228 -0
  47. data/spec/gasgn_spec.rb +15 -0
  48. data/spec/generator/encode_spec.rb +34 -0
  49. data/spec/gvar_spec.rb +37 -0
  50. data/spec/hash_spec.rb +108 -0
  51. data/spec/iasgn_spec.rb +26 -0
  52. data/spec/if_spec.rb +415 -0
  53. data/spec/iter_spec.rb +1011 -0
  54. data/spec/lasgn_spec.rb +561 -0
  55. data/spec/lit_spec.rb +61 -0
  56. data/spec/masgn_spec.rb +1558 -0
  57. data/spec/match2_spec.rb +42 -0
  58. data/spec/match3_spec.rb +54 -0
  59. data/spec/match_spec.rb +29 -0
  60. data/spec/module_spec.rb +73 -0
  61. data/spec/nil_spec.rb +7 -0
  62. data/spec/not_spec.rb +47 -0
  63. data/spec/nth_ref_spec.rb +7 -0
  64. data/spec/op_asgn_spec.rb +563 -0
  65. data/spec/or_spec.rb +126 -0
  66. data/spec/postexe_spec.rb +11 -0
  67. data/spec/preexe_spec.rb +21 -0
  68. data/spec/regex_spec.rb +54 -0
  69. data/spec/rescue_spec.rb +763 -0
  70. data/spec/return_spec.rb +152 -0
  71. data/spec/sclass_spec.rb +138 -0
  72. data/spec/spec_helper.rb +12 -0
  73. data/spec/str_spec.rb +118 -0
  74. data/spec/super_spec.rb +170 -0
  75. data/spec/transforms/assembly_spec.rb +195 -0
  76. data/spec/transforms/block_given_spec.rb +75 -0
  77. data/spec/transforms/fast_coerce_spec.rb +112 -0
  78. data/spec/transforms/fast_new_spec.rb +255 -0
  79. data/spec/transforms/invoke_primitive_spec.rb +14 -0
  80. data/spec/transforms/kernel_methods_spec.rb +29 -0
  81. data/spec/transforms/primitive_spec.rb +33 -0
  82. data/spec/transforms/privately_spec.rb +24 -0
  83. data/spec/true_spec.rb +7 -0
  84. data/spec/undef_spec.rb +133 -0
  85. data/spec/until_spec.rb +254 -0
  86. data/spec/valias_spec.rb +11 -0
  87. data/spec/while_spec.rb +494 -0
  88. data/spec/xstr_spec.rb +10 -0
  89. data/spec/yield_spec.rb +92 -0
  90. data/spec/zsuper_spec.rb +63 -0
  91. metadata +258 -3
@@ -0,0 +1,42 @@
1
+ describe "A Match2 node" do
2
+ relates '/x/ =~ "blah"' do
3
+ compile do |g|
4
+ g.memoize do
5
+ g.push_cpath_top
6
+ g.find_const :Regexp
7
+ g.push_literal "x"
8
+ g.push 0
9
+ g.send :new, 2
10
+ end
11
+
12
+ g.push_literal "blah"
13
+ g.string_dup
14
+ g.send :=~, 1
15
+ end
16
+ end
17
+
18
+ relates <<-ruby do
19
+ x = "x"
20
+ /\#{x}/ =~ x
21
+ ruby
22
+
23
+ compile do |g|
24
+ g.push_literal "x"
25
+ g.string_dup
26
+ g.set_local 0
27
+ g.pop
28
+
29
+ g.push_cpath_top
30
+ g.find_const :Regexp
31
+ g.push_local 0
32
+ g.meta_to_s
33
+ g.string_build 1
34
+
35
+ g.push 0
36
+ g.send :new, 2
37
+
38
+ g.push_local 0
39
+ g.send :=~, 1
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,54 @@
1
+ describe "A Match3 node" do
2
+ relates '"blah" =~ /x/' do
3
+ compile do |g|
4
+ g.push_literal "blah"
5
+ g.string_dup
6
+
7
+ g.memoize do
8
+ g.push_cpath_top
9
+ g.find_const :Regexp
10
+ g.push_literal "x"
11
+ g.push 0
12
+ g.send :new, 2
13
+ end
14
+
15
+ g.send :=~, 1
16
+ end
17
+ end
18
+
19
+ relates <<-ruby do
20
+ a = 'abc'
21
+ if a =~ /\#{a}/
22
+ 1
23
+ end
24
+ ruby
25
+
26
+ compile do |g|
27
+ g.push_literal "abc"
28
+ g.string_dup
29
+ g.set_local 0
30
+ g.pop
31
+ g.push_local 0
32
+
33
+ g.push_cpath_top
34
+ g.find_const :Regexp
35
+ g.push_local 0
36
+ g.meta_to_s
37
+ g.string_build 1
38
+
39
+ g.push 0
40
+ g.send :new, 2
41
+
42
+ false_label = g.new_label
43
+ done = g.new_label
44
+ g.send :=~, 1
45
+ g.gif false_label
46
+ g.push 1
47
+ g.goto done
48
+
49
+ false_label.set!
50
+ g.push :nil
51
+ done.set!
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,29 @@
1
+ describe "A Match node" do
2
+ relates "1 if /x/" do
3
+ compile do |g|
4
+ g.push_rubinius
5
+ g.find_const :Globals # FIX: find the other Globals, order flipped
6
+ g.push_literal :$_ # REFACTOR - we use this block a lot
7
+ g.send :[], 1
8
+
9
+ g.memoize do
10
+ g.push_cpath_top
11
+ g.find_const :Regexp
12
+ g.push_literal "x"
13
+ g.push 0
14
+ g.send :new, 2
15
+ end
16
+
17
+ f = g.new_label
18
+ t = g.new_label
19
+
20
+ g.send :=~, 1
21
+ g.gif f
22
+ g.push 1
23
+ g.goto t
24
+ f.set!
25
+ g.push :nil
26
+ t.set!
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,73 @@
1
+ describe "A Module node" do
2
+ relates <<-ruby do
3
+ module X
4
+ def y
5
+ end
6
+ end
7
+ ruby
8
+
9
+ compile do |g|
10
+ in_module :X do |d|
11
+ d.in_method :y do |d2|
12
+ d2.push :nil
13
+ end
14
+ end
15
+ end
16
+ end
17
+
18
+ relates <<-ruby do
19
+ module ::Y
20
+ c
21
+ end
22
+ ruby
23
+
24
+ compile do |g|
25
+ g.push_rubinius
26
+ g.push_literal :Y
27
+ g.push_cpath_top
28
+ g.send :open_module_under, 2
29
+
30
+ d = new_generator(g, :Y)
31
+ g.create_block d
32
+
33
+ d.push_self
34
+ d.add_scope
35
+ d.push :self
36
+ d.send :c, 0, true
37
+ d.ret
38
+
39
+ g.swap
40
+ g.push_scope
41
+ g.push_true
42
+ g.send :call_under, 3
43
+ end
44
+ end
45
+
46
+ relates <<-ruby do
47
+ module X::Y
48
+ c
49
+ end
50
+ ruby
51
+
52
+ compile do |g|
53
+ in_module "X::Y" do |d|
54
+ d.push :self
55
+ d.send :c, 0, true
56
+ end
57
+ end
58
+ end
59
+
60
+ relates <<-ruby do
61
+ "prevent the above from infecting rdoc"
62
+
63
+ module Graffle
64
+ end
65
+ ruby
66
+
67
+ compile do |g|
68
+ g.in_module :Graffle
69
+ g.pop
70
+ g.push :nil
71
+ end
72
+ end
73
+ end
data/spec/nil_spec.rb ADDED
@@ -0,0 +1,7 @@
1
+ describe "A Nil node" do
2
+ relates "nil" do
3
+ compile do |g|
4
+ g.push :nil
5
+ end
6
+ end
7
+ end
data/spec/not_spec.rb ADDED
@@ -0,0 +1,47 @@
1
+ ruby_version_is ""..."1.9" do
2
+ describe "A Not node" do
3
+ relates "(not true)" do
4
+ compile do |g|
5
+ f = g.new_label
6
+ t = g.new_label
7
+
8
+ g.push :true
9
+ g.git f
10
+
11
+ g.push :true
12
+ g.goto t
13
+
14
+ f.set!
15
+ g.push :false
16
+
17
+ t.set!
18
+ end
19
+ end
20
+
21
+ relates <<-ruby do
22
+ a = 1
23
+ b = !a
24
+ ruby
25
+
26
+ compile do |g|
27
+ invert = g.new_label
28
+ done = g.new_label
29
+
30
+ g.push 1
31
+ g.set_local 0
32
+ g.pop
33
+
34
+ g.push_local 0
35
+ g.git invert
36
+ g.push :true
37
+ g.goto done
38
+
39
+ invert.set!
40
+ g.push :false
41
+
42
+ done.set!
43
+ g.set_local 1
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,7 @@
1
+ describe "An Nth_ref node" do
2
+ relates "$1" do
3
+ compile do |g|
4
+ g.last_match 5, 0
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,563 @@
1
+ describe "An Op_asgn1 node" do
2
+ relates "a &&= 8" do
3
+ compile do |g|
4
+ fin = g.new_label
5
+
6
+ g.push_local 0
7
+ g.dup
8
+ g.gif fin
9
+
10
+ g.pop
11
+ g.push 8
12
+ g.set_local 0
13
+
14
+ fin.set!
15
+ end
16
+ end
17
+
18
+ relates "hsh[:blah] ||= 8" do
19
+ compile do |g|
20
+ found = g.new_label
21
+ fin = g.new_label
22
+
23
+ g.push :self
24
+ g.send :hsh, 0, true
25
+ g.push_literal :blah
26
+ g.dup_many 2
27
+
28
+ g.send :[], 1
29
+ g.dup
30
+ g.git found
31
+
32
+ g.pop
33
+ g.push 8
34
+ g.dup
35
+ g.move_down 3
36
+ g.send :[]=, 2
37
+ g.pop
38
+ g.goto fin
39
+
40
+ found.set!
41
+
42
+ g.move_down 2
43
+ g.pop_many 2
44
+
45
+ fin.set!
46
+ end
47
+ end
48
+
49
+ relates <<-ruby do
50
+ x = 1
51
+ hsh[x] ||= 8
52
+ ruby
53
+
54
+ compile do |g|
55
+ g.push 1
56
+ g.set_local 0
57
+ g.pop
58
+
59
+ found = g.new_label
60
+ fin = g.new_label
61
+
62
+ g.push :self
63
+ g.send :hsh, 0, true
64
+ g.push_local 0
65
+ g.dup_many 2
66
+
67
+ g.send :[], 1
68
+ g.dup
69
+ g.git found
70
+
71
+ g.pop
72
+ g.push 8
73
+ g.dup
74
+ g.move_down 3
75
+ g.send :[]=, 2
76
+ g.pop
77
+ g.goto fin
78
+
79
+ found.set!
80
+
81
+ g.move_down 2
82
+ g.pop_many 2
83
+
84
+ fin.set!
85
+ end
86
+ end
87
+
88
+ relates "hsh[:blah] &&= 8" do
89
+ compile do |g|
90
+ found = g.new_label
91
+ fin = g.new_label
92
+
93
+ g.push :self
94
+ g.send :hsh, 0, true
95
+ g.push_literal :blah
96
+ g.dup_many 2
97
+
98
+ g.send :[], 1
99
+ g.dup
100
+ g.gif found
101
+
102
+ g.pop
103
+ g.push 8
104
+ g.dup
105
+ g.move_down 3
106
+ g.send :[]=, 2
107
+ g.pop
108
+ g.goto fin
109
+
110
+ found.set!
111
+
112
+ g.move_down 2
113
+ g.pop_many 2
114
+
115
+ fin.set!
116
+ end
117
+
118
+ end
119
+
120
+ relates "hsh[:blah] ^= 8" do
121
+ compile do |g|
122
+ fin = g.new_label
123
+
124
+ g.push :self
125
+ g.send :hsh, 0, true
126
+ g.push_literal :blah
127
+ g.dup_many 2
128
+
129
+ g.send :[], 1
130
+ g.push 8
131
+ g.send :"^", 1
132
+ g.dup
133
+ g.move_down 3
134
+ g.send :[]=, 2
135
+ g.pop
136
+ end
137
+ end
138
+
139
+ relates "ary[0,1] += [4]" do
140
+ compile do |g|
141
+ g.push :self
142
+ g.send :ary, 0, true
143
+ g.push 0
144
+ g.push 1
145
+ g.dup_many 3
146
+
147
+ g.send :[], 2
148
+
149
+ g.push 4
150
+ g.make_array 1
151
+ g.send :"+", 1
152
+ g.dup
153
+ g.move_down 4
154
+ g.send :[]=, 3
155
+ g.pop
156
+ end
157
+ end
158
+
159
+ relates "x.val ||= 6" do
160
+ compile do |g|
161
+ fnd = g.new_label
162
+ fin = g.new_label
163
+
164
+ g.push :self
165
+ g.send :x, 0, true
166
+ g.dup
167
+ g.send :val, 0
168
+ g.dup
169
+ g.git fnd
170
+
171
+ g.pop
172
+ g.push 6
173
+ g.dup
174
+ g.move_down 2
175
+ g.send :val=, 1
176
+ g.pop
177
+ g.goto fin
178
+
179
+ fnd.set!
180
+ g.swap
181
+ g.pop
182
+ fin.set!
183
+ end
184
+ end
185
+
186
+ relates "x.val &&= 7" do
187
+ compile do |g|
188
+ fnd = g.new_label
189
+ fin = g.new_label
190
+
191
+ g.push :self
192
+ g.send :x, 0, true
193
+ g.dup
194
+ g.send :val, 0
195
+ g.dup
196
+ g.gif fnd
197
+
198
+ g.pop
199
+ g.push 7
200
+ g.dup
201
+ g.move_down 2
202
+ g.send :val=, 1
203
+ g.pop
204
+ g.goto fin
205
+
206
+ fnd.set!
207
+ g.swap
208
+ g.pop
209
+ fin.set!
210
+ end
211
+ end
212
+
213
+ end
214
+
215
+ describe "An Op_asgn2 node" do
216
+ relates "x.val ^= 8" do
217
+ compile do |g|
218
+ g.push :self
219
+ g.send :x, 0, true
220
+ g.dup
221
+ g.send :val, 0
222
+ g.push 8
223
+ g.send :"^", 1
224
+ g.dup
225
+ g.move_down 2
226
+ g.send :val=, 1
227
+ g.pop
228
+ end
229
+ end
230
+
231
+ relates "self.Bag ||= Bag.new" do
232
+ compile do |g|
233
+ t = g.new_label
234
+ f = g.new_label
235
+
236
+ g.push :self
237
+ g.dup
238
+ g.send :Bag, 0
239
+ g.dup
240
+ g.git t
241
+ g.pop
242
+ g.push_const :Bag
243
+ g.send :new, 0, false
244
+ g.dup
245
+ g.move_down 2
246
+ g.send :"Bag=", 1
247
+ g.pop
248
+ g.goto f
249
+
250
+ t.set!
251
+
252
+ g.swap
253
+ g.pop
254
+
255
+ f.set!
256
+ end
257
+ end
258
+
259
+ relates <<-ruby do
260
+ s = Struct.new(:var)
261
+ c = s.new(nil)
262
+ c.var ||= 20
263
+ c.var &&= 21
264
+ c.var += 22
265
+ c.d.e.f ||= 42
266
+ ruby
267
+
268
+ compile do |g|
269
+ l_or = g.new_label
270
+ l_and = g.new_label
271
+ l_plus = g.new_label
272
+ l_or2 = g.new_label
273
+ l_rhs = g.new_label
274
+ bottom = g.new_label
275
+
276
+ g.push_const :Struct
277
+ g.push_literal :var
278
+ g.send :new, 1, false
279
+ g.set_local 0
280
+ g.pop
281
+
282
+ g.push_local 0
283
+ g.push :nil
284
+ g.send :new, 1, false
285
+ g.set_local 1
286
+ g.pop
287
+
288
+ g.push_local 1
289
+ g.dup
290
+ g.send :var, 0
291
+ g.dup
292
+ g.git l_or
293
+
294
+ g.pop
295
+ g.push 20
296
+ g.dup
297
+ g.move_down 2
298
+ g.send :var=, 1
299
+ g.pop
300
+ g.goto l_and
301
+
302
+ l_or.set!
303
+
304
+ g.swap
305
+ g.pop
306
+
307
+ l_and.set!
308
+
309
+ g.pop
310
+ g.push_local 1
311
+ g.dup
312
+ g.send :var, 0
313
+ g.dup
314
+ g.gif l_plus
315
+ g.pop
316
+ g.push 21
317
+ g.dup
318
+ g.move_down 2
319
+ g.send :var=, 1
320
+ g.pop
321
+ g.goto l_or2
322
+
323
+ l_plus.set!
324
+
325
+ g.swap
326
+ g.pop
327
+
328
+ l_or2.set!
329
+
330
+ g.pop
331
+ g.push_local 1
332
+ g.dup
333
+ g.send :var, 0
334
+ g.push 22
335
+ g.send :+, 1
336
+ g.dup
337
+ g.move_down 2
338
+ g.send :var=, 1
339
+ g.pop
340
+ g.pop
341
+
342
+ g.push_local 1
343
+ g.send :d, 0, false
344
+ g.send :e, 0, false
345
+ g.dup
346
+ g.send :f, 0
347
+ g.dup
348
+
349
+ g.git l_rhs
350
+
351
+ g.pop
352
+ g.push 42
353
+ g.dup
354
+ g.move_down 2
355
+ g.send :f=, 1
356
+ g.pop
357
+ g.goto bottom
358
+
359
+ l_rhs.set!
360
+
361
+ g.swap
362
+ g.pop
363
+
364
+ bottom.set!
365
+ end
366
+ end
367
+ end
368
+
369
+ describe "An Op_asgn_and node" do
370
+ relates "@fetcher &&= new(Gem.configuration[:http_proxy])" do
371
+ compile do |g|
372
+ t = g.new_label
373
+
374
+ g.push_ivar :@fetcher
375
+ g.dup
376
+ g.gif t
377
+ g.pop
378
+
379
+ g.push :self
380
+ g.push_const :Gem
381
+ g.send :configuration, 0, false
382
+
383
+ g.push_literal :http_proxy
384
+ g.send :[], 1, false
385
+
386
+ g.send :new, 1, true
387
+
388
+ g.set_ivar :@fetcher
389
+
390
+ t.set!
391
+ end
392
+ end
393
+
394
+ relates <<-ruby do
395
+ a = 0
396
+ a &&= 2
397
+ ruby
398
+
399
+ compile do |g|
400
+ g.push 0
401
+ g.set_local 0
402
+ g.pop
403
+
404
+ g.push_local 0
405
+ g.dup
406
+
407
+ f = g.new_label
408
+ g.gif f
409
+ g.pop
410
+ g.push 2
411
+ g.set_local 0
412
+
413
+ f.set!
414
+ end
415
+ end
416
+ end
417
+
418
+ describe "An Op_asgn_or node" do
419
+ relates "@@var ||= 3" do
420
+ compile do |g|
421
+ done = g.new_label
422
+ notfound = g.new_label
423
+
424
+ g.push_scope
425
+ g.push_literal :@@var
426
+ g.send :class_variable_defined?, 1
427
+ g.gif notfound
428
+
429
+ g.push_scope
430
+ g.push_literal :@@var
431
+ g.send :class_variable_get, 1
432
+ g.dup
433
+ g.git done
434
+ g.pop
435
+
436
+ notfound.set!
437
+ g.push_scope
438
+ g.push_literal :@@var
439
+ g.push 3
440
+ g.send :class_variable_set, 2
441
+
442
+ done.set!
443
+ end
444
+ end
445
+
446
+ relates "a ||= 8" do
447
+ compile do |g|
448
+ fin = g.new_label
449
+
450
+ g.push_local 0
451
+ g.dup
452
+ g.git fin
453
+
454
+ g.pop
455
+ g.push 8
456
+ g.set_local 0
457
+
458
+ fin.set!
459
+ end
460
+ end
461
+
462
+ relates <<-ruby do
463
+ a ||= begin
464
+ b
465
+ rescue
466
+ c
467
+ end
468
+ ruby
469
+
470
+ compile do |g|
471
+ t = g.new_label
472
+
473
+ g.push_local 0
474
+ g.dup
475
+ g.git t
476
+ g.pop
477
+
478
+ for_rescue do |rb|
479
+ rb.body do
480
+ g.push :self
481
+ g.send :b, 0, true
482
+ end
483
+
484
+ rb.condition :StandardError, true do
485
+ g.push :self
486
+ g.send :c, 0, true
487
+ end
488
+ end
489
+
490
+ g.set_local 0
491
+
492
+ t.set!
493
+ end
494
+ end
495
+
496
+ relates "@fetcher ||= new(Gem.configuration[:http_proxy])" do
497
+ compile do |g|
498
+ t = g.new_label
499
+
500
+ g.push_ivar :@fetcher
501
+ g.dup
502
+ g.git t
503
+ g.pop
504
+
505
+ g.push :self
506
+ g.push_const :Gem
507
+ g.send :configuration, 0, false
508
+
509
+ g.push_literal :http_proxy
510
+ g.send :[], 1, false
511
+
512
+ g.send :new, 1, true
513
+
514
+ g.set_ivar :@fetcher
515
+
516
+ t.set!
517
+ end
518
+ end
519
+
520
+ relates "@v ||= { }" do
521
+ compile do |g|
522
+ t = g.new_label
523
+
524
+ g.push_ivar :@v
525
+ g.dup
526
+ g.git t
527
+ g.pop
528
+
529
+ g.push_cpath_top
530
+ g.find_const :Hash
531
+ g.push 0
532
+ g.send :new_from_literal, 1
533
+
534
+ g.set_ivar :@v
535
+
536
+ t.set!
537
+ end
538
+ end
539
+
540
+ relates <<-ruby do
541
+ a = 0
542
+ a ||= 1
543
+ ruby
544
+
545
+ compile do |g|
546
+ t = g.new_label
547
+
548
+ g.push 0
549
+ g.set_local 0
550
+ g.pop # FIX: lame
551
+ g.push_local 0
552
+ g.dup
553
+ g.git t
554
+ g.pop
555
+
556
+ g.push 1
557
+
558
+ g.set_local 0
559
+
560
+ t.set!
561
+ end
562
+ end
563
+ end