fastruby 0.0.17 → 0.0.18
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.
- data/CHANGELOG +10 -0
- data/Rakefile +4 -2
- data/benchmarks/benchmark.rb +20 -44
- data/benchmarks/benchmark.rb~ +47 -0
- data/benchmarks/benchmark2.rb +19 -45
- data/benchmarks/benchmark2.rb~ +46 -0
- data/benchmarks/benchmark3.rb +19 -45
- data/benchmarks/benchmark3.rb~ +46 -0
- data/benchmarks/benchmark4.rb +30 -65
- data/benchmarks/benchmark4.rb~ +61 -0
- data/benchmarks/benchmark5.rb +25 -55
- data/benchmarks/benchmark5.rb~ +54 -0
- data/benchmarks/benchmark6.rb +19 -40
- data/benchmarks/benchmark6.rb~ +41 -0
- data/benchmarks/benchmark7.rb +23 -52
- data/benchmarks/benchmark7.rb~ +48 -0
- data/ext/fastruby_base/fastruby_base.inl +1 -0
- data/lib/fastruby/builder.rb +128 -76
- data/lib/fastruby/cache/cache.rb +9 -5
- data/lib/fastruby/fastruby_sexp.rb +18 -0
- data/lib/fastruby/inliner/inliner.rb +68 -0
- data/lib/fastruby/inliner/modules/call.rb +150 -0
- data/lib/fastruby/inliner/modules/recursive.rb +35 -0
- data/lib/fastruby/object.rb +17 -32
- data/lib/fastruby/reductor/modules/case.rb +49 -0
- data/lib/{fastruby.rb~ → fastruby/reductor/modules/for.rb} +11 -13
- data/lib/fastruby/reductor/modules/nontree.rb +31 -0
- data/lib/fastruby/reductor/modules/recursive.rb +31 -0
- data/lib/fastruby/reductor/reductor.rb +39 -0
- data/lib/fastruby/set_tree.rb +7 -1
- data/lib/fastruby/sexp_extension.rb +6 -0
- data/lib/fastruby/translator/modules/block.rb +4 -4
- data/lib/fastruby/translator/modules/call.rb +9 -26
- data/lib/fastruby/translator/modules/defn.rb +5 -3
- data/lib/fastruby/translator/modules/directive.rb +42 -0
- data/lib/fastruby/translator/modules/exceptions.rb +12 -30
- data/lib/fastruby/translator/modules/flow.rb +33 -83
- data/lib/fastruby/translator/modules/iter.rb +4 -7
- data/lib/fastruby/translator/modules/literal.rb +11 -25
- data/lib/fastruby/translator/modules/logical.rb +5 -3
- data/lib/fastruby/translator/modules/method_group.rb +4 -3
- data/lib/fastruby/translator/modules/nonlocal.rb +7 -5
- data/lib/fastruby/translator/modules/static.rb +242 -0
- data/lib/fastruby/translator/modules/variable.rb +16 -9
- data/lib/fastruby/translator/scope_mode_helper.rb +2 -27
- data/lib/fastruby/translator/translator.rb +131 -60
- data/lib/fastruby/translator/translator_modules.rb +6 -2
- data/lib/fastruby.rb +1 -1
- data/spec/reductor/base_spec.rb +46 -0
- data/spec/ruby/base_spec.rb~ +394 -0
- data/spec/ruby/block/arguments_spec.rb~ +214 -0
- data/spec/ruby/block/proc_as_block_spec.rb~ +23 -0
- data/spec/ruby/block/retry_spec.rb~ +43 -0
- data/spec/ruby/block_spec.rb~ +520 -0
- data/spec/ruby/defn/replacement_spec.rb~ +102 -0
- data/spec/ruby/integrity_spec.rb~ +40 -0
- data/spec/ruby/singleton_spec.rb~ +76 -0
- data/spec/scope_mode/base_spec.rb +14 -5
- data/spec/scope_mode/block_spec.rb +18 -9
- data/spec/scope_mode/call_spec.rb +11 -2
- data/spec/scope_mode/exception_spec.rb +11 -2
- data/spec/scope_mode/flow_spec.rb +18 -8
- data/spec/scope_mode/optimization_spec.rb +21 -13
- data/spec/static/base_spec.rb +54 -0
- data/spec/static/flow_spec.rb +48 -0
- data/spec/static/operator_spec.rb +104 -0
- metadata +58 -8
@@ -19,30 +19,12 @@ along with fastruby. if not, see <http://www.gnu.org/licenses/>.
|
|
19
19
|
|
20
20
|
=end
|
21
21
|
module FastRuby
|
22
|
-
|
23
|
-
|
24
|
-
register_translator_module self
|
22
|
+
class Context
|
25
23
|
|
24
|
+
define_translator_for(:call, :method => :to_c_call)
|
26
25
|
def to_c_call(tree, result_var = nil)
|
27
|
-
directive_code = directive(tree)
|
28
26
|
repass_var = @repass_var
|
29
27
|
|
30
|
-
if directive_code
|
31
|
-
if result_var
|
32
|
-
return "#{result_var} = #{directive_code};\n"
|
33
|
-
else
|
34
|
-
return directive_code
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
if tree[2] == :require
|
39
|
-
tree[2] = :fastruby_require
|
40
|
-
elsif tree[2] == :raise
|
41
|
-
# raise code
|
42
|
-
args = tree[3]
|
43
|
-
return _raise(args[1],args[2])
|
44
|
-
end
|
45
|
-
|
46
28
|
recv = tree[1]
|
47
29
|
mname = tree[2]
|
48
30
|
args = tree[3]
|
@@ -221,11 +203,11 @@ module FastRuby
|
|
221
203
|
|
222
204
|
#{if result_var
|
223
205
|
"
|
224
|
-
#{result_var} = ((VALUE(*)(
|
206
|
+
#{result_var} = ((VALUE(*)(VALUE,VALUE,VALUE,int,VALUE*))#{encode_address(recvtype,signature,mname,tree,inference_complete)})(recv, (VALUE)pblock, (VALUE)pframe, 0, (VALUE[]){});
|
225
207
|
"
|
226
208
|
else
|
227
209
|
"
|
228
|
-
((VALUE(*)(
|
210
|
+
((VALUE(*)(VALUE,VALUE,VALUE,int,VALUE*))#{encode_address(recvtype,signature,mname,tree,inference_complete)})(recv, (VALUE)pblock, (VALUE)pframe, 0, (VALUE[]){});
|
229
211
|
"
|
230
212
|
end
|
231
213
|
}
|
@@ -234,7 +216,7 @@ module FastRuby
|
|
234
216
|
|
235
217
|
result_var ? code : inline_block(code)
|
236
218
|
else
|
237
|
-
"((VALUE(*)(
|
219
|
+
"((VALUE(*)(VALUE,VALUE,VALUE,int,VALUE*))#{encode_address(recvtype,signature,mname,tree,inference_complete)})(#{to_c recv}, Qfalse, (VALUE)pframe, 0, (VALUE[]){})"
|
238
220
|
end
|
239
221
|
|
240
222
|
else
|
@@ -287,11 +269,11 @@ module FastRuby
|
|
287
269
|
|
288
270
|
#{if result_var
|
289
271
|
"
|
290
|
-
#{result_var} = ((VALUE(*)(
|
272
|
+
#{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}});
|
291
273
|
"
|
292
274
|
else
|
293
275
|
"
|
294
|
-
((VALUE(*)(
|
276
|
+
((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
277
|
"
|
296
278
|
end
|
297
279
|
}
|
@@ -302,7 +284,7 @@ module FastRuby
|
|
302
284
|
result_var ? code : inline_block(code)
|
303
285
|
else
|
304
286
|
strargs = args[1..-1].map{|arg| to_c arg}.join(",")
|
305
|
-
"((VALUE(*)(
|
287
|
+
"((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}})"
|
306
288
|
end
|
307
289
|
end
|
308
290
|
|
@@ -330,6 +312,7 @@ module FastRuby
|
|
330
312
|
end # if recvtype
|
331
313
|
end
|
332
314
|
|
315
|
+
define_translator_for(:call, :method => :to_c_attrasgn, :arity => 1)
|
333
316
|
def to_c_attrasgn(tree)
|
334
317
|
to_c_call(tree)
|
335
318
|
end
|
@@ -19,9 +19,9 @@ along with fastruby. if not, see <http://www.gnu.org/licenses/>.
|
|
19
19
|
|
20
20
|
=end
|
21
21
|
module FastRuby
|
22
|
-
|
23
|
-
|
24
|
-
|
22
|
+
class Context
|
23
|
+
|
24
|
+
define_translator_for(:defn, :method => :to_c_defn)
|
25
25
|
def to_c_defn(tree, result_var = nil)
|
26
26
|
|
27
27
|
method_name = tree[1]
|
@@ -82,6 +82,7 @@ module FastRuby
|
|
82
82
|
end
|
83
83
|
end
|
84
84
|
|
85
|
+
define_translator_for(:defs, :method => :to_c_defs)
|
85
86
|
def to_c_defs(tree, result_var = nil)
|
86
87
|
method_name = tree[2]
|
87
88
|
args_tree = tree[3].select{|x| x.to_s[0] != ?&}
|
@@ -127,6 +128,7 @@ module FastRuby
|
|
127
128
|
|
128
129
|
end
|
129
130
|
|
131
|
+
define_translator_for(:scope, :method => :to_c_scope)
|
130
132
|
def to_c_scope(tree, result_var = nil)
|
131
133
|
if tree[1]
|
132
134
|
if result_var
|
@@ -0,0 +1,42 @@
|
|
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(:call, :priority => 100){ |tree, result_var=nil|
|
25
|
+
directive_code = directive(tree)
|
26
|
+
|
27
|
+
if result_var
|
28
|
+
return "#{result_var} = #{directive_code};\n"
|
29
|
+
else
|
30
|
+
return directive_code
|
31
|
+
end
|
32
|
+
|
33
|
+
}.condition{|*x|
|
34
|
+
tree = x.first; tree.node_type == :call && directive(tree)
|
35
|
+
}
|
36
|
+
|
37
|
+
define_translator_for(:call, :method => :to_c_attrasgn, :arity => 1)
|
38
|
+
def to_c_attrasgn(tree)
|
39
|
+
to_c_call(tree)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -19,10 +19,9 @@ along with fastruby. if not, see <http://www.gnu.org/licenses/>.
|
|
19
19
|
|
20
20
|
=end
|
21
21
|
module FastRuby
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
22
|
+
class Context
|
23
|
+
|
24
|
+
define_translator_for(:rescue, :method => :to_c_rescue, :arity => 1)
|
26
25
|
def to_c_rescue(tree)
|
27
26
|
if tree[1][0] == :resbody
|
28
27
|
else_tree = tree[2]
|
@@ -51,7 +50,7 @@ module FastRuby
|
|
51
50
|
next if resbody_tree[0] != :resbody
|
52
51
|
|
53
52
|
if resbody_tree[1].size == 1
|
54
|
-
resbody_tree[1][1] =
|
53
|
+
resbody_tree[1][1] = s(:const, :Exception)
|
55
54
|
end
|
56
55
|
|
57
56
|
if resbody_tree[1].last[0] == :lasgn
|
@@ -94,6 +93,7 @@ module FastRuby
|
|
94
93
|
end
|
95
94
|
end
|
96
95
|
|
96
|
+
define_translator_for(:ensure, :method => :to_c_ensure, :arity => 1)
|
97
97
|
def to_c_ensure(tree)
|
98
98
|
if tree.size == 2
|
99
99
|
to_c tree[1]
|
@@ -105,30 +105,12 @@ module FastRuby
|
|
105
105
|
end
|
106
106
|
end
|
107
107
|
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
end
|
116
|
-
|
117
|
-
if message_tree
|
118
|
-
return inline_block("
|
119
|
-
pframe->thread_data->exception = rb_funcall(#{class_tree}, #{intern_num :exception},1,#{message_tree});
|
120
|
-
longjmp(pframe->jmp, FASTRUBY_TAG_RAISE);
|
121
|
-
return Qnil;
|
122
|
-
")
|
123
|
-
else
|
124
|
-
return inline_block("
|
125
|
-
pframe->thread_data->exception = rb_funcall(#{class_tree}, #{intern_num :exception},0);
|
126
|
-
longjmp(pframe->jmp, FASTRUBY_TAG_RAISE);
|
127
|
-
return Qnil;
|
128
|
-
")
|
129
|
-
end
|
130
|
-
|
131
|
-
end
|
132
|
-
|
108
|
+
define_translator_for(:call, :priority => 100){ |tree, result_var=nil|
|
109
|
+
# raise code
|
110
|
+
args = tree[3]
|
111
|
+
_raise(args[1],args[2])
|
112
|
+
}.condition{|*x|
|
113
|
+
tree = x.first; tree.node_type == :call && tree[2] == :raise
|
114
|
+
}
|
133
115
|
end
|
134
116
|
end
|
@@ -19,66 +19,8 @@ along with fastruby. if not, see <http://www.gnu.org/licenses/>.
|
|
19
19
|
|
20
20
|
=end
|
21
21
|
module FastRuby
|
22
|
-
|
23
|
-
|
24
|
-
register_translator_module self
|
25
|
-
|
26
|
-
def to_c_case(tree, result_var = nil)
|
27
|
-
|
28
|
-
tmpvarname = "tmp" + rand(1000000).to_s;
|
29
|
-
@repass_var = tmpvarname
|
30
|
-
outputvar = result_var || ("tmp_" + rand(1000000).to_s);
|
31
|
-
|
32
|
-
code = tree[2..-2].map{|subtree|
|
33
|
-
|
34
|
-
# this subtree is a when
|
35
|
-
subtree[1][1..-1].map{|subsubtree|
|
36
|
-
c_calltree = s(:call, nil, :inline_c, s(:arglist, s(:str, tmpvarname), s(:false)))
|
37
|
-
calltree = s(:call, subsubtree, :===, s(:arglist, c_calltree))
|
38
|
-
"
|
39
|
-
if (RTEST(#{to_c_call(calltree)})) {
|
40
|
-
#{to_c(subtree[2],outputvar)};
|
41
|
-
}
|
42
|
-
"
|
43
|
-
}.join(" else ")
|
44
|
-
|
45
|
-
}.join(" else ") + "else {
|
46
|
-
#{
|
47
|
-
if tree[-1]
|
48
|
-
to_c tree[-1],outputvar
|
49
|
-
end
|
50
|
-
};
|
51
|
-
}
|
52
|
-
"
|
53
|
-
|
54
|
-
ret_code = "
|
55
|
-
{
|
56
|
-
#{
|
57
|
-
unless result_var
|
58
|
-
VALUE #{outputvar} = Qnil;
|
59
|
-
end
|
60
|
-
}
|
61
|
-
|
62
|
-
VALUE #{tmpvarname} = Qnil;
|
63
|
-
#{to_c tree[1], tmpvarname};
|
64
|
-
|
65
|
-
// case
|
66
|
-
#{code}
|
67
|
-
#{
|
68
|
-
unless result_var
|
69
|
-
"return #{outputvar};"
|
70
|
-
end
|
71
|
-
}
|
72
|
-
}
|
73
|
-
"
|
74
|
-
|
75
|
-
if result_var
|
76
|
-
ret_code
|
77
|
-
else
|
78
|
-
inline_block ret_code
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
22
|
+
class Context
|
23
|
+
define_translator_for(:if, :method => :to_c_if)
|
82
24
|
def to_c_if(tree, result_variable_ = nil)
|
83
25
|
condition_tree = tree[1]
|
84
26
|
impl_tree = tree[2]
|
@@ -86,35 +28,43 @@ module FastRuby
|
|
86
28
|
|
87
29
|
result_variable = result_variable_ || "last_expression"
|
88
30
|
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
31
|
+
infered_value = infer_value(condition_tree)
|
32
|
+
unless infered_value
|
33
|
+
|
34
|
+
code = "
|
35
|
+
{
|
36
|
+
VALUE condition_result;
|
37
|
+
#{to_c condition_tree, "condition_result"};
|
38
|
+
if (RTEST(condition_result)) {
|
39
|
+
#{to_c impl_tree, result_variable};
|
40
|
+
}#{else_tree ?
|
41
|
+
" else {
|
42
|
+
#{to_c else_tree, result_variable};
|
43
|
+
}
|
44
|
+
" : ""
|
98
45
|
}
|
99
|
-
" : ""
|
100
46
|
}
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
47
|
+
"
|
48
|
+
|
49
|
+
if result_variable_
|
50
|
+
code
|
51
|
+
else
|
52
|
+
inline_block code + "; return last_expression;"
|
53
|
+
end
|
106
54
|
else
|
107
|
-
|
55
|
+
if infered_value.value
|
56
|
+
to_c(impl_tree, result_variable_)
|
57
|
+
else
|
58
|
+
if else_tree
|
59
|
+
to_c(else_tree, result_variable_)
|
60
|
+
else
|
61
|
+
to_c(s(:nil), result_variable_)
|
62
|
+
end
|
63
|
+
end
|
108
64
|
end
|
109
65
|
end
|
110
66
|
|
111
|
-
|
112
|
-
alter_tree = tree.dup
|
113
|
-
alter_tree[0] = :iter
|
114
|
-
alter_tree[1] = [:call, alter_tree[1], :each, [:arglist]]
|
115
|
-
to_c alter_tree
|
116
|
-
end
|
117
|
-
|
67
|
+
define_translator_for(:while, :method => :to_c_while)
|
118
68
|
def to_c_while(tree, result_var = nil)
|
119
69
|
|
120
70
|
begin_while = "begin_while_"+rand(10000000).to_s
|
@@ -19,10 +19,9 @@ along with fastruby. if not, see <http://www.gnu.org/licenses/>.
|
|
19
19
|
|
20
20
|
=end
|
21
21
|
module FastRuby
|
22
|
-
|
22
|
+
class Context
|
23
23
|
|
24
|
-
|
25
|
-
|
24
|
+
define_translator_for(:iter, :method => :to_c_iter)
|
26
25
|
def to_c_iter(tree, result_var = nil)
|
27
26
|
|
28
27
|
call_tree = tree[1]
|
@@ -629,10 +628,8 @@ fastruby_local_next:
|
|
629
628
|
encoded_address = encode_address(recvtype,signature,mname,call_tree,inference_complete,convention_global_name)
|
630
629
|
|
631
630
|
if call_args_tree.size > 1
|
632
|
-
|
633
|
-
strargs = "," + (0..call_args_tree.size-2).map{|i| "arg#{i}"}.join(",")
|
631
|
+
strargs = (0..call_args_tree.size-2).map{|i| "arg#{i}"}.join(",")
|
634
632
|
else
|
635
|
-
value_cast = "VALUE,VALUE,VALUE"
|
636
633
|
strargs = ""
|
637
634
|
end
|
638
635
|
|
@@ -652,7 +649,7 @@ fastruby_local_next:
|
|
652
649
|
end
|
653
650
|
}
|
654
651
|
|
655
|
-
ret = ((VALUE(*)(
|
652
|
+
ret = ((VALUE(*)(VALUE,VALUE,VALUE,int,VALUE*))#{encoded_address})(recv, (VALUE)&block, (VALUE)&call_frame, #{call_args_tree.size-1}, (VALUE[]){#{strargs}});
|
656
653
|
"
|
657
654
|
|
658
655
|
code = "
|
@@ -19,21 +19,13 @@ along with fastruby. if not, see <http://www.gnu.org/licenses/>.
|
|
19
19
|
|
20
20
|
=end
|
21
21
|
module FastRuby
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
end
|
28
|
-
|
29
|
-
def to_c_nil(tree)
|
30
|
-
"Qnil"
|
31
|
-
end
|
32
|
-
|
33
|
-
def to_c_str(tree)
|
34
|
-
literal_value tree[1]
|
35
|
-
end
|
22
|
+
class Context
|
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]}
|
36
27
|
|
28
|
+
define_translator_for(:hash, :method => :to_c_hash)
|
37
29
|
def to_c_hash(tree, result_var = nil)
|
38
30
|
|
39
31
|
hash_tmp_var = "_hash_"+rand(1000000).to_s
|
@@ -78,6 +70,7 @@ module FastRuby
|
|
78
70
|
end
|
79
71
|
end
|
80
72
|
|
73
|
+
define_translator_for(:array, :method => :to_c_array)
|
81
74
|
def to_c_array(tree, result_var = nil)
|
82
75
|
if tree.size > 1
|
83
76
|
if result_var
|
@@ -112,18 +105,11 @@ module FastRuby
|
|
112
105
|
end
|
113
106
|
end
|
114
107
|
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
def to_c_false(tree)
|
120
|
-
"Qfalse"
|
121
|
-
end
|
122
|
-
|
123
|
-
def to_c_true(tree)
|
124
|
-
"Qtrue"
|
125
|
-
end
|
108
|
+
define_translator_for(:self, :arity => 1){|tree| locals_accessor + "self"}
|
109
|
+
define_translator_for(:false, :arity => 1){|tree| "Qfalse"}
|
110
|
+
define_translator_for(:true, :arity => 1){|tree| "Qtrue"}
|
126
111
|
|
112
|
+
define_translator_for(:dot2, :method => :to_c_dot2)
|
127
113
|
def to_c_dot2(tree, result_var = nil)
|
128
114
|
|
129
115
|
begin_var = "_begin"+rand(10000000).to_s
|
@@ -19,9 +19,9 @@ along with fastruby. if not, see <http://www.gnu.org/licenses/>.
|
|
19
19
|
|
20
20
|
=end
|
21
21
|
module FastRuby
|
22
|
-
|
23
|
-
|
24
|
-
|
22
|
+
class Context
|
23
|
+
|
24
|
+
define_translator_for(:and, :method => :to_c_and)
|
25
25
|
def to_c_and(tree, return_var = nil)
|
26
26
|
if return_var
|
27
27
|
"
|
@@ -39,6 +39,7 @@ module FastRuby
|
|
39
39
|
|
40
40
|
end
|
41
41
|
|
42
|
+
define_translator_for(:or, :method => :to_c_or)
|
42
43
|
def to_c_or(tree, return_var = nil)
|
43
44
|
if return_var
|
44
45
|
"
|
@@ -55,6 +56,7 @@ module FastRuby
|
|
55
56
|
end
|
56
57
|
end
|
57
58
|
|
59
|
+
define_translator_for(:not, :method => :to_c_not)
|
58
60
|
def to_c_not(tree, return_var = nil)
|
59
61
|
if return_var
|
60
62
|
"
|
@@ -19,9 +19,9 @@ along with fastruby. if not, see <http://www.gnu.org/licenses/>.
|
|
19
19
|
|
20
20
|
=end
|
21
21
|
module FastRuby
|
22
|
-
|
23
|
-
|
24
|
-
|
22
|
+
class Context
|
23
|
+
|
24
|
+
define_translator_for(:class, :method => :to_c_class)
|
25
25
|
def to_c_class(tree, result_var = nil)
|
26
26
|
str_class_name = get_class_name(tree[1])
|
27
27
|
container_tree = get_container_tree(tree[1])
|
@@ -60,6 +60,7 @@ module FastRuby
|
|
60
60
|
end
|
61
61
|
end
|
62
62
|
|
63
|
+
define_translator_for(:module, :method => :to_c_module)
|
63
64
|
def to_c_module(tree, result_var = nil)
|
64
65
|
str_class_name = get_class_name(tree[1])
|
65
66
|
container_tree = get_container_tree(tree[1])
|
@@ -19,9 +19,9 @@ along with fastruby. if not, see <http://www.gnu.org/licenses/>.
|
|
19
19
|
|
20
20
|
=end
|
21
21
|
module FastRuby
|
22
|
-
|
23
|
-
|
24
|
-
|
22
|
+
class Context
|
23
|
+
|
24
|
+
define_translator_for(:return, :method => :to_c_return)
|
25
25
|
def to_c_return(tree, return_variable = nil)
|
26
26
|
code = "
|
27
27
|
#{to_c(tree[1],"last_expression")};
|
@@ -35,6 +35,7 @@ module FastRuby
|
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
38
|
+
define_translator_for(:break, :method => :to_c_break)
|
38
39
|
def to_c_break(tree, result_var = nil)
|
39
40
|
|
40
41
|
value_tmp_var = "value_" + rand(10000000).to_s
|
@@ -73,6 +74,7 @@ module FastRuby
|
|
73
74
|
end
|
74
75
|
end
|
75
76
|
|
77
|
+
define_translator_for(:retry, :method => :to_c_retry)
|
76
78
|
def to_c_retry(tree, result_var = nil)
|
77
79
|
code = "
|
78
80
|
{
|
@@ -94,6 +96,7 @@ module FastRuby
|
|
94
96
|
end
|
95
97
|
end
|
96
98
|
|
99
|
+
define_translator_for(:redo, :method => :to_c_redo)
|
97
100
|
def to_c_redo(tree, result_var = nil)
|
98
101
|
if @on_block
|
99
102
|
code = "
|
@@ -110,6 +113,7 @@ module FastRuby
|
|
110
113
|
end
|
111
114
|
end
|
112
115
|
|
116
|
+
define_translator_for(:next, :method => :to_c_next)
|
113
117
|
def to_c_next(tree, result_var = nil)
|
114
118
|
tmp_varname = "_acc_" + rand(10000000).to_s
|
115
119
|
if @on_block
|
@@ -135,7 +139,5 @@ module FastRuby
|
|
135
139
|
_raise("rb_eLocalJumpError","illegal next");
|
136
140
|
end
|
137
141
|
end
|
138
|
-
|
139
|
-
|
140
142
|
end
|
141
143
|
end
|