forked from M-Labs/artiq
transforms.inferencer: only instantiate RPC function types, not regular.
This commit is contained in:
parent
ffd065961f
commit
8cb2215edb
|
@ -104,7 +104,7 @@ class Inferencer(algorithm.Visitor):
|
|||
]
|
||||
|
||||
attr_type = object_type.attributes[node.attr]
|
||||
if types.is_function(attr_type):
|
||||
if types.is_rpc_function(attr_type):
|
||||
attr_type = types.instantiate(attr_type)
|
||||
|
||||
self._unify(node.type, attr_type, node.loc, None,
|
||||
|
@ -112,6 +112,9 @@ class Inferencer(algorithm.Visitor):
|
|||
elif types.is_instance(object_type) and \
|
||||
node.attr in object_type.constructor.attributes:
|
||||
attr_type = object_type.constructor.attributes[node.attr].find()
|
||||
if types.is_rpc_function(attr_type):
|
||||
attr_type = types.instantiate(attr_type)
|
||||
|
||||
if types.is_function(attr_type):
|
||||
# Convert to a method.
|
||||
if len(attr_type.args) < 1:
|
||||
|
@ -140,7 +143,7 @@ class Inferencer(algorithm.Visitor):
|
|||
makenotes=makenotes,
|
||||
when=" while inferring the type for self argument")
|
||||
|
||||
attr_type = types.TMethod(object_type, types.instantiate(attr_type))
|
||||
attr_type = types.TMethod(object_type, attr_type)
|
||||
|
||||
if not types.is_var(attr_type):
|
||||
self._unify(node.type, attr_type,
|
||||
|
@ -794,6 +797,9 @@ class Inferencer(algorithm.Visitor):
|
|||
typ_ret = typ.ret
|
||||
else:
|
||||
typ = types.get_method_function(typ)
|
||||
if types.is_var(typ):
|
||||
return # not enough info yet
|
||||
|
||||
typ_arity = typ.arity() - 1
|
||||
typ_args = OrderedDict(list(typ.args.items())[1:])
|
||||
typ_optargs = typ.optargs
|
||||
|
|
|
@ -641,11 +641,11 @@ def is_method(typ):
|
|||
|
||||
def get_method_self(typ):
|
||||
if is_method(typ):
|
||||
return typ.find().params["self"]
|
||||
return typ.find().params["self"].find()
|
||||
|
||||
def get_method_function(typ):
|
||||
if is_method(typ):
|
||||
return typ.find().params["fn"]
|
||||
return typ.find().params["fn"].find()
|
||||
|
||||
def is_value(typ):
|
||||
return isinstance(typ.find(), TValue)
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
from artiq.language.core import *
|
||||
from artiq.language.types import *
|
||||
|
||||
# CHECK-L: call ()->NoneType delay('b) %local.testbench.entrypoint ; calls testbench.entrypoint
|
||||
# CHECK-L: call ()->NoneType %local.testbench.entrypoint ; calls testbench.entrypoint
|
||||
|
||||
@kernel
|
||||
def baz():
|
||||
|
|
|
@ -15,5 +15,5 @@ c.a
|
|||
# CHECK-L: .f:()->NoneType delay('b)
|
||||
c.f
|
||||
|
||||
# CHECK-L: .m:method(fn=(self:<instance c>)->NoneType delay('d), self=<instance c>)
|
||||
# CHECK-L: .m:method(fn=(self:<instance c>)->NoneType delay('c), self=<instance c>)
|
||||
c().m()
|
||||
|
|
Loading…
Reference in New Issue