]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-131798: relax GUARD_CALLABLE checks for self type checks (#148069)
authorKumar Aditya <kumaraditya@python.org>
Sat, 4 Apr 2026 07:19:23 +0000 (12:49 +0530)
committerGitHub <noreply@github.com>
Sat, 4 Apr 2026 07:19:23 +0000 (12:49 +0530)
Python/optimizer_bytecodes.c
Python/optimizer_cases.c.h

index 52a320fc70f7ed511989434c4c5117a1cd937c86..86efb74c6d9d7f0548e25da40e498101565d8d36 100644 (file)
@@ -1323,19 +1323,20 @@ dummy_func(void) {
         PyObject *callable_o = sym_get_const(ctx, callable);
         if (callable_o && sym_matches_type(callable, &PyMethodDescr_Type)) {
             int total_args = oparg;
-            if (!sym_is_null(self_or_null)) {
+            if (sym_is_not_null(self_or_null)) {
                 total_args++;
             }
-            PyObject *self = NULL;
-            if (!sym_is_null(self_or_null)) {
-                self = sym_get_const(ctx, self_or_null);
-            } else {
-                self = sym_get_const(ctx, args[0]);
+            PyTypeObject *self_type = NULL;
+            if (sym_is_not_null(self_or_null)) {
+                self_type = sym_get_type(self_or_null);
+            }
+            else {
+                self_type = sym_get_type(args[0]);
             }
             PyTypeObject *d_type = ((PyMethodDescrObject *)callable_o)->d_common.d_type;
             if (total_args == 2 &&
                 ((PyMethodDescrObject *)callable_o)->d_method->ml_flags == METH_O &&
-                self && Py_IS_TYPE(self, d_type)) {
+                self_type == d_type) {
                 ADD_OP(_NOP, 0, 0);
             }
         }
@@ -1348,19 +1349,20 @@ dummy_func(void) {
         PyObject *callable_o = sym_get_const(ctx, callable);
         if (callable_o && sym_matches_type(callable, &PyMethodDescr_Type)) {
             int total_args = oparg;
-            if (!sym_is_null(self_or_null)) {
+            if (sym_is_not_null(self_or_null)) {
                 total_args++;
             }
-            PyObject *self = NULL;
-            if (!sym_is_null(self_or_null)) {
-                self = sym_get_const(ctx, self_or_null);
-            } else {
-                self = sym_get_const(ctx, args[0]);
+            PyTypeObject *self_type = NULL;
+            if (sym_is_not_null(self_or_null)) {
+                self_type = sym_get_type(self_or_null);
+            }
+            else {
+                self_type = sym_get_type(args[0]);
             }
             PyTypeObject *d_type = ((PyMethodDescrObject *)callable_o)->d_common.d_type;
             if (total_args != 0 &&
                 ((PyMethodDescrObject *)callable_o)->d_method->ml_flags == (METH_FASTCALL|METH_KEYWORDS) &&
-                self && Py_IS_TYPE(self, d_type)) {
+                self_type == d_type) {
                 ADD_OP(_NOP, 0, 0);
             }
         }
@@ -1373,19 +1375,20 @@ dummy_func(void) {
         PyObject *callable_o = sym_get_const(ctx, callable);
         if (callable_o && sym_matches_type(callable, &PyMethodDescr_Type)) {
             int total_args = oparg;
-            if (!sym_is_null(self_or_null)) {
+            if (sym_is_not_null(self_or_null)) {
                 total_args++;
             }
-            PyObject *self = NULL;
-            if (!sym_is_null(self_or_null)) {
-                self = sym_get_const(ctx, self_or_null);
-            } else {
-                self = sym_get_const(ctx, args[0]);
+            PyTypeObject *self_type = NULL;
+            if (sym_is_not_null(self_or_null)) {
+                self_type = sym_get_type(self_or_null);
+            }
+            else {
+                self_type = sym_get_type(args[0]);
             }
             PyTypeObject *d_type = ((PyMethodDescrObject *)callable_o)->d_common.d_type;
             if (total_args == 1 &&
                 ((PyMethodDescrObject *)callable_o)->d_method->ml_flags == METH_NOARGS &&
-                self && Py_IS_TYPE(self, d_type)) {
+                self_type == d_type) {
                 ADD_OP(_NOP, 0, 0);
             }
         }
@@ -1431,19 +1434,20 @@ dummy_func(void) {
         PyObject *callable_o = sym_get_const(ctx, callable);
         if (callable_o && sym_matches_type(callable, &PyMethodDescr_Type)) {
             int total_args = oparg;
-            if (!sym_is_null(self_or_null)) {
+            if (sym_is_not_null(self_or_null)) {
                 total_args++;
             }
-            PyObject *self = NULL;
-            if (!sym_is_null(self_or_null)) {
-                self = sym_get_const(ctx, self_or_null);
-            } else {
-                self = sym_get_const(ctx, args[0]);
+            PyTypeObject *self_type = NULL;
+            if (sym_is_not_null(self_or_null)) {
+                self_type = sym_get_type(self_or_null);
+            }
+            else {
+                self_type = sym_get_type(args[0]);
             }
             PyTypeObject *d_type = ((PyMethodDescrObject *)callable_o)->d_common.d_type;
             if (total_args != 0 &&
                 ((PyMethodDescrObject *)callable_o)->d_method->ml_flags == METH_FASTCALL &&
-                self && Py_IS_TYPE(self, d_type)) {
+                self_type == d_type) {
                 ADD_OP(_NOP, 0, 0);
             }
         }
index 52ca6b2531e3b416e4412562fefa716503bdc51f..a8be9bbd994c528534c586027af2a6c5b4512661 100644 (file)
             PyObject *callable_o = sym_get_const(ctx, callable);
             if (callable_o && sym_matches_type(callable, &PyMethodDescr_Type)) {
                 int total_args = oparg;
-                if (!sym_is_null(self_or_null)) {
+                if (sym_is_not_null(self_or_null)) {
                     total_args++;
                 }
-                PyObject *self = NULL;
-                if (!sym_is_null(self_or_null)) {
-                    self = sym_get_const(ctx, self_or_null);
-                } else {
-                    self = sym_get_const(ctx, args[0]);
+                PyTypeObject *self_type = NULL;
+                if (sym_is_not_null(self_or_null)) {
+                    self_type = sym_get_type(self_or_null);
+                }
+                else {
+                    self_type = sym_get_type(args[0]);
                 }
                 PyTypeObject *d_type = ((PyMethodDescrObject *)callable_o)->d_common.d_type;
                 if (total_args == 2 &&
                     ((PyMethodDescrObject *)callable_o)->d_method->ml_flags == METH_O &&
-                    self && Py_IS_TYPE(self, d_type)) {
+                    self_type == d_type) {
                     ADD_OP(_NOP, 0, 0);
                 }
             }
             PyObject *callable_o = sym_get_const(ctx, callable);
             if (callable_o && sym_matches_type(callable, &PyMethodDescr_Type)) {
                 int total_args = oparg;
-                if (!sym_is_null(self_or_null)) {
+                if (sym_is_not_null(self_or_null)) {
                     total_args++;
                 }
-                PyObject *self = NULL;
-                if (!sym_is_null(self_or_null)) {
-                    self = sym_get_const(ctx, self_or_null);
-                } else {
-                    self = sym_get_const(ctx, args[0]);
+                PyTypeObject *self_type = NULL;
+                if (sym_is_not_null(self_or_null)) {
+                    self_type = sym_get_type(self_or_null);
+                }
+                else {
+                    self_type = sym_get_type(args[0]);
                 }
                 PyTypeObject *d_type = ((PyMethodDescrObject *)callable_o)->d_common.d_type;
                 if (total_args != 0 &&
                     ((PyMethodDescrObject *)callable_o)->d_method->ml_flags == (METH_FASTCALL|METH_KEYWORDS) &&
-                    self && Py_IS_TYPE(self, d_type)) {
+                    self_type == d_type) {
                     ADD_OP(_NOP, 0, 0);
                 }
             }
             PyObject *callable_o = sym_get_const(ctx, callable);
             if (callable_o && sym_matches_type(callable, &PyMethodDescr_Type)) {
                 int total_args = oparg;
-                if (!sym_is_null(self_or_null)) {
+                if (sym_is_not_null(self_or_null)) {
                     total_args++;
                 }
-                PyObject *self = NULL;
-                if (!sym_is_null(self_or_null)) {
-                    self = sym_get_const(ctx, self_or_null);
-                } else {
-                    self = sym_get_const(ctx, args[0]);
+                PyTypeObject *self_type = NULL;
+                if (sym_is_not_null(self_or_null)) {
+                    self_type = sym_get_type(self_or_null);
+                }
+                else {
+                    self_type = sym_get_type(args[0]);
                 }
                 PyTypeObject *d_type = ((PyMethodDescrObject *)callable_o)->d_common.d_type;
                 if (total_args == 1 &&
                     ((PyMethodDescrObject *)callable_o)->d_method->ml_flags == METH_NOARGS &&
-                    self && Py_IS_TYPE(self, d_type)) {
+                    self_type == d_type) {
                     ADD_OP(_NOP, 0, 0);
                 }
             }
             PyObject *callable_o = sym_get_const(ctx, callable);
             if (callable_o && sym_matches_type(callable, &PyMethodDescr_Type)) {
                 int total_args = oparg;
-                if (!sym_is_null(self_or_null)) {
+                if (sym_is_not_null(self_or_null)) {
                     total_args++;
                 }
-                PyObject *self = NULL;
-                if (!sym_is_null(self_or_null)) {
-                    self = sym_get_const(ctx, self_or_null);
-                } else {
-                    self = sym_get_const(ctx, args[0]);
+                PyTypeObject *self_type = NULL;
+                if (sym_is_not_null(self_or_null)) {
+                    self_type = sym_get_type(self_or_null);
+                }
+                else {
+                    self_type = sym_get_type(args[0]);
                 }
                 PyTypeObject *d_type = ((PyMethodDescrObject *)callable_o)->d_common.d_type;
                 if (total_args != 0 &&
                     ((PyMethodDescrObject *)callable_o)->d_method->ml_flags == METH_FASTCALL &&
-                    self && Py_IS_TYPE(self, d_type)) {
+                    self_type == d_type) {
                     ADD_OP(_NOP, 0, 0);
                 }
             }