fastruby 0.0.17 → 0.0.18

Sign up to get free protection for your applications and to get access to all the features.
Files changed (67) hide show
  1. data/CHANGELOG +10 -0
  2. data/Rakefile +4 -2
  3. data/benchmarks/benchmark.rb +20 -44
  4. data/benchmarks/benchmark.rb~ +47 -0
  5. data/benchmarks/benchmark2.rb +19 -45
  6. data/benchmarks/benchmark2.rb~ +46 -0
  7. data/benchmarks/benchmark3.rb +19 -45
  8. data/benchmarks/benchmark3.rb~ +46 -0
  9. data/benchmarks/benchmark4.rb +30 -65
  10. data/benchmarks/benchmark4.rb~ +61 -0
  11. data/benchmarks/benchmark5.rb +25 -55
  12. data/benchmarks/benchmark5.rb~ +54 -0
  13. data/benchmarks/benchmark6.rb +19 -40
  14. data/benchmarks/benchmark6.rb~ +41 -0
  15. data/benchmarks/benchmark7.rb +23 -52
  16. data/benchmarks/benchmark7.rb~ +48 -0
  17. data/ext/fastruby_base/fastruby_base.inl +1 -0
  18. data/lib/fastruby/builder.rb +128 -76
  19. data/lib/fastruby/cache/cache.rb +9 -5
  20. data/lib/fastruby/fastruby_sexp.rb +18 -0
  21. data/lib/fastruby/inliner/inliner.rb +68 -0
  22. data/lib/fastruby/inliner/modules/call.rb +150 -0
  23. data/lib/fastruby/inliner/modules/recursive.rb +35 -0
  24. data/lib/fastruby/object.rb +17 -32
  25. data/lib/fastruby/reductor/modules/case.rb +49 -0
  26. data/lib/{fastruby.rb~ → fastruby/reductor/modules/for.rb} +11 -13
  27. data/lib/fastruby/reductor/modules/nontree.rb +31 -0
  28. data/lib/fastruby/reductor/modules/recursive.rb +31 -0
  29. data/lib/fastruby/reductor/reductor.rb +39 -0
  30. data/lib/fastruby/set_tree.rb +7 -1
  31. data/lib/fastruby/sexp_extension.rb +6 -0
  32. data/lib/fastruby/translator/modules/block.rb +4 -4
  33. data/lib/fastruby/translator/modules/call.rb +9 -26
  34. data/lib/fastruby/translator/modules/defn.rb +5 -3
  35. data/lib/fastruby/translator/modules/directive.rb +42 -0
  36. data/lib/fastruby/translator/modules/exceptions.rb +12 -30
  37. data/lib/fastruby/translator/modules/flow.rb +33 -83
  38. data/lib/fastruby/translator/modules/iter.rb +4 -7
  39. data/lib/fastruby/translator/modules/literal.rb +11 -25
  40. data/lib/fastruby/translator/modules/logical.rb +5 -3
  41. data/lib/fastruby/translator/modules/method_group.rb +4 -3
  42. data/lib/fastruby/translator/modules/nonlocal.rb +7 -5
  43. data/lib/fastruby/translator/modules/static.rb +242 -0
  44. data/lib/fastruby/translator/modules/variable.rb +16 -9
  45. data/lib/fastruby/translator/scope_mode_helper.rb +2 -27
  46. data/lib/fastruby/translator/translator.rb +131 -60
  47. data/lib/fastruby/translator/translator_modules.rb +6 -2
  48. data/lib/fastruby.rb +1 -1
  49. data/spec/reductor/base_spec.rb +46 -0
  50. data/spec/ruby/base_spec.rb~ +394 -0
  51. data/spec/ruby/block/arguments_spec.rb~ +214 -0
  52. data/spec/ruby/block/proc_as_block_spec.rb~ +23 -0
  53. data/spec/ruby/block/retry_spec.rb~ +43 -0
  54. data/spec/ruby/block_spec.rb~ +520 -0
  55. data/spec/ruby/defn/replacement_spec.rb~ +102 -0
  56. data/spec/ruby/integrity_spec.rb~ +40 -0
  57. data/spec/ruby/singleton_spec.rb~ +76 -0
  58. data/spec/scope_mode/base_spec.rb +14 -5
  59. data/spec/scope_mode/block_spec.rb +18 -9
  60. data/spec/scope_mode/call_spec.rb +11 -2
  61. data/spec/scope_mode/exception_spec.rb +11 -2
  62. data/spec/scope_mode/flow_spec.rb +18 -8
  63. data/spec/scope_mode/optimization_spec.rb +21 -13
  64. data/spec/static/base_spec.rb +54 -0
  65. data/spec/static/flow_spec.rb +48 -0
  66. data/spec/static/operator_spec.rb +104 -0
  67. metadata +58 -8
@@ -41,12 +41,16 @@ module FastRuby
41
41
  end
42
42
 
43
43
  def insert(hash,path)
44
- create_hash_dir(hash)
45
- dest = hash_dir(hash)
46
- cp_r path, dest
44
+ unless ENV['FASTRUBY_NO_CACHE'] == '1'
45
+ create_hash_dir(hash)
46
+ dest = hash_dir(hash)
47
+ cp_r path, dest
48
+ end
47
49
  end
48
50
 
49
51
  def retrieve(hash)
52
+ return [] if ENV['FASTRUBY_NO_CACHE'] == '1'
53
+
50
54
  create_hash_dir(hash)
51
55
  dest = hash_dir(hash)
52
56
  Dir[dest + "*.so"]
@@ -57,10 +61,10 @@ module FastRuby
57
61
  @proc_hash[obj] = value
58
62
  end
59
63
 
60
- def execute(obj, param)
64
+ def execute(obj, *params)
61
65
  @proc_hash = Hash.new unless @proc_hash
62
66
  if @proc_hash[obj]
63
- @proc_hash[obj].call(param)
67
+ @proc_hash[obj].call(*params)
64
68
  end
65
69
  end
66
70
  private
@@ -22,6 +22,24 @@ module FastRuby
22
22
  class FastRubySexp < Array
23
23
  alias node_type first
24
24
 
25
+ def duplicate
26
+ map { |subtree|
27
+ if subtree.respond_to?(:node_type)
28
+ subtree.duplicate
29
+ else
30
+ subtree
31
+ end
32
+ }
33
+ end
34
+
35
+ def map
36
+ sexp = FastRubySexp.new
37
+ self.each do |subtree|
38
+ sexp << yield(subtree)
39
+ end
40
+ sexp
41
+ end
42
+
25
43
  def walk_tree(&block)
26
44
  each do |subtree|
27
45
  if subtree.instance_of? FastRubySexp
@@ -0,0 +1,68 @@
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 "set"
22
+ require "sexp"
23
+ require "define_method_handler"
24
+
25
+ module FastRuby
26
+ class Inliner
27
+ attr_accessor :infer_lvar_map
28
+ attr_accessor :infer_self
29
+ attr_reader :extra_locals
30
+ attr_reader :extra_inferences
31
+ attr_reader :inlined_methods
32
+
33
+ def initialize
34
+ @extra_locals = Set.new
35
+ @extra_inferences = Hash.new
36
+ @inlined_methods = Array.new
37
+ end
38
+
39
+ define_method_handler(:inline, :priority => -1000) do |tree|
40
+ FastRubySexp.from_sexp(tree)
41
+ end
42
+
43
+ Dir.glob(FastRuby.fastruby_load_path + "/fastruby/inliner/modules/**/*.rb").each do |path|
44
+ require path
45
+ end
46
+
47
+ def add_local(local)
48
+ @extra_locals << local
49
+ end
50
+
51
+ def infer_type(recv)
52
+ if recv[0] == :call
53
+ if recv[2] == :infer
54
+ eval(recv[3].last.last.to_s)
55
+ end
56
+ elsif recv[0] == :lvar
57
+ @infer_lvar_map[recv[1]]
58
+ elsif recv[0] == :self
59
+ @infer_self
60
+ elsif recv[0] == :str or recv[0] == :lit
61
+ recv[1].class
62
+ else
63
+ nil
64
+ end
65
+ end
66
+
67
+ end
68
+ end
@@ -0,0 +1,150 @@
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 "set"
22
+ require "sexp"
23
+ require "define_method_handler"
24
+
25
+ module FastRuby
26
+ class Inliner
27
+ def inline_local_name(method_name, local_name)
28
+ "__inlined_#{method_name}_#{local_name}".to_sym
29
+ end
30
+
31
+ define_method_handler(:inline) { |tree|
32
+ ret_tree = fs(:iter)
33
+ ret_tree << tree[1].duplicate
34
+
35
+ tree[2..-1].each do |subtree|
36
+ ret_tree << inline(subtree)
37
+ end
38
+
39
+ ret_tree
40
+
41
+ }.condition{|tree| tree.node_type == :iter}
42
+
43
+ define_method_handler(:inline) { |tree|
44
+
45
+ next tree if tree.find_tree(:block_pass)
46
+
47
+ recv_tree = tree[1] || fs(:self)
48
+ method_name = tree[2]
49
+ args_tree = tree[3]
50
+
51
+ if method_name == :lvar_type
52
+ lvar_name = args_tree[1][1] || args_tree[1][2]
53
+ lvar_type = eval(args_tree[2][1].to_s)
54
+
55
+ @infer_lvar_map[lvar_name] = lvar_type
56
+ next tree
57
+ end
58
+
59
+ recvtype = infer_type(recv_tree)
60
+
61
+ if recvtype
62
+ # search the tree of target method
63
+ next tree unless recvtype.respond_to?(:fastruby_method)
64
+
65
+ mobject = recvtype.fastruby_method(method_name)
66
+
67
+ next tree unless mobject
68
+
69
+ target_method_tree = mobject.tree
70
+
71
+ next tree unless target_method_tree
72
+ next tree if target_method_tree.find_tree(:iter)
73
+ target_method_tree_args = target_method_tree[2]
74
+
75
+ next tree if target_method_tree_args.find{|subtree| subtree.to_s =~ /^\*/}
76
+
77
+
78
+ target_method_tree_block = target_method_tree.find_tree(:scope)[1].duplicate
79
+
80
+ target_method_tree_block.walk_tree do |subtree|
81
+ if subtree.node_type == :lvar or subtree.node_type == :lasgn
82
+ subtree[1] = inline_local_name(method_name, subtree[1])
83
+ add_local subtree[1]
84
+ end
85
+ end
86
+
87
+ newblock = fs(:block)
88
+
89
+ (1..args_tree.size-1).each do |i|
90
+ itype = infer_type(args_tree[i])
91
+ inlined_name = inline_local_name(method_name, target_method_tree_args[i])
92
+
93
+ add_local inlined_name
94
+
95
+ self.extra_inferences[inlined_name] = itype if itype
96
+ newblock << fs(:lasgn, inlined_name, args_tree[i].duplicate)
97
+ end
98
+
99
+ inlined_name = inline_local_name(method_name, :self)
100
+ add_local inlined_name
101
+ newblock << fs(:lasgn, inlined_name, recv_tree.duplicate)
102
+
103
+ target_method_tree_block.walk_tree do |subtree|
104
+ if subtree.node_type == :call
105
+ if subtree[1] == nil
106
+ if subtree[2] == :block_given?
107
+ subtree[0..-1] = fs(:false)
108
+ else
109
+ subtree[1] = recv_tree.duplicate
110
+ end
111
+ end
112
+ end
113
+ if subtree.node_type == :self
114
+ subtree[0] = :lvar
115
+ subtree[1] = inline_local_name(method_name, :self)
116
+ end
117
+ end
118
+
119
+ (1..target_method_tree_block.size-1).each do |i|
120
+ subtree = target_method_tree_block[i]
121
+
122
+ if subtree.find_tree(:return)
123
+ if i == target_method_tree_block.size-1
124
+ if subtree.node_type == :return
125
+ if subtree[1]
126
+ if subtree[1].find_tree(:return)
127
+ next tree
128
+ end
129
+ end
130
+
131
+ subtree[0..-1] = subtree[1]
132
+ end
133
+ else
134
+ # methods with return cannot be inlined
135
+ next tree
136
+ end
137
+ end
138
+
139
+ newblock << subtree
140
+ end
141
+
142
+ @inlined_methods << mobject
143
+ newblock
144
+ else
145
+ # nothing to do, we don't know what is the method
146
+ tree
147
+ end
148
+ }.condition{|tree| tree.node_type == :call}
149
+ end
150
+ end
@@ -0,0 +1,35 @@
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 "set"
22
+ require "sexp"
23
+ require "define_method_handler"
24
+
25
+ module FastRuby
26
+ class Inliner
27
+ define_method_handler(:inline, :priority => -100) {|tree|
28
+ tree.map &method(:inline)
29
+ }.condition{|tree| tree.respond_to?(:node_type)}
30
+
31
+ define_method_handler(:inline, :priority => 1000) {|tree|
32
+ tree
33
+ }.condition{|tree| not tree.respond_to?(:node_type)}
34
+ end
35
+ end
@@ -23,12 +23,22 @@ require "fastruby/getlocals"
23
23
  require "fastruby/method_extension"
24
24
  require "fastruby/cache/cache"
25
25
  require "fastruby"
26
+ require "digest"
27
+ require "method_source"
26
28
 
27
29
  # clean rubyinline cache
28
30
  system("rm -fr #{ENV["HOME"]}/.ruby_inline/*")
29
31
 
30
32
  $top_level_binding = binding
31
33
 
34
+ def lvar_type(*x); end
35
+
36
+ class Class
37
+ def optimize(method_name)
38
+ fastruby instance_method(method_name).source
39
+ end
40
+ end
41
+
32
42
  module FastRuby
33
43
  def self.encapsulate_tree(tree, method_name)
34
44
  generated_tree = tree
@@ -49,22 +59,14 @@ module FastRuby
49
59
  end
50
60
 
51
61
  class Object
62
+
63
+ def infer(a); self; end
52
64
  def fastruby(argument, *options_hashes)
53
65
  options_hash = {:validate_lvar_types => true}
54
- options_hash[:no_cache] = true if ENV['FASTRUBY_NO_CACHE'] == "1"
55
66
  options_hashes.each do |opt|
56
67
  options_hash.merge!(opt)
57
68
  end
58
-
59
- objs = Array.new
60
-
61
- unless options_hash[:no_cache]
62
- snippet_hash = FastRuby.cache.hash_snippet(argument,options_hash[:validate_lvar_types].to_s + "^" + FastRuby::VERSION)
63
- objs = FastRuby.cache.retrieve(snippet_hash)
64
- end
65
-
66
- if objs.empty?
67
-
69
+
68
70
  tree = nil
69
71
 
70
72
  require "fastruby/fastruby_sexp"
@@ -80,27 +82,10 @@ class Object
80
82
  end
81
83
 
82
84
  return unless tree
83
- method_name = "_anonymous_" + rand(100000000000).to_s
84
- Object.execute_tree(FastRuby.encapsulate_tree(tree,method_name), {:main => method_name, :self => self, :snippet_hash => snippet_hash}.merge(options_hash))
85
-
86
- else
87
-
88
- objs.sort{|x,y|
89
- File.new(x).ctime <=> File.new(y).ctime
90
- }.each do |obj|
91
-
92
- begin
93
- $last_obj_proc = nil
94
- require obj
95
- if $last_obj_proc
96
- FastRuby.cache.register_proc(obj, $last_obj_proc)
97
- end
98
- FastRuby.cache.execute(obj, self.kind_of?(Class) ? self : Object)
99
- rescue Exception => e
100
- p e
101
- end
102
- end
103
- end
85
+ method_name = "_anonymous_" + Digest::SHA1.hexdigest(tree.inspect)
86
+ Object.execute_tree(FastRuby.encapsulate_tree(tree,method_name), {:main => method_name, :self => self}.merge(options_hash))
87
+
88
+
104
89
  end
105
90
 
106
91
  def self.execute_tree(tree,*options_hashes)
@@ -0,0 +1,49 @@
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 "set"
22
+ require "sexp"
23
+ require "define_method_handler"
24
+
25
+ module FastRuby
26
+ class Reductor
27
+ def when_array_to_if(array, temporal_var_name)
28
+ if array.size == 1
29
+ array[0] || fs(:nil)
30
+ else
31
+ first_when_tree = array[0]
32
+ comparers = first_when_tree[1][1..-1]
33
+
34
+ condition_tree = fs(:or)
35
+ comparers.each do |st|
36
+ condition_tree << fs(:call, st, :===, fs(:arglist, fs(:lvar, temporal_var_name)))
37
+ end
38
+
39
+ fs(:if, condition_tree, first_when_tree[2], when_array_to_if(array[1..-1], temporal_var_name) )
40
+ end
41
+ end
42
+
43
+ reduce_for(:case) do |tree|
44
+ temporal_var_name = "temporal_case_var_#{rand(1000000000)}".to_sym
45
+ ifs = when_array_to_if(tree[2..-1], temporal_var_name)
46
+ fs(:block, fs(:lasgn, temporal_var_name, tree[1]), ifs)
47
+ end
48
+ end
49
+ end
@@ -18,19 +18,17 @@ you should have received a copy of the gnu general public license
18
18
  along with fastruby. if not, see <http://www.gnu.org/licenses/>.
19
19
 
20
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
21
+ require "set"
22
+ require "sexp"
23
+ require "define_method_handler"
33
24
 
34
25
  module FastRuby
35
- VERSION = "0.0.16" unless defined? FastRuby::VERSION
26
+ class Reductor
27
+ reduce_for(:for) do |tree|
28
+ alter_tree = tree.dup
29
+ alter_tree[0] = :iter
30
+ alter_tree[1] = fs(:call, alter_tree[1], :each, fs(:arglist))
31
+ alter_tree
32
+ end
33
+ end
36
34
  end
@@ -0,0 +1,31 @@
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 "set"
22
+ require "sexp"
23
+ require "define_method_handler"
24
+
25
+ module FastRuby
26
+ class Reductor
27
+ define_method_handler(:reduce, :priority => -100) {|tree|
28
+ tree
29
+ }.condition{|tree| not tree.respond_to?(:node_type)}
30
+ end
31
+ end
@@ -0,0 +1,31 @@
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 "set"
22
+ require "sexp"
23
+ require "define_method_handler"
24
+
25
+ module FastRuby
26
+ class Reductor
27
+ define_method_handler(:reduce, :priority => -100) {|tree|
28
+ tree.map &method(:reduce)
29
+ }.condition{|tree| tree.respond_to?(:node_type)}
30
+ end
31
+ end
@@ -0,0 +1,39 @@
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 "set"
22
+ require "sexp"
23
+ require "define_method_handler"
24
+
25
+ module FastRuby
26
+ class Reductor
27
+ def self.reduce_for(ntype, options = {}, &blk)
28
+ define_method_handler(:reduce, options, &blk).condition{|tree| tree.respond_to?(:node_type) && tree.node_type == ntype}
29
+ end
30
+
31
+ define_method_handler(:reduce, :priority => -1000) do |tree|
32
+ FastRubySexp.from_sexp(tree)
33
+ end
34
+
35
+ Dir.glob(FastRuby.fastruby_load_path + "/fastruby/reductor/modules/**/*.rb").each do |path|
36
+ require path
37
+ end
38
+ end
39
+ end
@@ -21,6 +21,7 @@ along with fastruby. if not, see <http://www.gnu.org/licenses/>.
21
21
  require "fastruby/builder"
22
22
  require "fastruby/getlocals"
23
23
  require "fastruby/method_extension"
24
+ require "fastruby/reductor/reductor"
24
25
 
25
26
  module FastRuby
26
27
 
@@ -39,13 +40,16 @@ module FastRuby
39
40
  def self.unset_tree(klass, method_name)
40
41
  fastrubym = klass.fastruby_method(method_name)
41
42
  fastrubym.tree = nil
43
+ fastrubym.tree_changed
42
44
  nil
43
45
  end
44
46
 
45
47
  def self.set_tree(klass, method_name, tree, snippet_hash, options = {})
46
48
  locals = Set.new
47
49
  locals << :self
48
-
50
+
51
+ tree = Reductor.new.reduce tree
52
+
49
53
  FastRuby::GetLocalsProcessor.get_locals(tree).each do |local|
50
54
  locals << local
51
55
  end
@@ -57,10 +61,12 @@ module FastRuby
57
61
  end
58
62
 
59
63
  fastrubym = klass.fastruby_method(method_name)
64
+
60
65
  fastrubym.tree = tree
61
66
  fastrubym.locals = locals
62
67
  fastrubym.options = options
63
68
  fastrubym.snippet_hash = snippet_hash
69
+ fastrubym.tree_changed
64
70
 
65
71
  nil
66
72
  end
@@ -29,6 +29,12 @@ class Object
29
29
  end
30
30
  end
31
31
 
32
+ def fs(*args)
33
+ sexp = FastRuby::FastRubySexp.new
34
+ args.each &sexp.method(:<<)
35
+ sexp
36
+ end
37
+
32
38
  module FastRuby
33
39
  class Graph
34
40
  attr_reader :edges
@@ -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
- module BlockTranslator
23
-
24
- register_translator_module self
25
-
22
+ class Context
23
+
24
+ define_translator_for(:yield, :method => :to_c_yield, :arity => 1)
26
25
  def to_c_yield(tree)
27
26
 
28
27
  block_code = proc { |name| "
@@ -94,6 +93,7 @@ module FastRuby
94
93
  protected_block(ret, false)
95
94
  end
96
95
 
96
+ define_translator_for(:block, :method => :to_c_block)
97
97
  def to_c_block(tree, result_variable = nil)
98
98
  if tree.size == 1
99
99
  return inline_block("return Qnil;")