]> granicus.if.org Git - python/commitdiff
A few miscellaneous helpers.
authorBarry Warsaw <barry@python.org>
Tue, 23 Jan 2001 16:24:35 +0000 (16:24 +0000)
committerBarry Warsaw <barry@python.org>
Tue, 23 Jan 2001 16:24:35 +0000 (16:24 +0000)
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().

Objects/object.c

index c1a1303fb0cb06eccbe1929995c26d0cdc42ac43..8a493531d0d33545c0f9e38847af7d8b55354a0b 100644 (file)
@@ -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*/