[Python-Dev] PyErr_NoMemory

Guido van Rossum guido@python.org
Fri, 18 Aug 2000 15:23:37 -0400


> The current PyErr_NoMemory() function reads:
>
> PyObject *
> PyErr_NoMemory(void)
> {
>         /* raise the pre-allocated instance if it still exists */
>         if (PyExc_MemoryErrorInst)
>                 PyErr_SetObject(PyExc_MemoryError, PyExc_MemoryErrorInst);
>         else
>                 /* this will probably fail since there's no memory and
hee,
>                    hee, we have to instantiate this class
>                 */
>                 PyErr_SetNone(PyExc_MemoryError);
>
>         return NULL;
> }
>
> thus overriding any previous exceptions unconditionally. This is a
> problem when the current exception already *is* PyExc_MemoryError,
> 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 *
> PyErr_NoMemory(void)
> {
> if (PyErr_ExceptionMatches(PyExc_MemoryError))
> /* already current */
> return NULL;
>
>         /* raise the pre-allocated instance if it still exists */
>         if (PyExc_MemoryErrorInst)
>                 PyErr_SetObject(PyExc_MemoryError, PyExc_MemoryErrorInst);
> ...
>
> 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