Fix up Rubinius specific library specs.
[rbx.git] / lib / compiler / execute.rb
blob41c872dde1f1f8cea27a47011acb39d9ab3d6b8b
2 ##
3 # Used for the Rubinius::asm Compiler hook.
5 class Compiler::ExecuteContext
6   def initialize(who)
7     @self = who
8     @file = nil
9     @line = 0
10     @locals = {}
11     @metadata = nil
12   end
14   attr_accessor :self, :file, :line, :metadata
16   def execute(node)
17     node.execute self
18   end
20   def get_local(name)
21     @locals[name]
22   end
24   def set_local(name, val)
25     @locals[name] = val
26   end
28 end
30 class Compiler::Node
31   class Script
32     def execute(e)
33       e.file = @file
34       e.line = @line
36       @child.execute(e)
37       return true
38     end
39   end
41   class Newline
42     def execute(e)
43       @child.execute(e)
44     end
45   end
47   class True
48     def execute(e)
49       true
50     end
51   end
53   class False
54     def execute(e)
55       false
56     end
57   end
59   class Nil
60     def execute(e)
61       nil
62     end
63   end
65   class Self
66     def execute(e)
67       e.self
68     end
69   end
71   class And
72     def execute(e)
73       @left.execute(e) and @right.execute(e)
74     end
75   end
77   class Or
78     def execute(e)
79       @left.execute(e) or @right.execute(e)
80     end
81   end
83   class Not
84     def execute(e)
85       not @child.execute(e)
86     end
87   end
89   class Negate
90     def execute(e)
91       -@child.execute(e)
92     end
93   end
95   class NumberLiteral
96     def execute(e)
97       @value
98     end
99   end
101   class Literal
102     def execute(e)
103       @value
104     end
105   end
107   class RegexLiteral
108     def execute(e)
109       ::Regexp.new(@source, @options)
110     end
111   end
113   class StringLiteral
114     def execute(e)
115       @string.dup
116     end
117   end
119   class DynamicString
120     def execute(e)
121       str = @string.dup
122       @body.each do |x|
123         str << x.execute(e)
124       end
126       str
127     end
128   end
130   class DynamicRegex
131     def execute(e)
132       ::Regexp.new super(e)
133     end
134   end
136   class DynamicOnceRegex
137     def execute(e)
138       @value ||= super(e)
139     end
140   end
142   class If
143     def execute(e)
144       if @condition.execute(e)
145         @then.execute(e) if @then
146       else
147         @else.execute(e) if @else
148       end
149     end
150   end
152   class While
153     def execute(e)
154       if @check_first
155         while @condition.execute(e)
156           @body.execute(e)
157         end
158       else
159         begin
160           @body.execute(e)
161         end while @condition.execute(e)
162       end
163     end
164   end
166   class Until
167     def execute(e)
168       if @check_first
169         until @condition.execute(e)
170           @body.execute(e)
171         end
172       else
173         begin
174           @body.execute(e)
175         end until @condition.execute(e)
176       end
177     end
178   end
180   class Block
181     def execute(e)
182       val = nil
183       @body.each do |x|
184         val = x.execute(e)
185       end
187       return val
188     end
189   end
191   class LocalVariable
192     def execute(e)
193       e.get_local @name
194     end
195   end
197   class LocalAssignment
198     def execute(e)
199       e.set_local @name, @value.execute(e)
200     end
201   end
203   class ArrayLiteral
204     def execute(e)
205       @body.map { |x| x.execute(e) }
206     end
207   end
209   class EmptyArray
210     def execute(e)
211       []
212     end
213   end
215   class HashLiteral
216     def execute(e)
217       args = @body.map { |x| x.execute(e) }
218       Hash[*args]
219     end
220   end
222   class IVar
223     def execute(e)
224       if md = e.metadata
225         md[@name]
226       else
227         e.self.instance_variable_get @name
228       end
229     end
230   end
232   class IVarAssign
233     def execute(e)
234       if md = e.metadata
235         md[@name] = @value.execute(e)
236       else
237         e.self.instance_variable_set @name, @value.execute(e)
238       end
239     end
240   end
242   class GVar
243     def execute(e)
244       ::Globals[@name]
245     end
246   end
248   class GVarAssign
249     def execute(e)
250       ::Globals[@name] = @value.execute(e)
251     end
252   end
254   class ConstFind
255     def execute(e)
256       Object.const_get @name
257     end
258   end
260   class ConstAccess
261     def execute(e)
262       par = @parent.execute(e)
263       par.const_get @name
264     end
265   end
267   class ConstAtTop
268     def execute(e)
269       Object.const_get @name
270     end
271   end
273   class Call
274     def execute(e)
275       if @arguments
276         args = @arguments.map { |a| a.execute(e) }
277       else
278         args = []
279       end
281       if @block
282         vars = @block.arguments.names
283         blk = proc do |*args|
284           # bind the locals...
285           args.each_with_index do |a,i|
286             e.set_local vars[i], a
287           end
289           @block.body.execute(e)
290         end
292         @object.execute(e).__send__ @method, *args, &blk
293       else
294         @object.execute(e).__send__ @method, *args
295       end
296     end
297   end
299   class AttrAssign
300     def execute(e)
301       args = @arguments.map { |a| a.execute(e) }
302       rhs  = @rhs_expression.execute(e)
303       args << rhs
304       @object.execute(e).__send__ @method, *args
305       return rhs
306     end
307   end
309   class FCall
310     def execute(e)
311       if @arguments
312         args = @arguments.map { |a| a.execute(e) }
313       else
314         args = []
315       end
317       if @block
318         vars = @block.arguments.names
319         blk = proc do |*args|
320           # bind the locals...
321           args.each_with_index do |a,i|
322             e.set_local vars[i], a
323           end
325           @block.body.execute(e)
326         end
327         e.self.__send__ @method, *args, &blk
328       else
329         e.self.__send__ @method, *args
330       end
331     end
332   end
334   class VCall
335     def execute(e)
336       e.self.__send__ @method
337     end
338   end
340   class Yield
341     def execute(e)
342       if @arguments.kind_of? Array
343         args = @arguments.map { |x| x.execute(e) }
344       else
345         args = @arguments.execute(e)
346       end
348       e.block.call *args
349     end
350   end
352   class ExecuteString
353     def execute(e)
354       `#{@string.execute(e)}`
355     end
356   end
358   class ToString
359     def execute(e)
360       @child.execute(e).to_s
361     end
362   end
364   class DynamicExecuteString
365     def execute(e)
366       `#{super(e)}`
367     end
368   end