Skip to content

Commit

Permalink
gh-98831: rewrite RAISE_VARARGS in the instruction definition DSL (#1…
Browse files Browse the repository at this point in the history
  • Loading branch information
iritkatriel authored Jan 25, 2023
1 parent 6162a0e commit b400219
Show file tree
Hide file tree
Showing 4 changed files with 20 additions and 18 deletions.
13 changes: 5 additions & 8 deletions Python/bytecodes.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 --)) {
Expand Down
11 changes: 5 additions & 6 deletions Python/generated_cases.c.h

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 6 additions & 2 deletions Python/opcode_metadata.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
// from Python/bytecodes.c
// Do not edit!

#ifndef NDEBUG
static int
_PyOpcode_num_popped(int opcode, int oparg) {
switch(opcode) {
Expand Down Expand Up @@ -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:
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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:
Expand Down Expand Up @@ -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 {
Expand Down
6 changes: 4 additions & 2 deletions Tools/cases_generator/generate_cases.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand All @@ -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)
Expand Down Expand Up @@ -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, ")
)


Expand Down

0 comments on commit b400219

Please sign in to comment.