diff options
author | Guido van Rossum <guido@python.org> | 1997-08-05 02:04:34 (GMT) |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 1997-08-05 02:04:34 (GMT) |
commit | e09fb55f297c41a6a05c9c9ab2f773034c35c689 (patch) | |
tree | 7ea9f30294df202fce2577f1164abf22c178954d /Objects/object.c | |
parent | d085e88d3cb826fb144d4ca7544d247680d7a241 (diff) | |
download | cpython-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.c | 87 |
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); +} |