forked from M-Labs/artiq
1
0
Fork 0

compiler: skip functional values in attribute writeback.

Fixes #1088.
This commit is contained in:
whitequark 2018-08-10 12:02:49 +00:00
parent 052e400f12
commit fab6e5cdff
2 changed files with 24 additions and 5 deletions

View File

@ -525,11 +525,10 @@ class LLVMIRGenerator:
print(typ) print(typ)
assert False assert False
if not (types.is_function(typ) or types.is_method(typ) or types.is_rpc(typ) or if name == "__objectid__":
name == "__objectid__"):
rpctag = b"Os" + self._rpc_tag(typ, error_handler=rpc_tag_error) + b":n"
else:
rpctag = b"" rpctag = b""
else:
rpctag = b"Os" + self._rpc_tag(typ, error_handler=rpc_tag_error) + b":n"
llrpcattrinit = ll.Constant(llrpcattrty, [ llrpcattrinit = ll.Constant(llrpcattrty, [
ll.Constant(lli32, offset), ll.Constant(lli32, offset),
@ -562,7 +561,10 @@ class LLVMIRGenerator:
offset += alignment - (offset % alignment) offset += alignment - (offset % alignment)
if types.is_instance(typ) and attr not in typ.constant_attributes: if types.is_instance(typ) and attr not in typ.constant_attributes:
llrpcattrs.append(llrpcattr_of_attr(offset, attr, attrtyp)) try:
llrpcattrs.append(llrpcattr_of_attr(offset, attr, attrtyp))
except ValueError:
continue
offset += size offset += size
@ -1267,6 +1269,8 @@ class LLVMIRGenerator:
elif ir.is_keyword(typ): elif ir.is_keyword(typ):
return b"k" + self._rpc_tag(typ.params["value"], return b"k" + self._rpc_tag(typ.params["value"],
error_handler) error_handler)
elif types.is_function(typ) or types.is_method(typ) or types.is_rpc(typ):
raise ValueError("RPC tag for functional value")
elif '__objectid__' in typ.attributes: elif '__objectid__' in typ.attributes:
return b"O" return b"O"
else: else:

View File

@ -0,0 +1,15 @@
# RUN: %python -m artiq.compiler.testbench.embedding %s
from artiq.language.core import *
from artiq.language.types import *
@kernel
def a():
pass
fns = [a, a]
@kernel
def entrypoint():
fns[0]()
fns[1]()