]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-144280: Add missing predicate symbol to case-switch (GH-144298)
authorreiden <65756407+reidenong@users.noreply.github.com>
Fri, 30 Jan 2026 16:43:27 +0000 (00:43 +0800)
committerGitHub <noreply@github.com>
Fri, 30 Jan 2026 16:43:27 +0000 (16:43 +0000)
Misc/NEWS.d/next/Core_and_Builtins/2026-01-30-15-54-50.gh-issue-144280.kgiP5R.rst [new file with mode: 0644]
Python/optimizer_symbols.c

diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2026-01-30-15-54-50.gh-issue-144280.kgiP5R.rst b/Misc/NEWS.d/next/Core_and_Builtins/2026-01-30-15-54-50.gh-issue-144280.kgiP5R.rst
new file mode 100644 (file)
index 0000000..d6a4203
--- /dev/null
@@ -0,0 +1 @@
+Fix a bug in JIT where the predicate symbol had no truthiness
index ff94807c6db1c58f3117ccfc16c1243105ae8d4f..d79c273a099e8f41e1b7ead0dc0cf8f851857883 100644 (file)
@@ -113,6 +113,9 @@ _PyUOpSymPrint(JitOptRef ref)
         case JIT_SYM_COMPACT_INT:
             printf("<compact_int at %p>", (void *)sym);
             break;
+        case JIT_SYM_PREDICATE_TAG:
+            printf("<predicate at %p>", (void *)sym);
+            break;
         case JIT_SYM_DESCR_TAG: {
             PyTypeObject *descr_type = _PyType_LookupByVersion(sym->descr.type_version);
             if (descr_type) {
@@ -692,6 +695,7 @@ _Py_uop_sym_truthiness(JitOptContext *ctx, JitOptRef ref)
         case JIT_SYM_NON_NULL_TAG:
         case JIT_SYM_UNKNOWN_TAG:
         case JIT_SYM_COMPACT_INT:
+        case JIT_SYM_PREDICATE_TAG:
         case JIT_SYM_DESCR_TAG:
             return -1;
         case JIT_SYM_KNOWN_CLASS_TAG:
@@ -1614,6 +1618,26 @@ _Py_uop_symbols_test(PyObject *Py_UNUSED(self), PyObject *Py_UNUSED(ignored))
     _Py_uop_sym_apply_predicate_narrowing(ctx, ref, true);
     TEST_PREDICATE(!_Py_uop_sym_is_const(ctx, subject), "predicate narrowing incorrectly narrowed subject (inverted/true)");
 
+    subject = _Py_uop_sym_new_unknown(ctx);
+    value = _Py_uop_sym_new_const(ctx, one_obj);
+    ref = _Py_uop_sym_new_predicate(ctx, subject, value, JIT_PRED_IS);
+    if (PyJitRef_IsNull(subject) || PyJitRef_IsNull(value) || PyJitRef_IsNull(ref)) {
+        goto fail;
+    }
+    TEST_PREDICATE(_Py_uop_sym_matches_type(ref, &PyBool_Type), "predicate is not boolean");
+    TEST_PREDICATE(_Py_uop_sym_truthiness(ctx, ref) == -1, "predicate is not unknown");
+    TEST_PREDICATE(_Py_uop_sym_is_const(ctx, ref) == false, "predicate is constant");
+    TEST_PREDICATE(_Py_uop_sym_get_const(ctx, ref) == NULL, "predicate is not NULL");
+    TEST_PREDICATE(_Py_uop_sym_is_const(ctx, value) == true, "value is not constant");
+    TEST_PREDICATE(_Py_uop_sym_get_const(ctx, value) == one_obj, "value is not 1");
+    _Py_uop_sym_set_const(ctx, ref, Py_False);
+    TEST_PREDICATE(_Py_uop_sym_matches_type(ref, &PyBool_Type), "predicate is not boolean");
+    TEST_PREDICATE(_Py_uop_sym_truthiness(ctx, ref) == 0, "predicate is not False");
+    TEST_PREDICATE(_Py_uop_sym_is_const(ctx, ref) == true, "predicate is not constant");
+    TEST_PREDICATE(_Py_uop_sym_get_const(ctx, ref) == Py_False, "predicate is not False");
+    TEST_PREDICATE(_Py_uop_sym_is_const(ctx, value) == true, "value is not constant");
+    TEST_PREDICATE(_Py_uop_sym_get_const(ctx, value) == one_obj, "value is not 1");
+
     val_big = PyNumber_Lshift(_PyLong_GetOne(), PyLong_FromLong(66));
     if (val_big == NULL) {
         goto fail;