bd171d091a
index_length changes index a bit but from now on changes to layouts should push the index automatically just have to set the index while calling now
35 lines
1.3 KiB
Ruby
35 lines
1.3 KiB
Ruby
module Soml
|
|
Compiler.class_eval do
|
|
|
|
# attr_reader :name
|
|
# compiling name needs to check if it's a variable and if so resolve it
|
|
# otherwise it's a method without args and a send is issued.
|
|
# whichever way this goes the result is stored in the return slot (as all compiles)
|
|
def on_name statement
|
|
name = statement.to_a.first
|
|
if( name == :self)
|
|
ret = use_reg @clazz.name
|
|
add_code Register.get_slot(statement , :message , :receiver , ret )
|
|
return ret
|
|
end
|
|
# either an argument, so it's stored in message
|
|
if( index = @method.has_arg(name))
|
|
ret = use_reg @method.arguments[index].type
|
|
add_code Register.get_slot(statement , :message , Parfait::Message.get_indexed(index), ret )
|
|
return ret
|
|
else # or a local so it is in the frame
|
|
index = @method.has_local( name )
|
|
if(index)
|
|
frame = use_reg :Frame
|
|
add_code Register.get_slot(statement , :message , :frame , frame )
|
|
ret = use_reg @method.locals[index].type
|
|
add_code Register.get_slot(statement , frame , Parfait::Frame.get_indexed(index), ret )
|
|
return ret
|
|
end
|
|
end
|
|
raise "must define variable #{name} before using it"
|
|
end
|
|
|
|
end #module
|
|
end
|