always slot definitions in slot loads

This commit is contained in:
Torsten Ruger 2018-03-10 18:04:04 +05:30
parent bc5906fb83
commit dae17e0c18
7 changed files with 17 additions and 13 deletions

View File

@ -28,15 +28,17 @@ module Mom
class SlotLoad < Instruction class SlotLoad < Instruction
attr_reader :left , :right attr_reader :left , :right
def initialize(left , right) def initialize(left , right)
left = SlotDefinition.new(left.shift , left) if left.is_a? Array
@left , @right = left , right @left , @right = left , right
raise "right not SlotDefinition, #{left}" unless left.is_a? SlotDefinition
end end
end end
# A SlotConstant moves a constant into a know Slot. # A SlotConstant moves a constant into a known Slot.
# Eg when you write a = 5 , the 5 becomes a constant, and so the right side # Eg when you write a = 5 , the 5 becomes a constant, and so the right side
# the a is an instance variable on the current frame, and the frame is an instance # the a is an instance variable on the current frame, and the frame is an instance
# of the current message, so the effect is something like message.frame.a = 5 # of the current message, so the effect is something like message.frame.a = 5
# @left: See SlotLoad, and array of symbols # @left: See SlotLoad, an array of symbols
# @right: A Constant from parse, ie an instance of classes in basc_value, like TrueStatement # @right: A Constant from parse, ie an instance of classes in basc_value, like TrueStatement
class SlotConstant < SlotLoad class SlotConstant < SlotLoad
@ -47,6 +49,7 @@ module Mom
end end
#SlotMove is a SlotLoad where the right side is a slot, just like the left.
class SlotMove < SlotLoad class SlotMove < SlotLoad
end end

View File

@ -14,7 +14,7 @@ module Vool
assert_equal Mom::ArgumentTransfer, @stats[1].class assert_equal Mom::ArgumentTransfer, @stats[1].class
end end
def test_receiver_move def test_receiver_move
assert_equal :receiver, @stats[1].receiver.left[2] assert_equal :receiver, @stats[1].receiver.left.slots[1]
end end
def test_receiver def test_receiver
type , value = receiver type , value = receiver

View File

@ -44,7 +44,8 @@ module Vool
end end
def test_call_third def test_call_third
assert @fourth.method_var_name.start_with?("cached_") , @fourth.to_rxf assert @fourth.cached_method.start_with?("cached_") , @fourth.to_rxf
assert @fourth.cached_type.start_with?("cached_") , @fourth.to_rxf
end end
def est_receiver_move_class def est_receiver_move_class

View File

@ -15,8 +15,8 @@ module Vool
[IntegerStatement , 5] [IntegerStatement , 5]
end end
def test_args_two_move def test_args_two_move
assert_equal :next_message, @stats[1].arguments[1].left[1] assert_equal :next_message, @stats[1].arguments[1].left.slots[0]
assert_equal :arguments, @stats[1].arguments[1].left[2] assert_equal :arguments, @stats[1].arguments[1].left.slots[1]
end end
def test_args_two_str def test_args_two_str
assert_equal IntegerStatement, @stats[1].arguments[1].right.class assert_equal IntegerStatement, @stats[1].arguments[1].right.class

View File

@ -16,8 +16,8 @@ module Vool
end end
def test_args_one_move def test_args_one_move
assert_equal :next_message, @stats[1].arguments[0].left[1] assert_equal :next_message, @stats[1].arguments[0].left.slots[0]
assert_equal :arguments, @stats[1].arguments[0].left[2] assert_equal :arguments, @stats[1].arguments[0].left.slots[1]
end end
def test_args_one_str def test_args_one_str
assert_equal IntegerStatement, @stats[1].arguments[0].right.class assert_equal IntegerStatement, @stats[1].arguments[0].right.class

View File

@ -19,13 +19,13 @@ module Vool
assert @method.first.left assert @method.first.left
end end
def test_slot_starts_at_message def test_slot_starts_at_message
assert_equal :message , @method.first.left[0] assert_equal :message , @method.first.left.known_object
end end
def test_slot_gets_self def test_slot_gets_self
assert_equal :self , @method.first.left[1] assert_equal :self , @method.first.left.slots[0]
end end
def test_slot_assigns_to_local def test_slot_assigns_to_local
assert_equal :a , @method.first.left[-1] assert_equal :a , @method.first.left.slots[-1]
end end
def test_slot_assigns_something def test_slot_assigns_something
assert @method.first.right assert @method.first.right

View File

@ -25,10 +25,10 @@ module Vool
assert_equal Mom::ReturnSequence, @stats.last.class assert_equal Mom::ReturnSequence, @stats.last.class
end end
def test_slot_starts_at_message def test_slot_starts_at_message
assert_equal :message , @stats.first.left[0] assert_equal :message , @stats.first.left.known_object
end end
def test_slot_gets_return def test_slot_gets_return
assert_equal :return_value , @stats.first.left[1] assert_equal :return_value , @stats.first.left.slots[0]
end end
def test_slot_assigns_something def test_slot_assigns_something
assert @stats.first.right assert @stats.first.right