|
15 | 15 | #include "pycore_pystate.h" // _PyThreadState_GET() |
16 | 16 |
|
17 | 17 | #include "pystats.h" |
| 18 | +#include "pyerrors.h" |
18 | 19 |
|
19 | 20 | static PyObject *gen_close(PyGenObject *, PyObject *); |
20 | 21 | static PyObject *async_gen_asend_new(PyAsyncGenObject *, PyObject *); |
@@ -1843,8 +1844,25 @@ async_gen_asend_throw(PyAsyncGenASend *o, PyObject *const *args, Py_ssize_t narg |
1843 | 1844 | static PyObject * |
1844 | 1845 | async_gen_asend_close(PyAsyncGenASend *o, PyObject *args) |
1845 | 1846 | { |
1846 | | - o->ags_state = AWAITABLE_STATE_CLOSED; |
1847 | | - Py_RETURN_NONE; |
| 1847 | + PyObject *result; |
| 1848 | + if (o->ags_state == AWAITABLE_STATE_CLOSED) { |
| 1849 | + Py_RETURN_NONE; |
| 1850 | + } |
| 1851 | + result = async_gen_asend_throw(o, &PyExc_GeneratorExit, 1); |
| 1852 | + if (result == NULL) { |
| 1853 | + if (PyErr_ExceptionMatches(PyExc_StopIteration) || |
| 1854 | + PyErr_ExceptionMatches(PyExc_StopAsyncIteration) || |
| 1855 | + PyErr_ExceptionMatches(PyExc_GeneratorExit)) |
| 1856 | + { |
| 1857 | + PyErr_Clear(); |
| 1858 | + Py_RETURN_NONE; |
| 1859 | + } |
| 1860 | + return result; |
| 1861 | + } else { |
| 1862 | + Py_DECREF(result); |
| 1863 | + PyErr_SetString(PyExc_RuntimeError, "coroutine ignored GeneratorExit"); |
| 1864 | + return NULL; |
| 1865 | + } |
1848 | 1866 | } |
1849 | 1867 |
|
1850 | 1868 | static void |
@@ -2288,8 +2306,25 @@ async_gen_athrow_iternext(PyAsyncGenAThrow *o) |
2288 | 2306 | static PyObject * |
2289 | 2307 | async_gen_athrow_close(PyAsyncGenAThrow *o, PyObject *args) |
2290 | 2308 | { |
2291 | | - o->agt_state = AWAITABLE_STATE_CLOSED; |
2292 | | - Py_RETURN_NONE; |
| 2309 | + PyObject *result; |
| 2310 | + if (o->agt_state == AWAITABLE_STATE_CLOSED) { |
| 2311 | + Py_RETURN_NONE; |
| 2312 | + } |
| 2313 | + result = async_gen_athrow_throw(o, &PyExc_GeneratorExit, 1); |
| 2314 | + if (result == NULL) { |
| 2315 | + if (PyErr_ExceptionMatches(PyExc_StopIteration) || |
| 2316 | + PyErr_ExceptionMatches(PyExc_StopAsyncIteration) || |
| 2317 | + PyErr_ExceptionMatches(PyExc_GeneratorExit)) |
| 2318 | + { |
| 2319 | + PyErr_Clear(); |
| 2320 | + Py_RETURN_NONE; |
| 2321 | + } |
| 2322 | + return result; |
| 2323 | + } else { |
| 2324 | + Py_DECREF(result); |
| 2325 | + PyErr_SetString(PyExc_RuntimeError, "coroutine ignored GeneratorExit"); |
| 2326 | + return NULL; |
| 2327 | + } |
2293 | 2328 | } |
2294 | 2329 |
|
2295 | 2330 |
|
|
0 commit comments