From e56db0a3aca8217a71548722e5026d2fd3ea4c59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torsten=20R=C3=BCger?= Date: Tue, 17 Sep 2019 20:18:00 +0300 Subject: [PATCH] get method name out from method_missing --- lib/mom/instruction/resolve_method.rb | 2 +- lib/mom/macro/method_missing.rb | 14 +++++++++++++- lib/mom/mom_collection.rb | 2 +- lib/risc/interpreter.rb | 2 +- lib/vool/builtin.rb | 2 +- test/mom/instruction/test_resolve_method.rb | 17 ++++++++++------- test/mom/macro/test_method_missing.rb | 2 +- test/risc/interpreter/test_dynamic_call.rb | 2 +- test/rubyx/macro/test_object_missing.rb | 4 ++-- 9 files changed, 31 insertions(+), 16 deletions(-) diff --git a/lib/mom/instruction/resolve_method.rb b/lib/mom/instruction/resolve_method.rb index 9178954e..ae1dbb39 100644 --- a/lib/mom/instruction/resolve_method.rb +++ b/lib/mom/instruction/resolve_method.rb @@ -62,7 +62,7 @@ module Mom branch while_start_label add_code exit_label - MethodMissing.new(compiler.source_name).to_risc(compiler) + MethodMissing.new(compiler.source_name , word.symbol).to_risc(compiler) add_code ok_label cache_entry[:cached_method] << callable_method diff --git a/lib/mom/macro/method_missing.rb b/lib/mom/macro/method_missing.rb index 334df0df..7bb32a28 100644 --- a/lib/mom/macro/method_missing.rb +++ b/lib/mom/macro/method_missing.rb @@ -1,8 +1,20 @@ module Mom class MethodMissing < Macro + attr_reader :name + + def initialize( source , name ) + super(source) + name = name.value if name.is_a?(Vool::SymbolConstant) + raise "No reg #{name.class}" unless name.class == Symbol + @name = name + end + def to_risc(compiler) builder = compiler.builder(compiler.source_name) - builder.add_code Risc::Syscall.new("Method_missing_died", :died ) + from = Risc::RegisterValue.new(@name , :Word) + to = Risc::RegisterValue.new(:r1 , :Word) + builder.add_code Risc::Transfer.new(self , from , to) + builder.add_code Risc::Syscall.new(self, :died ) return compiler end end diff --git a/lib/mom/mom_collection.rb b/lib/mom/mom_collection.rb index 6ecb155d..54a0650d 100644 --- a/lib/mom/mom_collection.rb +++ b/lib/mom/mom_collection.rb @@ -54,7 +54,7 @@ module Mom def self.create_mm_compiler compiler = compiler_for(:Object,:__method_missing__ ,{}) - compiler.add_code MethodMissing.new("missing") + compiler.add_code MethodMissing.new("missing" , :r1) return compiler end diff --git a/lib/risc/interpreter.rb b/lib/risc/interpreter.rb index a9b75db6..236c5843 100644 --- a/lib/risc/interpreter.rb +++ b/lib/risc/interpreter.rb @@ -250,7 +250,7 @@ module Risc set_instruction(nil) return false when :died - raise "Method not found #{@registers[:r0]}" + raise "Method #{@registers[:r1]} not found for #{@registers[:r0].receiver}" else raise "un-implemented syscall #{name}" end diff --git a/lib/vool/builtin.rb b/lib/vool/builtin.rb index 735e645f..b01d7fa7 100644 --- a/lib/vool/builtin.rb +++ b/lib/vool/builtin.rb @@ -13,7 +13,7 @@ module Vool def self.builtin { "Object.get" => "def get_internal_word(at); X.get_internal_word;end", - "Object.missing" => "def method_missing(at); X.method_missing;end", + "Object.missing" => "def method_missing(at); X.method_missing(:r1);end", "Object.exit" => "def exit; X.exit;end", "Integer.div4" => "def div4; X.div4;end", "Integer.div10" => "def div10; X.div10;end", diff --git a/test/mom/instruction/test_resolve_method.rb b/test/mom/instruction/test_resolve_method.rb index f76e5899..410f9bbc 100644 --- a/test/mom/instruction/test_resolve_method.rb +++ b/test/mom/instruction/test_resolve_method.rb @@ -10,7 +10,7 @@ module Mom ResolveMethod.new( "method" , :name , cache_entry ) end def test_len - assert_equal 18 , all.length , all_str + assert_equal 19 , all.length , all_str end def test_1_load_name assert_load risc(1) , Symbol , :r1 @@ -56,14 +56,17 @@ module Mom def test_14_goto_exit assert_label risc(14) , "exit_label_" end - def test_15_die - assert_syscall risc(15) , :died + def test_15_move_name + assert_transfer( risc(15) , :r1 , :r1) end - def test_16_label - assert_label risc(16) , "ok_label_" + def test_16_die + assert_syscall risc(16) , :died end - def test_17_load_method - assert_reg_to_slot risc(17) , :r4 , :r2 , 2 + def test_17_label + assert_label risc(17) , "ok_label_" + end + def test_18_load_method + assert_reg_to_slot risc(18) , :r4 , :r2 , 2 end end end diff --git a/test/mom/macro/test_method_missing.rb b/test/mom/macro/test_method_missing.rb index ed452610..c2d5e2b4 100644 --- a/test/mom/macro/test_method_missing.rb +++ b/test/mom/macro/test_method_missing.rb @@ -14,7 +14,7 @@ module Mom assert_equal Risc::MethodCompiler , @method.to_risc.class end def test_risc_length - assert_equal 14 , @method.to_risc.risc_instructions.length + assert_equal 15 , @method.to_risc.risc_instructions.length end end end diff --git a/test/risc/interpreter/test_dynamic_call.rb b/test/risc/interpreter/test_dynamic_call.rb index fbf3b0e9..8017ef6e 100644 --- a/test/risc/interpreter/test_dynamic_call.rb +++ b/test/risc/interpreter/test_dynamic_call.rb @@ -17,7 +17,7 @@ module Risc LoadConstant, RegToSlot, LoadConstant, LoadConstant, SlotToReg, #15 SlotToReg, LoadConstant, OperatorInstruction, IsZero, SlotToReg, #20 OperatorInstruction, IsZero, RegToSlot, LoadConstant, SlotToReg, #25 - SlotToReg, Branch, RegToSlot, SlotToReg, SlotToReg, #30 + Branch, SlotToReg, RegToSlot, SlotToReg, SlotToReg, #30 RegToSlot, LoadConstant, SlotToReg, RegToSlot, SlotToReg, #35 LoadConstant, SlotToReg, DynamicJump, LoadConstant, SlotToReg, #40 LoadConstant, OperatorInstruction, IsNotZero, SlotToReg, RegToSlot, #45 diff --git a/test/rubyx/macro/test_object_missing.rb b/test/rubyx/macro/test_object_missing.rb index dedcfcbf..31a93f7e 100644 --- a/test/rubyx/macro/test_object_missing.rb +++ b/test/rubyx/macro/test_object_missing.rb @@ -13,7 +13,7 @@ module RubyX end class Object def method_missing(at) - X.method_missing + X.method_missing(:r1) end end GET @@ -28,7 +28,7 @@ GET assert_equal Mom::MethodMissing , compiler.mom_instructions.next.class end def test_risc - assert_equal 14 , compiler.to_risc.risc_instructions.length + assert_equal 15 , compiler.to_risc.risc_instructions.length end end end