diff --git a/Python/bytecodes.c b/Python/bytecodes.c index d3e242b81e608d..e5769f61fc28d0 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -505,27 +505,24 @@ dummy_func( ERROR_IF(res == NULL, error); } - // This should remain a legacy instruction. - inst(RAISE_VARARGS) { + inst(RAISE_VARARGS, (args[oparg] -- )) { PyObject *cause = NULL, *exc = NULL; switch (oparg) { case 2: - cause = POP(); /* cause */ + cause = args[1]; /* fall through */ case 1: - exc = POP(); /* exc */ + exc = args[0]; /* fall through */ case 0: - if (do_raise(tstate, exc, cause)) { - goto exception_unwind; - } + ERROR_IF(do_raise(tstate, exc, cause), exception_unwind); break; default: _PyErr_SetString(tstate, PyExc_SystemError, "bad RAISE_VARARGS oparg"); break; } - goto error; + ERROR_IF(true, error); } inst(INTERPRETER_EXIT, (retval --)) { diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h index 7d3396ad6bdec3..287a1f1f042089 100644 --- a/Python/generated_cases.c.h +++ b/Python/generated_cases.c.h @@ -689,25 +689,24 @@ } TARGET(RAISE_VARARGS) { + PyObject **args = &PEEK(oparg); PyObject *cause = NULL, *exc = NULL; switch (oparg) { case 2: - cause = POP(); /* cause */ + cause = args[1]; /* fall through */ case 1: - exc = POP(); /* exc */ + exc = args[0]; /* fall through */ case 0: - if (do_raise(tstate, exc, cause)) { - goto exception_unwind; - } + if (do_raise(tstate, exc, cause)) { STACK_SHRINK(oparg); goto exception_unwind; } break; default: _PyErr_SetString(tstate, PyExc_SystemError, "bad RAISE_VARARGS oparg"); break; } - goto error; + if (true) { STACK_SHRINK(oparg); goto error; } } TARGET(INTERPRETER_EXIT) { diff --git a/Python/opcode_metadata.h b/Python/opcode_metadata.h index 46fd9673e8fb64..cca86629e48d16 100644 --- a/Python/opcode_metadata.h +++ b/Python/opcode_metadata.h @@ -2,6 +2,7 @@ // from Python/bytecodes.c // Do not edit! +#ifndef NDEBUG static int _PyOpcode_num_popped(int opcode, int oparg) { switch(opcode) { @@ -86,7 +87,7 @@ _PyOpcode_num_popped(int opcode, int oparg) { case CALL_INTRINSIC_1: return 1; case RAISE_VARARGS: - return -1; + return oparg; case INTERPRETER_EXIT: return 1; case RETURN_VALUE: @@ -345,7 +346,9 @@ _PyOpcode_num_popped(int opcode, int oparg) { Py_UNREACHABLE(); } } +#endif +#ifndef NDEBUG static int _PyOpcode_num_pushed(int opcode, int oparg) { switch(opcode) { @@ -430,7 +433,7 @@ _PyOpcode_num_pushed(int opcode, int oparg) { case CALL_INTRINSIC_1: return 1; case RAISE_VARARGS: - return -1; + return 0; case INTERPRETER_EXIT: return 0; case RETURN_VALUE: @@ -689,6 +692,7 @@ _PyOpcode_num_pushed(int opcode, int oparg) { Py_UNREACHABLE(); } } +#endif enum Direction { DIR_NONE, DIR_READ, DIR_WRITE }; enum InstructionFormat { INSTR_FMT_IB, INSTR_FMT_IBC, INSTR_FMT_IBC0, INSTR_FMT_IBC000, INSTR_FMT_IBIB, INSTR_FMT_IX, INSTR_FMT_IXC, INSTR_FMT_IXC000 }; struct opcode_metadata { diff --git a/Tools/cases_generator/generate_cases.py b/Tools/cases_generator/generate_cases.py index 3e2ddaaf20063b..b7942410c82fc3 100644 --- a/Tools/cases_generator/generate_cases.py +++ b/Tools/cases_generator/generate_cases.py @@ -774,7 +774,8 @@ def write_stack_effect_functions(self) -> None: pushed_data.append( (instr, pushed) ) def write_function(direction: str, data: list[tuple[Instruction, str]]) -> None: - self.out.emit("\nstatic int"); + self.out.emit("\n#ifndef NDEBUG"); + self.out.emit("static int"); self.out.emit(f"_PyOpcode_num_{direction}(int opcode, int oparg) {{") self.out.emit(" switch(opcode) {"); for instr, effect in data: @@ -784,6 +785,7 @@ def write_function(direction: str, data: list[tuple[Instruction, str]]) -> None: self.out.emit(" Py_UNREACHABLE();") self.out.emit(" }") self.out.emit("}") + self.out.emit("#endif"); write_function('popped', popped_data) write_function('pushed', pushed_data) @@ -1023,7 +1025,7 @@ def always_exits(lines: list[str]) -> bool: return False line = line[12:] return line.startswith( - ("goto ", "return ", "DISPATCH", "GO_TO_", "Py_UNREACHABLE()") + ("goto ", "return ", "DISPATCH", "GO_TO_", "Py_UNREACHABLE()", "ERROR_IF(true, ") )