getting the passes back and starting on send
This commit is contained in:
@ -5,7 +5,7 @@ module Ast
|
||||
class IntegerExpression < Expression
|
||||
# attr_reader :value
|
||||
def compile method , message
|
||||
to = Virtual::Return.new(Integer)
|
||||
to = Virtual::Return.new(Virtual::Integer)
|
||||
method.add_code Virtual::Set.new( to , Virtual::IntegerConstant.new(value))
|
||||
to
|
||||
end
|
||||
@ -41,7 +41,7 @@ module Ast
|
||||
message.compile_get(method , name )
|
||||
else
|
||||
raise "Unimplemented"
|
||||
message.compile_send( method , name , Virtual::Self.new( Virtual::Mystery.new ) )
|
||||
message.compile_send( method , name , Virtual::Self.new( Virtual::Mystery ) )
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -99,7 +99,7 @@ module Ast
|
||||
class VariableExpression < NameExpression
|
||||
def compile method , message
|
||||
method.add_code Virtual::ObjectGet.new(name)
|
||||
Virtual::Return.new( Virtual::Mystery.new )
|
||||
Virtual::Return.new( Virtual::Mystery )
|
||||
end
|
||||
end
|
||||
end
|
@ -6,7 +6,8 @@ module Ast
|
||||
|
||||
def compile method , message
|
||||
me = receiver.compile( method, message )
|
||||
method.add_code Virtual::Set.new(Virtual::NewSelf.new, me)
|
||||
method.add_code Virtual::Set.new(Virtual::NewSelf.new(me.type), me)
|
||||
method.add_code Virtual::Set.new(Virtual::NewName.new(), name)
|
||||
args.each_with_index do |arg , i|
|
||||
val = arg.compile( method, message) #compile in the running method, ie before passing control
|
||||
method.add_code Virtual::Set.new(Virtual::NewMessageSlot.new(i ,val.type ) , val )
|
||||
|
13
lib/trickle/send.rb
Normal file
13
lib/trickle/send.rb
Normal file
@ -0,0 +1,13 @@
|
||||
module Trickle
|
||||
# This implements the send logic
|
||||
# Send is so complicated that we actually code it in ruby and stick it in
|
||||
# That off course opens up an endless loop possibility that we stop by reducing to Class and Module methods
|
||||
class Send
|
||||
def run block
|
||||
block.codes.dup.each do |code|
|
||||
next unless code.is_a? MessageSend
|
||||
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
@ -33,6 +33,14 @@ module Virtual
|
||||
self
|
||||
end
|
||||
|
||||
# replace a code with an array of new codes. This is what happens in passes all the time
|
||||
def replace_with code , new_codes
|
||||
index = @codes.index code
|
||||
raise "Code not found #{code} in #{self}" unless index
|
||||
@codes.delete_at(index)
|
||||
@codes.insert(index , *new_codes)
|
||||
end
|
||||
|
||||
# returns if this is a block that ends in a call (and thus needs local variable handling)
|
||||
def call_block?
|
||||
return false unless codes.last.is_a?(CallInstruction)
|
||||
|
@ -11,6 +11,9 @@ module Virtual
|
||||
class Slot < Value
|
||||
RETURN = 0
|
||||
SELF = 1
|
||||
FRAME = 2
|
||||
NAME = 3
|
||||
MESSAGE_PAYLOAD = 4
|
||||
|
||||
attr_accessor :index , :type
|
||||
private #abstract base class
|
||||
@ -22,7 +25,7 @@ module Virtual
|
||||
|
||||
class MessageSlot < Slot
|
||||
def initialize index , type = Mystery
|
||||
super
|
||||
super(index + MESSAGE_PAYLOAD ,type)
|
||||
end
|
||||
end
|
||||
class FrameSlot < Slot
|
||||
@ -37,28 +40,39 @@ module Virtual
|
||||
end
|
||||
class NewMessageSlot < Slot
|
||||
def initialize index , type = Mystery
|
||||
super
|
||||
super(index + MESSAGE_PAYLOAD , type)
|
||||
end
|
||||
end
|
||||
|
||||
class Return < MessageSlot
|
||||
def initialize type = Mystery
|
||||
super( RETURN , type )
|
||||
end
|
||||
end
|
||||
class NewReturn < NewMessageSlot
|
||||
def initialize type = Mystery
|
||||
super( RETURN , type )
|
||||
super( RETURN - MESSAGE_PAYLOAD, type )
|
||||
end
|
||||
end
|
||||
class Self < MessageSlot
|
||||
def initialize type = Mystery
|
||||
super( SELF , type )
|
||||
super( SELF - MESSAGE_PAYLOAD , type )
|
||||
end
|
||||
end
|
||||
class Name < MessageSlot
|
||||
def initialize type = Mystery
|
||||
super( NAME - MESSAGE_PAYLOAD , type )
|
||||
end
|
||||
end
|
||||
|
||||
class NewReturn < NewMessageSlot
|
||||
def initialize type = Mystery
|
||||
super( RETURN - MESSAGE_PAYLOAD, type )
|
||||
end
|
||||
end
|
||||
class NewSelf < NewMessageSlot
|
||||
def initialize type = Mystery
|
||||
super( SELF , type )
|
||||
super( SELF - MESSAGE_PAYLOAD , type )
|
||||
end
|
||||
end
|
||||
class NewName < NewMessageSlot
|
||||
def initialize type = Mystery
|
||||
super( NAME - MESSAGE_PAYLOAD , type )
|
||||
end
|
||||
end
|
||||
|
||||
|
Reference in New Issue
Block a user