Skip to content

Commit 9a35794

Browse files
authored
GH-111485: Fix handling of FOR_ITER in Tier 2 (GH-113394)
1 parent 0c57454 commit 9a35794

File tree

1 file changed

+5
-12
lines changed

1 file changed

+5
-12
lines changed

Python/optimizer.c

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -518,11 +518,11 @@ translate_bytecode_to_trace(
518518

519519
uint32_t opcode = instr->op.code;
520520
uint32_t oparg = instr->op.arg;
521-
uint32_t extras = 0;
521+
uint32_t extended = 0;
522522

523523
if (opcode == EXTENDED_ARG) {
524524
instr++;
525-
extras += 1;
525+
extended = 1;
526526
opcode = instr->op.code;
527527
oparg = (oparg << 8) | instr->op.arg;
528528
if (opcode == EXTENDED_ARG) {
@@ -577,6 +577,7 @@ translate_bytecode_to_trace(
577577
}
578578

579579
case JUMP_BACKWARD:
580+
case JUMP_BACKWARD_NO_INTERRUPT:
580581
{
581582
if (instr + 2 - oparg == initial_instr && code == initial_code) {
582583
RESERVE(1);
@@ -623,15 +624,7 @@ translate_bytecode_to_trace(
623624
int offset = expansion->uops[i].offset + 1;
624625
switch (expansion->uops[i].size) {
625626
case OPARG_FULL:
626-
if (extras && OPCODE_HAS_JUMP(opcode)) {
627-
if (opcode == JUMP_BACKWARD_NO_INTERRUPT) {
628-
oparg -= extras;
629-
}
630-
else {
631-
assert(opcode != JUMP_BACKWARD);
632-
oparg += extras;
633-
}
634-
}
627+
assert(opcode != JUMP_BACKWARD_NO_INTERRUPT && opcode != JUMP_BACKWARD);
635628
break;
636629
case OPARG_CACHE_1:
637630
operand = read_u16(&instr[offset].cache);
@@ -656,7 +649,7 @@ translate_bytecode_to_trace(
656649
uop = _PyUOp_Replacements[uop];
657650
assert(uop != 0);
658651
if (uop == _FOR_ITER_TIER_TWO) {
659-
target += 1 + INLINE_CACHE_ENTRIES_FOR_ITER + oparg + 1;
652+
target += 1 + INLINE_CACHE_ENTRIES_FOR_ITER + oparg + 1 + extended;
660653
assert(_PyCode_CODE(code)[target-1].op.code == END_FOR ||
661654
_PyCode_CODE(code)[target-1].op.code == INSTRUMENTED_END_FOR);
662655
}

0 commit comments

Comments
 (0)