mirror of
https://github.com/python/cpython.git
synced 2025-07-07 19:35:27 +00:00
GH-131498: Cases generator: manage stacks automatically (GH-132074)
This commit is contained in:
parent
305be5fb1a
commit
7099c75550
15 changed files with 216 additions and 251 deletions
120
Python/generated_cases.c.h
generated
120
Python/generated_cases.c.h
generated
|
@ -1062,7 +1062,6 @@
|
|||
Py_DECREF(slice);
|
||||
stack_pointer = _PyFrame_GetStackPointer(frame);
|
||||
stack_pointer += 2;
|
||||
assert(WITHIN_STACK_BOUNDS());
|
||||
}
|
||||
stack_pointer += -3;
|
||||
assert(WITHIN_STACK_BOUNDS());
|
||||
|
@ -1498,7 +1497,6 @@
|
|||
JUMP_TO_LABEL(error);
|
||||
}
|
||||
stack_pointer += -1;
|
||||
assert(WITHIN_STACK_BOUNDS());
|
||||
}
|
||||
}
|
||||
stack_pointer[0] = res;
|
||||
|
@ -1983,7 +1981,6 @@
|
|||
JUMP_TO_LABEL(error);
|
||||
}
|
||||
stack_pointer += -1;
|
||||
assert(WITHIN_STACK_BOUNDS());
|
||||
}
|
||||
}
|
||||
stack_pointer[0] = res;
|
||||
|
@ -2097,7 +2094,6 @@
|
|||
JUMP_TO_LABEL(error);
|
||||
}
|
||||
stack_pointer += -1;
|
||||
assert(WITHIN_STACK_BOUNDS());
|
||||
}
|
||||
}
|
||||
stack_pointer[0] = res;
|
||||
|
@ -2212,7 +2208,6 @@
|
|||
JUMP_TO_LABEL(error);
|
||||
}
|
||||
stack_pointer += -1;
|
||||
assert(WITHIN_STACK_BOUNDS());
|
||||
}
|
||||
}
|
||||
stack_pointer[0] = res;
|
||||
|
@ -2305,7 +2300,6 @@
|
|||
JUMP_TO_LABEL(error);
|
||||
}
|
||||
stack_pointer += -1;
|
||||
assert(WITHIN_STACK_BOUNDS());
|
||||
}
|
||||
}
|
||||
stack_pointer[0] = res;
|
||||
|
@ -2366,7 +2360,6 @@
|
|||
stack_pointer = _PyFrame_GetStackPointer(frame);
|
||||
tuple = PyStackRef_FromPyObjectSteal(tuple_o);
|
||||
stack_pointer += 2;
|
||||
assert(WITHIN_STACK_BOUNDS());
|
||||
}
|
||||
}
|
||||
// _DO_CALL_FUNCTION_EX
|
||||
|
@ -2494,7 +2487,6 @@
|
|||
JUMP_TO_LABEL(error);
|
||||
}
|
||||
stack_pointer += -1;
|
||||
assert(WITHIN_STACK_BOUNDS());
|
||||
}
|
||||
}
|
||||
stack_pointer[0] = result;
|
||||
|
@ -2736,7 +2728,6 @@
|
|||
}
|
||||
STACKREFS_TO_PYOBJECTS(arguments, total_args, args_o);
|
||||
if (CONVERSION_FAILED(args_o)) {
|
||||
stack_pointer[-1] = kwnames;
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
_PyStackRef tmp = kwnames;
|
||||
kwnames = PyStackRef_NULL;
|
||||
|
@ -3070,7 +3061,6 @@
|
|||
JUMP_TO_LABEL(error);
|
||||
}
|
||||
stack_pointer += -1;
|
||||
assert(WITHIN_STACK_BOUNDS());
|
||||
}
|
||||
}
|
||||
stack_pointer[0] = res;
|
||||
|
@ -3422,7 +3412,6 @@
|
|||
JUMP_TO_LABEL(error);
|
||||
}
|
||||
stack_pointer += -1;
|
||||
assert(WITHIN_STACK_BOUNDS());
|
||||
}
|
||||
}
|
||||
stack_pointer[0] = res;
|
||||
|
@ -3544,7 +3533,6 @@
|
|||
JUMP_TO_LABEL(error);
|
||||
}
|
||||
stack_pointer += -1;
|
||||
assert(WITHIN_STACK_BOUNDS());
|
||||
}
|
||||
}
|
||||
stack_pointer[0] = res;
|
||||
|
@ -3646,7 +3634,6 @@
|
|||
JUMP_TO_LABEL(error);
|
||||
}
|
||||
stack_pointer += -1;
|
||||
assert(WITHIN_STACK_BOUNDS());
|
||||
}
|
||||
}
|
||||
stack_pointer[0] = res;
|
||||
|
@ -3759,7 +3746,6 @@
|
|||
JUMP_TO_LABEL(error);
|
||||
}
|
||||
stack_pointer += -1;
|
||||
assert(WITHIN_STACK_BOUNDS());
|
||||
}
|
||||
}
|
||||
stack_pointer[0] = res;
|
||||
|
@ -3879,7 +3865,6 @@
|
|||
JUMP_TO_LABEL(error);
|
||||
}
|
||||
stack_pointer += -1;
|
||||
assert(WITHIN_STACK_BOUNDS());
|
||||
}
|
||||
}
|
||||
stack_pointer[0] = res;
|
||||
|
@ -4154,7 +4139,6 @@
|
|||
JUMP_TO_LABEL(error);
|
||||
}
|
||||
stack_pointer += -1;
|
||||
assert(WITHIN_STACK_BOUNDS());
|
||||
}
|
||||
}
|
||||
stack_pointer[0] = res;
|
||||
|
@ -4227,7 +4211,6 @@
|
|||
JUMP_TO_LABEL(error);
|
||||
}
|
||||
stack_pointer += -1;
|
||||
assert(WITHIN_STACK_BOUNDS());
|
||||
}
|
||||
}
|
||||
stack_pointer[0] = res;
|
||||
|
@ -5310,7 +5293,6 @@
|
|||
INSTRUCTION_STATS(EXIT_INIT_CHECK);
|
||||
_PyStackRef should_be_none;
|
||||
should_be_none = stack_pointer[-1];
|
||||
assert(STACK_LEVEL() == 2);
|
||||
if (!PyStackRef_IsNone(should_be_none)) {
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
PyErr_Format(PyExc_TypeError,
|
||||
|
@ -5369,7 +5351,6 @@
|
|||
else {
|
||||
res = value;
|
||||
stack_pointer += -1;
|
||||
assert(WITHIN_STACK_BOUNDS());
|
||||
}
|
||||
stack_pointer[0] = res;
|
||||
stack_pointer += 1;
|
||||
|
@ -6130,8 +6111,9 @@
|
|||
}
|
||||
// _DO_CALL
|
||||
{
|
||||
self_or_null = maybe_self;
|
||||
callable = func;
|
||||
args = &stack_pointer[-oparg];
|
||||
self_or_null = &stack_pointer[-1 - oparg];
|
||||
callable = &stack_pointer[-2 - oparg];
|
||||
PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable[0]);
|
||||
int total_args = oparg;
|
||||
_PyStackRef *arguments = args;
|
||||
|
@ -6246,7 +6228,6 @@
|
|||
JUMP_TO_LABEL(error);
|
||||
}
|
||||
stack_pointer += -1;
|
||||
assert(WITHIN_STACK_BOUNDS());
|
||||
}
|
||||
}
|
||||
stack_pointer[0] = res;
|
||||
|
@ -6307,7 +6288,6 @@
|
|||
stack_pointer = _PyFrame_GetStackPointer(frame);
|
||||
tuple = PyStackRef_FromPyObjectSteal(tuple_o);
|
||||
stack_pointer += 2;
|
||||
assert(WITHIN_STACK_BOUNDS());
|
||||
}
|
||||
}
|
||||
// _DO_CALL_FUNCTION_EX
|
||||
|
@ -6435,7 +6415,6 @@
|
|||
JUMP_TO_LABEL(error);
|
||||
}
|
||||
stack_pointer += -1;
|
||||
assert(WITHIN_STACK_BOUNDS());
|
||||
}
|
||||
}
|
||||
stack_pointer[0] = result;
|
||||
|
@ -6753,14 +6732,16 @@
|
|||
frame->instr_ptr = next_instr;
|
||||
next_instr += 2;
|
||||
INSTRUCTION_STATS(INSTRUMENTED_FOR_ITER);
|
||||
_PyStackRef iter;
|
||||
_PyStackRef next;
|
||||
/* Skip 1 cache entry */
|
||||
_PyStackRef iter_stackref = TOP();
|
||||
PyObject *iter = PyStackRef_AsPyObjectBorrow(iter_stackref);
|
||||
iter = stack_pointer[-1];
|
||||
PyObject *iter_o = PyStackRef_AsPyObjectBorrow(iter);
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
PyObject *next = (*Py_TYPE(iter)->tp_iternext)(iter);
|
||||
PyObject *next_o = (*Py_TYPE(iter_o)->tp_iternext)(iter_o);
|
||||
stack_pointer = _PyFrame_GetStackPointer(frame);
|
||||
if (next != NULL) {
|
||||
PUSH(PyStackRef_FromPyObjectSteal(next));
|
||||
if (next_o != NULL) {
|
||||
next = PyStackRef_FromPyObjectSteal(next_o);
|
||||
INSTRUMENTED_JUMP(this_instr, next_instr, PY_MONITORING_EVENT_BRANCH_LEFT);
|
||||
}
|
||||
else {
|
||||
|
@ -6779,7 +6760,11 @@
|
|||
assert(next_instr[oparg].op.code == END_FOR ||
|
||||
next_instr[oparg].op.code == INSTRUMENTED_END_FOR);
|
||||
JUMPBY(oparg + 1);
|
||||
DISPATCH();
|
||||
}
|
||||
stack_pointer[0] = next;
|
||||
stack_pointer += 1;
|
||||
assert(WITHIN_STACK_BOUNDS());
|
||||
DISPATCH();
|
||||
}
|
||||
|
||||
|
@ -7063,14 +7048,17 @@
|
|||
frame->instr_ptr = next_instr;
|
||||
next_instr += 2;
|
||||
INSTRUCTION_STATS(INSTRUMENTED_POP_JUMP_IF_FALSE);
|
||||
_PyStackRef cond;
|
||||
/* Skip 1 cache entry */
|
||||
_PyStackRef cond = POP();
|
||||
cond = stack_pointer[-1];
|
||||
assert(PyStackRef_BoolCheck(cond));
|
||||
int jump = PyStackRef_IsFalse(cond);
|
||||
RECORD_BRANCH_TAKEN(this_instr[1].cache, jump);
|
||||
if (jump) {
|
||||
INSTRUMENTED_JUMP(this_instr, next_instr + oparg, PY_MONITORING_EVENT_BRANCH_RIGHT);
|
||||
}
|
||||
stack_pointer += -1;
|
||||
assert(WITHIN_STACK_BOUNDS());
|
||||
DISPATCH();
|
||||
}
|
||||
|
||||
|
@ -7084,18 +7072,24 @@
|
|||
frame->instr_ptr = next_instr;
|
||||
next_instr += 2;
|
||||
INSTRUCTION_STATS(INSTRUMENTED_POP_JUMP_IF_NONE);
|
||||
_PyStackRef value;
|
||||
/* Skip 1 cache entry */
|
||||
_PyStackRef value_stackref = POP();
|
||||
int jump = PyStackRef_IsNone(value_stackref);
|
||||
value = stack_pointer[-1];
|
||||
int jump = PyStackRef_IsNone(value);
|
||||
RECORD_BRANCH_TAKEN(this_instr[1].cache, jump);
|
||||
if (jump) {
|
||||
INSTRUMENTED_JUMP(this_instr, next_instr + oparg, PY_MONITORING_EVENT_BRANCH_RIGHT);
|
||||
}
|
||||
else {
|
||||
stack_pointer += -1;
|
||||
assert(WITHIN_STACK_BOUNDS());
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
PyStackRef_CLOSE(value_stackref);
|
||||
PyStackRef_CLOSE(value);
|
||||
stack_pointer = _PyFrame_GetStackPointer(frame);
|
||||
stack_pointer += 1;
|
||||
}
|
||||
stack_pointer += -1;
|
||||
assert(WITHIN_STACK_BOUNDS());
|
||||
DISPATCH();
|
||||
}
|
||||
|
||||
|
@ -7109,16 +7103,22 @@
|
|||
frame->instr_ptr = next_instr;
|
||||
next_instr += 2;
|
||||
INSTRUCTION_STATS(INSTRUMENTED_POP_JUMP_IF_NOT_NONE);
|
||||
_PyStackRef value;
|
||||
/* Skip 1 cache entry */
|
||||
_PyStackRef value_stackref = POP();
|
||||
int jump = !PyStackRef_IsNone(value_stackref);
|
||||
value = stack_pointer[-1];
|
||||
int jump = !PyStackRef_IsNone(value);
|
||||
RECORD_BRANCH_TAKEN(this_instr[1].cache, jump);
|
||||
if (jump) {
|
||||
stack_pointer += -1;
|
||||
assert(WITHIN_STACK_BOUNDS());
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
PyStackRef_CLOSE(value_stackref);
|
||||
PyStackRef_CLOSE(value);
|
||||
stack_pointer = _PyFrame_GetStackPointer(frame);
|
||||
INSTRUMENTED_JUMP(this_instr, next_instr + oparg, PY_MONITORING_EVENT_BRANCH_RIGHT);
|
||||
}
|
||||
else {
|
||||
stack_pointer += -1;
|
||||
}
|
||||
DISPATCH();
|
||||
}
|
||||
|
||||
|
@ -7132,14 +7132,17 @@
|
|||
frame->instr_ptr = next_instr;
|
||||
next_instr += 2;
|
||||
INSTRUCTION_STATS(INSTRUMENTED_POP_JUMP_IF_TRUE);
|
||||
_PyStackRef cond;
|
||||
/* Skip 1 cache entry */
|
||||
_PyStackRef cond = POP();
|
||||
cond = stack_pointer[-1];
|
||||
assert(PyStackRef_BoolCheck(cond));
|
||||
int jump = PyStackRef_IsTrue(cond);
|
||||
RECORD_BRANCH_TAKEN(this_instr[1].cache, jump);
|
||||
if (jump) {
|
||||
INSTRUMENTED_JUMP(this_instr, next_instr + oparg, PY_MONITORING_EVENT_BRANCH_RIGHT);
|
||||
}
|
||||
stack_pointer += -1;
|
||||
assert(WITHIN_STACK_BOUNDS());
|
||||
DISPATCH();
|
||||
}
|
||||
|
||||
|
@ -7254,7 +7257,7 @@
|
|||
stack_pointer += -1;
|
||||
assert(WITHIN_STACK_BOUNDS());
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
assert(EMPTY());
|
||||
assert(STACK_LEVEL() == 0);
|
||||
_Py_LeaveRecursiveCallPy(tstate);
|
||||
_PyInterpreterFrame *dying = frame;
|
||||
frame = tstate->current_frame = dying->previous;
|
||||
|
@ -7353,9 +7356,11 @@
|
|||
tstate->current_frame = frame->previous;
|
||||
assert(!_PyErr_Occurred(tstate));
|
||||
PyObject *result = PyStackRef_AsPyObjectSteal(retval);
|
||||
LLTRACE_RESUME_FRAME();
|
||||
return result;
|
||||
stack_pointer += -1;
|
||||
assert(WITHIN_STACK_BOUNDS());
|
||||
return result;
|
||||
DISPATCH();
|
||||
}
|
||||
|
||||
TARGET(IS_OP) {
|
||||
|
@ -7684,7 +7689,6 @@
|
|||
}
|
||||
self_or_null[0] = PyStackRef_NULL;
|
||||
stack_pointer += 1;
|
||||
assert(WITHIN_STACK_BOUNDS());
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
@ -7700,7 +7704,6 @@
|
|||
JUMP_TO_LABEL(error);
|
||||
}
|
||||
stack_pointer += 1;
|
||||
assert(WITHIN_STACK_BOUNDS());
|
||||
}
|
||||
attr = PyStackRef_FromPyObjectSteal(attr_o);
|
||||
}
|
||||
|
@ -7886,8 +7889,9 @@
|
|||
PyObject *name = GETITEM(FRAME_CO_NAMES, oparg >> 1);
|
||||
_PyInterpreterFrame *new_frame = _PyFrame_PushUnchecked(
|
||||
tstate, PyStackRef_FromPyObjectNew(f), 2, frame);
|
||||
STACK_SHRINK(1);
|
||||
new_frame->localsplus[0] = owner;
|
||||
stack_pointer += -1;
|
||||
assert(WITHIN_STACK_BOUNDS());
|
||||
new_frame->localsplus[1] = PyStackRef_FromPyObjectNew(name);
|
||||
frame->return_offset = 10 ;
|
||||
DISPATCH_INLINED(new_frame);
|
||||
|
@ -9551,7 +9555,6 @@
|
|||
stack_pointer = _PyFrame_GetStackPointer(frame);
|
||||
self_or_null = PyStackRef_NULL;
|
||||
stack_pointer += 1;
|
||||
assert(WITHIN_STACK_BOUNDS());
|
||||
}
|
||||
stack_pointer += -1;
|
||||
assert(WITHIN_STACK_BOUNDS());
|
||||
|
@ -10243,7 +10246,7 @@
|
|||
if (gen == NULL) {
|
||||
JUMP_TO_LABEL(error);
|
||||
}
|
||||
assert(EMPTY());
|
||||
assert(STACK_LEVEL() == 0);
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
_PyInterpreterFrame *gen_frame = &gen->gi_iframe;
|
||||
frame->instr_ptr++;
|
||||
|
@ -10281,7 +10284,7 @@
|
|||
stack_pointer += -1;
|
||||
assert(WITHIN_STACK_BOUNDS());
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
assert(EMPTY());
|
||||
assert(STACK_LEVEL() == 0);
|
||||
_Py_LeaveRecursiveCallPy(tstate);
|
||||
_PyInterpreterFrame *dying = frame;
|
||||
frame = tstate->current_frame = dying->previous;
|
||||
|
@ -10339,8 +10342,9 @@
|
|||
{
|
||||
PyGenObject *gen = (PyGenObject *)receiver_o;
|
||||
_PyInterpreterFrame *gen_frame = &gen->gi_iframe;
|
||||
STACK_SHRINK(1);
|
||||
_PyFrame_StackPush(gen_frame, PyStackRef_MakeHeapSafe(v));
|
||||
stack_pointer += -1;
|
||||
assert(WITHIN_STACK_BOUNDS());
|
||||
gen->gi_frame_state = FRAME_EXECUTING;
|
||||
gen->gi_exc_state.previous_item = tstate->exc_info;
|
||||
tstate->exc_info = &gen->gi_exc_state;
|
||||
|
@ -11095,21 +11099,18 @@
|
|||
Py_DECREF(slice);
|
||||
stack_pointer = _PyFrame_GetStackPointer(frame);
|
||||
stack_pointer += 2;
|
||||
assert(WITHIN_STACK_BOUNDS());
|
||||
}
|
||||
stack_pointer += -2;
|
||||
assert(WITHIN_STACK_BOUNDS());
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
_PyStackRef tmp = container;
|
||||
container = PyStackRef_NULL;
|
||||
stack_pointer[-1] = container;
|
||||
stack_pointer[-3] = container;
|
||||
PyStackRef_CLOSE(tmp);
|
||||
tmp = v;
|
||||
v = PyStackRef_NULL;
|
||||
stack_pointer[-2] = v;
|
||||
stack_pointer[-4] = v;
|
||||
PyStackRef_CLOSE(tmp);
|
||||
stack_pointer = _PyFrame_GetStackPointer(frame);
|
||||
stack_pointer += -2;
|
||||
stack_pointer += -4;
|
||||
assert(WITHIN_STACK_BOUNDS());
|
||||
if (err) {
|
||||
JUMP_TO_LABEL(error);
|
||||
|
@ -11465,7 +11466,6 @@
|
|||
stack_pointer = _PyFrame_GetStackPointer(frame);
|
||||
res = PyStackRef_True;
|
||||
stack_pointer += 1;
|
||||
assert(WITHIN_STACK_BOUNDS());
|
||||
}
|
||||
stack_pointer[-1] = res;
|
||||
DISPATCH();
|
||||
|
@ -11573,7 +11573,6 @@
|
|||
stack_pointer = _PyFrame_GetStackPointer(frame);
|
||||
res = PyStackRef_True;
|
||||
stack_pointer += 1;
|
||||
assert(WITHIN_STACK_BOUNDS());
|
||||
}
|
||||
}
|
||||
stack_pointer[-1] = res;
|
||||
|
@ -11861,7 +11860,6 @@
|
|||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
PyStackRef_CLOSE(seq);
|
||||
stack_pointer = _PyFrame_GetStackPointer(frame);
|
||||
stack_pointer[-1] = val0;
|
||||
DISPATCH();
|
||||
}
|
||||
|
||||
|
@ -11984,25 +11982,29 @@ JUMP_TO_LABEL(error);
|
|||
|
||||
LABEL(pop_4_error)
|
||||
{
|
||||
STACK_SHRINK(4);
|
||||
stack_pointer -= 4;
|
||||
assert(WITHIN_STACK_BOUNDS());
|
||||
JUMP_TO_LABEL(error);
|
||||
}
|
||||
|
||||
LABEL(pop_3_error)
|
||||
{
|
||||
STACK_SHRINK(3);
|
||||
stack_pointer -= 3;
|
||||
assert(WITHIN_STACK_BOUNDS());
|
||||
JUMP_TO_LABEL(error);
|
||||
}
|
||||
|
||||
LABEL(pop_2_error)
|
||||
{
|
||||
STACK_SHRINK(2);
|
||||
stack_pointer -= 2;
|
||||
assert(WITHIN_STACK_BOUNDS());
|
||||
JUMP_TO_LABEL(error);
|
||||
}
|
||||
|
||||
LABEL(pop_1_error)
|
||||
{
|
||||
STACK_SHRINK(1);
|
||||
stack_pointer -= 1;
|
||||
assert(WITHIN_STACK_BOUNDS());
|
||||
JUMP_TO_LABEL(error);
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue