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
parent
b735208403
commit
3cd2c281d7
|
@ -1892,7 +1892,9 @@ STATIC void emit_native_pop_block(emit_t *emit) {
|
||||||
}
|
}
|
||||||
|
|
||||||
STATIC void emit_native_pop_except(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) {
|
STATIC void emit_native_unary_op(emit_t *emit, mp_unary_op_t op) {
|
||||||
|
|
|
@ -69,3 +69,16 @@ try: # top-level catch-all except to not fail script
|
||||||
except:
|
except:
|
||||||
print("catch-all except")
|
print("catch-all except")
|
||||||
print()
|
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()
|
||||||
|
|
Loading…
Reference in New Issue