fastruby 0.0.19 → 0.0.20

Sign up to get free protection for your applications and to get access to all the features.
Files changed (121) hide show
  1. data/CHANGELOG +8 -0
  2. data/{README → README.rdoc} +6 -1
  3. data/Rakefile +7 -7
  4. data/benchmarks/benchmark.rb~ +14 -2
  5. data/ext/fastruby_base/fastruby_base.inl +8 -4
  6. data/lib/fastruby/builder/inference_updater.rb +76 -0
  7. data/lib/fastruby/builder/inference_updater.rb~ +76 -0
  8. data/lib/fastruby/builder/inferencer.rb +38 -0
  9. data/lib/fastruby/{inliner → builder}/inliner.rb +16 -27
  10. data/lib/fastruby/builder/inliner.rb~ +60 -0
  11. data/lib/fastruby/builder/locals_inference.rb +53 -0
  12. data/lib/fastruby/builder/lvar_type.rb +43 -0
  13. data/lib/fastruby/builder/lvar_type.rb~ +44 -0
  14. data/lib/fastruby/builder/pipeline.rb +43 -0
  15. data/lib/fastruby/builder/pipeline.rb~ +43 -0
  16. data/lib/fastruby/{reductor → builder}/reductor.rb +6 -3
  17. data/lib/fastruby/builder/reductor.rb~ +42 -0
  18. data/lib/fastruby/builder.rb +73 -25
  19. data/lib/fastruby/builder.rb~ +311 -0
  20. data/lib/fastruby/corelib/fixnum.rb +75 -0
  21. data/lib/fastruby/corelib/fixnum.rb~ +146 -0
  22. data/lib/fastruby/corelib/integer.rb +96 -0
  23. data/lib/fastruby/corelib/integer.rb~ +96 -0
  24. data/lib/fastruby/corelib.rb +23 -0
  25. data/lib/fastruby/corelib.rb~ +23 -0
  26. data/lib/fastruby/getlocals.rb +3 -1
  27. data/lib/fastruby/logging.rb +2 -2
  28. data/lib/fastruby/modules/inferencer/infer.rb +31 -0
  29. data/lib/fastruby/modules/inferencer/literal.rb +42 -0
  30. data/lib/fastruby/modules/inliner/call.rb +327 -0
  31. data/lib/fastruby/{inliner/modules/call.rb → modules/inliner/call.rb~} +14 -24
  32. data/lib/fastruby/modules/inliner/defn.rb +41 -0
  33. data/lib/fastruby/modules/inliner/defn.rb~ +29 -0
  34. data/lib/fastruby/modules/inliner/recursive.rb +40 -0
  35. data/lib/fastruby/{inliner/modules/recursive.rb → modules/inliner/recursive.rb~} +1 -1
  36. data/lib/fastruby/modules/lvar_type/call.rb +36 -0
  37. data/lib/fastruby/modules/lvar_type/call.rb~ +36 -0
  38. data/lib/fastruby/modules/lvar_type/defn.rb +42 -0
  39. data/lib/fastruby/modules/lvar_type/defn.rb~ +42 -0
  40. data/lib/fastruby/modules/lvar_type/lasgn.rb +41 -0
  41. data/lib/fastruby/modules/lvar_type/lasgn.rb~ +42 -0
  42. data/lib/fastruby/modules/lvar_type/recursive.rb +33 -0
  43. data/lib/fastruby/modules/lvar_type/recursive.rb~ +33 -0
  44. data/lib/fastruby/{reductor/modules → modules/reductor}/case.rb +0 -0
  45. data/lib/fastruby/modules/reductor/fastruby_flag.rb +33 -0
  46. data/lib/fastruby/{reductor/modules → modules/reductor}/for.rb +0 -0
  47. data/lib/fastruby/{reductor/modules → modules/reductor}/nontree.rb +0 -0
  48. data/lib/fastruby/modules/reductor/nontree.rb~ +32 -0
  49. data/lib/fastruby/{reductor/modules → modules/reductor}/recursive.rb +1 -1
  50. data/lib/fastruby/modules/reductor/recursive.rb~ +31 -0
  51. data/lib/fastruby/{translator/modules → modules/translator}/block.rb +0 -0
  52. data/lib/fastruby/modules/translator/call.rb +344 -0
  53. data/lib/fastruby/{translator/modules/call.rb → modules/translator/call.rb~} +24 -3
  54. data/lib/fastruby/{translator/modules → modules/translator}/defn.rb +10 -9
  55. data/lib/fastruby/modules/translator/defn.rb~ +267 -0
  56. data/lib/fastruby/{translator/modules → modules/translator}/directive.rb +3 -1
  57. data/lib/fastruby/modules/translator/directive.rb~ +44 -0
  58. data/lib/fastruby/{translator/modules → modules/translator}/exceptions.rb +3 -1
  59. data/lib/fastruby/modules/translator/exceptions.rb~ +120 -0
  60. data/lib/fastruby/{translator/modules → modules/translator}/flow.rb +0 -0
  61. data/lib/fastruby/modules/translator/iter.rb +745 -0
  62. data/lib/fastruby/{translator/modules/iter.rb → modules/translator/iter.rb~} +103 -48
  63. data/lib/fastruby/modules/translator/literal.rb +150 -0
  64. data/lib/fastruby/{translator/modules/literal.rb → modules/translator/literal.rb~} +3 -3
  65. data/lib/fastruby/{translator/modules → modules/translator}/logical.rb +0 -0
  66. data/lib/fastruby/{translator/modules → modules/translator}/method_group.rb +0 -0
  67. data/lib/fastruby/{translator/modules → modules/translator}/nonlocal.rb +18 -6
  68. data/lib/fastruby/modules/translator/nonlocal.rb~ +298 -0
  69. data/lib/fastruby/modules/translator/static.rb +290 -0
  70. data/lib/fastruby/{translator/modules/static.rb → modules/translator/static.rb~} +66 -17
  71. data/lib/fastruby/modules/translator/variable.rb +280 -0
  72. data/lib/fastruby/{translator/modules/variable.rb → modules/translator/variable.rb~} +14 -44
  73. data/lib/fastruby/modules.rb +30 -0
  74. data/lib/fastruby/object.rb +42 -6
  75. data/lib/fastruby/object.rb~ +159 -0
  76. data/lib/fastruby/set_tree.rb +7 -11
  77. data/lib/fastruby/set_tree.rb~ +71 -0
  78. data/lib/fastruby/sexp_extension.rb +29 -7
  79. data/lib/fastruby/sexp_extension.rb~ +262 -0
  80. data/lib/fastruby/translator/scope_mode_helper.rb~ +138 -0
  81. data/lib/fastruby/translator/translator.rb +87 -92
  82. data/lib/fastruby/translator/translator.rb~ +1600 -0
  83. data/lib/fastruby/translator/translator_modules.rb +3 -1
  84. data/lib/fastruby/translator/translator_modules.rb~ +53 -0
  85. data/lib/fastruby.rb +3 -1
  86. data/lib/fastruby.rb~ +3 -1
  87. data/lib/fastruby_only/base.rb +1 -0
  88. data/spec/corelib/numeric/fixnum_spec.rb +110 -0
  89. data/spec/corelib/numeric/fixnum_spec.rb~ +104 -0
  90. data/spec/corelib/numeric/integer_spec.rb +173 -0
  91. data/spec/corelib/numeric/integer_spec.rb~ +173 -0
  92. data/spec/fastruby_only/base_spec.rb +74 -0
  93. data/spec/graph/base_spec.rb +2 -1
  94. data/spec/graph/base_spec.rb~ +35 -0
  95. data/spec/graph/path_spec.rb +2 -2
  96. data/spec/graph/path_spec.rb~ +48 -0
  97. data/spec/graph/vertex_spec.rb +2 -1
  98. data/spec/graph/vertex_spec.rb~ +58 -0
  99. data/spec/reductor/base_spec.rb +1 -1
  100. data/spec/ruby/block/lambda_spec.rb~ +163 -0
  101. data/spec/ruby/block/proc_as_block_spec.rb~ +69 -1
  102. data/spec/ruby/block_spec.rb~ +2 -494
  103. data/spec/ruby/call/base_call_spec.rb +1 -1
  104. data/spec/ruby/call/base_call_spec.rb~ +2 -60
  105. data/spec/ruby/defn/replacement_spec.rb +26 -14
  106. data/spec/ruby/defn/replacement_spec.rb~ +13 -3
  107. data/spec/ruby/exception/internal_ex_spec.rb~ +86 -0
  108. data/spec/ruby/integrity_spec.rb~ +35 -1
  109. data/spec/ruby/variable_spec.rb~ +31 -0
  110. data/spec/scope_mode/flow_spec.rb +1 -1
  111. data/spec/scope_mode/flow_spec.rb~ +109 -0
  112. data/spec/sugar/base_spec.rb +29 -0
  113. data/spec/sugar/base_spec.rb~ +16 -0
  114. metadata +100 -43
  115. data/spec/fastruby/inliner/modules/call_spec.rb +0 -0
  116. data/spec/fastruby/translator/modules/nonlocal_spec.rb +0 -0
  117. data/spec/fastruby/translator/translator_spec.rb +0 -0
  118. data/spec/ruby/block/arguments_spec.rb~ +0 -214
  119. data/spec/ruby/block/break_spec.rb~ +0 -236
  120. data/spec/ruby/block/next_spec.rb~ +0 -85
  121. data/spec/ruby/block/retry_spec.rb~ +0 -43
@@ -23,8 +23,8 @@ module FastRuby
23
23
  define_translator_for(:iter, :arity => 1, :priority => 1) { |*x|
24
24
  ret = nil
25
25
  tree = x.first
26
-
27
26
  enable_handler_group(:static_call) do
27
+ require "pry"; binding.pry
28
28
  ret = x.size == 1 ? to_c(tree[3]) : to_c(tree[3], x.last)
29
29
  end
30
30
  ret
@@ -47,20 +47,47 @@ module FastRuby
47
47
  }
48
48
 
49
49
  handler_scope(:group => :static_call, :priority => 1000) do
50
- define_translator_for(:call) do |tree, result=nil|
50
+ define_translator_for(:call) do |*x|
51
+ tree, result = x
52
+
51
53
  method_name = tree[2].to_s
52
54
  recv_tree = tree[1]
53
55
 
54
- if recv_tree
56
+ if method_name == "c_address_of"
57
+ arg = tree[3][1]
58
+ return "&"+to_c(arg)
59
+ end
60
+
61
+ if method_name == "inline_c"
62
+ arg = tree[3][1]
63
+
64
+ if arg.node_type != :str
65
+ raise RuntimeError, "invalid node for inline_c directive #{arg}"
66
+ end
67
+
68
+ next arg[1]
69
+ end
70
+
71
+ if recv_tree and recv_tree.node_type != :self
55
72
  if (not tree[2].to_s =~ /^[a-zA-Z]/) and tree[2].to_s.size <= 3
56
73
  c_op = tree[2].to_s
57
74
  c_op = '==' if tree[2] == :===
58
75
  code = "( ( #{to_c(tree[1])} )#{c_op}(#{to_c(tree[3][1])}) )"
76
+ elsif tree[2] == :_invariant
77
+ name = self.add_global_name("VALUE", "Qnil");
78
+
79
+ init_extra << "
80
+ #{name} = #{to_c tree[1]};
81
+ rb_funcall(#{name},#{intern_num :gc_register_object},0);
82
+ "
83
+
84
+ code = name;
59
85
  else
60
- raise "invalid static call #{method_name}"
86
+ args = tree[3][1..-1].map{|st| to_c(st)}.join(",")
87
+ code = "#{method_name}( #{args} )"
61
88
  end
62
89
  else
63
- args = tree[3][1..-1].map(&method(:to_c)).join(",")
90
+ args = tree[3][1..-1].map{|st| to_c(st)}.join(",")
64
91
  code = "#{method_name}( #{args} )"
65
92
  end
66
93
 
@@ -71,7 +98,9 @@ module FastRuby
71
98
  end
72
99
  end
73
100
 
74
- define_translator_for(:lit) do |tree, result=nil|
101
+ define_translator_for(:lit) do |*x|
102
+ tree, result = x
103
+
75
104
  if result
76
105
  "#{result} = #{tree[1]};"
77
106
  else
@@ -79,7 +108,9 @@ module FastRuby
79
108
  end
80
109
  end
81
110
 
82
- define_translator_for(:if) do |tree, result_variable_ = nil|
111
+ define_translator_for(:if) do |*x|
112
+ tree, result_variable_ = x
113
+
83
114
  condition_tree = tree[1]
84
115
  impl_tree = tree[2]
85
116
  else_tree = tree[3]
@@ -108,7 +139,19 @@ module FastRuby
108
139
  end
109
140
  end
110
141
 
111
- define_translator_for(:while) do |tree, result_var = nil|
142
+ define_translator_for(:const) do |*x|
143
+ tree, result_var = x
144
+
145
+ if result_var
146
+ "#{result_var} = #{tree[1].to_s};"
147
+ else
148
+ "#{tree[1].to_s}"
149
+ end
150
+ end
151
+
152
+ define_translator_for(:while) do |*x|
153
+ tree, result_var = x
154
+
112
155
  begin_while = "begin_while_"+rand(10000000).to_s
113
156
  end_while = "end_while_"+rand(10000000).to_s
114
157
  aux_varname = "_aux_" + rand(10000000).to_s
@@ -142,7 +185,9 @@ module FastRuby
142
185
 
143
186
  end
144
187
 
145
- define_translator_for(:and) do |tree, return_var = nil|
188
+ define_translator_for(:and) do |*x|
189
+ tree, return_var = x
190
+
146
191
  if return_var
147
192
  "
148
193
  {
@@ -159,7 +204,9 @@ module FastRuby
159
204
 
160
205
  end
161
206
 
162
- define_translator_for(:or) do |tree, return_var = nil|
207
+ define_translator_for(:or) do |*x|
208
+ tree, return_var = x
209
+
163
210
  if return_var
164
211
  "
165
212
  {
@@ -176,7 +223,9 @@ module FastRuby
176
223
 
177
224
  end
178
225
 
179
- define_translator_for(:not) do |tree, return_var = nil|
226
+ define_translator_for(:not) do |*x|
227
+ tree, return_var = x
228
+
180
229
  if return_var
181
230
  "
182
231
  {
@@ -197,11 +246,11 @@ module FastRuby
197
246
  end
198
247
 
199
248
 
200
- define_method_handler(:infer_value) { |tree|
249
+ define_method_handler(:infer_value) { |*x| tree = x.first;
201
250
  Value.new(eval(tree[1].to_s))
202
- }.condition{|tree| tree.node_type == :const}
251
+ }.condition{|*x| tree = x.first; tree.node_type == :const}
203
252
 
204
- define_method_handler(:infer_value) { |tree|
253
+ define_method_handler(:infer_value) { |*x| tree = x.first;
205
254
  args_tree = tree[3]
206
255
  receiver_tree = tree[1]
207
256
 
@@ -211,7 +260,7 @@ module FastRuby
211
260
  next false unless (value_1 and value_2)
212
261
 
213
262
  Value.new(value_1.value == value_2.value)
214
- }.condition{|tree|
263
+ }.condition{|*x| tree = x.first;
215
264
  next false unless tree.node_type == :call
216
265
 
217
266
  args_tree = tree[3]
@@ -222,7 +271,7 @@ module FastRuby
222
271
 
223
272
  true
224
273
  }
225
- define_method_handler(:infer_value) { |tree|
274
+ define_method_handler(:infer_value) { |*x| tree = x.first;
226
275
  args_tree = tree[3]
227
276
  receiver_tree = tree[1]
228
277
  infered_type = infer_type(receiver_tree)
@@ -232,7 +281,7 @@ module FastRuby
232
281
  else
233
282
  nil
234
283
  end
235
- }.condition{|tree|
284
+ }.condition{|*x| tree = x.first;
236
285
  next false unless tree.node_type == :call
237
286
  method_name = tree[2]
238
287
  next false unless method_name == :_class
@@ -0,0 +1,280 @@
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
+ module FastRuby
22
+ class Context
23
+ define_translator_for(:cvar, :method => :to_c_cvar, :arity => 1)
24
+ def to_c_cvar(tree)
25
+ "rb_cvar_get(CLASS_OF(plocals->self) != rb_cClass ? CLASS_OF(plocals->self) : plocals->self,#{intern_num tree[1]})"
26
+ end
27
+
28
+ define_translator_for(:cvasgn, :method => :to_c_cvasgn)
29
+ def to_c_cvasgn(tree, result_var = nil)
30
+ if result_var
31
+ "
32
+ {
33
+ VALUE recv = CLASS_OF(plocals->self) != rb_cClass ? CLASS_OF(plocals->self) : plocals->self;
34
+
35
+ #{to_c tree[2], result_var};
36
+
37
+ #{if RUBY_VERSION =~ /^1\.9/
38
+ "rb_cvar_set(recv,#{intern_num tree[1]},#{result_var});"
39
+ elsif RUBY_VERSION =~ /^1\.8/
40
+ "rb_cvar_set(recv,#{intern_num tree[1]},#{result_var},Qfalse);"
41
+ else
42
+ raise RuntimeError, "unsupported ruby version #{RUBY_VERSION}"
43
+ end
44
+ }
45
+ }
46
+ "
47
+ else
48
+ "__rb_cvar_set(CLASS_OF(plocals->self) != rb_cClass ? CLASS_OF(plocals->self) : plocals->self,#{intern_num tree[1]},#{to_c tree[2]},Qfalse)"
49
+ end
50
+ end
51
+
52
+ define_translator_for(:gvar, :method => :to_c_gvar, :arity => 1)
53
+ def to_c_gvar(tree)
54
+ if (tree[1] == :$!)
55
+ "pframe->thread_data->exception"
56
+ else
57
+ "rb_gvar_get((struct global_entry*)#{global_entry(tree[1])})"
58
+ end
59
+ end
60
+
61
+ define_translator_for(:gasgn, :method => :to_c_gasgn)
62
+ def to_c_gasgn(tree, result_var = nil)
63
+ if result_var
64
+ "
65
+ {
66
+ #{to_c tree[2], result_var};
67
+ rb_gvar_set((void*)#{global_entry(tree[1])},#{result_var});
68
+ }
69
+ "
70
+ else
71
+ "_rb_gvar_set((void*)#{global_entry(tree[1])}, #{to_c tree[2]})"
72
+ end
73
+ end
74
+
75
+ define_translator_for(:ivar, :method => :to_c_ivar, :arity => 1)
76
+ def to_c_ivar(tree)
77
+ "rb_ivar_get(#{locals_accessor}self,#{intern_num tree[1]})"
78
+ end
79
+
80
+ define_translator_for(:iasgn, :method => :to_c_iasgn)
81
+ def to_c_iasgn(tree, result_var = nil)
82
+ if result_var
83
+ "
84
+ {
85
+ #{to_c tree[2], result_var};
86
+ rb_ivar_set(#{locals_accessor}self,#{intern_num tree[1]},#{result_var});
87
+ }
88
+ "
89
+ else
90
+ "_rb_ivar_set(#{locals_accessor}self,#{intern_num tree[1]},#{to_c tree[2]})"
91
+ end
92
+ end
93
+
94
+ define_translator_for(:const, :arity => 1) do |*x| tree = x.first;
95
+ "rb_const_get(CLASS_OF(plocals->self), #{intern_num(tree[1])})"
96
+ end
97
+
98
+ define_translator_for(:cdecl, :method => :to_c_cdecl)
99
+ def to_c_cdecl(tree, result_var_ = nil)
100
+
101
+ result_var = result_var_ || "value"
102
+
103
+ if tree[1].instance_of? Symbol
104
+ code = proc{"
105
+ {
106
+ // set constant #{tree[1].to_s}
107
+ #{to_c tree[2], result_var};
108
+ rb_const_set(rb_cObject, #{intern_num tree[1]}, #{result_var});
109
+ }
110
+ "}
111
+ elsif tree[1].instance_of? FastRuby::FastRubySexp
112
+
113
+ if tree[1].node_type == :colon2
114
+ code = proc{"
115
+ {
116
+ // set constant #{tree[1].to_s}
117
+ #{to_c tree[2], result_var};
118
+ VALUE klass = Qnil;
119
+ #{to_c tree[1][1], "klass"};
120
+ rb_const_set(klass, #{intern_num tree[1][2]}, #{result_var});
121
+ }
122
+ "}
123
+ elsif tree[1].node_type == :colon3
124
+ code = proc{"
125
+ {
126
+ // set constant #{tree[1].to_s}
127
+ #{to_c tree[2], result_var};
128
+ rb_const_set(rb_cObject, #{intern_num tree[1][1]}, #{result_var});
129
+ }
130
+ "}
131
+ end
132
+ end
133
+
134
+ if result_var_
135
+ code.call
136
+ else
137
+ inline_block{"VALUE #{result_var} = Qnil;\n" + code.call + "
138
+ return #{result_var};
139
+ "}
140
+ end
141
+ end
142
+
143
+ define_translator_for(:colon3, :method => :to_c_colon3, :arity => 1)
144
+ def to_c_colon3(tree)
145
+ "rb_const_get_from(rb_cObject, #{intern_num tree[1]})"
146
+ end
147
+
148
+ define_translator_for(:colon2, :method => :to_c_colon2)
149
+ def to_c_colon2(tree, result_var = nil)
150
+ code = proc{ "
151
+ {
152
+ VALUE klass = Qnil;
153
+
154
+ #{to_c tree[1],"klass"};
155
+ #{
156
+ if result_var
157
+ "#{result_var} = Qnil;"
158
+ end
159
+ }
160
+
161
+ if (rb_is_const_id(#{intern_num tree[2]})) {
162
+ switch (TYPE(klass)) {
163
+ case T_CLASS:
164
+ case T_MODULE:
165
+ #{
166
+ if result_var
167
+ "#{result_var} = rb_const_get_from(klass, #{intern_num tree[2]});"
168
+ else
169
+ "return rb_const_get_from(klass, #{intern_num tree[2]});"
170
+ end
171
+ }
172
+ break;
173
+ default:
174
+ #{_raise("rb_eTypeError","not a class/module")};
175
+ break;
176
+ }
177
+ }
178
+ else {
179
+ #{
180
+ if result_var
181
+ "#{result_var} = rb_funcall(klass, #{intern_num tree[2]}, 0, 0);"
182
+ else
183
+ "return rb_funcall(klass, #{intern_num tree[2]}, 0, 0);"
184
+ end
185
+ }
186
+ }
187
+
188
+ #{
189
+ unless result_var
190
+ "return Qnil;"
191
+ end
192
+ }
193
+ }
194
+ "}
195
+
196
+ if result_var
197
+ code.call
198
+ else
199
+ inline_block &code
200
+ end
201
+ end
202
+
203
+ define_translator_for(:lasgn, :method => :to_c_lasgn)
204
+ def to_c_lasgn(tree, result_var = nil)
205
+ code = "
206
+ {
207
+ #{to_c tree[2], result_var};
208
+ #{locals_accessor}#{tree[1]} = #{result_var};
209
+ }
210
+ "
211
+
212
+ if result_var
213
+ code
214
+ else
215
+ "_lvar_assing(&#{locals_accessor}#{tree[1]},#{to_c tree[2]})"
216
+ end
217
+ end
218
+
219
+ define_translator_for(:lvar, :arity => 1) do |*x| tree = x.first;
220
+ locals_accessor + tree[1].to_s
221
+ end
222
+
223
+ define_translator_for(:defined, :method => :to_c_defined, :arity => 1)
224
+ def to_c_defined(tree)
225
+ obj_tree = tree[1]
226
+
227
+ if obj_tree[0] == :call && obj_tree[2] == :infer
228
+ obj_tree = obj_tree[1]
229
+ end
230
+
231
+ nt = obj_tree.node_type
232
+
233
+ if nt == :self
234
+ 'rb_str_new2("self")'
235
+ elsif nt == :true
236
+ 'rb_str_new2("true")'
237
+ elsif nt == :false
238
+ 'rb_str_new2("false")'
239
+ elsif nt == :nil
240
+ 'rb_str_new2("nil")'
241
+ elsif nt == :lvar
242
+ 'rb_str_new2("local-variable")'
243
+ elsif nt == :gvar
244
+ "rb_gvar_defined((struct global_entry*)#{global_entry(obj_tree[1])}) ? #{literal_value "global-variable"} : Qnil"
245
+ elsif nt == :const
246
+ "rb_const_defined(rb_cObject, #{intern_num obj_tree[1]}) ? #{literal_value "constant"} : Qnil"
247
+ elsif nt == :call
248
+ if RUBY_VERSION =~ /^1\.8/
249
+ "rb_method_node(CLASS_OF(#{to_c obj_tree[1]}), #{intern_num obj_tree[2]}) ? #{literal_value "method"} : Qnil"
250
+ else
251
+ "rb_method_entry(CLASS_OF(#{to_c obj_tree[1]}), #{intern_num obj_tree[2]}) ? #{literal_value "method"} : Qnil"
252
+ end
253
+ elsif nt == :yield
254
+ "rb_block_given_p() ? #{literal_value "yield"} : Qnil"
255
+ elsif nt == :ivar
256
+ "rb_ivar_defined(plocals->self,#{intern_num obj_tree[1]}) ? #{literal_value "instance-variable"} : Qnil"
257
+ elsif nt == :attrset or
258
+ nt == :op_asgn1 or
259
+ nt == :op_asgn2 or
260
+ nt == :op_asgn_or or
261
+ nt == :op_asgn_and or
262
+ nt == :op_asgn_masgn or
263
+ nt == :masgn or
264
+ nt == :lasgn or
265
+ nt == :dasgn or
266
+ nt == :dasgn_curr or
267
+ nt == :gasgn or
268
+ nt == :iasgn or
269
+ nt == :cdecl or
270
+ nt == :cvdecl or
271
+ nt == :cvasgn
272
+ literal_value "assignment"
273
+ else
274
+ literal_value "expression"
275
+ end
276
+ end
277
+
278
+
279
+ end
280
+ end
@@ -210,45 +210,9 @@ module FastRuby
210
210
  "
211
211
 
212
212
  if result_var
213
- if options[:validate_lvar_types]
214
- klass = @infer_lvar_map[tree[1]]
215
- if klass
216
- "
217
- {
218
- #{to_c tree[2], result_var};
219
- if (CLASS_OF(#{result_var})!=#{literal_value klass}) {
220
- #{_raise(literal_value(FastRuby::TypeMismatchAssignmentException), "Illegal assignment at runtime (type mismatch)")};
221
- }
222
- #{locals_accessor}#{tree[1]} = #{result_var};
223
- }
224
- "
225
- else
226
- code
227
- end
228
- else
229
- code
230
- end
213
+ code
231
214
  else
232
- if options[:validate_lvar_types]
233
- klass = @infer_lvar_map[tree[1]]
234
- if klass
235
- verify_type_function = proc { |name| "
236
- static VALUE #{name}(VALUE arg, void* pframe ) {
237
- if (CLASS_OF(arg)!=#{literal_value klass}) {
238
- #{_raise(literal_value(FastRuby::TypeMismatchAssignmentException), "Illegal assignment at runtime (type mismatch)")};
239
- }
240
- return arg;
241
- }
242
- "
243
- }
244
-
245
- "_lvar_assing(&#{locals_accessor}#{tree[1]}, #{anonymous_function(&verify_type_function)}(#{to_c tree[2]},pframe))"
246
- else
247
- "_lvar_assing(&#{locals_accessor}#{tree[1]},#{to_c tree[2]})"
248
- end
249
- else
250
- "_lvar_assing(&#{locals_accessor}#{tree[1]},#{to_c tree[2]})"
251
- end
215
+ "_lvar_assing(&#{locals_accessor}#{tree[1]},#{to_c tree[2]})"
252
216
  end
253
217
  end
254
218
 
@@ -258,7 +222,13 @@ module FastRuby
258
222
 
259
223
  define_translator_for(:defined, :method => :to_c_defined, :arity => 1)
260
224
  def to_c_defined(tree)
261
- nt = tree[1].node_type
225
+ obj_tree = tree[1]
226
+
227
+ if obj_tree[0] == :call && obj_tree[2] == :infer
228
+ obj_tree = obj_tree[1]
229
+ end
230
+
231
+ nt = obj_tree.node_type
262
232
 
263
233
  if nt == :self
264
234
  'rb_str_new2("self")'
@@ -271,19 +241,19 @@ module FastRuby
271
241
  elsif nt == :lvar
272
242
  'rb_str_new2("local-variable")'
273
243
  elsif nt == :gvar
274
- "rb_gvar_defined((struct global_entry*)#{global_entry(tree[1][1])}) ? #{literal_value "global-variable"} : Qnil"
244
+ "rb_gvar_defined((struct global_entry*)#{global_entry(obj_tree[1])}) ? #{literal_value "global-variable"} : Qnil"
275
245
  elsif nt == :const
276
- "rb_const_defined(rb_cObject, #{intern_num tree[1][1]}) ? #{literal_value "constant"} : Qnil"
246
+ "rb_const_defined(rb_cObject, #{intern_num obj_tree[1]}) ? #{literal_value "constant"} : Qnil"
277
247
  elsif nt == :call
278
248
  if RUBY_VERSION =~ /^1\.8/
279
- "rb_method_node(CLASS_OF(#{to_c tree[1][1]}), #{intern_num tree[1][2]}) ? #{literal_value "method"} : Qnil"
249
+ "rb_method_node(CLASS_OF(#{to_c obj_tree[1]}), #{intern_num obj_tree[2]}) ? #{literal_value "method"} : Qnil"
280
250
  else
281
- "rb_method_entry(CLASS_OF(#{to_c tree[1][1]}), #{intern_num tree[1][2]}) ? #{literal_value "method"} : Qnil"
251
+ "rb_method_entry(CLASS_OF(#{to_c obj_tree[1]}), #{intern_num obj_tree[2]}) ? #{literal_value "method"} : Qnil"
282
252
  end
283
253
  elsif nt == :yield
284
254
  "rb_block_given_p() ? #{literal_value "yield"} : Qnil"
285
255
  elsif nt == :ivar
286
- "rb_ivar_defined(plocals->self,#{intern_num tree[1][1]}) ? #{literal_value "instance-variable"} : Qnil"
256
+ "rb_ivar_defined(plocals->self,#{intern_num obj_tree[1]}) ? #{literal_value "instance-variable"} : Qnil"
287
257
  elsif nt == :attrset or
288
258
  nt == :op_asgn1 or
289
259
  nt == :op_asgn2 or
@@ -0,0 +1,30 @@
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
+
22
+ module FastRuby
23
+ module Modules
24
+ def self.load_all(name = "")
25
+ Dir.glob(FastRuby.fastruby_load_path + "/fastruby/modules/#{name}/**/*.rb").each do |path|
26
+ require path
27
+ end
28
+ end
29
+ end
30
+ end
@@ -22,6 +22,7 @@ require "fastruby/builder"
22
22
  require "fastruby/getlocals"
23
23
  require "fastruby/method_extension"
24
24
  require "fastruby/cache/cache"
25
+ require "fastruby/sexp_extension"
25
26
  require "fastruby"
26
27
  require "digest"
27
28
  require "method_source"
@@ -58,10 +59,44 @@ module FastRuby
58
59
  end
59
60
  end
60
61
 
62
+ class Object
63
+ def fastruby?
64
+ false
65
+ end
66
+ end
67
+
61
68
  class Object
62
69
 
63
70
  def infer(a); self; end
64
- def fastruby(argument, *options_hashes)
71
+ def fastruby(*arguments, &blk)
72
+ if blk
73
+ method_container = Class.new
74
+ class << method_container
75
+ attr_accessor :_self
76
+ attr_accessor :fastruby_options
77
+ end
78
+
79
+ method_container._self = self
80
+ method_container.fastruby_options = arguments.inject({},&:merge)
81
+
82
+ def method_container.method_added(mname)
83
+ m = instance_method(mname)
84
+ if fastruby_options[:fastruby_only]
85
+ tree = FastRuby::FastRubySexp.parse m.source
86
+ FastRuby.set_tree(_self, tree[1], tree, fastruby_options)
87
+ else
88
+ @_self.fastruby m.source, fastruby_options
89
+ end
90
+ end
91
+
92
+ method_container.class_eval(&blk)
93
+
94
+ return nil
95
+ end
96
+
97
+ options_hashes = arguments[1..-1]
98
+ argument = arguments.first
99
+
65
100
  options_hash = {:validate_lvar_types => true}
66
101
  options_hashes.each do |opt|
67
102
  options_hash.merge!(opt)
@@ -69,13 +104,14 @@ class Object
69
104
 
70
105
  tree = nil
71
106
 
72
- require "fastruby/fastruby_sexp"
107
+ require "fastruby/fastruby_sexp" unless defined? FastRuby::FastRubySexp
73
108
  if argument.instance_of? FastRuby::FastRubySexp
74
109
  tree = argument
75
110
  elsif argument.instance_of? String
76
- require "rubygems"
77
- require "ruby_parser"
78
- require "fastruby/sexp_extension"
111
+ unless defined? RubyParser
112
+ require "rubygems"
113
+ require "ruby_parser"
114
+ end
79
115
  tree = RubyParser.new.parse(argument).to_fastruby_sexp
80
116
  else
81
117
  raise ArgumentError
@@ -100,7 +136,7 @@ class Object
100
136
  self_ = options_hash[:self]
101
137
  self_ = self unless self_.instance_of? Class
102
138
 
103
- FastRuby.set_tree(self_, method_name, tree, options_hash[:snippet_hash], options_hash)
139
+ FastRuby.set_tree(self_, method_name, tree, options_hash)
104
140
 
105
141
  class << self
106
142
  $metaclass = self