mirror of
https://github.com/python/cpython.git
synced 2025-11-01 14:11:41 +00:00
bpo-42085: Introduce dedicated entry in PyAsyncMethods for sending values (#22780)
This commit is contained in:
parent
e59b2deffd
commit
1e996c3a3b
13 changed files with 146 additions and 49 deletions
|
|
@ -268,30 +268,10 @@ gen_send_ex2(PyGenObject *gen, PyObject *arg, PyObject **presult,
|
|||
return result ? PYGEN_RETURN : PYGEN_ERROR;
|
||||
}
|
||||
|
||||
PySendResult
|
||||
PyIter_Send(PyObject *iter, PyObject *arg, PyObject **result)
|
||||
static PySendResult
|
||||
PyGen_am_send(PyGenObject *gen, PyObject *arg, PyObject **result)
|
||||
{
|
||||
_Py_IDENTIFIER(send);
|
||||
assert(arg != NULL);
|
||||
assert(result != NULL);
|
||||
|
||||
if (PyGen_CheckExact(iter) || PyCoro_CheckExact(iter)) {
|
||||
return gen_send_ex2((PyGenObject *)iter, arg, result, 0, 0);
|
||||
}
|
||||
|
||||
if (arg == Py_None && PyIter_Check(iter)) {
|
||||
*result = Py_TYPE(iter)->tp_iternext(iter);
|
||||
}
|
||||
else {
|
||||
*result = _PyObject_CallMethodIdOneArg(iter, &PyId_send, arg);
|
||||
}
|
||||
if (*result != NULL) {
|
||||
return PYGEN_NEXT;
|
||||
}
|
||||
if (_PyGen_FetchStopIterationValue(result) == 0) {
|
||||
return PYGEN_RETURN;
|
||||
}
|
||||
return PYGEN_ERROR;
|
||||
return gen_send_ex2(gen, arg, result, 0, 0);
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
|
|
@ -788,6 +768,14 @@ static PyMethodDef gen_methods[] = {
|
|||
{NULL, NULL} /* Sentinel */
|
||||
};
|
||||
|
||||
static PyAsyncMethods gen_as_async = {
|
||||
0, /* am_await */
|
||||
0, /* am_aiter */
|
||||
0, /* am_anext */
|
||||
(sendfunc)PyGen_am_send, /* am_send */
|
||||
};
|
||||
|
||||
|
||||
PyTypeObject PyGen_Type = {
|
||||
PyVarObject_HEAD_INIT(&PyType_Type, 0)
|
||||
"generator", /* tp_name */
|
||||
|
|
@ -798,7 +786,7 @@ PyTypeObject PyGen_Type = {
|
|||
0, /* tp_vectorcall_offset */
|
||||
0, /* tp_getattr */
|
||||
0, /* tp_setattr */
|
||||
0, /* tp_as_async */
|
||||
&gen_as_async, /* tp_as_async */
|
||||
(reprfunc)gen_repr, /* tp_repr */
|
||||
0, /* tp_as_number */
|
||||
0, /* tp_as_sequence */
|
||||
|
|
@ -809,7 +797,8 @@ PyTypeObject PyGen_Type = {
|
|||
PyObject_GenericGetAttr, /* tp_getattro */
|
||||
0, /* tp_setattro */
|
||||
0, /* tp_as_buffer */
|
||||
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
|
||||
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
|
||||
Py_TPFLAGS_HAVE_AM_SEND, /* tp_flags */
|
||||
0, /* tp_doc */
|
||||
(traverseproc)gen_traverse, /* tp_traverse */
|
||||
0, /* tp_clear */
|
||||
|
|
@ -1031,7 +1020,8 @@ static PyMethodDef coro_methods[] = {
|
|||
static PyAsyncMethods coro_as_async = {
|
||||
(unaryfunc)coro_await, /* am_await */
|
||||
0, /* am_aiter */
|
||||
0 /* am_anext */
|
||||
0, /* am_anext */
|
||||
(sendfunc)PyGen_am_send, /* am_send */
|
||||
};
|
||||
|
||||
PyTypeObject PyCoro_Type = {
|
||||
|
|
@ -1055,7 +1045,8 @@ PyTypeObject PyCoro_Type = {
|
|||
PyObject_GenericGetAttr, /* tp_getattro */
|
||||
0, /* tp_setattro */
|
||||
0, /* tp_as_buffer */
|
||||
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
|
||||
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
|
||||
Py_TPFLAGS_HAVE_AM_SEND, /* tp_flags */
|
||||
0, /* tp_doc */
|
||||
(traverseproc)gen_traverse, /* tp_traverse */
|
||||
0, /* tp_clear */
|
||||
|
|
@ -1413,7 +1404,8 @@ static PyMethodDef async_gen_methods[] = {
|
|||
static PyAsyncMethods async_gen_as_async = {
|
||||
0, /* am_await */
|
||||
PyObject_SelfIter, /* am_aiter */
|
||||
(unaryfunc)async_gen_anext /* am_anext */
|
||||
(unaryfunc)async_gen_anext, /* am_anext */
|
||||
(sendfunc)PyGen_am_send, /* am_send */
|
||||
};
|
||||
|
||||
|
||||
|
|
@ -1438,7 +1430,8 @@ PyTypeObject PyAsyncGen_Type = {
|
|||
PyObject_GenericGetAttr, /* tp_getattro */
|
||||
0, /* tp_setattro */
|
||||
0, /* tp_as_buffer */
|
||||
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
|
||||
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
|
||||
Py_TPFLAGS_HAVE_AM_SEND, /* tp_flags */
|
||||
0, /* tp_doc */
|
||||
(traverseproc)async_gen_traverse, /* tp_traverse */
|
||||
0, /* tp_clear */
|
||||
|
|
@ -1676,7 +1669,8 @@ static PyMethodDef async_gen_asend_methods[] = {
|
|||
static PyAsyncMethods async_gen_asend_as_async = {
|
||||
PyObject_SelfIter, /* am_await */
|
||||
0, /* am_aiter */
|
||||
0 /* am_anext */
|
||||
0, /* am_anext */
|
||||
0, /* am_send */
|
||||
};
|
||||
|
||||
|
||||
|
|
@ -2084,7 +2078,8 @@ static PyMethodDef async_gen_athrow_methods[] = {
|
|||
static PyAsyncMethods async_gen_athrow_as_async = {
|
||||
PyObject_SelfIter, /* am_await */
|
||||
0, /* am_aiter */
|
||||
0 /* am_anext */
|
||||
0, /* am_anext */
|
||||
0, /* am_send */
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue