summaryrefslogtreecommitdiffstats
path: root/Python/optimizer.c
diff options
context:
space:
mode:
Diffstat (limited to 'Python/optimizer.c')
-rw-r--r--Python/optimizer.c18
1 files changed, 12 insertions, 6 deletions
diff --git a/Python/optimizer.c b/Python/optimizer.c
index 561ec4e..a43eed4 100644
--- a/Python/optimizer.c
+++ b/Python/optimizer.c
@@ -797,6 +797,13 @@ top: // Jump here after _PUSH_FRAME or likely branches
if (uop == _PUSH_FRAME) {
assert(i + 1 == nuops);
+ if (opcode == FOR_ITER_GEN || opcode == SEND_GEN) {
+ DPRINTF(2, "Bailing due to dynamic target\n");
+ ADD_TO_TRACE(uop, oparg, 0, target);
+ ADD_TO_TRACE(_DYNAMIC_EXIT, 0, 0, 0);
+ goto done;
+ }
+ assert(_PyOpcode_Deopt[opcode] == CALL);
int func_version_offset =
offsetof(_PyCallCache, func_version)/sizeof(_Py_CODEUNIT)
// Add one to account for the actual opcode/oparg pair:
@@ -828,12 +835,6 @@ top: // Jump here after _PUSH_FRAME or likely branches
ADD_TO_TRACE(_EXIT_TRACE, 0, 0, 0);
goto done;
}
- if (opcode == FOR_ITER_GEN) {
- DPRINTF(2, "Bailing due to dynamic target\n");
- ADD_TO_TRACE(uop, oparg, 0, target);
- ADD_TO_TRACE(_DYNAMIC_EXIT, 0, 0, 0);
- goto done;
- }
// Increment IP to the return address
instr += _PyOpcode_Caches[_PyOpcode_Deopt[opcode]] + 1;
TRACE_STACK_PUSH();
@@ -886,6 +887,11 @@ top: // Jump here after _PUSH_FRAME or likely branches
instr++;
// Add cache size for opcode
instr += _PyOpcode_Caches[_PyOpcode_Deopt[opcode]];
+
+ if (opcode == CALL_LIST_APPEND) {
+ assert(instr->op.code == POP_TOP);
+ instr++;
+ }
} // End for (;;)
done: