introduce return_sequence instruction to mom
This commit is contained in:
parent
68944a0168
commit
265b25d5f4
@ -7,3 +7,4 @@ module Mom
|
|||||||
end
|
end
|
||||||
|
|
||||||
require_relative "slot_load"
|
require_relative "slot_load"
|
||||||
|
require_relative "return_sequence"
|
||||||
|
24
lib/mom/return_sequence.rb
Normal file
24
lib/mom/return_sequence.rb
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
module Mom
|
||||||
|
|
||||||
|
# The ReturnSequence models the return from a method.
|
||||||
|
#
|
||||||
|
# This involves the jump to the return address stored in the message, and
|
||||||
|
# the reinstantiation of the previous message.
|
||||||
|
#
|
||||||
|
# The machine (mom) only ever "knows" one message, the current message.
|
||||||
|
# Messages are a double linked list, calling involves going forward,
|
||||||
|
# returning means going back.
|
||||||
|
#
|
||||||
|
# The return value of the current message is transferred into the return value of the
|
||||||
|
# callers return value during the swap of messages, and just before the jump.
|
||||||
|
#
|
||||||
|
# The callers perspective of a call is the magical apperance of a return_value
|
||||||
|
# in it's message at the instruction after the call.
|
||||||
|
#
|
||||||
|
# The instruction is not parameterized as it translates to a constant
|
||||||
|
# set of lower level instructions.
|
||||||
|
#
|
||||||
|
class ReturnSequence < Instruction
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
@ -13,10 +13,10 @@ module Vool
|
|||||||
|
|
||||||
# To return form a method in mom instructions we need to do three things:
|
# To return form a method in mom instructions we need to do three things:
|
||||||
# - store the given return value, this is a SlotMove / SlotConstant
|
# - store the given return value, this is a SlotMove / SlotConstant
|
||||||
# - restore the previous message
|
# - activate return sequence (reinstantiate old message and jump to return address)
|
||||||
# - jump to the return address
|
|
||||||
def to_mom( method )
|
def to_mom( method )
|
||||||
[Mom::SlotConstant.new([:message , :return_value] , @return_value)]
|
[Mom::SlotConstant.new([:message , :return_value] , @return_value) ,
|
||||||
|
Mom::ReturnSequence.new]
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
@ -15,10 +15,16 @@ module Vool
|
|||||||
def test_slot_is_set
|
def test_slot_is_set
|
||||||
assert @stats.first.left
|
assert @stats.first.left
|
||||||
end
|
end
|
||||||
|
def test_two_instructions_are_returned
|
||||||
|
assert_equal 2 , @stats.length
|
||||||
|
end
|
||||||
|
def test_second_is_return
|
||||||
|
assert_equal Mom::ReturnSequence, @stats.last.class
|
||||||
|
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[0]
|
||||||
end
|
end
|
||||||
def test_slot_gets_self
|
def test_slot_gets_return
|
||||||
assert_equal :return_value , @stats.first.left[1]
|
assert_equal :return_value , @stats.first.left[1]
|
||||||
end
|
end
|
||||||
def test_slot_assigns_something
|
def test_slot_assigns_something
|
||||||
|
Loading…
Reference in New Issue
Block a user