fastruby 0.0.16 → 0.0.17

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 (78) hide show
  1. data/CHANGELOG +17 -1
  2. data/Rakefile +1 -1
  3. data/ext/fastruby_base/fastruby_base.inl +81 -3
  4. data/lib/fastruby/fastruby_sexp.rb +21 -0
  5. data/lib/fastruby/getlocals.rb +2 -1
  6. data/lib/fastruby/object.rb +1 -1
  7. data/lib/fastruby/sexp_extension.rb +189 -0
  8. data/lib/fastruby/sexp_extension_edges.rb +210 -0
  9. data/lib/fastruby/translator/modules/block.rb +29 -22
  10. data/lib/fastruby/translator/modules/call.rb +211 -34
  11. data/lib/fastruby/translator/modules/defn.rb +64 -29
  12. data/lib/fastruby/translator/modules/exceptions.rb +1 -1
  13. data/lib/fastruby/translator/modules/flow.rb +93 -31
  14. data/lib/fastruby/translator/modules/iter.rb +277 -340
  15. data/lib/fastruby/translator/modules/literal.rb +97 -20
  16. data/lib/fastruby/translator/modules/logical.rb +40 -5
  17. data/lib/fastruby/translator/modules/method_group.rb +41 -19
  18. data/lib/fastruby/translator/modules/nonlocal.rb +74 -29
  19. data/lib/fastruby/translator/modules/variable.rb +151 -42
  20. data/lib/fastruby/translator/scope_mode_helper.rb +161 -0
  21. data/lib/fastruby/translator/translator.rb +389 -302
  22. data/lib/fastruby.rb +1 -1
  23. data/lib/fastruby.rb~ +36 -0
  24. data/spec/edges_helper.rb +91 -0
  25. data/spec/graph/base_spec.rb +35 -0
  26. data/spec/graph/path_spec.rb +48 -0
  27. data/spec/graph/vertex_spec.rb +58 -0
  28. data/spec/ruby/block/proc_as_block_spec.rb +214 -0
  29. data/spec/ruby/block/redo_spec.rb +133 -0
  30. data/spec/ruby/defn/single_function_spec.rb +50 -0
  31. data/spec/scope_mode/base_spec.rb +55 -0
  32. data/spec/scope_mode/block_spec.rb +105 -0
  33. data/spec/scope_mode/call_spec.rb +24 -0
  34. data/spec/scope_mode/exception_spec.rb +34 -0
  35. data/spec/scope_mode/flow_spec.rb +99 -0
  36. data/spec/scope_mode/optimization_spec.rb +130 -0
  37. data/spec/sexp2graph/base_spec.rb +36 -0
  38. data/spec/sexp2graph/exception_spec.rb +172 -0
  39. data/spec/sexp2graph/flow_spec.rb +67 -0
  40. data/spec/sexp2graph/logical_spec.rb +21 -0
  41. data/spec/sexp2graph/variable_spec.rb +26 -0
  42. metadata +110 -120
  43. data/lib/fastruby/self +0 -82
  44. data/lib/len +0 -280
  45. data/spec/block/proc_as_block_spec.rb +0 -111
  46. data/spec/block/redo_spec.rb +0 -67
  47. /data/spec/{base_spec.rb → ruby/base_spec.rb} +0 -0
  48. /data/spec/{block → ruby/block}/arguments_spec.rb +0 -0
  49. /data/spec/{block → ruby/block}/block_as_proc_spec.rb +0 -0
  50. /data/spec/{block → ruby/block}/break_spec.rb +0 -0
  51. /data/spec/{block → ruby/block}/callcc_spec.rb +0 -0
  52. /data/spec/{block → ruby/block}/lambda_spec.rb +0 -0
  53. /data/spec/{block → ruby/block}/next_spec.rb +0 -0
  54. /data/spec/{block → ruby/block}/proc_spec.rb +0 -0
  55. /data/spec/{block → ruby/block}/retry_spec.rb +0 -0
  56. /data/spec/{block_spec.rb → ruby/block_spec.rb} +0 -0
  57. /data/spec/{call → ruby/call}/base_call_spec.rb +0 -0
  58. /data/spec/{call → ruby/call}/multiple_args_spec.rb +0 -0
  59. /data/spec/{control_spec.rb → ruby/control_spec.rb} +0 -0
  60. /data/spec/{defn → ruby/defn}/default_args_spec.rb +0 -0
  61. /data/spec/{defn → ruby/defn}/multiple_args_spec.rb +0 -0
  62. /data/spec/{defn → ruby/defn}/replacement_spec.rb +0 -0
  63. /data/spec/{exception → ruby/exception}/base_spec.rb +0 -0
  64. /data/spec/{exception → ruby/exception}/ensure_spec.rb +0 -0
  65. /data/spec/{exception → ruby/exception}/exc_trap_spec.rb +0 -0
  66. /data/spec/{exception → ruby/exception}/internal_ex_spec.rb +0 -0
  67. /data/spec/{exception → ruby/exception}/syntaxis_spec.rb +0 -0
  68. /data/spec/{expression_spec.rb → ruby/expression_spec.rb} +0 -0
  69. /data/spec/{flow_control → ruby/flow_control}/case_spec.rb +0 -0
  70. /data/spec/{flow_control → ruby/flow_control}/for_spec.rb +0 -0
  71. /data/spec/{integrity_spec.rb → ruby/integrity_spec.rb} +0 -0
  72. /data/spec/{jump → ruby/jump}/next_spec.rb +0 -0
  73. /data/spec/{literal_spec.rb → ruby/literal_spec.rb} +0 -0
  74. /data/spec/{module_spec.rb → ruby/module_spec.rb} +0 -0
  75. /data/spec/{return_spec.rb → ruby/return_spec.rb} +0 -0
  76. /data/spec/{singleton_spec.rb → ruby/singleton_spec.rb} +0 -0
  77. /data/spec/{sugar_spec.rb → ruby/sugar_spec.rb} +0 -0
  78. /data/spec/{variable_spec.rb → ruby/variable_spec.rb} +0 -0
data/lib/fastruby.rb CHANGED
@@ -32,5 +32,5 @@ class Object
32
32
  end
33
33
 
34
34
  module FastRuby
35
- VERSION = "0.0.16" unless defined? FastRuby::VERSION
35
+ VERSION = "0.0.17" unless defined? FastRuby::VERSION
36
36
  end
data/lib/fastruby.rb~ ADDED
@@ -0,0 +1,36 @@
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 "fastruby/exceptions"
22
+ require "fastruby/object"
23
+ require "fastruby/exceptions"
24
+ require "fastruby/custom_require"
25
+ require "fastruby/set_tree"
26
+ require "base64"
27
+
28
+ class Object
29
+ def self.decode64(value)
30
+ Base64.decode64(value)
31
+ end
32
+ end
33
+
34
+ module FastRuby
35
+ VERSION = "0.0.16" unless defined? FastRuby::VERSION
36
+ end
@@ -0,0 +1,91 @@
1
+ module EdgesHelper
2
+
3
+ class GraphEdges < Array
4
+ def initialize(sexp); @sexp = sexp; end
5
+
6
+ def to_sexp(obj, &blk)
7
+ if obj.instance_of? Symbol
8
+ blk.call @sexp.find_tree{|st| st.node_type == :call and st[2] == obj}
9
+ elsif obj.instance_of? Array
10
+ obj.each do |element|
11
+ to_sexp(element,&blk)
12
+ end
13
+ else
14
+ blk.call obj
15
+ end
16
+ end
17
+
18
+ def tr_edges(hash)
19
+ hash.each do |k,v|
20
+ to_sexp(k) do |a|
21
+ to_sexp(v) do |b|
22
+ yield(a,b)
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+
29
+ def get_defn_edges(code)
30
+ sexp = FastRuby::FastRubySexp.parse(code)
31
+
32
+ edges = GraphEdges.new(sexp)
33
+ sexp[3].edges.each do |tree_orig, tree_dest|
34
+ edges << [tree_orig, tree_dest]
35
+ end
36
+
37
+ yield(sexp, edges)
38
+ end
39
+
40
+ def get_edges(code)
41
+ sexp = FastRuby::FastRubySexp.parse(code)
42
+
43
+ edges = GraphEdges.new(sexp)
44
+ sexp.edges.each do |tree_orig, tree_dest|
45
+ edges << [tree_orig, tree_dest]
46
+ end
47
+
48
+ yield(sexp, edges)
49
+ end
50
+
51
+ module KlassLevelHelper
52
+ def assert_graph(assert_name, code, node_count = nil)
53
+ it assert_name do
54
+ get_edges(code) do |sexp, edges|
55
+ condition_tree = sexp[1]
56
+ execution_tree = sexp[2]
57
+
58
+ if node_count
59
+ edges.count.should be == node_count
60
+ end
61
+
62
+ edges.tr_edges yield(sexp,edges) do |a,b|
63
+ edges.should include([a,b])
64
+ end
65
+ end
66
+ end
67
+ end
68
+
69
+ def assert_graph_defn(assert_name, code, node_count = nil)
70
+ it assert_name do
71
+ get_defn_edges(code) do |sexp, edges|
72
+ condition_tree = sexp[1]
73
+ execution_tree = sexp[2]
74
+
75
+ if node_count
76
+ edges.count.should be == node_count
77
+ end
78
+
79
+ edges.tr_edges yield(sexp,edges) do |a,b|
80
+ edges.should include([a,b])
81
+ end
82
+ end
83
+ end
84
+ end
85
+ end
86
+
87
+ def self.included(klass)
88
+ klass.extend KlassLevelHelper
89
+ end
90
+ end
91
+
@@ -0,0 +1,35 @@
1
+ require "fastruby"
2
+ require "fastruby/sexp_extension"
3
+
4
+ describe FastRuby::Graph, "fastruby sexp graph" do
5
+ include FastRuby
6
+ it "should allow create empty graph" do
7
+ graph = Graph.new
8
+ end
9
+
10
+ it "should allow add edges with add_edge" do
11
+ graph = Graph.new
12
+ graph.add_edge(1,2)
13
+ graph.edges.count.should be == 1
14
+ graph.edges.first.should be == [1,2]
15
+ end
16
+
17
+ it "should return 0 edges for an empty graph" do
18
+ graph = Graph.new
19
+ graph.edges.count.should be == 0
20
+ end
21
+
22
+ it "should allow creation of graphs using hashes" do
23
+ graph = Graph.new 3 => [4]
24
+ graph.edges.count.should be == 1
25
+ graph.edges.should include([3,4])
26
+ end
27
+
28
+ it "should allow creation of graphs using hashes with multiple nodes" do
29
+ graph = Graph.new 3 => [4,5,6]
30
+ graph.edges.count.should be == 3
31
+ graph.edges.should include([3,4])
32
+ graph.edges.should include([3,5])
33
+ graph.edges.should include([3,6])
34
+ end
35
+ end
@@ -0,0 +1,48 @@
1
+ require "fastruby"
2
+ require "fastruby/sexp_extension"
3
+
4
+ describe FastRuby::Graph, "fastruby sexp graph" do
5
+ include FastRuby
6
+
7
+ def self.assert_graph_paths(origin, paths, graph_hash)
8
+ it "should read paths #{paths.inspect} for graph #{graph_hash} from #{origin}" do
9
+ graph = Graph.new graph_hash
10
+
11
+ array = []
12
+ graph.each_path_from(origin) do |path|
13
+ path_array = []
14
+ path.each(&path_array.method(:<<))
15
+ array << path_array
16
+ end
17
+
18
+ paths.each do |path|
19
+ array.should include(path)
20
+ end
21
+ array.count.should be == paths.count
22
+
23
+ array
24
+ end
25
+ end
26
+
27
+ assert_graph_paths(1, [[1,2]], 1 => [2] )
28
+ assert_graph_paths(1, [[1,3]], 1 => [3] )
29
+ assert_graph_paths(1, [[1,4]], 1 => [4] )
30
+ assert_graph_paths(3, [[3,2]], 3 => [2] )
31
+ assert_graph_paths(4, [[4,2]], 4 => [2] )
32
+
33
+ assert_graph_paths(1, [[1,2],[1,3]], 1 => [2,3] )
34
+
35
+ assert_graph_paths(1, [[1,2,3]], 1 => [2], 2 => [3] )
36
+ assert_graph_paths(1, [[1,2,3],[1,2,4]], 1 => [2], 2 => [3,4] )
37
+ assert_graph_paths(1, [[1,2,4],[1,3,4]], 1 => [2,3], 2 => [4],3 => [4] )
38
+ assert_graph_paths(1, [[1,2,3,4,5],[1,2,3,5],[1,3,5],[1,3,4,5]], 1 => [2,3], 2 => [3],3 => [4,5],4 => [5] )
39
+
40
+ # cyclic paths
41
+ assert_graph_paths(1, [[1]], 1 => [1] )
42
+ assert_graph_paths(1, [[1,2,1]], 1 => [2], 2 => [1] )
43
+ assert_graph_paths(2, [[2,1,2]], 1 => [2], 2 => [1] )
44
+
45
+ # cyclyc paths with repeated vertexes
46
+ assert_graph_paths(1, [[1,2,4],[1,2,3,2,4]], 1 => [2], 2 => [3,4], 3 => [2])
47
+ end
48
+
@@ -0,0 +1,58 @@
1
+ require "fastruby"
2
+ require "fastruby/sexp_extension"
3
+
4
+ describe FastRuby::Graph, "fastruby sexp graph" do
5
+ include FastRuby
6
+ it "should allow read vertex from empty graph" do
7
+ graph = Graph.new
8
+ graph.vertexes
9
+ end
10
+
11
+ it "should allow read vertex from empty graph and it must be empty" do
12
+ graph = Graph.new
13
+ graph.vertexes.count.should be == 0
14
+ end
15
+
16
+ it "should allow read vertex from graph with one vertex" do
17
+ graph = Graph.new 1 => [1]
18
+ graph.vertexes.count.should be == 1
19
+ graph.vertexes.should include(1)
20
+ end
21
+
22
+ it "should allow read vertex from graph with two vertexes" do
23
+ graph = Graph.new 1 => [1,2]
24
+ graph.vertexes.count.should be == 2
25
+ graph.vertexes.should include(1)
26
+ graph.vertexes.should include(2)
27
+ end
28
+
29
+ it "should allow allow read vertex outputs" do
30
+ graph = Graph.new 1 => [1]
31
+
32
+ array = []
33
+ graph.each_vertex_output(1, &array.method(:<<))
34
+
35
+ array.should include(1)
36
+ end
37
+
38
+ it "should allow read vertex outputs" do
39
+ graph = Graph.new 1 => [2]
40
+
41
+ array = []
42
+ graph.each_vertex_output(1, &array.method(:<<))
43
+
44
+ array.should include(2)
45
+
46
+ array = []
47
+ graph.each_vertex_output(2, &array.method(:<<))
48
+
49
+ array.should be == []
50
+ end
51
+
52
+
53
+ it "should allow read vertex outputs with no blocks (returning sets)" do
54
+ graph = Graph.new 1 => [2]
55
+ graph.each_vertex_output(1).should include(2)
56
+ graph.each_vertex_output(2).count.should == 0
57
+ end
58
+ end
@@ -0,0 +1,214 @@
1
+ require "fastruby"
2
+
3
+ describe FastRuby, "fastruby" do
4
+ class ::VY1
5
+ fastruby "
6
+ def foo
7
+ yield
8
+ end
9
+ "
10
+ end
11
+
12
+ it "should allow block as proc when calling from normal ruby" do
13
+ executed = 0
14
+
15
+ block = proc do
16
+ executed = 1
17
+ end
18
+
19
+ ::VY1.new.foo(&block)
20
+
21
+ executed.should be == 1
22
+ end
23
+
24
+ class ::VY2
25
+ fastruby "
26
+ def foo
27
+ yield
28
+ end
29
+
30
+ def bar(block)
31
+ foo(&block)
32
+ end
33
+ "
34
+ end
35
+
36
+ it "should allow block as proc when calling from fastruby" do
37
+ executed = 0
38
+
39
+ block = proc do
40
+ executed = 1
41
+ end
42
+
43
+ ::VY2.new.bar(block)
44
+
45
+ executed.should be == 1
46
+ end
47
+
48
+ class ::VY3
49
+ fastruby "
50
+ def foo
51
+ yield(1)
52
+ end
53
+
54
+ def bar(block)
55
+ foo(&block)
56
+ end
57
+ "
58
+ end
59
+
60
+ it "should allow block as proc when calling from fastruby with arguments" do
61
+ executed = 0
62
+ recv_x = nil
63
+
64
+ block = proc do |x|
65
+ recv_x = x
66
+ executed = 1
67
+ end
68
+
69
+ ::VY3.new.bar(block)
70
+
71
+ recv_x.should be == 1
72
+ executed.should be == 1
73
+ end
74
+
75
+
76
+ class ::VY4
77
+ def foo(a,b,c)
78
+ yield(a,b,c)
79
+ end
80
+
81
+
82
+ fastruby "
83
+ def bar(x,block)
84
+ foo(*x,&block)
85
+ end
86
+ "
87
+ end
88
+
89
+ it "should allow block as proc when calling from fastruby with splat arguments" do
90
+ executed = 0
91
+ recv_a = nil
92
+ recv_b = nil
93
+ recv_c = nil
94
+
95
+ block = proc do |a,b,c|
96
+ recv_a = a
97
+ recv_b = b
98
+ recv_c = c
99
+ executed = 1
100
+ end
101
+
102
+ ::VY4.new.bar([1,2,3],block)
103
+
104
+ recv_a.should be == 1
105
+ recv_b.should be == 2
106
+ recv_c.should be == 3
107
+ executed.should be == 1
108
+ end
109
+
110
+ class ::VY5
111
+ def foo(a)
112
+ yield(a)
113
+ end
114
+
115
+
116
+ fastruby "
117
+ def bar(x,block)
118
+ foo(*x,&block)
119
+ end
120
+ "
121
+ end
122
+
123
+ it "should allow pass symbols as blocks" do
124
+ vy5 = ::VY5.new
125
+ vy5.bar([44],:to_s).should be == "44"
126
+ end
127
+
128
+
129
+ class ::VY6
130
+ fastruby "
131
+ def foo(a)
132
+ yield(a)
133
+ end
134
+
135
+ def bar(x,block)
136
+ foo(x,&block)
137
+ end
138
+ "
139
+ end
140
+
141
+ it "should allow single arguments with block" do
142
+ vy6 = ::VY6.new
143
+
144
+ block = proc do |a| "44" end
145
+ vy6.bar(44,block).should be == "44"
146
+ end
147
+
148
+ class ::VY7
149
+ def foo(a)
150
+ yield(a)
151
+ end
152
+
153
+
154
+ fastruby "
155
+ def bar(x,block)
156
+ foo(x,&block)
157
+ end
158
+ "
159
+ end
160
+
161
+ it "should allow single arguments with block calling ruby methods" do
162
+ vy7 = ::VY7.new
163
+
164
+ block = proc do |a| "44" end
165
+ vy7.bar(44,block).should be == "44"
166
+ end
167
+
168
+
169
+ class ::VY8
170
+ def foo(a)
171
+ yield(a)
172
+ end
173
+
174
+
175
+ fastruby "
176
+ def bar(x,block)
177
+ foo(x,&block)
178
+ end
179
+ "
180
+ end
181
+
182
+ it "should allow single arguments with block calling ruby methods and read block arguments" do
183
+ vy8 = ::VY8.new
184
+
185
+ block = proc do |a| a.to_s end
186
+ vy8.bar(555,block).should be == "555"
187
+ end
188
+
189
+ it "should allow single arguments with block calling ruby methods and read array block arguments" do
190
+ vy8 = ::VY8.new
191
+
192
+ block = proc do |a| a end
193
+ vy8.bar([555],block).should be == [555]
194
+ end
195
+
196
+ class ::VY9
197
+ def foo(a)
198
+ yield(a)
199
+ end
200
+
201
+ fastruby "
202
+ def bar(vy9,x,block)
203
+ vy9.first.foo(x,&block)
204
+ end
205
+ "
206
+ end
207
+
208
+ it "should allow block as proc with no type inference of the receiver" do
209
+ vy9 = ::VY9.new
210
+
211
+ block = proc do |a| a end
212
+ vy9.bar([vy9],555,block).should be == 555
213
+ end
214
+ end
@@ -0,0 +1,133 @@
1
+ require "fastruby"
2
+
3
+ describe FastRuby, "fastruby redo statement" do
4
+ class ::WB1
5
+ fastruby "
6
+ def bar
7
+ yield
8
+ end
9
+
10
+ def foo
11
+ sum = 0
12
+ bar do
13
+ sum = sum + 1
14
+ redo if sum<10
15
+ end
16
+
17
+ sum
18
+ end
19
+ "
20
+ end
21
+
22
+ it "should execute basic redo" do
23
+ wb1 = ::WB1.new
24
+ wb1.foo.should be == 10
25
+ end
26
+
27
+ class ::WB2
28
+ def bar
29
+ yield
30
+ end
31
+
32
+ fastruby "
33
+
34
+ def foo
35
+ sum = 0
36
+ bar do
37
+ sum = sum + 1
38
+ redo if sum<10
39
+ end
40
+
41
+ sum
42
+ end
43
+ "
44
+ end
45
+
46
+ it "should execute basic redo (called method is in ruby)" do
47
+ wb2 = ::WB2.new
48
+ wb2.foo.should be == 10
49
+ end
50
+
51
+ class ::WB3
52
+ fastruby "
53
+ def foo
54
+ redo
55
+ end
56
+ "
57
+ end
58
+
59
+ it "should raise LocalJumpError when invoked illegal redo" do
60
+ wb3 = ::WB3.new
61
+
62
+ lambda {
63
+ wb3.foo
64
+ }.should raise_error(LocalJumpError)
65
+ end
66
+
67
+ class ::WB4
68
+ fastruby <<EOS
69
+ def foo
70
+ yield(5)
71
+ end
72
+
73
+ def bar
74
+ a = true
75
+ foo do |n|
76
+ if a
77
+ a = false
78
+ n = 555
79
+ redo
80
+ end
81
+ n
82
+ end
83
+ end
84
+ EOS
85
+ end
86
+
87
+ it "should NOT restore variable arguments on block when calling redo" do
88
+ wb4 = ::WB4.new
89
+ wb4.bar.should be == 555
90
+ end
91
+
92
+ class ::WB5
93
+ fastruby <<EOS
94
+ def bar
95
+ a = true
96
+ proc do |n|
97
+ if a
98
+ a = false
99
+ n = 555
100
+ redo
101
+ end
102
+ n
103
+ end
104
+ end
105
+ EOS
106
+ end
107
+
108
+ it "should NOT restore variable arguments on block when calling redo (lambda block)" do
109
+ wb5 = ::WB5.new
110
+ wb5.bar.call(5).should be == 555
111
+ end
112
+
113
+ class ::WB6
114
+ fastruby <<EOS
115
+ def bar
116
+ a = true
117
+ Proc.new do |n|
118
+ if a
119
+ a = false
120
+ n = 555
121
+ redo
122
+ end
123
+ n
124
+ end
125
+ end
126
+ EOS
127
+ end
128
+
129
+ it "should NOT restore variable arguments on block when calling redo (Proc.new block)" do
130
+ wb6 = ::WB6.new
131
+ wb6.bar.call(5).should be == 555
132
+ end
133
+ end
@@ -0,0 +1,50 @@
1
+ require "fastruby"
2
+
3
+ describe FastRuby, "fastruby" do
4
+ it "should allow define single method (without class)" do
5
+ fastruby "
6
+ def foo
7
+ end
8
+ "
9
+ end
10
+
11
+ it "should allow define and call single method (without class)" do
12
+ fastruby "
13
+ def foo
14
+
15
+ end
16
+ "
17
+ foo
18
+ end
19
+
20
+ it "should allow define method from inside another method" do
21
+ class ::YZU1
22
+ fastruby "
23
+ def foo
24
+ def bar
25
+ 77
26
+ end
27
+ end
28
+ "
29
+ end
30
+
31
+ ::YZU1.new.foo
32
+ end
33
+
34
+ it "should allow define and call method from inside another method" do
35
+ class ::YZU2
36
+ fastruby "
37
+ def foo
38
+ def bar
39
+ 99
40
+ end
41
+ end
42
+ "
43
+ end
44
+
45
+ yzu2 = ::YZU2.new
46
+ yzu2.foo
47
+ yzu2.bar.should be == 99
48
+ end
49
+
50
+ end