summaryrefslogtreecommitdiffstats
path: root/Modules/gcmodule.c
diff options
context:
space:
mode:
authorNeil Schemenauer <nascheme@enme.ucalgary.ca>2001-08-09 15:38:31 (GMT)
committerNeil Schemenauer <nascheme@enme.ucalgary.ca>2001-08-09 15:38:31 (GMT)
commit48c703445400346d7d0b7c98830ace2937677ab6 (patch)
tree7c4f86ac5a5f29189b73924f81410b750e963937 /Modules/gcmodule.c
parentdbdcb0fc3af0a6712e7dca764a1c9c0878582433 (diff)
downloadcpython-48c703445400346d7d0b7c98830ace2937677ab6.zip
cpython-48c703445400346d7d0b7c98830ace2937677ab6.tar.gz
cpython-48c703445400346d7d0b7c98830ace2937677ab6.tar.bz2
Add get_referents function. Closes SF patch #402925.
Diffstat (limited to 'Modules/gcmodule.c')
-rw-r--r--Modules/gcmodule.c50
1 files changed, 50 insertions, 0 deletions
diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c
index a879ef6..9c8125d 100644
--- a/Modules/gcmodule.c
+++ b/Modules/gcmodule.c
@@ -677,6 +677,53 @@ gc_get_thresh(PyObject *self, PyObject *args)
return Py_BuildValue("(iii)", threshold0, threshold1, threshold2);
}
+struct referents{
+ PyObject *objs;
+ int seen;
+};
+
+static int
+referentsvisit(PyObject* obj, struct referents* refs)
+{
+ if (PySequence_Contains (refs->objs, obj)) {
+ refs->seen = 1;
+ return 1;
+ }
+ return 0;
+}
+
+static void
+gc_referents_for(PyObject *objs, PyGC_Head *list, PyObject *resultlist)
+{
+ PyGC_Head *gc;
+ PyObject *obj;
+ traverseproc traverse;
+ struct referents refs = {objs, 0};
+ for (gc = list->gc_next; gc != list; gc = gc->gc_next){
+ obj = PyObject_FROM_GC(gc);
+ traverse = obj->ob_type->tp_traverse;
+ if (obj == objs || obj == resultlist)
+ continue;
+ if (traverse(obj, (visitproc)referentsvisit, &refs)) {
+ PyList_Append(resultlist, obj);
+ refs.seen = 0;
+ }
+ }
+}
+
+static char gc_get_referents__doc__[]=
+"get_referents(*objs) -> list\n\
+Return the list of objects that directly refer to any of objs.";
+
+static PyObject*
+gc_get_referents(PyObject *self, PyObject* args)
+{
+ PyObject *result = PyList_New(0);
+ gc_referents_for(args, &generation0, result);
+ gc_referents_for(args, &generation1, result);
+ gc_referents_for(args, &generation2, result);
+ return result;
+}
static char gc__doc__ [] =
"This module provides access to the garbage collector for reference cycles.\n"
@@ -689,6 +736,7 @@ static char gc__doc__ [] =
"get_debug() -- Get debugging flags.\n"
"set_threshold() -- Set the collection thresholds.\n"
"get_threshold() -- Return the current the collection thresholds.\n"
+"get_referents() -- Return the list of objects that refer to an object.\n"
;
static PyMethodDef GcMethods[] = {
@@ -700,6 +748,8 @@ static PyMethodDef GcMethods[] = {
{"set_threshold", gc_set_thresh, METH_VARARGS, gc_set_thresh__doc__},
{"get_threshold", gc_get_thresh, METH_VARARGS, gc_get_thresh__doc__},
{"collect", gc_collect, METH_VARARGS, gc_collect__doc__},
+ {"get_referents", gc_get_referents, METH_VARARGS,
+ gc_get_referents__doc__},
{NULL, NULL} /* Sentinel */
};