mirror of
https://github.com/python/cpython.git
synced 2025-10-21 14:12:27 +00:00
Correct one of the "MemoryError oddities":
the traceback would grow each time a MemoryError is raised.
This commit is contained in:
parent
a986dfa927
commit
e19cadb427
2 changed files with 28 additions and 0 deletions
|
@ -596,6 +596,24 @@ class ExceptionTests(unittest.TestCase):
|
||||||
"Exception ValueError: ValueError() "
|
"Exception ValueError: ValueError() "
|
||||||
"in <class 'KeyError'> ignored\n")
|
"in <class 'KeyError'> ignored\n")
|
||||||
|
|
||||||
|
|
||||||
|
def test_MemoryError(self):
|
||||||
|
# PyErr_NoMemory always raises the same exception instance.
|
||||||
|
# Check that the traceback is not doubled.
|
||||||
|
import traceback
|
||||||
|
def raiseMemError():
|
||||||
|
try:
|
||||||
|
"a" * (sys.maxsize // 2)
|
||||||
|
except MemoryError as e:
|
||||||
|
tb = e.__traceback__
|
||||||
|
else:
|
||||||
|
self.fail("Should have raises a MemoryError")
|
||||||
|
return traceback.format_tb(tb)
|
||||||
|
|
||||||
|
tb1 = raiseMemError()
|
||||||
|
tb2 = raiseMemError()
|
||||||
|
self.assertEqual(tb1, tb2)
|
||||||
|
|
||||||
def test_main():
|
def test_main():
|
||||||
run_unittest(ExceptionTests)
|
run_unittest(ExceptionTests)
|
||||||
|
|
||||||
|
|
|
@ -321,7 +321,17 @@ PyErr_NoMemory(void)
|
||||||
|
|
||||||
/* raise the pre-allocated instance if it still exists */
|
/* raise the pre-allocated instance if it still exists */
|
||||||
if (PyExc_MemoryErrorInst)
|
if (PyExc_MemoryErrorInst)
|
||||||
|
{
|
||||||
|
/* Clear the previous traceback, otherwise it will be appended
|
||||||
|
* to the current one.
|
||||||
|
*
|
||||||
|
* The following statement is not likely to raise any error;
|
||||||
|
* if it does, we simply discard it.
|
||||||
|
*/
|
||||||
|
PyException_SetTraceback(PyExc_MemoryErrorInst, Py_None);
|
||||||
|
|
||||||
PyErr_SetObject(PyExc_MemoryError, PyExc_MemoryErrorInst);
|
PyErr_SetObject(PyExc_MemoryError, PyExc_MemoryErrorInst);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
/* this will probably fail since there's no memory and hee,
|
/* this will probably fail since there's no memory and hee,
|
||||||
hee, we have to instantiate this class
|
hee, we have to instantiate this class
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue