blob: 6ca390b34b311768e544b543de66f78ca16c4fbb [file] [log] [blame]
Guido van Rossum3f5da241990-12-20 15:06:42 +00001/* Frame object implementation */
2
Guido van Rossum18752471997-04-29 14:49:28 +00003#include "Python.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +00004
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005#include "code.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +00006#include "frameobject.h"
7#include "opcode.h"
8#include "structmember.h"
9
Neal Norwitz91787cb2002-12-18 23:33:35 +000010#undef MIN
11#undef MAX
Michael W. Hudsoncfd38842002-12-17 16:15:34 +000012#define MIN(a, b) ((a) < (b) ? (a) : (b))
13#define MAX(a, b) ((a) > (b) ? (a) : (b))
14
Guido van Rossum18752471997-04-29 14:49:28 +000015#define OFF(x) offsetof(PyFrameObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +000016
Guido van Rossum6f799372001-09-20 20:46:19 +000017static PyMemberDef frame_memberlist[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +000018 {"f_back", T_OBJECT, OFF(f_back), RO},
19 {"f_code", T_OBJECT, OFF(f_code), RO},
20 {"f_builtins", T_OBJECT, OFF(f_builtins),RO},
21 {"f_globals", T_OBJECT, OFF(f_globals), RO},
22 {"f_lasti", T_INT, OFF(f_lasti), RO},
23 {NULL} /* Sentinel */
Guido van Rossum3f5da241990-12-20 15:06:42 +000024};
25
Benjamin Petersonf09925d2008-12-22 20:16:25 +000026#define WARN_GET_SET(NAME) \
27static PyObject * frame_get_ ## NAME(PyFrameObject *f) { \
Antoine Pitrouc83ea132010-05-09 14:46:46 +000028 if (PyErr_WarnPy3k(#NAME " has been removed in 3.x", 2) < 0) \
29 return NULL; \
30 if (f->NAME) { \
31 Py_INCREF(f->NAME); \
32 return f->NAME; \
33 } \
34 Py_RETURN_NONE; \
Benjamin Petersonf09925d2008-12-22 20:16:25 +000035} \
36static int frame_set_ ## NAME(PyFrameObject *f, PyObject *new) { \
Antoine Pitrouc83ea132010-05-09 14:46:46 +000037 if (PyErr_WarnPy3k(#NAME " has been removed in 3.x", 2) < 0) \
38 return -1; \
39 if (f->NAME) { \
40 Py_CLEAR(f->NAME); \
41 } \
42 if (new == Py_None) \
43 new = NULL; \
44 Py_XINCREF(new); \
45 f->NAME = new; \
46 return 0; \
Benjamin Petersonf09925d2008-12-22 20:16:25 +000047}
48
49
50WARN_GET_SET(f_exc_traceback)
51WARN_GET_SET(f_exc_type)
52WARN_GET_SET(f_exc_value)
53
54
Guido van Rossum18752471997-04-29 14:49:28 +000055static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +000056frame_getlocals(PyFrameObject *f, void *closure)
Guido van Rossum3f5da241990-12-20 15:06:42 +000057{
Antoine Pitrouc83ea132010-05-09 14:46:46 +000058 PyFrame_FastToLocals(f);
59 Py_INCREF(f->f_locals);
60 return f->f_locals;
Guido van Rossum3f5da241990-12-20 15:06:42 +000061}
62
Jeffrey Yasskinf7f858d2009-05-08 22:23:21 +000063int
64PyFrame_GetLineNumber(PyFrameObject *f)
65{
Antoine Pitrouc83ea132010-05-09 14:46:46 +000066 if (f->f_trace)
67 return f->f_lineno;
68 else
69 return PyCode_Addr2Line(f->f_code, f->f_lasti);
Jeffrey Yasskinf7f858d2009-05-08 22:23:21 +000070}
71
Michael W. Hudsondd32a912002-08-15 14:59:02 +000072static PyObject *
73frame_getlineno(PyFrameObject *f, void *closure)
74{
Antoine Pitrouc83ea132010-05-09 14:46:46 +000075 return PyInt_FromLong(PyFrame_GetLineNumber(f));
Michael W. Hudsondd32a912002-08-15 14:59:02 +000076}
77
Michael W. Hudsoncfd38842002-12-17 16:15:34 +000078/* Setter for f_lineno - you can set f_lineno from within a trace function in
Antoine Pitrouc83ea132010-05-09 14:46:46 +000079 * order to jump to a given line of code, subject to some restrictions. Most
Michael W. Hudsoncfd38842002-12-17 16:15:34 +000080 * lines are OK to jump to because they don't make any assumptions about the
81 * state of the stack (obvious because you could remove the line and the code
82 * would still work without any stack errors), but there are some constructs
83 * that limit jumping:
84 *
85 * o Lines with an 'except' statement on them can't be jumped to, because
86 * they expect an exception to be on the top of the stack.
87 * o Lines that live in a 'finally' block can't be jumped from or to, since
88 * the END_FINALLY expects to clean up the stack after the 'try' block.
89 * o 'try'/'for'/'while' blocks can't be jumped into because the blockstack
90 * needs to be set up before their code runs, and for 'for' loops the
91 * iterator needs to be on the stack.
92 */
93static int
94frame_setlineno(PyFrameObject *f, PyObject* p_new_lineno)
95{
Antoine Pitrouc83ea132010-05-09 14:46:46 +000096 int new_lineno = 0; /* The new value of f_lineno */
97 int new_lasti = 0; /* The new value of f_lasti */
98 int new_iblock = 0; /* The new value of f_iblock */
99 unsigned char *code = NULL; /* The bytecode for the frame... */
100 Py_ssize_t code_len = 0; /* ...and its length */
101 unsigned char *lnotab = NULL; /* Iterating over co_lnotab */
102 Py_ssize_t lnotab_len = 0; /* (ditto) */
103 int offset = 0; /* (ditto) */
104 int line = 0; /* (ditto) */
105 int addr = 0; /* (ditto) */
106 int min_addr = 0; /* Scanning the SETUPs and POPs */
107 int max_addr = 0; /* (ditto) */
108 int delta_iblock = 0; /* (ditto) */
109 int min_delta_iblock = 0; /* (ditto) */
110 int min_iblock = 0; /* (ditto) */
111 int f_lasti_setup_addr = 0; /* Policing no-jump-into-finally */
112 int new_lasti_setup_addr = 0; /* (ditto) */
113 int blockstack[CO_MAXBLOCKS]; /* Walking the 'finally' blocks */
114 int in_finally[CO_MAXBLOCKS]; /* (ditto) */
115 int blockstack_top = 0; /* (ditto) */
116 unsigned char setup_op = 0; /* (ditto) */
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000117
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000118 /* f_lineno must be an integer. */
119 if (!PyInt_Check(p_new_lineno)) {
120 PyErr_SetString(PyExc_ValueError,
121 "lineno must be an integer");
122 return -1;
123 }
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000124
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000125 /* You can only do this from within a trace function, not via
126 * _getframe or similar hackery. */
127 if (!f->f_trace)
128 {
129 PyErr_Format(PyExc_ValueError,
130 "f_lineno can only be set by a"
131 " line trace function");
132 return -1;
133 }
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000134
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000135 /* Fail if the line comes before the start of the code block. */
136 new_lineno = (int) PyInt_AsLong(p_new_lineno);
137 if (new_lineno < f->f_code->co_firstlineno) {
138 PyErr_Format(PyExc_ValueError,
139 "line %d comes before the current code block",
140 new_lineno);
141 return -1;
142 }
143 else if (new_lineno == f->f_code->co_firstlineno) {
144 new_lasti = 0;
145 new_lineno = f->f_code->co_firstlineno;
146 }
147 else {
148 /* Find the bytecode offset for the start of the given
149 * line, or the first code-owning line after it. */
150 char *tmp;
151 PyString_AsStringAndSize(f->f_code->co_lnotab,
152 &tmp, &lnotab_len);
153 lnotab = (unsigned char *) tmp;
154 addr = 0;
155 line = f->f_code->co_firstlineno;
156 new_lasti = -1;
157 for (offset = 0; offset < lnotab_len; offset += 2) {
158 addr += lnotab[offset];
159 line += lnotab[offset+1];
160 if (line >= new_lineno) {
161 new_lasti = addr;
162 new_lineno = line;
163 break;
164 }
165 }
166 }
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000167
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000168 /* If we didn't reach the requested line, return an error. */
169 if (new_lasti == -1) {
170 PyErr_Format(PyExc_ValueError,
171 "line %d comes after the current code block",
172 new_lineno);
173 return -1;
174 }
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000175
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000176 /* We're now ready to look at the bytecode. */
177 PyString_AsStringAndSize(f->f_code->co_code, (char **)&code, &code_len);
178 min_addr = MIN(new_lasti, f->f_lasti);
179 max_addr = MAX(new_lasti, f->f_lasti);
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000180
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000181 /* You can't jump onto a line with an 'except' statement on it -
182 * they expect to have an exception on the top of the stack, which
183 * won't be true if you jump to them. They always start with code
184 * that either pops the exception using POP_TOP (plain 'except:'
185 * lines do this) or duplicates the exception on the stack using
186 * DUP_TOP (if there's an exception type specified). See compile.c,
187 * 'com_try_except' for the full details. There aren't any other
188 * cases (AFAIK) where a line's code can start with DUP_TOP or
189 * POP_TOP, but if any ever appear, they'll be subject to the same
190 * restriction (but with a different error message). */
191 if (code[new_lasti] == DUP_TOP || code[new_lasti] == POP_TOP) {
192 PyErr_SetString(PyExc_ValueError,
193 "can't jump to 'except' line as there's no exception");
194 return -1;
195 }
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000196
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000197 /* You can't jump into or out of a 'finally' block because the 'try'
198 * block leaves something on the stack for the END_FINALLY to clean
199 * up. So we walk the bytecode, maintaining a simulated blockstack.
200 * When we reach the old or new address and it's in a 'finally' block
201 * we note the address of the corresponding SETUP_FINALLY. The jump
202 * is only legal if neither address is in a 'finally' block or
203 * they're both in the same one. 'blockstack' is a stack of the
204 * bytecode addresses of the SETUP_X opcodes, and 'in_finally' tracks
205 * whether we're in a 'finally' block at each blockstack level. */
206 f_lasti_setup_addr = -1;
207 new_lasti_setup_addr = -1;
208 memset(blockstack, '\0', sizeof(blockstack));
209 memset(in_finally, '\0', sizeof(in_finally));
210 blockstack_top = 0;
211 for (addr = 0; addr < code_len; addr++) {
212 unsigned char op = code[addr];
213 switch (op) {
214 case SETUP_LOOP:
215 case SETUP_EXCEPT:
216 case SETUP_FINALLY:
Benjamin Peterson76605552012-04-18 11:14:31 -0400217 case SETUP_WITH:
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000218 blockstack[blockstack_top++] = addr;
219 in_finally[blockstack_top-1] = 0;
220 break;
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000221
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000222 case POP_BLOCK:
223 assert(blockstack_top > 0);
224 setup_op = code[blockstack[blockstack_top-1]];
Benjamin Peterson76605552012-04-18 11:14:31 -0400225 if (setup_op == SETUP_FINALLY || setup_op == SETUP_WITH) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000226 in_finally[blockstack_top-1] = 1;
227 }
228 else {
229 blockstack_top--;
230 }
231 break;
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000232
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000233 case END_FINALLY:
234 /* Ignore END_FINALLYs for SETUP_EXCEPTs - they exist
235 * in the bytecode but don't correspond to an actual
236 * 'finally' block. (If blockstack_top is 0, we must
237 * be seeing such an END_FINALLY.) */
238 if (blockstack_top > 0) {
239 setup_op = code[blockstack[blockstack_top-1]];
Benjamin Peterson76605552012-04-18 11:14:31 -0400240 if (setup_op == SETUP_FINALLY || setup_op == SETUP_WITH) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000241 blockstack_top--;
242 }
243 }
244 break;
245 }
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000246
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000247 /* For the addresses we're interested in, see whether they're
248 * within a 'finally' block and if so, remember the address
249 * of the SETUP_FINALLY. */
250 if (addr == new_lasti || addr == f->f_lasti) {
251 int i = 0;
252 int setup_addr = -1;
253 for (i = blockstack_top-1; i >= 0; i--) {
254 if (in_finally[i]) {
255 setup_addr = blockstack[i];
256 break;
257 }
258 }
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000259
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000260 if (setup_addr != -1) {
261 if (addr == new_lasti) {
262 new_lasti_setup_addr = setup_addr;
263 }
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000264
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000265 if (addr == f->f_lasti) {
266 f_lasti_setup_addr = setup_addr;
267 }
268 }
269 }
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000270
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000271 if (op >= HAVE_ARGUMENT) {
272 addr += 2;
273 }
274 }
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000275
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000276 /* Verify that the blockstack tracking code didn't get lost. */
277 assert(blockstack_top == 0);
Neal Norwitzee65e222002-12-19 18:16:57 +0000278
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000279 /* After all that, are we jumping into / out of a 'finally' block? */
280 if (new_lasti_setup_addr != f_lasti_setup_addr) {
281 PyErr_SetString(PyExc_ValueError,
282 "can't jump into or out of a 'finally' block");
283 return -1;
284 }
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000285
286
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000287 /* Police block-jumping (you can't jump into the middle of a block)
288 * and ensure that the blockstack finishes up in a sensible state (by
289 * popping any blocks we're jumping out of). We look at all the
290 * blockstack operations between the current position and the new
291 * one, and keep track of how many blocks we drop out of on the way.
292 * By also keeping track of the lowest blockstack position we see, we
293 * can tell whether the jump goes into any blocks without coming out
294 * again - in that case we raise an exception below. */
295 delta_iblock = 0;
296 for (addr = min_addr; addr < max_addr; addr++) {
297 unsigned char op = code[addr];
298 switch (op) {
299 case SETUP_LOOP:
300 case SETUP_EXCEPT:
301 case SETUP_FINALLY:
Benjamin Peterson76605552012-04-18 11:14:31 -0400302 case SETUP_WITH:
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000303 delta_iblock++;
304 break;
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000305
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000306 case POP_BLOCK:
307 delta_iblock--;
308 break;
309 }
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000310
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000311 min_delta_iblock = MIN(min_delta_iblock, delta_iblock);
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000312
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000313 if (op >= HAVE_ARGUMENT) {
314 addr += 2;
315 }
316 }
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000317
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000318 /* Derive the absolute iblock values from the deltas. */
319 min_iblock = f->f_iblock + min_delta_iblock;
320 if (new_lasti > f->f_lasti) {
321 /* Forwards jump. */
322 new_iblock = f->f_iblock + delta_iblock;
323 }
324 else {
325 /* Backwards jump. */
326 new_iblock = f->f_iblock - delta_iblock;
327 }
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000328
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000329 /* Are we jumping into a block? */
330 if (new_iblock > min_iblock) {
331 PyErr_SetString(PyExc_ValueError,
332 "can't jump into the middle of a block");
333 return -1;
334 }
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000335
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000336 /* Pop any blocks that we're jumping out of. */
337 while (f->f_iblock > new_iblock) {
338 PyTryBlock *b = &f->f_blockstack[--f->f_iblock];
339 while ((f->f_stacktop - f->f_valuestack) > b->b_level) {
340 PyObject *v = (*--f->f_stacktop);
341 Py_DECREF(v);
342 }
343 }
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000344
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000345 /* Finally set the new f_lineno and f_lasti and return OK. */
346 f->f_lineno = new_lineno;
347 f->f_lasti = new_lasti;
348 return 0;
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000349}
350
Michael W. Hudson02ff6a92002-09-11 15:36:32 +0000351static PyObject *
352frame_gettrace(PyFrameObject *f, void *closure)
353{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000354 PyObject* trace = f->f_trace;
Michael W. Hudson02ff6a92002-09-11 15:36:32 +0000355
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000356 if (trace == NULL)
357 trace = Py_None;
Michael W. Hudson02ff6a92002-09-11 15:36:32 +0000358
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000359 Py_INCREF(trace);
Michael W. Hudson02ff6a92002-09-11 15:36:32 +0000360
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000361 return trace;
Michael W. Hudson02ff6a92002-09-11 15:36:32 +0000362}
363
364static int
365frame_settrace(PyFrameObject *f, PyObject* v, void *closure)
366{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000367 PyObject* old_value;
Jeffrey Yasskinf7f858d2009-05-08 22:23:21 +0000368
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000369 /* We rely on f_lineno being accurate when f_trace is set. */
370 f->f_lineno = PyFrame_GetLineNumber(f);
Michael W. Hudson02ff6a92002-09-11 15:36:32 +0000371
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000372 old_value = f->f_trace;
373 Py_XINCREF(v);
374 f->f_trace = v;
375 Py_XDECREF(old_value);
Michael W. Hudson02ff6a92002-09-11 15:36:32 +0000376
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000377 return 0;
Michael W. Hudson02ff6a92002-09-11 15:36:32 +0000378}
379
Neal Norwitzb9845e72006-06-12 02:11:18 +0000380static PyObject *
381frame_getrestricted(PyFrameObject *f, void *closure)
382{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000383 return PyBool_FromLong(PyFrame_IsRestricted(f));
Neal Norwitzb9845e72006-06-12 02:11:18 +0000384}
385
Guido van Rossum32d34c82001-09-20 21:45:26 +0000386static PyGetSetDef frame_getsetlist[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000387 {"f_locals", (getter)frame_getlocals, NULL, NULL},
388 {"f_lineno", (getter)frame_getlineno,
389 (setter)frame_setlineno, NULL},
390 {"f_trace", (getter)frame_gettrace, (setter)frame_settrace, NULL},
391 {"f_restricted",(getter)frame_getrestricted,NULL, NULL},
392 {"f_exc_traceback", (getter)frame_get_f_exc_traceback,
393 (setter)frame_set_f_exc_traceback, NULL},
394 {"f_exc_type", (getter)frame_get_f_exc_type,
395 (setter)frame_set_f_exc_type, NULL},
396 {"f_exc_value", (getter)frame_get_f_exc_value,
397 (setter)frame_set_f_exc_value, NULL},
398 {0}
Tim Peters6d6c1a32001-08-02 04:15:00 +0000399};
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000400
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000401/* Stack frames are allocated and deallocated at a considerable rate.
Richard Jones7c88dcc2006-05-23 10:37:38 +0000402 In an attempt to improve the speed of function calls, we:
403
404 1. Hold a single "zombie" frame on each code object. This retains
405 the allocated and initialised frame object from an invocation of
406 the code object. The zombie is reanimated the next time we need a
407 frame object for that code object. Doing this saves the malloc/
408 realloc required when using a free_list frame that isn't the
409 correct size. It also saves some field initialisation.
410
411 In zombie mode, no field of PyFrameObject holds a reference, but
412 the following fields are still valid:
413
Richard Jonesa3727112006-05-23 18:32:11 +0000414 * ob_type, ob_size, f_code, f_valuestack;
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000415
Richard Jones7c88dcc2006-05-23 10:37:38 +0000416 * f_locals, f_trace,
417 f_exc_type, f_exc_value, f_exc_traceback are NULL;
418
419 * f_localsplus does not require re-allocation and
420 the local variables in f_localsplus are NULL.
421
422 2. We also maintain a separate free list of stack frames (just like
423 integers are allocated in a special way -- see intobject.c). When
424 a stack frame is on the free list, only the following members have
425 a meaning:
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000426 ob_type == &Frametype
427 f_back next item on free list, or NULL
428 f_stacksize size of value stack
429 ob_size size of localsplus
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000430 Note that the value and block stacks are preserved -- this can save
431 another malloc() call or two (and two free() calls as well!).
432 Also note that, unlike for integers, each frame object is a
433 malloc'ed object in its own right -- it is only the actual calls to
434 malloc() that we are trying to save here, not the administration.
435 After all, while a typical program may make millions of calls, a
436 call depth of more than 20 or 30 is probably already exceptional
437 unless the program contains run-away recursion. I hope.
Tim Petersb7ba7432002-04-13 05:21:47 +0000438
Christian Heimes5b970ad2008-02-06 13:33:44 +0000439 Later, PyFrame_MAXFREELIST was added to bound the # of frames saved on
Tim Petersb7ba7432002-04-13 05:21:47 +0000440 free_list. Else programs creating lots of cyclic trash involving
441 frames could provoke free_list into growing without bound.
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000442*/
443
Guido van Rossum18752471997-04-29 14:49:28 +0000444static PyFrameObject *free_list = NULL;
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000445static int numfree = 0; /* number of frames currently in free_list */
Christian Heimes5b970ad2008-02-06 13:33:44 +0000446/* max value for numfree */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000447#define PyFrame_MAXFREELIST 200
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000448
Guido van Rossum3f5da241990-12-20 15:06:42 +0000449static void
Fred Drake1b190b42000-07-09 05:40:56 +0000450frame_dealloc(PyFrameObject *f)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000451{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000452 PyObject **p, **valuestack;
453 PyCodeObject *co;
Guido van Rossum7582bfb1997-02-14 16:27:29 +0000454
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000455 PyObject_GC_UnTrack(f);
456 Py_TRASHCAN_SAFE_BEGIN(f)
457 /* Kill all local variables */
458 valuestack = f->f_valuestack;
459 for (p = f->f_localsplus; p < valuestack; p++)
460 Py_CLEAR(*p);
Guido van Rossum7582bfb1997-02-14 16:27:29 +0000461
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000462 /* Free stack */
463 if (f->f_stacktop != NULL) {
464 for (p = valuestack; p < f->f_stacktop; p++)
465 Py_XDECREF(*p);
466 }
Tim Petersa13131c2006-04-15 03:15:24 +0000467
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000468 Py_XDECREF(f->f_back);
469 Py_DECREF(f->f_builtins);
470 Py_DECREF(f->f_globals);
471 Py_CLEAR(f->f_locals);
472 Py_CLEAR(f->f_trace);
473 Py_CLEAR(f->f_exc_type);
474 Py_CLEAR(f->f_exc_value);
475 Py_CLEAR(f->f_exc_traceback);
Richard Jones7c88dcc2006-05-23 10:37:38 +0000476
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000477 co = f->f_code;
478 if (co->co_zombieframe == NULL)
479 co->co_zombieframe = f;
480 else if (numfree < PyFrame_MAXFREELIST) {
481 ++numfree;
482 f->f_back = free_list;
483 free_list = f;
484 }
485 else
486 PyObject_GC_Del(f);
Richard Jones7c88dcc2006-05-23 10:37:38 +0000487
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000488 Py_DECREF(co);
489 Py_TRASHCAN_SAFE_END(f)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000490}
491
Neil Schemenauer19cd2922001-07-12 13:27:11 +0000492static int
493frame_traverse(PyFrameObject *f, visitproc visit, void *arg)
494{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000495 PyObject **fastlocals, **p;
496 int i, slots;
Neil Schemenauer19cd2922001-07-12 13:27:11 +0000497
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000498 Py_VISIT(f->f_back);
499 Py_VISIT(f->f_code);
500 Py_VISIT(f->f_builtins);
501 Py_VISIT(f->f_globals);
502 Py_VISIT(f->f_locals);
503 Py_VISIT(f->f_trace);
504 Py_VISIT(f->f_exc_type);
505 Py_VISIT(f->f_exc_value);
506 Py_VISIT(f->f_exc_traceback);
Neil Schemenauer19cd2922001-07-12 13:27:11 +0000507
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000508 /* locals */
509 slots = f->f_code->co_nlocals + PyTuple_GET_SIZE(f->f_code->co_cellvars) + PyTuple_GET_SIZE(f->f_code->co_freevars);
510 fastlocals = f->f_localsplus;
511 for (i = slots; --i >= 0; ++fastlocals)
512 Py_VISIT(*fastlocals);
Neil Schemenauer19cd2922001-07-12 13:27:11 +0000513
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000514 /* stack */
515 if (f->f_stacktop != NULL) {
516 for (p = f->f_valuestack; p < f->f_stacktop; p++)
517 Py_VISIT(*p);
518 }
519 return 0;
Neil Schemenauer19cd2922001-07-12 13:27:11 +0000520}
521
522static void
523frame_clear(PyFrameObject *f)
524{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000525 PyObject **fastlocals, **p, **oldtop;
526 int i, slots;
Neil Schemenauer19cd2922001-07-12 13:27:11 +0000527
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000528 /* Before anything else, make sure that this frame is clearly marked
529 * as being defunct! Else, e.g., a generator reachable from this
530 * frame may also point to this frame, believe itself to still be
531 * active, and try cleaning up this frame again.
532 */
533 oldtop = f->f_stacktop;
534 f->f_stacktop = NULL;
Phillip J. Eby8ebb28d2006-04-15 01:02:17 +0000535
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000536 Py_CLEAR(f->f_exc_type);
537 Py_CLEAR(f->f_exc_value);
538 Py_CLEAR(f->f_exc_traceback);
539 Py_CLEAR(f->f_trace);
Neil Schemenauer19cd2922001-07-12 13:27:11 +0000540
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000541 /* locals */
542 slots = f->f_code->co_nlocals + PyTuple_GET_SIZE(f->f_code->co_cellvars) + PyTuple_GET_SIZE(f->f_code->co_freevars);
543 fastlocals = f->f_localsplus;
544 for (i = slots; --i >= 0; ++fastlocals)
545 Py_CLEAR(*fastlocals);
Neil Schemenauer19cd2922001-07-12 13:27:11 +0000546
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000547 /* stack */
548 if (oldtop != NULL) {
549 for (p = f->f_valuestack; p < oldtop; p++)
550 Py_CLEAR(*p);
551 }
Neil Schemenauer19cd2922001-07-12 13:27:11 +0000552}
553
Robert Schuppenies9be2ec12008-07-10 15:24:04 +0000554static PyObject *
555frame_sizeof(PyFrameObject *f)
556{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000557 Py_ssize_t res, extras, ncells, nfrees;
Robert Schuppenies9be2ec12008-07-10 15:24:04 +0000558
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000559 ncells = PyTuple_GET_SIZE(f->f_code->co_cellvars);
560 nfrees = PyTuple_GET_SIZE(f->f_code->co_freevars);
561 extras = f->f_code->co_stacksize + f->f_code->co_nlocals +
562 ncells + nfrees;
563 /* subtract one as it is already included in PyFrameObject */
564 res = sizeof(PyFrameObject) + (extras-1) * sizeof(PyObject *);
Robert Schuppenies9be2ec12008-07-10 15:24:04 +0000565
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000566 return PyInt_FromSsize_t(res);
Robert Schuppenies9be2ec12008-07-10 15:24:04 +0000567}
568
569PyDoc_STRVAR(sizeof__doc__,
570"F.__sizeof__() -> size of F in memory, in bytes");
571
572static PyMethodDef frame_methods[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000573 {"__sizeof__", (PyCFunction)frame_sizeof, METH_NOARGS,
574 sizeof__doc__},
575 {NULL, NULL} /* sentinel */
Robert Schuppenies9be2ec12008-07-10 15:24:04 +0000576};
Neil Schemenauer19cd2922001-07-12 13:27:11 +0000577
Guido van Rossum18752471997-04-29 14:49:28 +0000578PyTypeObject PyFrame_Type = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000579 PyVarObject_HEAD_INIT(&PyType_Type, 0)
580 "frame",
581 sizeof(PyFrameObject),
582 sizeof(PyObject *),
583 (destructor)frame_dealloc, /* tp_dealloc */
584 0, /* tp_print */
585 0, /* tp_getattr */
586 0, /* tp_setattr */
587 0, /* tp_compare */
588 0, /* tp_repr */
589 0, /* tp_as_number */
590 0, /* tp_as_sequence */
591 0, /* tp_as_mapping */
592 0, /* tp_hash */
593 0, /* tp_call */
594 0, /* tp_str */
595 PyObject_GenericGetAttr, /* tp_getattro */
596 PyObject_GenericSetAttr, /* tp_setattro */
597 0, /* tp_as_buffer */
598 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
599 0, /* tp_doc */
600 (traverseproc)frame_traverse, /* tp_traverse */
601 (inquiry)frame_clear, /* tp_clear */
602 0, /* tp_richcompare */
603 0, /* tp_weaklistoffset */
604 0, /* tp_iter */
605 0, /* tp_iternext */
606 frame_methods, /* tp_methods */
607 frame_memberlist, /* tp_members */
608 frame_getsetlist, /* tp_getset */
609 0, /* tp_base */
610 0, /* tp_dict */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000611};
612
Neal Norwitzc91ed402002-12-30 22:29:22 +0000613static PyObject *builtin_object;
614
Neal Norwitzb2501f42002-12-31 03:42:13 +0000615int _PyFrame_Init()
Neal Norwitzc91ed402002-12-30 22:29:22 +0000616{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000617 builtin_object = PyString_InternFromString("__builtins__");
618 if (builtin_object == NULL)
619 return 0;
620 return 1;
Neal Norwitzc91ed402002-12-30 22:29:22 +0000621}
622
Guido van Rossum18752471997-04-29 14:49:28 +0000623PyFrameObject *
Tim Petersa13131c2006-04-15 03:15:24 +0000624PyFrame_New(PyThreadState *tstate, PyCodeObject *code, PyObject *globals,
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000625 PyObject *locals)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000626{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000627 PyFrameObject *back = tstate->frame;
628 PyFrameObject *f;
629 PyObject *builtins;
630 Py_ssize_t i;
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000631
Michael W. Hudson69734a52002-08-19 16:54:08 +0000632#ifdef Py_DEBUG
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000633 if (code == NULL || globals == NULL || !PyDict_Check(globals) ||
634 (locals != NULL && !PyMapping_Check(locals))) {
635 PyErr_BadInternalCall();
636 return NULL;
637 }
Michael W. Hudson69734a52002-08-19 16:54:08 +0000638#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000639 if (back == NULL || back->f_globals != globals) {
640 builtins = PyDict_GetItem(globals, builtin_object);
641 if (builtins) {
642 if (PyModule_Check(builtins)) {
643 builtins = PyModule_GetDict(builtins);
644 assert(!builtins || PyDict_Check(builtins));
645 }
646 else if (!PyDict_Check(builtins))
647 builtins = NULL;
648 }
649 if (builtins == NULL) {
650 /* No builtins! Make up a minimal one
651 Give them 'None', at least. */
652 builtins = PyDict_New();
653 if (builtins == NULL ||
654 PyDict_SetItemString(
655 builtins, "None", Py_None) < 0)
656 return NULL;
657 }
658 else
659 Py_INCREF(builtins);
Jeremy Hyltonbd5cbf82003-02-05 22:39:29 +0000660
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000661 }
662 else {
663 /* If we share the globals, we share the builtins.
664 Save a lookup and a call. */
665 builtins = back->f_builtins;
666 assert(builtins != NULL && PyDict_Check(builtins));
667 Py_INCREF(builtins);
668 }
669 if (code->co_zombieframe != NULL) {
670 f = code->co_zombieframe;
671 code->co_zombieframe = NULL;
672 _Py_NewReference((PyObject *)f);
673 assert(f->f_code == code);
674 }
675 else {
676 Py_ssize_t extras, ncells, nfrees;
677 ncells = PyTuple_GET_SIZE(code->co_cellvars);
678 nfrees = PyTuple_GET_SIZE(code->co_freevars);
679 extras = code->co_stacksize + code->co_nlocals + ncells +
680 nfrees;
681 if (free_list == NULL) {
682 f = PyObject_GC_NewVar(PyFrameObject, &PyFrame_Type,
683 extras);
684 if (f == NULL) {
685 Py_DECREF(builtins);
686 return NULL;
687 }
688 }
689 else {
690 assert(numfree > 0);
691 --numfree;
692 f = free_list;
693 free_list = free_list->f_back;
694 if (Py_SIZE(f) < extras) {
695 f = PyObject_GC_Resize(PyFrameObject, f, extras);
696 if (f == NULL) {
697 Py_DECREF(builtins);
698 return NULL;
699 }
700 }
701 _Py_NewReference((PyObject *)f);
702 }
Richard Jones7c88dcc2006-05-23 10:37:38 +0000703
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000704 f->f_code = code;
705 extras = code->co_nlocals + ncells + nfrees;
706 f->f_valuestack = f->f_localsplus + extras;
707 for (i=0; i<extras; i++)
708 f->f_localsplus[i] = NULL;
709 f->f_locals = NULL;
710 f->f_trace = NULL;
711 f->f_exc_type = f->f_exc_value = f->f_exc_traceback = NULL;
712 }
713 f->f_stacktop = f->f_valuestack;
714 f->f_builtins = builtins;
715 Py_XINCREF(back);
716 f->f_back = back;
717 Py_INCREF(code);
718 Py_INCREF(globals);
719 f->f_globals = globals;
720 /* Most functions have CO_NEWLOCALS and CO_OPTIMIZED set. */
721 if ((code->co_flags & (CO_NEWLOCALS | CO_OPTIMIZED)) ==
722 (CO_NEWLOCALS | CO_OPTIMIZED))
723 ; /* f_locals = NULL; will be set by PyFrame_FastToLocals() */
724 else if (code->co_flags & CO_NEWLOCALS) {
725 locals = PyDict_New();
726 if (locals == NULL) {
727 Py_DECREF(f);
728 return NULL;
729 }
730 f->f_locals = locals;
731 }
732 else {
733 if (locals == NULL)
734 locals = globals;
735 Py_INCREF(locals);
736 f->f_locals = locals;
737 }
738 f->f_tstate = tstate;
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000739
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000740 f->f_lasti = -1;
741 f->f_lineno = code->co_firstlineno;
742 f->f_iblock = 0;
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000743
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000744 _PyObject_GC_TRACK(f);
745 return f;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000746}
747
Guido van Rossum3f5da241990-12-20 15:06:42 +0000748/* Block management */
749
750void
Fred Drake1b190b42000-07-09 05:40:56 +0000751PyFrame_BlockSetup(PyFrameObject *f, int type, int handler, int level)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000752{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000753 PyTryBlock *b;
754 if (f->f_iblock >= CO_MAXBLOCKS)
755 Py_FatalError("XXX block stack overflow");
756 b = &f->f_blockstack[f->f_iblock++];
757 b->b_type = type;
758 b->b_level = level;
759 b->b_handler = handler;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000760}
761
Guido van Rossum18752471997-04-29 14:49:28 +0000762PyTryBlock *
Fred Drake1b190b42000-07-09 05:40:56 +0000763PyFrame_BlockPop(PyFrameObject *f)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000764{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000765 PyTryBlock *b;
766 if (f->f_iblock <= 0)
767 Py_FatalError("XXX block stack underflow");
768 b = &f->f_blockstack[--f->f_iblock];
769 return b;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000770}
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000771
Jeremy Hylton759410b2007-02-26 18:41:18 +0000772/* Convert between "fast" version of locals and dictionary version.
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000773
774 map and values are input arguments. map is a tuple of strings.
Jeremy Hylton759410b2007-02-26 18:41:18 +0000775 values is an array of PyObject*. At index i, map[i] is the name of
776 the variable with value values[i]. The function copies the first
777 nmap variable from map/values into dict. If values[i] is NULL,
778 the variable is deleted from dict.
779
780 If deref is true, then the values being copied are cell variables
781 and the value is extracted from the cell variable before being put
782 in dict.
783
784 Exceptions raised while modifying the dict are silently ignored,
785 because there is no good way to report them.
786 */
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000787
Guido van Rossumf68d8e52001-04-14 17:55:09 +0000788static void
Martin v. Löwis18e16552006-02-15 17:27:45 +0000789map_to_dict(PyObject *map, Py_ssize_t nmap, PyObject *dict, PyObject **values,
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000790 int deref)
Jeremy Hylton220ae7c2001-03-21 16:43:47 +0000791{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000792 Py_ssize_t j;
793 assert(PyTuple_Check(map));
794 assert(PyDict_Check(dict));
795 assert(PyTuple_Size(map) >= nmap);
796 for (j = nmap; --j >= 0; ) {
797 PyObject *key = PyTuple_GET_ITEM(map, j);
798 PyObject *value = values[j];
799 assert(PyString_Check(key));
800 if (deref) {
801 assert(PyCell_Check(value));
802 value = PyCell_GET(value);
803 }
804 if (value == NULL) {
805 if (PyObject_DelItem(dict, key) != 0)
806 PyErr_Clear();
807 }
808 else {
809 if (PyObject_SetItem(dict, key, value) != 0)
810 PyErr_Clear();
811 }
812 }
Jeremy Hylton220ae7c2001-03-21 16:43:47 +0000813}
814
Jeremy Hylton759410b2007-02-26 18:41:18 +0000815/* Copy values from the "locals" dict into the fast locals.
816
817 dict is an input argument containing string keys representing
818 variables names and arbitrary PyObject* as values.
819
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000820 map and values are input arguments. map is a tuple of strings.
Jeremy Hylton759410b2007-02-26 18:41:18 +0000821 values is an array of PyObject*. At index i, map[i] is the name of
822 the variable with value values[i]. The function copies the first
823 nmap variable from map/values into dict. If values[i] is NULL,
824 the variable is deleted from dict.
825
826 If deref is true, then the values being copied are cell variables
827 and the value is extracted from the cell variable before being put
828 in dict. If clear is true, then variables in map but not in dict
829 are set to NULL in map; if clear is false, variables missing in
830 dict are ignored.
831
832 Exceptions raised while modifying the dict are silently ignored,
833 because there is no good way to report them.
834*/
835
Guido van Rossum6b356e72001-04-14 17:55:41 +0000836static void
Martin v. Löwis18e16552006-02-15 17:27:45 +0000837dict_to_map(PyObject *map, Py_ssize_t nmap, PyObject *dict, PyObject **values,
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000838 int deref, int clear)
Jeremy Hylton220ae7c2001-03-21 16:43:47 +0000839{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000840 Py_ssize_t j;
841 assert(PyTuple_Check(map));
842 assert(PyDict_Check(dict));
843 assert(PyTuple_Size(map) >= nmap);
844 for (j = nmap; --j >= 0; ) {
845 PyObject *key = PyTuple_GET_ITEM(map, j);
846 PyObject *value = PyObject_GetItem(dict, key);
847 assert(PyString_Check(key));
848 /* We only care about NULLs if clear is true. */
849 if (value == NULL) {
850 PyErr_Clear();
851 if (!clear)
852 continue;
853 }
854 if (deref) {
855 assert(PyCell_Check(values[j]));
856 if (PyCell_GET(values[j]) != value) {
857 if (PyCell_Set(values[j], value) < 0)
858 PyErr_Clear();
859 }
860 } else if (values[j] != value) {
861 Py_XINCREF(value);
Serhiy Storchaka5951f232015-12-24 10:35:35 +0200862 Py_SETREF(values[j], value);
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000863 }
864 Py_XDECREF(value);
865 }
Jeremy Hylton220ae7c2001-03-21 16:43:47 +0000866}
Jeremy Hylton2b724da2001-01-29 22:51:52 +0000867
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000868void
Fred Drake1b190b42000-07-09 05:40:56 +0000869PyFrame_FastToLocals(PyFrameObject *f)
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000870{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000871 /* Merge fast locals into f->f_locals */
872 PyObject *locals, *map;
873 PyObject **fast;
874 PyObject *error_type, *error_value, *error_traceback;
875 PyCodeObject *co;
876 Py_ssize_t j;
877 int ncells, nfreevars;
878 if (f == NULL)
879 return;
880 locals = f->f_locals;
881 if (locals == NULL) {
882 locals = f->f_locals = PyDict_New();
883 if (locals == NULL) {
884 PyErr_Clear(); /* Can't report it :-( */
885 return;
886 }
887 }
888 co = f->f_code;
889 map = co->co_varnames;
890 if (!PyTuple_Check(map))
891 return;
892 PyErr_Fetch(&error_type, &error_value, &error_traceback);
893 fast = f->f_localsplus;
894 j = PyTuple_GET_SIZE(map);
895 if (j > co->co_nlocals)
896 j = co->co_nlocals;
897 if (co->co_nlocals)
898 map_to_dict(map, j, locals, fast, 0);
899 ncells = PyTuple_GET_SIZE(co->co_cellvars);
900 nfreevars = PyTuple_GET_SIZE(co->co_freevars);
901 if (ncells || nfreevars) {
902 map_to_dict(co->co_cellvars, ncells,
903 locals, fast + co->co_nlocals, 1);
904 /* If the namespace is unoptimized, then one of the
905 following cases applies:
906 1. It does not contain free variables, because it
907 uses import * or is a top-level namespace.
908 2. It is a class namespace.
909 We don't want to accidentally copy free variables
910 into the locals dict used by the class.
911 */
912 if (co->co_flags & CO_OPTIMIZED) {
913 map_to_dict(co->co_freevars, nfreevars,
914 locals, fast + co->co_nlocals + ncells, 1);
915 }
916 }
917 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000918}
919
920void
Fred Drake1b190b42000-07-09 05:40:56 +0000921PyFrame_LocalsToFast(PyFrameObject *f, int clear)
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000922{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000923 /* Merge f->f_locals into fast locals */
924 PyObject *locals, *map;
925 PyObject **fast;
926 PyObject *error_type, *error_value, *error_traceback;
927 PyCodeObject *co;
928 Py_ssize_t j;
929 int ncells, nfreevars;
930 if (f == NULL)
931 return;
932 locals = f->f_locals;
933 co = f->f_code;
934 map = co->co_varnames;
935 if (locals == NULL)
936 return;
937 if (!PyTuple_Check(map))
938 return;
939 PyErr_Fetch(&error_type, &error_value, &error_traceback);
940 fast = f->f_localsplus;
941 j = PyTuple_GET_SIZE(map);
942 if (j > co->co_nlocals)
943 j = co->co_nlocals;
944 if (co->co_nlocals)
945 dict_to_map(co->co_varnames, j, locals, fast, 0, clear);
946 ncells = PyTuple_GET_SIZE(co->co_cellvars);
947 nfreevars = PyTuple_GET_SIZE(co->co_freevars);
948 if (ncells || nfreevars) {
949 dict_to_map(co->co_cellvars, ncells,
950 locals, fast + co->co_nlocals, 1, clear);
951 /* Same test as in PyFrame_FastToLocals() above. */
952 if (co->co_flags & CO_OPTIMIZED) {
953 dict_to_map(co->co_freevars, nfreevars,
954 locals, fast + co->co_nlocals + ncells, 1,
955 clear);
956 }
957 }
958 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000959}
Guido van Rossum404b95d1997-08-05 02:09:46 +0000960
961/* Clear out the free list */
Christian Heimes3b718a72008-02-14 12:47:33 +0000962int
963PyFrame_ClearFreeList(void)
Guido van Rossum404b95d1997-08-05 02:09:46 +0000964{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000965 int freelist_size = numfree;
966
967 while (free_list != NULL) {
968 PyFrameObject *f = free_list;
969 free_list = free_list->f_back;
970 PyObject_GC_Del(f);
971 --numfree;
972 }
973 assert(numfree == 0);
974 return freelist_size;
Christian Heimes3b718a72008-02-14 12:47:33 +0000975}
976
977void
978PyFrame_Fini(void)
979{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000980 (void)PyFrame_ClearFreeList();
981 Py_XDECREF(builtin_object);
982 builtin_object = NULL;
Guido van Rossum404b95d1997-08-05 02:09:46 +0000983}