diff options
| author | Irit Katriel <1055913+iritkatriel@users.noreply.github.com> | 2022-04-15 19:19:24 (GMT) |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-04-15 19:19:24 (GMT) |
| commit | ea2ae026078b328ddeab060940568a4d3bf1b417 (patch) | |
| tree | fba97e66d949767124286ee10bfd64fc56e60a99 /Python | |
| parent | 5d421d7342fc0d278c129c05bea7028430e94a4e (diff) | |
| download | cpython-ea2ae026078b328ddeab060940568a4d3bf1b417.zip cpython-ea2ae026078b328ddeab060940568a4d3bf1b417.tar.gz cpython-ea2ae026078b328ddeab060940568a4d3bf1b417.tar.bz2 | |
gh-91276: Make JUMP_IF_TRUE_OR_POP/JUMP_IF_FALSE_OR_POP relative (GH-32215)
Diffstat (limited to 'Python')
| -rw-r--r-- | Python/ceval.c | 8 | ||||
| -rw-r--r-- | Python/compile.c | 15 |
2 files changed, 19 insertions, 4 deletions
diff --git a/Python/ceval.c b/Python/ceval.c index 7891547..66856e5 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -4081,7 +4081,7 @@ handle_eval_breaker: DISPATCH(); } if (Py_IsFalse(cond)) { - JUMPTO(oparg); + JUMPBY(oparg); DISPATCH(); } err = PyObject_IsTrue(cond); @@ -4090,7 +4090,7 @@ handle_eval_breaker: Py_DECREF(cond); } else if (err == 0) - JUMPTO(oparg); + JUMPBY(oparg); else goto error; DISPATCH(); @@ -4105,12 +4105,12 @@ handle_eval_breaker: DISPATCH(); } if (Py_IsTrue(cond)) { - JUMPTO(oparg); + JUMPBY(oparg); DISPATCH(); } err = PyObject_IsTrue(cond); if (err > 0) { - JUMPTO(oparg); + JUMPBY(oparg); } else if (err == 0) { STACK_SHRINK(1); diff --git a/Python/compile.c b/Python/compile.c index 718b521..3b91566 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -7672,6 +7672,21 @@ normalize_jumps(struct assembler *a) last->i_opcode = is_forward ? POP_JUMP_FORWARD_IF_TRUE : POP_JUMP_BACKWARD_IF_TRUE; break; + case JUMP_IF_TRUE_OR_POP: + case JUMP_IF_FALSE_OR_POP: + if (!is_forward) { + /* As far as we can tell, the compiler never emits + * these jumps with a backwards target. If/when this + * exception is raised, we have found a use case for + * a backwards version of this jump (or to replace + * it with the sequence (COPY 1, POP_JUMP_IF_T/F, POP) + */ + PyErr_Format(PyExc_SystemError, + "unexpected %s jumping backwards", + last->i_opcode == JUMP_IF_TRUE_OR_POP ? + "JUMP_IF_TRUE_OR_POP" : "JUMP_IF_FALSE_OR_POP"); + } + break; } } } |
