summaryrefslogtreecommitdiffstats
path: root/Objects/frameobject.c
diff options
context:
space:
mode:
authorIrit Katriel <1055913+iritkatriel@users.noreply.github.com>2022-04-11 09:40:24 (GMT)
committerGitHub <noreply@github.com>2022-04-11 09:40:24 (GMT)
commitdd207a6ac52d4bd9a71cf178fc1d5c17a6f07aff (patch)
treec196769c21e856595b8c90adc5205b2372234f02 /Objects/frameobject.c
parent98ff4a68773c49619d486c7e758ebbe1662f8387 (diff)
downloadcpython-dd207a6ac52d4bd9a71cf178fc1d5c17a6f07aff.zip
cpython-dd207a6ac52d4bd9a71cf178fc1d5c17a6f07aff.tar.gz
cpython-dd207a6ac52d4bd9a71cf178fc1d5c17a6f07aff.tar.bz2
bpo-47120: make POP_JUMP_IF_TRUE/FALSE/NONE/NOT_NONE relative (GH-32400)
Diffstat (limited to 'Objects/frameobject.c')
-rw-r--r--Objects/frameobject.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/Objects/frameobject.c b/Objects/frameobject.c
index 5bb8937..7a4d2fa 100644
--- a/Objects/frameobject.c
+++ b/Objects/frameobject.c
@@ -206,11 +206,21 @@ mark_stacks(PyCodeObject *code_obj, int len)
switch (opcode) {
case JUMP_IF_FALSE_OR_POP:
case JUMP_IF_TRUE_OR_POP:
- case POP_JUMP_IF_FALSE:
- case POP_JUMP_IF_TRUE:
+ case POP_JUMP_FORWARD_IF_FALSE:
+ case POP_JUMP_BACKWARD_IF_FALSE:
+ case POP_JUMP_FORWARD_IF_TRUE:
+ case POP_JUMP_BACKWARD_IF_TRUE:
{
int64_t target_stack;
int j = get_arg(code, i);
+ if (opcode == POP_JUMP_FORWARD_IF_FALSE ||
+ opcode == POP_JUMP_FORWARD_IF_TRUE) {
+ j += i + 1;
+ }
+ else if (opcode == POP_JUMP_BACKWARD_IF_FALSE ||
+ opcode == POP_JUMP_BACKWARD_IF_TRUE) {
+ j = i + 1 - j;
+ }
assert(j < len);
if (stacks[j] == UNINITIALIZED && j < i) {
todo = 1;