summaryrefslogtreecommitdiffstats
path: root/Objects/object.c
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>1997-08-05 02:04:34 (GMT)
committerGuido van Rossum <guido@python.org>1997-08-05 02:04:34 (GMT)
commite09fb55f297c41a6a05c9c9ab2f773034c35c689 (patch)
tree7ea9f30294df202fce2577f1164abf22c178954d /Objects/object.c
parentd085e88d3cb826fb144d4ca7544d247680d7a241 (diff)
downloadcpython-e09fb55f297c41a6a05c9c9ab2f773034c35c689.zip
cpython-e09fb55f297c41a6a05c9c9ab2f773034c35c689.tar.gz
cpython-e09fb55f297c41a6a05c9c9ab2f773034c35c689.tar.bz2
Added _Py_ResetReferences(), if tracing references.
In _Py_PrintReferences(), no longer suppress once-referenced string. Add Py_Malloc and friends and PyMem_Malloc and friends (malloc wrappers for third parties).
Diffstat (limited to 'Objects/object.c')
-rw-r--r--Objects/object.c87
1 files changed, 84 insertions, 3 deletions
diff --git a/Objects/object.c b/Objects/object.c
index 023477f..83829d2 100644
--- a/Objects/object.c
+++ b/Objects/object.c
@@ -570,6 +570,13 @@ PyObject _Py_NoneStruct = {
static PyObject refchain = {&refchain, &refchain};
void
+_Py_ResetReferences()
+{
+ refchain._ob_prev = refchain._ob_next = &refchain;
+ _Py_RefTotal = 0;
+}
+
+void
_Py_NewReference(op)
PyObject *op;
{
@@ -625,10 +632,8 @@ _Py_PrintReferences(fp)
FILE *fp;
{
PyObject *op;
- fprintf(fp, "Remaining objects (except strings referenced once):\n");
+ fprintf(fp, "Remaining objects:\n");
for (op = refchain._ob_next; op != &refchain; op = op->_ob_next) {
- if (op->ob_refcnt == 1 && PyString_Check(op))
- continue; /* Will be printed elsewhere */
fprintf(fp, "[%d] ", op->ob_refcnt);
if (PyObject_Print(op, fp, 0) != 0)
PyErr_Clear();
@@ -676,3 +681,79 @@ PyTypeObject *_Py_cobject_hack = &PyCObject_Type;
/* Hack to force loading of abstract.o */
int (*_Py_abstract_hack) Py_FPROTO((PyObject *)) = &PyObject_Length;
+
+
+/* Malloc wrappers (see mymalloc.h) */
+
+/* The Py_{Malloc,Realloc} wrappers call PyErr_NoMemory() on failure */
+
+ANY *
+Py_Malloc(nbytes)
+ size_t nbytes;
+{
+ ANY *p;
+#if _PyMem_EXTRA > 0
+ if (nbytes == 0)
+ nbytes = _PyMem_EXTRA;
+#endif
+ p = malloc(nbytes);
+ if (p != NULL)
+ return p;
+ else
+ return PyErr_NoMemory();
+}
+
+ANY *
+Py_Realloc(p, nbytes)
+ ANY *p;
+ size_t nbytes;
+{
+#if _PyMem_EXTRA > 0
+ if (nbytes == 0)
+ nbytes = _PyMem_EXTRA;
+#endif
+ p = realloc(p, nbytes);
+ if (p != NULL)
+ return p;
+ else
+ return PyErr_NoMemory();
+}
+
+void
+Py_Free(p)
+ ANY *p;
+{
+ free(p);
+}
+
+/* The PyMem_{Malloc,Realloc} wrappers don't call anything on failure */
+
+ANY *
+PyMem_Malloc(nbytes)
+ size_t nbytes;
+{
+#if _PyMem_EXTRA > 0
+ if (nbytes == 0)
+ nbytes = _PyMem_EXTRA;
+#endif
+ return malloc(nbytes);
+}
+
+ANY *
+PyMem_Realloc(p, nbytes)
+ ANY *p;
+ size_t nbytes;
+{
+#if _PyMem_EXTRA > 0
+ if (nbytes == 0)
+ nbytes = _PyMem_EXTRA;
+#endif
+ return realloc(p, nbytes);
+}
+
+void
+PyMem_Free(p)
+ ANY *p;
+{
+ free(p);
+}