function docs improvements

This commit is contained in:
Torsten Ruger 2018-11-14 12:41:13 +02:00
parent fb6a1a0e01
commit 5015a11108
5 changed files with 20 additions and 4 deletions

View File

@ -31,6 +31,9 @@ module Mom
def to_s def to_s
"ArgumentTransfer " + ([@receiver] + @arguments).join(",") "ArgumentTransfer " + ([@receiver] + @arguments).join(",")
end end
# load receiver and then each arg into the new message
# delegates to SlotLoad for receiver and to the actual args.to_risc
def to_risc(compiler) def to_risc(compiler)
transfer = SlotLoad.new([:message , :next_message , :receiver] , @receiver, self).to_risc(compiler) transfer = SlotLoad.new([:message , :next_message , :receiver] , @receiver, self).to_risc(compiler)
compiler.reset_regs compiler.reset_regs

View File

@ -4,9 +4,10 @@ module Mom
# Ie: MessageSetup,ArgumentTransfer,SimpleCall # Ie: MessageSetup,ArgumentTransfer,SimpleCall
# #
# MessageSetup does Setup before a call can be made, acquiring and filling the message # MessageSetup does Setup before a call can be made, acquiring and filling the message
# basically.Only after MessageSetup is the next_message safe to use. # basically. Only after MessageSetup is the next_message safe to use.
# #
# The Space keeps a linked list of Messages, from which we take and currenty also return. # The Factory (instane kept by Space) keeps a linked list of Messages,
# from which we take and currenty also return.
# #
# Message setup set the name to the called method's name, and also set the arg and local # Message setup set the name to the called method's name, and also set the arg and local
# types on the new message, currently for debugging but later for dynamic checking # types on the new message, currently for debugging but later for dynamic checking

View File

@ -17,6 +17,7 @@ module Mom
def to_s def to_s
"SimpleCall #{@method.name}" "SimpleCall #{@method.name}"
end end
# Calling a Method is basically jumping to the Binary (+ offset). # Calling a Method is basically jumping to the Binary (+ offset).
# We just swap in the new message and go. # We just swap in the new message and go.
# #

View File

@ -25,7 +25,9 @@ module Mom
# original_source: optinally another mom instruction that wil be passed down to created # original_source: optinally another mom instruction that wil be passed down to created
# risc instructions. (Because SlotLoad is often used internally in mom) # risc instructions. (Because SlotLoad is often used internally in mom)
class SlotLoad < Instruction class SlotLoad < Instruction
attr_reader :left , :right , :original_source attr_reader :left , :right , :original_source
def initialize(left , right, original_source = nil) def initialize(left , right, original_source = nil)
@left , @right = left , right @left , @right = left , right
@left = SlotDefinition.new(@left.shift , @left) if @left.is_a? Array @left = SlotDefinition.new(@left.shift , @left) if @left.is_a? Array
@ -38,6 +40,9 @@ module Mom
"SlotLoad #{right} -> #{left}" "SlotLoad #{right} -> #{left}"
end end
# resolve the SlotLoad to the respective risc Instructions.
# calls sym_to_risc for most (symbols), and ConstantLoad for CacheEntry
# after loading the right into register
def to_risc(compiler) def to_risc(compiler)
const_reg = @right.to_register(compiler , original_source) const_reg = @right.to_register(compiler , original_source)
left_slots = @left.slots left_slots = @left.slots
@ -54,6 +59,11 @@ module Mom
compiler.reset_regs compiler.reset_regs
end end
# load the data in const_reg into the slot that is named by left symbols
# left may usually be only 3 long, as the first is known, then the second is loaded
# with type known type (as it comes from message)
#
# actual lifting is done by RegisterValue resolve_and_add
def sym_to_risc(compiler , const_reg) def sym_to_risc(compiler , const_reg)
left_slots = @left.slots.dup left_slots = @left.slots.dup
raise "Not Message #{object}" unless @left.known_object == :message raise "Not Message #{object}" unless @left.known_object == :message

View File

@ -5,11 +5,12 @@ module Mains
include Risc::Ticker include Risc::Ticker
def setup def setup
@string_input = as_main("a = 98 ; while(a>0) ; a = a - 1 ; end ; return a") @string_input = as_main("a = 1011 ; while(a>0) ; a = a - 1 ; end ; return a")
super super
end end
def test_chain # max 98 iterations on 300 integers def test_chain # max 1011 iterations on 1014 integers (1024 - 10 reserve)
run_all run_all
assert_equal Fixnum , get_return.class , " "
assert_equal 0 , get_return , " " assert_equal 0 , get_return , " "
end end