fastruby 0.0.20 → 0.0.21

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 (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