blob: 1ea586feea1c58a9b6e2bc3f6f30832071d61d2b [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[] = {
Guido van Rossum1d5735e1994-08-30 08:27:36 +000018 {"f_back", T_OBJECT, OFF(f_back), RO},
19 {"f_code", T_OBJECT, OFF(f_code), RO},
Guido van Rossumc1134821995-01-10 10:39:16 +000020 {"f_builtins", T_OBJECT, OFF(f_builtins),RO},
Guido van Rossum1d5735e1994-08-30 08:27:36 +000021 {"f_globals", T_OBJECT, OFF(f_globals), RO},
Guido van Rossum1d5735e1994-08-30 08:27:36 +000022 {"f_lasti", T_INT, OFF(f_lasti), RO},
Guido van Rossum3f5da241990-12-20 15:06:42 +000023 {NULL} /* Sentinel */
24};
25
Benjamin Petersonf09925d2008-12-22 20:16:25 +000026#define WARN_GET_SET(NAME) \
27static PyObject * frame_get_ ## NAME(PyFrameObject *f) { \
28 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; \
35} \
36static int frame_set_ ## NAME(PyFrameObject *f, PyObject *new) { \
37 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; \
47}
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{
Tim Peters6d6c1a32001-08-02 04:15:00 +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
Michael W. Hudsondd32a912002-08-15 14:59:02 +000063static PyObject *
64frame_getlineno(PyFrameObject *f, void *closure)
65{
66 int lineno;
67
Michael W. Hudson02ff6a92002-09-11 15:36:32 +000068 if (f->f_trace)
69 lineno = f->f_lineno;
70 else
71 lineno = PyCode_Addr2Line(f->f_code, f->f_lasti);
Michael W. Hudsondd32a912002-08-15 14:59:02 +000072
73 return PyInt_FromLong(lineno);
74}
75
Michael W. Hudsoncfd38842002-12-17 16:15:34 +000076/* Setter for f_lineno - you can set f_lineno from within a trace function in
Jeremy Hylton18623e22007-02-27 16:00:06 +000077 * order to jump to a given line of code, subject to some restrictions. Most
Michael W. Hudsoncfd38842002-12-17 16:15:34 +000078 * lines are OK to jump to because they don't make any assumptions about the
79 * state of the stack (obvious because you could remove the line and the code
80 * would still work without any stack errors), but there are some constructs
81 * that limit jumping:
82 *
83 * o Lines with an 'except' statement on them can't be jumped to, because
84 * they expect an exception to be on the top of the stack.
85 * o Lines that live in a 'finally' block can't be jumped from or to, since
86 * the END_FINALLY expects to clean up the stack after the 'try' block.
87 * o 'try'/'for'/'while' blocks can't be jumped into because the blockstack
88 * needs to be set up before their code runs, and for 'for' loops the
89 * iterator needs to be on the stack.
90 */
91static int
92frame_setlineno(PyFrameObject *f, PyObject* p_new_lineno)
93{
94 int new_lineno = 0; /* The new value of f_lineno */
95 int new_lasti = 0; /* The new value of f_lasti */
96 int new_iblock = 0; /* The new value of f_iblock */
Kristján Valur Jónsson2f2f5792007-04-13 22:07:33 +000097 unsigned char *code = NULL; /* The bytecode for the frame... */
Martin v. Löwis18e16552006-02-15 17:27:45 +000098 Py_ssize_t code_len = 0; /* ...and its length */
Michael W. Hudsoncfd38842002-12-17 16:15:34 +000099 char *lnotab = NULL; /* Iterating over co_lnotab */
Martin v. Löwis18e16552006-02-15 17:27:45 +0000100 Py_ssize_t lnotab_len = 0; /* (ditto) */
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000101 int offset = 0; /* (ditto) */
102 int line = 0; /* (ditto) */
103 int addr = 0; /* (ditto) */
104 int min_addr = 0; /* Scanning the SETUPs and POPs */
105 int max_addr = 0; /* (ditto) */
106 int delta_iblock = 0; /* (ditto) */
107 int min_delta_iblock = 0; /* (ditto) */
108 int min_iblock = 0; /* (ditto) */
109 int f_lasti_setup_addr = 0; /* Policing no-jump-into-finally */
110 int new_lasti_setup_addr = 0; /* (ditto) */
111 int blockstack[CO_MAXBLOCKS]; /* Walking the 'finally' blocks */
112 int in_finally[CO_MAXBLOCKS]; /* (ditto) */
113 int blockstack_top = 0; /* (ditto) */
Kristján Valur Jónsson2f2f5792007-04-13 22:07:33 +0000114 unsigned char setup_op = 0; /* (ditto) */
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000115
116 /* f_lineno must be an integer. */
117 if (!PyInt_Check(p_new_lineno)) {
118 PyErr_SetString(PyExc_ValueError,
119 "lineno must be an integer");
120 return -1;
121 }
122
123 /* You can only do this from within a trace function, not via
124 * _getframe or similar hackery. */
125 if (!f->f_trace)
126 {
127 PyErr_Format(PyExc_ValueError,
128 "f_lineno can only be set by a trace function");
129 return -1;
130 }
131
132 /* Fail if the line comes before the start of the code block. */
133 new_lineno = (int) PyInt_AsLong(p_new_lineno);
134 if (new_lineno < f->f_code->co_firstlineno) {
135 PyErr_Format(PyExc_ValueError,
136 "line %d comes before the current code block",
137 new_lineno);
138 return -1;
139 }
140
141 /* Find the bytecode offset for the start of the given line, or the
142 * first code-owning line after it. */
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000143 PyString_AsStringAndSize(f->f_code->co_lnotab, &lnotab, &lnotab_len);
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000144 addr = 0;
145 line = f->f_code->co_firstlineno;
146 new_lasti = -1;
147 for (offset = 0; offset < lnotab_len; offset += 2) {
148 addr += lnotab[offset];
149 line += lnotab[offset+1];
150 if (line >= new_lineno) {
151 new_lasti = addr;
152 new_lineno = line;
153 break;
154 }
155 }
156
157 /* If we didn't reach the requested line, return an error. */
158 if (new_lasti == -1) {
159 PyErr_Format(PyExc_ValueError,
160 "line %d comes after the current code block",
161 new_lineno);
162 return -1;
163 }
164
165 /* We're now ready to look at the bytecode. */
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000166 PyString_AsStringAndSize(f->f_code->co_code, (char **)&code, &code_len);
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000167 min_addr = MIN(new_lasti, f->f_lasti);
168 max_addr = MAX(new_lasti, f->f_lasti);
169
170 /* You can't jump onto a line with an 'except' statement on it -
171 * they expect to have an exception on the top of the stack, which
172 * won't be true if you jump to them. They always start with code
173 * that either pops the exception using POP_TOP (plain 'except:'
174 * lines do this) or duplicates the exception on the stack using
175 * DUP_TOP (if there's an exception type specified). See compile.c,
176 * 'com_try_except' for the full details. There aren't any other
177 * cases (AFAIK) where a line's code can start with DUP_TOP or
178 * POP_TOP, but if any ever appear, they'll be subject to the same
179 * restriction (but with a different error message). */
180 if (code[new_lasti] == DUP_TOP || code[new_lasti] == POP_TOP) {
181 PyErr_SetString(PyExc_ValueError,
182 "can't jump to 'except' line as there's no exception");
183 return -1;
184 }
185
186 /* You can't jump into or out of a 'finally' block because the 'try'
187 * block leaves something on the stack for the END_FINALLY to clean
Jeremy Hylton18623e22007-02-27 16:00:06 +0000188 * up. So we walk the bytecode, maintaining a simulated blockstack.
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000189 * When we reach the old or new address and it's in a 'finally' block
190 * we note the address of the corresponding SETUP_FINALLY. The jump
191 * is only legal if neither address is in a 'finally' block or
192 * they're both in the same one. 'blockstack' is a stack of the
193 * bytecode addresses of the SETUP_X opcodes, and 'in_finally' tracks
194 * whether we're in a 'finally' block at each blockstack level. */
195 f_lasti_setup_addr = -1;
196 new_lasti_setup_addr = -1;
197 memset(blockstack, '\0', sizeof(blockstack));
198 memset(in_finally, '\0', sizeof(in_finally));
199 blockstack_top = 0;
200 for (addr = 0; addr < code_len; addr++) {
201 unsigned char op = code[addr];
202 switch (op) {
203 case SETUP_LOOP:
204 case SETUP_EXCEPT:
205 case SETUP_FINALLY:
206 blockstack[blockstack_top++] = addr;
207 in_finally[blockstack_top-1] = 0;
208 break;
209
210 case POP_BLOCK:
Neal Norwitzee65e222002-12-19 18:16:57 +0000211 assert(blockstack_top > 0);
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000212 setup_op = code[blockstack[blockstack_top-1]];
213 if (setup_op == SETUP_FINALLY) {
214 in_finally[blockstack_top-1] = 1;
215 }
216 else {
217 blockstack_top--;
218 }
219 break;
220
221 case END_FINALLY:
222 /* Ignore END_FINALLYs for SETUP_EXCEPTs - they exist
223 * in the bytecode but don't correspond to an actual
Neal Norwitzee65e222002-12-19 18:16:57 +0000224 * 'finally' block. (If blockstack_top is 0, we must
225 * be seeing such an END_FINALLY.) */
226 if (blockstack_top > 0) {
227 setup_op = code[blockstack[blockstack_top-1]];
228 if (setup_op == SETUP_FINALLY) {
229 blockstack_top--;
230 }
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000231 }
232 break;
233 }
234
235 /* For the addresses we're interested in, see whether they're
236 * within a 'finally' block and if so, remember the address
237 * of the SETUP_FINALLY. */
238 if (addr == new_lasti || addr == f->f_lasti) {
239 int i = 0;
240 int setup_addr = -1;
241 for (i = blockstack_top-1; i >= 0; i--) {
242 if (in_finally[i]) {
243 setup_addr = blockstack[i];
244 break;
245 }
246 }
247
248 if (setup_addr != -1) {
249 if (addr == new_lasti) {
250 new_lasti_setup_addr = setup_addr;
251 }
252
253 if (addr == f->f_lasti) {
254 f_lasti_setup_addr = setup_addr;
255 }
256 }
257 }
258
259 if (op >= HAVE_ARGUMENT) {
260 addr += 2;
261 }
262 }
263
Neal Norwitzee65e222002-12-19 18:16:57 +0000264 /* Verify that the blockstack tracking code didn't get lost. */
265 assert(blockstack_top == 0);
266
267 /* After all that, are we jumping into / out of a 'finally' block? */
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000268 if (new_lasti_setup_addr != f_lasti_setup_addr) {
269 PyErr_SetString(PyExc_ValueError,
270 "can't jump into or out of a 'finally' block");
271 return -1;
272 }
273
274
275 /* Police block-jumping (you can't jump into the middle of a block)
276 * and ensure that the blockstack finishes up in a sensible state (by
277 * popping any blocks we're jumping out of). We look at all the
278 * blockstack operations between the current position and the new
279 * one, and keep track of how many blocks we drop out of on the way.
280 * By also keeping track of the lowest blockstack position we see, we
281 * can tell whether the jump goes into any blocks without coming out
282 * again - in that case we raise an exception below. */
283 delta_iblock = 0;
284 for (addr = min_addr; addr < max_addr; addr++) {
285 unsigned char op = code[addr];
286 switch (op) {
287 case SETUP_LOOP:
288 case SETUP_EXCEPT:
289 case SETUP_FINALLY:
290 delta_iblock++;
291 break;
292
293 case POP_BLOCK:
294 delta_iblock--;
295 break;
296 }
297
298 min_delta_iblock = MIN(min_delta_iblock, delta_iblock);
299
300 if (op >= HAVE_ARGUMENT) {
301 addr += 2;
302 }
303 }
304
305 /* Derive the absolute iblock values from the deltas. */
306 min_iblock = f->f_iblock + min_delta_iblock;
307 if (new_lasti > f->f_lasti) {
308 /* Forwards jump. */
309 new_iblock = f->f_iblock + delta_iblock;
310 }
311 else {
312 /* Backwards jump. */
313 new_iblock = f->f_iblock - delta_iblock;
314 }
315
316 /* Are we jumping into a block? */
317 if (new_iblock > min_iblock) {
318 PyErr_SetString(PyExc_ValueError,
319 "can't jump into the middle of a block");
320 return -1;
321 }
322
323 /* Pop any blocks that we're jumping out of. */
324 while (f->f_iblock > new_iblock) {
325 PyTryBlock *b = &f->f_blockstack[--f->f_iblock];
326 while ((f->f_stacktop - f->f_valuestack) > b->b_level) {
327 PyObject *v = (*--f->f_stacktop);
328 Py_DECREF(v);
329 }
330 }
331
332 /* Finally set the new f_lineno and f_lasti and return OK. */
333 f->f_lineno = new_lineno;
334 f->f_lasti = new_lasti;
335 return 0;
336}
337
Michael W. Hudson02ff6a92002-09-11 15:36:32 +0000338static PyObject *
339frame_gettrace(PyFrameObject *f, void *closure)
340{
341 PyObject* trace = f->f_trace;
342
343 if (trace == NULL)
344 trace = Py_None;
345
346 Py_INCREF(trace);
347
348 return trace;
349}
350
351static int
352frame_settrace(PyFrameObject *f, PyObject* v, void *closure)
353{
354 /* We rely on f_lineno being accurate when f_trace is set. */
355
356 PyObject* old_value = f->f_trace;
357
358 Py_XINCREF(v);
359 f->f_trace = v;
Tim Petersa13131c2006-04-15 03:15:24 +0000360
Michael W. Hudson02ff6a92002-09-11 15:36:32 +0000361 if (v != NULL)
362 f->f_lineno = PyCode_Addr2Line(f->f_code, f->f_lasti);
363
364 Py_XDECREF(old_value);
365
366 return 0;
367}
368
Neal Norwitzb9845e72006-06-12 02:11:18 +0000369static PyObject *
370frame_getrestricted(PyFrameObject *f, void *closure)
371{
372 return PyBool_FromLong(PyFrame_IsRestricted(f));
373}
374
Guido van Rossum32d34c82001-09-20 21:45:26 +0000375static PyGetSetDef frame_getsetlist[] = {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000376 {"f_locals", (getter)frame_getlocals, NULL, NULL},
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000377 {"f_lineno", (getter)frame_getlineno,
378 (setter)frame_setlineno, NULL},
Michael W. Hudson02ff6a92002-09-11 15:36:32 +0000379 {"f_trace", (getter)frame_gettrace, (setter)frame_settrace, NULL},
Neal Norwitzb9845e72006-06-12 02:11:18 +0000380 {"f_restricted",(getter)frame_getrestricted,NULL, NULL},
Benjamin Petersonf09925d2008-12-22 20:16:25 +0000381 {"f_exc_traceback", (getter)frame_get_f_exc_traceback,
382 (setter)frame_set_f_exc_traceback, NULL},
383 {"f_exc_type", (getter)frame_get_f_exc_type,
384 (setter)frame_set_f_exc_type, NULL},
385 {"f_exc_value", (getter)frame_get_f_exc_value,
386 (setter)frame_set_f_exc_value, NULL},
Tim Peters6d6c1a32001-08-02 04:15:00 +0000387 {0}
388};
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000389
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000390/* Stack frames are allocated and deallocated at a considerable rate.
Richard Jones7c88dcc2006-05-23 10:37:38 +0000391 In an attempt to improve the speed of function calls, we:
392
393 1. Hold a single "zombie" frame on each code object. This retains
394 the allocated and initialised frame object from an invocation of
395 the code object. The zombie is reanimated the next time we need a
396 frame object for that code object. Doing this saves the malloc/
397 realloc required when using a free_list frame that isn't the
398 correct size. It also saves some field initialisation.
399
400 In zombie mode, no field of PyFrameObject holds a reference, but
401 the following fields are still valid:
402
Richard Jonesa3727112006-05-23 18:32:11 +0000403 * ob_type, ob_size, f_code, f_valuestack;
Richard Jones7c88dcc2006-05-23 10:37:38 +0000404
405 * f_locals, f_trace,
406 f_exc_type, f_exc_value, f_exc_traceback are NULL;
407
408 * f_localsplus does not require re-allocation and
409 the local variables in f_localsplus are NULL.
410
411 2. We also maintain a separate free list of stack frames (just like
412 integers are allocated in a special way -- see intobject.c). When
413 a stack frame is on the free list, only the following members have
414 a meaning:
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000415 ob_type == &Frametype
416 f_back next item on free list, or NULL
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000417 f_stacksize size of value stack
Jeremy Hylton18623e22007-02-27 16:00:06 +0000418 ob_size size of localsplus
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000419 Note that the value and block stacks are preserved -- this can save
420 another malloc() call or two (and two free() calls as well!).
421 Also note that, unlike for integers, each frame object is a
422 malloc'ed object in its own right -- it is only the actual calls to
423 malloc() that we are trying to save here, not the administration.
424 After all, while a typical program may make millions of calls, a
425 call depth of more than 20 or 30 is probably already exceptional
426 unless the program contains run-away recursion. I hope.
Tim Petersb7ba7432002-04-13 05:21:47 +0000427
Christian Heimes5b970ad2008-02-06 13:33:44 +0000428 Later, PyFrame_MAXFREELIST was added to bound the # of frames saved on
Tim Petersb7ba7432002-04-13 05:21:47 +0000429 free_list. Else programs creating lots of cyclic trash involving
430 frames could provoke free_list into growing without bound.
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000431*/
432
Guido van Rossum18752471997-04-29 14:49:28 +0000433static PyFrameObject *free_list = NULL;
Tim Petersb7ba7432002-04-13 05:21:47 +0000434static int numfree = 0; /* number of frames currently in free_list */
Christian Heimes5b970ad2008-02-06 13:33:44 +0000435/* max value for numfree */
436#define PyFrame_MAXFREELIST 200
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000437
Guido van Rossum3f5da241990-12-20 15:06:42 +0000438static void
Fred Drake1b190b42000-07-09 05:40:56 +0000439frame_dealloc(PyFrameObject *f)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000440{
Richard Jones7c88dcc2006-05-23 10:37:38 +0000441 PyObject **p, **valuestack;
442 PyCodeObject *co;
Guido van Rossum7582bfb1997-02-14 16:27:29 +0000443
Jeremy Hylton18623e22007-02-27 16:00:06 +0000444 PyObject_GC_UnTrack(f);
Guido van Rossumd724b232000-03-13 16:01:29 +0000445 Py_TRASHCAN_SAFE_BEGIN(f)
Guido van Rossum7582bfb1997-02-14 16:27:29 +0000446 /* Kill all local variables */
Jeremy Hylton18623e22007-02-27 16:00:06 +0000447 valuestack = f->f_valuestack;
448 for (p = f->f_localsplus; p < valuestack; p++)
449 Py_CLEAR(*p);
Guido van Rossum7582bfb1997-02-14 16:27:29 +0000450
Tim Peters5ca576e2001-06-18 22:08:13 +0000451 /* Free stack */
Tim Peters8c963692001-06-23 05:26:56 +0000452 if (f->f_stacktop != NULL) {
Richard Jones7c88dcc2006-05-23 10:37:38 +0000453 for (p = valuestack; p < f->f_stacktop; p++)
Tim Peters8c963692001-06-23 05:26:56 +0000454 Py_XDECREF(*p);
Tim Peters5ca576e2001-06-18 22:08:13 +0000455 }
Tim Petersa13131c2006-04-15 03:15:24 +0000456
Guido van Rossum18752471997-04-29 14:49:28 +0000457 Py_XDECREF(f->f_back);
Neal Norwitzc91ed402002-12-30 22:29:22 +0000458 Py_DECREF(f->f_builtins);
459 Py_DECREF(f->f_globals);
Richard Jones7c88dcc2006-05-23 10:37:38 +0000460 Py_CLEAR(f->f_locals);
461 Py_CLEAR(f->f_trace);
462 Py_CLEAR(f->f_exc_type);
463 Py_CLEAR(f->f_exc_value);
464 Py_CLEAR(f->f_exc_traceback);
465
Jeremy Hylton18623e22007-02-27 16:00:06 +0000466 co = f->f_code;
467 if (co->co_zombieframe == NULL)
468 co->co_zombieframe = f;
Christian Heimes5b970ad2008-02-06 13:33:44 +0000469 else if (numfree < PyFrame_MAXFREELIST) {
Tim Petersb7ba7432002-04-13 05:21:47 +0000470 ++numfree;
471 f->f_back = free_list;
472 free_list = f;
Jeremy Hylton18623e22007-02-27 16:00:06 +0000473 }
Richard Jones7c88dcc2006-05-23 10:37:38 +0000474 else
Tim Petersb7ba7432002-04-13 05:21:47 +0000475 PyObject_GC_Del(f);
Richard Jones7c88dcc2006-05-23 10:37:38 +0000476
Jeremy Hylton18623e22007-02-27 16:00:06 +0000477 Py_DECREF(co);
Guido van Rossumd724b232000-03-13 16:01:29 +0000478 Py_TRASHCAN_SAFE_END(f)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000479}
480
Neil Schemenauer19cd2922001-07-12 13:27:11 +0000481static int
482frame_traverse(PyFrameObject *f, visitproc visit, void *arg)
483{
484 PyObject **fastlocals, **p;
Tim Petersde2acf62006-04-15 03:22:46 +0000485 int i, slots;
Neil Schemenauer19cd2922001-07-12 13:27:11 +0000486
Tim Petersde2acf62006-04-15 03:22:46 +0000487 Py_VISIT(f->f_back);
488 Py_VISIT(f->f_code);
489 Py_VISIT(f->f_builtins);
490 Py_VISIT(f->f_globals);
491 Py_VISIT(f->f_locals);
492 Py_VISIT(f->f_trace);
493 Py_VISIT(f->f_exc_type);
494 Py_VISIT(f->f_exc_value);
495 Py_VISIT(f->f_exc_traceback);
Neil Schemenauer19cd2922001-07-12 13:27:11 +0000496
497 /* locals */
Richard Jonescebbefc2006-05-23 18:28:17 +0000498 slots = f->f_code->co_nlocals + PyTuple_GET_SIZE(f->f_code->co_cellvars) + PyTuple_GET_SIZE(f->f_code->co_freevars);
Neil Schemenauer19cd2922001-07-12 13:27:11 +0000499 fastlocals = f->f_localsplus;
Tim Petersde2acf62006-04-15 03:22:46 +0000500 for (i = slots; --i >= 0; ++fastlocals)
501 Py_VISIT(*fastlocals);
Neil Schemenauer19cd2922001-07-12 13:27:11 +0000502
503 /* stack */
504 if (f->f_stacktop != NULL) {
505 for (p = f->f_valuestack; p < f->f_stacktop; p++)
Tim Petersde2acf62006-04-15 03:22:46 +0000506 Py_VISIT(*p);
Neil Schemenauer19cd2922001-07-12 13:27:11 +0000507 }
Neil Schemenauer19cd2922001-07-12 13:27:11 +0000508 return 0;
509}
510
511static void
512frame_clear(PyFrameObject *f)
513{
Phillip J. Eby8ebb28d2006-04-15 01:02:17 +0000514 PyObject **fastlocals, **p, **oldtop;
Neil Schemenauer19cd2922001-07-12 13:27:11 +0000515 int i, slots;
516
Tim Petersa13131c2006-04-15 03:15:24 +0000517 /* Before anything else, make sure that this frame is clearly marked
Jeremy Hylton18623e22007-02-27 16:00:06 +0000518 * as being defunct! Else, e.g., a generator reachable from this
519 * frame may also point to this frame, believe itself to still be
520 * active, and try cleaning up this frame again.
521 */
Tim Petersadcd25e2006-04-15 03:30:08 +0000522 oldtop = f->f_stacktop;
Jeremy Hylton18623e22007-02-27 16:00:06 +0000523 f->f_stacktop = NULL;
Phillip J. Eby8ebb28d2006-04-15 01:02:17 +0000524
Tim Petersadcd25e2006-04-15 03:30:08 +0000525 Py_CLEAR(f->f_exc_type);
526 Py_CLEAR(f->f_exc_value);
527 Py_CLEAR(f->f_exc_traceback);
528 Py_CLEAR(f->f_trace);
Neil Schemenauer19cd2922001-07-12 13:27:11 +0000529
530 /* locals */
Richard Jonescebbefc2006-05-23 18:28:17 +0000531 slots = f->f_code->co_nlocals + PyTuple_GET_SIZE(f->f_code->co_cellvars) + PyTuple_GET_SIZE(f->f_code->co_freevars);
Neil Schemenauer19cd2922001-07-12 13:27:11 +0000532 fastlocals = f->f_localsplus;
Tim Petersadcd25e2006-04-15 03:30:08 +0000533 for (i = slots; --i >= 0; ++fastlocals)
Phillip J. Eby8ebb28d2006-04-15 01:02:17 +0000534 Py_CLEAR(*fastlocals);
Neil Schemenauer19cd2922001-07-12 13:27:11 +0000535
536 /* stack */
Phillip J. Eby8ebb28d2006-04-15 01:02:17 +0000537 if (oldtop != NULL) {
Tim Petersadcd25e2006-04-15 03:30:08 +0000538 for (p = f->f_valuestack; p < oldtop; p++)
Phillip J. Eby8ebb28d2006-04-15 01:02:17 +0000539 Py_CLEAR(*p);
Neil Schemenauer19cd2922001-07-12 13:27:11 +0000540 }
541}
542
Robert Schuppenies9be2ec12008-07-10 15:24:04 +0000543static PyObject *
544frame_sizeof(PyFrameObject *f)
545{
546 Py_ssize_t res, extras, ncells, nfrees;
547
548 ncells = PyTuple_GET_SIZE(f->f_code->co_cellvars);
549 nfrees = PyTuple_GET_SIZE(f->f_code->co_freevars);
550 extras = f->f_code->co_stacksize + f->f_code->co_nlocals +
551 ncells + nfrees;
Christian Heimes25584b12008-10-02 18:33:41 +0000552 /* subtract one as it is already included in PyFrameObject */
Robert Schuppenies9be2ec12008-07-10 15:24:04 +0000553 res = sizeof(PyFrameObject) + (extras-1) * sizeof(PyObject *);
554
555 return PyInt_FromSsize_t(res);
556}
557
558PyDoc_STRVAR(sizeof__doc__,
559"F.__sizeof__() -> size of F in memory, in bytes");
560
561static PyMethodDef frame_methods[] = {
562 {"__sizeof__", (PyCFunction)frame_sizeof, METH_NOARGS,
563 sizeof__doc__},
564 {NULL, NULL} /* sentinel */
565};
Neil Schemenauer19cd2922001-07-12 13:27:11 +0000566
Guido van Rossum18752471997-04-29 14:49:28 +0000567PyTypeObject PyFrame_Type = {
Martin v. Löwis68192102007-07-21 06:55:02 +0000568 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000569 "frame",
Neil Schemenauer4f4817f2001-08-29 23:52:17 +0000570 sizeof(PyFrameObject),
571 sizeof(PyObject *),
Jeremy Hylton18623e22007-02-27 16:00:06 +0000572 (destructor)frame_dealloc, /* tp_dealloc */
Neil Schemenauer19cd2922001-07-12 13:27:11 +0000573 0, /* tp_print */
Jeremy Hylton18623e22007-02-27 16:00:06 +0000574 0, /* tp_getattr */
575 0, /* tp_setattr */
Neil Schemenauer19cd2922001-07-12 13:27:11 +0000576 0, /* tp_compare */
577 0, /* tp_repr */
578 0, /* tp_as_number */
579 0, /* tp_as_sequence */
580 0, /* tp_as_mapping */
581 0, /* tp_hash */
582 0, /* tp_call */
583 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000584 PyObject_GenericGetAttr, /* tp_getattro */
585 PyObject_GenericSetAttr, /* tp_setattro */
Neil Schemenauer19cd2922001-07-12 13:27:11 +0000586 0, /* tp_as_buffer */
Neil Schemenauer4f4817f2001-08-29 23:52:17 +0000587 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
Jeremy Hylton18623e22007-02-27 16:00:06 +0000588 0, /* tp_doc */
589 (traverseproc)frame_traverse, /* tp_traverse */
Neil Schemenauer19cd2922001-07-12 13:27:11 +0000590 (inquiry)frame_clear, /* tp_clear */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000591 0, /* tp_richcompare */
592 0, /* tp_weaklistoffset */
593 0, /* tp_iter */
594 0, /* tp_iternext */
Robert Schuppenies9be2ec12008-07-10 15:24:04 +0000595 frame_methods, /* tp_methods */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000596 frame_memberlist, /* tp_members */
597 frame_getsetlist, /* tp_getset */
598 0, /* tp_base */
599 0, /* tp_dict */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000600};
601
Neal Norwitzc91ed402002-12-30 22:29:22 +0000602static PyObject *builtin_object;
603
Neal Norwitzb2501f42002-12-31 03:42:13 +0000604int _PyFrame_Init()
Neal Norwitzc91ed402002-12-30 22:29:22 +0000605{
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000606 builtin_object = PyString_InternFromString("__builtins__");
Neal Norwitzc91ed402002-12-30 22:29:22 +0000607 return (builtin_object != NULL);
608}
609
Guido van Rossum18752471997-04-29 14:49:28 +0000610PyFrameObject *
Tim Petersa13131c2006-04-15 03:15:24 +0000611PyFrame_New(PyThreadState *tstate, PyCodeObject *code, PyObject *globals,
Jeremy Hylton30c9f392001-03-13 01:58:22 +0000612 PyObject *locals)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000613{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000614 PyFrameObject *back = tstate->frame;
Guido van Rossum18752471997-04-29 14:49:28 +0000615 PyFrameObject *f;
616 PyObject *builtins;
Richard Jones7c88dcc2006-05-23 10:37:38 +0000617 Py_ssize_t i;
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000618
Michael W. Hudson69734a52002-08-19 16:54:08 +0000619#ifdef Py_DEBUG
620 if (code == NULL || globals == NULL || !PyDict_Check(globals) ||
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000621 (locals != NULL && !PyMapping_Check(locals))) {
Guido van Rossum18752471997-04-29 14:49:28 +0000622 PyErr_BadInternalCall();
Guido van Rossum3f5da241990-12-20 15:06:42 +0000623 return NULL;
624 }
Michael W. Hudson69734a52002-08-19 16:54:08 +0000625#endif
Guido van Rossumbde6ff71998-02-19 20:48:26 +0000626 if (back == NULL || back->f_globals != globals) {
627 builtins = PyDict_GetItem(globals, builtin_object);
Jeremy Hyltonbd5cbf82003-02-05 22:39:29 +0000628 if (builtins) {
629 if (PyModule_Check(builtins)) {
630 builtins = PyModule_GetDict(builtins);
631 assert(!builtins || PyDict_Check(builtins));
632 }
633 else if (!PyDict_Check(builtins))
634 builtins = NULL;
635 }
636 if (builtins == NULL) {
Jeremy Hylton18623e22007-02-27 16:00:06 +0000637 /* No builtins! Make up a minimal one
Jeremy Hyltonbd5cbf82003-02-05 22:39:29 +0000638 Give them 'None', at least. */
639 builtins = PyDict_New();
Tim Petersa13131c2006-04-15 03:15:24 +0000640 if (builtins == NULL ||
Jeremy Hyltonbd5cbf82003-02-05 22:39:29 +0000641 PyDict_SetItemString(
642 builtins, "None", Py_None) < 0)
643 return NULL;
644 }
645 else
646 Py_INCREF(builtins);
647
Guido van Rossumbde6ff71998-02-19 20:48:26 +0000648 }
649 else {
650 /* If we share the globals, we share the builtins.
651 Save a lookup and a call. */
652 builtins = back->f_builtins;
Jeremy Hyltonbd5cbf82003-02-05 22:39:29 +0000653 assert(builtins != NULL && PyDict_Check(builtins));
654 Py_INCREF(builtins);
Guido van Rossumbde6ff71998-02-19 20:48:26 +0000655 }
Richard Jones7c88dcc2006-05-23 10:37:38 +0000656 if (code->co_zombieframe != NULL) {
Jeremy Hylton18623e22007-02-27 16:00:06 +0000657 f = code->co_zombieframe;
658 code->co_zombieframe = NULL;
659 _Py_NewReference((PyObject *)f);
660 assert(f->f_code == code);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000661 }
Jeremy Hylton18623e22007-02-27 16:00:06 +0000662 else {
663 Py_ssize_t extras, ncells, nfrees;
664 ncells = PyTuple_GET_SIZE(code->co_cellvars);
665 nfrees = PyTuple_GET_SIZE(code->co_freevars);
666 extras = code->co_stacksize + code->co_nlocals + ncells +
667 nfrees;
668 if (free_list == NULL) {
669 f = PyObject_GC_NewVar(PyFrameObject, &PyFrame_Type,
670 extras);
671 if (f == NULL) {
672 Py_DECREF(builtins);
673 return NULL;
674 }
675 }
676 else {
677 assert(numfree > 0);
678 --numfree;
679 f = free_list;
680 free_list = free_list->f_back;
Christian Heimese93237d2007-12-19 02:37:44 +0000681 if (Py_SIZE(f) < extras) {
Jeremy Hylton18623e22007-02-27 16:00:06 +0000682 f = PyObject_GC_Resize(PyFrameObject, f, extras);
683 if (f == NULL) {
684 Py_DECREF(builtins);
685 return NULL;
686 }
687 }
688 _Py_NewReference((PyObject *)f);
689 }
Richard Jones7c88dcc2006-05-23 10:37:38 +0000690
691 f->f_code = code;
Richard Jonesa3727112006-05-23 18:32:11 +0000692 extras = code->co_nlocals + ncells + nfrees;
Richard Jones7c88dcc2006-05-23 10:37:38 +0000693 f->f_valuestack = f->f_localsplus + extras;
694 for (i=0; i<extras; i++)
695 f->f_localsplus[i] = NULL;
696 f->f_locals = NULL;
697 f->f_trace = NULL;
Jeremy Hylton18623e22007-02-27 16:00:06 +0000698 f->f_exc_type = f->f_exc_value = f->f_exc_traceback = NULL;
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000699 }
Neal Norwitz1adbb502006-07-21 05:31:02 +0000700 f->f_stacktop = f->f_valuestack;
Guido van Rossum404b95d1997-08-05 02:09:46 +0000701 f->f_builtins = builtins;
Guido van Rossum18752471997-04-29 14:49:28 +0000702 Py_XINCREF(back);
Guido van Rossum2271bf71995-07-18 14:30:34 +0000703 f->f_back = back;
Guido van Rossum18752471997-04-29 14:49:28 +0000704 Py_INCREF(code);
Guido van Rossum18752471997-04-29 14:49:28 +0000705 Py_INCREF(globals);
Guido van Rossum2271bf71995-07-18 14:30:34 +0000706 f->f_globals = globals;
Jeremy Hyltonbd5cbf82003-02-05 22:39:29 +0000707 /* Most functions have CO_NEWLOCALS and CO_OPTIMIZED set. */
Tim Petersa13131c2006-04-15 03:15:24 +0000708 if ((code->co_flags & (CO_NEWLOCALS | CO_OPTIMIZED)) ==
Jeremy Hyltonbd5cbf82003-02-05 22:39:29 +0000709 (CO_NEWLOCALS | CO_OPTIMIZED))
Richard Jones7c88dcc2006-05-23 10:37:38 +0000710 ; /* f_locals = NULL; will be set by PyFrame_FastToLocals() */
Jeremy Hyltonbd5cbf82003-02-05 22:39:29 +0000711 else if (code->co_flags & CO_NEWLOCALS) {
712 locals = PyDict_New();
713 if (locals == NULL) {
714 Py_DECREF(f);
715 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000716 }
Jeremy Hylton18623e22007-02-27 16:00:06 +0000717 f->f_locals = locals;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000718 }
Guido van Rossum2271bf71995-07-18 14:30:34 +0000719 else {
720 if (locals == NULL)
721 locals = globals;
Guido van Rossum18752471997-04-29 14:49:28 +0000722 Py_INCREF(locals);
Jeremy Hylton18623e22007-02-27 16:00:06 +0000723 f->f_locals = locals;
Guido van Rossum2271bf71995-07-18 14:30:34 +0000724 }
Guido van Rossumeb46d671997-08-02 02:59:08 +0000725 f->f_tstate = tstate;
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000726
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000727 f->f_lasti = -1;
Guido van Rossum747596a1997-01-24 04:00:21 +0000728 f->f_lineno = code->co_firstlineno;
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000729 f->f_iblock = 0;
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000730
Neil Schemenauer4f4817f2001-08-29 23:52:17 +0000731 _PyObject_GC_TRACK(f);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000732 return f;
733}
734
Guido van Rossum3f5da241990-12-20 15:06:42 +0000735/* Block management */
736
737void
Fred Drake1b190b42000-07-09 05:40:56 +0000738PyFrame_BlockSetup(PyFrameObject *f, int type, int handler, int level)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000739{
Guido van Rossum18752471997-04-29 14:49:28 +0000740 PyTryBlock *b;
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000741 if (f->f_iblock >= CO_MAXBLOCKS)
Guido van Rossum18752471997-04-29 14:49:28 +0000742 Py_FatalError("XXX block stack overflow");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000743 b = &f->f_blockstack[f->f_iblock++];
744 b->b_type = type;
745 b->b_level = level;
746 b->b_handler = handler;
747}
748
Guido van Rossum18752471997-04-29 14:49:28 +0000749PyTryBlock *
Fred Drake1b190b42000-07-09 05:40:56 +0000750PyFrame_BlockPop(PyFrameObject *f)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000751{
Guido van Rossum18752471997-04-29 14:49:28 +0000752 PyTryBlock *b;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000753 if (f->f_iblock <= 0)
Guido van Rossum18752471997-04-29 14:49:28 +0000754 Py_FatalError("XXX block stack underflow");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000755 b = &f->f_blockstack[--f->f_iblock];
756 return b;
757}
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000758
Jeremy Hylton759410b2007-02-26 18:41:18 +0000759/* Convert between "fast" version of locals and dictionary version.
760
Jeremy Hylton18623e22007-02-27 16:00:06 +0000761 map and values are input arguments. map is a tuple of strings.
Jeremy Hylton759410b2007-02-26 18:41:18 +0000762 values is an array of PyObject*. At index i, map[i] is the name of
763 the variable with value values[i]. The function copies the first
764 nmap variable from map/values into dict. If values[i] is NULL,
765 the variable is deleted from dict.
766
767 If deref is true, then the values being copied are cell variables
768 and the value is extracted from the cell variable before being put
769 in dict.
770
771 Exceptions raised while modifying the dict are silently ignored,
772 because there is no good way to report them.
773 */
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000774
Guido van Rossumf68d8e52001-04-14 17:55:09 +0000775static void
Martin v. Löwis18e16552006-02-15 17:27:45 +0000776map_to_dict(PyObject *map, Py_ssize_t nmap, PyObject *dict, PyObject **values,
Jeremy Hylton759410b2007-02-26 18:41:18 +0000777 int deref)
Jeremy Hylton220ae7c2001-03-21 16:43:47 +0000778{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000779 Py_ssize_t j;
Jeremy Hylton18623e22007-02-27 16:00:06 +0000780 assert(PyTuple_Check(map));
781 assert(PyDict_Check(dict));
782 assert(PyTuple_Size(map) >= nmap);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +0000783 for (j = nmap; --j >= 0; ) {
Jeremy Hylton1a48ca82001-12-06 15:48:16 +0000784 PyObject *key = PyTuple_GET_ITEM(map, j);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +0000785 PyObject *value = values[j];
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000786 assert(PyString_Check(key));
Jeremy Hylton759410b2007-02-26 18:41:18 +0000787 if (deref) {
Jeremy Hylton18623e22007-02-27 16:00:06 +0000788 assert(PyCell_Check(value));
Jeremy Hylton220ae7c2001-03-21 16:43:47 +0000789 value = PyCell_GET(value);
Jeremy Hylton18623e22007-02-27 16:00:06 +0000790 }
Jeremy Hylton220ae7c2001-03-21 16:43:47 +0000791 if (value == NULL) {
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000792 if (PyObject_DelItem(dict, key) != 0)
Jeremy Hylton220ae7c2001-03-21 16:43:47 +0000793 PyErr_Clear();
794 }
795 else {
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000796 if (PyObject_SetItem(dict, key, value) != 0)
Jeremy Hylton220ae7c2001-03-21 16:43:47 +0000797 PyErr_Clear();
798 }
799 }
800}
801
Jeremy Hylton759410b2007-02-26 18:41:18 +0000802/* Copy values from the "locals" dict into the fast locals.
803
804 dict is an input argument containing string keys representing
805 variables names and arbitrary PyObject* as values.
806
Jeremy Hylton18623e22007-02-27 16:00:06 +0000807 map and values are input arguments. map is a tuple of strings.
Jeremy Hylton759410b2007-02-26 18:41:18 +0000808 values is an array of PyObject*. At index i, map[i] is the name of
809 the variable with value values[i]. The function copies the first
810 nmap variable from map/values into dict. If values[i] is NULL,
811 the variable is deleted from dict.
812
813 If deref is true, then the values being copied are cell variables
814 and the value is extracted from the cell variable before being put
815 in dict. If clear is true, then variables in map but not in dict
816 are set to NULL in map; if clear is false, variables missing in
817 dict are ignored.
818
819 Exceptions raised while modifying the dict are silently ignored,
820 because there is no good way to report them.
821*/
822
Guido van Rossum6b356e72001-04-14 17:55:41 +0000823static void
Martin v. Löwis18e16552006-02-15 17:27:45 +0000824dict_to_map(PyObject *map, Py_ssize_t nmap, PyObject *dict, PyObject **values,
Jeremy Hylton759410b2007-02-26 18:41:18 +0000825 int deref, int clear)
Jeremy Hylton220ae7c2001-03-21 16:43:47 +0000826{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000827 Py_ssize_t j;
Jeremy Hylton18623e22007-02-27 16:00:06 +0000828 assert(PyTuple_Check(map));
829 assert(PyDict_Check(dict));
830 assert(PyTuple_Size(map) >= nmap);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +0000831 for (j = nmap; --j >= 0; ) {
Jeremy Hylton1a48ca82001-12-06 15:48:16 +0000832 PyObject *key = PyTuple_GET_ITEM(map, j);
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000833 PyObject *value = PyObject_GetItem(dict, key);
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000834 assert(PyString_Check(key));
Jeremy Hylton18623e22007-02-27 16:00:06 +0000835 /* We only care about NULLs if clear is true. */
Jeremy Hylton759410b2007-02-26 18:41:18 +0000836 if (value == NULL) {
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000837 PyErr_Clear();
Jeremy Hylton18623e22007-02-27 16:00:06 +0000838 if (!clear)
839 continue;
840 }
Jeremy Hylton220ae7c2001-03-21 16:43:47 +0000841 if (deref) {
Jeremy Hylton18623e22007-02-27 16:00:06 +0000842 assert(PyCell_Check(values[j]));
843 if (PyCell_GET(values[j]) != value) {
844 if (PyCell_Set(values[j], value) < 0)
845 PyErr_Clear();
846 }
Jeremy Hylton759410b2007-02-26 18:41:18 +0000847 } else if (values[j] != value) {
Jeremy Hylton18623e22007-02-27 16:00:06 +0000848 Py_XINCREF(value);
849 Py_XDECREF(values[j]);
850 values[j] = value;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +0000851 }
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000852 Py_XDECREF(value);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +0000853 }
854}
Jeremy Hylton2b724da2001-01-29 22:51:52 +0000855
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000856void
Fred Drake1b190b42000-07-09 05:40:56 +0000857PyFrame_FastToLocals(PyFrameObject *f)
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000858{
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000859 /* Merge fast locals into f->f_locals */
Guido van Rossum18752471997-04-29 14:49:28 +0000860 PyObject *locals, *map;
861 PyObject **fast;
862 PyObject *error_type, *error_value, *error_traceback;
Richard Jonescebbefc2006-05-23 18:28:17 +0000863 PyCodeObject *co;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000864 Py_ssize_t j;
Jeremy Hylton18623e22007-02-27 16:00:06 +0000865 int ncells, nfreevars;
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000866 if (f == NULL)
867 return;
Guido van Rossum2271bf71995-07-18 14:30:34 +0000868 locals = f->f_locals;
869 if (locals == NULL) {
Guido van Rossum18752471997-04-29 14:49:28 +0000870 locals = f->f_locals = PyDict_New();
Guido van Rossum2271bf71995-07-18 14:30:34 +0000871 if (locals == NULL) {
Guido van Rossum18752471997-04-29 14:49:28 +0000872 PyErr_Clear(); /* Can't report it :-( */
Guido van Rossum2271bf71995-07-18 14:30:34 +0000873 return;
874 }
875 }
Richard Jonescebbefc2006-05-23 18:28:17 +0000876 co = f->f_code;
877 map = co->co_varnames;
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000878 if (!PyTuple_Check(map))
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000879 return;
Guido van Rossum18752471997-04-29 14:49:28 +0000880 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000881 fast = f->f_localsplus;
Neal Norwitz2aa9a5d2006-03-20 01:53:23 +0000882 j = PyTuple_GET_SIZE(map);
Richard Jonescebbefc2006-05-23 18:28:17 +0000883 if (j > co->co_nlocals)
884 j = co->co_nlocals;
885 if (co->co_nlocals)
Jeremy Hylton174d2762003-10-21 18:10:28 +0000886 map_to_dict(map, j, locals, fast, 0);
Richard Jonescebbefc2006-05-23 18:28:17 +0000887 ncells = PyTuple_GET_SIZE(co->co_cellvars);
888 nfreevars = PyTuple_GET_SIZE(co->co_freevars);
889 if (ncells || nfreevars) {
890 map_to_dict(co->co_cellvars, ncells,
891 locals, fast + co->co_nlocals, 1);
Jeremy Hylton18623e22007-02-27 16:00:06 +0000892 /* If the namespace is unoptimized, then one of the
893 following cases applies:
894 1. It does not contain free variables, because it
895 uses import * or is a top-level namespace.
896 2. It is a class namespace.
897 We don't want to accidentally copy free variables
898 into the locals dict used by the class.
899 */
900 if (co->co_flags & CO_OPTIMIZED) {
901 map_to_dict(co->co_freevars, nfreevars,
902 locals, fast + co->co_nlocals + ncells, 1);
903 }
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000904 }
Guido van Rossum18752471997-04-29 14:49:28 +0000905 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000906}
907
908void
Fred Drake1b190b42000-07-09 05:40:56 +0000909PyFrame_LocalsToFast(PyFrameObject *f, int clear)
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000910{
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000911 /* Merge f->f_locals into fast locals */
Guido van Rossum18752471997-04-29 14:49:28 +0000912 PyObject *locals, *map;
913 PyObject **fast;
914 PyObject *error_type, *error_value, *error_traceback;
Richard Jonescebbefc2006-05-23 18:28:17 +0000915 PyCodeObject *co;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000916 Py_ssize_t j;
Richard Jonescebbefc2006-05-23 18:28:17 +0000917 int ncells, nfreevars;
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000918 if (f == NULL)
919 return;
920 locals = f->f_locals;
Richard Jonescebbefc2006-05-23 18:28:17 +0000921 co = f->f_code;
922 map = co->co_varnames;
Jeremy Hylton24ea8d32002-04-20 04:46:55 +0000923 if (locals == NULL)
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000924 return;
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000925 if (!PyTuple_Check(map))
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000926 return;
Guido van Rossum18752471997-04-29 14:49:28 +0000927 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000928 fast = f->f_localsplus;
Neal Norwitz2aa9a5d2006-03-20 01:53:23 +0000929 j = PyTuple_GET_SIZE(map);
Richard Jonescebbefc2006-05-23 18:28:17 +0000930 if (j > co->co_nlocals)
931 j = co->co_nlocals;
932 if (co->co_nlocals)
933 dict_to_map(co->co_varnames, j, locals, fast, 0, clear);
934 ncells = PyTuple_GET_SIZE(co->co_cellvars);
935 nfreevars = PyTuple_GET_SIZE(co->co_freevars);
936 if (ncells || nfreevars) {
937 dict_to_map(co->co_cellvars, ncells,
938 locals, fast + co->co_nlocals, 1, clear);
Amaury Forgeot d'Arce4921fe2008-07-21 22:00:38 +0000939 /* Same test as in PyFrame_FastToLocals() above. */
940 if (co->co_flags & CO_OPTIMIZED) {
941 dict_to_map(co->co_freevars, nfreevars,
942 locals, fast + co->co_nlocals + ncells, 1,
943 clear);
944 }
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000945 }
Guido van Rossum18752471997-04-29 14:49:28 +0000946 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000947}
Guido van Rossum404b95d1997-08-05 02:09:46 +0000948
949/* Clear out the free list */
Christian Heimes3b718a72008-02-14 12:47:33 +0000950int
951PyFrame_ClearFreeList(void)
Guido van Rossum404b95d1997-08-05 02:09:46 +0000952{
Christian Heimes3b718a72008-02-14 12:47:33 +0000953 int freelist_size = numfree;
954
Guido van Rossum404b95d1997-08-05 02:09:46 +0000955 while (free_list != NULL) {
956 PyFrameObject *f = free_list;
957 free_list = free_list->f_back;
Neil Schemenauer4f4817f2001-08-29 23:52:17 +0000958 PyObject_GC_Del(f);
Tim Petersb7ba7432002-04-13 05:21:47 +0000959 --numfree;
Guido van Rossum404b95d1997-08-05 02:09:46 +0000960 }
Tim Petersb7ba7432002-04-13 05:21:47 +0000961 assert(numfree == 0);
Christian Heimes3b718a72008-02-14 12:47:33 +0000962 return freelist_size;
963}
964
965void
966PyFrame_Fini(void)
967{
968 (void)PyFrame_ClearFreeList();
Neal Norwitzc91ed402002-12-30 22:29:22 +0000969 Py_XDECREF(builtin_object);
970 builtin_object = NULL;
Guido van Rossum404b95d1997-08-05 02:09:46 +0000971}