@@ -1561,16 +1561,18 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr
15611561 tstate -> cframe = & cframe ;
15621562
15631563 assert (frame -> depth == 0 );
1564- /* push frame */
1565- tstate -> frame = frame ;
1564+ /* Push frame */
1565+ frame -> previous = prev_cframe -> current_frame ;
1566+ cframe .current_frame = frame ;
15661567
15671568start_frame :
15681569 if (_Py_EnterRecursiveCall (tstate , "" )) {
15691570 tstate -> recursion_depth ++ ;
15701571 goto exit_eval_frame ;
15711572 }
15721573
1573- assert (frame == tstate -> frame );
1574+ assert (tstate -> cframe == & cframe );
1575+ assert (frame == cframe .current_frame );
15741576
15751577 if (cframe .use_tracing ) {
15761578 if (trace_function_entry (tstate , frame )) {
@@ -4641,8 +4643,9 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr
46414643 goto error ;
46424644 }
46434645 _PyFrame_SetStackPointer (frame , stack_pointer );
4646+ new_frame -> previous = frame ;
4647+ cframe .current_frame = frame = new_frame ;
46444648 new_frame -> depth = frame -> depth + 1 ;
4645- tstate -> frame = frame = new_frame ;
46464649 goto start_frame ;
46474650 }
46484651 }
@@ -4723,9 +4726,9 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr
47234726 STACK_SHRINK (1 );
47244727 Py_DECREF (func );
47254728 _PyFrame_SetStackPointer (frame , stack_pointer );
4726- new_frame -> previous = tstate -> frame ;
4729+ new_frame -> previous = frame ;
4730+ frame = cframe .current_frame = new_frame ;
47274731 new_frame -> depth = frame -> depth + 1 ;
4728- tstate -> frame = frame = new_frame ;
47294732 goto start_frame ;
47304733 }
47314734
@@ -5258,23 +5261,24 @@ MISS_WITH_OPARG_COUNTER(BINARY_MULTIPLY)
52585261 _Py_LeaveRecursiveCall (tstate );
52595262
52605263 if (frame -> depth ) {
5261- _PyFrame_StackPush (frame -> previous , retval );
5264+ cframe .current_frame = frame -> previous ;
5265+ _PyFrame_StackPush (cframe .current_frame , retval );
52625266 if (_PyEvalFrameClearAndPop (tstate , frame )) {
52635267 retval = NULL ;
52645268 }
5265- frame = tstate -> frame ;
5269+ frame = cframe . current_frame ;
52665270 if (retval == NULL ) {
52675271 assert (_PyErr_Occurred (tstate ));
52685272 throwflag = 1 ;
52695273 }
52705274 retval = NULL ;
52715275 goto resume_frame ;
52725276 }
5273- tstate -> frame = frame -> previous ;
52745277
5275- /* Restore previous cframe */
5278+ /* Restore previous cframe. */
52765279 tstate -> cframe = cframe .previous ;
52775280 tstate -> cframe -> use_tracing = cframe .use_tracing ;
5281+ assert (tstate -> cframe -> current_frame == frame -> previous );
52785282 return _Py_CheckFunctionResult (tstate , NULL , retval , __func__ );
52795283}
52805284
@@ -5891,8 +5895,6 @@ _PyEvalFramePushAndInit(PyThreadState *tstate, PyFrameConstructor *con,
58915895 _PyFrame_Clear (frame , 0 );
58925896 return NULL ;
58935897 }
5894- frame -> previous = tstate -> frame ;
5895- tstate -> frame = frame ;
58965898 return frame ;
58975899}
58985900
@@ -5906,7 +5908,6 @@ _PyEvalFrameClearAndPop(PyThreadState *tstate, InterpreterFrame * frame)
59065908 return -1 ;
59075909 }
59085910 -- tstate -> recursion_depth ;
5909- tstate -> frame = frame -> previous ;
59105911 _PyThreadState_PopFrame (tstate , frame );
59115912 return 0 ;
59125913}
@@ -6518,17 +6519,17 @@ InterpreterFrame *
65186519_PyEval_GetFrame (void )
65196520{
65206521 PyThreadState * tstate = _PyThreadState_GET ();
6521- return tstate -> frame ;
6522+ return tstate -> cframe -> current_frame ;
65226523}
65236524
65246525PyFrameObject *
65256526PyEval_GetFrame (void )
65266527{
65276528 PyThreadState * tstate = _PyThreadState_GET ();
6528- if (tstate -> frame == NULL ) {
6529+ if (tstate -> cframe -> current_frame == NULL ) {
65296530 return NULL ;
65306531 }
6531- PyFrameObject * f = _PyFrame_GetFrameObject (tstate -> frame );
6532+ PyFrameObject * f = _PyFrame_GetFrameObject (tstate -> cframe -> current_frame );
65326533 if (f == NULL ) {
65336534 PyErr_Clear ();
65346535 }
@@ -6538,7 +6539,7 @@ PyEval_GetFrame(void)
65386539PyObject *
65396540_PyEval_GetBuiltins (PyThreadState * tstate )
65406541{
6541- InterpreterFrame * frame = tstate -> frame ;
6542+ InterpreterFrame * frame = tstate -> cframe -> current_frame ;
65426543 if (frame != NULL ) {
65436544 return frame -> f_builtins ;
65446545 }
@@ -6571,7 +6572,7 @@ PyObject *
65716572PyEval_GetLocals (void )
65726573{
65736574 PyThreadState * tstate = _PyThreadState_GET ();
6574- InterpreterFrame * current_frame = tstate -> frame ;
6575+ InterpreterFrame * current_frame = tstate -> cframe -> current_frame ;
65756576 if (current_frame == NULL ) {
65766577 _PyErr_SetString (tstate , PyExc_SystemError , "frame does not exist" );
65776578 return NULL ;
@@ -6590,7 +6591,7 @@ PyObject *
65906591PyEval_GetGlobals (void )
65916592{
65926593 PyThreadState * tstate = _PyThreadState_GET ();
6593- InterpreterFrame * current_frame = tstate -> frame ;
6594+ InterpreterFrame * current_frame = tstate -> cframe -> current_frame ;
65946595 if (current_frame == NULL ) {
65956596 return NULL ;
65966597 }
@@ -6601,7 +6602,7 @@ int
66016602PyEval_MergeCompilerFlags (PyCompilerFlags * cf )
66026603{
66036604 PyThreadState * tstate = _PyThreadState_GET ();
6604- InterpreterFrame * current_frame = tstate -> frame ;
6605+ InterpreterFrame * current_frame = tstate -> cframe -> current_frame ;
66056606 int result = cf -> cf_flags != 0 ;
66066607
66076608 if (current_frame != NULL ) {
@@ -6651,7 +6652,7 @@ PyEval_GetFuncDesc(PyObject *func)
66516652#define C_TRACE (x , call ) \
66526653if (use_tracing && tstate->c_profilefunc) { \
66536654 if (call_trace(tstate->c_profilefunc, tstate->c_profileobj, \
6654- tstate, tstate->frame , \
6655+ tstate, tstate->cframe->current_frame , \
66556656 PyTrace_C_CALL, func)) { \
66566657 x = NULL; \
66576658 } \
@@ -6661,13 +6662,13 @@ if (use_tracing && tstate->c_profilefunc) { \
66616662 if (x == NULL) { \
66626663 call_trace_protected(tstate->c_profilefunc, \
66636664 tstate->c_profileobj, \
6664- tstate, tstate->frame , \
6665+ tstate, tstate->cframe->current_frame , \
66656666 PyTrace_C_EXCEPTION, func); \
66666667 /* XXX should pass (type, value, tb) */ \
66676668 } else { \
66686669 if (call_trace (tstate -> c_profilefunc , \
66696670 tstate -> c_profileobj , \
6670- tstate , tstate -> frame , \
6671+ tstate , tstate -> cframe -> current_frame , \
66716672 PyTrace_C_RETURN , func )) { \
66726673 Py_DECREF (x ); \
66736674 x = NULL ; \
0 commit comments