[Python-Dev] PyErr_NoMemory

Tim Peters tim_one@email.msn.com
2000年8月18日 01:43:14 -0400


[Vladimir Marangozov]
> 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?

Looks good to me. And if it breaks something, it will be darned hard to
tell <wink>.

AltStyle によって変換されたページ (->オリジナル) /