compiler.embedding: always do one final inference pass.

Fixes #477.
This commit is contained in:
whitequark 2016-06-16 14:18:43 +00:00
parent 26117e8d93
commit c0e42bbfc8
2 changed files with 25 additions and 0 deletions

View File

@ -613,6 +613,11 @@ class Stitcher:
break break
old_typedtree_hash = typedtree_hash old_typedtree_hash = typedtree_hash
# When we have an excess of type information, sometimes we can infer every type
# in the AST without discovering every referenced attribute of host objects, so
# do one last pass unconditionally.
inferencer.visit(self.typedtree)
# After we have found all functions, synthesize a module to hold them. # After we have found all functions, synthesize a module to hold them.
source_buffer = source.Buffer("", "<synthesized>") source_buffer = source.Buffer("", "<synthesized>")
self.typedtree = asttyped.ModuleT( self.typedtree = asttyped.ModuleT(

View File

@ -0,0 +1,20 @@
# RUN: %python -m artiq.compiler.testbench.embedding %s
from artiq.experiment import *
class MyClass:
def __init__(self, **kwargs):
for k, v in kwargs.items():
setattr(self, k, v)
sl = [MyClass(x=1), MyClass(x=2)]
@kernel
def bug(l):
for c in l:
print(c.x)
@kernel
def entrypoint():
bug(sl)