summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2019-02-26 13:47:14 +1100
committerDamien George <damien.p.george@gmail.com>2019-02-26 23:52:10 +1100
commit12ce9f268909435b49f558d1d3c15ad7591d6fe8 (patch)
tree0e962e3d6d40eba1d34cdb7d6c88ea73ab1f6e02
parent823b31e5287ee96c96620dac81cfeafc889a69fd (diff)
downloadmicropython-12ce9f268909435b49f558d1d3c15ad7591d6fe8.tar.gz
micropython-12ce9f268909435b49f558d1d3c15ad7591d6fe8.zip
py/compile: Fix handling of unwinding BaseException in async with.
All exceptions that unwind through the async-with must be caught and BaseException is the top-level class, which includes Exception and others. Fixes issue #4552.
-rw-r--r--py/compile.c2
-rw-r--r--tests/basics/async_with.py10
-rw-r--r--tests/basics/async_with.py.exp3
3 files changed, 14 insertions, 1 deletions
diff --git a/py/compile.c b/py/compile.c
index 4aaa68e6ce..e660e668c4 100644
--- a/py/compile.c
+++ b/py/compile.c
@@ -1830,7 +1830,7 @@ STATIC void compile_async_with_stmt_helper(compiler_t *comp, int n, mp_parse_nod
// Detect if TOS an exception or not
EMIT(dup_top);
- EMIT_LOAD_GLOBAL(MP_QSTR_Exception);
+ EMIT_LOAD_GLOBAL(MP_QSTR_BaseException);
EMIT_ARG(binary_op, MP_BINARY_OP_EXCEPTION_MATCH);
EMIT_ARG(pop_jump_if, false, l_ret_unwind_jump); // if not an exception then we have case 3
diff --git a/tests/basics/async_with.py b/tests/basics/async_with.py
index 5af0c5d955..f7774055cf 100644
--- a/tests/basics/async_with.py
+++ b/tests/basics/async_with.py
@@ -27,3 +27,13 @@ try:
o.send(None)
except ValueError:
print('ValueError')
+
+# test raising BaseException to make sure it is handled by the async-with
+async def h():
+ async with AContext():
+ raise BaseException
+o = h()
+try:
+ o.send(None)
+except BaseException:
+ print('BaseException')
diff --git a/tests/basics/async_with.py.exp b/tests/basics/async_with.py.exp
index d00b18c969..6bbf84cb4b 100644
--- a/tests/basics/async_with.py.exp
+++ b/tests/basics/async_with.py.exp
@@ -6,3 +6,6 @@ enter
1
exit <class 'ValueError'> error
ValueError
+enter
+exit <class 'BaseException'>
+BaseException