blob: 65ebd2ad523e900feafa9044fe6d68f30874b99a [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum3f5da241990-12-20 15:06:42 +00002/* Frame object interface */
3
Fred Drakeea9cb5a2000-07-09 00:20:36 +00004#ifndef Py_FRAMEOBJECT_H
5#define Py_FRAMEOBJECT_H
6#ifdef __cplusplus
7extern "C" {
8#endif
9
Guido van Rossum3f5da241990-12-20 15:06:42 +000010typedef struct {
Fred Drakeea9cb5a2000-07-09 00:20:36 +000011 int b_type; /* what kind of block this is */
12 int b_handler; /* where to jump to find handler */
13 int b_level; /* value stack level to pop to */
Guido van Rossumcaa63801995-01-12 11:45:45 +000014} PyTryBlock;
Guido van Rossum3f5da241990-12-20 15:06:42 +000015
16typedef struct _frame {
Neil Schemenauer251ead82001-08-29 23:45:25 +000017 PyObject_VAR_HEAD
Fred Drakeea9cb5a2000-07-09 00:20:36 +000018 struct _frame *f_back; /* previous frame, or NULL */
19 PyCodeObject *f_code; /* code segment */
20 PyObject *f_builtins; /* builtin symbol table (PyDictObject) */
21 PyObject *f_globals; /* global symbol table (PyDictObject) */
Raymond Hettinger214b1c32004-07-02 06:41:07 +000022 PyObject *f_locals; /* local symbol table (any mapping) */
Fred Drakeea9cb5a2000-07-09 00:20:36 +000023 PyObject **f_valuestack; /* points after the last local */
Tim Peters8c963692001-06-23 05:26:56 +000024 /* Next free slot in f_valuestack. Frame creation sets to f_valuestack.
25 Frame evaluation usually NULLs it, but a frame that yields sets it
26 to the current stack top. */
27 PyObject **f_stacktop;
Fred Drakeea9cb5a2000-07-09 00:20:36 +000028 PyObject *f_trace; /* Trace function */
Thomas Wouters477c8d52006-05-27 19:21:47 +000029
Benjamin Petersoneec3d712008-06-11 15:59:43 +000030 /* In a generator, we need to be able to swap between the exception
31 state inside the generator and the exception state of the calling
32 frame (which shouldn't be impacted when the generator "yields"
33 from an except handler).
34 These three fields exist exactly for that, and are unused for
35 non-generator frames. See the SAVE_EXC_STATE and SWAP_EXC_STATE
36 macros in ceval.c for details of their use. */
Fred Drakeea9cb5a2000-07-09 00:20:36 +000037 PyObject *f_exc_type, *f_exc_value, *f_exc_traceback;
Thomas Wouters477c8d52006-05-27 19:21:47 +000038
Fred Drakeea9cb5a2000-07-09 00:20:36 +000039 PyThreadState *f_tstate;
40 int f_lasti; /* Last instruction if called */
Michael W. Hudson02ff6a92002-09-11 15:36:32 +000041 /* As of 2.3 f_lineno is only valid when tracing is active (i.e. when
42 f_trace is set) -- at other times use PyCode_Addr2Line instead. */
Fred Drakeea9cb5a2000-07-09 00:20:36 +000043 int f_lineno; /* Current line number */
Fred Drakeea9cb5a2000-07-09 00:20:36 +000044 int f_iblock; /* index in f_blockstack */
45 PyTryBlock f_blockstack[CO_MAXBLOCKS]; /* for try and loop blocks */
Fred Drakeea9cb5a2000-07-09 00:20:36 +000046 PyObject *f_localsplus[1]; /* locals+stack, dynamically sized */
Guido van Rossumcaa63801995-01-12 11:45:45 +000047} PyFrameObject;
Guido van Rossum3f5da241990-12-20 15:06:42 +000048
49
50/* Standard object interface */
51
Mark Hammond91a681d2002-08-12 07:21:58 +000052PyAPI_DATA(PyTypeObject) PyFrame_Type;
Guido van Rossum3f5da241990-12-20 15:06:42 +000053
Christian Heimes90aa7642007-12-19 02:45:37 +000054#define PyFrame_Check(op) (Py_TYPE(op) == &PyFrame_Type)
Guido van Rossum3f5da241990-12-20 15:06:42 +000055
Mark Hammond91a681d2002-08-12 07:21:58 +000056PyAPI_FUNC(PyFrameObject *) PyFrame_New(PyThreadState *, PyCodeObject *,
Jeremy Hylton30c9f392001-03-13 01:58:22 +000057 PyObject *, PyObject *);
Guido van Rossum3f5da241990-12-20 15:06:42 +000058
59
60/* The rest of the interface is specific for frame objects */
61
Guido van Rossum3f5da241990-12-20 15:06:42 +000062/* Block management functions */
63
Mark Hammond91a681d2002-08-12 07:21:58 +000064PyAPI_FUNC(void) PyFrame_BlockSetup(PyFrameObject *, int, int, int);
65PyAPI_FUNC(PyTryBlock *) PyFrame_BlockPop(PyFrameObject *);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000066
67/* Extend the value stack */
68
Mark Hammond91a681d2002-08-12 07:21:58 +000069PyAPI_FUNC(PyObject **) PyFrame_ExtendStack(PyFrameObject *, int, int);
Guido van Rossuma3309961993-07-28 09:05:47 +000070
Guido van Rossumb6775db1994-08-01 11:34:53 +000071/* Conversions between "fast locals" and locals in dictionary */
72
Mark Hammond91a681d2002-08-12 07:21:58 +000073PyAPI_FUNC(void) PyFrame_LocalsToFast(PyFrameObject *, int);
74PyAPI_FUNC(void) PyFrame_FastToLocals(PyFrameObject *);
Guido van Rossumb6775db1994-08-01 11:34:53 +000075
Christian Heimesa156e092008-02-16 07:38:31 +000076PyAPI_FUNC(int) PyFrame_ClearFreeList(void);
77
Guido van Rossuma3309961993-07-28 09:05:47 +000078#ifdef __cplusplus
79}
80#endif
81#endif /* !Py_FRAMEOBJECT_H */