summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeremy Hylton <jeremy@alum.mit.edu>2000-06-23 19:37:02 (GMT)
committerJeremy Hylton <jeremy@alum.mit.edu>2000-06-23 19:37:02 (GMT)
commitd08b4c4524a31695d7e63768c02f472c9cb54fbd (patch)
treeb81cade431fa30d6446fef0122a3796b0876c8a2
parentd22162bac7e42ccf90571ee2607c9c42ed2df3fe (diff)
downloadcpython-d08b4c4524a31695d7e63768c02f472c9cb54fbd.zip
cpython-d08b4c4524a31695d7e63768c02f472c9cb54fbd.tar.gz
cpython-d08b4c4524a31695d7e63768c02f472c9cb54fbd.tar.bz2
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.
-rw-r--r--Include/object.h7
-rw-r--r--Include/objimpl.h6
-rw-r--r--Objects/classobject.c12
-rw-r--r--Objects/dictobject.c4
-rw-r--r--Objects/funcobject.c4
-rw-r--r--Objects/listobject.c11
-rw-r--r--Objects/tupleobject.c12
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);