module Phisol 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 return Register.self_reg(@clazz.name ) if(name == :self) # either an argument, so it's stored in message if( index = @method.has_arg(name)) ret = use_reg @method.arguments[index].type @method.source.add_code Register.get_slot(statement , :message , index , ret ) return ret else # or a local so it is in the frame index = @method.has_local( name ) if(index) ret = use_reg @method.locals[index].type @method.source.add_code Register.get_slot(statement , :frame , index , ret ) return ret end end raise "must define variable #{name} before using it" end end #module end