Commit 2bd4ba04 authored by Alexandre Vassalotti's avatar Alexandre Vassalotti

Issue #6151: Make PyDescr_COMMON conform to standard C.

parent cd2a783b
...@@ -37,15 +37,17 @@ struct wrapperbase { ...@@ -37,15 +37,17 @@ struct wrapperbase {
/* Various kinds of descriptor objects */ /* Various kinds of descriptor objects */
#define PyDescr_COMMON \
PyObject_HEAD \
PyTypeObject *d_type; \
PyObject *d_name
typedef struct { typedef struct {
PyDescr_COMMON; PyObject_HEAD
PyTypeObject *d_type;
PyObject *d_name;
} PyDescrObject; } PyDescrObject;
#define PyDescr_COMMON PyDescrObject d_common
#define PyDescr_TYPE(x) (((PyDescrObject *)(x))->d_type)
#define PyDescr_NAME(x) (((PyDescrObject *)(x))->d_name)
typedef struct { typedef struct {
PyDescr_COMMON; PyDescr_COMMON;
PyMethodDef *d_method; PyMethodDef *d_method;
......
...@@ -36,7 +36,12 @@ Core and Builtins ...@@ -36,7 +36,12 @@ Core and Builtins
C-API C-API
----- -----
- Issue #6405: Remove duplicatet type declarations in descrobject.h. - Issue #6151: Made PyDescr_COMMON conform to standard C (like PyObject_HEAD
in PEP 3123). The PyDescr_TYPE and PyDescr_NAME macros should be
should used for accessing the d_type and d_name members of structures
using PyDescr_COMMON.
- Issue #6405: Remove duplicate type declarations in descrobject.h.
- The code flags for old __future__ features are now available again. - The code flags for old __future__ features are now available again.
...@@ -49,6 +54,7 @@ C-API ...@@ -49,6 +54,7 @@ C-API
- Issue #1419652: Change the first argument to PyImport_AppendInittab() to - Issue #1419652: Change the first argument to PyImport_AppendInittab() to
``const char *`` as the string is stored beyond the call. ``const char *`` as the string is stored beyond the call.
Library Library
------- -------
......
...@@ -92,7 +92,7 @@ classmethod_get(PyMethodDescrObject *descr, PyObject *obj, PyObject *type) ...@@ -92,7 +92,7 @@ classmethod_get(PyMethodDescrObject *descr, PyObject *obj, PyObject *type)
"descriptor '%V' for type '%s' " "descriptor '%V' for type '%s' "
"needs either an object or a type", "needs either an object or a type",
descr_name((PyDescrObject *)descr), "?", descr_name((PyDescrObject *)descr), "?",
descr->d_type->tp_name); PyDescr_TYPE(descr)->tp_name);
return NULL; return NULL;
} }
} }
...@@ -101,16 +101,16 @@ classmethod_get(PyMethodDescrObject *descr, PyObject *obj, PyObject *type) ...@@ -101,16 +101,16 @@ classmethod_get(PyMethodDescrObject *descr, PyObject *obj, PyObject *type)
"descriptor '%V' for type '%s' " "descriptor '%V' for type '%s' "
"needs a type, not a '%s' as arg 2", "needs a type, not a '%s' as arg 2",
descr_name((PyDescrObject *)descr), "?", descr_name((PyDescrObject *)descr), "?",
descr->d_type->tp_name, PyDescr_TYPE(descr)->tp_name,
type->ob_type->tp_name); type->ob_type->tp_name);
return NULL; return NULL;
} }
if (!PyType_IsSubtype((PyTypeObject *)type, descr->d_type)) { if (!PyType_IsSubtype((PyTypeObject *)type, PyDescr_TYPE(descr))) {
PyErr_Format(PyExc_TypeError, PyErr_Format(PyExc_TypeError,
"descriptor '%V' for type '%s' " "descriptor '%V' for type '%s' "
"doesn't apply to type '%s'", "doesn't apply to type '%s'",
descr_name((PyDescrObject *)descr), "?", descr_name((PyDescrObject *)descr), "?",
descr->d_type->tp_name, PyDescr_TYPE(descr)->tp_name,
((PyTypeObject *)type)->tp_name); ((PyTypeObject *)type)->tp_name);
return NULL; return NULL;
} }
...@@ -149,7 +149,7 @@ getset_get(PyGetSetDescrObject *descr, PyObject *obj, PyObject *type) ...@@ -149,7 +149,7 @@ getset_get(PyGetSetDescrObject *descr, PyObject *obj, PyObject *type)
PyErr_Format(PyExc_AttributeError, PyErr_Format(PyExc_AttributeError,
"attribute '%V' of '%.100s' objects is not readable", "attribute '%V' of '%.100s' objects is not readable",
descr_name((PyDescrObject *)descr), "?", descr_name((PyDescrObject *)descr), "?",
descr->d_type->tp_name); PyDescr_TYPE(descr)->tp_name);
return NULL; return NULL;
} }
...@@ -204,7 +204,7 @@ getset_set(PyGetSetDescrObject *descr, PyObject *obj, PyObject *value) ...@@ -204,7 +204,7 @@ getset_set(PyGetSetDescrObject *descr, PyObject *obj, PyObject *value)
PyErr_Format(PyExc_AttributeError, PyErr_Format(PyExc_AttributeError,
"attribute '%V' of '%.100s' objects is not writable", "attribute '%V' of '%.100s' objects is not writable",
descr_name((PyDescrObject *)descr), "?", descr_name((PyDescrObject *)descr), "?",
descr->d_type->tp_name); PyDescr_TYPE(descr)->tp_name);
return -1; return -1;
} }
...@@ -222,17 +222,17 @@ methoddescr_call(PyMethodDescrObject *descr, PyObject *args, PyObject *kwds) ...@@ -222,17 +222,17 @@ methoddescr_call(PyMethodDescrObject *descr, PyObject *args, PyObject *kwds)
"descriptor '%V' of '%.100s' " "descriptor '%V' of '%.100s' "
"object needs an argument", "object needs an argument",
descr_name((PyDescrObject *)descr), "?", descr_name((PyDescrObject *)descr), "?",
descr->d_type->tp_name); PyDescr_TYPE(descr)->tp_name);
return NULL; return NULL;
} }
self = PyTuple_GET_ITEM(args, 0); self = PyTuple_GET_ITEM(args, 0);
if (!PyObject_IsInstance(self, (PyObject *)(descr->d_type))) { if (!PyObject_IsInstance(self, (PyObject *)PyDescr_TYPE(descr))) {
PyErr_Format(PyExc_TypeError, PyErr_Format(PyExc_TypeError,
"descriptor '%V' " "descriptor '%V' "
"requires a '%.100s' object " "requires a '%.100s' object "
"but received a '%.100s'", "but received a '%.100s'",
descr_name((PyDescrObject *)descr), "?", descr_name((PyDescrObject *)descr), "?",
descr->d_type->tp_name, PyDescr_TYPE(descr)->tp_name,
self->ob_type->tp_name); self->ob_type->tp_name);
return NULL; return NULL;
} }
...@@ -257,7 +257,7 @@ classmethoddescr_call(PyMethodDescrObject *descr, PyObject *args, ...@@ -257,7 +257,7 @@ classmethoddescr_call(PyMethodDescrObject *descr, PyObject *args,
{ {
PyObject *func, *result; PyObject *func, *result;
func = PyCFunction_New(descr->d_method, (PyObject *)descr->d_type); func = PyCFunction_New(descr->d_method, (PyObject *)PyDescr_TYPE(descr));
if (func == NULL) if (func == NULL)
return NULL; return NULL;
...@@ -280,17 +280,17 @@ wrapperdescr_call(PyWrapperDescrObject *descr, PyObject *args, PyObject *kwds) ...@@ -280,17 +280,17 @@ wrapperdescr_call(PyWrapperDescrObject *descr, PyObject *args, PyObject *kwds)
"descriptor '%V' of '%.100s' " "descriptor '%V' of '%.100s' "
"object needs an argument", "object needs an argument",
descr_name((PyDescrObject *)descr), "?", descr_name((PyDescrObject *)descr), "?",
descr->d_type->tp_name); PyDescr_TYPE(descr)->tp_name);
return NULL; return NULL;
} }
self = PyTuple_GET_ITEM(args, 0); self = PyTuple_GET_ITEM(args, 0);
if (!PyObject_IsInstance(self, (PyObject *)(descr->d_type))) { if (!PyObject_IsInstance(self, (PyObject *)PyDescr_TYPE(descr))) {
PyErr_Format(PyExc_TypeError, PyErr_Format(PyExc_TypeError,
"descriptor '%V' " "descriptor '%V' "
"requires a '%.100s' object " "requires a '%.100s' object "
"but received a '%.100s'", "but received a '%.100s'",
descr_name((PyDescrObject *)descr), "?", descr_name((PyDescrObject *)descr), "?",
descr->d_type->tp_name, PyDescr_TYPE(descr)->tp_name,
self->ob_type->tp_name); self->ob_type->tp_name);
return NULL; return NULL;
} }
...@@ -949,7 +949,7 @@ static PyMemberDef wrapper_members[] = { ...@@ -949,7 +949,7 @@ static PyMemberDef wrapper_members[] = {
static PyObject * static PyObject *
wrapper_objclass(wrapperobject *wp) wrapper_objclass(wrapperobject *wp)
{ {
PyObject *c = (PyObject *)wp->descr->d_type; PyObject *c = (PyObject *)PyDescr_TYPE(wp->descr);
Py_INCREF(c); Py_INCREF(c);
return c; return c;
...@@ -1059,7 +1059,7 @@ PyWrapper_New(PyObject *d, PyObject *self) ...@@ -1059,7 +1059,7 @@ PyWrapper_New(PyObject *d, PyObject *self)
assert(PyObject_TypeCheck(d, &PyWrapperDescr_Type)); assert(PyObject_TypeCheck(d, &PyWrapperDescr_Type));
descr = (PyWrapperDescrObject *)d; descr = (PyWrapperDescrObject *)d;
assert(PyObject_IsInstance(self, (PyObject *)(descr->d_type))); assert(PyObject_IsInstance(self, (PyObject *)PyDescr_TYPE(descr)));
wp = PyObject_GC_New(wrapperobject, &wrappertype); wp = PyObject_GC_New(wrapperobject, &wrappertype);
if (wp != NULL) { if (wp != NULL) {
......
...@@ -5648,7 +5648,7 @@ update_one_slot(PyTypeObject *type, slotdef *p) ...@@ -5648,7 +5648,7 @@ update_one_slot(PyTypeObject *type, slotdef *p)
generic = p->function; generic = p->function;
d = (PyWrapperDescrObject *)descr; d = (PyWrapperDescrObject *)descr;
if (d->d_base->wrapper == p->wrapper && if (d->d_base->wrapper == p->wrapper &&
PyType_IsSubtype(type, d->d_type)) PyType_IsSubtype(type, PyDescr_TYPE(d)))
{ {
if (specific == NULL || if (specific == NULL ||
specific == d->d_wrapped) specific == d->d_wrapped)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment