pretty much redid the variable idea (now slot)
This commit is contained in:
@ -5,7 +5,9 @@ module Ast
|
||||
class IntegerExpression < Expression
|
||||
# attr_reader :value
|
||||
def compile method , message
|
||||
Virtual::IntegerConstant.new value
|
||||
to = Virtual::Return.new(Integer)
|
||||
method.add_code Virtual::Set.new( to , Virtual::IntegerConstant.new(value))
|
||||
to
|
||||
end
|
||||
end
|
||||
|
||||
@ -34,10 +36,11 @@ module Ast
|
||||
# otherwise it's a method without args and a send is ussued.
|
||||
# this makes the namespace static, ie when eval and co are implemented method needs recompilation
|
||||
def compile method , message
|
||||
return Virtual::Self.new( Virtual::Mystery.new ) if name == :self
|
||||
return Virtual::Self.new( Virtual::Mystery ) if name == :self
|
||||
if method.has_var(name)
|
||||
message.compile_get(method , name )
|
||||
else
|
||||
raise "Unimplemented"
|
||||
message.compile_send( method , name , Virtual::Self.new( Virtual::Mystery.new ) )
|
||||
end
|
||||
end
|
||||
|
@ -1,13 +1,18 @@
|
||||
module Ast
|
||||
# assignment, like operators are really function calls
|
||||
# operators are really function calls
|
||||
|
||||
class CallSiteExpression < Expression
|
||||
# attr_reader :name, :args , :receiver
|
||||
|
||||
def compile method , message
|
||||
me = receiver.compile( method, message )
|
||||
with = args.collect{|a| a.compile( method,message)}
|
||||
message.compile_send( method , name , me , with )
|
||||
method.add_code Virtual::Set.new(Virtual::NewSelf.new, me)
|
||||
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 )
|
||||
end
|
||||
method.add_code Virtual::MessageSend.new(name) #and pass control
|
||||
Virtual::Return.new( method.return_type )
|
||||
end
|
||||
|
||||
def scratch
|
||||
|
@ -4,9 +4,9 @@ module Ast
|
||||
def compile method , message
|
||||
args = params.collect do |p|
|
||||
raise "error, arguemnt must be a identifier, not #{p}" unless p.is_a? NameExpression
|
||||
Virtual::Argument.new( p.name , Virtual::Mystery.new )
|
||||
p.name
|
||||
end
|
||||
r = receiver ? receiver.compile(method,message) : Virtual::SelfReference.new
|
||||
r = receiver ? receiver.compile(method,message) : Virtual::Self.new()
|
||||
method = Virtual::MethodDefinition.new(name , args , r )
|
||||
#frame = frame.new_frame
|
||||
return_type = nil
|
||||
|
Reference in New Issue
Block a user