fastruby 0.0.21 → 0.0.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. data/Rakefile +1 -1
  2. data/benchmarks/benchmark.rb +3 -0
  3. data/benchmarks/benchmark.rb~ +3 -12
  4. data/benchmarks/benchmark8.rb +48 -0
  5. data/benchmarks/benchmark8.rb~ +46 -0
  6. data/lib/fastruby.rb +2 -1
  7. data/lib/fastruby.rb~ +2 -1
  8. data/lib/fastruby/builder.rb +18 -1
  9. data/lib/fastruby/builder.rb~ +18 -5
  10. data/lib/fastruby/modules/lvar_type/lasgn.rb~ +41 -0
  11. data/lib/fastruby/modules/translator/block.rb +1 -1
  12. data/lib/fastruby/modules/translator/block.rb~ +128 -0
  13. data/lib/fastruby/modules/translator/call.rb +62 -139
  14. data/lib/fastruby/modules/translator/call.rb~ +61 -140
  15. data/lib/fastruby/modules/translator/defn.rb +49 -105
  16. data/lib/fastruby/modules/translator/defn.rb~ +211 -0
  17. data/lib/fastruby/modules/translator/exceptions.rb +1 -0
  18. data/lib/fastruby/modules/translator/exceptions.rb~ +120 -0
  19. data/lib/fastruby/modules/translator/iter.rb +13 -20
  20. data/lib/fastruby/modules/translator/iter.rb~ +738 -0
  21. data/lib/fastruby/modules/translator/literal.rb +8 -1
  22. data/lib/fastruby/modules/translator/literal.rb~ +157 -0
  23. data/lib/fastruby/modules/translator/nonlocal.rb +7 -0
  24. data/lib/fastruby/modules/translator/nonlocal.rb~ +304 -0
  25. data/lib/fastruby/modules/translator/static.rb +1 -0
  26. data/lib/fastruby/modules/translator/static.rb~ +290 -0
  27. data/lib/fastruby/modules/translator/variable.rb +24 -6
  28. data/lib/fastruby/modules/translator/variable.rb~ +298 -0
  29. data/lib/fastruby/translator/translator.rb +411 -284
  30. data/lib/fastruby/translator/translator.rb~ +1728 -0
  31. data/spec/fastruby_only/base_spec.rb~ +74 -0
  32. data/spec/ruby/base_spec.rb~ +1 -338
  33. data/spec/ruby/block/break_spec.rb~ +21 -0
  34. data/spec/ruby/block/callcc_spec.rb~ +236 -0
  35. data/spec/ruby/block/lambda_spec.rb~ +1 -178
  36. data/spec/ruby/block/next_spec.rb~ +85 -0
  37. data/spec/ruby/block/proc_spec.rb~ +22 -0
  38. data/spec/ruby/block/redo_spec.rb~ +133 -0
  39. data/spec/ruby/block/retry_spec.rb~ +135 -0
  40. data/spec/ruby/block_spec.rb~ +494 -2
  41. data/spec/ruby/call/base_call_spec.rb~ +60 -2
  42. data/spec/ruby/defn/default_args_spec.rb~ +303 -0
  43. data/spec/ruby/defn/multiple_args_spec.rb~ +317 -0
  44. data/spec/ruby/defn/replacement_spec.rb +29 -1
  45. data/spec/ruby/defn/replacement_spec.rb~ +52 -21
  46. data/spec/ruby/exception/internal_ex_spec.rb~ +2 -2
  47. data/spec/ruby/variable_spec.rb~ +46 -23
  48. data/spec/static/flow_spec.rb~ +48 -0
  49. metadata +34 -12
data/Rakefile CHANGED
@@ -7,7 +7,7 @@ require "rspec/core/rake_task"
7
7
 
8
8
  spec = Gem::Specification.new do |s|
9
9
  s.name = 'fastruby'
10
- s.version = '0.0.21'
10
+ s.version = '0.0.22'
11
11
  s.author = 'Dario Seminara'
12
12
  s.email = 'robertodarioseminara@gmail.com'
13
13
  s.platform = Gem::Platform::RUBY
@@ -38,6 +38,9 @@ Benchmark::bm(20) do |b|
38
38
  Y.optimize(:bar)
39
39
  X.build([X,Fixnum,Fixnum],:foo)
40
40
  Y.build([Y,X],:bar)
41
+ Fixnum.build([Fixnum,Fixnum],:-)
42
+ Fixnum.build([Fixnum,Fixnum],:>)
43
+ Fixnum.build([Fixnum,Fixnum],:+)
41
44
 
42
45
  b.report("fastruby") do
43
46
  y.bar(x)
@@ -1,18 +1,6 @@
1
1
  require "rubygems"
2
2
  require "fastruby"
3
3
 
4
- class Fixnum
5
- fastruby(:fastruby_only => true) do
6
- def +(b)
7
- _static{INT2FIX(FIX2INT(self)+FIX2INT(b))}
8
- end
9
-
10
- def -(b)
11
- _static{INT2FIX(FIX2INT(self)-FIX2INT(b))}
12
- end
13
- end
14
- end
15
-
16
4
  class X
17
5
  def foo(a,b)
18
6
  return a+b
@@ -50,6 +38,9 @@ Benchmark::bm(20) do |b|
50
38
  Y.optimize(:bar)
51
39
  X.build([X,Fixnum,Fixnum],:foo)
52
40
  Y.build([Y,X],:bar)
41
+ Fixnum.build([Fixnum,Fixnum],:-)
42
+ Fixnum.build([Fixnum,Fixnum],:>)
43
+ Fixnum.build([Fixnum,Fixnum],:+)
53
44
 
54
45
  b.report("fastruby") do
55
46
  y.bar(x)
@@ -0,0 +1,48 @@
1
+ require "rubygems"
2
+ require "fastruby"
3
+
4
+ class X
5
+ def foo(a,b)
6
+ return a+b
7
+ end
8
+ end
9
+
10
+ class Y
11
+ def bar(x)
12
+ i = 1000000
13
+
14
+ # removed lvar_type (see benchmark.rb)
15
+
16
+ ret = 0
17
+ while i > 0
18
+ ret = x.foo(i,i)
19
+ i = i - 1
20
+ end
21
+ return ret
22
+ end
23
+ end
24
+
25
+
26
+ x = X.new
27
+ y = Y.new
28
+
29
+ require 'benchmark'
30
+
31
+ Benchmark::bm(20) do |b|
32
+
33
+ b.report("ruby") do
34
+ y.bar(x)
35
+ end
36
+
37
+ X.optimize(:foo)
38
+ Y.optimize(:bar)
39
+ X.build([X,Fixnum,Fixnum],:foo)
40
+ Y.build([Y,X],:bar)
41
+ Fixnum.build([Fixnum,Fixnum],:-)
42
+ Fixnum.build([Fixnum,Fixnum],:>)
43
+ Fixnum.build([Fixnum,Fixnum],:+)
44
+
45
+ b.report("fastruby") do
46
+ y.bar(x)
47
+ end
48
+ end
@@ -0,0 +1,46 @@
1
+ require "rubygems"
2
+ require "fastruby"
3
+
4
+ class X
5
+ def foo(a,b)
6
+ return a+b
7
+ end
8
+ end
9
+
10
+ class Y
11
+ def bar(x)
12
+ i = 1000000
13
+
14
+ ret = 0
15
+ while i > 0
16
+ ret = x.foo(i,i)
17
+ i = i - 1
18
+ end
19
+ return ret
20
+ end
21
+ end
22
+
23
+
24
+ x = X.new
25
+ y = Y.new
26
+
27
+ require 'benchmark'
28
+
29
+ Benchmark::bm(20) do |b|
30
+
31
+ b.report("ruby") do
32
+ y.bar(x)
33
+ end
34
+
35
+ X.optimize(:foo)
36
+ Y.optimize(:bar)
37
+ X.build([X,Fixnum,Fixnum],:foo)
38
+ Y.build([Y,X],:bar)
39
+ Fixnum.build([Fixnum,Fixnum],:-)
40
+ Fixnum.build([Fixnum,Fixnum],:>)
41
+ Fixnum.build([Fixnum,Fixnum],:+)
42
+
43
+ b.report("fastruby") do
44
+ y.bar(x)
45
+ end
46
+ end
@@ -23,6 +23,7 @@ require "fastruby/object"
23
23
  require "fastruby/exceptions"
24
24
  require "fastruby/custom_require"
25
25
  require "fastruby/set_tree"
26
+ require "continuation" if RUBY_VERSION =~ /^1\.9/
26
27
  require "base64"
27
28
 
28
29
  class Object
@@ -32,7 +33,7 @@ class Object
32
33
  end
33
34
 
34
35
  module FastRuby
35
- VERSION = "0.0.21" unless defined? FastRuby::VERSION
36
+ VERSION = "0.0.22" unless defined? FastRuby::VERSION
36
37
  end
37
38
 
38
39
  require "fastruby/corelib"
@@ -23,6 +23,7 @@ require "fastruby/object"
23
23
  require "fastruby/exceptions"
24
24
  require "fastruby/custom_require"
25
25
  require "fastruby/set_tree"
26
+ require "continuation" if RUBY_VERSION =~ /^1\.9/
26
27
  require "base64"
27
28
 
28
29
  class Object
@@ -32,7 +33,7 @@ class Object
32
33
  end
33
34
 
34
35
  module FastRuby
35
- VERSION = "0.0.20" unless defined? FastRuby::VERSION
36
+ VERSION = "0.0.21" unless defined? FastRuby::VERSION
36
37
  end
37
38
 
38
39
  require "fastruby/corelib"
@@ -34,7 +34,22 @@ require FastRuby.fastruby_load_path + "/../ext/fastruby_base/fastruby_base"
34
34
  module FastRuby
35
35
  class Method
36
36
  attr_accessor :options
37
-
37
+
38
+ def self.observe_method_name(mname, &blk)
39
+ @observers ||= Hash.new
40
+ @observers[mname] = @observers[mname] || Array.new
41
+ @observers[mname] << lambda(&blk)
42
+ end
43
+
44
+ def self.notify_method_name(mname)
45
+ return unless @observers
46
+ return unless @observers[mname]
47
+
48
+ @observers[mname].each do |obs|
49
+ obs.call
50
+ end
51
+ end
52
+
38
53
  def initialize(method_name, owner)
39
54
  @method_name = method_name
40
55
  @owner = owner
@@ -46,6 +61,8 @@ module FastRuby
46
61
  end
47
62
 
48
63
  def tree_changed
64
+ FastRuby::Method.notify_method_name(@method_name)
65
+
49
66
  @observers.values.each do |observer|
50
67
  observer.call(self)
51
68
  end
@@ -34,7 +34,22 @@ require FastRuby.fastruby_load_path + "/../ext/fastruby_base/fastruby_base"
34
34
  module FastRuby
35
35
  class Method
36
36
  attr_accessor :options
37
-
37
+
38
+ def self.observe_method_name(mname, &blk)
39
+ @observers ||= Hash.new
40
+ @observers[mname] = @observers[mname] || Array.new
41
+ @observers[mname] << lambda(&blk)
42
+ end
43
+
44
+ def self.notify_method_name(mname)
45
+ return unless @observers
46
+ return unless @observers[mname]
47
+
48
+ @observers[mname].each do |obs|
49
+ obs.call
50
+ end
51
+ end
52
+
38
53
  def initialize(method_name, owner)
39
54
  @method_name = method_name
40
55
  @owner = owner
@@ -46,6 +61,8 @@ module FastRuby
46
61
  end
47
62
 
48
63
  def tree_changed
64
+ FastRuby::Method.notify_method_name(@method_name)
65
+
49
66
  @observers.values.each do |observer|
50
67
  observer.call(self)
51
68
  end
@@ -181,10 +198,6 @@ module FastRuby
181
198
  context.locals = FastRuby::GetLocalsProcessor.get_locals(inlined_tree)
182
199
 
183
200
  FastRuby.logger.info "Compiling #{@owner}::#{@method_name} for signature #{signature.inspect}"
184
-
185
- if @method_name == :bar
186
- print inlined_tree.to_ruby
187
- end
188
201
  c_code = context.to_c_method(inlined_tree,signature)
189
202
 
190
203
  unless options[:main]
@@ -0,0 +1,41 @@
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
+ require "define_method_handler"
22
+
23
+ module FastRuby
24
+ class LvarType
25
+
26
+
27
+ define_method_handler(:process) {|tree|
28
+ @current_index = (@current_index || 1) + 1
29
+ varname = "lvar_type_tmp_#{@current_index}".to_sym
30
+ class_condition = fs("_static{CLASS_OF(_a) == ::#{@infer_lvar_map[tree[1]].to_s}._invariant }", :_a => fs(:lvar,varname))
31
+
32
+ fs(:block,
33
+ fs(:lasgn, varname, tree[2]),
34
+ fs(:if, class_condition, fs(:lasgn, tree[1], fs(:lvar, varname.to_sym)), fs('_raise(FastRuby::TypeMismatchAssignmentException, "")') )
35
+ )
36
+ }.condition{|tree| tree &&
37
+ tree.node_type == :lasgn &&
38
+ tree.size == 3 &&
39
+ @infer_lvar_map[tree[1]] }
40
+ end
41
+ end
@@ -23,7 +23,7 @@ module FastRuby
23
23
 
24
24
  define_translator_for(:yield, :method => :to_c_yield, :arity => 1)
25
25
  def to_c_yield(tree)
26
-
26
+ @has_yield = true
27
27
  block_code = proc { |name| "
28
28
  static VALUE #{name}(VALUE frame_param, VALUE* block_args, int size) {
29
29
 
@@ -0,0 +1,128 @@
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(:yield, :method => :to_c_yield, :arity => 1)
25
+ def to_c_yield(tree)
26
+ require "pry"; binding.pry
27
+ @has_yield = true
28
+ block_code = proc { |name| "
29
+ static VALUE #{name}(VALUE frame_param, VALUE* block_args, int size) {
30
+
31
+ #{@locals_struct} *plocals;
32
+ #{@frame_struct} *pframe;
33
+ pframe = (void*)frame_param;
34
+ plocals = (void*)pframe->plocals;
35
+
36
+ if ((plocals->block_function_address) == 0) {
37
+ #{_raise("rb_eLocalJumpError", "no block given")};
38
+ } else {
39
+ return ((VALUE(*)(int,VALUE*,VALUE,VALUE))(plocals->block_function_address))(size, block_args, (VALUE)(plocals->block_function_param), (VALUE)pframe);
40
+ }
41
+ }
42
+ "
43
+ }
44
+
45
+ splat_arg = tree.find{|x| x == :yield ? false : x[0] == :splat}
46
+
47
+ protected_block(false) do
48
+ if splat_arg
49
+ "
50
+ VALUE splat_array = Qnil;
51
+ VALUE block_aux = Qnil;
52
+ #{to_c(splat_arg[1], "splat_array")};
53
+
54
+ if (CLASS_OF(splat_array) == rb_cArray) {
55
+ VALUE block_args[_RARRAY_LEN(splat_array) + #{tree.size}];
56
+ int i;
57
+ #{
58
+ (0..tree.size-3).map{|i|
59
+ "
60
+ #{to_c(tree[i+1], "block_aux")};
61
+ block_args[#{i}] = block_aux;
62
+ "
63
+ }.join(";\n")
64
+ };
65
+
66
+ for (i=0; i<_RARRAY_LEN(splat_array); i++) {
67
+ block_args[i+#{tree.size-2}] = rb_ary_entry(splat_array,i);
68
+ }
69
+
70
+ last_expression = #{anonymous_function(&block_code)}((VALUE)pframe, block_args, _RARRAY_LEN(splat_array) + #{tree.size-2});
71
+ } else {
72
+ VALUE block_args[1+#{tree.size}];
73
+ #{
74
+ (0..tree.size-3).map{|i|
75
+ "
76
+ #{to_c(tree[i+1], "block_aux")};
77
+ block_args[#{i}] = block_aux;
78
+ "
79
+ }.join(";\n")
80
+ };
81
+
82
+ block_args[#{tree.size-2}] = splat_array;
83
+ last_expression = #{anonymous_function(&block_code)}((VALUE)pframe, block_args, #{tree.size-1});
84
+ }
85
+
86
+ "
87
+ else
88
+ if tree.size > 1
89
+ "last_expression = " + anonymous_function(&block_code)+"((VALUE)pframe, (VALUE[]){#{tree[1..-1].map{|subtree| to_c subtree}.join(",")}},#{tree.size-1})"
90
+ else
91
+ "last_expression = " + anonymous_function(&block_code)+"((VALUE)pframe, (VALUE[]){}, #{tree.size-1})"
92
+ end
93
+ end
94
+ end
95
+ end
96
+
97
+ define_translator_for(:block, :method => :to_c_block)
98
+ def to_c_block(tree, result_variable = nil)
99
+ if tree.size == 1
100
+ return inline_block("return Qnil;")
101
+ end
102
+
103
+ code = proc{
104
+
105
+ str = tree[1..-2].map{ |subtree|
106
+ to_c(subtree,"last_expression")
107
+ }.join(";")
108
+
109
+ if tree[-1]
110
+ str = str + ";#{to_c(tree[-1],"last_expression")};"
111
+ end
112
+
113
+ if result_variable
114
+ str << "#{result_variable} = last_expression;"
115
+ else
116
+ str << "return last_expression;"
117
+ end
118
+ str
119
+ }
120
+
121
+ if result_variable
122
+ code.call
123
+ else
124
+ inline_block &code
125
+ end
126
+ end
127
+ end
128
+ end
@@ -106,6 +106,8 @@ module FastRuby
106
106
 
107
107
  if args.last[0] == :splat
108
108
  aux_varname = "_aux_" + rand(1000000).to_s
109
+
110
+ @has_inline_block = true
109
111
  code = protected_block(
110
112
  "
111
113
 
@@ -152,55 +154,37 @@ module FastRuby
152
154
  end
153
155
  end
154
156
  end
157
+
158
+ signature = if recvtype
159
+ [recvtype]
160
+ else
161
+ [nil]
162
+ end
163
+
164
+ args[1..-1].each do |arg|
165
+ argtype = infer_type(arg)
166
+ signature << argtype
167
+ end
168
+
169
+ if block_pass_arg
155
170
 
156
- if recvtype
157
-
158
- address = nil
159
- mobject = nil
160
-
161
- inference_complete = true
162
- signature = [recvtype]
163
-
164
- args[1..-1].each do |arg|
165
- argtype = infer_type(arg)
166
- signature << argtype
167
- unless argtype
168
- inference_complete = false
169
- end
170
- end
171
-
172
- if repass_var
173
- extraargs = ","+repass_var
174
- extraargs_signature = ",VALUE " + repass_var
175
- else
176
- extraargs = ""
177
- extraargs_signature = ""
178
- end
179
-
180
- block_proc_tree = s(:call, block_pass_arg[1], :to_proc, s(:arglist)) if block_pass_arg
181
-
182
- block_wrapping_proc = proc { |name| "
183
- static VALUE #{name}(int argc, VALUE* argv, VALUE _locals, VALUE _parent_frame) {
184
- return rb_proc_call(_locals, rb_ary_new4(argc, argv));
185
- }
186
- "
171
+ block_proc_tree = s(:call, block_pass_arg[1], :to_proc, s(:arglist))
172
+ block_wrapping_proc = proc { |name| "
173
+ static VALUE #{name}(int argc, VALUE* argv, VALUE _locals, VALUE _parent_frame) {
174
+ return rb_proc_call(_locals, rb_ary_new4(argc, argv));
187
175
  }
188
-
176
+ "
177
+ }
178
+
179
+ code = inline_block do
189
180
  if argnum == 0
190
- value_cast = "VALUE,VALUE,VALUE"
191
-
192
-
193
- if block_pass_arg or result_var
194
- code = proc{ "
195
- {
196
- VALUE recv = Qnil;
197
- #{to_c recv, "recv"};
198
-
199
- #{@block_struct} block, *pblock = Qfalse;
181
+ "
182
+ #{@block_struct} block, *pblock = Qfalse;
183
+
184
+ VALUE proc = Qnil;
185
+ VALUE recv = Qnil;
200
186
 
201
- #{if block_pass_arg
202
- "
203
- VALUE proc = Qnil;
187
+ #{to_c(recv, "recv")}
204
188
  #{to_c(block_proc_tree, "proc") }
205
189
 
206
190
  VALUE block_address_value = rb_ivar_get(proc, #{intern_num "__block_address"});
@@ -217,61 +201,21 @@ module FastRuby
217
201
  block.proc = proc;
218
202
  pblock = &block;
219
203
  }
220
-
221
- "
222
- end
223
- }
224
-
225
- #{if result_var
226
- "
227
- #{result_var} = ((VALUE(*)(VALUE,VALUE,VALUE,int,VALUE*))#{encode_address(recvtype,signature,mname,tree,inference_complete)})(recv, (VALUE)pblock, (VALUE)pframe, 0, (VALUE[]){});
228
- "
229
- else
230
- "
231
- ((VALUE(*)(VALUE,VALUE,VALUE,int,VALUE*))#{encode_address(recvtype,signature,mname,tree,inference_complete)})(recv, (VALUE)pblock, (VALUE)pframe, 0, (VALUE[]){});
232
- "
233
- end
234
- }
235
- }
236
- "
237
- }
238
-
239
- result_var ? code.call : inline_block(&code)
240
- else
241
- "((VALUE(*)(VALUE,VALUE,VALUE,int,VALUE*))#{encode_address(recvtype,signature,mname,tree,inference_complete)})(#{to_c recv}, Qfalse, (VALUE)pframe, 0, (VALUE[]){})"
242
- end
243
-
204
+
205
+ return #{dynamic_call(signature,mname)}(recv, (void*)pblock, (void*)pframe, 0, (VALUE[]){});"
244
206
  else
245
- value_cast = ( ["VALUE"]*(args.size) ).join(",") + ",VALUE,VALUE"
246
- suffix = "_" + rand(1000000).to_s+"_"
247
-
248
- strargs = (0..args_tree.size-2).map{|i| "#{suffix}arg#{i}"}.join(",")
249
- if block_pass_arg or result_var
250
- code = proc{ "
251
- {
252
- VALUE recv = Qnil;
253
-
254
- #{
255
- (0..args_tree.size-2).map{ |x|
256
- "VALUE #{suffix}arg#{x};"
257
- }.join("\n")
258
- }
259
-
260
- #{
261
- (0..args_tree.size-2).map{ |x|
262
- to_c(args_tree[x+1], "#{suffix}arg#{x}") + ";"
263
- }.join("\n")
264
- }
265
-
266
- #{to_c recv, "recv"};
267
-
268
- #{@block_struct} block, *pblock = Qfalse;
207
+ strargs = args[1..-1].map{|arg| to_c arg}.join(",")
208
+ "
209
+ #{@block_struct} block, *pblock = Qfalse;
210
+
211
+ VALUE proc = Qnil;
212
+ VALUE recv = Qnil;
269
213
 
270
- #{if block_pass_arg
271
- "
272
- VALUE proc = Qnil;
214
+ #{to_c(recv, "recv")}
273
215
  #{to_c(block_proc_tree, "proc") }
216
+
274
217
  VALUE block_address_value = rb_ivar_get(proc, #{intern_num "__block_address"});
218
+
275
219
  if (block_address_value != Qnil) {
276
220
  block.block_function_address = NUM2PTR(block_address_value);
277
221
  block.block_function_param = NUM2PTR(rb_ivar_get(proc, #{intern_num "__block_param"}));
@@ -284,56 +228,35 @@ module FastRuby
284
228
  block.proc = proc;
285
229
  pblock = &block;
286
230
  }
287
-
288
- "
289
- end
290
- }
291
-
292
- #{if result_var
293
- "
294
- #{result_var} = ((VALUE(*)(VALUE,VALUE,VALUE,int,VALUE*))#{encode_address(recvtype,signature,mname,tree,inference_complete)})(recv, (VALUE)pblock, (VALUE)pframe, #{args.size-1}, (VALUE[]){#{strargs}});
295
- "
296
- else
297
- "
298
- ((VALUE(*)(VALUE,VALUE,VALUE,int,VALUE*))#{encode_address(recvtype,signature,mname,tree,inference_complete)})(recv, (VALUE)pblock, (VALUE)pframe, #{args.size-1}, (VALUE[]){#{strargs}});
299
- "
300
- end
301
- }
302
-
303
-
304
- }
305
- "
306
- }
307
-
308
- result_var ? code.call : inline_block(&code)
309
- else
310
- strargs = args[1..-1].map{|arg| to_c arg}.join(",")
311
- "((VALUE(*)(VALUE,VALUE,VALUE,int,VALUE*))#{encode_address(recvtype,signature,mname,tree,inference_complete)})(#{to_c recv}, Qfalse, (VALUE)pframe, #{args.size-1}, (VALUE[]){#{strargs}})"
312
- end
231
+
232
+
233
+ return #{dynamic_call(signature,mname)}(recv, (void*)pblock, (void*)pframe, #{args.size-1}, (VALUE[]){#{strargs}});"
313
234
  end
314
-
315
- else # else recvtype
316
- if argnum == 0
317
- code = protected_block("last_expression = rb_funcall(#{to_c recv}, #{intern_num tree[2]}, 0)", true, repass_var)
318
- if result_var
235
+ end
236
+
237
+ return (if result_var
319
238
  "
320
- #{result_var} = #{code};
239
+ #{result_var} = #{code};
321
240
  "
322
- else
323
- code
324
- end
241
+ else
242
+ code
243
+ end)
244
+ else
245
+ code = if argnum == 0
246
+ "#{dynamic_call(signature,mname)}(#{to_c recv}, (void*)Qfalse, (void*)pframe, 0, (VALUE[]){})"
325
247
  else
326
248
  strargs = args[1..-1].map{|arg| to_c arg}.join(",")
327
- code = protected_block("last_expression = rb_funcall(#{to_c recv}, #{intern_num tree[2]}, #{argnum}, #{strargs} )", true, repass_var)
328
- if result_var
249
+ "#{dynamic_call(signature,mname)}(#{to_c recv}, (void*)Qfalse, (void*)pframe, #{args.size-1}, (VALUE[]){#{strargs}})"
250
+ end
251
+
252
+ return (if result_var
329
253
  "
330
- #{result_var} = #{code};
254
+ #{result_var} = #{code};
331
255
  "
332
- else
333
- code
334
- end
335
- end
336
- end # if recvtype
256
+ else
257
+ code
258
+ end)
259
+ end
337
260
  end
338
261
 
339
262
  define_translator_for(:call, :method => :to_c_attrasgn, :arity => 1)