summaryrefslogtreecommitdiffstatshomepage
path: root/py
diff options
context:
space:
mode:
Diffstat (limited to 'py')
-rw-r--r--py/emitnative.c9
-rw-r--r--py/nativeglue.c7
-rw-r--r--py/runtime.h2
3 files changed, 14 insertions, 4 deletions
diff --git a/py/emitnative.c b/py/emitnative.c
index 0721636185..ad89fb845f 100644
--- a/py/emitnative.c
+++ b/py/emitnative.c
@@ -1824,7 +1824,14 @@ STATIC void emit_native_setup_finally(emit_t *emit, mp_uint_t label) {
}
STATIC void emit_native_end_finally(emit_t *emit) {
- emit_pre_pop_discard(emit);
+ // logic:
+ // exc = pop_stack
+ // if exc == None: pass
+ // else: raise exc
+ // the check if exc is None is done in the MP_F_NATIVE_RAISE stub
+ vtype_kind_t vtype;
+ emit_pre_pop_reg(emit, &vtype, REG_ARG_1);
+ emit_call(emit, MP_F_NATIVE_RAISE);
emit_post(emit);
}
diff --git a/py/nativeglue.c b/py/nativeglue.c
index d52eeaeaa5..43e7d699ff 100644
--- a/py/nativeglue.c
+++ b/py/nativeglue.c
@@ -80,8 +80,11 @@ mp_obj_t mp_native_call_function_n_kw(mp_obj_t fun_in, mp_uint_t n_args_kw, cons
}
// wrapper that makes raise obj and raises it
-NORETURN void mp_native_raise(mp_obj_t o) {
- nlr_raise(mp_make_raise_obj(o));
+// END_FINALLY opcode requires that we don't raise if o==None
+void mp_native_raise(mp_obj_t o) {
+ if (o != mp_const_none) {
+ nlr_raise(mp_make_raise_obj(o));
+ }
}
// these must correspond to the respective enum in runtime0.h
diff --git a/py/runtime.h b/py/runtime.h
index ce87bf07bc..1216462b25 100644
--- a/py/runtime.h
+++ b/py/runtime.h
@@ -119,7 +119,7 @@ NORETURN void mp_not_implemented(const char *msg);
mp_uint_t mp_convert_obj_to_native(mp_obj_t obj, mp_uint_t type);
mp_obj_t mp_convert_native_to_obj(mp_uint_t val, mp_uint_t type);
mp_obj_t mp_native_call_function_n_kw(mp_obj_t fun_in, mp_uint_t n_args_kw, const mp_obj_t *args);
-NORETURN void mp_native_raise(mp_obj_t o);
+void mp_native_raise(mp_obj_t o);
extern struct _mp_obj_list_t mp_sys_path_obj;
extern struct _mp_obj_list_t mp_sys_argv_obj;