Spaces:
Running
Running
/* Frame object interface */ | |
/* These values are chosen so that the inline functions below all | |
* compare f_state to zero. | |
*/ | |
enum _framestate { | |
FRAME_CREATED = -2, | |
FRAME_SUSPENDED = -1, | |
FRAME_EXECUTING = 0, | |
FRAME_RETURNED = 1, | |
FRAME_UNWINDING = 2, | |
FRAME_RAISED = 3, | |
FRAME_CLEARED = 4 | |
}; | |
typedef signed char PyFrameState; | |
typedef struct { | |
int b_type; /* what kind of block this is */ | |
int b_handler; /* where to jump to find handler */ | |
int b_level; /* value stack level to pop to */ | |
} PyTryBlock; | |
struct _frame { | |
PyObject_VAR_HEAD | |
struct _frame *f_back; /* previous frame, or NULL */ | |
PyCodeObject *f_code; /* code segment */ | |
PyObject *f_builtins; /* builtin symbol table (PyDictObject) */ | |
PyObject *f_globals; /* global symbol table (PyDictObject) */ | |
PyObject *f_locals; /* local symbol table (any mapping) */ | |
PyObject **f_valuestack; /* points after the last local */ | |
PyObject *f_trace; /* Trace function */ | |
int f_stackdepth; /* Depth of value stack */ | |
char f_trace_lines; /* Emit per-line trace events? */ | |
char f_trace_opcodes; /* Emit per-opcode trace events? */ | |
/* Borrowed reference to a generator, or NULL */ | |
PyObject *f_gen; | |
int f_lasti; /* Last instruction if called */ | |
int f_lineno; /* Current line number. Only valid if non-zero */ | |
int f_iblock; /* index in f_blockstack */ | |
PyFrameState f_state; /* What state the frame is in */ | |
PyTryBlock f_blockstack[CO_MAXBLOCKS]; /* for try and loop blocks */ | |
PyObject *f_localsplus[1]; /* locals+stack, dynamically sized */ | |
}; | |
static inline int _PyFrame_IsRunnable(struct _frame *f) { | |
return f->f_state < FRAME_EXECUTING; | |
} | |
static inline int _PyFrame_IsExecuting(struct _frame *f) { | |
return f->f_state == FRAME_EXECUTING; | |
} | |
static inline int _PyFrameHasCompleted(struct _frame *f) { | |
return f->f_state > FRAME_EXECUTING; | |
} | |
/* Standard object interface */ | |
PyAPI_DATA(PyTypeObject) PyFrame_Type; | |
PyAPI_FUNC(PyFrameObject *) PyFrame_New(PyThreadState *, PyCodeObject *, | |
PyObject *, PyObject *); | |
/* only internal use */ | |
PyFrameObject* | |
_PyFrame_New_NoTrack(PyThreadState *, PyFrameConstructor *, PyObject *); | |
/* The rest of the interface is specific for frame objects */ | |
/* Block management functions */ | |
PyAPI_FUNC(void) PyFrame_BlockSetup(PyFrameObject *, int, int, int); | |
PyAPI_FUNC(PyTryBlock *) PyFrame_BlockPop(PyFrameObject *); | |
/* Conversions between "fast locals" and locals in dictionary */ | |
PyAPI_FUNC(void) PyFrame_LocalsToFast(PyFrameObject *, int); | |
PyAPI_FUNC(int) PyFrame_FastToLocalsWithError(PyFrameObject *f); | |
PyAPI_FUNC(void) PyFrame_FastToLocals(PyFrameObject *); | |
PyAPI_FUNC(void) _PyFrame_DebugMallocStats(FILE *out); | |
PyAPI_FUNC(PyFrameObject *) PyFrame_GetBack(PyFrameObject *frame); | |