From 1d57c59dabb334a92e53b58aa9b19f07008ed956 Mon Sep 17 00:00:00 2001 From: Torsten Ruger Date: Sun, 1 Apr 2018 18:57:43 +0300 Subject: [PATCH] fix putstring mainly returning an integer object rather than fixnum --- lib/risc/builtin/kernel.rb | 8 ++- test/risc/interpreter/test_puts.rb | 76 ++++++++++++++++++++++++++ test/risc/interpreter/wip/test_puts.rb | 71 ------------------------ 3 files changed, 81 insertions(+), 74 deletions(-) create mode 100644 test/risc/interpreter/test_puts.rb delete mode 100644 test/risc/interpreter/wip/test_puts.rb diff --git a/lib/risc/builtin/kernel.rb b/lib/risc/builtin/kernel.rb index cae5dc5a..84c71850 100644 --- a/lib/risc/builtin/kernel.rb +++ b/lib/risc/builtin/kernel.rb @@ -56,14 +56,16 @@ module Risc def restore_message(compiler) r8 = RiscValue.new( :r8 , :Message) - return_tmp = Risc.tmp_reg :Integer + return_tmp = compiler.use_reg :fixnum source = "_restore_message" # get the sys return out of the way compiler.add_transfer(source, Risc.message_reg , return_tmp ) - # load the stored message into the base RiscMachine + # load the stored message into the base register compiler.add_transfer(source, r8 , Risc.message_reg ) + int = compiler.use_reg(:Integer) + compiler.add_new_int(source , return_tmp , int ) # save the return value into the message - compiler.add_reg_to_slot( source , return_tmp , :message , :return_value ) + compiler.add_reg_to_slot( source , int , :message , :return_value ) end end extend ClassMethods diff --git a/test/risc/interpreter/test_puts.rb b/test/risc/interpreter/test_puts.rb new file mode 100644 index 00000000..67317230 --- /dev/null +++ b/test/risc/interpreter/test_puts.rb @@ -0,0 +1,76 @@ +require_relative "helper" + +module Risc + class TestPuts < MiniTest::Test + include Ticker + + def setup + @string_input = as_main(" return 'Hello again'.putstring ") + super + end + + def test_chain + #show_ticks # get output of what is + check_chain [Branch, Label, LoadConstant, SlotToReg, LoadConstant, + SlotToReg, SlotToReg, RegToSlot, LoadConstant, SlotToReg, + SlotToReg, SlotToReg, SlotToReg, RegToSlot, LoadConstant, + SlotToReg, SlotToReg, SlotToReg, SlotToReg, RegToSlot, + SlotToReg, RegToSlot, LoadConstant, RegToSlot, FunctionCall, + Label, LoadConstant, SlotToReg, SlotToReg, RegToSlot, + LoadConstant, SlotToReg, SlotToReg, SlotToReg, SlotToReg, + RegToSlot, LoadConstant, SlotToReg, SlotToReg, SlotToReg, + SlotToReg, RegToSlot, LoadConstant, SlotToReg, RegToSlot, + LoadConstant, SlotToReg, RegToSlot, SlotToReg, LoadConstant, + FunctionCall, Label, SlotToReg, SlotToReg, Transfer, + Syscall, Transfer, Transfer, LoadConstant, SlotToReg, + SlotToReg, RegToSlot, RegToSlot, RegToSlot, SlotToReg, + SlotToReg, RegToSlot, SlotToReg, SlotToReg, FunctionReturn, + SlotToReg, SlotToReg, RegToSlot, SlotToReg, SlotToReg, + RegToSlot, SlotToReg, SlotToReg, RegToSlot, SlotToReg, + SlotToReg, FunctionReturn, Transfer, Syscall, NilClass] + assert_equal "Hello again" , @interpreter.stdout + assert_equal Parfait::Integer , get_return.class + assert_equal 11 , get_return.value #bytes written + end + def test_call + cal = ticks(51) + assert_equal FunctionCall , cal.class + assert_equal :putstring , cal.method.name + end + + def test_putstring_sys + done = ticks(56) + assert_equal Syscall , done.class + assert_equal "Hello again" , @interpreter.stdout + assert_equal 11 , @interpreter.get_register(:r0) + assert_equal Parfait::Word , @interpreter.get_register(:r1).class + assert_equal "Hello again" , @interpreter.get_register(:r1).to_string + end + def test_move_sys_return + sl = ticks(57) + assert_equal Transfer , sl.class + assert_equal :r0 , sl.from.symbol + assert_equal :r1 , sl.to.symbol + assert_equal 11 , @interpreter.get_register(:r1) + end + def test_restore_message + sl = ticks(58) + assert_equal Transfer , sl.class + assert_equal :r8 , sl.from.symbol + assert_equal :r0 , sl.to.symbol + assert_equal Parfait::Message , @interpreter.get_register(:r0).class + end + def test_save_sys_return + sl = ticks(63) + assert_equal RegToSlot , sl.class + assert_equal :r1 , sl.register.symbol #return + assert_equal :r2 , sl.array.symbol #parfait integer + assert_equal 3 , sl.index + end + def test_return + done = ticks(70) + assert_equal FunctionReturn , done.class + end + + end +end diff --git a/test/risc/interpreter/wip/test_puts.rb b/test/risc/interpreter/wip/test_puts.rb deleted file mode 100644 index 1950792d..00000000 --- a/test/risc/interpreter/wip/test_puts.rb +++ /dev/null @@ -1,71 +0,0 @@ -require_relative "../helper" - -module Risc - class TestPuts < MiniTest::Test - include Ticker - - def setup - @string_input = <