[Python-Dev] PyErr_NoMemory (original) (raw)
Guido van Rossum guido@python.org
Fri, 18 Aug 2000 15:23:37 -0400
- Previous message: [Python-Dev] RE: Introducing memprof (was PyErr_NoMemory)
- Next message: [Python-Dev] Cookie.py module, and Web PEP
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
The current PyErrNoMemory() function reads:
PyObject * PyErrNoMemory(void) { /* raise the pre-allocated instance if it still exists */ if (PyExcMemoryErrorInst) PyErrSetObject(PyExcMemoryError, PyExcMemoryErrorInst); else /* this will probably fail since there's no memory and hee, hee, we have to instantiate this class */ PyErrSetNone(PyExcMemoryError); return NULL; } thus overriding any previous exceptions unconditionally. This is a problem when the current exception already is PyExcMemoryError, notably when we have a chain (cascade) of memory errors. It is a problem because the original memory error and eventually its error message is lost. I suggest to make this code look like: PyObject * PyErrNoMemory(void) { if (PyErrExceptionMatches(PyExcMemoryError)) /* already current */ return NULL; /* raise the pre-allocated instance if it still exists */ if (PyExcMemoryErrorInst) PyErrSetObject(PyExcMemoryError, PyExcMemoryErrorInst); ... If nobody sees a problem with this, I'm very tempted to check it in. Any objections?
+1. The cascading memory error seems a likely scenario indeed: something returns a memory error, the error handling does some more stuff, and hits more memory errors.
--Guido
- Previous message: [Python-Dev] RE: Introducing memprof (was PyErr_NoMemory)
- Next message: [Python-Dev] Cookie.py module, and Web PEP
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]