From 24705eda98ef4396655d56ea978293438e9a6b93 Mon Sep 17 00:00:00 2001 From: Andy Lester Date: Wed, 4 Mar 2020 23:23:49 -0600 Subject: [PATCH 1/2] Make Py_IS_TYPE and _Py_IS_TYPE take const pointers --- Include/object.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Include/object.h b/Include/object.h index 3d0da52c2b6b1c..e79202d0839571 100644 --- a/Include/object.h +++ b/Include/object.h @@ -123,10 +123,10 @@ typedef struct { #define Py_TYPE(ob) (_PyObject_CAST(ob)->ob_type) #define Py_SIZE(ob) (_PyVarObject_CAST(ob)->ob_size) -static inline int _Py_IS_TYPE(PyObject *ob, PyTypeObject *type) { +static inline int _Py_IS_TYPE(const PyObject *ob, const PyTypeObject *type) { return ob->ob_type == type; } -#define Py_IS_TYPE(ob, type) _Py_IS_TYPE(_PyObject_CAST(ob), type) +#define Py_IS_TYPE(ob, type) _Py_IS_TYPE((const PyObject*)(ob), type) static inline void _Py_SET_REFCNT(PyObject *ob, Py_ssize_t refcnt) { ob->ob_refcnt = refcnt; From cbc1098ff90a3548d4a3a98a2b4c0bcb721ae178 Mon Sep 17 00:00:00 2001 From: Andy Lester Date: Wed, 4 Mar 2020 23:25:10 -0600 Subject: [PATCH 2/2] Do type comparisons with Py_IS_TYPE --- Modules/_functoolsmodule.c | 2 +- Modules/_threadmodule.c | 4 ++-- Modules/itertoolsmodule.c | 2 +- Modules/posixmodule.c | 3 +-- Objects/abstract.c | 5 ++--- Objects/object.c | 6 +++--- Objects/setobject.c | 2 +- Objects/tupleobject.c | 2 +- Objects/typeobject.c | 6 +++--- Python/errors.c | 2 +- 10 files changed, 16 insertions(+), 18 deletions(-) diff --git a/Modules/_functoolsmodule.c b/Modules/_functoolsmodule.c index ab0839cdc7473b..0c0fae1a979a4f 100644 --- a/Modules/_functoolsmodule.c +++ b/Modules/_functoolsmodule.c @@ -573,7 +573,7 @@ keyobject_richcompare(PyObject *ko, PyObject *other, int op) PyObject *answer; PyObject* stack[2]; - if (Py_TYPE(other) != &keyobject_type){ + if (!Py_IS_TYPE(other, &keyobject_type)) { PyErr_Format(PyExc_TypeError, "other argument must be K instance"); return NULL; } diff --git a/Modules/_threadmodule.c b/Modules/_threadmodule.c index da5fe7915a8e52..11bc16f4b3111f 100644 --- a/Modules/_threadmodule.c +++ b/Modules/_threadmodule.c @@ -938,7 +938,7 @@ local_getattro(localobject *self, PyObject *name) if (r == -1) return NULL; - if (Py_TYPE(self) != &localtype) + if (!Py_IS_TYPE(self, &localtype)) /* use generic lookup for subtypes */ return _PyObject_GenericGetAttrWithDict( (PyObject *)self, name, ldict, 0); @@ -1400,7 +1400,7 @@ static PyStructSequence_Desc ExceptHookArgs_desc = { static PyObject * thread_excepthook(PyObject *self, PyObject *args) { - if (Py_TYPE(args) != &ExceptHookArgsType) { + if (!Py_IS_TYPE(args, &ExceptHookArgsType)) { PyErr_SetString(PyExc_TypeError, "_thread.excepthook argument type " "must be ExceptHookArgs"); diff --git a/Modules/itertoolsmodule.c b/Modules/itertoolsmodule.c index d545028901b4ee..9505fd454b42e6 100644 --- a/Modules/itertoolsmodule.c +++ b/Modules/itertoolsmodule.c @@ -614,7 +614,7 @@ itertools_teedataobject_impl(PyTypeObject *type, PyObject *it, if (len == LINKCELLS) { if (next != Py_None) { - if (Py_TYPE(next) != &teedataobject_type) + if (!Py_IS_TYPE(next, &teedataobject_type)) goto err; assert(tdo->nextlink == NULL); Py_INCREF(next); diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 4d6d255b3469b2..29aeca4169dd17 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -6380,8 +6380,7 @@ convert_sched_param(PyObject *param, struct sched_param *res) { long priority; - PyObject *SchedParamType = _posixstate_global->SchedParamType; - if (Py_TYPE(param) != (PyTypeObject *)SchedParamType) { + if (!Py_IS_TYPE(param, (PyTypeObject *)_posixstate_global->SchedParamType)) { PyErr_SetString(PyExc_TypeError, "must have a sched_param object"); return 0; } diff --git a/Objects/abstract.c b/Objects/abstract.c index 454e0da71afbe0..accd72d5f28e5d 100644 --- a/Objects/abstract.c +++ b/Objects/abstract.c @@ -834,7 +834,7 @@ binary_op1(PyObject *v, PyObject *w, const int op_slot) if (Py_TYPE(v)->tp_as_number != NULL) slotv = NB_BINOP(Py_TYPE(v)->tp_as_number, op_slot); - if (Py_TYPE(w) != Py_TYPE(v) && + if (!Py_IS_TYPE(w, Py_TYPE(v)) && Py_TYPE(w)->tp_as_number != NULL) { slotw = NB_BINOP(Py_TYPE(w)->tp_as_number, op_slot); if (slotw == slotv) @@ -925,8 +925,7 @@ ternary_op(PyObject *v, mw = Py_TYPE(w)->tp_as_number; if (mv != NULL) slotv = NB_TERNOP(mv, op_slot); - if (Py_TYPE(w) != Py_TYPE(v) && - mw != NULL) { + if (!Py_IS_TYPE(w, Py_TYPE(v)) && mw != NULL) { slotw = NB_TERNOP(mw, op_slot); if (slotw == slotv) slotw = NULL; diff --git a/Objects/object.c b/Objects/object.c index 9c74e07eddcb14..4cfac2e8bffabd 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -33,7 +33,7 @@ _PyObject_CheckConsistency(PyObject *op, int check_content) CHECK(!_PyObject_IsFreed(op)); CHECK(Py_REFCNT(op) >= 1); - CHECK(Py_TYPE(op) != NULL); + CHECK(!Py_IS_TYPE(op, NULL)); _PyType_CheckConsistency(Py_TYPE(op)); if (PyUnicode_Check(op)) { @@ -665,7 +665,7 @@ do_richcompare(PyThreadState *tstate, PyObject *v, PyObject *w, int op) PyObject *res; int checked_reverse_op = 0; - if (Py_TYPE(v) != Py_TYPE(w) && + if (!Py_IS_TYPE(v, Py_TYPE(w)) && PyType_IsSubtype(Py_TYPE(w), Py_TYPE(v)) && (f = Py_TYPE(w)->tp_richcompare) != NULL) { checked_reverse_op = 1; @@ -1915,7 +1915,7 @@ _Py_GetObjects(PyObject *self, PyObject *args) return NULL; for (i = 0; (n == 0 || i < n) && op != &refchain; i++) { while (op == self || op == args || op == res || op == t || - (t != NULL && Py_TYPE(op) != (PyTypeObject *) t)) { + (t != NULL && !Py_IS_TYPE(op, (PyTypeObject *) t))) { op = op->_ob_next; if (op == &refchain) return res; diff --git a/Objects/setobject.c b/Objects/setobject.c index bb7c0b8f0456b8..43fa5d17fd2e79 100644 --- a/Objects/setobject.c +++ b/Objects/setobject.c @@ -608,7 +608,7 @@ set_repr(PySetObject *so) goto done; listrepr = tmp; - if (Py_TYPE(so) != &PySet_Type) + if (!Py_IS_TYPE(so, &PySet_Type)) result = PyUnicode_FromFormat("%s({%U})", Py_TYPE(so)->tp_name, listrepr); diff --git a/Objects/tupleobject.c b/Objects/tupleobject.c index 92374cc130d0c2..52ecb5446fe8fc 100644 --- a/Objects/tupleobject.c +++ b/Objects/tupleobject.c @@ -881,7 +881,7 @@ _PyTuple_Resize(PyObject **pv, Py_ssize_t newsize) Py_ssize_t oldsize; v = (PyTupleObject *) *pv; - if (v == NULL || Py_TYPE(v) != &PyTuple_Type || + if (v == NULL || !Py_IS_TYPE(v, &PyTuple_Type) || (Py_SIZE(v) != 0 && Py_REFCNT(v) != 1)) { *pv = 0; Py_XDECREF(v); diff --git a/Objects/typeobject.c b/Objects/typeobject.c index cf749eff58fe2e..ec8dc19da9998a 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -1889,7 +1889,7 @@ mro_invoke(PyTypeObject *type) { PyObject *mro_result; PyObject *new_mro; - int custom = (Py_TYPE(type) != &PyType_Type); + const int custom = !Py_IS_TYPE(type, &PyType_Type); if (custom) { int unbound; @@ -6191,7 +6191,7 @@ FUNCNAME(PyObject *self, PyObject *other) \ PyThreadState *tstate = _PyThreadState_GET(); \ _Py_static_string(op_id, OPSTR); \ _Py_static_string(rop_id, ROPSTR); \ - int do_other = Py_TYPE(self) != Py_TYPE(other) && \ + int do_other = !Py_IS_TYPE(self, Py_TYPE(other)) && \ Py_TYPE(other)->tp_as_number != NULL && \ Py_TYPE(other)->tp_as_number->SLOTNAME == TESTFUNC; \ if (Py_TYPE(self)->tp_as_number != NULL && \ @@ -7901,7 +7901,7 @@ super_descr_get(PyObject *self, PyObject *obj, PyObject *type) Py_INCREF(self); return self; } - if (Py_TYPE(su) != &PySuper_Type) + if (!Py_IS_TYPE(su, &PySuper_Type)) /* If su is an instance of a (strict) subclass of super, call its type */ return PyObject_CallFunctionObjArgs((PyObject *)Py_TYPE(su), diff --git a/Python/errors.c b/Python/errors.c index 6baa229ccc7ce8..4656fb2a336706 100644 --- a/Python/errors.c +++ b/Python/errors.c @@ -1321,7 +1321,7 @@ _PyErr_WriteUnraisableDefaultHook(PyObject *args) { PyThreadState *tstate = _PyThreadState_GET(); - if (Py_TYPE(args) != &UnraisableHookArgsType) { + if (!Py_IS_TYPE(args, &UnraisableHookArgsType)) { _PyErr_SetString(tstate, PyExc_TypeError, "sys.unraisablehook argument type " "must be UnraisableHookArgs");