From d08b4c4524a31695d7e63768c02f472c9cb54fbd Mon Sep 17 00:00:00 2001 From: Jeremy Hylton Date: Fri, 23 Jun 2000 19:37:02 +0000 Subject: 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. --- Include/object.h | 7 +++++++ Include/objimpl.h | 6 ++++++ Objects/classobject.c | 12 ++++++------ Objects/dictobject.c | 4 ++-- Objects/funcobject.c | 4 ++-- Objects/listobject.c | 11 ++++++----- Objects/tupleobject.c | 12 +++++++----- 7 files changed, 36 insertions(+), 20 deletions(-) diff --git a/Include/object.h b/Include/object.h index e18e0e8..2250b7f 100644 --- a/Include/object.h +++ b/Include/object.h @@ -325,6 +325,13 @@ given type object has a specified feature. /* PySequenceMethods contains sq_contains */ #define Py_TPFLAGS_HAVE_SEQUENCE_IN (1L<<1) +/* Objects which participate in garbage collection (see objimp.h) */ +#ifdef WITH_CYCLE_GC +#define Py_TPFLAGS_GC (1L<<2) +#else +#define Py_TPFLAGS_GC 0 +#endif + #define Py_TPFLAGS_DEFAULT (Py_TPFLAGS_HAVE_GETCHARBUFFER | \ Py_TPFLAGS_HAVE_SEQUENCE_IN) diff --git a/Include/objimpl.h b/Include/objimpl.h index 71dbb93..860030f 100644 --- a/Include/objimpl.h +++ b/Include/objimpl.h @@ -234,6 +234,12 @@ extern DL_IMPORT(void) _PyObject_Del Py_PROTO((PyObject *)); the 1st step is performed automatically for you, so in a C++ class constructor you would start directly with PyObject_Init/InitVar. */ + + +#ifndef WITH_CYCLE_GC +#define PyGC_INFO_SIZE 0 +#endif + #ifdef __cplusplus } #endif diff --git a/Objects/classobject.c b/Objects/classobject.c index 114f2d9..04362a7 100644 --- a/Objects/classobject.c +++ b/Objects/classobject.c @@ -428,7 +428,7 @@ PyTypeObject PyClass_Type = { PyObject_HEAD_INIT(&PyType_Type) 0, "class", - sizeof(PyClassObject), + sizeof(PyClassObject) + PyGC_INFO_SIZE, 0, (destructor)class_dealloc, /*tp_dealloc*/ 0, /*tp_print*/ @@ -445,7 +445,7 @@ PyTypeObject PyClass_Type = { (getattrofunc)class_getattr, /*tp_getattro*/ (setattrofunc)class_setattr, /*tp_setattro*/ 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT, /*tp_flags*/ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /*tp_flags*/ 0, /* tp_doc */ (traverseproc)class_traverse, /* tp_traverse */ }; @@ -1513,7 +1513,7 @@ PyTypeObject PyInstance_Type = { PyObject_HEAD_INIT(&PyType_Type) 0, "instance", - sizeof(PyInstanceObject), + sizeof(PyInstanceObject) + PyGC_INFO_SIZE, 0, (destructor)instance_dealloc, /*tp_dealloc*/ 0, /*tp_print*/ @@ -1530,7 +1530,7 @@ PyTypeObject PyInstance_Type = { (getattrofunc)instance_getattr, /*tp_getattro*/ (setattrofunc)instance_setattr, /*tp_setattro*/ 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT, /*tp_flags*/ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /*tp_flags*/ 0, /* tp_doc */ (traverseproc)instance_traverse, /* tp_traverse */ }; @@ -1748,7 +1748,7 @@ PyTypeObject PyMethod_Type = { PyObject_HEAD_INIT(&PyType_Type) 0, "instance method", - sizeof(PyMethodObject), + sizeof(PyMethodObject) + PyGC_INFO_SIZE, 0, (destructor)instancemethod_dealloc, /*tp_dealloc*/ 0, /*tp_print*/ @@ -1765,7 +1765,7 @@ PyTypeObject PyMethod_Type = { (getattrofunc)instancemethod_getattr, /*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)instancemethod_traverse, /* tp_traverse */ }; diff --git a/Objects/dictobject.c b/Objects/dictobject.c index 2d33b92..ce38f11 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -1087,7 +1087,7 @@ PyTypeObject PyDict_Type = { PyObject_HEAD_INIT(&PyType_Type) 0, "dictionary", - sizeof(dictobject), + sizeof(dictobject) + PyGC_INFO_SIZE, 0, (destructor)dict_dealloc, /*tp_dealloc*/ (printfunc)dict_print, /*tp_print*/ @@ -1104,7 +1104,7 @@ PyTypeObject PyDict_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)dict_traverse, /* tp_traverse */ (inquiry)dict_tp_clear, /* tp_clear */ diff --git a/Objects/funcobject.c b/Objects/funcobject.c index 142c7e7..b976eab 100644 --- a/Objects/funcobject.c +++ b/Objects/funcobject.c @@ -275,7 +275,7 @@ PyTypeObject PyFunction_Type = { PyObject_HEAD_INIT(&PyType_Type) 0, "function", - sizeof(PyFunctionObject), + sizeof(PyFunctionObject) + PyGC_INFO_SIZE, 0, (destructor)func_dealloc, /*tp_dealloc*/ 0, /*tp_print*/ @@ -292,7 +292,7 @@ PyTypeObject PyFunction_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)func_traverse, /* tp_traverse */ }; diff --git a/Objects/listobject.c b/Objects/listobject.c index 65dfb18..e9f12ab 100644 --- a/Objects/listobject.c +++ b/Objects/listobject.c @@ -71,7 +71,8 @@ PyList_New(size) return PyErr_NoMemory(); } /* PyObject_NewVar is inlined */ - op = (PyListObject *) PyObject_MALLOC(sizeof(PyListObject)); + op = (PyListObject *) PyObject_MALLOC(sizeof(PyListObject) + + PyGC_INFO_SIZE); if (op == NULL) { return PyErr_NoMemory(); } @@ -1497,7 +1498,7 @@ PyTypeObject PyList_Type = { PyObject_HEAD_INIT(&PyType_Type) 0, "list", - sizeof(PyListObject), + sizeof(PyListObject) + PyGC_INFO_SIZE, 0, (destructor)list_dealloc, /*tp_dealloc*/ (printfunc)list_print, /*tp_print*/ @@ -1514,7 +1515,7 @@ PyTypeObject PyList_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)list_traverse, /* tp_traverse */ (inquiry)list_clear, /* tp_clear */ @@ -1576,7 +1577,7 @@ static PyTypeObject immutable_list_type = { PyObject_HEAD_INIT(&PyType_Type) 0, "list (immutable, during sort)", - sizeof(PyListObject), + sizeof(PyListObject) + PyGC_INFO_SIZE, 0, 0, /*tp_dealloc*/ /* Cannot happen */ (printfunc)list_print, /*tp_print*/ @@ -1593,7 +1594,7 @@ static PyTypeObject immutable_list_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)list_traverse, /* tp_traverse */ }; diff --git a/Objects/tupleobject.c b/Objects/tupleobject.c index bbb56b1..73e3304 100644 --- a/Objects/tupleobject.c +++ b/Objects/tupleobject.c @@ -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); -- cgit v0.12