rubyx/lib/vool/statements/method_statement.rb

60 lines
1.5 KiB
Ruby
Raw Normal View History

2017-04-01 15:27:32 +02:00
module Vool
2017-04-08 16:22:53 +02:00
class MethodStatement < Statement
attr_reader :name, :args , :body , :clazz
2017-04-01 15:27:32 +02:00
def initialize( name , args , body)
@name , @args , @body = name , args , body
unless( body.is_a?(ScopeStatement))
@body = ScopeStatement.new([])
@body.statements << body if body
end
end
# compile to mom instructions. methods themselves do no result in instructions (yet)
# instead the resulting instruction tree is saved into the method object that
# represents the method
def to_mom( _ )
method = @clazz.get_method( @name )
@body.to_mom(method)
2017-04-01 15:27:32 +02:00
end
2017-04-08 11:10:42 +02:00
def collect(arr)
2017-04-08 16:22:53 +02:00
@body.collect(arr)
2017-04-08 11:10:42 +02:00
super
end
2017-04-08 16:22:53 +02:00
def set_class(clazz)
@clazz = clazz
end
def create_objects
args_type = make_type
locals_type = make_locals
2017-12-10 19:47:26 +01:00
method = Parfait::VoolMethod.new(name , args_type , locals_type , body )
2017-04-08 16:22:53 +02:00
@clazz.add_method( method )
typed_method = method.create_parfait_method(clazz.instance_type)
compiler = Risc::MethodCompiler.new( typed_method ).init_method
head = @body.to_mom( method ).flatten
head.to_risc(compiler)
2017-04-08 16:22:53 +02:00
end
private
def make_type( )
type_hash = {}
2017-04-09 09:14:28 +02:00
@args.each {|arg| type_hash[arg] = :Object }
2017-04-08 16:22:53 +02:00
Parfait::NamedList.type_for( type_hash )
end
def make_locals
type_hash = {}
vars = []
@body.collect([]).each { |node| node.add_local(vars) }
vars.each { |var| type_hash[var] = :Object }
2017-04-08 16:22:53 +02:00
Parfait::NamedList.type_for( type_hash )
end
2017-04-01 15:27:32 +02:00
end
end