fastruby 0.0.20 → 0.0.21

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. data/Rakefile +1 -1
  2. data/lib/fastruby/builder.rb~ +5 -1
  3. data/lib/fastruby/corelib/fixnum.rb +1 -1
  4. data/lib/fastruby/corelib/fixnum.rb~ +0 -71
  5. data/lib/fastruby/corelib.rb~ +1 -1
  6. data/lib/fastruby/modules/inliner/call.rb~ +3 -1
  7. data/lib/fastruby/modules/translator/call.rb +1 -1
  8. data/lib/fastruby/modules/translator/call.rb~ +1 -1
  9. data/lib/fastruby/object.rb~ +0 -6
  10. data/lib/fastruby.rb +1 -1
  11. data/lib/fastruby.rb~ +1 -1
  12. data/spec/corelib/numeric/fixnum_spec.rb +1 -1
  13. data/spec/corelib/numeric/fixnum_spec.rb~ +7 -1
  14. metadata +12 -40
  15. data/lib/fastruby/builder/inference_updater.rb~ +0 -76
  16. data/lib/fastruby/builder/inliner.rb~ +0 -60
  17. data/lib/fastruby/builder/lvar_type.rb~ +0 -44
  18. data/lib/fastruby/builder/pipeline.rb~ +0 -43
  19. data/lib/fastruby/builder/reductor.rb~ +0 -42
  20. data/lib/fastruby/corelib/integer.rb~ +0 -96
  21. data/lib/fastruby/modules/inliner/defn.rb~ +0 -29
  22. data/lib/fastruby/modules/inliner/recursive.rb~ +0 -40
  23. data/lib/fastruby/modules/lvar_type/call.rb~ +0 -36
  24. data/lib/fastruby/modules/lvar_type/defn.rb~ +0 -42
  25. data/lib/fastruby/modules/lvar_type/lasgn.rb~ +0 -42
  26. data/lib/fastruby/modules/lvar_type/recursive.rb~ +0 -33
  27. data/lib/fastruby/modules/reductor/nontree.rb~ +0 -32
  28. data/lib/fastruby/modules/reductor/recursive.rb~ +0 -31
  29. data/lib/fastruby/modules/translator/defn.rb~ +0 -267
  30. data/lib/fastruby/modules/translator/directive.rb~ +0 -44
  31. data/lib/fastruby/modules/translator/exceptions.rb~ +0 -120
  32. data/lib/fastruby/modules/translator/iter.rb~ +0 -745
  33. data/lib/fastruby/modules/translator/literal.rb~ +0 -150
  34. data/lib/fastruby/modules/translator/nonlocal.rb~ +0 -298
  35. data/lib/fastruby/modules/translator/static.rb~ +0 -291
  36. data/lib/fastruby/modules/translator/variable.rb~ +0 -280
  37. data/lib/fastruby/set_tree.rb~ +0 -71
  38. data/lib/fastruby/sexp_extension.rb~ +0 -262
  39. data/lib/fastruby/translator/scope_mode_helper.rb~ +0 -138
  40. data/lib/fastruby/translator/translator.rb~ +0 -1600
  41. data/lib/fastruby/translator/translator_modules.rb~ +0 -53
  42. data/lib/fastruby_only/base.rb +0 -1
@@ -1,262 +0,0 @@
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/fastruby_sexp"
22
- require "fastruby/sexp_extension_edges"
23
- require "ruby_parser"
24
- require "set"
25
-
26
- class Object
27
- def to_fastruby_sexp
28
- self
29
- end
30
- end
31
-
32
- def fs(*args)
33
- if String === args.first
34
- tree = FastRuby::FastRubySexp.parse(args.first)
35
-
36
- if args.size > 1
37
- replacement_hash = {}
38
- args[1..-1].each do |arg|
39
- replacement_hash.merge!(arg)
40
- end
41
-
42
- tree = tree.transform{|subtree|
43
- if subtree.node_type == :call
44
- next replacement_hash[subtree[2]]
45
- elsif subtree.node_type == :lvar
46
- next replacement_hash[subtree[1]]
47
- else
48
- next nil
49
- end
50
- }
51
- end
52
-
53
- tree
54
- else
55
- sexp = FastRuby::FastRubySexp.new
56
- args.each &sexp.method(:<<)
57
- sexp
58
- end
59
- end
60
-
61
- module FastRuby
62
- class Graph
63
- attr_reader :edges
64
- attr_reader :vertexes
65
-
66
- def initialize(hash = {})
67
- @edges = []
68
- @vertexes = Set.new
69
- @vertex_output = Hash.new
70
-
71
- hash.each do |orig,v|
72
- v.each do |dest|
73
- add_edge(orig,dest)
74
- end
75
- end
76
- end
77
-
78
- def add_edge(orig,dest)
79
- @vertexes << orig
80
- @vertexes << dest
81
-
82
- @vertex_output[orig.object_id] ||= Set.new
83
- @vertex_output[orig.object_id] << dest
84
-
85
- @edges << [orig,dest]
86
- end
87
-
88
- def each_vertex_output(vertex,&blk)
89
- outputs = @vertex_output[vertex.object_id]
90
- if outputs
91
- blk ? outputs.each(&blk) : outputs
92
- else
93
- Set.new
94
- end
95
- end
96
-
97
- def each_path_from(vertex, history = [])
98
- outputs = each_vertex_output(vertex) - history.select{|h| h[0] == vertex }.map(&:last)
99
- outputs.delete(vertex)
100
-
101
- if outputs.count == 0
102
- yield [vertex]
103
- return
104
- end
105
-
106
- outputs.each do |vo|
107
- each_path_from(vo,history+[[vertex,vo]]) do |subpath|
108
- yield [vertex]+subpath
109
- end
110
- end
111
- end
112
- end
113
-
114
- class FastRubySexp
115
- def self.from_sexp(value)
116
- return nil if value == nil
117
- return value if value.kind_of? FastRubySexp
118
-
119
- ary = FastRuby::FastRubySexp.new
120
- value.each do |x|
121
- ary << x.to_fastruby_sexp
122
- end
123
- ary
124
- end
125
-
126
- def transform(&blk)
127
- ret = FastRuby::FastRubySexp.from_sexp( blk.call(self) )
128
- unless ret
129
- ret = FastRuby::FastRubySexp.new
130
- each{|st2|
131
- if st2.respond_to?(:transform)
132
- ret << st2.transform(&blk)
133
- else
134
- ret << st2
135
- end
136
- }
137
- end
138
-
139
- ret
140
- end
141
-
142
- def self.parse(code)
143
- from_sexp(RubyParser.new.parse(code))
144
- end
145
-
146
- def to_graph
147
- graph = Graph.new
148
- self.edges.each &graph.method(:add_edge)
149
-
150
- if ENV['FASTRUBY_GRAPH_VERTEX_CHECK'] == '1'
151
- output_vertexes = [];
152
-
153
- self.walk_tree do |subtree|
154
- if graph.each_vertex_output(subtree).count == 0
155
- # vertexes with no output
156
- unless [:arglist,:scope].include? subtree.node_type
157
- output_vertexes << subtree
158
- if output_vertexes.count > 1
159
- raise RuntimeError, "invalid output vertexes #{output_vertexes.map &:node_type}"
160
- end
161
- end
162
- end
163
- end
164
- end
165
-
166
- graph
167
- end
168
-
169
- def edges
170
- Edges.new(self)
171
- end
172
-
173
- def first_tree
174
- if respond_to? "first_tree_#{node_type}"
175
- send("first_tree_#{node_type}")
176
- else
177
- return self[1].first_tree if self.count == 2 and self[1].respond_to? :node_type
178
- return self[1].first_tree if [:if,:block,:while,:until,:or,:and,:ensure].include? node_type
179
- return self[2].first_tree if [:lasgn,:iasgn,:gasgn,:cdecl].include? node_type
180
-
181
- self
182
- end
183
- end
184
-
185
- def first_tree_rescue
186
- if self[1].node_type == :resbody
187
- return self
188
- else
189
- return self[1].first_tree
190
- end
191
- end
192
-
193
- def first_tree_return
194
- self[1] ? self[1].first_tree : self
195
- end
196
-
197
- alias first_tree_break first_tree_return
198
- alias first_tree_next first_tree_return
199
-
200
- def first_tree_yield
201
- if self.size > 1
202
- self[-1].first_tree
203
- else
204
- self
205
- end
206
- end
207
-
208
- def first_tree_iter
209
- call_tree = self[1]
210
- recv = call_tree[1]
211
- if recv
212
- recv.first_tree
213
- else
214
- args_tree = call_tree[3]
215
- if args_tree.size > 1
216
- args_tree[1].first_tree
217
- else
218
- call_tree
219
- end
220
- end
221
- end
222
-
223
- def first_tree_call
224
- recv = self[1]
225
- if recv
226
- recv.first_tree
227
- else
228
- args_tree = self[3]
229
- if args_tree.size > 1
230
- args_tree[1].first_tree
231
- else
232
- self
233
- end
234
- end
235
- end
236
-
237
- def find_break(&blk)
238
- subarray = if node_type == :while
239
- []
240
- elsif node_type == :iter
241
- self[1..-2]
242
- elsif node_type == :break
243
- blk.call(self)
244
- return; nil
245
- else
246
- self[1..-1]
247
- end
248
-
249
- subarray.each do |subtree|
250
- if subtree.respond_to? :find_break
251
- subtree.find_break(&blk)
252
- end
253
- end
254
- end
255
- end
256
- end
257
-
258
- class Sexp
259
- def to_fastruby_sexp
260
- FastRuby::FastRubySexp.from_sexp(self)
261
- end
262
- end
@@ -1,138 +0,0 @@
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/sexp_extension"
22
-
23
- module FastRuby
24
- class ScopeModeHelper
25
- def self.get_scope_mode(tree_)
26
- new.get_scope_mode(tree_)
27
- end
28
-
29
- def get_scope_mode(tree_)
30
- tree = FastRuby::FastRubySexp.from_sexp(tree_)
31
-
32
- if tree.node_type == :defn
33
- args_tree = tree[2]
34
- impl_tree = tree[3]
35
- elsif tree.node_type == :defs
36
- args_tree = tree[3]
37
- impl_tree = tree[4]
38
- end
39
-
40
-
41
- p $search_array.call(impl_tree)
42
- graph = impl_tree.to_graph
43
-
44
- args_tree[1..-1].each do |subtree|
45
- return :dag if subtree.to_s =~ /^\&/
46
- end
47
-
48
- tree.walk_tree do |subtree|
49
- if subtree.node_type == :iter
50
- iter_impl = subtree[3]
51
-
52
- return :dag if has_local_variable_access?(subtree[3])
53
- return :dag if subtree[2]
54
-
55
- if iter_impl
56
- return_node = iter_impl.find_tree{|st2| st2.node_type == :return}
57
-
58
- if return_node
59
- return :dag
60
- end
61
- end
62
- elsif subtree.node_type == :block_pass
63
- return :dag
64
- end
65
- end
66
-
67
- impl_tree.walk_tree do |subtree|
68
- graph.each_path_from(subtree) do |path|
69
- # verify path prohibitive for :linear scope (local variable read after call)
70
- has_call = false
71
- writes = Set.new
72
-
73
- path.each do |st2|
74
- next unless st2
75
- if st2.node_type == :call
76
- if has_call and st2[1] == nil
77
- return :dag
78
- end
79
-
80
- writes.clear
81
- has_call = true
82
- elsif st2.node_type == :iter
83
- if has_call and st2[1][1] == nil
84
- return :dag
85
- end
86
-
87
- writes.clear
88
- has_call = true
89
- elsif st2.node_type == :lasgn
90
- writes << st2[1] # record local writes
91
- elsif st2.node_type == :lvar or st2.node_type == :self or
92
- st2.node_type == :return or st2.node_type == :yield
93
-
94
- if has_call
95
- if st2.node_type == :lvar
96
- if writes.include? st2[1]
97
- # no problem
98
- else
99
- # read after call, the scope of this function must be implemented on heap
100
- return :dag
101
- end
102
- else
103
- return :dag
104
- end
105
- end
106
- end
107
- end
108
- end
109
- end
110
-
111
- :linear
112
- end
113
-
114
- private
115
- def has_local_variable_access?(*trees)
116
- trees.each do |tree|
117
- return false unless tree.kind_of? FastRuby::FastRubySexp
118
-
119
- tree.walk_tree do |subtree|
120
- if subtree.node_type == :lvar or
121
- subtree.node_type == :self or
122
- subtree.node_type == :yield or
123
- subtree.node_type == :return or
124
- subtree.node_type == :lasgn
125
- return true
126
- end
127
-
128
- if subtree.node_type == :call
129
- if subtree[1] == nil
130
- return true
131
- end
132
- end
133
- end
134
- end
135
- false
136
- end
137
- end
138
- end