fastruby 0.0.19 → 0.0.20

Sign up to get free protection for your applications and to get access to all the features.
Files changed (121) hide show
  1. data/CHANGELOG +8 -0
  2. data/{README → README.rdoc} +6 -1
  3. data/Rakefile +7 -7
  4. data/benchmarks/benchmark.rb~ +14 -2
  5. data/ext/fastruby_base/fastruby_base.inl +8 -4
  6. data/lib/fastruby/builder/inference_updater.rb +76 -0
  7. data/lib/fastruby/builder/inference_updater.rb~ +76 -0
  8. data/lib/fastruby/builder/inferencer.rb +38 -0
  9. data/lib/fastruby/{inliner → builder}/inliner.rb +16 -27
  10. data/lib/fastruby/builder/inliner.rb~ +60 -0
  11. data/lib/fastruby/builder/locals_inference.rb +53 -0
  12. data/lib/fastruby/builder/lvar_type.rb +43 -0
  13. data/lib/fastruby/builder/lvar_type.rb~ +44 -0
  14. data/lib/fastruby/builder/pipeline.rb +43 -0
  15. data/lib/fastruby/builder/pipeline.rb~ +43 -0
  16. data/lib/fastruby/{reductor → builder}/reductor.rb +6 -3
  17. data/lib/fastruby/builder/reductor.rb~ +42 -0
  18. data/lib/fastruby/builder.rb +73 -25
  19. data/lib/fastruby/builder.rb~ +311 -0
  20. data/lib/fastruby/corelib/fixnum.rb +75 -0
  21. data/lib/fastruby/corelib/fixnum.rb~ +146 -0
  22. data/lib/fastruby/corelib/integer.rb +96 -0
  23. data/lib/fastruby/corelib/integer.rb~ +96 -0
  24. data/lib/fastruby/corelib.rb +23 -0
  25. data/lib/fastruby/corelib.rb~ +23 -0
  26. data/lib/fastruby/getlocals.rb +3 -1
  27. data/lib/fastruby/logging.rb +2 -2
  28. data/lib/fastruby/modules/inferencer/infer.rb +31 -0
  29. data/lib/fastruby/modules/inferencer/literal.rb +42 -0
  30. data/lib/fastruby/modules/inliner/call.rb +327 -0
  31. data/lib/fastruby/{inliner/modules/call.rb → modules/inliner/call.rb~} +14 -24
  32. data/lib/fastruby/modules/inliner/defn.rb +41 -0
  33. data/lib/fastruby/modules/inliner/defn.rb~ +29 -0
  34. data/lib/fastruby/modules/inliner/recursive.rb +40 -0
  35. data/lib/fastruby/{inliner/modules/recursive.rb → modules/inliner/recursive.rb~} +1 -1
  36. data/lib/fastruby/modules/lvar_type/call.rb +36 -0
  37. data/lib/fastruby/modules/lvar_type/call.rb~ +36 -0
  38. data/lib/fastruby/modules/lvar_type/defn.rb +42 -0
  39. data/lib/fastruby/modules/lvar_type/defn.rb~ +42 -0
  40. data/lib/fastruby/modules/lvar_type/lasgn.rb +41 -0
  41. data/lib/fastruby/modules/lvar_type/lasgn.rb~ +42 -0
  42. data/lib/fastruby/modules/lvar_type/recursive.rb +33 -0
  43. data/lib/fastruby/modules/lvar_type/recursive.rb~ +33 -0
  44. data/lib/fastruby/{reductor/modules → modules/reductor}/case.rb +0 -0
  45. data/lib/fastruby/modules/reductor/fastruby_flag.rb +33 -0
  46. data/lib/fastruby/{reductor/modules → modules/reductor}/for.rb +0 -0
  47. data/lib/fastruby/{reductor/modules → modules/reductor}/nontree.rb +0 -0
  48. data/lib/fastruby/modules/reductor/nontree.rb~ +32 -0
  49. data/lib/fastruby/{reductor/modules → modules/reductor}/recursive.rb +1 -1
  50. data/lib/fastruby/modules/reductor/recursive.rb~ +31 -0
  51. data/lib/fastruby/{translator/modules → modules/translator}/block.rb +0 -0
  52. data/lib/fastruby/modules/translator/call.rb +344 -0
  53. data/lib/fastruby/{translator/modules/call.rb → modules/translator/call.rb~} +24 -3
  54. data/lib/fastruby/{translator/modules → modules/translator}/defn.rb +10 -9
  55. data/lib/fastruby/modules/translator/defn.rb~ +267 -0
  56. data/lib/fastruby/{translator/modules → modules/translator}/directive.rb +3 -1
  57. data/lib/fastruby/modules/translator/directive.rb~ +44 -0
  58. data/lib/fastruby/{translator/modules → modules/translator}/exceptions.rb +3 -1
  59. data/lib/fastruby/modules/translator/exceptions.rb~ +120 -0
  60. data/lib/fastruby/{translator/modules → modules/translator}/flow.rb +0 -0
  61. data/lib/fastruby/modules/translator/iter.rb +745 -0
  62. data/lib/fastruby/{translator/modules/iter.rb → modules/translator/iter.rb~} +103 -48
  63. data/lib/fastruby/modules/translator/literal.rb +150 -0
  64. data/lib/fastruby/{translator/modules/literal.rb → modules/translator/literal.rb~} +3 -3
  65. data/lib/fastruby/{translator/modules → modules/translator}/logical.rb +0 -0
  66. data/lib/fastruby/{translator/modules → modules/translator}/method_group.rb +0 -0
  67. data/lib/fastruby/{translator/modules → modules/translator}/nonlocal.rb +18 -6
  68. data/lib/fastruby/modules/translator/nonlocal.rb~ +298 -0
  69. data/lib/fastruby/modules/translator/static.rb +290 -0
  70. data/lib/fastruby/{translator/modules/static.rb → modules/translator/static.rb~} +66 -17
  71. data/lib/fastruby/modules/translator/variable.rb +280 -0
  72. data/lib/fastruby/{translator/modules/variable.rb → modules/translator/variable.rb~} +14 -44
  73. data/lib/fastruby/modules.rb +30 -0
  74. data/lib/fastruby/object.rb +42 -6
  75. data/lib/fastruby/object.rb~ +159 -0
  76. data/lib/fastruby/set_tree.rb +7 -11
  77. data/lib/fastruby/set_tree.rb~ +71 -0
  78. data/lib/fastruby/sexp_extension.rb +29 -7
  79. data/lib/fastruby/sexp_extension.rb~ +262 -0
  80. data/lib/fastruby/translator/scope_mode_helper.rb~ +138 -0
  81. data/lib/fastruby/translator/translator.rb +87 -92
  82. data/lib/fastruby/translator/translator.rb~ +1600 -0
  83. data/lib/fastruby/translator/translator_modules.rb +3 -1
  84. data/lib/fastruby/translator/translator_modules.rb~ +53 -0
  85. data/lib/fastruby.rb +3 -1
  86. data/lib/fastruby.rb~ +3 -1
  87. data/lib/fastruby_only/base.rb +1 -0
  88. data/spec/corelib/numeric/fixnum_spec.rb +110 -0
  89. data/spec/corelib/numeric/fixnum_spec.rb~ +104 -0
  90. data/spec/corelib/numeric/integer_spec.rb +173 -0
  91. data/spec/corelib/numeric/integer_spec.rb~ +173 -0
  92. data/spec/fastruby_only/base_spec.rb +74 -0
  93. data/spec/graph/base_spec.rb +2 -1
  94. data/spec/graph/base_spec.rb~ +35 -0
  95. data/spec/graph/path_spec.rb +2 -2
  96. data/spec/graph/path_spec.rb~ +48 -0
  97. data/spec/graph/vertex_spec.rb +2 -1
  98. data/spec/graph/vertex_spec.rb~ +58 -0
  99. data/spec/reductor/base_spec.rb +1 -1
  100. data/spec/ruby/block/lambda_spec.rb~ +163 -0
  101. data/spec/ruby/block/proc_as_block_spec.rb~ +69 -1
  102. data/spec/ruby/block_spec.rb~ +2 -494
  103. data/spec/ruby/call/base_call_spec.rb +1 -1
  104. data/spec/ruby/call/base_call_spec.rb~ +2 -60
  105. data/spec/ruby/defn/replacement_spec.rb +26 -14
  106. data/spec/ruby/defn/replacement_spec.rb~ +13 -3
  107. data/spec/ruby/exception/internal_ex_spec.rb~ +86 -0
  108. data/spec/ruby/integrity_spec.rb~ +35 -1
  109. data/spec/ruby/variable_spec.rb~ +31 -0
  110. data/spec/scope_mode/flow_spec.rb +1 -1
  111. data/spec/scope_mode/flow_spec.rb~ +109 -0
  112. data/spec/sugar/base_spec.rb +29 -0
  113. data/spec/sugar/base_spec.rb~ +16 -0
  114. metadata +100 -43
  115. data/spec/fastruby/inliner/modules/call_spec.rb +0 -0
  116. data/spec/fastruby/translator/modules/nonlocal_spec.rb +0 -0
  117. data/spec/fastruby/translator/translator_spec.rb +0 -0
  118. data/spec/ruby/block/arguments_spec.rb~ +0 -214
  119. data/spec/ruby/block/break_spec.rb~ +0 -236
  120. data/spec/ruby/block/next_spec.rb~ +0 -85
  121. data/spec/ruby/block/retry_spec.rb~ +0 -43
@@ -71,8 +71,7 @@ module FastRuby
71
71
 
72
72
  str_lvar_initialization = "#{@frame_struct} *pframe;
73
73
  #{@locals_struct} *plocals;
74
- pframe = (void*)param;
75
- plocals = (void*)pframe->plocals;
74
+
76
75
  "
77
76
 
78
77
  str_arg_initialization = ""
@@ -150,8 +149,11 @@ module FastRuby
150
149
  static VALUE #{name}(VALUE param) {
151
150
  // call to #{call_tree[2]}
152
151
  VALUE last_expression = Qnil;
152
+ VALUE* args_array = (VALUE*)param;
153
153
 
154
154
  #{str_lvar_initialization}
155
+ pframe = (void*)args_array[0];
156
+ plocals = (void*)pframe->plocals;
155
157
  #{str_evaluate_args};
156
158
 
157
159
  VALUE ret = rb_funcall(#{str_recv}, #{intern_num call_tree[2]}, #{call_args_tree.size-1} #{strargs});
@@ -193,40 +195,16 @@ module FastRuby
193
195
  static VALUE #{name}(VALUE param) {
194
196
  // call to #{call_tree[2]}
195
197
 
198
+ VALUE* args_array = (VALUE*)param;
199
+ int argc = args_array[1];
200
+ VALUE* argv = args_array[2];
201
+
196
202
  VALUE last_expression = Qnil;
197
203
  #{str_lvar_initialization}
198
-
199
- VALUE array = Qnil;
200
-
201
- #{to_c call_args_tree.last[1], "array"};
202
-
203
- if (TYPE(array) != T_ARRAY) {
204
- array = rb_ary_new4(1,&array);
205
- }
206
-
207
- int argc = #{call_args_tree.size-2};
208
- VALUE argv[#{call_args_tree.size} + _RARRAY_LEN(array)];
209
-
210
- VALUE aux_ = Qnil;;
211
- #{
212
- i = -1
213
- call_args_tree[1..-2].map {|arg|
214
- i = i + 1
215
- "
216
- #{to_c arg, "aux_"};
217
- argv[#{i}] = aux_;
218
- "
219
- }.join(";\n")
220
- };
221
-
222
- int array_len = _RARRAY_LEN(array);
223
-
224
- int i;
225
- for (i=0; i<array_len;i++) {
226
- argv[argc] = rb_ary_entry(array,i);
227
- argc++;
228
- }
229
-
204
+
205
+ pframe = (void*)args_array[0];
206
+ plocals = (void*)pframe->plocals;
207
+
230
208
  return rb_funcall2(#{str_recv}, #{intern_num call_tree[2]}, argc, argv);
231
209
  }
232
210
  "
@@ -235,15 +213,10 @@ module FastRuby
235
213
  str_evaluate_args = "
236
214
  #{
237
215
  (0..call_args_tree.size-2).map{|i|
238
- "VALUE arg#{i} = Qnil;"
239
- }.join("\n")
240
- }
241
-
242
- #{
243
- (0..call_args_tree.size-2).map{|i|
244
- to_c(call_args_tree[i+1], "arg#{i}")+";"
216
+ "VALUE arg#{i} = args_array[#{i+1}];"
245
217
  }.join("\n")
246
218
  }
219
+
247
220
  "
248
221
  end
249
222
  end
@@ -313,7 +286,17 @@ if call_type == :lambda
313
286
 
314
287
  } else if (aux == FASTRUBY_TAG_BREAK) {
315
288
  last_expression = frame.return_value;
316
- goto fastruby_local_next;
289
+ typeof(pframe) target_frame_ = (void*)plocals->call_frame;
290
+
291
+ if (target_frame_ == 0) {
292
+ goto fastruby_local_next;
293
+ } else {
294
+ if (target_frame_->targetted == 1) {
295
+ goto fastruby_local_next;
296
+ } else {
297
+ #{_raise("rb_eLocalJumpError","illegal break")};
298
+ }
299
+ }
317
300
  "
318
301
  end
319
302
  }
@@ -586,12 +569,73 @@ fastruby_local_next:
586
569
  }
587
570
 
588
571
 
572
+ #{if call_args_tree.size > 1 and call_args_tree.last[0] == :splat
573
+ "
574
+ VALUE args_array[3];
575
+ VALUE array = Qnil;
576
+
577
+ #{to_c call_args_tree.last[1], "array"};
578
+
579
+ if (TYPE(array) != T_ARRAY) {
580
+ array = rb_ary_new4(1,&array);
581
+ }
582
+
583
+ int argc = #{call_args_tree.size-2};
584
+ VALUE argv[#{call_args_tree.size} + _RARRAY_LEN(array)];
585
+
586
+ VALUE aux_ = Qnil;;
587
+ #{
588
+ i = -1
589
+ call_args_tree[1..-2].map {|arg|
590
+ i = i + 1
591
+ "
592
+ #{to_c arg, "aux_"};
593
+ argv[#{i}] = aux_;
594
+ "
595
+ }.join(";\n")
596
+ };
597
+
598
+ int array_len = _RARRAY_LEN(array);
599
+
600
+ int i;
601
+ for (i=0; i<array_len;i++) {
602
+ argv[argc] = rb_ary_entry(array,i);
603
+ argc++;
604
+ }
605
+
606
+ args_array[0] = (VALUE)pframe;
607
+ args_array[1] = (VALUE)argc;
608
+ args_array[2] = (VALUE)argv;
609
+
589
610
  last_expression = rb_iterate(
590
611
  caller_func,
591
- (VALUE)pframe,
612
+ (VALUE)args_array,
592
613
  block_func,
593
614
  (VALUE)plocals);
594
615
 
616
+ "
617
+ else
618
+ "
619
+
620
+ VALUE args_array[#{call_args_tree.size+2}];
621
+ VALUE aux___ = Qnil;
622
+ args_array[0] = (VALUE)pframe;
623
+
624
+ #{
625
+ (0..call_args_tree.size-2).map{|i|
626
+ to_c(call_args_tree[i+1], "aux___")+";"+
627
+ "args_array[#{i+1}] = aux___;"
628
+ }.join("\n")
629
+ }
630
+
631
+ last_expression = rb_iterate(
632
+ caller_func,
633
+ (VALUE)args_array,
634
+ block_func,
635
+ (VALUE)plocals);
636
+ "
637
+ end
638
+ }
595
639
  if (node == #{@callcc_node_gvar}) {
596
640
 
597
641
  // remove active flags of abandoned stack
@@ -625,7 +669,7 @@ fastruby_local_next:
625
669
  funcall_call_code
626
670
  end
627
671
  else
628
- encoded_address = encode_address(recvtype,signature,mname,call_tree,inference_complete,convention_global_name)
672
+ encoded_address = encode_address(recvtype,signature,mname,call_tree,inference_complete,convention_global_name, true)
629
673
 
630
674
  if call_args_tree.size > 1
631
675
  strargs = (0..call_args_tree.size-2).map{|i| "arg#{i}"}.join(",")
@@ -635,10 +679,21 @@ fastruby_local_next:
635
679
 
636
680
  fastruby_call_code = "
637
681
  // call to #{call_tree[2]}
638
- #{
639
- if call_args_tree.size > 1
640
- str_evaluate_args
641
- end
682
+ #{
683
+ if call_args_tree.size > 1
684
+ " #{
685
+ (0..call_args_tree.size-2).map{|i|
686
+ "VALUE arg#{i} = Qnil;"
687
+ }.join("\n")
688
+ }
689
+
690
+ #{
691
+ (0..call_args_tree.size-2).map{|i|
692
+ to_c(call_args_tree[i+1], "arg#{i}")+";"
693
+ }.join("\n")
694
+ }
695
+ "
696
+ end
642
697
  };
643
698
 
644
699
  VALUE recv = plocals->self;
@@ -0,0 +1,150 @@
1
+ =begin
2
+
3
+ This file is part of the fastruby project, http://github.com/tario/fastruby
4
+
5
+ Copyright (c) 2011 Roberto Dario Seminara <robertodarioseminara@gmail.com>
6
+
7
+ fastruby is free software: you can redistribute it and/or modify
8
+ it under the terms of the gnu general public license as published by
9
+ the free software foundation, either version 3 of the license, or
10
+ (at your option) any later version.
11
+
12
+ fastruby is distributed in the hope that it will be useful,
13
+ but without any warranty; without even the implied warranty of
14
+ merchantability or fitness for a particular purpose. see the
15
+ gnu general public license for more details.
16
+
17
+ you should have received a copy of the gnu general public license
18
+ along with fastruby. if not, see <http://www.gnu.org/licenses/>.
19
+
20
+ =end
21
+ module FastRuby
22
+ class Context
23
+
24
+ define_translator_for(:lit, :arity => 1){|*x| tree = x.first; literal_value tree[1]}
25
+ define_translator_for(:nil, :arity => 1){|*x| tree = x.first; "Qnil"}
26
+ define_translator_for(:str, :arity => 1){|*x| tree = x.first; literal_value tree[1]}
27
+
28
+ define_translator_for(:hash, :method => :to_c_hash)
29
+ def to_c_hash(tree, result_var = nil)
30
+
31
+ hash_tmp_var = "_hash_"+rand(1000000).to_s
32
+ key_tmp_var = "_key_"+rand(1000000).to_s
33
+ value_tmp_var = "_value_"+rand(1000000).to_s
34
+
35
+ code = proc{
36
+ hash_aset_code = ""
37
+ (0..(tree.size-3)/2).each do |i|
38
+ strkey = to_c tree[1 + i * 2]
39
+ strvalue = to_c tree[2 + i * 2]
40
+ hash_aset_code << "
41
+ {
42
+ VALUE #{key_tmp_var} = Qnil;
43
+ VALUE #{value_tmp_var} = Qnil;
44
+
45
+ #{to_c tree[1 + i * 2], key_tmp_var};
46
+ #{to_c tree[2 + i * 2], value_tmp_var};
47
+
48
+ rb_hash_aset(#{hash_tmp_var}, #{key_tmp_var}, #{value_tmp_var});
49
+ }
50
+ "
51
+ end
52
+
53
+ "
54
+ {
55
+ VALUE #{hash_tmp_var} = rb_hash_new();
56
+ #{hash_aset_code};
57
+ #{
58
+ if result_var
59
+ "#{result_var} = #{hash_tmp_var}"
60
+ else
61
+ "return #{hash_tmp_var}"
62
+ end
63
+ };
64
+ }
65
+ "}
66
+
67
+ if result_var
68
+ code.call
69
+ else
70
+ inline_block &code
71
+ end
72
+ end
73
+
74
+ define_translator_for(:array, :method => :to_c_array)
75
+ def to_c_array(tree, result_var = nil)
76
+ if tree.size > 1
77
+ if result_var
78
+ prefix = "_array_element_" + rand(10000000).to_s + "_"
79
+ "
80
+ {
81
+ #{
82
+ (0..tree.size-2).map{|x|
83
+ "VALUE #{prefix}#{x};"
84
+ }.join("\n");
85
+ }
86
+
87
+ #{
88
+ (0..tree.size-2).map{|x|
89
+ to_c(tree[x+1], prefix+x.to_s)
90
+ }.join("\n");
91
+ }
92
+
93
+ #{result_var} = rb_ary_new3(#{tree.size-1}, #{(0..tree.size-2).map{|x| prefix+x.to_s}.join(",")} );
94
+ }
95
+ "
96
+ else
97
+ strargs = tree[1..-1].map{|subtree| to_c subtree}.join(",")
98
+ "rb_ary_new3(#{tree.size-1}, #{strargs})"
99
+ end
100
+ else
101
+ if result_var
102
+ "#{result_var} = rb_ary_new3(0);"
103
+ else
104
+ "rb_ary_new3(0)"
105
+ end
106
+ end
107
+ end
108
+
109
+ define_translator_for(:self, :arity => 1){|*x| tree = x.first; locals_accessor + "self"}
110
+ define_translator_for(:false, :arity => 1){|*x| "Qfalse"}
111
+ define_translator_for(:true, :arity => 1){|*x| "Qtrue"}
112
+
113
+ define_translator_for(:dot2, :method => :to_c_dot2)
114
+ def to_c_dot2(tree, result_var = nil)
115
+
116
+ begin_var = "_begin"+rand(10000000).to_s
117
+ end_var = "_end"+rand(10000000).to_s
118
+
119
+ if result_var
120
+ "
121
+ {
122
+ VALUE #{begin_var} = Qnil;
123
+ VALUE #{end_var} = Qnil;
124
+
125
+ #{to_c tree[1], begin_var};
126
+ #{to_c tree[2], end_var};
127
+
128
+ #{result_var} = rb_range_new(#{begin_var}, #{end_var},0);
129
+ }
130
+ "
131
+ else
132
+ if result_var
133
+ "
134
+ {
135
+ VALUE #{begin_var} = Qnil;
136
+ VALUE #{end_var} = Qnil;
137
+ #{to_c tree[1], begin_var};
138
+ #{to_c tree[2], end_var};
139
+
140
+ #{result_var} = rb_range_new(#{begin_var}, #{end_var},0)
141
+ }
142
+ "
143
+ else
144
+ "rb_range_new(#{to_c tree[1]}, #{to_c tree[2]},0)"
145
+ end
146
+ end
147
+ end
148
+
149
+ end
150
+ end
@@ -21,9 +21,9 @@ along with fastruby. if not, see <http://www.gnu.org/licenses/>.
21
21
  module FastRuby
22
22
  class Context
23
23
 
24
- define_translator_for(:lit, :arity => 1){|tree| literal_value tree[1]}
25
- define_translator_for(:nil, :arity => 1){|tree| "Qnil"}
26
- define_translator_for(:str, :arity => 1){|tree| literal_value tree[1]}
24
+ define_translator_for(:lit, :arity => 1){|*x| tree = x.first; literal_value tree[1]}
25
+ define_translator_for(:nil, :arity => 1){|*x| tree = x.first; "Qnil"}
26
+ define_translator_for(:str, :arity => 1){|*x| tree = x.first; literal_value tree[1]}
27
27
 
28
28
  define_translator_for(:hash, :method => :to_c_hash)
29
29
  def to_c_hash(tree, result_var = nil)
@@ -142,7 +142,9 @@ module FastRuby
142
142
  end
143
143
  end
144
144
 
145
- define_method_handler(:to_c, :priority => 100) { |tree, result_var = nil|
145
+ define_method_handler(:to_c, :priority => 100) { |*x|
146
+ tree, result_var = x
147
+
146
148
 
147
149
  call_tree = tree[1]
148
150
  catch_tag_id = call_tree[3][1][1]
@@ -240,11 +242,15 @@ module FastRuby
240
242
  "
241
243
  end
242
244
 
243
- }.condition{|tree, result_var = nil|
245
+ }.condition{|*x|
246
+ tree, result_var = x
247
+
244
248
  tree.node_type == :iter && tree[1][2] == :_catch
245
249
  }
246
250
 
247
- define_method_handler(:to_c, :priority => 100) { |tree, result_var = nil|
251
+ define_method_handler(:to_c, :priority => 100) { |*x|
252
+ tree, result_var = x
253
+
248
254
  code = ""
249
255
 
250
256
  catch_tag_id = tree[3][1][1]
@@ -262,11 +268,15 @@ module FastRuby
262
268
  else
263
269
  inline_block code
264
270
  end
265
- }.condition{|tree, result_var = nil|
271
+ }.condition{|*x|
272
+ tree, result_var = x
273
+
266
274
  tree.node_type == :call && tree[2] == :_throw
267
275
  }
268
276
 
269
- define_method_handler(:to_c, :priority => 100) { |tree, result_var = nil|
277
+ define_method_handler(:to_c, :priority => 100) { |*x|
278
+ tree, result_var = x
279
+
270
280
  code = ""
271
281
 
272
282
  catch_tag_id = tree[3][1][1]
@@ -277,7 +287,9 @@ module FastRuby
277
287
  else
278
288
  inline_block code
279
289
  end
280
- }.condition{|tree, result_var = nil|
290
+ }.condition{|*x|
291
+ tree, result_var = x
292
+
281
293
  tree.node_type == :call && tree[2] == :_loop
282
294
  }
283
295