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
data/spec/or_spec.rb ADDED
@@ -0,0 +1,126 @@
1
+ describe "An Or node" do
2
+ relates "(a or b)" do
3
+ compile do |g|
4
+ g.push :self
5
+ g.send :a, 0, true
6
+ g.dup
7
+
8
+ lhs_true = g.new_label
9
+ g.git lhs_true
10
+
11
+ g.pop
12
+ g.push :self
13
+ g.send :b, 0, true
14
+
15
+ lhs_true.set!
16
+ end
17
+ end
18
+
19
+ ruby_version_is ""..."1.9" do
20
+ or_complex = lambda do |g|
21
+ j1 = g.new_label
22
+ j2 = g.new_label
23
+ j3 = g.new_label
24
+
25
+ g.push :self
26
+ g.send :a, 0, true
27
+ g.dup
28
+ g.git j1
29
+ g.pop
30
+
31
+ g.push :self
32
+ g.send :b, 0, true
33
+ j1.set!
34
+ g.dup
35
+ g.git j3
36
+ g.pop
37
+
38
+ g.push :self
39
+ g.send :c, 0, true
40
+ g.dup
41
+ g.gif j2
42
+ g.pop
43
+
44
+ g.push :self
45
+ g.send :d, 0, true
46
+
47
+ j2.set!
48
+ j3.set!
49
+ end
50
+
51
+ relates "((a || b) || (c && d))" do
52
+ compile(&or_complex)
53
+ end
54
+
55
+ relates "((a or b) or (c and d))" do
56
+ compile(&or_complex)
57
+ end
58
+ end
59
+
60
+ ruby_version_is "1.9" do
61
+ or_complex = lambda do |g|
62
+ j1 = g.new_label
63
+ j2 = g.new_label
64
+ j3 = g.new_label
65
+
66
+ g.push :self
67
+ g.send :a, 0, true
68
+ g.dup
69
+ g.git j3
70
+ g.pop
71
+
72
+ g.push :self
73
+ g.send :b, 0, true
74
+ g.dup
75
+ g.git j2
76
+ g.pop
77
+
78
+ g.push :self
79
+ g.send :c, 0, true
80
+ g.dup
81
+ g.gif j1
82
+ g.pop
83
+
84
+ g.push :self
85
+ g.send :d, 0, true
86
+
87
+ j1.set!
88
+ j2.set!
89
+ j3.set!
90
+ end
91
+
92
+ relates "((a || b) || (c && d))" do
93
+ compile(&or_complex)
94
+ end
95
+
96
+ relates "((a or b) or (c and d))" do
97
+ compile(&or_complex)
98
+ end
99
+ end
100
+
101
+ relates "() or a" do
102
+ compile do |g|
103
+ t = g.new_label
104
+ g.push :nil
105
+ g.dup
106
+ g.git t
107
+ g.pop
108
+ g.push :self
109
+ g.send :a, 0, true
110
+ t.set!
111
+ end
112
+ end
113
+
114
+ relates "a or ()" do
115
+ compile do |g|
116
+ t = g.new_label
117
+ g.push :self
118
+ g.send :a, 0, true
119
+ g.dup
120
+ g.git t
121
+ g.pop
122
+ g.push :nil
123
+ t.set!
124
+ end
125
+ end
126
+ end
@@ -0,0 +1,11 @@
1
+ describe "A Postexe node" do
2
+ relates "END { 1 }" do
3
+ compile do |g|
4
+ g.push :self
5
+
6
+ in_block_send :at_exit, :none do |d|
7
+ d.push 1
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,21 @@
1
+ describe "A Preexe node" do
2
+ ruby_version_is ""..."1.9" do
3
+ relates "BEGIN { 1 }" do
4
+ compile do |g|
5
+ g.push_literal Rubinius::ToolSets::Runtime::Compiler
6
+
7
+ in_block_send :pre_exe, :none, nil, 0, false do |d|
8
+ d.push 1
9
+ end
10
+ end
11
+ end
12
+ end
13
+
14
+ ruby_version_is "1.9" do
15
+ relates "BEGIN { 1 }" do
16
+ compile do |g|
17
+ g.push 1
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,54 @@
1
+ describe "A Regex node" do
2
+ relates "str.split(//i)" do
3
+ compile do |g|
4
+ g.push :self
5
+ g.send :str, 0, true
6
+
7
+ g.memoize do
8
+ g.push_cpath_top
9
+ g.find_const :Regexp
10
+ g.push_literal ""
11
+ g.push 1
12
+ g.send :new, 2
13
+ end
14
+
15
+ g.send :split, 1, false
16
+ end
17
+ end
18
+
19
+ relates "/x/n" do
20
+ compile do |g|
21
+ g.memoize do
22
+ g.push_cpath_top
23
+ g.find_const :Regexp
24
+ g.push_literal "x"
25
+ g.push 512
26
+ g.send :new, 2
27
+ end
28
+ end
29
+ end
30
+
31
+ relates "/x/o" do
32
+ compile do |g|
33
+ g.memoize do
34
+ g.push_cpath_top
35
+ g.find_const :Regexp
36
+ g.push_literal "x"
37
+ g.push 0
38
+ g.send :new, 2
39
+ end
40
+ end
41
+ end
42
+
43
+ relates "/x/" do
44
+ compile do |g|
45
+ g.memoize do
46
+ g.push_cpath_top
47
+ g.find_const :Regexp
48
+ g.push_literal "x"
49
+ g.push 0
50
+ g.send :new, 2
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,763 @@
1
+ describe "A Rescue node" do
2
+ rescue_empty = lambda do |g|
3
+ g.for_rescue do |rb|
4
+ rb.body do
5
+ g.push :self
6
+ g.send :blah, 0, true
7
+ end
8
+
9
+ rb.condition :StandardError, true do
10
+ g.push :nil
11
+ end
12
+ end
13
+ end
14
+
15
+ relates "blah rescue nil" do
16
+ compile(&rescue_empty)
17
+ end
18
+
19
+ relates <<-ruby do
20
+ begin
21
+ blah
22
+ rescue
23
+ end
24
+ ruby
25
+
26
+ compile(&rescue_empty)
27
+ end
28
+
29
+ relates <<-ruby do
30
+ begin
31
+ a
32
+ rescue A
33
+ b
34
+ rescue B
35
+ c
36
+ rescue C
37
+ d
38
+ end
39
+ ruby
40
+
41
+ compile do |g|
42
+ g.for_rescue do |rb|
43
+ rb.body do
44
+ g.push :self
45
+ g.send :a, 0, true
46
+
47
+ end
48
+
49
+ rb.condition :A do
50
+ g.push :self
51
+ g.send :b, 0, true
52
+ end
53
+
54
+ rb.condition :B do
55
+ g.push :self
56
+ g.send :c, 0, true
57
+ end
58
+
59
+ rb.condition :C do
60
+ g.push :self
61
+ g.send :d, 0, true
62
+ end
63
+ end
64
+ end
65
+ end
66
+
67
+ relates <<-ruby do
68
+ begin
69
+ a
70
+ rescue => @e
71
+ c
72
+ d
73
+ end
74
+ ruby
75
+
76
+ compile do |g|
77
+ g.for_rescue do |rb|
78
+ rb.body do
79
+ g.push :self
80
+ g.send :a, 0, true
81
+ end
82
+
83
+ rb.condition :StandardError, true do
84
+ g.push_current_exception
85
+ g.set_ivar :@e
86
+ g.pop
87
+ g.push :self
88
+ g.send :c, 0, true
89
+ g.pop
90
+ g.push :self
91
+ g.send :d, 0, true
92
+ end
93
+ end
94
+ end
95
+ end
96
+
97
+ relates <<-ruby do
98
+ begin
99
+ a
100
+ rescue => e
101
+ c
102
+ d
103
+ end
104
+ ruby
105
+
106
+ compile do |g|
107
+ g.for_rescue do |rb|
108
+ rb.body do
109
+ g.push :self
110
+ g.send :a, 0, true
111
+ end
112
+
113
+ rb.condition :StandardError, true do
114
+ g.push_current_exception
115
+ g.set_local 0
116
+ g.pop
117
+ g.push :self
118
+ g.send :c, 0, true
119
+ g.pop
120
+ g.push :self
121
+ g.send :d, 0, true
122
+ end
123
+ end
124
+ end
125
+ end
126
+
127
+ relates <<-ruby do
128
+ begin
129
+ a
130
+ rescue => mes
131
+ # do nothing
132
+ end
133
+
134
+ begin
135
+ b
136
+ rescue => mes
137
+ # do nothing
138
+ end
139
+ ruby
140
+
141
+ compile do |g|
142
+ g.for_rescue do |rb|
143
+ rb.body do
144
+ g.push :self
145
+ g.send :a, 0, true
146
+ end
147
+
148
+ rb.condition :StandardError, true do
149
+ g.push_current_exception
150
+ g.set_local 0
151
+ g.pop
152
+ g.push :nil
153
+ end
154
+ end
155
+
156
+ g.pop
157
+
158
+ g.for_rescue do |rb|
159
+ rb.body do
160
+ g.push :self
161
+ g.send :b, 0, true
162
+ end
163
+
164
+ rb.condition :StandardError, true do
165
+ g.push_current_exception
166
+ g.set_local 0
167
+ g.pop
168
+ g.push :nil
169
+ end
170
+ end
171
+ end
172
+ end
173
+
174
+ relates <<-ruby do
175
+ begin
176
+ blah
177
+ rescue RuntimeError => r
178
+ end
179
+ ruby
180
+
181
+ compile do |g|
182
+ g.for_rescue do |rb|
183
+ rb.body do
184
+ g.push :self
185
+ g.send :blah, 0, true
186
+ end
187
+
188
+ rb.condition :RuntimeError do
189
+ g.push_current_exception
190
+ g.set_local 0
191
+ g.pop
192
+ g.push :nil
193
+ end
194
+ end
195
+ end
196
+ end
197
+
198
+ relates <<-ruby do
199
+ begin
200
+ 1
201
+ rescue => @e
202
+ end
203
+ ruby
204
+
205
+ compile do |g|
206
+ g.for_rescue do |rb|
207
+ rb.body do
208
+ g.push 1
209
+ end
210
+
211
+ rb.condition :StandardError, true do
212
+ g.push_current_exception
213
+ g.set_ivar :@e
214
+ g.pop
215
+ g.push :nil
216
+ end
217
+ end
218
+ end
219
+ end
220
+
221
+ relates <<-ruby do
222
+ begin
223
+ 1
224
+ rescue
225
+ var = 2
226
+ end
227
+ ruby
228
+
229
+ compile do |g|
230
+ g.for_rescue do |rb|
231
+ rb.body do
232
+ g.push 1
233
+ end
234
+
235
+ rb.condition :StandardError, true do
236
+ g.push 2
237
+ g.set_local 0
238
+ end
239
+ end
240
+ end
241
+ end
242
+
243
+ relates <<-ruby do
244
+ begin
245
+ 1
246
+ rescue => e
247
+ end
248
+ ruby
249
+
250
+ compile do |g|
251
+ g.for_rescue do |rb|
252
+ rb.body do
253
+ g.push 1
254
+ end
255
+
256
+ rb.condition :StandardError, true do
257
+ g.push_current_exception
258
+ g.set_local 0
259
+ g.pop
260
+ g.push :nil
261
+ end
262
+ end
263
+ end
264
+ end
265
+
266
+ relates <<-ruby do
267
+ begin
268
+ 1
269
+ rescue
270
+ a.b = nil
271
+ end
272
+ ruby
273
+
274
+ compile do |g|
275
+ g.for_rescue do |rb|
276
+ rb.body do
277
+ g.push 1
278
+ end
279
+
280
+ rb.condition :StandardError, true do
281
+ g.push :self
282
+ g.send :a, 0, true
283
+ g.push :nil
284
+ g.dup
285
+ g.move_down 2
286
+ g.send :b=, 1, false
287
+ g.pop
288
+ end
289
+ end
290
+ end
291
+ end
292
+
293
+ relates <<-ruby do
294
+ begin
295
+ 1
296
+ rescue => e
297
+ var = 2
298
+ end
299
+ ruby
300
+
301
+ compile do |g|
302
+ g.for_rescue do |rb|
303
+ rb.body do
304
+ g.push 1
305
+ end
306
+
307
+ rb.condition :StandardError, true do
308
+ g.push_current_exception
309
+ g.set_local 0
310
+ g.pop
311
+ g.push 2
312
+ g.set_local 1
313
+ end
314
+ end
315
+ end
316
+ end
317
+
318
+ relates <<-ruby do
319
+ begin
320
+ 12
321
+ rescue String
322
+ 13
323
+ else
324
+ 14
325
+ end
326
+ ruby
327
+
328
+ compile do |g|
329
+ g.for_rescue do |rb|
330
+ rb.body do
331
+ g.push 12
332
+ end
333
+
334
+ rb.condition :String do
335
+ g.push 13
336
+ end
337
+
338
+ rb.els do
339
+ g.pop
340
+ g.push 14
341
+ end
342
+ end
343
+ end
344
+ end
345
+
346
+ relates <<-ruby do
347
+ begin
348
+ 12
349
+ rescue *blah
350
+ 13
351
+ end
352
+ ruby
353
+
354
+ compile do |g|
355
+ g.for_rescue do |rb|
356
+ rb.body do
357
+ g.push 12
358
+ end
359
+
360
+ rb.raw_condition do |bl, nl|
361
+ g.dup
362
+ g.push :self
363
+ g.send :blah, 0, true
364
+ g.cast_array
365
+ g.swap
366
+ g.send :__rescue_match__, 1
367
+
368
+ g.git bl
369
+ g.goto nl
370
+
371
+ bl.set!
372
+ g.pop
373
+ g.push 13
374
+ end
375
+ end
376
+ end
377
+ end
378
+
379
+ relates <<-ruby do
380
+ begin
381
+ 12
382
+ rescue String, *blah
383
+ 13
384
+ end
385
+ ruby
386
+
387
+ compile do |g|
388
+ g.for_rescue do |rb|
389
+ rb.body do
390
+ g.push 12
391
+ end
392
+
393
+ rb.raw_condition do |body_label, next_label|
394
+ g.dup
395
+ g.push_const :String
396
+ g.swap
397
+ g.send :===, 1
398
+ g.git body_label
399
+
400
+ g.dup
401
+ g.push :self
402
+ g.send :blah, 0, true
403
+ g.cast_array
404
+ g.swap
405
+
406
+ g.send :__rescue_match__, 1
407
+ g.git body_label
408
+
409
+ g.goto next_label
410
+
411
+ body_label.set!
412
+ g.pop
413
+
414
+ g.push 13
415
+ end
416
+ end
417
+ end
418
+ end
419
+
420
+ relates <<-ruby do
421
+ begin
422
+ 12
423
+ rescue *blah => e
424
+ 13
425
+ end
426
+ ruby
427
+
428
+ compile do |g|
429
+ g.for_rescue do |rb|
430
+ rb.body do
431
+ g.push 12
432
+ end
433
+
434
+ rb.raw_condition do |body_label,next_label|
435
+ g.dup
436
+ g.push :self
437
+ g.send :blah, 0, true
438
+ g.cast_array
439
+ g.swap
440
+
441
+ g.send :__rescue_match__, 1
442
+ g.git body_label
443
+ g.goto next_label
444
+
445
+ body_label.set!
446
+
447
+ g.pop
448
+ g.push_current_exception
449
+ g.set_local 0
450
+ g.pop
451
+
452
+ g.push 13
453
+ end
454
+ end
455
+ end
456
+ end
457
+
458
+ relates <<-ruby do
459
+ begin
460
+ 12
461
+ rescue String, *blah => e
462
+ 13
463
+ end
464
+ ruby
465
+
466
+ compile do |g|
467
+ g.for_rescue do |rb|
468
+ rb.body do
469
+ g.push 12
470
+ end
471
+
472
+ rb.raw_condition do |body_label, next_label|
473
+ g.dup
474
+ g.push_const :String
475
+ g.swap
476
+ g.send :===, 1
477
+ g.git body_label
478
+
479
+ g.dup
480
+ g.push :self
481
+ g.send :blah, 0, true
482
+ g.cast_array
483
+ g.swap
484
+
485
+ g.send :__rescue_match__, 1
486
+ g.git body_label
487
+
488
+ g.goto next_label
489
+
490
+ body_label.set!
491
+ g.pop
492
+
493
+ g.push_current_exception
494
+ g.set_local 0
495
+ g.pop
496
+
497
+ g.push 13
498
+ end
499
+ end
500
+ end
501
+ end
502
+
503
+ relates <<-ruby do
504
+ begin
505
+ 12
506
+ rescue String
507
+ return nil
508
+ end
509
+ ruby
510
+
511
+ compile do |g|
512
+ g.for_rescue do |rb|
513
+ rb.body do
514
+ g.push 12
515
+ end
516
+
517
+ rb.condition :String do
518
+ g.push :nil
519
+ rb.restore_exception
520
+ g.ret
521
+ end
522
+ end
523
+ end
524
+ end
525
+
526
+ relates <<-ruby do
527
+ begin
528
+ 1
529
+ rescue
530
+ begin
531
+ 2
532
+ rescue
533
+ return 3
534
+ end
535
+ end
536
+ ruby
537
+
538
+ compile do |g|
539
+ g.for_rescue do |rb|
540
+ rb.body do
541
+ g.push 1
542
+ end
543
+
544
+ rb.condition :StandardError, true do
545
+ g.for_rescue do |rb2|
546
+ rb2.body do
547
+ g.push 2
548
+ end
549
+
550
+ rb2.condition :StandardError, true do
551
+ g.push 3
552
+ g.push_stack_local 2
553
+ g.restore_exception_state
554
+ g.ret
555
+ end
556
+ end
557
+ end
558
+ end
559
+ end
560
+ end
561
+
562
+ relates <<-ruby do
563
+ begin
564
+ 1
565
+ rescue
566
+ def x
567
+ return 2
568
+ end
569
+ x
570
+ end
571
+ ruby
572
+
573
+ compile do |g|
574
+ for_rescue do |rb|
575
+ rb.body do
576
+ g.push 1
577
+ end
578
+
579
+ rb.condition :StandardError, true do
580
+ g.push_rubinius
581
+ g.push_literal :x
582
+
583
+ d = new_generator(g, :x)
584
+
585
+ d.push 2
586
+ d.ret
587
+ d.ret
588
+
589
+ g.push_literal(d)
590
+
591
+ g.push_scope
592
+ g.push_variables
593
+ g.send :method_visibility, 0
594
+ g.send :add_defn_method, 4
595
+ g.pop
596
+
597
+ g.push :self
598
+ g.send :x, 0, true
599
+ end
600
+ end
601
+ end
602
+ end
603
+
604
+ relates <<-ruby do
605
+ begin
606
+ while 1
607
+ 2
608
+ break :brk
609
+ end
610
+ rescue
611
+ 3
612
+ end
613
+ ruby
614
+
615
+ compile do |g|
616
+ g.for_rescue do |rb|
617
+ rb.body do
618
+ top = g.new_label
619
+ post = g.new_label
620
+ bottom = g.new_label
621
+ brk = g.new_label
622
+
623
+ g.push_modifiers
624
+
625
+ top.set!
626
+ g.push 1
627
+ g.gif bottom
628
+
629
+ # redo
630
+ g.new_label.set!
631
+
632
+ g.push 2
633
+ g.pop
634
+ g.push_literal :brk
635
+ g.goto brk
636
+
637
+ post.set!
638
+ g.pop
639
+ g.check_interrupts
640
+ g.goto top
641
+
642
+ bottom.set!
643
+ g.push :nil
644
+
645
+ brk.set!
646
+ g.pop_modifiers
647
+ end
648
+
649
+ rb.condition :StandardError, true do
650
+ g.push 3
651
+ end
652
+ end
653
+ end
654
+ end
655
+
656
+ relates <<-ruby do
657
+ 1.times do
658
+ begin
659
+ 1
660
+ rescue
661
+ next
662
+ end
663
+ end
664
+ ruby
665
+
666
+ compile do |g|
667
+ g.push 1
668
+ g.in_block_send :times, :none, nil, 0, false do |d|
669
+ d.for_rescue do |rb|
670
+
671
+ rb.body do
672
+ d.push 1
673
+ end
674
+
675
+ rb.condition :StandardError, true do
676
+ d.push :nil
677
+ rb.next
678
+ end
679
+ end
680
+ end
681
+ end
682
+ end
683
+
684
+ relates <<-ruby do
685
+ 1.times do
686
+ begin
687
+ next
688
+ rescue
689
+ 2
690
+ end
691
+ end
692
+ ruby
693
+
694
+ compile do |g|
695
+ g.push 1
696
+ g.in_block_send :times, :none, nil, 0, false do |d|
697
+ d.for_rescue do |rb|
698
+
699
+ rb.body do
700
+ d.push :nil
701
+ rb.next
702
+ end
703
+
704
+ rb.condition :StandardError, true do
705
+ d.push 2
706
+ end
707
+ end
708
+ end
709
+ end
710
+ end
711
+
712
+ relates <<-ruby do
713
+ begin
714
+ 1
715
+ rescue
716
+ while 2
717
+ 3
718
+ break :brk
719
+ end
720
+ end
721
+ ruby
722
+
723
+ compile do |g|
724
+ g.for_rescue do |rb|
725
+ rb.body do
726
+ g.push 1
727
+ end
728
+
729
+ rb.condition :StandardError, true do
730
+ top = g.new_label
731
+ post = g.new_label
732
+ bottom = g.new_label
733
+ brk = g.new_label
734
+
735
+ g.push_modifiers
736
+
737
+ top.set!
738
+ g.push 2
739
+ g.gif bottom
740
+
741
+ # redo
742
+ g.new_label.set!
743
+
744
+ g.push 3
745
+ g.pop
746
+ g.push_literal :brk
747
+ rb.break
748
+
749
+ post.set!
750
+ g.pop
751
+ g.check_interrupts
752
+ g.goto top
753
+
754
+ bottom.set!
755
+ g.push :nil
756
+ brk.set!
757
+
758
+ g.pop_modifiers
759
+ end
760
+ end
761
+ end
762
+ end
763
+ end