diff --git a/lib/risc/position/instruction_listener.rb b/lib/risc/position/instruction_listener.rb index 106fcb61..5e0b5a5b 100644 --- a/lib/risc/position/instruction_listener.rb +++ b/lib/risc/position/instruction_listener.rb @@ -25,11 +25,11 @@ module Risc # Taking into account that BinaryCodes only take 13 instructions, # meaning that chain may have to be extended def position_changing(position , to) - Position.log.debug "Changing #{position} to #{to.to_s(16)}, bin #{Position.get(@binary)}" + Position.log.debug "Changing #{position} to 0x#{to.to_s(16)}, bin #{Position.get(@binary)}" update_index(to) instruction = position.object return unless instruction.next - if @index == (Parfait::BinaryCode.data_length - 1 ) + if @index == (Parfait::BinaryCode.data_length - 1 ) and !instruction.is_a?(Label) nekst_pos_diff = @binary.padded_length else nekst_pos_diff = @index * 4 + instruction.byte_length diff --git a/test/risc/position/test_instruction_listener1.rb b/test/risc/position/test_instruction_listener1.rb index 8272135f..62efa837 100644 --- a/test/risc/position/test_instruction_listener1.rb +++ b/test/risc/position/test_instruction_listener1.rb @@ -33,5 +33,31 @@ module Risc @position.set(12) assert_equal 80 , Position.get(@instruction.last).at end + def test_label_last_in_binary + before = get(11) + assert_equal 52 , Position.get(before).at + label = Label.new("HI","Ho" , FakeAddress.new(0)) + before.insert( label ) + assert_equal 56 , Position.get(label).at + label + end + def test_after_last_label + after = get(12) + label = test_label_last_in_binary + assert_equal 56 , Position.get(label).at + assert_equal 56 , Position.get(after).at + assert_equal label.next , after + end + def test_but_last + assert_equal 56 , Position.get(get(12)).at + end + def get(n) + ins = @instruction + while( n > 0 ) + ins = ins.next + n -= 1 + end + ins + end end end diff --git a/test/risc/position/test_position3.rb b/test/risc/position/test_position3.rb index 933fada4..1c4ef676 100644 --- a/test/risc/position/test_position3.rb +++ b/test/risc/position/test_position3.rb @@ -2,22 +2,28 @@ require_relative "helper" module Risc class TestMachinePositions < MiniTest::Test - def setup + def setup_for(platform) @machine = Risc.machine.boot + @machine.translate(platform) + @machine.position_all end def test_cpu_init - @machine.translate(:interpreter) - @machine.position_all + setup_for(:interpreter) assert Position.get @machine.cpu_init end def test_cpu_label - @machine.translate(:interpreter) - @machine.position_all + setup_for(:interpreter) assert Position.get( @machine.cpu_init.label ) end + def test_label_positions_match + setup_for(:interpreter) + Position.positions.each do |object , position| + next unless object.is_a?(Label) and object.next + assert_equal position.at , Position.get(object.next).at + end + end def test_cpu_first_arm - @machine.translate(:arm) - @machine.position_all + setup_for(:arm) assert Position.get( @machine.cpu_init.first ) end def test_has_arm_pos @@ -27,8 +33,7 @@ module Risc has_positions(:interpreter) end def has_positions(platform) - @machine.translate(:arm) - @machine.position_all + setup_for(platform) @machine.objects.each do |id,obj| assert Position.get(obj) end @@ -40,8 +45,7 @@ module Risc meth_positions(:interpreter) end def meth_positions(platform) - @machine.translate(:arm) - @machine.position_all + setup_for(platform) Parfait.object_space.each_type do |type| type.each_method do |method| assert Position.get(method.binary)