]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-132732: Clear errors in JIT optimizer on error (GH-136048)
authorKen Jin <kenjin@python.org>
Mon, 15 Sep 2025 16:24:37 +0000 (17:24 +0100)
committerGitHub <noreply@github.com>
Mon, 15 Sep 2025 16:24:37 +0000 (17:24 +0100)
Python/optimizer_analysis.c

index fd395d3c6c254f7409ac224e020392faab226674..9d43f2de41df780745de7c1f34e01e4924a3ace9 100644 (file)
@@ -462,7 +462,7 @@ const uint16_t op_without_decref_inputs[MAX_UOP_ID + 1] = {
     [_BINARY_OP_SUBTRACT_FLOAT] = _BINARY_OP_SUBTRACT_FLOAT__NO_DECREF_INPUTS,
 };
 
-/* 1 for success, 0 for not ready, cannot error at the moment. */
+/* >0 (length) for success, 0 for not ready, clears all possible errors. */
 static int
 optimize_uops(
     PyCodeObject *co,
@@ -472,6 +472,7 @@ optimize_uops(
     _PyBloomFilter *dependencies
 )
 {
+    assert(!PyErr_Occurred());
 
     JitOptContext context;
     JitOptContext *ctx = &context;
@@ -555,7 +556,11 @@ error:
         OPT_ERROR_IN_OPCODE(opcode);
     }
     _Py_uop_abstractcontext_fini(ctx);
-    return -1;
+
+    assert(PyErr_Occurred());
+    PyErr_Clear();
+
+    return 0;
 
 }
 
@@ -702,10 +707,12 @@ _Py_uop_analyze_and_optimize(
         _PyFrame_GetCode(frame), buffer,
         length, curr_stacklen, dependencies);
 
-    if (length <= 0) {
+    if (length == 0) {
         return length;
     }
 
+    assert(length > 0);
+
     length = remove_unneeded_uops(buffer, length);
     assert(length > 0);