rubyx/lib/phisol/compiler/function_definition.rb

52 lines
1.5 KiB
Ruby
Raw Normal View History

2015-10-07 14:22:47 +02:00
module Phisol
Compiler.class_eval do
def on_function statement
#puts statement.inspect
return_type , name , parameters, kids , receiver = *statement
name = name.to_a.first
args = parameters.to_a.collect do |p|
2015-09-20 15:30:07 +02:00
raise "error, argument must be a identifier, not #{p}" unless p.type == :parameter
2015-09-27 15:06:48 +02:00
Parfait::Variable.new( *p)
2014-07-16 12:20:47 +02:00
end
2015-09-20 16:33:05 +02:00
if receiver
2015-07-19 12:31:13 +02:00
# compiler will always return slot. with known value or not
2015-09-20 16:33:05 +02:00
r = receiver.first
if( r.is_a? Parfait::Class )
2015-07-19 12:31:13 +02:00
class_name = r.value.name
else
2015-09-20 16:33:05 +02:00
if( r != :self)
raise "unimplemented case in function #{r}"
else
r = Virtual::Self.new()
class_name = method.for_class.name
end
end
else
r = @clazz
class_name = @clazz.name
end
raise "Already in method #{@method}" if @method
@method = @clazz.get_instance_method( name )
if(@method)
puts "Warning, redefining method #{name}" unless name == :main
#TODO check args / type compatibility
@method.source.init @method
else
@method = Virtual::MethodSource.create_method(class_name, return_type, name , args )
@method.for_class.add_instance_method @method
end
@method.source.receiver = r
puts "compile method #{@method.name}"
2015-06-01 16:31:35 +02:00
kids.to_a.each do |ex|
2015-10-14 13:02:34 +02:00
ret = process(ex)
raise ret.inspect if ret.is_a? Virtual::Instruction
end
@method = nil
Virtual::Return.new(return_type)
2014-07-14 10:29:38 +02:00
end
end
end