diff options
-rw-r--r-- | Objects/object.c | 58 | ||||
-rw-r--r-- | Python/sysmodule.c | 34 |
2 files changed, 92 insertions, 0 deletions
diff --git a/Objects/object.c b/Objects/object.c index 1643ec6..4899ef1 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -56,6 +56,33 @@ dump_counts() null_strings, one_strings); } +PyObject * +get_counts() +{ + PyTypeObject *tp; + PyObject *result; + PyObject *v; + + result = PyList_New(0); + if (result == NULL) + return NULL; + for (tp = type_list; tp; tp = tp->tp_next) { + v = Py_BuildValue("(siii)", tp->tp_name, tp->tp_alloc, + tp->tp_free, tp->tp_maxalloc); + if (v == NULL) { + Py_DECREF(result); + return NULL; + } + if (PyList_Append(result, v) < 0) { + Py_DECREF(v); + Py_DECREF(result); + return NULL; + } + Py_DECREF(v); + } + return result; +} + void inc_count(tp) typeobject *tp; @@ -513,4 +540,35 @@ printrefs(fp) } } +PyObject * +getobjects(self, args) + PyObject *self; + PyObject *args; +{ + int i, n; + PyObject *t = NULL; + PyObject *res, *op; + + if (!PyArg_ParseTuple(args, "i|O", &n, &t)) + return NULL; + op = refchain._ob_next; + res = PyList_New(0); + if (res == NULL) + return NULL; + for (i = 0; (n == 0 || i < n) && op != &refchain; i++) { + while (op == self || op == args || op == res || op == t || + t != NULL && op->ob_type != (PyTypeObject *) t) { + op = op->_ob_next; + if (op == &refchain) + return res; + } + if (PyList_Append(res, op) < 0) { + Py_DECREF(res); + return NULL; + } + op = op->_ob_next; + } + return res; +} + #endif diff --git a/Python/sysmodule.c b/Python/sysmodule.c index 6e153e4..5fc098d 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -154,8 +154,42 @@ sys_mdebug(self, args) } #endif /* USE_MALLOPT */ +static object * +sys_getrefcount(self, args) + object *self; + object *args; +{ + object *arg; + if (!getargs(args, "O", &arg)) + return NULL; + return newintobject((long) arg->ob_refcnt); +} + +#ifdef COUNT_ALLOCS +static PyObject * +sys_getcounts(self, args) + PyObject *self, *args; +{ + extern PyObject *get_counts Py_PROTO((void)); + + if (!PyArg_Parse(args, "")) + return NULL; + return get_counts(); +} +#endif + +#ifdef TRACE_REFS +extern PyObject *getobjects Py_PROTO((PyObject *, PyObject *)); +#endif static struct methodlist sys_methods[] = { {"exit", sys_exit, 0}, + {"getrefcount", sys_getrefcount, 0}, +#ifdef COUNT_ALLOCS + {"getcounts", sys_getcounts, 0}, +#endif +#ifdef TRACE_REFS + {"getobjects", getobjects, 1}, +#endif #ifdef USE_MALLOPT {"mdebug", sys_mdebug, 0}, #endif |