refoactor call site some
This commit is contained in:
parent
224670e449
commit
395fd2d701
@ -1,5 +1,7 @@
|
|||||||
module Typed
|
module Typed
|
||||||
class CallSite < Expression
|
module Tree
|
||||||
attr_accessor :name , :receiver , :arguments
|
class CallSite < Expression
|
||||||
|
attr_accessor :name , :receiver , :arguments
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -117,7 +117,7 @@ module Typed
|
|||||||
|
|
||||||
def on_call statement
|
def on_call statement
|
||||||
name_s , arguments , receiver = *statement
|
name_s , arguments , receiver = *statement
|
||||||
w = CallSite.new()
|
w = Tree::CallSite.new()
|
||||||
w.name = name_s.children.first
|
w.name = name_s.children.first
|
||||||
w.arguments = process_all(arguments)
|
w.arguments = process_all(arguments)
|
||||||
w.receiver = process(receiver)
|
w.receiver = process(receiver)
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
require_relative "compiler/name_expression"
|
["call_site", "name_expression"].each do |mod|
|
||||||
|
require_relative "compiler/" + mod
|
||||||
|
end
|
||||||
|
|
||||||
module Typed
|
module Typed
|
||||||
# Compiling is the conversion of the AST into 2 things:
|
# Compiling is the conversion of the AST into 2 things:
|
||||||
@ -40,6 +42,7 @@ module Typed
|
|||||||
|
|
||||||
class Compiler
|
class Compiler
|
||||||
include NameExpression
|
include NameExpression
|
||||||
|
include CallSite
|
||||||
|
|
||||||
def initialize( method = nil )
|
def initialize( method = nil )
|
||||||
@regs = []
|
@regs = []
|
||||||
@ -183,7 +186,6 @@ require_relative "ast_helper"
|
|||||||
require_relative "ast/code"
|
require_relative "ast/code"
|
||||||
require_relative "compiler/assignment"
|
require_relative "compiler/assignment"
|
||||||
require_relative "compiler/basic_values"
|
require_relative "compiler/basic_values"
|
||||||
require_relative "compiler/call_site"
|
|
||||||
require_relative "compiler/class_field"
|
require_relative "compiler/class_field"
|
||||||
require_relative "compiler/class_statement"
|
require_relative "compiler/class_statement"
|
||||||
require_relative "compiler/collections"
|
require_relative "compiler/collections"
|
||||||
|
@ -1,26 +1,15 @@
|
|||||||
module Typed
|
module Typed
|
||||||
Compiler.class_eval do
|
module CallSite
|
||||||
|
|
||||||
def on_CallSite statement
|
def on_CallSite( statement )
|
||||||
#puts statement
|
|
||||||
# name_s , arguments , receiver = *statement
|
# name_s , arguments , receiver = *statement
|
||||||
raise "not inside method " unless @method
|
raise "not inside method " unless @method
|
||||||
reset_regs
|
reset_regs
|
||||||
#move the new message (that we need to populate to make a call) to std register
|
#move the new message (that we need to populate to make a call) to std register
|
||||||
new_message = Register.resolve_to_register(:new_message)
|
new_message = Register.resolve_to_register(:new_message)
|
||||||
add_code Register.get_slot(statement, :message , :next_message , new_message )
|
add_code Register.get_slot(statement, :message , :next_message , new_message )
|
||||||
if statement.receiver
|
me = get_me( statement )
|
||||||
me = process( statement.receiver )
|
clazz = get_clazz(me)
|
||||||
else
|
|
||||||
me = use_reg @method.for_class.name
|
|
||||||
add_code Register.get_slot(statement, :message , :receiver , me )
|
|
||||||
end
|
|
||||||
if(me.type == :MetaClass)
|
|
||||||
clazz = me.value.meta
|
|
||||||
else
|
|
||||||
# now we have to resolve the method name (+ receiver) into a callable method
|
|
||||||
clazz = Register.machine.space.get_class_by_name(me.type)
|
|
||||||
end
|
|
||||||
# move our receiver there
|
# move our receiver there
|
||||||
add_code Register.set_slot( statement , me , :new_message , :receiver)
|
add_code Register.set_slot( statement , me , :new_message , :receiver)
|
||||||
|
|
||||||
@ -35,6 +24,25 @@ module Typed
|
|||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
def get_me( statement )
|
||||||
|
if statement.receiver
|
||||||
|
me = process( statement.receiver )
|
||||||
|
else
|
||||||
|
me = use_reg @method.for_class.name
|
||||||
|
add_code Register.get_slot(statement, :message , :receiver , me )
|
||||||
|
end
|
||||||
|
me
|
||||||
|
end
|
||||||
|
def get_clazz( me )
|
||||||
|
if(me.type == :MetaClass)
|
||||||
|
clazz = me.value.meta
|
||||||
|
else
|
||||||
|
# now we have to resolve the method name (+ receiver) into a callable method
|
||||||
|
clazz = Register.machine.space.get_class_by_name(me.type)
|
||||||
|
end
|
||||||
|
clazz
|
||||||
|
end
|
||||||
def do_call clazz , statement
|
def do_call clazz , statement
|
||||||
name = statement.name
|
name = statement.name
|
||||||
#puts "clazz #{clazz.name}"
|
#puts "clazz #{clazz.name}"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user