@@ -58,7 +58,8 @@ enum _frameowner {
5858 FRAME_OWNED_BY_GENERATOR = 1 ,
5959 FRAME_OWNED_BY_FRAME_OBJECT = 2 ,
6060 FRAME_OWNED_BY_INTERPRETER = 3 ,
61- FRAME_OWNED_BY_CSTACK = 4 ,
61+ FRAME_OWNED_BY_EXTENSION = 4 ,
62+ FRAME_OWNED_BY_CSTACK = 5 ,
6263};
6364
6465struct _PyFrameCore {
@@ -93,10 +94,18 @@ typedef struct _PyInterpreterFrame {
9394 _PyStackRef localsplus [1 ];
9495} _PyInterpreterFrame ;
9596
97+ typedef struct _PyExtensionFrame {
98+ _PyStackRef f_executable ; /* A "code like" object */
99+ union _PyVMFrame * previous ;
100+ char owner ;
101+ void * extension_data ;
102+ } _PyExtensionFrame ;
103+
96104
97105typedef union _PyVMFrame {
98106 struct _PyFrameCore core ;
99107 _PyInterpreterFrame iframe ;
108+ _PyExtensionFrame eframe ;
100109} _PyVMFrame ;
101110
102111#define _PyInterpreterFrame_LASTI (IF ) \
@@ -366,6 +375,24 @@ _PyThreadState_HasStackSpace(PyThreadState *tstate, int size)
366375 size < tstate -> datastack_limit - tstate -> datastack_top ;
367376}
368377
378+ static inline void
379+ _Py_PushNonPythonFrame (PyThreadState * tstate , struct _PyFrameCore * frame , PyObject * callable , enum _frameowner owner )
380+ {
381+ frame -> owner = owner ;
382+ frame -> f_executable = PyStackRef_FromPyObjectNew (callable );
383+ frame -> previous = tstate -> current_frame ;
384+ tstate -> current_frame = (_PyVMFrame * )frame ;
385+ }
386+
387+ static inline void
388+ _Py_PopNonPythonFrame (PyThreadState * tstate , struct _PyFrameCore * frame )
389+ {
390+ assert (tstate -> current_frame == (_PyVMFrame * )frame );
391+ _PyStackRef codelike = frame -> f_executable ;
392+ tstate -> current_frame = frame -> previous ;
393+ PyStackRef_CLOSE (codelike );
394+ }
395+
369396extern _PyInterpreterFrame *
370397_PyThreadState_PushFrame (PyThreadState * tstate , size_t size );
371398
0 commit comments