Skip to content

Commit

Permalink
bpo-39573: Use Py_TYPE() macro in Python and Include directories (GH-…
Browse files Browse the repository at this point in the history
…18391)

Replace direct access to PyObject.ob_type with Py_TYPE().
  • Loading branch information
vstinner authored Feb 7, 2020
1 parent 38aaaaa commit a102ed7
Show file tree
Hide file tree
Showing 12 changed files with 39 additions and 39 deletions.
4 changes: 2 additions & 2 deletions Include/classobject.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ typedef struct {

PyAPI_DATA(PyTypeObject) PyMethod_Type;

#define PyMethod_Check(op) ((op)->ob_type == &PyMethod_Type)
#define PyMethod_Check(op) (Py_TYPE(op)== &PyMethod_Type)

PyAPI_FUNC(PyObject *) PyMethod_New(PyObject *, PyObject *);

Expand All @@ -40,7 +40,7 @@ typedef struct {

PyAPI_DATA(PyTypeObject) PyInstanceMethod_Type;

#define PyInstanceMethod_Check(op) ((op)->ob_type == &PyInstanceMethod_Type)
#define PyInstanceMethod_Check(op) (Py_TYPE(op) == &PyInstanceMethod_Type)

PyAPI_FUNC(PyObject *) PyInstanceMethod_New(PyObject *);
PyAPI_FUNC(PyObject *) PyInstanceMethod_Function(PyObject *);
Expand Down
12 changes: 6 additions & 6 deletions Include/cpython/abstract.h
Original file line number Diff line number Diff line change
Expand Up @@ -246,8 +246,8 @@ PyAPI_FUNC(Py_ssize_t) PyObject_LengthHint(PyObject *o, Py_ssize_t);

/* Return 1 if the getbuffer function is available, otherwise return 0. */
#define PyObject_CheckBuffer(obj) \
(((obj)->ob_type->tp_as_buffer != NULL) && \
((obj)->ob_type->tp_as_buffer->bf_getbuffer != NULL))
((Py_TYPE(obj)->tp_as_buffer != NULL) && \
(Py_TYPE(obj)->tp_as_buffer->bf_getbuffer != NULL))

/* This is a C-API version of the getbuffer function call. It checks
to make sure object has the required function pointer and issues the
Expand Down Expand Up @@ -315,14 +315,14 @@ PyAPI_FUNC(void) PyBuffer_Release(Py_buffer *view);
/* ==== Iterators ================================================ */

#define PyIter_Check(obj) \
((obj)->ob_type->tp_iternext != NULL && \
(obj)->ob_type->tp_iternext != &_PyObject_NextNotImplemented)
(Py_TYPE(obj)->tp_iternext != NULL && \
Py_TYPE(obj)->tp_iternext != &_PyObject_NextNotImplemented)

/* === Number Protocol ================================================== */

#define PyIndex_Check(obj) \
((obj)->ob_type->tp_as_number != NULL && \
(obj)->ob_type->tp_as_number->nb_index != NULL)
(Py_TYPE(obj)->tp_as_number != NULL && \
Py_TYPE(obj)->tp_as_number->nb_index != NULL)

/* === Sequence protocol ================================================ */

Expand Down
4 changes: 2 additions & 2 deletions Include/pyerrors.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,11 +54,11 @@ PyAPI_FUNC(void) PyException_SetContext(PyObject *, PyObject *);
PyType_FastSubclass((PyTypeObject*)(x), Py_TPFLAGS_BASE_EXC_SUBCLASS))

#define PyExceptionInstance_Check(x) \
PyType_FastSubclass((x)->ob_type, Py_TPFLAGS_BASE_EXC_SUBCLASS)
PyType_FastSubclass(Py_TYPE(x), Py_TPFLAGS_BASE_EXC_SUBCLASS)

PyAPI_FUNC(const char *) PyExceptionClass_Name(PyObject *);

#define PyExceptionInstance_Class(x) ((PyObject*)((x)->ob_type))
#define PyExceptionInstance_Class(x) ((PyObject*)Py_TYPE(x))


/* Predefined exceptions */
Expand Down
4 changes: 2 additions & 2 deletions Python/_warnings.c
Original file line number Diff line number Diff line change
Expand Up @@ -650,7 +650,7 @@ warn_explicit(PyObject *category, PyObject *message,
text = PyObject_Str(message);
if (text == NULL)
goto cleanup;
category = (PyObject*)message->ob_type;
category = (PyObject*)Py_TYPE(message);
}
else {
text = message;
Expand Down Expand Up @@ -906,7 +906,7 @@ get_category(PyObject *message, PyObject *category)
return NULL;

if (rc == 1)
category = (PyObject*)message->ob_type;
category = (PyObject*)Py_TYPE(message);
else if (category == NULL || category == Py_None)
category = PyExc_UserWarning;

Expand Down
16 changes: 8 additions & 8 deletions Python/bltinmodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -170,7 +170,7 @@ builtin___build_class__(PyObject *self, PyObject *const *args, Py_ssize_t nargs,
/* else get the type of the first base */
else {
PyObject *base0 = PyTuple_GET_ITEM(bases, 0);
meta = (PyObject *) (base0->ob_type);
meta = (PyObject *)Py_TYPE(base0);
}
Py_INCREF(meta);
isclass = 1; /* meta is really a class */
Expand Down Expand Up @@ -1002,13 +1002,13 @@ builtin_exec_impl(PyObject *module, PyObject *source, PyObject *globals,

if (!PyDict_Check(globals)) {
PyErr_Format(PyExc_TypeError, "exec() globals must be a dict, not %.100s",
globals->ob_type->tp_name);
Py_TYPE(globals)->tp_name);
return NULL;
}
if (!PyMapping_Check(locals)) {
PyErr_Format(PyExc_TypeError,
"locals must be a mapping or None, not %.100s",
locals->ob_type->tp_name);
Py_TYPE(locals)->tp_name);
return NULL;
}
if (_PyDict_GetItemIdWithError(globals, &PyId___builtins__) == NULL) {
Expand Down Expand Up @@ -1383,11 +1383,11 @@ builtin_next(PyObject *self, PyObject *const *args, Py_ssize_t nargs)
if (!PyIter_Check(it)) {
PyErr_Format(PyExc_TypeError,
"'%.200s' object is not an iterator",
it->ob_type->tp_name);
Py_TYPE(it)->tp_name);
return NULL;
}

res = (*it->ob_type->tp_iternext)(it);
res = (*Py_TYPE(it)->tp_iternext)(it);
if (res != NULL) {
return res;
} else if (nargs > 1) {
Expand Down Expand Up @@ -1788,7 +1788,7 @@ builtin_ord(PyObject *module, PyObject *c)
else {
PyErr_Format(PyExc_TypeError,
"ord() expected string of length 1, but " \
"%.200s found", c->ob_type->tp_name);
"%.200s found", Py_TYPE(c)->tp_name);
return NULL;
}

Expand Down Expand Up @@ -1856,7 +1856,7 @@ builtin_print(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject
else if (sep && !PyUnicode_Check(sep)) {
PyErr_Format(PyExc_TypeError,
"sep must be None or a string, not %.200s",
sep->ob_type->tp_name);
Py_TYPE(sep)->tp_name);
return NULL;
}
if (end == Py_None) {
Expand All @@ -1865,7 +1865,7 @@ builtin_print(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject
else if (end && !PyUnicode_Check(end)) {
PyErr_Format(PyExc_TypeError,
"end must be None or a string, not %.200s",
end->ob_type->tp_name);
Py_TYPE(end)->tp_name);
return NULL;
}

Expand Down
14 changes: 7 additions & 7 deletions Python/ceval.c
Original file line number Diff line number Diff line change
Expand Up @@ -2633,7 +2633,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag)
PyObject *none_val = _PyList_Extend((PyListObject *)list, iterable);
if (none_val == NULL) {
if (_PyErr_ExceptionMatches(tstate, PyExc_TypeError) &&
(iterable->ob_type->tp_iter == NULL && !PySequence_Check(iterable)))
(Py_TYPE(iterable)->tp_iter == NULL && !PySequence_Check(iterable)))
{
_PyErr_Clear(tstate);
_PyErr_Format(tstate, PyExc_TypeError,
Expand Down Expand Up @@ -2803,7 +2803,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag)
if (_PyErr_ExceptionMatches(tstate, PyExc_AttributeError)) {
_PyErr_Format(tstate, PyExc_TypeError,
"'%.200s' object is not a mapping",
update->ob_type->tp_name);
Py_TYPE(update)->tp_name);
}
Py_DECREF(update);
goto error;
Expand Down Expand Up @@ -3158,7 +3158,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag)
PREDICTED(FOR_ITER);
/* before: [iter]; after: [iter, iter()] *or* [] */
PyObject *iter = TOP();
PyObject *next = (*iter->ob_type->tp_iternext)(iter);
PyObject *next = (*Py_TYPE(iter)->tp_iternext)(iter);
if (next != NULL) {
PUSH(next);
PREDICT(STORE_FAST);
Expand Down Expand Up @@ -4369,11 +4369,11 @@ unpack_iterable(PyThreadState *tstate, PyObject *v,
it = PyObject_GetIter(v);
if (it == NULL) {
if (_PyErr_ExceptionMatches(tstate, PyExc_TypeError) &&
v->ob_type->tp_iter == NULL && !PySequence_Check(v))
Py_TYPE(v)->tp_iter == NULL && !PySequence_Check(v))
{
_PyErr_Format(tstate, PyExc_TypeError,
"cannot unpack non-iterable %.200s object",
v->ob_type->tp_name);
Py_TYPE(v)->tp_name);
}
return 0;
}
Expand Down Expand Up @@ -4790,7 +4790,7 @@ PyEval_GetFuncName(PyObject *func)
else if (PyCFunction_Check(func))
return ((PyCFunctionObject*)func)->m_ml->ml_name;
else
return func->ob_type->tp_name;
return Py_TYPE(func)->tp_name;
}

const char *
Expand Down Expand Up @@ -5197,7 +5197,7 @@ import_all_from(PyThreadState *tstate, PyObject *locals, PyObject *v)
static int
check_args_iterable(PyThreadState *tstate, PyObject *func, PyObject *args)
{
if (args->ob_type->tp_iter == NULL && !PySequence_Check(args)) {
if (Py_TYPE(args)->tp_iter == NULL && !PySequence_Check(args)) {
/* check_args_iterable() may be called with a live exception:
* clear it to prevent calling _PyObject_FunctionStr() with an
* exception set. */
Expand Down
2 changes: 1 addition & 1 deletion Python/codecs.c
Original file line number Diff line number Diff line change
Expand Up @@ -658,7 +658,7 @@ static void wrong_exception_type(PyObject *exc)
{
PyErr_Format(PyExc_TypeError,
"don't know how to handle %.200s in error callback",
exc->ob_type->tp_name);
Py_TYPE(exc)->tp_name);
}

PyObject *PyCodec_StrictErrors(PyObject *exc)
Expand Down
2 changes: 1 addition & 1 deletion Python/compile.c
Original file line number Diff line number Diff line change
Expand Up @@ -3988,7 +3988,7 @@ infer_type(expr_ty e)
case FormattedValue_kind:
return &PyUnicode_Type;
case Constant_kind:
return e->v.Constant.value->ob_type;
return Py_TYPE(e->v.Constant.value);
default:
return NULL;
}
Expand Down
8 changes: 4 additions & 4 deletions Python/formatter_unicode.c
Original file line number Diff line number Diff line change
Expand Up @@ -1447,7 +1447,7 @@ _PyUnicode_FormatAdvancedWriter(_PyUnicodeWriter *writer,
return format_string_internal(obj, &format, writer);
default:
/* unknown */
unknown_presentation_type(format.type, obj->ob_type->tp_name);
unknown_presentation_type(format.type, Py_TYPE(obj)->tp_name);
return -1;
}
}
Expand Down Expand Up @@ -1505,7 +1505,7 @@ _PyLong_FormatAdvancedWriter(_PyUnicodeWriter *writer,

default:
/* unknown */
unknown_presentation_type(format.type, obj->ob_type->tp_name);
unknown_presentation_type(format.type, Py_TYPE(obj)->tp_name);
goto done;
}

Expand Down Expand Up @@ -1549,7 +1549,7 @@ _PyFloat_FormatAdvancedWriter(_PyUnicodeWriter *writer,

default:
/* unknown */
unknown_presentation_type(format.type, obj->ob_type->tp_name);
unknown_presentation_type(format.type, Py_TYPE(obj)->tp_name);
return -1;
}
}
Expand Down Expand Up @@ -1587,7 +1587,7 @@ _PyComplex_FormatAdvancedWriter(_PyUnicodeWriter *writer,

default:
/* unknown */
unknown_presentation_type(format.type, obj->ob_type->tp_name);
unknown_presentation_type(format.type, Py_TYPE(obj)->tp_name);
return -1;
}
}
8 changes: 4 additions & 4 deletions Python/getargs.c
Original file line number Diff line number Diff line change
Expand Up @@ -531,7 +531,7 @@ converttuple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
toplevel ? "expected %d arguments, not %.50s" :
"must be %d-item sequence, not %.50s",
n,
arg == Py_None ? "None" : arg->ob_type->tp_name);
arg == Py_None ? "None" : Py_TYPE(arg)->tp_name);
return msgbuf;
}

Expand Down Expand Up @@ -621,7 +621,7 @@ _PyArg_BadArgument(const char *fname, const char *displayname,
PyErr_Format(PyExc_TypeError,
"%.200s() %.200s must be %.50s, not %.50s",
fname, displayname, expected,
arg == Py_None ? "None" : arg->ob_type->tp_name);
arg == Py_None ? "None" : Py_TYPE(arg)->tp_name);
}

static const char *
Expand All @@ -636,7 +636,7 @@ converterr(const char *expected, PyObject *arg, char *msgbuf, size_t bufsize)
else {
PyOS_snprintf(msgbuf, bufsize,
"must be %.50s, not %.50s", expected,
arg == Py_None ? "None" : arg->ob_type->tp_name);
arg == Py_None ? "None" : Py_TYPE(arg)->tp_name);
}
return msgbuf;
}
Expand Down Expand Up @@ -1331,7 +1331,7 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
type = va_arg(*p_va, PyTypeObject*);
p = va_arg(*p_va, PyObject **);
format++;
if (PyType_IsSubtype(arg->ob_type, type))
if (PyType_IsSubtype(Py_TYPE(arg), type))
*p = arg;
else
return converterr(type->tp_name, arg, msgbuf, bufsize);
Expand Down
2 changes: 1 addition & 1 deletion Python/marshal.c
Original file line number Diff line number Diff line change
Expand Up @@ -1696,7 +1696,7 @@ marshal_load(PyObject *module, PyObject *file)
if (!PyBytes_Check(data)) {
PyErr_Format(PyExc_TypeError,
"file.read() returned not bytes but %.100s",
data->ob_type->tp_name);
Py_TYPE(data)->tp_name);
result = NULL;
}
else {
Expand Down
2 changes: 1 addition & 1 deletion Python/sysmodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -840,7 +840,7 @@ sys_intern_impl(PyObject *module, PyObject *s)
}
else {
_PyErr_Format(tstate, PyExc_TypeError,
"can't intern %.400s", s->ob_type->tp_name);
"can't intern %.400s", Py_TYPE(s)->tp_name);
return NULL;
}
}
Expand Down

0 comments on commit a102ed7

Please sign in to comment.