mirror of
https://github.com/python/cpython.git
synced 2026-04-20 10:51:00 +00:00
GH-145668: Add FOR_ITER specialization for virtual iterators. Specialize GET_ITER. (GH-147967)
* Add FOR_ITER_VIRTUAL to specialize FOR_ITER for virtual iterators * Add GET_ITER_SELF to specialize GET_ITER for iterators (including generators) * Add GET_ITER_VIRTUAL to specialize GET_ITER for iterables as virtual iterators * Add new (internal) _tp_iteritem function slot to PyTypeObject * Put limited RESUME at start of genexpr for free-threading. Fix up exception handling in genexpr
This commit is contained in:
parent
0fcf2b72d3
commit
600f4dbd54
37 changed files with 2987 additions and 1534 deletions
|
|
@ -1224,12 +1224,17 @@ codegen_wrap_in_stopiteration_handler(compiler *c)
|
|||
{
|
||||
NEW_JUMP_TARGET_LABEL(c, handler);
|
||||
|
||||
/* Insert SETUP_CLEANUP just before RESUME */
|
||||
/* Insert SETUP_CLEANUP just after the initial RETURN_GENERATOR; POP_TOP */
|
||||
instr_sequence *seq = INSTR_SEQUENCE(c);
|
||||
int resume = 0;
|
||||
while (_PyInstructionSequence_GetInstruction(seq, resume).i_opcode != RESUME) {
|
||||
while (_PyInstructionSequence_GetInstruction(seq, resume).i_opcode != RETURN_GENERATOR) {
|
||||
resume++;
|
||||
assert(resume < seq->s_used);
|
||||
}
|
||||
resume++;
|
||||
assert(_PyInstructionSequence_GetInstruction(seq, resume).i_opcode == POP_TOP);
|
||||
resume++;
|
||||
assert(resume < seq->s_used);
|
||||
RETURN_IF_ERROR(
|
||||
_PyInstructionSequence_InsertInstruction(
|
||||
seq, resume,
|
||||
|
|
@ -4977,10 +4982,14 @@ codegen_comprehension(compiler *c, expr_ty e, int type,
|
|||
RETURN_IF_ERROR(
|
||||
_PyInstructionSequence_InsertInstruction(
|
||||
INSTR_SEQUENCE(c), 0,
|
||||
LOAD_FAST, 0, LOC(outermost->iter)));
|
||||
RESUME, RESUME_AT_GEN_EXPR_START, NO_LOCATION));
|
||||
RETURN_IF_ERROR(
|
||||
_PyInstructionSequence_InsertInstruction(
|
||||
INSTR_SEQUENCE(c), 1,
|
||||
LOAD_FAST, 0, LOC(outermost->iter)));
|
||||
RETURN_IF_ERROR(
|
||||
_PyInstructionSequence_InsertInstruction(
|
||||
INSTR_SEQUENCE(c), 2,
|
||||
outermost->is_async ? GET_AITER : GET_ITER,
|
||||
0, LOC(outermost->iter)));
|
||||
iter_state = ITERATOR_ON_STACK;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue