summaryrefslogtreecommitdiffstats
path: root/Python/generated_cases.c.h
diff options
context:
space:
mode:
authorMark Shannon <mark@hotpy.org>2025-02-04 12:18:31 (GMT)
committerGitHub <noreply@github.com>2025-02-04 12:18:31 (GMT)
commit2effea4dab05160abc05f1a548d519a5f6d684bc (patch)
tree821cc48f6f238b29cf6347d6e0e089f88e2da779 /Python/generated_cases.c.h
parentd3c54f37889436ded4520e78e4e59d3f3350aa44 (diff)
downloadcpython-2effea4dab05160abc05f1a548d519a5f6d684bc.zip
cpython-2effea4dab05160abc05f1a548d519a5f6d684bc.tar.gz
cpython-2effea4dab05160abc05f1a548d519a5f6d684bc.tar.bz2
GH-128682: Spill the stack pointer in labels, as well as instructions (GH-129618)
Diffstat (limited to 'Python/generated_cases.c.h')
-rw-r--r--Python/generated_cases.c.h48
1 files changed, 34 insertions, 14 deletions
diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h
index 7dd9d65..0bc92f3 100644
--- a/Python/generated_cases.c.h
+++ b/Python/generated_cases.c.h
@@ -3420,6 +3420,7 @@
_PyErr_SetRaisedException(tstate, Py_NewRef(exc_value));
monitor_reraise(tstate, frame, this_instr);
stack_pointer = _PyFrame_GetStackPointer(frame);
+ _PyFrame_SetStackPointer(frame, stack_pointer);
goto exception_unwind;
}
stack_pointer[-3] = none;
@@ -4000,6 +4001,7 @@
_PyErr_SetRaisedException(tstate, exc);
monitor_reraise(tstate, frame, this_instr);
stack_pointer = _PyFrame_GetStackPointer(frame);
+ _PyFrame_SetStackPointer(frame, stack_pointer);
goto exception_unwind;
}
stack_pointer += -2;
@@ -5866,7 +5868,7 @@
}
_PyExecutorObject *executor;
_PyFrame_SetStackPointer(frame, stack_pointer);
- int optimized = _PyOptimizer_Optimize(frame, start, stack_pointer, &executor, 0);
+ int optimized = _PyOptimizer_Optimize(frame, start, &executor, 0);
stack_pointer = _PyFrame_GetStackPointer(frame);
if (optimized <= 0) {
this_instr[1].counter = restart_backoff_counter(counter);
@@ -7838,6 +7840,7 @@
_PyFrame_SetStackPointer(frame, stack_pointer);
monitor_reraise(tstate, frame, this_instr);
stack_pointer = _PyFrame_GetStackPointer(frame);
+ _PyFrame_SetStackPointer(frame, stack_pointer);
goto exception_unwind;
}
goto error;
@@ -7883,6 +7886,7 @@
_PyErr_SetRaisedException(tstate, exc);
monitor_reraise(tstate, frame, this_instr);
stack_pointer = _PyFrame_GetStackPointer(frame);
+ _PyFrame_SetStackPointer(frame, stack_pointer);
goto exception_unwind;
}
@@ -9337,8 +9341,10 @@
/* Double-check exception status. */
#ifdef NDEBUG
if (!_PyErr_Occurred(tstate)) {
+ _PyFrame_SetStackPointer(frame, stack_pointer);
_PyErr_SetString(tstate, PyExc_SystemError,
"error return without exception set");
+ stack_pointer = _PyFrame_GetStackPointer(frame);
}
#else
assert(_PyErr_Occurred(tstate));
@@ -9347,37 +9353,47 @@
/* Log traceback info. */
assert(frame->owner != FRAME_OWNED_BY_INTERPRETER);
if (!_PyFrame_IsIncomplete(frame)) {
+ _PyFrame_SetStackPointer(frame, stack_pointer);
PyFrameObject *f = _PyFrame_GetFrameObject(frame);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
if (f != NULL) {
+ _PyFrame_SetStackPointer(frame, stack_pointer);
PyTraceBack_Here(f);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
}
}
+ _PyFrame_SetStackPointer(frame, stack_pointer);
_PyEval_MonitorRaise(tstate, frame, next_instr-1);
+ stack_pointer = _PyFrame_GetStackPointer(frame);
+ _PyFrame_SetStackPointer(frame, stack_pointer);
goto exception_unwind;
}
exception_unwind:
{
+ /* STACK SPILLED */
/* We can't use frame->instr_ptr here, as RERAISE may have set it */
int offset = INSTR_OFFSET()-1;
int level, handler, lasti;
- if (get_exception_handler(_PyFrame_GetCode(frame), offset, &level, &handler, &lasti) == 0) {
+ int handled = get_exception_handler(_PyFrame_GetCode(frame), offset, &level, &handler, &lasti);
+ if (handled == 0) {
// No handlers, so exit.
assert(_PyErr_Occurred(tstate));
/* Pop remaining stack entries. */
_PyStackRef *stackbase = _PyFrame_Stackbase(frame);
- while (stack_pointer > stackbase) {
- PyStackRef_XCLOSE(POP());
+ while (frame->stackpointer > stackbase) {
+ _PyStackRef ref = _PyFrame_StackPop(frame);
+ PyStackRef_XCLOSE(ref);
}
- assert(STACK_LEVEL() == 0);
- _PyFrame_SetStackPointer(frame, stack_pointer);
monitor_unwind(tstate, frame, next_instr-1);
goto exit_unwind;
}
assert(STACK_LEVEL() >= level);
_PyStackRef *new_top = _PyFrame_Stackbase(frame) + level;
- while (stack_pointer > new_top) {
- PyStackRef_XCLOSE(POP());
+ assert(frame->stackpointer >= new_top);
+ while (frame->stackpointer > new_top) {
+ _PyStackRef ref = _PyFrame_StackPop(frame);
+ PyStackRef_XCLOSE(ref);
}
if (lasti) {
int frame_lasti = _PyInterpreterFrame_LASTI(frame);
@@ -9385,16 +9401,17 @@
if (lasti == NULL) {
goto exception_unwind;
}
- PUSH(PyStackRef_FromPyObjectSteal(lasti));
+ _PyFrame_StackPush(frame, PyStackRef_FromPyObjectSteal(lasti));
}
/* Make the raw exception data
available to the handler,
so a program can emulate the
Python main loop. */
PyObject *exc = _PyErr_GetRaisedException(tstate);
- PUSH(PyStackRef_FromPyObjectSteal(exc));
+ _PyFrame_StackPush(frame, PyStackRef_FromPyObjectSteal(exc));
next_instr = _PyFrame_GetBytecode(frame) + handler;
- if (monitor_handled(tstate, frame, next_instr, exc) < 0) {
+ int err = monitor_handled(tstate, frame, next_instr, exc);
+ if (err < 0) {
goto exception_unwind;
}
/* Resume normal execution */
@@ -9403,11 +9420,13 @@
lltrace_resume_frame(frame);
}
#endif
+ stack_pointer = _PyFrame_GetStackPointer(frame);
DISPATCH();
}
exit_unwind:
{
+ /* STACK SPILLED */
assert(_PyErr_Occurred(tstate));
_Py_LeaveRecursiveCallPy(tstate);
assert(frame->owner != FRAME_OWNED_BY_INTERPRETER);
@@ -9429,11 +9448,12 @@
start_frame:
{
- if (_Py_EnterRecursivePy(tstate)) {
+ /* STACK SPILLED */
+ int too_deep = _Py_EnterRecursivePy(tstate);
+ if (too_deep) {
goto exit_unwind;
}
next_instr = frame->instr_ptr;
- stack_pointer = _PyFrame_GetStackPointer(frame);
#ifdef LLTRACE
{
int lltrace = maybe_lltrace_resume_frame(frame, GLOBALS());
@@ -9450,7 +9470,7 @@
caller loses its exception */
assert(!_PyErr_Occurred(tstate));
#endif
-
+ stack_pointer = _PyFrame_GetStackPointer(frame);
DISPATCH();
}