mirror of
https://github.com/python/cpython.git
synced 2025-09-26 10:19:53 +00:00
prevent generator finalization from invalidating sys.exc_info() #7173
This commit is contained in:
parent
0e4c22c922
commit
ae5f2f4a39
3 changed files with 19 additions and 2 deletions
|
@ -6,7 +6,8 @@ import unittest
|
|||
import pickle
|
||||
import weakref
|
||||
|
||||
from test.support import TESTFN, unlink, run_unittest, captured_output
|
||||
from test.support import (TESTFN, unlink, run_unittest, captured_output,
|
||||
gc_collect)
|
||||
|
||||
# XXX This is not really enough, each *operation* should be tested!
|
||||
|
||||
|
@ -554,6 +555,20 @@ class ExceptionTests(unittest.TestCase):
|
|||
del g
|
||||
self.assertEquals(sys.exc_info()[0], TypeError)
|
||||
|
||||
def test_generator_finalizing_and_exc_info(self):
|
||||
# See #7173
|
||||
def simple_gen():
|
||||
yield 1
|
||||
def run_gen():
|
||||
gen = simple_gen()
|
||||
try:
|
||||
raise RuntimeError
|
||||
except RuntimeError:
|
||||
return next(gen)
|
||||
run_gen()
|
||||
gc_collect()
|
||||
self.assertEqual(sys.exc_info(), (None, None, None))
|
||||
|
||||
def test_3114(self):
|
||||
# Bug #3114: in its destructor, MyObject retrieves a pointer to
|
||||
# obsolete and/or deallocated objects.
|
||||
|
|
|
@ -12,6 +12,8 @@ What's New in Python 3.2 Alpha 1?
|
|||
Core and Builtins
|
||||
-----------------
|
||||
|
||||
- Issue #7173: Generator finalization could invalidate sys.exc_info().
|
||||
|
||||
- Issue #7544: Preallocate thread memory before creating the thread to avoid
|
||||
a fatal error in low memory condition.
|
||||
|
||||
|
|
|
@ -1159,7 +1159,7 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
|
|||
assert(stack_pointer != NULL);
|
||||
f->f_stacktop = NULL; /* remains NULL unless yield suspends frame */
|
||||
|
||||
if (f->f_code->co_flags & CO_GENERATOR) {
|
||||
if (co->co_flags & CO_GENERATOR && !throwflag) {
|
||||
if (f->f_exc_type != NULL && f->f_exc_type != Py_None) {
|
||||
/* We were in an except handler when we left,
|
||||
restore the exception state which was put aside
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue