• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 
2 /* Frame object interface */
3 
4 #ifndef Py_FRAMEOBJECT_H
5 #define Py_FRAMEOBJECT_H
6 #ifdef __cplusplus
7 extern "C" {
8 #endif
9 
10 typedef struct {
11     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 */
14 } PyTryBlock;
15 
16 typedef struct _frame {
17     PyObject_VAR_HEAD
18     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) */
22     PyObject *f_locals;		/* local symbol table (any mapping) */
23     PyObject **f_valuestack;	/* points after the last local */
24     /* 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;
28     PyObject *f_trace;		/* Trace function */
29 
30     /* If an exception is raised in this frame, the next three are used to
31      * record the exception info (if any) originally in the thread state.  See
32      * comments before set_exc_info() -- it's not obvious.
33      * Invariant:  if _type is NULL, then so are _value and _traceback.
34      * Desired invariant:  all three are NULL, or all three are non-NULL.  That
35      * one isn't currently true, but "should be".
36      */
37     PyObject *f_exc_type, *f_exc_value, *f_exc_traceback;
38 
39     PyThreadState *f_tstate;
40     int f_lasti;		/* Last instruction if called */
41     /* Call PyFrame_GetLineNumber() instead of reading this field
42        directly.  As of 2.3 f_lineno is only valid when tracing is
43        active (i.e. when f_trace is set).  At other times we use
44        PyCode_Addr2Line to calculate the line from the current
45        bytecode index. */
46     int f_lineno;		/* Current line number */
47     int f_iblock;		/* index in f_blockstack */
48     PyTryBlock f_blockstack[CO_MAXBLOCKS]; /* for try and loop blocks */
49     PyObject *f_localsplus[1];	/* locals+stack, dynamically sized */
50 } PyFrameObject;
51 
52 
53 /* Standard object interface */
54 
55 PyAPI_DATA(PyTypeObject) PyFrame_Type;
56 
57 #define PyFrame_Check(op) ((op)->ob_type == &PyFrame_Type)
58 #define PyFrame_IsRestricted(f) \
59 	((f)->f_builtins != (f)->f_tstate->interp->builtins)
60 
61 PyAPI_FUNC(PyFrameObject *) PyFrame_New(PyThreadState *, PyCodeObject *,
62                                        PyObject *, PyObject *);
63 
64 
65 /* The rest of the interface is specific for frame objects */
66 
67 /* Block management functions */
68 
69 PyAPI_FUNC(void) PyFrame_BlockSetup(PyFrameObject *, int, int, int);
70 PyAPI_FUNC(PyTryBlock *) PyFrame_BlockPop(PyFrameObject *);
71 
72 /* Extend the value stack */
73 
74 PyAPI_FUNC(PyObject **) PyFrame_ExtendStack(PyFrameObject *, int, int);
75 
76 /* Conversions between "fast locals" and locals in dictionary */
77 
78 PyAPI_FUNC(void) PyFrame_LocalsToFast(PyFrameObject *, int);
79 PyAPI_FUNC(void) PyFrame_FastToLocals(PyFrameObject *);
80 
81 PyAPI_FUNC(int) PyFrame_ClearFreeList(void);
82 
83 /* Return the line of code the frame is currently executing. */
84 PyAPI_FUNC(int) PyFrame_GetLineNumber(PyFrameObject *);
85 
86 #ifdef __cplusplus
87 }
88 #endif
89 #endif /* !Py_FRAMEOBJECT_H */
90