diff --git a/lib/arm/translator.rb b/lib/arm/translator.rb index 76e1c841..791021bd 100644 --- a/lib/arm/translator.rb +++ b/lib/arm/translator.rb @@ -139,10 +139,12 @@ module Arm end def translate_Syscall( code ) - call_codes = { :putstring => 4 , :exit => 1 } - int_code = call_codes[code.name] - raise "Not implemented syscall, #{code.name}" unless int_code - send( code.name , int_code ) + call_codes = { putstring: 4 , exit: 1 } + name = code.name + name = :exit if name == :died + int_code = call_codes[name] + raise "Not implemented syscall, #{name}" unless int_code + send( name , int_code ) end def putstring( int_code ) diff --git a/lib/mom/instruction/resolve_method.rb b/lib/mom/instruction/resolve_method.rb index 4698046b..d33b0b80 100644 --- a/lib/mom/instruction/resolve_method.rb +++ b/lib/mom/instruction/resolve_method.rb @@ -65,7 +65,7 @@ module Mom # temporary, need to raise really. factory! << Parfait.object_space.get_factory_for(:Integer) integer_tmp! << factory[:reserve] - Mom::Builtin.emit_syscall( builder , :exit ) #uses integer_tmp + Mom::Builtin.emit_syscall( builder , :died ) #uses integer_tmp add_code ok_label cache_entry[:cached_method] << callable_method diff --git a/lib/risc/interpreter.rb b/lib/risc/interpreter.rb index f95abb06..21fde3b5 100644 --- a/lib/risc/interpreter.rb +++ b/lib/risc/interpreter.rb @@ -245,6 +245,8 @@ module Risc when :exit set_instruction(nil) return false + when :died + raise "Method not found #{@registers[:r0]}" else raise "un-implemented syscall #{name}" end diff --git a/test/mains/test_new.rb b/test/mains/test_new.rb index 0d701cbd..4f2b6d5f 100644 --- a/test/mains/test_new.rb +++ b/test/mains/test_new.rb @@ -42,7 +42,7 @@ module Mains run_all assert_equal ::Integer , get_return.class , " " #assert_equal 4 , get_return , " " - assert_equal "hi" , @interpreter.stdout + assert_equal "Space" , @interpreter.stdout end end diff --git a/test/mom/send/test_send_dynamic.rb b/test/mom/send/test_send_dynamic.rb index 38e38651..e17c366a 100644 --- a/test/mom/send/test_send_dynamic.rb +++ b/test/mom/send/test_send_dynamic.rb @@ -27,7 +27,7 @@ module Risc def test_sys produced = produce_body assert_equal Syscall , produced.next(29).class - assert_equal :exit , produced.next(29).name + assert_equal :died , produced.next(29).name end def test_load_address produced = produce_body diff --git a/test/risc/test_interpreter.rb b/test/risc/test_interpreter.rb index 6dbe50c3..5e8f7816 100644 --- a/test/risc/test_interpreter.rb +++ b/test/risc/test_interpreter.rb @@ -91,5 +91,16 @@ module Risc def test_tick_15 #more than a binary code worth 31.times {@interpreter.tick} end + class TestInterpreterDies < MiniTest::Test + include Ticker + def setup + @string_input = as_main("random.call") + super + end + def test_dies + # no method does syscall :dies that raises + assert_raises {44.times {@interpreter.tick}} + end + end end end