1 2 /* Frame object interface */ 3 4 #ifndef Py_LIMITED_API 5 #ifndef Py_FRAMEOBJECT_H 6 #define Py_FRAMEOBJECT_H 7 #ifdef __cplusplus 8 extern "C" { 9 #endif 10 11 typedef struct { 12 int b_type; /* what kind of block this is */ 13 int b_handler; /* where to jump to find handler */ 14 int b_level; /* value stack level to pop to */ 15 } PyTryBlock; 16 17 typedef struct _frame { 18 PyObject_VAR_HEAD 19 struct _frame *f_back; /* previous frame, or NULL */ 20 PyCodeObject *f_code; /* code segment */ 21 PyObject *f_builtins; /* builtin symbol table (PyDictObject) */ 22 PyObject *f_globals; /* global symbol table (PyDictObject) */ 23 PyObject *f_locals; /* local symbol table (any mapping) */ 24 PyObject **f_valuestack; /* points after the last local */ 25 /* Next free slot in f_valuestack. Frame creation sets to f_valuestack. 26 Frame evaluation usually NULLs it, but a frame that yields sets it 27 to the current stack top. */ 28 PyObject **f_stacktop; 29 PyObject *f_trace; /* Trace function */ 30 char f_trace_lines; /* Emit per-line trace events? */ 31 char f_trace_opcodes; /* Emit per-opcode trace events? */ 32 33 /* Borrowed reference to a generator, or NULL */ 34 PyObject *f_gen; 35 36 int f_lasti; /* Last instruction if called */ 37 /* Call PyFrame_GetLineNumber() instead of reading this field 38 directly. As of 2.3 f_lineno is only valid when tracing is 39 active (i.e. when f_trace is set). At other times we use 40 PyCode_Addr2Line to calculate the line from the current 41 bytecode index. */ 42 int f_lineno; /* Current line number */ 43 int f_iblock; /* index in f_blockstack */ 44 char f_executing; /* whether the frame is still executing */ 45 PyTryBlock f_blockstack[CO_MAXBLOCKS]; /* for try and loop blocks */ 46 PyObject *f_localsplus[1]; /* locals+stack, dynamically sized */ 47 } PyFrameObject; 48 49 50 /* Standard object interface */ 51 52 PyAPI_DATA(PyTypeObject) PyFrame_Type; 53 54 #define PyFrame_Check(op) (Py_TYPE(op) == &PyFrame_Type) 55 56 PyAPI_FUNC(PyFrameObject *) PyFrame_New(PyThreadState *, PyCodeObject *, 57 PyObject *, PyObject *); 58 59 /* only internal use */ 60 PyFrameObject* _PyFrame_New_NoTrack(PyThreadState *, PyCodeObject *, 61 PyObject *, PyObject *); 62 63 64 /* The rest of the interface is specific for frame objects */ 65 66 /* Block management functions */ 67 68 PyAPI_FUNC(void) PyFrame_BlockSetup(PyFrameObject *, int, int, int); 69 PyAPI_FUNC(PyTryBlock *) PyFrame_BlockPop(PyFrameObject *); 70 71 /* Extend the value stack */ 72 73 PyAPI_FUNC(PyObject **) PyFrame_ExtendStack(PyFrameObject *, int, int); 74 75 /* Conversions between "fast locals" and locals in dictionary */ 76 77 PyAPI_FUNC(void) PyFrame_LocalsToFast(PyFrameObject *, int); 78 79 PyAPI_FUNC(int) PyFrame_FastToLocalsWithError(PyFrameObject *f); 80 PyAPI_FUNC(void) PyFrame_FastToLocals(PyFrameObject *); 81 82 PyAPI_FUNC(int) PyFrame_ClearFreeList(void); 83 84 PyAPI_FUNC(void) _PyFrame_DebugMallocStats(FILE *out); 85 86 /* Return the line of code the frame is currently executing. */ 87 PyAPI_FUNC(int) PyFrame_GetLineNumber(PyFrameObject *); 88 89 #ifdef __cplusplus 90 } 91 #endif 92 #endif /* !Py_FRAMEOBJECT_H */ 93 #endif /* Py_LIMITED_API */ 94