and another one, and another one....

This commit is contained in:
Torsten Ruger 2014-07-13 16:00:48 +03:00
parent ae21863245
commit c1f475070b
5 changed files with 15 additions and 10 deletions

View File

@ -35,9 +35,9 @@ module Ast
# this makes the namespace static, ie when eval and co are implemented method needs recompilation
def compile frame , method
if method.has_var(name)
frame.compile_get(name , method )
frame.compile_get(method , name )
else
frame.compile_send( name , method )
frame.compile_send( method , name )
end
end
end

View File

@ -5,6 +5,11 @@ module Ast
# attr_reader :name, :args , :receiver
@@counter = 0
def compile frame , method
with = args.collect{|a| a.compile(frame , method)}
frame.compile_send( method , @name , with )
end
def scratch
into = context.function
params = args.collect{ |a| a.compile(context) }
puts "compiling receiver #{receiver} (call #{name})"

View File

@ -24,12 +24,12 @@ module Virtual
attr_reader :next_normal, :next_exception, :me, :binding
#
def compile_get name , method
def compile_get method , name
method.add FrameGet.new(name)
end
def compile_send name , method
method.add FrameSend.new(name)
def compile_send method , name , with = []
method.add FrameSend.new(name , with )
end
end
end

View File

@ -36,16 +36,17 @@ module Virtual
class FrameSend < Instruction
def initialize name
def initialize name , args = []
@name = name.to_sym
@args = args
end
attr_reader :name
attr_reader :name , :args
def == other
self.class == other.class && self.name == other.name
end
def inspect
self.class.name + ".new(:#{@name})"
self.class.name + ".new(:#{@name} , [ " + args.collect{|a| a.inspect}.join(",")+ "])"
end
end

View File

@ -34,8 +34,7 @@ class TestBasic < MiniTest::Test
def test_instance_variable
@string_input = '@foo_bar '
@parse_output = {:instance_variable=>{:name=>"foo_bar"}}
@output = Ast::VariableExpression.new(:foo_bar)
@output = [Virtual::FrameSend.new(:_get_instance_variable , [ Virtual::StringConstant.new('foo_bar')])]
check
end