diff --git a/lib/ast/basic_expressions.rb b/lib/ast/basic_expressions.rb index 2210d191..a2413698 100644 --- a/lib/ast/basic_expressions.rb +++ b/lib/ast/basic_expressions.rb @@ -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 diff --git a/lib/ast/call_site_expression.rb b/lib/ast/call_site_expression.rb index a9ac8549..cd575d36 100644 --- a/lib/ast/call_site_expression.rb +++ b/lib/ast/call_site_expression.rb @@ -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})" diff --git a/lib/virtual/frame.rb b/lib/virtual/frame.rb index c30a6897..6d94e6da 100644 --- a/lib/virtual/frame.rb +++ b/lib/virtual/frame.rb @@ -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 diff --git a/lib/virtual/instruction.rb b/lib/virtual/instruction.rb index e12cc7f1..a62bff75 100644 --- a/lib/virtual/instruction.rb +++ b/lib/virtual/instruction.rb @@ -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 diff --git a/test/virtual/test_basic.rb b/test/virtual/test_basic.rb index 7e007444..51b7555c 100644 --- a/test/virtual/test_basic.rb +++ b/test/virtual/test_basic.rb @@ -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