mirror of https://github.com/python/cpython
bpo-40170: Remove PyHeapType_GET_MEMBERS() macro (GH-30942)
Remove the PyHeapType_GET_MEMBERS() macro. It was exposed in the public C API by mistake, it must only be used by Python internally. Use the PyTypeObject.tp_members member instead. Rename PyHeapType_GET_MEMBERS() to _PyHeapType_GET_MEMBERS() and move it to the internal C API.
This commit is contained in:
parent
0575551f69
commit
18ea973c21
|
@ -929,3 +929,8 @@ Removed
|
||||||
worked since the :c:type:`PyWeakReference` structure is opaque in the
|
worked since the :c:type:`PyWeakReference` structure is opaque in the
|
||||||
limited C API.
|
limited C API.
|
||||||
(Contributed by Victor Stinner in :issue:`35134`.)
|
(Contributed by Victor Stinner in :issue:`35134`.)
|
||||||
|
|
||||||
|
* Remove the ``PyHeapType_GET_MEMBERS()`` macro. It was exposed in the
|
||||||
|
public C API by mistake, it must only be used by Python internally.
|
||||||
|
Use the ``PyTypeObject.tp_members`` member instead.
|
||||||
|
(Contributed by Victor Stinner in :issue:`40170`.)
|
||||||
|
|
|
@ -293,10 +293,6 @@ typedef struct _heaptypeobject {
|
||||||
/* here are optional user slots, followed by the members. */
|
/* here are optional user slots, followed by the members. */
|
||||||
} PyHeapTypeObject;
|
} PyHeapTypeObject;
|
||||||
|
|
||||||
/* access macro to the members which are floating "behind" the object */
|
|
||||||
#define PyHeapType_GET_MEMBERS(etype) \
|
|
||||||
((PyMemberDef *)(((char *)etype) + Py_TYPE(etype)->tp_basicsize))
|
|
||||||
|
|
||||||
PyAPI_FUNC(const char *) _PyType_Name(PyTypeObject *);
|
PyAPI_FUNC(const char *) _PyType_Name(PyTypeObject *);
|
||||||
PyAPI_FUNC(PyObject *) _PyType_Lookup(PyTypeObject *, PyObject *);
|
PyAPI_FUNC(PyObject *) _PyType_Lookup(PyTypeObject *, PyObject *);
|
||||||
PyAPI_FUNC(PyObject *) _PyType_LookupId(PyTypeObject *, _Py_Identifier *);
|
PyAPI_FUNC(PyObject *) _PyType_LookupId(PyTypeObject *, _Py_Identifier *);
|
||||||
|
|
|
@ -232,6 +232,10 @@ extern void _PyObject_FreeInstanceAttributes(PyObject *self);
|
||||||
extern int _PyObject_IsInstanceDictEmpty(PyObject *);
|
extern int _PyObject_IsInstanceDictEmpty(PyObject *);
|
||||||
extern PyObject* _PyType_GetSubclasses(PyTypeObject *);
|
extern PyObject* _PyType_GetSubclasses(PyTypeObject *);
|
||||||
|
|
||||||
|
// Access macro to the members which are floating "behind" the object
|
||||||
|
#define _PyHeapType_GET_MEMBERS(etype) \
|
||||||
|
((PyMemberDef *)(((char *)etype) + Py_TYPE(etype)->tp_basicsize))
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
Remove the ``PyHeapType_GET_MEMBERS()`` macro. It was exposed in the public C
|
||||||
|
API by mistake, it must only be used by Python internally. Use the
|
||||||
|
``PyTypeObject.tp_members`` member instead. Patch by Victor Stinner.
|
||||||
|
|
|
@ -1209,7 +1209,7 @@ traverse_slots(PyTypeObject *type, PyObject *self, visitproc visit, void *arg)
|
||||||
PyMemberDef *mp;
|
PyMemberDef *mp;
|
||||||
|
|
||||||
n = Py_SIZE(type);
|
n = Py_SIZE(type);
|
||||||
mp = PyHeapType_GET_MEMBERS((PyHeapTypeObject *)type);
|
mp = _PyHeapType_GET_MEMBERS((PyHeapTypeObject *)type);
|
||||||
for (i = 0; i < n; i++, mp++) {
|
for (i = 0; i < n; i++, mp++) {
|
||||||
if (mp->type == T_OBJECT_EX) {
|
if (mp->type == T_OBJECT_EX) {
|
||||||
char *addr = (char *)self + mp->offset;
|
char *addr = (char *)self + mp->offset;
|
||||||
|
@ -1281,7 +1281,7 @@ clear_slots(PyTypeObject *type, PyObject *self)
|
||||||
PyMemberDef *mp;
|
PyMemberDef *mp;
|
||||||
|
|
||||||
n = Py_SIZE(type);
|
n = Py_SIZE(type);
|
||||||
mp = PyHeapType_GET_MEMBERS((PyHeapTypeObject *)type);
|
mp = _PyHeapType_GET_MEMBERS((PyHeapTypeObject *)type);
|
||||||
for (i = 0; i < n; i++, mp++) {
|
for (i = 0; i < n; i++, mp++) {
|
||||||
if (mp->type == T_OBJECT_EX && !(mp->flags & READONLY)) {
|
if (mp->type == T_OBJECT_EX && !(mp->flags & READONLY)) {
|
||||||
char *addr = (char *)self + mp->offset;
|
char *addr = (char *)self + mp->offset;
|
||||||
|
@ -2977,7 +2977,7 @@ type_new_descriptors(const type_new_ctx *ctx, PyTypeObject *type)
|
||||||
PyHeapTypeObject *et = (PyHeapTypeObject *)type;
|
PyHeapTypeObject *et = (PyHeapTypeObject *)type;
|
||||||
Py_ssize_t slotoffset = ctx->base->tp_basicsize;
|
Py_ssize_t slotoffset = ctx->base->tp_basicsize;
|
||||||
if (et->ht_slots != NULL) {
|
if (et->ht_slots != NULL) {
|
||||||
PyMemberDef *mp = PyHeapType_GET_MEMBERS(et);
|
PyMemberDef *mp = _PyHeapType_GET_MEMBERS(et);
|
||||||
Py_ssize_t nslot = PyTuple_GET_SIZE(et->ht_slots);
|
Py_ssize_t nslot = PyTuple_GET_SIZE(et->ht_slots);
|
||||||
for (Py_ssize_t i = 0; i < nslot; i++, mp++) {
|
for (Py_ssize_t i = 0; i < nslot; i++, mp++) {
|
||||||
mp->name = PyUnicode_AsUTF8(
|
mp->name = PyUnicode_AsUTF8(
|
||||||
|
@ -3014,7 +3014,7 @@ type_new_descriptors(const type_new_ctx *ctx, PyTypeObject *type)
|
||||||
|
|
||||||
type->tp_basicsize = slotoffset;
|
type->tp_basicsize = slotoffset;
|
||||||
type->tp_itemsize = ctx->base->tp_itemsize;
|
type->tp_itemsize = ctx->base->tp_itemsize;
|
||||||
type->tp_members = PyHeapType_GET_MEMBERS(et);
|
type->tp_members = _PyHeapType_GET_MEMBERS(et);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3570,8 +3570,8 @@ PyType_FromModuleAndSpec(PyObject *module, PyType_Spec *spec, PyObject *bases)
|
||||||
else if (slot->slot == Py_tp_members) {
|
else if (slot->slot == Py_tp_members) {
|
||||||
/* Move the slots to the heap type itself */
|
/* Move the slots to the heap type itself */
|
||||||
size_t len = Py_TYPE(type)->tp_itemsize * nmembers;
|
size_t len = Py_TYPE(type)->tp_itemsize * nmembers;
|
||||||
memcpy(PyHeapType_GET_MEMBERS(res), slot->pfunc, len);
|
memcpy(_PyHeapType_GET_MEMBERS(res), slot->pfunc, len);
|
||||||
type->tp_members = PyHeapType_GET_MEMBERS(res);
|
type->tp_members = _PyHeapType_GET_MEMBERS(res);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* Copy other slots directly */
|
/* Copy other slots directly */
|
||||||
|
|
Loading…
Reference in New Issue