From 7bcc1c49205e14c81cdbfa452fcdc01c287c82d5 Mon Sep 17 00:00:00 2001 From: Kumar Aditya Date: Sat, 4 Apr 2026 12:49:23 +0530 Subject: [PATCH] gh-131798: relax GUARD_CALLABLE checks for self type checks (#148069) --- Python/optimizer_bytecodes.c | 60 +++++++++++++++++++----------------- Python/optimizer_cases.c.h | 60 +++++++++++++++++++----------------- 2 files changed, 64 insertions(+), 56 deletions(-) diff --git a/Python/optimizer_bytecodes.c b/Python/optimizer_bytecodes.c index 52a320fc70f7..86efb74c6d9d 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 52ca6b2531e3..a8be9bbd994c 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); } } -- 2.47.3