|
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