fastruby 0.0.21 → 0.0.22

Sign up to get free protection for your applications and to get access to all the features.
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)