summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/test/test_pep380.py11
-rw-r--r--Objects/genobject.c3
2 files changed, 13 insertions, 1 deletions
diff --git a/Lib/test/test_pep380.py b/Lib/test/test_pep380.py
index 6554b0f..3a1db29 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 20c926b..b32d9b6 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;
}