blob: fcb5e4e32c4fcc70573b779f52278bad19987fd9 [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 Rossumc1134821995-01-10 10:39:16 +000023 {"f_restricted",T_INT, OFF(f_restricted),RO},
Guido van Rossuma027efa1997-05-05 20:56:21 +000024 {"f_exc_type", T_OBJECT, OFF(f_exc_type)},
25 {"f_exc_value", T_OBJECT, OFF(f_exc_value)},
26 {"f_exc_traceback", T_OBJECT, OFF(f_exc_traceback)},
Guido van Rossum3f5da241990-12-20 15:06:42 +000027 {NULL} /* Sentinel */
28};
29
Guido van Rossum18752471997-04-29 14:49:28 +000030static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +000031frame_getlocals(PyFrameObject *f, void *closure)
Guido van Rossum3f5da241990-12-20 15:06:42 +000032{
Tim Peters6d6c1a32001-08-02 04:15:00 +000033 PyFrame_FastToLocals(f);
34 Py_INCREF(f->f_locals);
35 return f->f_locals;
Guido van Rossum3f5da241990-12-20 15:06:42 +000036}
37
Michael W. Hudsondd32a912002-08-15 14:59:02 +000038static PyObject *
39frame_getlineno(PyFrameObject *f, void *closure)
40{
41 int lineno;
42
Michael W. Hudson02ff6a92002-09-11 15:36:32 +000043 if (f->f_trace)
44 lineno = f->f_lineno;
45 else
46 lineno = PyCode_Addr2Line(f->f_code, f->f_lasti);
Michael W. Hudsondd32a912002-08-15 14:59:02 +000047
48 return PyInt_FromLong(lineno);
49}
50
Michael W. Hudsoncfd38842002-12-17 16:15:34 +000051/* Setter for f_lineno - you can set f_lineno from within a trace function in
52 * order to jump to a given line of code, subject to some restrictions. Most
53 * lines are OK to jump to because they don't make any assumptions about the
54 * state of the stack (obvious because you could remove the line and the code
55 * would still work without any stack errors), but there are some constructs
56 * that limit jumping:
57 *
58 * o Lines with an 'except' statement on them can't be jumped to, because
59 * they expect an exception to be on the top of the stack.
60 * o Lines that live in a 'finally' block can't be jumped from or to, since
61 * the END_FINALLY expects to clean up the stack after the 'try' block.
62 * o 'try'/'for'/'while' blocks can't be jumped into because the blockstack
63 * needs to be set up before their code runs, and for 'for' loops the
64 * iterator needs to be on the stack.
65 */
66static int
67frame_setlineno(PyFrameObject *f, PyObject* p_new_lineno)
68{
69 int new_lineno = 0; /* The new value of f_lineno */
70 int new_lasti = 0; /* The new value of f_lasti */
71 int new_iblock = 0; /* The new value of f_iblock */
72 char *code = NULL; /* The bytecode for the frame... */
Martin v. Löwis18e16552006-02-15 17:27:45 +000073 Py_ssize_t code_len = 0; /* ...and its length */
Michael W. Hudsoncfd38842002-12-17 16:15:34 +000074 char *lnotab = NULL; /* Iterating over co_lnotab */
Martin v. Löwis18e16552006-02-15 17:27:45 +000075 Py_ssize_t lnotab_len = 0; /* (ditto) */
Michael W. Hudsoncfd38842002-12-17 16:15:34 +000076 int offset = 0; /* (ditto) */
77 int line = 0; /* (ditto) */
78 int addr = 0; /* (ditto) */
79 int min_addr = 0; /* Scanning the SETUPs and POPs */
80 int max_addr = 0; /* (ditto) */
81 int delta_iblock = 0; /* (ditto) */
82 int min_delta_iblock = 0; /* (ditto) */
83 int min_iblock = 0; /* (ditto) */
84 int f_lasti_setup_addr = 0; /* Policing no-jump-into-finally */
85 int new_lasti_setup_addr = 0; /* (ditto) */
86 int blockstack[CO_MAXBLOCKS]; /* Walking the 'finally' blocks */
87 int in_finally[CO_MAXBLOCKS]; /* (ditto) */
88 int blockstack_top = 0; /* (ditto) */
89 int setup_op = 0; /* (ditto) */
90
91 /* f_lineno must be an integer. */
92 if (!PyInt_Check(p_new_lineno)) {
93 PyErr_SetString(PyExc_ValueError,
94 "lineno must be an integer");
95 return -1;
96 }
97
98 /* You can only do this from within a trace function, not via
99 * _getframe or similar hackery. */
100 if (!f->f_trace)
101 {
102 PyErr_Format(PyExc_ValueError,
103 "f_lineno can only be set by a trace function");
104 return -1;
105 }
106
107 /* Fail if the line comes before the start of the code block. */
108 new_lineno = (int) PyInt_AsLong(p_new_lineno);
109 if (new_lineno < f->f_code->co_firstlineno) {
110 PyErr_Format(PyExc_ValueError,
111 "line %d comes before the current code block",
112 new_lineno);
113 return -1;
114 }
115
116 /* Find the bytecode offset for the start of the given line, or the
117 * first code-owning line after it. */
118 PyString_AsStringAndSize(f->f_code->co_lnotab, &lnotab, &lnotab_len);
119 addr = 0;
120 line = f->f_code->co_firstlineno;
121 new_lasti = -1;
122 for (offset = 0; offset < lnotab_len; offset += 2) {
123 addr += lnotab[offset];
124 line += lnotab[offset+1];
125 if (line >= new_lineno) {
126 new_lasti = addr;
127 new_lineno = line;
128 break;
129 }
130 }
131
132 /* If we didn't reach the requested line, return an error. */
133 if (new_lasti == -1) {
134 PyErr_Format(PyExc_ValueError,
135 "line %d comes after the current code block",
136 new_lineno);
137 return -1;
138 }
139
140 /* We're now ready to look at the bytecode. */
141 PyString_AsStringAndSize(f->f_code->co_code, &code, &code_len);
142 min_addr = MIN(new_lasti, f->f_lasti);
143 max_addr = MAX(new_lasti, f->f_lasti);
144
145 /* You can't jump onto a line with an 'except' statement on it -
146 * they expect to have an exception on the top of the stack, which
147 * won't be true if you jump to them. They always start with code
148 * that either pops the exception using POP_TOP (plain 'except:'
149 * lines do this) or duplicates the exception on the stack using
150 * DUP_TOP (if there's an exception type specified). See compile.c,
151 * 'com_try_except' for the full details. There aren't any other
152 * cases (AFAIK) where a line's code can start with DUP_TOP or
153 * POP_TOP, but if any ever appear, they'll be subject to the same
154 * restriction (but with a different error message). */
155 if (code[new_lasti] == DUP_TOP || code[new_lasti] == POP_TOP) {
156 PyErr_SetString(PyExc_ValueError,
157 "can't jump to 'except' line as there's no exception");
158 return -1;
159 }
160
161 /* You can't jump into or out of a 'finally' block because the 'try'
162 * block leaves something on the stack for the END_FINALLY to clean
163 * up. So we walk the bytecode, maintaining a simulated blockstack.
164 * When we reach the old or new address and it's in a 'finally' block
165 * we note the address of the corresponding SETUP_FINALLY. The jump
166 * is only legal if neither address is in a 'finally' block or
167 * they're both in the same one. 'blockstack' is a stack of the
168 * bytecode addresses of the SETUP_X opcodes, and 'in_finally' tracks
169 * whether we're in a 'finally' block at each blockstack level. */
170 f_lasti_setup_addr = -1;
171 new_lasti_setup_addr = -1;
172 memset(blockstack, '\0', sizeof(blockstack));
173 memset(in_finally, '\0', sizeof(in_finally));
174 blockstack_top = 0;
175 for (addr = 0; addr < code_len; addr++) {
176 unsigned char op = code[addr];
177 switch (op) {
178 case SETUP_LOOP:
179 case SETUP_EXCEPT:
180 case SETUP_FINALLY:
181 blockstack[blockstack_top++] = addr;
182 in_finally[blockstack_top-1] = 0;
183 break;
184
185 case POP_BLOCK:
Neal Norwitzee65e222002-12-19 18:16:57 +0000186 assert(blockstack_top > 0);
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000187 setup_op = code[blockstack[blockstack_top-1]];
188 if (setup_op == SETUP_FINALLY) {
189 in_finally[blockstack_top-1] = 1;
190 }
191 else {
192 blockstack_top--;
193 }
194 break;
195
196 case END_FINALLY:
197 /* Ignore END_FINALLYs for SETUP_EXCEPTs - they exist
198 * in the bytecode but don't correspond to an actual
Neal Norwitzee65e222002-12-19 18:16:57 +0000199 * 'finally' block. (If blockstack_top is 0, we must
200 * be seeing such an END_FINALLY.) */
201 if (blockstack_top > 0) {
202 setup_op = code[blockstack[blockstack_top-1]];
203 if (setup_op == SETUP_FINALLY) {
204 blockstack_top--;
205 }
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000206 }
207 break;
208 }
209
210 /* For the addresses we're interested in, see whether they're
211 * within a 'finally' block and if so, remember the address
212 * of the SETUP_FINALLY. */
213 if (addr == new_lasti || addr == f->f_lasti) {
214 int i = 0;
215 int setup_addr = -1;
216 for (i = blockstack_top-1; i >= 0; i--) {
217 if (in_finally[i]) {
218 setup_addr = blockstack[i];
219 break;
220 }
221 }
222
223 if (setup_addr != -1) {
224 if (addr == new_lasti) {
225 new_lasti_setup_addr = setup_addr;
226 }
227
228 if (addr == f->f_lasti) {
229 f_lasti_setup_addr = setup_addr;
230 }
231 }
232 }
233
234 if (op >= HAVE_ARGUMENT) {
235 addr += 2;
236 }
237 }
238
Neal Norwitzee65e222002-12-19 18:16:57 +0000239 /* Verify that the blockstack tracking code didn't get lost. */
240 assert(blockstack_top == 0);
241
242 /* After all that, are we jumping into / out of a 'finally' block? */
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000243 if (new_lasti_setup_addr != f_lasti_setup_addr) {
244 PyErr_SetString(PyExc_ValueError,
245 "can't jump into or out of a 'finally' block");
246 return -1;
247 }
248
249
250 /* Police block-jumping (you can't jump into the middle of a block)
251 * and ensure that the blockstack finishes up in a sensible state (by
252 * popping any blocks we're jumping out of). We look at all the
253 * blockstack operations between the current position and the new
254 * one, and keep track of how many blocks we drop out of on the way.
255 * By also keeping track of the lowest blockstack position we see, we
256 * can tell whether the jump goes into any blocks without coming out
257 * again - in that case we raise an exception below. */
258 delta_iblock = 0;
259 for (addr = min_addr; addr < max_addr; addr++) {
260 unsigned char op = code[addr];
261 switch (op) {
262 case SETUP_LOOP:
263 case SETUP_EXCEPT:
264 case SETUP_FINALLY:
265 delta_iblock++;
266 break;
267
268 case POP_BLOCK:
269 delta_iblock--;
270 break;
271 }
272
273 min_delta_iblock = MIN(min_delta_iblock, delta_iblock);
274
275 if (op >= HAVE_ARGUMENT) {
276 addr += 2;
277 }
278 }
279
280 /* Derive the absolute iblock values from the deltas. */
281 min_iblock = f->f_iblock + min_delta_iblock;
282 if (new_lasti > f->f_lasti) {
283 /* Forwards jump. */
284 new_iblock = f->f_iblock + delta_iblock;
285 }
286 else {
287 /* Backwards jump. */
288 new_iblock = f->f_iblock - delta_iblock;
289 }
290
291 /* Are we jumping into a block? */
292 if (new_iblock > min_iblock) {
293 PyErr_SetString(PyExc_ValueError,
294 "can't jump into the middle of a block");
295 return -1;
296 }
297
298 /* Pop any blocks that we're jumping out of. */
299 while (f->f_iblock > new_iblock) {
300 PyTryBlock *b = &f->f_blockstack[--f->f_iblock];
301 while ((f->f_stacktop - f->f_valuestack) > b->b_level) {
302 PyObject *v = (*--f->f_stacktop);
303 Py_DECREF(v);
304 }
305 }
306
307 /* Finally set the new f_lineno and f_lasti and return OK. */
308 f->f_lineno = new_lineno;
309 f->f_lasti = new_lasti;
310 return 0;
311}
312
Michael W. Hudson02ff6a92002-09-11 15:36:32 +0000313static PyObject *
314frame_gettrace(PyFrameObject *f, void *closure)
315{
316 PyObject* trace = f->f_trace;
317
318 if (trace == NULL)
319 trace = Py_None;
320
321 Py_INCREF(trace);
322
323 return trace;
324}
325
326static int
327frame_settrace(PyFrameObject *f, PyObject* v, void *closure)
328{
329 /* We rely on f_lineno being accurate when f_trace is set. */
330
331 PyObject* old_value = f->f_trace;
332
333 Py_XINCREF(v);
334 f->f_trace = v;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000335
Michael W. Hudson02ff6a92002-09-11 15:36:32 +0000336 if (v != NULL)
337 f->f_lineno = PyCode_Addr2Line(f->f_code, f->f_lasti);
338
339 Py_XDECREF(old_value);
340
341 return 0;
342}
343
Guido van Rossum32d34c82001-09-20 21:45:26 +0000344static PyGetSetDef frame_getsetlist[] = {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000345 {"f_locals", (getter)frame_getlocals, NULL, NULL},
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000346 {"f_lineno", (getter)frame_getlineno,
347 (setter)frame_setlineno, NULL},
Michael W. Hudson02ff6a92002-09-11 15:36:32 +0000348 {"f_trace", (getter)frame_gettrace, (setter)frame_settrace, NULL},
Tim Peters6d6c1a32001-08-02 04:15:00 +0000349 {0}
350};
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000351
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000352/* Stack frames are allocated and deallocated at a considerable rate.
Thomas Wouters477c8d52006-05-27 19:21:47 +0000353 In an attempt to improve the speed of function calls, we:
354
355 1. Hold a single "zombie" frame on each code object. This retains
356 the allocated and initialised frame object from an invocation of
357 the code object. The zombie is reanimated the next time we need a
358 frame object for that code object. Doing this saves the malloc/
359 realloc required when using a free_list frame that isn't the
360 correct size. It also saves some field initialisation.
361
362 In zombie mode, no field of PyFrameObject holds a reference, but
363 the following fields are still valid:
364
365 * ob_type, ob_size, f_code, f_valuestack;
366
367 * f_locals, f_trace,
368 f_exc_type, f_exc_value, f_exc_traceback are NULL;
369
370 * f_localsplus does not require re-allocation and
371 the local variables in f_localsplus are NULL.
372
373 2. We also maintain a separate free list of stack frames (just like
374 integers are allocated in a special way -- see intobject.c). When
375 a stack frame is on the free list, only the following members have
376 a meaning:
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000377 ob_type == &Frametype
378 f_back next item on free list, or NULL
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000379 f_stacksize size of value stack
Neil Schemenauer4f4817f2001-08-29 23:52:17 +0000380 ob_size size of localsplus
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000381 Note that the value and block stacks are preserved -- this can save
382 another malloc() call or two (and two free() calls as well!).
383 Also note that, unlike for integers, each frame object is a
384 malloc'ed object in its own right -- it is only the actual calls to
385 malloc() that we are trying to save here, not the administration.
386 After all, while a typical program may make millions of calls, a
387 call depth of more than 20 or 30 is probably already exceptional
388 unless the program contains run-away recursion. I hope.
Tim Petersb7ba7432002-04-13 05:21:47 +0000389
390 Later, MAXFREELIST was added to bound the # of frames saved on
391 free_list. Else programs creating lots of cyclic trash involving
392 frames could provoke free_list into growing without bound.
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000393*/
394
Guido van Rossum18752471997-04-29 14:49:28 +0000395static PyFrameObject *free_list = NULL;
Tim Petersb7ba7432002-04-13 05:21:47 +0000396static int numfree = 0; /* number of frames currently in free_list */
397#define MAXFREELIST 200 /* max value for numfree */
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000398
Guido van Rossum3f5da241990-12-20 15:06:42 +0000399static void
Fred Drake1b190b42000-07-09 05:40:56 +0000400frame_dealloc(PyFrameObject *f)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000401{
Thomas Wouters477c8d52006-05-27 19:21:47 +0000402 PyObject **p, **valuestack;
403 PyCodeObject *co;
Guido van Rossum7582bfb1997-02-14 16:27:29 +0000404
Guido van Rossumff413af2002-03-28 20:34:59 +0000405 PyObject_GC_UnTrack(f);
Guido van Rossumd724b232000-03-13 16:01:29 +0000406 Py_TRASHCAN_SAFE_BEGIN(f)
Guido van Rossum7582bfb1997-02-14 16:27:29 +0000407 /* Kill all local variables */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000408 valuestack = f->f_valuestack;
409 for (p = f->f_localsplus; p < valuestack; p++)
410 Py_CLEAR(*p);
Guido van Rossum7582bfb1997-02-14 16:27:29 +0000411
Tim Peters5ca576e2001-06-18 22:08:13 +0000412 /* Free stack */
Tim Peters8c963692001-06-23 05:26:56 +0000413 if (f->f_stacktop != NULL) {
Thomas Wouters477c8d52006-05-27 19:21:47 +0000414 for (p = valuestack; p < f->f_stacktop; p++)
Tim Peters8c963692001-06-23 05:26:56 +0000415 Py_XDECREF(*p);
Tim Peters5ca576e2001-06-18 22:08:13 +0000416 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000417
Guido van Rossum18752471997-04-29 14:49:28 +0000418 Py_XDECREF(f->f_back);
Neal Norwitzc91ed402002-12-30 22:29:22 +0000419 Py_DECREF(f->f_builtins);
420 Py_DECREF(f->f_globals);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000421 Py_CLEAR(f->f_locals);
422 Py_CLEAR(f->f_trace);
423 Py_CLEAR(f->f_exc_type);
424 Py_CLEAR(f->f_exc_value);
425 Py_CLEAR(f->f_exc_traceback);
426
427 co = f->f_code;
428 if (co != NULL && co->co_zombieframe == NULL)
429 co->co_zombieframe = f;
430 else if (numfree < MAXFREELIST) {
Tim Petersb7ba7432002-04-13 05:21:47 +0000431 ++numfree;
432 f->f_back = free_list;
433 free_list = f;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000434 }
435 else
Tim Petersb7ba7432002-04-13 05:21:47 +0000436 PyObject_GC_Del(f);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000437
438 Py_XDECREF(co);
Guido van Rossumd724b232000-03-13 16:01:29 +0000439 Py_TRASHCAN_SAFE_END(f)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000440}
441
Neil Schemenauer19cd2922001-07-12 13:27:11 +0000442static int
443frame_traverse(PyFrameObject *f, visitproc visit, void *arg)
444{
445 PyObject **fastlocals, **p;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000446 int i, slots;
Neil Schemenauer19cd2922001-07-12 13:27:11 +0000447
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000448 Py_VISIT(f->f_back);
449 Py_VISIT(f->f_code);
450 Py_VISIT(f->f_builtins);
451 Py_VISIT(f->f_globals);
452 Py_VISIT(f->f_locals);
453 Py_VISIT(f->f_trace);
454 Py_VISIT(f->f_exc_type);
455 Py_VISIT(f->f_exc_value);
456 Py_VISIT(f->f_exc_traceback);
Neil Schemenauer19cd2922001-07-12 13:27:11 +0000457
458 /* locals */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000459 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 +0000460 fastlocals = f->f_localsplus;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000461 for (i = slots; --i >= 0; ++fastlocals)
462 Py_VISIT(*fastlocals);
Neil Schemenauer19cd2922001-07-12 13:27:11 +0000463
464 /* stack */
465 if (f->f_stacktop != NULL) {
466 for (p = f->f_valuestack; p < f->f_stacktop; p++)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000467 Py_VISIT(*p);
Neil Schemenauer19cd2922001-07-12 13:27:11 +0000468 }
Neil Schemenauer19cd2922001-07-12 13:27:11 +0000469 return 0;
470}
471
472static void
473frame_clear(PyFrameObject *f)
474{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000475 PyObject **fastlocals, **p, **oldtop;
Neil Schemenauer19cd2922001-07-12 13:27:11 +0000476 int i, slots;
477
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000478 /* Before anything else, make sure that this frame is clearly marked
479 * as being defunct! Else, e.g., a generator reachable from this
480 * frame may also point to this frame, believe itself to still be
481 * active, and try cleaning up this frame again.
482 */
483 oldtop = f->f_stacktop;
484 f->f_stacktop = NULL;
Neil Schemenauer19cd2922001-07-12 13:27:11 +0000485
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000486 Py_CLEAR(f->f_exc_type);
487 Py_CLEAR(f->f_exc_value);
488 Py_CLEAR(f->f_exc_traceback);
489 Py_CLEAR(f->f_trace);
Neil Schemenauer19cd2922001-07-12 13:27:11 +0000490
491 /* locals */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000492 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 +0000493 fastlocals = f->f_localsplus;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000494 for (i = slots; --i >= 0; ++fastlocals)
495 Py_CLEAR(*fastlocals);
Neil Schemenauer19cd2922001-07-12 13:27:11 +0000496
497 /* stack */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000498 if (oldtop != NULL) {
499 for (p = f->f_valuestack; p < oldtop; p++)
500 Py_CLEAR(*p);
Neil Schemenauer19cd2922001-07-12 13:27:11 +0000501 }
502}
503
504
Guido van Rossum18752471997-04-29 14:49:28 +0000505PyTypeObject PyFrame_Type = {
506 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000507 0,
508 "frame",
Neil Schemenauer4f4817f2001-08-29 23:52:17 +0000509 sizeof(PyFrameObject),
510 sizeof(PyObject *),
Neil Schemenauer19cd2922001-07-12 13:27:11 +0000511 (destructor)frame_dealloc, /* tp_dealloc */
512 0, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000513 0, /* tp_getattr */
514 0, /* tp_setattr */
Neil Schemenauer19cd2922001-07-12 13:27:11 +0000515 0, /* tp_compare */
516 0, /* tp_repr */
517 0, /* tp_as_number */
518 0, /* tp_as_sequence */
519 0, /* tp_as_mapping */
520 0, /* tp_hash */
521 0, /* tp_call */
522 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000523 PyObject_GenericGetAttr, /* tp_getattro */
524 PyObject_GenericSetAttr, /* tp_setattro */
Neil Schemenauer19cd2922001-07-12 13:27:11 +0000525 0, /* tp_as_buffer */
Neil Schemenauer4f4817f2001-08-29 23:52:17 +0000526 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
Neil Schemenauer19cd2922001-07-12 13:27:11 +0000527 0, /* tp_doc */
528 (traverseproc)frame_traverse, /* tp_traverse */
529 (inquiry)frame_clear, /* tp_clear */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000530 0, /* tp_richcompare */
531 0, /* tp_weaklistoffset */
532 0, /* tp_iter */
533 0, /* tp_iternext */
534 0, /* tp_methods */
535 frame_memberlist, /* tp_members */
536 frame_getsetlist, /* tp_getset */
537 0, /* tp_base */
538 0, /* tp_dict */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000539};
540
Neal Norwitzc91ed402002-12-30 22:29:22 +0000541static PyObject *builtin_object;
542
Neal Norwitzb2501f42002-12-31 03:42:13 +0000543int _PyFrame_Init()
Neal Norwitzc91ed402002-12-30 22:29:22 +0000544{
545 builtin_object = PyString_InternFromString("__builtins__");
546 return (builtin_object != NULL);
547}
548
Guido van Rossum18752471997-04-29 14:49:28 +0000549PyFrameObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000550PyFrame_New(PyThreadState *tstate, PyCodeObject *code, PyObject *globals,
Jeremy Hylton30c9f392001-03-13 01:58:22 +0000551 PyObject *locals)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000552{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000553 PyFrameObject *back = tstate->frame;
Guido van Rossum18752471997-04-29 14:49:28 +0000554 PyFrameObject *f;
555 PyObject *builtins;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000556 Py_ssize_t i;
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000557
Michael W. Hudson69734a52002-08-19 16:54:08 +0000558#ifdef Py_DEBUG
559 if (code == NULL || globals == NULL || !PyDict_Check(globals) ||
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000560 (locals != NULL && !PyMapping_Check(locals))) {
Guido van Rossum18752471997-04-29 14:49:28 +0000561 PyErr_BadInternalCall();
Guido van Rossum3f5da241990-12-20 15:06:42 +0000562 return NULL;
563 }
Michael W. Hudson69734a52002-08-19 16:54:08 +0000564#endif
Guido van Rossumbde6ff71998-02-19 20:48:26 +0000565 if (back == NULL || back->f_globals != globals) {
566 builtins = PyDict_GetItem(globals, builtin_object);
Jeremy Hyltonbd5cbf82003-02-05 22:39:29 +0000567 if (builtins) {
568 if (PyModule_Check(builtins)) {
569 builtins = PyModule_GetDict(builtins);
570 assert(!builtins || PyDict_Check(builtins));
571 }
572 else if (!PyDict_Check(builtins))
573 builtins = NULL;
574 }
575 if (builtins == NULL) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000576 /* No builtins! Make up a minimal one
Jeremy Hyltonbd5cbf82003-02-05 22:39:29 +0000577 Give them 'None', at least. */
578 builtins = PyDict_New();
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000579 if (builtins == NULL ||
Jeremy Hyltonbd5cbf82003-02-05 22:39:29 +0000580 PyDict_SetItemString(
581 builtins, "None", Py_None) < 0)
582 return NULL;
583 }
584 else
585 Py_INCREF(builtins);
586
Guido van Rossumbde6ff71998-02-19 20:48:26 +0000587 }
588 else {
589 /* If we share the globals, we share the builtins.
590 Save a lookup and a call. */
591 builtins = back->f_builtins;
Jeremy Hyltonbd5cbf82003-02-05 22:39:29 +0000592 assert(builtins != NULL && PyDict_Check(builtins));
593 Py_INCREF(builtins);
Guido van Rossumbde6ff71998-02-19 20:48:26 +0000594 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000595 if (code->co_zombieframe != NULL) {
596 f = code->co_zombieframe;
597 code->co_zombieframe = NULL;
598 _Py_NewReference((PyObject *)f);
599 assert(f->f_code == code);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000600 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000601 else {
602 Py_ssize_t extras, ncells, nfrees;
603 ncells = PyTuple_GET_SIZE(code->co_cellvars);
604 nfrees = PyTuple_GET_SIZE(code->co_freevars);
605 extras = code->co_stacksize + code->co_nlocals + ncells +
606 nfrees;
607 if (free_list == NULL) {
608 f = PyObject_GC_NewVar(PyFrameObject, &PyFrame_Type,
609 extras);
610 if (f == NULL) {
611 Py_DECREF(builtins);
612 return NULL;
613 }
614 }
615 else {
616 assert(numfree > 0);
617 --numfree;
618 f = free_list;
619 free_list = free_list->f_back;
620 if (f->ob_size < extras) {
621 f = PyObject_GC_Resize(PyFrameObject, f, extras);
622 if (f == NULL) {
623 Py_DECREF(builtins);
624 return NULL;
625 }
626 }
627 _Py_NewReference((PyObject *)f);
628 }
629
630 f->f_code = code;
631 extras = code->co_nlocals + ncells + nfrees;
632 f->f_valuestack = f->f_localsplus + extras;
633 for (i=0; i<extras; i++)
634 f->f_localsplus[i] = NULL;
635 f->f_locals = NULL;
636 f->f_trace = NULL;
637 f->f_exc_type = f->f_exc_value = f->f_exc_traceback = NULL;
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000638 }
Guido van Rossum404b95d1997-08-05 02:09:46 +0000639 f->f_builtins = builtins;
Guido van Rossum18752471997-04-29 14:49:28 +0000640 Py_XINCREF(back);
Guido van Rossum2271bf71995-07-18 14:30:34 +0000641 f->f_back = back;
Guido van Rossum18752471997-04-29 14:49:28 +0000642 Py_INCREF(code);
Guido van Rossum18752471997-04-29 14:49:28 +0000643 Py_INCREF(globals);
Guido van Rossum2271bf71995-07-18 14:30:34 +0000644 f->f_globals = globals;
Jeremy Hyltonbd5cbf82003-02-05 22:39:29 +0000645 /* Most functions have CO_NEWLOCALS and CO_OPTIMIZED set. */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000646 if ((code->co_flags & (CO_NEWLOCALS | CO_OPTIMIZED)) ==
Jeremy Hyltonbd5cbf82003-02-05 22:39:29 +0000647 (CO_NEWLOCALS | CO_OPTIMIZED))
Thomas Wouters477c8d52006-05-27 19:21:47 +0000648 ; /* f_locals = NULL; will be set by PyFrame_FastToLocals() */
Jeremy Hyltonbd5cbf82003-02-05 22:39:29 +0000649 else if (code->co_flags & CO_NEWLOCALS) {
650 locals = PyDict_New();
651 if (locals == NULL) {
652 Py_DECREF(f);
653 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000654 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000655 f->f_locals = locals;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000656 }
Guido van Rossum2271bf71995-07-18 14:30:34 +0000657 else {
658 if (locals == NULL)
659 locals = globals;
Guido van Rossum18752471997-04-29 14:49:28 +0000660 Py_INCREF(locals);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000661 f->f_locals = locals;
Guido van Rossum2271bf71995-07-18 14:30:34 +0000662 }
Guido van Rossumeb46d671997-08-02 02:59:08 +0000663 f->f_tstate = tstate;
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000664
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000665 f->f_lasti = -1;
Guido van Rossum747596a1997-01-24 04:00:21 +0000666 f->f_lineno = code->co_firstlineno;
Guido van Rossumeb46d671997-08-02 02:59:08 +0000667 f->f_restricted = (builtins != tstate->interp->builtins);
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000668 f->f_iblock = 0;
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000669
Thomas Wouters477c8d52006-05-27 19:21:47 +0000670 f->f_stacktop = f->f_valuestack;
Neil Schemenauer4f4817f2001-08-29 23:52:17 +0000671 _PyObject_GC_TRACK(f);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000672 return f;
673}
674
Guido van Rossum3f5da241990-12-20 15:06:42 +0000675/* Block management */
676
677void
Fred Drake1b190b42000-07-09 05:40:56 +0000678PyFrame_BlockSetup(PyFrameObject *f, int type, int handler, int level)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000679{
Guido van Rossum18752471997-04-29 14:49:28 +0000680 PyTryBlock *b;
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000681 if (f->f_iblock >= CO_MAXBLOCKS)
Guido van Rossum18752471997-04-29 14:49:28 +0000682 Py_FatalError("XXX block stack overflow");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000683 b = &f->f_blockstack[f->f_iblock++];
684 b->b_type = type;
685 b->b_level = level;
686 b->b_handler = handler;
687}
688
Guido van Rossum18752471997-04-29 14:49:28 +0000689PyTryBlock *
Fred Drake1b190b42000-07-09 05:40:56 +0000690PyFrame_BlockPop(PyFrameObject *f)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000691{
Guido van Rossum18752471997-04-29 14:49:28 +0000692 PyTryBlock *b;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000693 if (f->f_iblock <= 0)
Guido van Rossum18752471997-04-29 14:49:28 +0000694 Py_FatalError("XXX block stack underflow");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000695 b = &f->f_blockstack[--f->f_iblock];
696 return b;
697}
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000698
699/* Convert between "fast" version of locals and dictionary version */
700
Guido van Rossumf68d8e52001-04-14 17:55:09 +0000701static void
Martin v. Löwis18e16552006-02-15 17:27:45 +0000702map_to_dict(PyObject *map, Py_ssize_t nmap, PyObject *dict, PyObject **values,
703 Py_ssize_t deref)
Jeremy Hylton220ae7c2001-03-21 16:43:47 +0000704{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000705 Py_ssize_t j;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +0000706 for (j = nmap; --j >= 0; ) {
Jeremy Hylton1a48ca82001-12-06 15:48:16 +0000707 PyObject *key = PyTuple_GET_ITEM(map, j);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +0000708 PyObject *value = values[j];
709 if (deref)
710 value = PyCell_GET(value);
711 if (value == NULL) {
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000712 if (PyObject_DelItem(dict, key) != 0)
Jeremy Hylton220ae7c2001-03-21 16:43:47 +0000713 PyErr_Clear();
714 }
715 else {
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000716 if (PyObject_SetItem(dict, key, value) != 0)
Jeremy Hylton220ae7c2001-03-21 16:43:47 +0000717 PyErr_Clear();
718 }
719 }
720}
721
Guido van Rossum6b356e72001-04-14 17:55:41 +0000722static void
Martin v. Löwis18e16552006-02-15 17:27:45 +0000723dict_to_map(PyObject *map, Py_ssize_t nmap, PyObject *dict, PyObject **values,
724 Py_ssize_t deref, int clear)
Jeremy Hylton220ae7c2001-03-21 16:43:47 +0000725{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000726 Py_ssize_t j;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +0000727 for (j = nmap; --j >= 0; ) {
Jeremy Hylton1a48ca82001-12-06 15:48:16 +0000728 PyObject *key = PyTuple_GET_ITEM(map, j);
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000729 PyObject *value = PyObject_GetItem(dict, key);
730 if (value == NULL)
731 PyErr_Clear();
Jeremy Hylton220ae7c2001-03-21 16:43:47 +0000732 if (deref) {
Jeremy Hylton4c889012001-05-08 04:08:59 +0000733 if (value || clear) {
Jeremy Hylton1a48ca82001-12-06 15:48:16 +0000734 if (PyCell_GET(values[j]) != value) {
735 if (PyCell_Set(values[j], value) < 0)
736 PyErr_Clear();
737 }
Jeremy Hylton220ae7c2001-03-21 16:43:47 +0000738 }
739 } else if (value != NULL || clear) {
Jeremy Hylton1a48ca82001-12-06 15:48:16 +0000740 if (values[j] != value) {
741 Py_XINCREF(value);
742 Py_XDECREF(values[j]);
743 values[j] = value;
744 }
Jeremy Hylton220ae7c2001-03-21 16:43:47 +0000745 }
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000746 Py_XDECREF(value);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +0000747 }
748}
Jeremy Hylton2b724da2001-01-29 22:51:52 +0000749
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000750void
Fred Drake1b190b42000-07-09 05:40:56 +0000751PyFrame_FastToLocals(PyFrameObject *f)
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000752{
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000753 /* Merge fast locals into f->f_locals */
Guido van Rossum18752471997-04-29 14:49:28 +0000754 PyObject *locals, *map;
755 PyObject **fast;
756 PyObject *error_type, *error_value, *error_traceback;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000757 PyCodeObject *co;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000758 Py_ssize_t j;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000759 int ncells, nfreevars;
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000760 if (f == NULL)
761 return;
Guido van Rossum2271bf71995-07-18 14:30:34 +0000762 locals = f->f_locals;
763 if (locals == NULL) {
Guido van Rossum18752471997-04-29 14:49:28 +0000764 locals = f->f_locals = PyDict_New();
Guido van Rossum2271bf71995-07-18 14:30:34 +0000765 if (locals == NULL) {
Guido van Rossum18752471997-04-29 14:49:28 +0000766 PyErr_Clear(); /* Can't report it :-( */
Guido van Rossum2271bf71995-07-18 14:30:34 +0000767 return;
768 }
769 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000770 co = f->f_code;
771 map = co->co_varnames;
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000772 if (!PyTuple_Check(map))
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000773 return;
Guido van Rossum18752471997-04-29 14:49:28 +0000774 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000775 fast = f->f_localsplus;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000776 j = PyTuple_GET_SIZE(map);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000777 if (j > co->co_nlocals)
778 j = co->co_nlocals;
779 if (co->co_nlocals)
Jeremy Hylton174d2762003-10-21 18:10:28 +0000780 map_to_dict(map, j, locals, fast, 0);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000781 ncells = PyTuple_GET_SIZE(co->co_cellvars);
782 nfreevars = PyTuple_GET_SIZE(co->co_freevars);
783 if (ncells || nfreevars) {
784 map_to_dict(co->co_cellvars, ncells,
785 locals, fast + co->co_nlocals, 1);
786 map_to_dict(co->co_freevars, nfreevars,
787 locals, fast + co->co_nlocals + ncells, 1);
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000788 }
Guido van Rossum18752471997-04-29 14:49:28 +0000789 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000790}
791
792void
Fred Drake1b190b42000-07-09 05:40:56 +0000793PyFrame_LocalsToFast(PyFrameObject *f, int clear)
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000794{
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000795 /* Merge f->f_locals into fast locals */
Guido van Rossum18752471997-04-29 14:49:28 +0000796 PyObject *locals, *map;
797 PyObject **fast;
798 PyObject *error_type, *error_value, *error_traceback;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000799 PyCodeObject *co;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000800 Py_ssize_t j;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000801 int ncells, nfreevars;
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000802 if (f == NULL)
803 return;
804 locals = f->f_locals;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000805 co = f->f_code;
806 map = co->co_varnames;
Jeremy Hylton24ea8d32002-04-20 04:46:55 +0000807 if (locals == NULL)
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000808 return;
Raymond Hettinger214b1c32004-07-02 06:41:07 +0000809 if (!PyTuple_Check(map))
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000810 return;
Guido van Rossum18752471997-04-29 14:49:28 +0000811 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000812 fast = f->f_localsplus;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000813 j = PyTuple_GET_SIZE(map);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000814 if (j > co->co_nlocals)
815 j = co->co_nlocals;
816 if (co->co_nlocals)
817 dict_to_map(co->co_varnames, j, locals, fast, 0, clear);
818 ncells = PyTuple_GET_SIZE(co->co_cellvars);
819 nfreevars = PyTuple_GET_SIZE(co->co_freevars);
820 if (ncells || nfreevars) {
821 dict_to_map(co->co_cellvars, ncells,
822 locals, fast + co->co_nlocals, 1, clear);
823 dict_to_map(co->co_freevars, nfreevars,
824 locals, fast + co->co_nlocals + ncells, 1,
825 clear);
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000826 }
Guido van Rossum18752471997-04-29 14:49:28 +0000827 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000828}
Guido van Rossum404b95d1997-08-05 02:09:46 +0000829
830/* Clear out the free list */
831
832void
Fred Drake1b190b42000-07-09 05:40:56 +0000833PyFrame_Fini(void)
Guido van Rossum404b95d1997-08-05 02:09:46 +0000834{
835 while (free_list != NULL) {
836 PyFrameObject *f = free_list;
837 free_list = free_list->f_back;
Neil Schemenauer4f4817f2001-08-29 23:52:17 +0000838 PyObject_GC_Del(f);
Tim Petersb7ba7432002-04-13 05:21:47 +0000839 --numfree;
Guido van Rossum404b95d1997-08-05 02:09:46 +0000840 }
Tim Petersb7ba7432002-04-13 05:21:47 +0000841 assert(numfree == 0);
Neal Norwitzc91ed402002-12-30 22:29:22 +0000842 Py_XDECREF(builtin_object);
843 builtin_object = NULL;
Guido van Rossum404b95d1997-08-05 02:09:46 +0000844}