]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-98831: rewrite RAISE_VARARGS in the instruction definition DSL (#101306)
authorIrit Katriel <1055913+iritkatriel@users.noreply.github.com>
Wed, 25 Jan 2023 22:29:56 +0000 (22:29 +0000)
committerGitHub <noreply@github.com>
Wed, 25 Jan 2023 22:29:56 +0000 (22:29 +0000)
Python/bytecodes.c
Python/generated_cases.c.h
Python/opcode_metadata.h
Tools/cases_generator/generate_cases.py

index d3e242b81e608d797ffa1f7e0fe10ead0de7de54..e5769f61fc28d0e6f0472f29378712dc44e25188 100644 (file)
@@ -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 --)) {
index 7d3396ad6bdec33c00e3fc1f603e8c1c1540508e..287a1f1f04208959d64addcfed1cd7444b259bb9 100644 (file)
         }
 
         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) {
index 46fd9673e8fb64460232b699da040a41b78d2faf..cca86629e48d168e71efcdcf315672b33d6b7875 100644 (file)
@@ -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 {
index 3e2ddaaf20063b655d2ce6ff44504e7bf4440c20..b7942410c82fc3c826892902e94e0d76e27106dd 100644 (file)
@@ -774,7 +774,8 @@ class Analyzer:
             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 @@ class Analyzer:
             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, ")
     )