summaryrefslogtreecommitdiffstats
path: root/Objects
diff options
context:
space:
mode:
authorBarry Warsaw <barry@python.org>2001-01-23 16:24:35 (GMT)
committerBarry Warsaw <barry@python.org>2001-01-23 16:24:35 (GMT)
commit9bf16440f4e50efc28212e46d265cf1351cbdcc1 (patch)
tree4ed3425bf1cb11d8e789a3f1143382081eb97496 /Objects
parent9667ed23c5f78be235522a1d5f39306bcb72f650 (diff)
downloadcpython-9bf16440f4e50efc28212e46d265cf1351cbdcc1.zip
cpython-9bf16440f4e50efc28212e46d265cf1351cbdcc1.tar.gz
cpython-9bf16440f4e50efc28212e46d265cf1351cbdcc1.tar.bz2
A few miscellaneous helpers.
PyObject_Dump(): New function that is useful when debugging Python's C runtime. In something like gdb it can be a pain to get some useful information out of PyObject*'s. This function prints the str() of the object to stderr, along with the object's refcount and hex address. PyGC_Dump(): Similar to PyObject_Dump() but knows how to cast from the garbage collector prefix back to the PyObject* structure. [See Misc/gdbinit for some useful gdb hooks] none_dealloc(): Rather than SEGV if we accidentally decref None out of existance, we assign None's and NotImplemented's destructor slot to this function, which just calls abort().
Diffstat (limited to 'Objects')
-rw-r--r--Objects/object.c28
1 files changed, 26 insertions, 2 deletions
diff --git a/Objects/object.c b/Objects/object.c
index c1a1303..8a49353 100644
--- a/Objects/object.c
+++ b/Objects/object.c
@@ -220,6 +220,19 @@ PyObject_Print(PyObject *op, FILE *fp, int flags)
return ret;
}
+/* For debugging convenience. See Misc/gdbinit for some useful gdb hooks */
+void PyObject_Dump(PyObject* op)
+{
+ (void)PyObject_Print(op, stderr, 0);
+ fprintf(stderr, "\nrefcounts: %d\n", op->ob_refcnt);
+ fprintf(stderr, "address : %x\n", op);
+}
+void PyGC_Dump(PyGC_Head* op)
+{
+ PyObject_Dump(PyObject_FROM_GC(op));
+}
+
+
PyObject *
PyObject_Repr(PyObject *v)
{
@@ -1213,13 +1226,24 @@ none_repr(PyObject *op)
return PyString_FromString("None");
}
+/* ARGUSED */
+static void
+none_dealloc(PyObject* ignore)
+{
+ /* This should never get called, but we also don't want to SEGV if
+ * we accidently decref None out of existance.
+ */
+ abort();
+}
+
+
static PyTypeObject PyNothing_Type = {
PyObject_HEAD_INIT(&PyType_Type)
0,
"None",
0,
0,
- 0, /*tp_dealloc*/ /*never called*/
+ (destructor)none_dealloc, /*tp_dealloc*/ /*never called*/
0, /*tp_print*/
0, /*tp_getattr*/
0, /*tp_setattr*/
@@ -1250,7 +1274,7 @@ static PyTypeObject PyNotImplemented_Type = {
"NotImplemented",
0,
0,
- 0, /*tp_dealloc*/ /*never called*/
+ (destructor)none_dealloc, /*tp_dealloc*/ /*never called*/
0, /*tp_print*/
0, /*tp_getattr*/
0, /*tp_setattr*/