SA for Slotted derivations
Object and Constant similarity are coming more into focus. Will unite after the merge
This commit is contained in:
parent
d22da1ab97
commit
088017bc05
@ -22,16 +22,16 @@ module SlotMachine
|
||||
else
|
||||
type = :Object
|
||||
end
|
||||
right = compiler.use_reg( type )
|
||||
parfait = known_object.to_parfait(compiler)
|
||||
const = Risc.load_constant(source, parfait , right)
|
||||
compiler.add_code const
|
||||
last = Risc.load_constant(source, parfait )
|
||||
compiler.add_code(last)
|
||||
if slots_length == 2
|
||||
raise "only type allowed for constants, not #{slots}" unless slots.name == :type
|
||||
compiler.add_code Risc::SlotToReg.new( source , right , Parfait::TYPE_INDEX, right)
|
||||
last = Risc.slot_to_reg( source , last.register , Parfait::TYPE_INDEX )
|
||||
compiler.add_code(last)
|
||||
end
|
||||
raise "Can't have slots into Constants #{slots}" if slots_length > 2
|
||||
return const.register
|
||||
return last.register
|
||||
end
|
||||
|
||||
end
|
||||
|
@ -14,18 +14,13 @@ module SlotMachine
|
||||
# the code is added to compiler
|
||||
# the register returned
|
||||
def to_register(compiler, source)
|
||||
type = :Message
|
||||
right = compiler.use_reg( type )
|
||||
slots = @slots
|
||||
left = Risc.message_reg
|
||||
left = left.resolve_and_add( slots.name , compiler)
|
||||
reg = compiler.current.register
|
||||
slots = slots.next_slot
|
||||
left = Risc.message_named_reg
|
||||
while( slots )
|
||||
left = left.resolve_and_add( slots.name , compiler)
|
||||
slots = slots.next_slot
|
||||
end
|
||||
return reg
|
||||
return left
|
||||
end
|
||||
|
||||
# load the data in const_reg into the slot that is named by slot symbols
|
||||
@ -36,7 +31,7 @@ module SlotMachine
|
||||
# most likely be united
|
||||
def reduce_and_load(const_reg , compiler , original_source )
|
||||
raise "Not Message #{object}" unless known_object == :message
|
||||
left = Risc.message_reg
|
||||
left = Risc.message_named_reg
|
||||
slot = slots
|
||||
while( slot.next_slot )
|
||||
left = left.resolve_and_add( slot.name , compiler)
|
||||
|
@ -19,23 +19,22 @@ module SlotMachine
|
||||
def to_register(compiler, source)
|
||||
type = known_object.get_type
|
||||
raise "not sym for #{known_object}" if type.is_a?(String)
|
||||
right = compiler.use_reg( type )
|
||||
const = Risc.load_constant(source, known_object , right)
|
||||
compiler.add_code const
|
||||
last = Risc.load_constant(source, known_object)
|
||||
compiler.add_code last
|
||||
if slots_length > 1
|
||||
# desctructively replace the existing value to be loaded if more slots
|
||||
compiler.add_code Risc.slot_to_reg( source , right ,slots.name, right)
|
||||
last = Risc.slot_to_reg( source , last.register ,slots.name)
|
||||
compiler.add_code(last)
|
||||
end
|
||||
if slots_length > 2
|
||||
# desctructively replace the existing value to be loaded if more slots
|
||||
index = Risc.resolve_to_index(slots.name , slots.next_slot.name ,compiler)
|
||||
compiler.add_code Risc::SlotToReg.new( source , right ,index, right)
|
||||
if slots_length > 3
|
||||
raise "3 slots only for type #{slots}" unless slots.next_slot.next_slot.name == :type
|
||||
compiler.add_code Risc::SlotToReg.new( source , right , Parfait::TYPE_INDEX, right)
|
||||
end
|
||||
last = Risc.slot_to_reg( source , last.register , slots.next_slot.name )
|
||||
compiler.add_code(last)
|
||||
end
|
||||
return const.register
|
||||
if slots_length > 3
|
||||
raise "3 slots only for type #{slots}" unless slots.next_slot.next_slot.name == :type
|
||||
last = Risc.slot_to_reg( source , last.register , slots.next_slot.name )
|
||||
compiler.add_code(last)
|
||||
end
|
||||
return last.register
|
||||
end
|
||||
|
||||
# Note: this is the left hand case, the right hand being to_register
|
||||
|
@ -14,7 +14,7 @@ module SlotMachine
|
||||
assert_equal Risc::LoadConstant , @instruction.class
|
||||
end
|
||||
def test_def_register
|
||||
assert_equal :r1 , @instruction.register.symbol
|
||||
assert @instruction.register.is_object?
|
||||
end
|
||||
def test_def_const
|
||||
assert_equal "hi" , @instruction.constant.to_string
|
||||
@ -32,7 +32,7 @@ module SlotMachine
|
||||
assert_equal Risc::LoadConstant , @instruction.class
|
||||
end
|
||||
def test_def_register
|
||||
assert_equal :r1 , @instruction.register.symbol
|
||||
assert @instruction.register.is_object?
|
||||
end
|
||||
def test_def_const
|
||||
assert_equal "hi" , @instruction.constant.to_string
|
||||
@ -41,7 +41,7 @@ module SlotMachine
|
||||
assert_equal "StringConstant.type" , @slotted.to_s
|
||||
end
|
||||
def test_def_register2
|
||||
assert_equal :r1 , @instruction.next.register.symbol
|
||||
assert @instruction.next.register.is_object?
|
||||
end
|
||||
def test_def_next_index
|
||||
assert_equal 0 , @instruction.next.index
|
||||
|
@ -16,10 +16,10 @@ module SlotMachine
|
||||
assert_equal NilClass , @instruction.next.class
|
||||
end
|
||||
def test_def_array #from message r0
|
||||
assert_equal :r0 , @instruction.array.symbol
|
||||
assert_equal :message , @instruction.array.symbol
|
||||
end
|
||||
def test_def_register # to next free register r1
|
||||
assert_equal :r2 , @register.symbol
|
||||
assert_equal :"message.caller" , @register.symbol
|
||||
end
|
||||
def test_def_index # at caller index 6
|
||||
assert_equal 6 , @instruction.index
|
||||
|
@ -14,7 +14,7 @@ module SlotMachine
|
||||
assert_equal Risc::LoadConstant , @instruction.class
|
||||
end
|
||||
def test_def_register
|
||||
assert_equal :r1 , @instruction.register.symbol
|
||||
assert @instruction.register.is_object?
|
||||
end
|
||||
def test_def_const
|
||||
assert_equal Parfait::Space , @instruction.constant.class
|
||||
@ -23,10 +23,42 @@ module SlotMachine
|
||||
assert_equal "Space.type" , @slotted.to_s
|
||||
end
|
||||
def test_def_register2
|
||||
assert_equal :r1 , @instruction.next.register.symbol
|
||||
reg = @instruction.next.register
|
||||
assert reg.is_object?
|
||||
assert reg.symbol.to_s.index(".") , reg.symbol.to_s
|
||||
end
|
||||
def test_def_next_index
|
||||
assert_equal 0 , @instruction.next.index
|
||||
end
|
||||
end
|
||||
class TestSlottedObjectType2 < MiniTest::Test
|
||||
def setup
|
||||
Parfait.boot!(Parfait.default_test_options)
|
||||
compiler = Risc.test_compiler
|
||||
@slotted = Slotted.for(Parfait.object_space , [:type , :type])
|
||||
register = @slotted.to_register(compiler , InstructionMock.new)
|
||||
@instruction = compiler.risc_instructions.next
|
||||
end
|
||||
def test_def_register2
|
||||
reg = @instruction.next.register
|
||||
assert reg.is_object?
|
||||
assert_equal "type", reg.symbol.to_s.split(".").last
|
||||
assert_equal 2, reg.symbol.to_s.split(".").length
|
||||
end
|
||||
end
|
||||
class TestSlottedObjectType3 < MiniTest::Test
|
||||
def setup
|
||||
Parfait.boot!(Parfait.default_test_options)
|
||||
compiler = Risc.test_compiler
|
||||
@slotted = Slotted.for(Parfait.object_space , [:type , :type , :type])
|
||||
register = @slotted.to_register(compiler , InstructionMock.new)
|
||||
@instruction = compiler.risc_instructions.next
|
||||
end
|
||||
def test_def_register3
|
||||
reg = @instruction.next.next.register
|
||||
assert reg.is_object?
|
||||
assert_equal "type", reg.symbol.to_s.split(".").last
|
||||
assert_equal 3, reg.symbol.to_s.split(".").length
|
||||
end
|
||||
end
|
||||
end
|
||||
|
Loading…
Reference in New Issue
Block a user