rubyx/lib/parfait/vool_method.rb

44 lines
1.6 KiB
Ruby
Raw Normal View History

2017-12-10 19:47:26 +01:00
module Parfait
2017-12-10 19:47:26 +01:00
# 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 CallableMethod
2017-12-10 19:47:26 +01:00
# 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
2018-08-12 13:48:20 +02:00
attr :type, :name , :args_type , :frame_type
attr_reader :source
2018-03-14 15:54:47 +01:00
def initialize(name , args_type , frame_type , source )
self.name = name
self.args_type = args_type
self.frame_type = frame_type
2018-08-12 13:48:20 +02:00
@source = source
2017-01-16 16:44:34 +01:00
raise "Name must be symbol" unless name.is_a?(Symbol)
raise "args_type must be type" unless args_type.is_a?(Parfait::Type)
2018-03-14 15:54:47 +01:00
raise "frame_type must be type" unless frame_type.is_a?(Parfait::Type)
2017-12-10 19:47:26 +01:00
raise "source must be vool" unless source.is_a?(Vool::Statement)
2018-08-12 13:48:20 +02:00
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 = Risc::MethodCompiler.new( callable_method )
2018-08-12 13:48:20 +02:00
head = @source.to_mom( compiler )
2018-06-27 16:09:50 +02:00
compiler.add_mom(head)
compiler
2018-06-27 16:09:50 +02:00
end
end
end