diff --git a/py/vm.c b/py/vm.c index 8ae619f9be..8a0262a841 100644 --- a/py/vm.c +++ b/py/vm.c @@ -605,8 +605,14 @@ unwind_return: case MP_BC_RAISE_VARARGS: unum = *ip++; - assert(unum == 1); - obj1 = POP(); + assert(unum <= 1); + if (unum == 0) { + // This assumes that nlr.ret_val holds last raised + // exception and is not overwritten since then. + obj1 = nlr.ret_val; + } else { + obj1 = POP(); + } nlr_jump(rt_make_raise_obj(obj1)); case MP_BC_YIELD_VALUE: diff --git a/tests/basics/try-reraise.py b/tests/basics/try-reraise.py new file mode 100644 index 0000000000..bc817fc386 --- /dev/null +++ b/tests/basics/try-reraise.py @@ -0,0 +1,12 @@ +# Re-reraising last exception with raise w/o args + +def f(): + try: + raise ValueError("val", 3) + except: + raise + +try: + f() +except ValueError as e: + print(repr(e))