]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
part 2 of Neil Schemenauer's GC patches:
authorJeremy Hylton <jeremy@alum.mit.edu>
Fri, 23 Jun 2000 19:37:02 +0000 (19:37 +0000)
committerJeremy Hylton <jeremy@alum.mit.edu>
Fri, 23 Jun 2000 19:37:02 +0000 (19:37 +0000)
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
Include/objimpl.h
Objects/classobject.c
Objects/dictobject.c
Objects/funcobject.c
Objects/listobject.c
Objects/tupleobject.c

index e18e0e80fd20b5b9201572580f3883bd52a77cf8..2250b7fb54064eeaff9cc4963bc3872984fd304d 100644 (file)
@@ -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)
 
index 71dbb937871f790531977430345740d40e13020d..860030f95670c4d75fae8dc8420dfd0017e512fb 100644 (file)
@@ -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
index 114f2d94bb8fe758ddddbbe909e5c349d57052ae..04362a74afdcc48697ef5e0add9e212cca7ff1d5 100644 (file)
@@ -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 */
 };
index 2d33b927da9f6593e0e47841549824921e2e1474..ce38f11431e2228e9429680d58632a0ea75a9f7e 100644 (file)
@@ -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 */
index 142c7e7df9c5b46ea0b11f9accadf640fa0084c0..b976eab28f5979d628d30d92a5c0d4f09a242464 100644 (file)
@@ -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 */
 };
index 65dfb18f7bb8bccd19be73e701f47ff3b4bd6543..e9f12abf29b2fa56847c9312517062752461411a 100644 (file)
@@ -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 */
 };
index bbb56b1adc4829433c0dbe946f96bebf0a372d20..73e33045d0ebd5c247e60920e140a4e7ead367e7 100644 (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);