1 /**
2   Mirror _frameobject.h
3   */
4 module deimos.python.frameobject;
5 
6 import deimos.python.pyport;
7 import deimos.python.object;
8 import deimos.python.code;
9 import deimos.python.pystate;
10 
11 
12 extern(C):
13 // Python-header-file: Include/frameobject.h:
14 
15 /// _
16 struct PyTryBlock {
17     /** what kind of block this is */
18     int b_type;
19     /** where to jump to find handler */
20     int b_handler;
21     /** value stack level to pop to */
22     int b_level;
23 }
24 
25 /// subclass of PyVarObject
26 struct PyFrameObject {
27     mixin PyObject_VAR_HEAD;
28 
29     /** previous frame, or NULL */
30     PyFrameObject* f_back;
31     /** code segment */
32     PyCodeObject* f_code;
33     /** builtin symbol table (PyDictObject) */
34     PyObject* f_builtins;
35     /** global symbol table (PyDictObject) */
36     PyObject* f_globals;
37     /** local symbol table (any mapping) */
38     PyObject* f_locals;
39     /** points after the last local */
40     PyObject** f_valuestack;
41     /** Next free slot in f_valuestack.  Frame creation sets to f_valuestack.
42        Frame evaluation usually NULLs it, but a frame that yields sets it
43        to the current stack top. */
44     PyObject** f_stacktop;
45     /** Trace function */
46     PyObject* f_trace;
47     /** If an exception is raised in this frame, the next three are used to
48      * record the exception info (if any) originally in the thread state.  See
49      * comments before set_exc_info() -- it's not obvious.
50      * Invariant:  if _type is NULL, then so are _value and _traceback.
51      * Desired invariant:  all three are NULL, or all three are non-NULL.  That
52      * one isn't currently true, but "should be".
53      */
54     PyObject* f_exc_type;
55     /// _
56     PyObject* f_exc_value;
57     /// _
58     PyObject* f_exc_traceback;
59     /// _
60     PyThreadState* f_tstate;
61     /** Last instruction if called */
62     int f_lasti;
63     /** Call PyFrame_GetLineNumber() instead of reading this field
64        directly.  As of 2.3 f_lineno is only valid when tracing is
65        active (i.e. when f_trace is set).  At other times we use
66        PyCode_Addr2Line to calculate the line from the current
67        bytecode index.
68 
69        Current line number
70      */
71     int f_lineno;
72     version(Python_2_5_Or_Later){
73     }else{
74         /// Availability: 2.4
75         int f_restricted;
76     }
77     /** index in f_blockstack */
78     int f_iblock;
79     /** for try and loop blocks */
80     PyTryBlock[CO_MAXBLOCKS] f_blockstack;
81     version(Python_2_5_Or_Later){
82     }else{
83         /// Availability: 2.4
84         int f_nlocals;
85         /// ditto
86         int f_ncells;
87         /// ditto
88         int f_nfreevars;
89         /// ditto
90         int f_stacksize;
91     }
92     PyObject*[1] _f_localsplus;
93     /** locals+stack, dynamically sized */
94     PyObject** f_localsplus()() {
95         return _f_localsplus.ptr;
96     }
97 }
98 
99 /// _
100 mixin(PyAPI_DATA!"PyTypeObject PyFrame_Type");
101 
102 // D translation of C macro:
103 /// _
104 int PyFrame_Check()(PyObject* op) {
105     return Py_TYPE(op) == &PyFrame_Type;
106 }
107 version(Python_3_0_Or_Later){
108 }else version(Python_2_5_Or_Later){
109     /// Availability: 2.5, 2.6, 2.7
110     int PyFrame_IsRestricted()(PyFrameObject* f) {
111         return f.f_builtins != f.f_tstate.interp.builtins;
112     }
113 }
114 
115 /// _
116 PyFrameObject* PyFrame_New(PyThreadState*, PyCodeObject*,
117         PyObject*, PyObject*);
118 
119 /** Block management functions */
120 void PyFrame_BlockSetup(PyFrameObject*, int, int, int);
121 /// ditto
122 PyTryBlock* PyFrame_BlockPop(PyFrameObject*);
123 /** Extend the value stack */
124 PyObject** PyFrame_ExtendStack(PyFrameObject*, int, int);
125 
126 /** Conversions between "fast locals" and locals in dictionary */
127 void PyFrame_LocalsToFast(PyFrameObject*, int);
128 /// ditto
129 void PyFrame_FastToLocals(PyFrameObject*);
130 version(Python_2_6_Or_Later) {
131     /// Availability: >= 2.6
132     int PyFrame_ClearFreeList();
133 }
134 version(Python_2_7_Or_Later) {
135     /** Return the line of code the frame is currently executing. */
136     /// Availability: >= 2.7
137     int PyFrame_GetLineNumber(PyFrameObject*);
138 }
139 
140