forked from M-Labs/artiq
compiler: handle async RPC as last statement in try block.
Fixes #1107.
This commit is contained in:
parent
10d0c6df00
commit
0982c965b1
|
@ -1339,6 +1339,12 @@ class LLVMIRGenerator:
|
|||
self.llbuilder.call(self.llbuiltin("llvm.stackrestore"), [llstackptr])
|
||||
|
||||
if fun_type.async:
|
||||
# If this RPC is called using an `invoke` ARTIQ IR instruction, there will be
|
||||
# no other instructions in this basic block. Since this RPC is async, it cannot
|
||||
# possibly raise an exception, so add an explicit jump to the normal successor.
|
||||
if llunwindblock:
|
||||
self.llbuilder.branch(llnormalblock)
|
||||
|
||||
return ll.Undefined
|
||||
|
||||
# T result = {
|
||||
|
|
|
@ -221,6 +221,17 @@ class _RPCCalls(EnvExperiment):
|
|||
def builtin(self):
|
||||
sleep(1.0)
|
||||
|
||||
@rpc(flags={"async"})
|
||||
def async_rpc(self):
|
||||
pass
|
||||
|
||||
@kernel
|
||||
def async_in_try(self):
|
||||
try:
|
||||
self.async_rpc()
|
||||
except ValueError:
|
||||
pass
|
||||
|
||||
|
||||
class RPCCallsTest(ExperimentCase):
|
||||
def test_args(self):
|
||||
|
@ -237,6 +248,7 @@ class RPCCallsTest(ExperimentCase):
|
|||
self.assertTrue((exp.numpy_full() == numpy.full(10, 20)).all())
|
||||
self.assertTrue(numpy.isnan(exp.numpy_nan()).all())
|
||||
exp.builtin()
|
||||
exp.async_in_try()
|
||||
|
||||
|
||||
class _Annotation(EnvExperiment):
|
||||
|
|
Loading…
Reference in New Issue