Torsten Rüger
f87526f86f
Class, Method and Lambda (was block) are expressions. Just making things clearer, especially for the blocks (ahem, lambdas) is matters. wip
44 lines
1.6 KiB
Ruby
44 lines
1.6 KiB
Ruby
module Parfait
|
|
|
|
# This represents the method at source code level (sis vool)
|
|
#
|
|
# Type objects are already created for args and locals, but the main attribute
|
|
# is the source, which is a Vool::Statement
|
|
#
|
|
# Classes store VoolMethods, while Types store Risc::CallableMethod
|
|
# A Type referes to a Class , but a Class (interface) is implemented by many types
|
|
# as it changes during the course of it's life. Types do not change. Objects have
|
|
# type, and so only indirectly a class.
|
|
#
|
|
class VoolMethod < Object
|
|
|
|
attr :type, :name , :args_type , :frame_type
|
|
attr_reader :source
|
|
|
|
def initialize(name , args_type , frame_type , source )
|
|
self.name = name
|
|
self.args_type = args_type
|
|
self.frame_type = frame_type
|
|
@source = source
|
|
raise "Name must be symbol" unless name.is_a?(Symbol)
|
|
raise "args_type must be type" unless args_type.is_a?(Parfait::Type)
|
|
raise "frame_type must be type" unless frame_type.is_a?(Parfait::Type)
|
|
raise "source must be vool not#{source.class}" unless source.is_a?(Vool::Statement)
|
|
raise "Empty bod" if(@source.is_a?(Vool::Statements) and @source.empty?)
|
|
end
|
|
|
|
def create_callable_method( type )
|
|
raise "create_method #{type.inspect} is not a Type" unless type.is_a? Parfait::Type
|
|
type.create_method( name , args_type , frame_type)
|
|
end
|
|
|
|
def compiler_for(self_type)
|
|
callable_method = create_callable_method(self_type)
|
|
compiler = Mom::MethodCompiler.new( callable_method )
|
|
head = @source.to_mom( compiler )
|
|
compiler.add_code(head)
|
|
compiler
|
|
end
|
|
end
|
|
end
|