From: Amaury Forgeot d'Arc Date: Fri, 13 Jan 2012 20:06:12 +0000 (+0100) Subject: Fix a crash when the return value of a subgenerator is a temporary X-Git-Tag: v3.3.0a1~423 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=e557da804aae6ae6478809243c349659f5c3e722;p=thirdparty%2FPython%2Fcpython.git Fix a crash when the return value of a subgenerator is a temporary object (with a refcount of 1) --- diff --git a/Lib/test/test_pep380.py b/Lib/test/test_pep380.py index 6554b0fa5c6d..3a1db2915c6e 100644 --- a/Lib/test/test_pep380.py +++ b/Lib/test/test_pep380.py @@ -364,6 +364,17 @@ class TestPEP380Operation(unittest.TestCase): ]) + def test_exception_value_crash(self): + # There used to be a refcount error when the return value + # stored in the StopIteration has a refcount of 1. + def g1(): + yield from g2() + def g2(): + yield "g2" + return [42] + self.assertEqual(list(g1()), ["g2"]) + + def test_generator_return_value(self): """ Test generator return value diff --git a/Objects/genobject.c b/Objects/genobject.c index 20c926b79f48..b32d9b68fc3c 100644 --- a/Objects/genobject.c +++ b/Objects/genobject.c @@ -475,6 +475,7 @@ PyGen_FetchStopIterationValue(PyObject **pvalue) { Py_XDECREF(tb); if (ev) { value = ((PyStopIterationObject *)ev)->value; + Py_INCREF(value); Py_DECREF(ev); } } else if (PyErr_Occurred()) { @@ -482,8 +483,8 @@ PyGen_FetchStopIterationValue(PyObject **pvalue) { } if (value == NULL) { value = Py_None; + Py_INCREF(value); } - Py_INCREF(value); *pvalue = value; return 0; }