part 2 of Neil Schemenauer's GC patches:

This patch modifies the type structures of objects that
participate in GC.  The object's tp_basicsize is increased when
GC is enabled.  GC information is prefixed to the object to
maintain binary compatibility.  GC objects also define the
tp_flag Py_TPFLAGS_GC.
This commit is contained in:
Jeremy Hylton 2000-06-23 19:37:02 +00:00
parent d22162bac7
commit d08b4c4524
7 changed files with 36 additions and 20 deletions

View file

@ -93,7 +93,8 @@ PyTuple_New(size)
int nbytes = size * sizeof(PyObject *);
/* Check for overflow */
if (nbytes / sizeof(PyObject *) != (size_t)size ||
(nbytes += sizeof(PyTupleObject) - sizeof(PyObject *))
(nbytes += sizeof(PyTupleObject) - sizeof(PyObject *)
+ PyGC_INFO_SIZE)
<= 0)
{
return PyErr_NoMemory();
@ -452,7 +453,7 @@ PyTypeObject PyTuple_Type = {
PyObject_HEAD_INIT(&PyType_Type)
0,
"tuple",
sizeof(PyTupleObject) - sizeof(PyObject *),
sizeof(PyTupleObject) - sizeof(PyObject *) + PyGC_INFO_SIZE,
sizeof(PyObject *),
(destructor)tupledealloc, /*tp_dealloc*/
(printfunc)tupleprint, /*tp_print*/
@ -469,7 +470,7 @@ PyTypeObject PyTuple_Type = {
0, /*tp_getattro*/
0, /*tp_setattro*/
0, /*tp_as_buffer*/
Py_TPFLAGS_DEFAULT, /*tp_flags*/
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /*tp_flags*/
0, /*tp_doc*/
(traverseproc)tupletraverse, /* tp_traverse */
};
@ -557,8 +558,9 @@ _PyTuple_Resize(pv, newsize, last_is_sticky)
#endif
{
sv = (PyTupleObject *)
PyObject_REALLOC((char *)v,
sizeof(PyTupleObject) + newsize * sizeof(PyObject *));
PyObject_REALLOC((char *)v, sizeof(PyTupleObject)
+ PyGC_INFO_SIZE
+ newsize * sizeof(PyObject *));
*pv = (PyObject *) sv;
if (sv == NULL) {
PyObject_DEL(v);