mirror of
https://github.com/python/cpython.git
synced 2025-10-21 14:12:27 +00:00
bpo-45637: Store the frame pointer in the cframe (GH-29267)
* Rename 'frame' to 'current_frame'
This commit is contained in:
parent
0a68b3603f
commit
f291404a80
10 changed files with 42 additions and 41 deletions
|
@ -1561,8 +1561,9 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr
|
|||
tstate->cframe = &cframe;
|
||||
|
||||
assert(frame->depth == 0);
|
||||
/* push frame */
|
||||
tstate->frame = frame;
|
||||
/* Push frame */
|
||||
frame->previous = prev_cframe->current_frame;
|
||||
cframe.current_frame = frame;
|
||||
|
||||
start_frame:
|
||||
if (_Py_EnterRecursiveCall(tstate, "")) {
|
||||
|
@ -1570,7 +1571,8 @@ start_frame:
|
|||
goto exit_eval_frame;
|
||||
}
|
||||
|
||||
assert(frame == tstate->frame);
|
||||
assert(tstate->cframe == &cframe);
|
||||
assert(frame == cframe.current_frame);
|
||||
|
||||
if (cframe.use_tracing) {
|
||||
if (trace_function_entry(tstate, frame)) {
|
||||
|
@ -4641,8 +4643,9 @@ check_eval_breaker:
|
|||
goto error;
|
||||
}
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
new_frame->previous = frame;
|
||||
cframe.current_frame = frame = new_frame;
|
||||
new_frame->depth = frame->depth + 1;
|
||||
tstate->frame = frame = new_frame;
|
||||
goto start_frame;
|
||||
}
|
||||
}
|
||||
|
@ -4723,9 +4726,9 @@ check_eval_breaker:
|
|||
STACK_SHRINK(1);
|
||||
Py_DECREF(func);
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
new_frame->previous = tstate->frame;
|
||||
new_frame->previous = frame;
|
||||
frame = cframe.current_frame = new_frame;
|
||||
new_frame->depth = frame->depth + 1;
|
||||
tstate->frame = frame = new_frame;
|
||||
goto start_frame;
|
||||
}
|
||||
|
||||
|
@ -5258,11 +5261,12 @@ exit_eval_frame:
|
|||
_Py_LeaveRecursiveCall(tstate);
|
||||
|
||||
if (frame->depth) {
|
||||
_PyFrame_StackPush(frame->previous, retval);
|
||||
cframe.current_frame = frame->previous;
|
||||
_PyFrame_StackPush(cframe.current_frame, retval);
|
||||
if (_PyEvalFrameClearAndPop(tstate, frame)) {
|
||||
retval = NULL;
|
||||
}
|
||||
frame = tstate->frame;
|
||||
frame = cframe.current_frame;
|
||||
if (retval == NULL) {
|
||||
assert(_PyErr_Occurred(tstate));
|
||||
throwflag = 1;
|
||||
|
@ -5270,11 +5274,11 @@ exit_eval_frame:
|
|||
retval = NULL;
|
||||
goto resume_frame;
|
||||
}
|
||||
tstate->frame = frame->previous;
|
||||
|
||||
/* Restore previous cframe */
|
||||
/* Restore previous cframe. */
|
||||
tstate->cframe = cframe.previous;
|
||||
tstate->cframe->use_tracing = cframe.use_tracing;
|
||||
assert(tstate->cframe->current_frame == frame->previous);
|
||||
return _Py_CheckFunctionResult(tstate, NULL, retval, __func__);
|
||||
}
|
||||
|
||||
|
@ -5891,8 +5895,6 @@ _PyEvalFramePushAndInit(PyThreadState *tstate, PyFrameConstructor *con,
|
|||
_PyFrame_Clear(frame, 0);
|
||||
return NULL;
|
||||
}
|
||||
frame->previous = tstate->frame;
|
||||
tstate->frame = frame;
|
||||
return frame;
|
||||
}
|
||||
|
||||
|
@ -5906,7 +5908,6 @@ _PyEvalFrameClearAndPop(PyThreadState *tstate, InterpreterFrame * frame)
|
|||
return -1;
|
||||
}
|
||||
--tstate->recursion_depth;
|
||||
tstate->frame = frame->previous;
|
||||
_PyThreadState_PopFrame(tstate, frame);
|
||||
return 0;
|
||||
}
|
||||
|
@ -6518,17 +6519,17 @@ InterpreterFrame *
|
|||
_PyEval_GetFrame(void)
|
||||
{
|
||||
PyThreadState *tstate = _PyThreadState_GET();
|
||||
return tstate->frame;
|
||||
return tstate->cframe->current_frame;
|
||||
}
|
||||
|
||||
PyFrameObject *
|
||||
PyEval_GetFrame(void)
|
||||
{
|
||||
PyThreadState *tstate = _PyThreadState_GET();
|
||||
if (tstate->frame == NULL) {
|
||||
if (tstate->cframe->current_frame == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
PyFrameObject *f = _PyFrame_GetFrameObject(tstate->frame);
|
||||
PyFrameObject *f = _PyFrame_GetFrameObject(tstate->cframe->current_frame);
|
||||
if (f == NULL) {
|
||||
PyErr_Clear();
|
||||
}
|
||||
|
@ -6538,7 +6539,7 @@ PyEval_GetFrame(void)
|
|||
PyObject *
|
||||
_PyEval_GetBuiltins(PyThreadState *tstate)
|
||||
{
|
||||
InterpreterFrame *frame = tstate->frame;
|
||||
InterpreterFrame *frame = tstate->cframe->current_frame;
|
||||
if (frame != NULL) {
|
||||
return frame->f_builtins;
|
||||
}
|
||||
|
@ -6571,7 +6572,7 @@ PyObject *
|
|||
PyEval_GetLocals(void)
|
||||
{
|
||||
PyThreadState *tstate = _PyThreadState_GET();
|
||||
InterpreterFrame *current_frame = tstate->frame;
|
||||
InterpreterFrame *current_frame = tstate->cframe->current_frame;
|
||||
if (current_frame == NULL) {
|
||||
_PyErr_SetString(tstate, PyExc_SystemError, "frame does not exist");
|
||||
return NULL;
|
||||
|
@ -6590,7 +6591,7 @@ PyObject *
|
|||
PyEval_GetGlobals(void)
|
||||
{
|
||||
PyThreadState *tstate = _PyThreadState_GET();
|
||||
InterpreterFrame *current_frame = tstate->frame;
|
||||
InterpreterFrame *current_frame = tstate->cframe->current_frame;
|
||||
if (current_frame == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
@ -6601,7 +6602,7 @@ int
|
|||
PyEval_MergeCompilerFlags(PyCompilerFlags *cf)
|
||||
{
|
||||
PyThreadState *tstate = _PyThreadState_GET();
|
||||
InterpreterFrame *current_frame = tstate->frame;
|
||||
InterpreterFrame *current_frame = tstate->cframe->current_frame;
|
||||
int result = cf->cf_flags != 0;
|
||||
|
||||
if (current_frame != NULL) {
|
||||
|
@ -6651,7 +6652,7 @@ PyEval_GetFuncDesc(PyObject *func)
|
|||
#define C_TRACE(x, call) \
|
||||
if (use_tracing && tstate->c_profilefunc) { \
|
||||
if (call_trace(tstate->c_profilefunc, tstate->c_profileobj, \
|
||||
tstate, tstate->frame, \
|
||||
tstate, tstate->cframe->current_frame, \
|
||||
PyTrace_C_CALL, func)) { \
|
||||
x = NULL; \
|
||||
} \
|
||||
|
@ -6661,13 +6662,13 @@ if (use_tracing && tstate->c_profilefunc) { \
|
|||
if (x == NULL) { \
|
||||
call_trace_protected(tstate->c_profilefunc, \
|
||||
tstate->c_profileobj, \
|
||||
tstate, tstate->frame, \
|
||||
tstate, tstate->cframe->current_frame, \
|
||||
PyTrace_C_EXCEPTION, func); \
|
||||
/* XXX should pass (type, value, tb) */ \
|
||||
} else { \
|
||||
if (call_trace(tstate->c_profilefunc, \
|
||||
tstate->c_profileobj, \
|
||||
tstate, tstate->frame, \
|
||||
tstate, tstate->cframe->current_frame, \
|
||||
PyTrace_C_RETURN, func)) { \
|
||||
Py_DECREF(x); \
|
||||
x = NULL; \
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue