https://github.com/python/cpython/commit/7bcc1c49205e14c81cdbfa452fcdc01c287c82d5
commit: 7bcc1c49205e14c81cdbfa452fcdc01c287c82d5
branch: main
author: Kumar Aditya <[email protected]>
committer: kumaraditya303 <[email protected]>
date: 2026-04-04T12:49:23+05:30
summary:
gh-131798: relax GUARD_CALLABLE checks for self type checks (#148069)
files:
M Python/optimizer_bytecodes.c
M Python/optimizer_cases.c.h
diff --git a/Python/optimizer_bytecodes.c b/Python/optimizer_bytecodes.c
index 52a320fc70f7ed..86efb74c6d9d7f 100644
--- a/Python/optimizer_bytecodes.c
+++ b/Python/optimizer_bytecodes.c
@@ -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);
}
}
diff --git a/Python/optimizer_cases.c.h b/Python/optimizer_cases.c.h
index 52ca6b2531e3b4..a8be9bbd994c52 100644
--- a/Python/optimizer_cases.c.h
+++ b/Python/optimizer_cases.c.h
@@ -4074,19 +4074,20 @@
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);
}
}
@@ -4164,19 +4165,20 @@
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);
}
}
@@ -4227,19 +4229,20 @@
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);
}
}
@@ -4290,19 +4293,20 @@
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);
}
}
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]