8ca70a6835
check for resetting on the same position with different class, which should not happen Ie it’s ok for an object to push another object up, but not for an instruction to land on code
46 lines
1.6 KiB
Ruby
46 lines
1.6 KiB
Ruby
module Risc
|
|
module Position
|
|
|
|
# Instructions are also a linked list, but their position is not really
|
|
# the position of the object.
|
|
# Rather it is the position of the assembled code in the binary.
|
|
# (Luckily arm is sane, so this is realtively simple)
|
|
#
|
|
# Really we only need to calculate Positions at a jump, so between the
|
|
# Jump and the label it jumps too. The other instructions are "just" fill.
|
|
# But off course we need to propagate positions to get it right.
|
|
#
|
|
# Assembled instructions are kept in BinaryCode objects.
|
|
# When propagating positions we have to see that the next position assembles into
|
|
# the same BinaryCode, or else move it and the code along
|
|
#
|
|
class InstructionPosition < ObjectPosition
|
|
attr_reader :instruction , :binary
|
|
def initialize(instruction, pos , binary)
|
|
raise "not set " unless binary
|
|
super(instruction,pos)
|
|
@instruction = instruction
|
|
@binary = binary
|
|
end
|
|
def init(at)
|
|
diff = at - Position.get(@binary).at
|
|
if( diff % 60 == 13*4)
|
|
@binary.extend_one unless @binary.next
|
|
@binary = @binary.next
|
|
raise "end of line " unless @binary
|
|
at = Position.get(@binary).at + Parfait::BinaryCode.offset
|
|
end
|
|
return unless @instruction.next
|
|
at += @instruction.byte_length
|
|
Position.set(@instruction.next, at , @binary)
|
|
end
|
|
|
|
def reset_to(pos)
|
|
super(pos)
|
|
Position.log.debug "Reset (#{pos}) #{instruction}"
|
|
init(pos)
|
|
end
|
|
end
|
|
end
|
|
end
|