mirror of
https://github.com/python/cpython.git
synced 2026-01-21 22:59:06 +00:00
GH-143493: Conform to spec for generator expressions while supporting virtual iterators (GH-143569)
* Moves the `GET_ITER` instruction into the generator function preamble. This means the the iterable is converted into an iterator during generator creation, as documented, but keeps it in the same code object allowing optimization.
This commit is contained in:
parent
c461aa99e2
commit
ae53da5758
14 changed files with 117 additions and 88 deletions
|
|
@ -3189,14 +3189,15 @@ dummy_func(
|
|||
#ifdef Py_STATS
|
||||
_Py_GatherStats_GetIter(iterable);
|
||||
#endif
|
||||
/* before: [obj]; after [getiter(obj)] */
|
||||
PyTypeObject *tp = PyStackRef_TYPE(iterable);
|
||||
if (tp == &PyTuple_Type || tp == &PyList_Type) {
|
||||
/* Leave iterable on stack and pushed tagged 0 */
|
||||
iter = iterable;
|
||||
DEAD(iterable);
|
||||
index_or_null = PyStackRef_TagInt(0);
|
||||
}
|
||||
else {
|
||||
/* Pop iterable, and push iterator then NULL */
|
||||
PyObject *iter_o = PyObject_GetIter(PyStackRef_AsPyObjectBorrow(iterable));
|
||||
PyStackRef_CLOSE(iterable);
|
||||
ERROR_IF(iter_o == NULL);
|
||||
|
|
@ -5033,7 +5034,7 @@ dummy_func(
|
|||
PyFunctionObject *func = (PyFunctionObject *)PyStackRef_AsPyObjectBorrow(frame->f_funcobj);
|
||||
PyGenObject *gen = (PyGenObject *)_Py_MakeCoro(func);
|
||||
ERROR_IF(gen == NULL);
|
||||
assert(STACK_LEVEL() == 0);
|
||||
assert(STACK_LEVEL() <= 2);
|
||||
SAVE_STACK();
|
||||
_PyInterpreterFrame *gen_frame = &gen->gi_iframe;
|
||||
frame->instr_ptr++;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue