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
@@ -6,8 +6,17 @@ require "fastruby/translator/scope_mode_helper"
|
|
6
6
|
$parser = RubyParser.new
|
7
7
|
|
8
8
|
describe FastRuby::ScopeModeHelper, "scope mode helper" do
|
9
|
-
|
9
|
+
|
10
|
+
def get_scope_mode(tree)
|
10
11
|
FastRuby::ScopeModeHelper.get_scope_mode(
|
12
|
+
FastRuby::Reductor.new.reduce(
|
13
|
+
FastRuby::FastRubySexp.from_sexp(tree)
|
14
|
+
)
|
15
|
+
)
|
16
|
+
end
|
17
|
+
|
18
|
+
it "method with only ONE call and read after call should return :dag scope mode" do
|
19
|
+
get_scope_mode(
|
11
20
|
$parser.parse "def foo(a,b,c)
|
12
21
|
a+b
|
13
22
|
c
|
@@ -16,7 +25,7 @@ describe FastRuby::ScopeModeHelper, "scope mode helper" do
|
|
16
25
|
end
|
17
26
|
|
18
27
|
it "method with only ONE call and self read after call should return :dag scope mode" do
|
19
|
-
|
28
|
+
get_scope_mode(
|
20
29
|
$parser.parse "def foo(a,b,c)
|
21
30
|
a+b
|
22
31
|
self
|
@@ -25,7 +34,7 @@ describe FastRuby::ScopeModeHelper, "scope mode helper" do
|
|
25
34
|
end
|
26
35
|
|
27
36
|
it "method with only ONE call and yield after call should return :dag scope mode" do
|
28
|
-
|
37
|
+
get_scope_mode(
|
29
38
|
$parser.parse "def foo(a,b,c)
|
30
39
|
a+b
|
31
40
|
yield
|
@@ -34,7 +43,7 @@ describe FastRuby::ScopeModeHelper, "scope mode helper" do
|
|
34
43
|
end
|
35
44
|
|
36
45
|
it "method with only ONE call and local call after call should return :dag scope mode" do
|
37
|
-
|
46
|
+
get_scope_mode(
|
38
47
|
$parser.parse "def foo(a,b,c)
|
39
48
|
a+b
|
40
49
|
foo
|
@@ -43,7 +52,7 @@ describe FastRuby::ScopeModeHelper, "scope mode helper" do
|
|
43
52
|
end
|
44
53
|
|
45
54
|
it "method call AFTER read inside while should return :dag scope" do
|
46
|
-
|
55
|
+
get_scope_mode(
|
47
56
|
$parser.parse "def foo(a,b)
|
48
57
|
while (true)
|
49
58
|
a=b
|
@@ -6,8 +6,17 @@ require "fastruby/translator/scope_mode_helper"
|
|
6
6
|
$parser = RubyParser.new
|
7
7
|
|
8
8
|
describe FastRuby::ScopeModeHelper, "scope mode helper" do
|
9
|
-
|
9
|
+
|
10
|
+
def get_scope_mode(tree)
|
10
11
|
FastRuby::ScopeModeHelper.get_scope_mode(
|
12
|
+
FastRuby::Reductor.new.reduce(
|
13
|
+
FastRuby::FastRubySexp.from_sexp(tree)
|
14
|
+
)
|
15
|
+
)
|
16
|
+
end
|
17
|
+
|
18
|
+
it "iter call with block accessing locals should return dag" do
|
19
|
+
get_scope_mode(
|
11
20
|
$parser.parse "def foo(a)
|
12
21
|
bar do
|
13
22
|
a
|
@@ -17,7 +26,7 @@ describe FastRuby::ScopeModeHelper, "scope mode helper" do
|
|
17
26
|
end
|
18
27
|
|
19
28
|
it "iter call with block doing yield should return dag" do
|
20
|
-
|
29
|
+
get_scope_mode(
|
21
30
|
$parser.parse "def foo(a)
|
22
31
|
bar do
|
23
32
|
yield
|
@@ -27,7 +36,7 @@ describe FastRuby::ScopeModeHelper, "scope mode helper" do
|
|
27
36
|
end
|
28
37
|
|
29
38
|
it "iter call with block with arguments should return dag" do
|
30
|
-
|
39
|
+
get_scope_mode(
|
31
40
|
$parser.parse "def foo(a)
|
32
41
|
bar do |x|
|
33
42
|
end
|
@@ -36,7 +45,7 @@ describe FastRuby::ScopeModeHelper, "scope mode helper" do
|
|
36
45
|
end
|
37
46
|
|
38
47
|
it "iter call with block writing local variable should return dag" do
|
39
|
-
|
48
|
+
get_scope_mode(
|
40
49
|
$parser.parse "def foo(a)
|
41
50
|
bar do
|
42
51
|
a = 87
|
@@ -46,7 +55,7 @@ describe FastRuby::ScopeModeHelper, "scope mode helper" do
|
|
46
55
|
end
|
47
56
|
|
48
57
|
it "two iter call, one empty and the second with yield should return dag" do
|
49
|
-
|
58
|
+
get_scope_mode(
|
50
59
|
$parser.parse "def foo(a)
|
51
60
|
bar do
|
52
61
|
end
|
@@ -59,7 +68,7 @@ describe FastRuby::ScopeModeHelper, "scope mode helper" do
|
|
59
68
|
end
|
60
69
|
|
61
70
|
it "lambda with yield must return :dag" do
|
62
|
-
|
71
|
+
get_scope_mode(
|
63
72
|
$parser.parse " def foo
|
64
73
|
lambda {
|
65
74
|
yield
|
@@ -70,7 +79,7 @@ describe FastRuby::ScopeModeHelper, "scope mode helper" do
|
|
70
79
|
end
|
71
80
|
|
72
81
|
it "method with return from inside block return :dag" do
|
73
|
-
|
82
|
+
get_scope_mode(
|
74
83
|
$parser.parse " def bar
|
75
84
|
foo do
|
76
85
|
return 9
|
@@ -81,7 +90,7 @@ describe FastRuby::ScopeModeHelper, "scope mode helper" do
|
|
81
90
|
end
|
82
91
|
|
83
92
|
it "method with self from inside block return :dag" do
|
84
|
-
|
93
|
+
get_scope_mode(
|
85
94
|
$parser.parse " def bar
|
86
95
|
foo do
|
87
96
|
self
|
@@ -92,7 +101,7 @@ describe FastRuby::ScopeModeHelper, "scope mode helper" do
|
|
92
101
|
end
|
93
102
|
|
94
103
|
it "local call from inside block should return :dag" do
|
95
|
-
|
104
|
+
get_scope_mode(
|
96
105
|
$parser.parse " def bar
|
97
106
|
foo do
|
98
107
|
print
|
@@ -6,8 +6,17 @@ require "fastruby/translator/scope_mode_helper"
|
|
6
6
|
$parser = RubyParser.new
|
7
7
|
|
8
8
|
describe FastRuby::ScopeModeHelper, "scope mode helper" do
|
9
|
-
|
9
|
+
|
10
|
+
def get_scope_mode(tree)
|
10
11
|
FastRuby::ScopeModeHelper.get_scope_mode(
|
12
|
+
FastRuby::Reductor.new.reduce(
|
13
|
+
FastRuby::FastRubySexp.from_sexp(tree)
|
14
|
+
)
|
15
|
+
)
|
16
|
+
end
|
17
|
+
|
18
|
+
it "method with two nested calls refering local vars should return :dag scope mode" do
|
19
|
+
get_scope_mode(
|
11
20
|
$parser.parse "def foo(a,b,c)
|
12
21
|
a+b+c
|
13
22
|
end"
|
@@ -15,7 +24,7 @@ describe FastRuby::ScopeModeHelper, "scope mode helper" do
|
|
15
24
|
end
|
16
25
|
|
17
26
|
it "method with two nested calls refering local vars should return :dag scope mode" do
|
18
|
-
|
27
|
+
get_scope_mode(
|
19
28
|
$parser.parse "def foo(a,b,c)
|
20
29
|
a.foo(b){}.foo(c){}
|
21
30
|
end"
|
@@ -6,8 +6,17 @@ require "fastruby/translator/scope_mode_helper"
|
|
6
6
|
$parser = RubyParser.new
|
7
7
|
|
8
8
|
describe FastRuby::ScopeModeHelper, "scope mode helper" do
|
9
|
-
|
9
|
+
|
10
|
+
def get_scope_mode(tree)
|
10
11
|
FastRuby::ScopeModeHelper.get_scope_mode(
|
12
|
+
FastRuby::Reductor.new.reduce(
|
13
|
+
FastRuby::FastRubySexp.from_sexp(tree)
|
14
|
+
)
|
15
|
+
)
|
16
|
+
end
|
17
|
+
|
18
|
+
it "method with read on begin body, call on rescue body and retry should return :dag scope mode" do
|
19
|
+
get_scope_mode(
|
11
20
|
$parser.parse "def foo(a,b,c)
|
12
21
|
begin
|
13
22
|
b
|
@@ -20,7 +29,7 @@ describe FastRuby::ScopeModeHelper, "scope mode helper" do
|
|
20
29
|
end
|
21
30
|
|
22
31
|
it "method with read on begin body and retry should return :dag scope mode" do
|
23
|
-
|
32
|
+
get_scope_mode(
|
24
33
|
$parser.parse "def foo(a,b,c)
|
25
34
|
begin
|
26
35
|
nil.bar(b)
|
@@ -2,12 +2,22 @@ require "fastruby"
|
|
2
2
|
require "sexp"
|
3
3
|
require "ruby_parser"
|
4
4
|
require "fastruby/translator/scope_mode_helper"
|
5
|
+
require "fastruby/reductor/reductor"
|
5
6
|
|
6
7
|
$parser = RubyParser.new
|
7
8
|
|
8
9
|
describe FastRuby::ScopeModeHelper, "scope mode helper" do
|
9
|
-
|
10
|
+
|
11
|
+
def get_scope_mode(tree)
|
10
12
|
FastRuby::ScopeModeHelper.get_scope_mode(
|
13
|
+
FastRuby::Reductor.new.reduce(
|
14
|
+
FastRuby::FastRubySexp.from_sexp(tree)
|
15
|
+
)
|
16
|
+
)
|
17
|
+
end
|
18
|
+
|
19
|
+
it "possible read on if after call should return :dag scope mode" do
|
20
|
+
get_scope_mode(
|
11
21
|
$parser.parse "def foo(a,b,c)
|
12
22
|
if (a > 0)
|
13
23
|
c
|
@@ -17,7 +27,7 @@ describe FastRuby::ScopeModeHelper, "scope mode helper" do
|
|
17
27
|
end
|
18
28
|
|
19
29
|
it "possible read on case after call should return :dag scope mode" do
|
20
|
-
|
30
|
+
get_scope_mode(
|
21
31
|
$parser.parse "def foo(a,b,c)
|
22
32
|
case (a > 0)
|
23
33
|
when 0
|
@@ -28,7 +38,7 @@ describe FastRuby::ScopeModeHelper, "scope mode helper" do
|
|
28
38
|
end
|
29
39
|
|
30
40
|
it "possible read on case (on enum) after call should return :dag scope mode" do
|
31
|
-
|
41
|
+
get_scope_mode(
|
32
42
|
$parser.parse "def foo(a,b,c)
|
33
43
|
case (a > 0)
|
34
44
|
when c
|
@@ -39,7 +49,7 @@ describe FastRuby::ScopeModeHelper, "scope mode helper" do
|
|
39
49
|
end
|
40
50
|
|
41
51
|
it "for with local read and call should return :dag scope mode" do
|
42
|
-
|
52
|
+
get_scope_mode(
|
43
53
|
$parser.parse "def foo(a,b,c)
|
44
54
|
for a in b
|
45
55
|
foo
|
@@ -50,7 +60,7 @@ describe FastRuby::ScopeModeHelper, "scope mode helper" do
|
|
50
60
|
end
|
51
61
|
|
52
62
|
it "empty for with local read should return :dag scope mode (because for is a iter call to each with one argument)" do
|
53
|
-
|
63
|
+
get_scope_mode(
|
54
64
|
$parser.parse "def foo(a,b,c)
|
55
65
|
for a in b
|
56
66
|
end
|
@@ -59,7 +69,7 @@ describe FastRuby::ScopeModeHelper, "scope mode helper" do
|
|
59
69
|
end
|
60
70
|
|
61
71
|
it "case with a when should act as call and local read after case when should return :dag" do
|
62
|
-
|
72
|
+
get_scope_mode(
|
63
73
|
$parser.parse "def foo(a,b,c)
|
64
74
|
case b
|
65
75
|
when c
|
@@ -70,7 +80,7 @@ describe FastRuby::ScopeModeHelper, "scope mode helper" do
|
|
70
80
|
end
|
71
81
|
|
72
82
|
it "case with a when should act as call and local read after case when should return :dag" do
|
73
|
-
|
83
|
+
get_scope_mode(
|
74
84
|
$parser.parse "def foo(a,b,c)
|
75
85
|
case b
|
76
86
|
when c
|
@@ -83,7 +93,7 @@ describe FastRuby::ScopeModeHelper, "scope mode helper" do
|
|
83
93
|
end
|
84
94
|
|
85
95
|
it "case with two call (when) after read should return :dag scope" do
|
86
|
-
|
96
|
+
get_scope_mode(
|
87
97
|
$parser.parse "def foo(a,b,c)
|
88
98
|
case a
|
89
99
|
when b # call to a.===(b)
|
@@ -6,14 +6,22 @@ require "fastruby/translator/scope_mode_helper"
|
|
6
6
|
$parser = RubyParser.new
|
7
7
|
|
8
8
|
describe FastRuby::ScopeModeHelper, "scope mode helper" do
|
9
|
-
|
9
|
+
def get_scope_mode(tree)
|
10
10
|
FastRuby::ScopeModeHelper.get_scope_mode(
|
11
|
+
FastRuby::Reductor.new.reduce(
|
12
|
+
FastRuby::FastRubySexp.from_sexp(tree)
|
13
|
+
)
|
14
|
+
)
|
15
|
+
end
|
16
|
+
|
17
|
+
it "empty method should return :linear scope mode" do
|
18
|
+
get_scope_mode(
|
11
19
|
$parser.parse "def foo(); end"
|
12
20
|
).should be == :linear
|
13
21
|
end
|
14
22
|
|
15
23
|
it "method without calls should return :linear scope mode" do
|
16
|
-
|
24
|
+
get_scope_mode(
|
17
25
|
$parser.parse "def foo(a,b,c)
|
18
26
|
a
|
19
27
|
end"
|
@@ -21,7 +29,7 @@ describe FastRuby::ScopeModeHelper, "scope mode helper" do
|
|
21
29
|
end
|
22
30
|
|
23
31
|
it "method with only ONE call should return :linear scope mode" do
|
24
|
-
|
32
|
+
get_scope_mode(
|
25
33
|
$parser.parse "def foo(a,b)
|
26
34
|
a+b
|
27
35
|
end"
|
@@ -29,7 +37,7 @@ describe FastRuby::ScopeModeHelper, "scope mode helper" do
|
|
29
37
|
end
|
30
38
|
|
31
39
|
it "method call AFTER read should return :linear scope" do
|
32
|
-
|
40
|
+
get_scope_mode(
|
33
41
|
$parser.parse "def foo(a,b)
|
34
42
|
a=b
|
35
43
|
a+b
|
@@ -38,7 +46,7 @@ describe FastRuby::ScopeModeHelper, "scope mode helper" do
|
|
38
46
|
end
|
39
47
|
|
40
48
|
it "empty if should return :linear scope mode" do
|
41
|
-
|
49
|
+
get_scope_mode(
|
42
50
|
$parser.parse "def foo(a,b,c)
|
43
51
|
if (a)
|
44
52
|
end
|
@@ -46,7 +54,7 @@ describe FastRuby::ScopeModeHelper, "scope mode helper" do
|
|
46
54
|
).should be == :linear
|
47
55
|
end
|
48
56
|
it "iter call with empty block should return linear" do
|
49
|
-
|
57
|
+
get_scope_mode(
|
50
58
|
$parser.parse "def foo
|
51
59
|
bar do
|
52
60
|
end
|
@@ -55,7 +63,7 @@ describe FastRuby::ScopeModeHelper, "scope mode helper" do
|
|
55
63
|
end
|
56
64
|
|
57
65
|
it "return of simple call should return :linear" do
|
58
|
-
|
66
|
+
get_scope_mode(
|
59
67
|
$parser.parse "def foo(a,b)
|
60
68
|
return a+b
|
61
69
|
end"
|
@@ -63,7 +71,7 @@ describe FastRuby::ScopeModeHelper, "scope mode helper" do
|
|
63
71
|
end
|
64
72
|
|
65
73
|
it "call on if body and read on condition should return :linear (no read after call risk)" do
|
66
|
-
|
74
|
+
get_scope_mode(
|
67
75
|
$parser.parse "def foo(a,b)
|
68
76
|
if a
|
69
77
|
b.foo
|
@@ -73,7 +81,7 @@ describe FastRuby::ScopeModeHelper, "scope mode helper" do
|
|
73
81
|
end
|
74
82
|
|
75
83
|
it "call on if body and read on else body should return :linear (no read after call risk)" do
|
76
|
-
|
84
|
+
get_scope_mode(
|
77
85
|
$parser.parse "def foo(a,b)
|
78
86
|
if true
|
79
87
|
b
|
@@ -85,7 +93,7 @@ describe FastRuby::ScopeModeHelper, "scope mode helper" do
|
|
85
93
|
end
|
86
94
|
|
87
95
|
it "method with read on begin body should return :linear scope mode" do
|
88
|
-
|
96
|
+
get_scope_mode(
|
89
97
|
$parser.parse "def foo(a,b,c)
|
90
98
|
begin
|
91
99
|
nil.bar(b)
|
@@ -96,7 +104,7 @@ describe FastRuby::ScopeModeHelper, "scope mode helper" do
|
|
96
104
|
end
|
97
105
|
|
98
106
|
it "method with read on begin body and call on rescue body should return :linear scope mode" do
|
99
|
-
|
107
|
+
get_scope_mode(
|
100
108
|
$parser.parse "def foo(a,b,c)
|
101
109
|
begin
|
102
110
|
b
|
@@ -108,7 +116,7 @@ describe FastRuby::ScopeModeHelper, "scope mode helper" do
|
|
108
116
|
end
|
109
117
|
|
110
118
|
it "case with call (when) after read should return :linear scope" do
|
111
|
-
|
119
|
+
get_scope_mode(
|
112
120
|
$parser.parse "def foo(a,b,c)
|
113
121
|
case a
|
114
122
|
when b
|
@@ -119,7 +127,7 @@ describe FastRuby::ScopeModeHelper, "scope mode helper" do
|
|
119
127
|
end
|
120
128
|
|
121
129
|
it "read of variable AFTER write without call between them should return :linear scope" do
|
122
|
-
|
130
|
+
get_scope_mode(
|
123
131
|
$parser.parse "def foo(a,b)
|
124
132
|
a+b
|
125
133
|
c=55
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require "fastruby"
|
2
|
+
|
3
|
+
describe FastRuby::FastRubySexp, "FastRubySexp" do
|
4
|
+
|
5
|
+
it "should accept _static keyword to compile static C calls" do
|
6
|
+
fastruby "
|
7
|
+
class STATICX1
|
8
|
+
def foo(a)
|
9
|
+
_static {
|
10
|
+
INT2FIX(FIX2INT(a))
|
11
|
+
}
|
12
|
+
end
|
13
|
+
end
|
14
|
+
"
|
15
|
+
|
16
|
+
STATICX1.new.foo(100).should be == 100
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should allow native inmediates inside static blocks as native C semantic" do
|
20
|
+
fastruby "
|
21
|
+
class STATICX2
|
22
|
+
def foo
|
23
|
+
_static {
|
24
|
+
INT2FIX(100)
|
25
|
+
}
|
26
|
+
end
|
27
|
+
end
|
28
|
+
"
|
29
|
+
|
30
|
+
STATICX2.new.foo.should be == 100
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should accept _dynamic to activate ruby sematic inside _static block" do
|
34
|
+
fastruby "
|
35
|
+
class STATICX3
|
36
|
+
def bar(a)
|
37
|
+
a+1
|
38
|
+
end
|
39
|
+
|
40
|
+
def foo(a)
|
41
|
+
_static {
|
42
|
+
INT2FIX(
|
43
|
+
FIX2INT(
|
44
|
+
_dynamic{bar(a)}
|
45
|
+
)
|
46
|
+
)
|
47
|
+
}
|
48
|
+
end
|
49
|
+
end
|
50
|
+
"
|
51
|
+
|
52
|
+
STATICX3.new.foo(100).should be == 101
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require "fastruby"
|
2
|
+
|
3
|
+
describe FastRuby::FastRubySexp, "FastRubySexp" do
|
4
|
+
fastruby "
|
5
|
+
class STATICFLOW1
|
6
|
+
def foo(a)
|
7
|
+
_static do
|
8
|
+
if (FIX2INT(a))
|
9
|
+
INT2FIX(20)
|
10
|
+
else
|
11
|
+
INT2FIX(40)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
"
|
17
|
+
|
18
|
+
|
19
|
+
def self.test_static_if(*args)
|
20
|
+
args.each do |arg|
|
21
|
+
it "should should evaluate #{arg} as #{arg != 0} on static if" do
|
22
|
+
STATICFLOW1.new.foo(arg).should be == (arg == 0 ? 40 : 20)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
test_static_if false.__id__, true.__id__, nil.__id__, 10, 11
|
28
|
+
|
29
|
+
it "should allow static while" do
|
30
|
+
fastruby "
|
31
|
+
class STATICFLOW2
|
32
|
+
def foo(a)
|
33
|
+
ret = 0
|
34
|
+
_static do
|
35
|
+
while (FIX2INT(a) > 0)
|
36
|
+
a = INT2FIX(FIX2INT(a) - 1)
|
37
|
+
ret = INT2FIX(FIX2INT(ret) + 1)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
ret
|
41
|
+
end
|
42
|
+
end
|
43
|
+
"
|
44
|
+
|
45
|
+
STATICFLOW2.new.foo(7).should be == 7
|
46
|
+
STATICFLOW2.new.foo(0).should be == 0
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,104 @@
|
|
1
|
+
require "fastruby"
|
2
|
+
|
3
|
+
describe FastRuby::FastRubySexp, "FastRubySexp" do
|
4
|
+
|
5
|
+
def self.test_binary_operator(op, classname, input, expected)
|
6
|
+
it "should accept native operator #{op} with two numbers input:#{input} expected:#{expected}}" do
|
7
|
+
fastruby "
|
8
|
+
class #{classname}
|
9
|
+
def foo(a)
|
10
|
+
_static {
|
11
|
+
INT2FIX(FIX2INT(a)#{op}2)
|
12
|
+
}
|
13
|
+
end
|
14
|
+
end
|
15
|
+
"
|
16
|
+
|
17
|
+
eval(classname).new.foo(input).should be == expected
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
test_binary_operator("+", "STATICX1_1", 10, 12)
|
22
|
+
test_binary_operator("-", "STATICX1_2", 10, 8)
|
23
|
+
test_binary_operator("*", "STATICX1_3", 10, 20)
|
24
|
+
test_binary_operator("/", "STATICX1_4", 10, 5)
|
25
|
+
|
26
|
+
(3..4).each do |i|
|
27
|
+
test_binary_operator(">", "STATICX1_5_#{i}", i, 1)
|
28
|
+
end
|
29
|
+
|
30
|
+
(-1..2).each do |i|
|
31
|
+
test_binary_operator(">", "STATICX1_6_#{i.to_s.gsub('-','__')}", i, 0)
|
32
|
+
end
|
33
|
+
|
34
|
+
(-1..1).each do |i|
|
35
|
+
test_binary_operator("<", "STATICX1_6_#{i.to_s.gsub('-','__')}", i, 1)
|
36
|
+
end
|
37
|
+
|
38
|
+
(2..3).each do |i|
|
39
|
+
test_binary_operator("<", "STATICX1_7_#{i}", i, 0)
|
40
|
+
end
|
41
|
+
|
42
|
+
|
43
|
+
(2..4).each do |i|
|
44
|
+
test_binary_operator(">=", "STATICX1_8_#{i}", i, 1)
|
45
|
+
end
|
46
|
+
|
47
|
+
(-1..1).each do |i|
|
48
|
+
test_binary_operator(">=", "STATICX1_9_#{i.to_s.gsub('-','__')}", i, 0)
|
49
|
+
end
|
50
|
+
|
51
|
+
(-1..2).each do |i|
|
52
|
+
test_binary_operator("<=", "STATICX1_10_#{i.to_s.gsub('-','__')}", i, 1)
|
53
|
+
end
|
54
|
+
|
55
|
+
(3..4).each do |i|
|
56
|
+
test_binary_operator("<=", "STATICX1_11_#{i}", i, 0)
|
57
|
+
end
|
58
|
+
|
59
|
+
|
60
|
+
(3..5).each do |i|
|
61
|
+
test_binary_operator("==", "STATICX1_12_#{i}", i, i == 2 ? 1 : 0)
|
62
|
+
end
|
63
|
+
|
64
|
+
(3..5).each do |i|
|
65
|
+
test_binary_operator("===", "STATICX1_13_#{i}", i, i == 2 ? 1 : 0)
|
66
|
+
end
|
67
|
+
|
68
|
+
def self.test_bool_operator(code, classname, expected)
|
69
|
+
it "should execute boolean operation #{code} expected:#{expected}}" do
|
70
|
+
fastruby "
|
71
|
+
class #{classname}
|
72
|
+
def foo
|
73
|
+
_static {
|
74
|
+
if (#{code})
|
75
|
+
INT2FIX(40)
|
76
|
+
else
|
77
|
+
INT2FIX(20)
|
78
|
+
end
|
79
|
+
}
|
80
|
+
end
|
81
|
+
end
|
82
|
+
"
|
83
|
+
|
84
|
+
eval(classname).new.foo.should be == expected
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
test_bool_operator "4 and 4", "STATIC1_14", 40
|
89
|
+
test_bool_operator "4 or 4", "STATIC1_15", 40
|
90
|
+
|
91
|
+
it "should execute boolean operation not" do
|
92
|
+
fastruby "
|
93
|
+
class STATIC1_16
|
94
|
+
def foo
|
95
|
+
_static {
|
96
|
+
INT2FIX((not 4))
|
97
|
+
}
|
98
|
+
end
|
99
|
+
end
|
100
|
+
"
|
101
|
+
|
102
|
+
STATIC1_16.new.foo.should be == 0
|
103
|
+
end
|
104
|
+
end
|