Skip to content

Commit 7f836e3

Browse files
Merge pull request #9 from johnslavik/hyperawait-hyperfix
2 parents f0c1ecc + bb5324c commit 7f836e3

File tree

2 files changed

+62
-63
lines changed

2 files changed

+62
-63
lines changed

Lib/test/test_async_yield_from.py

Lines changed: 61 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -373,69 +373,68 @@ async def pex(e):
373373
"value = eggs",
374374
])
375375

376-
# @_async_test
377-
# async def test_exception_value_crash(self):
378-
# # There used to be a refcount error when the return value
379-
# # stored in the StopAsyncIteration has a refcount of 1.
380-
# async def g1():
381-
# async yield from g2()
382-
# async def g2():
383-
# yield "g2"
384-
# return [42]
385-
# self.assertEqual([x async for x in g1()], ["g2"])
386-
376+
@_async_test
377+
async def test_exception_value_crash(self):
378+
# There used to be a refcount error when the return value
379+
# stored in the StopAsyncIteration has a refcount of 1.
380+
async def g1():
381+
async yield from g2()
382+
async def g2():
383+
yield "g2"
384+
return object()
385+
self.assertEqual([x async for x in g1()], ["g2"])
387386

388-
# @_async_test
389-
# async def test_generator_return_value(self):
390-
# """
391-
# Test generator return value
392-
# """
393-
# trace = []
394-
# async def g1():
395-
# trace.append("Starting g1")
396-
# yield "g1 ham"
397-
# ret = async yield from g2()
398-
# trace.append("g2 returned %r" % (ret,))
399-
# for v in 1, (2,), StopAsyncIteration(3):
400-
# ret = async yield from g2(v)
401-
# trace.append("g2 returned %r" % (ret,))
402-
# yield "g1 eggs"
403-
# trace.append("Finishing g1")
404-
# async def g2(v = None):
405-
# trace.append("Starting g2")
406-
# yield "g2 spam"
407-
# yield "g2 more spam"
408-
# trace.append("Finishing g2")
409-
# if v:
410-
# return v
411-
# async for x in g1():
412-
# trace.append("Yielded %s" % (x,))
413-
# self.assertEqual(trace,[
414-
# "Starting g1",
415-
# "Yielded g1 ham",
416-
# "Starting g2",
417-
# "Yielded g2 spam",
418-
# "Yielded g2 more spam",
419-
# "Finishing g2",
420-
# "g2 returned None",
421-
# "Starting g2",
422-
# "Yielded g2 spam",
423-
# "Yielded g2 more spam",
424-
# "Finishing g2",
425-
# "g2 returned 1",
426-
# "Starting g2",
427-
# "Yielded g2 spam",
428-
# "Yielded g2 more spam",
429-
# "Finishing g2",
430-
# "g2 returned (2,)",
431-
# "Starting g2",
432-
# "Yielded g2 spam",
433-
# "Yielded g2 more spam",
434-
# "Finishing g2",
435-
# "g2 returned StopAsyncIteration(3)",
436-
# "Yielded g1 eggs",
437-
# "Finishing g1",
438-
# ])
387+
@_async_test
388+
async def test_generator_return_value(self):
389+
"""
390+
Test generator return value
391+
"""
392+
trace = []
393+
async def g1():
394+
trace.append("Starting g1")
395+
yield "g1 ham"
396+
ret = async yield from g2()
397+
trace.append("g2 returned %r" % (ret,))
398+
for v in 1, (2,), StopAsyncIteration(3):
399+
ret = async yield from g2(v)
400+
trace.append("g2 returned %r" % (ret,))
401+
yield "g1 eggs"
402+
trace.append("Finishing g1")
403+
async def g2(v = None):
404+
trace.append("Starting g2")
405+
yield "g2 spam"
406+
yield "g2 more spam"
407+
trace.append("Finishing g2")
408+
if v:
409+
return v
410+
async for x in g1():
411+
trace.append("Yielded %s" % (x,))
412+
self.assertEqual(trace,[
413+
"Starting g1",
414+
"Yielded g1 ham",
415+
"Starting g2",
416+
"Yielded g2 spam",
417+
"Yielded g2 more spam",
418+
"Finishing g2",
419+
"g2 returned None",
420+
"Starting g2",
421+
"Yielded g2 spam",
422+
"Yielded g2 more spam",
423+
"Finishing g2",
424+
"g2 returned 1",
425+
"Starting g2",
426+
"Yielded g2 spam",
427+
"Yielded g2 more spam",
428+
"Finishing g2",
429+
"g2 returned (2,)",
430+
"Starting g2",
431+
"Yielded g2 spam",
432+
"Yielded g2 more spam",
433+
"Finishing g2",
434+
"g2 returned StopAsyncIteration(3)",
435+
"Yielded g1 eggs",
436+
"Finishing g1",
437+
])
439438

440439
@_async_test
441440
async def test_delegation_of_anext_to_non_generator(self):

Objects/exceptions.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -746,7 +746,7 @@ StopAsyncIteration_init(PyObject *op, PyObject *args, PyObject *kwds)
746746
PyStopAsyncIterationObject *self = PyStopAsyncIterationObject_CAST(op);
747747
Py_CLEAR(self->value);
748748
if (size > 0) {
749-
self->value = PyTuple_GET_ITEM(args, 0);
749+
self->value = Py_NewRef(PyTuple_GET_ITEM(args, 0));
750750
}
751751
else {
752752
self->value = Py_None;

0 commit comments

Comments
 (0)