Kaydet (Commit) f6e50b4a authored tarafından Benjamin Peterson's avatar Benjamin Peterson

fix sending tuples to custom generator objects with yield from (closes #21209)

Debugged by Victor.
üst 584f5cbf
...@@ -993,6 +993,25 @@ class TestPEP380Operation(unittest.TestCase): ...@@ -993,6 +993,25 @@ class TestPEP380Operation(unittest.TestCase):
del inner_gen del inner_gen
gc_collect() gc_collect()
def test_send_tuple_with_custom_generator(self):
# See issue #21209.
class MyGen:
def __iter__(self):
return self
def __next__(self):
return 42
def send(self, what):
nonlocal v
v = what
return None
def outer():
v = yield from MyGen()
g = outer()
next(g)
v = None
g.send((1, 2, 3, 4))
self.assertEqual(v, (1, 2, 3, 4))
def test_main(): def test_main():
from test import support from test import support
......
...@@ -10,6 +10,9 @@ Release date: TBA ...@@ -10,6 +10,9 @@ Release date: TBA
Core and Builtins Core and Builtins
----------------- -----------------
- Issue #21209: Fix sending tuples to custom generator objects with the yield
from syntax.
- Issue #21134: Fix segfault when str is called on an uninitialized - Issue #21134: Fix segfault when str is called on an uninitialized
UnicodeEncodeError, UnicodeDecodeError, or UnicodeTranslateError object. UnicodeEncodeError, UnicodeDecodeError, or UnicodeTranslateError object.
......
...@@ -1902,7 +1902,7 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag) ...@@ -1902,7 +1902,7 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
if (v == Py_None) if (v == Py_None)
retval = Py_TYPE(reciever)->tp_iternext(reciever); retval = Py_TYPE(reciever)->tp_iternext(reciever);
else else
retval = _PyObject_CallMethodId(reciever, &PyId_send, "O", v); retval = _PyObject_CallMethodIdObjArgs(reciever, &PyId_send, v, NULL);
} }
Py_DECREF(v); Py_DECREF(v);
if (retval == NULL) { if (retval == NULL) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment