mirror of
https://github.com/python/cpython.git
synced 2025-08-23 10:16:01 +00:00
GH-122155: Track local variables between pops and pushes in cases generator (GH-122286)
This commit is contained in:
parent
46f5a4f9e1
commit
a9d56e38a0
13 changed files with 463 additions and 159 deletions
12
Python/executor_cases.c.h
generated
12
Python/executor_cases.c.h
generated
|
@ -1440,9 +1440,11 @@
|
|||
|
||||
case _UNPACK_SEQUENCE: {
|
||||
_PyStackRef seq;
|
||||
_PyStackRef *output;
|
||||
oparg = CURRENT_OPARG();
|
||||
seq = stack_pointer[-1];
|
||||
_PyStackRef *top = stack_pointer + oparg - 1;
|
||||
output = &stack_pointer[-1];
|
||||
_PyStackRef *top = output + oparg;
|
||||
int res = _PyEval_UnpackIterableStackRef(tstate, seq, oparg, -1, top);
|
||||
PyStackRef_CLOSE(seq);
|
||||
if (res == 0) JUMP_TO_ERROR();
|
||||
|
@ -1532,14 +1534,15 @@
|
|||
|
||||
case _UNPACK_EX: {
|
||||
_PyStackRef seq;
|
||||
_PyStackRef *right;
|
||||
oparg = CURRENT_OPARG();
|
||||
seq = stack_pointer[-1];
|
||||
int totalargs = 1 + (oparg & 0xFF) + (oparg >> 8);
|
||||
_PyStackRef *top = stack_pointer + totalargs - 1;
|
||||
right = &stack_pointer[(oparg & 0xFF)];
|
||||
_PyStackRef *top = right + (oparg >> 8);
|
||||
int res = _PyEval_UnpackIterableStackRef(tstate, seq, oparg & 0xFF, oparg >> 8, top);
|
||||
PyStackRef_CLOSE(seq);
|
||||
if (res == 0) JUMP_TO_ERROR();
|
||||
stack_pointer += (oparg >> 8) + (oparg & 0xFF);
|
||||
stack_pointer += (oparg & 0xFF) + (oparg >> 8);
|
||||
assert(WITHIN_STACK_BOUNDS());
|
||||
break;
|
||||
}
|
||||
|
@ -3595,6 +3598,7 @@
|
|||
args = &stack_pointer[-oparg];
|
||||
self_or_null = stack_pointer[-1 - oparg];
|
||||
callable = stack_pointer[-2 - oparg];
|
||||
args = &stack_pointer[-oparg];
|
||||
if (PyStackRef_TYPE(callable) == &PyMethod_Type && PyStackRef_IsNull(self_or_null)) {
|
||||
PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
|
||||
PyObject *self = ((PyMethodObject *)callable_o)->im_self;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue