rubyx/lib/register/parfait/method.rb

84 lines
2.1 KiB
Ruby
Raw Normal View History

# A Method (at runtime , sis in Parfait) is static object that primarily holds the executable
# code.
# For reflection also holds arguments and such
#
module Parfait
# static description of a method
# name
# arguments
# known local variable names
# executable code
2015-10-22 17:16:29 +02:00
# ps, the compiler injects its own info, see Register::MethodSource
class Method < Object
def initialize clazz , name , arguments
2015-05-21 20:50:17 +02:00
super()
2015-05-24 12:53:49 +02:00
raise "No class #{name}" unless clazz
self.for_class = clazz
self.name = name
self.binary = BinaryCode.new 0
raise "Wrong type, expect List not #{arguments.class}" unless arguments.is_a? List
arguments.each do |var|
raise "Must be variable argument, not #{var}" unless var.is_a? Variable
end
self.arguments = arguments
self.locals = List.new
end
attributes [:name , :source , :instructions , :binary ,:arguments , :for_class, :locals ]
# not part of the parfait model, hence ruby accessor
attr_accessor :source
# determine whether this method has an argument by the name
def has_arg name
2015-08-17 01:37:07 +02:00
raise "has_arg #{name}.#{name.class}" unless name.is_a? Symbol
2015-09-27 15:06:48 +02:00
max = self.arguments.get_length
counter = 1
while( counter <= max )
if( self.arguments.get(counter).name == name)
return counter
end
counter = counter + 1
end
return nil
end
# determine if method has a local variable or tmp (anonymous local) by given name
def has_local name
2015-08-17 01:37:07 +02:00
raise "has_local #{name}.#{name.class}" unless name.is_a? Symbol
2015-09-27 15:06:48 +02:00
max = self.locals.get_length
counter = 1
while( counter <= max )
if( self.locals.get(counter).name == name)
return counter
end
counter = counter + 1
end
return nil
end
2015-09-27 15:06:48 +02:00
def ensure_local name , type
index = has_local name
return index if index
2015-09-27 15:06:48 +02:00
var = Variable.new( type , name)
self.locals.push var
self.locals.get_length
end
2015-06-19 18:50:53 +02:00
def sof_reference_name
2015-11-14 23:35:43 +01:00
"Method: " + self.name.to_s
2015-06-19 18:50:53 +02:00
end
2015-09-27 15:06:48 +02:00
def inspect
"#{self.for_class.name}:#{name}(#{arguments.inspect})"
end
end
end