]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-148083: Prevent constant folding when lhs is container types (gh-148090)
authorDonghee Na <donghee.na@python.org>
Sat, 4 Apr 2026 15:40:12 +0000 (00:40 +0900)
committerGitHub <noreply@github.com>
Sat, 4 Apr 2026 15:40:12 +0000 (00:40 +0900)
Include/internal/pycore_optimizer.h
Python/optimizer_analysis.c
Python/optimizer_bytecodes.c
Python/optimizer_cases.c.h
Python/optimizer_symbols.c

index 2986afb142b5d1bfee75d867aa0eea07db5b70a1..cf01c620476ff780e5fdc14d3f5d44006e938866 100644 (file)
@@ -394,6 +394,7 @@ extern JitOptRef _Py_uop_sym_new_type(
 extern JitOptRef _Py_uop_sym_new_const(JitOptContext *ctx, PyObject *const_val);
 extern JitOptRef _Py_uop_sym_new_const_steal(JitOptContext *ctx, PyObject *const_val);
 bool _Py_uop_sym_is_safe_const(JitOptContext *ctx, JitOptRef sym);
+bool _Py_uop_sym_is_not_container(JitOptRef sym);
 _PyStackRef _Py_uop_sym_get_const_as_stackref(JitOptContext *ctx, JitOptRef sym);
 extern JitOptRef _Py_uop_sym_new_null(JitOptContext *ctx);
 extern bool _Py_uop_sym_has_type(JitOptRef sym);
index 2953311b3926002ceb45b1fb4bccedd0d139bd39..92e1c081d524db10420bfce119e54401973d425e 100644 (file)
@@ -252,6 +252,7 @@ add_op(JitOptContext *ctx, _PyUOpInstruction *this_instr,
 #define sym_is_not_null _Py_uop_sym_is_not_null
 #define sym_is_const _Py_uop_sym_is_const
 #define sym_is_safe_const _Py_uop_sym_is_safe_const
+#define sym_is_not_container _Py_uop_sym_is_not_container
 #define sym_get_const _Py_uop_sym_get_const
 #define sym_new_const_steal _Py_uop_sym_new_const_steal
 #define sym_get_const_as_stackref _Py_uop_sym_get_const_as_stackref
index 6e9a34384ba5319931662d6c5540834075dd0ef9..f2645553513f3da829e23b7b1f78cc0875e535a6 100644 (file)
@@ -515,7 +515,8 @@ dummy_func(void) {
         res = sym_new_not_null(ctx);
         ds = dict_st;
         ss = sub_st;
-        if (sym_matches_type(dict_st, &PyFrozenDict_Type)) {
+        if (sym_is_not_container(sub_st) &&
+            sym_matches_type(dict_st, &PyFrozenDict_Type)) {
             REPLACE_OPCODE_IF_EVALUATES_PURE(dict_st, sub_st, res);
         }
     }
@@ -706,7 +707,8 @@ dummy_func(void) {
         b = sym_new_type(ctx, &PyBool_Type);
         l = left;
         r = right;
-        if (sym_matches_type(right, &PyFrozenSet_Type)) {
+        if (sym_is_not_container(left) &&
+            sym_matches_type(right, &PyFrozenSet_Type)) {
             REPLACE_OPCODE_IF_EVALUATES_PURE(left, right, b);
         }
     }
index dc00b6bc1397f54f0c575329d07c4c5f3d5a6a14..fb3ec39a42eabcad1cf4e7a764be7eb340aa0dc0 100644 (file)
             res = sym_new_not_null(ctx);
             ds = dict_st;
             ss = sub_st;
-            if (sym_matches_type(dict_st, &PyFrozenDict_Type)) {
+            if (sym_is_not_container(sub_st) &&
+                sym_matches_type(dict_st, &PyFrozenDict_Type)) {
                 if (
                     sym_is_safe_const(ctx, dict_st) &&
                     sym_is_safe_const(ctx, sub_st)
             b = sym_new_type(ctx, &PyBool_Type);
             l = left;
             r = right;
-            if (sym_matches_type(right, &PyFrozenSet_Type)) {
+            if (sym_is_not_container(left) &&
+                sym_matches_type(right, &PyFrozenSet_Type)) {
                 if (
                     sym_is_safe_const(ctx, left) &&
                     sym_is_safe_const(ctx, right)
index 2614bcd430a2c50336f99a225a4485c97763a66b..6230b8948697e2598dfc700312f0fcff7254ce0d 100644 (file)
@@ -287,6 +287,20 @@ _Py_uop_sym_is_safe_const(JitOptContext *ctx, JitOptRef sym)
            (typ == &PyFrozenSet_Type);
 }
 
+bool
+_Py_uop_sym_is_not_container(JitOptRef sym)
+{
+    PyTypeObject *typ = _Py_uop_sym_get_type(sym);
+    if (typ == NULL) {
+        return false;
+    }
+    return (typ == &PyLong_Type) ||
+           (typ == &PyFloat_Type) ||
+           (typ == &PyUnicode_Type) ||
+           (typ == &_PyNone_Type) ||
+           (typ == &PyBool_Type);
+}
+
 void
 _Py_uop_sym_set_type(JitOptContext *ctx, JitOptRef ref, PyTypeObject *typ)
 {