-
-
Notifications
You must be signed in to change notification settings - Fork 32.2k
bpo-42085: Introduce dedicated entry in PyAsyncMethods for sending values #22780
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from all commits
Commits
Show all changes
8 commits
Select commit
Hold shift + click to select a range
cdd612e
Introduce dedicated entry in PyAsyncMethods for sending values
vladima 7fb80fd
PR feedback
vladima d11ba24
Added NEWS
vladima 4635bf1
Added am_send for generators
vladima 6559a1e
Added Py_TPFLAGS_HAVE_SEND flag
vladima 0269d6c
add if-def around Py_TPFLAGS_HAVE_SEND
vladima 5006b27
Updated docs
vladima 016f3e9
fix typo in the signature of sendfunc
vladima File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
1 change: 1 addition & 0 deletions
1
Misc/NEWS.d/next/C API/2020-10-19-15-58-16.bpo-42085.NhEf3W.rst
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
Add dedicated entry to PyAsyncMethods for sending values |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -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 = { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Wait, with this PR regular generators no longer benefit from the faster |
||
(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 */ | ||
}; | ||
|
||
|
||
|
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Should not we add corresponding
Py_TPFLAGS_HAVE_
flag for binary compatibility?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
typeslots.h
should be updated.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Do we support extensions compiled for higher versions of Python in lower versions of Python? If I compile something for 3.10 I wouldn't expect it to work in 3.9.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
IMO we don't need a
Py_TPFLAGS_HAVE_
flag and I don't remember adding one for theas_async
slot when we implemented PEP 492.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
But if you compile something for 3.9 it is expected to work in 3.10 and do not read uninitialized slot.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Perhaps there is a bug in the PEP 492 implementation.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ahh, I see now, thanks for explaining! Yeah, in this case we do need a flag.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Well, I don't think we need to do anything now that
as_async
has been there since 3.5. But looking back, maybe we should have added a flag.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We used an existing slot for PEP-492, so the ABI did not change.
I don't think we necessarily need a new flag. See https://bugs.python.org/issue32388