py/emitnative: Cancel caught exception once handled to prevent reraise.

The native emitter keeps the current exception in a slot in its C stack
(instead of on its Python value stack), so when it catches an exception it
must explicitly clear that slot so the same exception is not reraised later
on.
pull/1/head
Damien George 2018-09-03 17:41:02 +10:00
parent b735208403
commit 3cd2c281d7
2 changed files with 16 additions and 1 deletions

View File

@ -1892,7 +1892,9 @@ STATIC void emit_native_pop_block(emit_t *emit) {
}
STATIC void emit_native_pop_except(emit_t *emit) {
(void)emit;
// Cancel any active exception so subsequent handlers don't see it
ASM_MOV_REG_IMM(emit->as, REG_TEMP0, (mp_uint_t)mp_const_none);
ASM_MOV_LOCAL_REG(emit->as, LOCAL_IDX_EXC_VAL(emit), REG_TEMP0);
}
STATIC void emit_native_unary_op(emit_t *emit, mp_unary_op_t op) {

View File

@ -69,3 +69,16 @@ try: # top-level catch-all except to not fail script
except:
print("catch-all except")
print()
# case where a try-except within a finally cancels the exception
print("exc-finally-subexcept")
try:
print("try1")
finally:
try:
print("try2")
foo
except:
print("except2")
print("finally1")
print()