Commit 1bd03078 authored by Yury Selivanov's avatar Yury Selivanov

asyncio: Prevent StopIteration from being thrown into a Future

Patch by Chris Angelico (issue #26221)
parent dce63234
...@@ -341,6 +341,9 @@ class Future: ...@@ -341,6 +341,9 @@ class Future:
raise InvalidStateError('{}: {!r}'.format(self._state, self)) raise InvalidStateError('{}: {!r}'.format(self._state, self))
if isinstance(exception, type): if isinstance(exception, type):
exception = exception() exception = exception()
if type(exception) is StopIteration:
raise TypeError("StopIteration interacts badly with generators "
"and cannot be raised into a Future")
self._exception = exception self._exception = exception
self._state = _FINISHED self._state = _FINISHED
self._schedule_callbacks() self._schedule_callbacks()
......
...@@ -76,6 +76,10 @@ class FutureTests(test_utils.TestCase): ...@@ -76,6 +76,10 @@ class FutureTests(test_utils.TestCase):
f = asyncio.Future(loop=self.loop) f = asyncio.Future(loop=self.loop)
self.assertRaises(asyncio.InvalidStateError, f.exception) self.assertRaises(asyncio.InvalidStateError, f.exception)
# StopIteration cannot be raised into a Future - CPython issue26221
self.assertRaisesRegex(TypeError, "StopIteration .* cannot be raised",
f.set_exception, StopIteration)
f.set_exception(exc) f.set_exception(exc)
self.assertFalse(f.cancelled()) self.assertFalse(f.cancelled())
self.assertTrue(f.done()) self.assertTrue(f.done())
......
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