blob: bf1c7c52737d7af4e9191471af203e4c6f59d307 [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 }
Miss Islington (bot)3854f582018-03-11 00:55:59 -0800343 if (b->b_type == SETUP_WITH) {
344 /* Pop the exit function. */
345 PyObject *v = (*--f->f_stacktop);
346 Py_DECREF(v);
347 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000348 }
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000349
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000350 /* Finally set the new f_lineno and f_lasti and return OK. */
351 f->f_lineno = new_lineno;
352 f->f_lasti = new_lasti;
353 return 0;
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000354}
355
Michael W. Hudson02ff6a92002-09-11 15:36:32 +0000356static PyObject *
357frame_gettrace(PyFrameObject *f, void *closure)
358{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000359 PyObject* trace = f->f_trace;
Michael W. Hudson02ff6a92002-09-11 15:36:32 +0000360
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000361 if (trace == NULL)
362 trace = Py_None;
Michael W. Hudson02ff6a92002-09-11 15:36:32 +0000363
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000364 Py_INCREF(trace);
Michael W. Hudson02ff6a92002-09-11 15:36:32 +0000365
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000366 return trace;
Michael W. Hudson02ff6a92002-09-11 15:36:32 +0000367}
368
369static int
370frame_settrace(PyFrameObject *f, PyObject* v, void *closure)
371{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000372 /* We rely on f_lineno being accurate when f_trace is set. */
373 f->f_lineno = PyFrame_GetLineNumber(f);
Michael W. Hudson02ff6a92002-09-11 15:36:32 +0000374
Serhiy Storchakad37781e2016-06-04 20:30:43 +0300375 if (v == Py_None)
376 v = NULL;
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000377 Py_XINCREF(v);
Serhiy Storchakad37781e2016-06-04 20:30:43 +0300378 Py_XSETREF(f->f_trace, v);
Michael W. Hudson02ff6a92002-09-11 15:36:32 +0000379
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000380 return 0;
Michael W. Hudson02ff6a92002-09-11 15:36:32 +0000381}
382
Neal Norwitzb9845e72006-06-12 02:11:18 +0000383static PyObject *
384frame_getrestricted(PyFrameObject *f, void *closure)
385{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000386 return PyBool_FromLong(PyFrame_IsRestricted(f));
Neal Norwitzb9845e72006-06-12 02:11:18 +0000387}
388
Guido van Rossum32d34c82001-09-20 21:45:26 +0000389static PyGetSetDef frame_getsetlist[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000390 {"f_locals", (getter)frame_getlocals, NULL, NULL},
391 {"f_lineno", (getter)frame_getlineno,
392 (setter)frame_setlineno, NULL},
393 {"f_trace", (getter)frame_gettrace, (setter)frame_settrace, NULL},
394 {"f_restricted",(getter)frame_getrestricted,NULL, NULL},
395 {"f_exc_traceback", (getter)frame_get_f_exc_traceback,
396 (setter)frame_set_f_exc_traceback, NULL},
397 {"f_exc_type", (getter)frame_get_f_exc_type,
398 (setter)frame_set_f_exc_type, NULL},
399 {"f_exc_value", (getter)frame_get_f_exc_value,
400 (setter)frame_set_f_exc_value, NULL},
401 {0}
Tim Peters6d6c1a32001-08-02 04:15:00 +0000402};
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000403
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000404/* Stack frames are allocated and deallocated at a considerable rate.
Richard Jones7c88dcc2006-05-23 10:37:38 +0000405 In an attempt to improve the speed of function calls, we:
406
407 1. Hold a single "zombie" frame on each code object. This retains
408 the allocated and initialised frame object from an invocation of
409 the code object. The zombie is reanimated the next time we need a
410 frame object for that code object. Doing this saves the malloc/
411 realloc required when using a free_list frame that isn't the
412 correct size. It also saves some field initialisation.
413
414 In zombie mode, no field of PyFrameObject holds a reference, but
415 the following fields are still valid:
416
Richard Jonesa3727112006-05-23 18:32:11 +0000417 * ob_type, ob_size, f_code, f_valuestack;
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000418
Richard Jones7c88dcc2006-05-23 10:37:38 +0000419 * f_locals, f_trace,
420 f_exc_type, f_exc_value, f_exc_traceback are NULL;
421
422 * f_localsplus does not require re-allocation and
423 the local variables in f_localsplus are NULL.
424
425 2. We also maintain a separate free list of stack frames (just like
426 integers are allocated in a special way -- see intobject.c). When
427 a stack frame is on the free list, only the following members have
428 a meaning:
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000429 ob_type == &Frametype
430 f_back next item on free list, or NULL
431 f_stacksize size of value stack
432 ob_size size of localsplus
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000433 Note that the value and block stacks are preserved -- this can save
434 another malloc() call or two (and two free() calls as well!).
435 Also note that, unlike for integers, each frame object is a
436 malloc'ed object in its own right -- it is only the actual calls to
437 malloc() that we are trying to save here, not the administration.
438 After all, while a typical program may make millions of calls, a
439 call depth of more than 20 or 30 is probably already exceptional
440 unless the program contains run-away recursion. I hope.
Tim Petersb7ba7432002-04-13 05:21:47 +0000441
Christian Heimes5b970ad2008-02-06 13:33:44 +0000442 Later, PyFrame_MAXFREELIST was added to bound the # of frames saved on
Tim Petersb7ba7432002-04-13 05:21:47 +0000443 free_list. Else programs creating lots of cyclic trash involving
444 frames could provoke free_list into growing without bound.
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000445*/
446
Guido van Rossum18752471997-04-29 14:49:28 +0000447static PyFrameObject *free_list = NULL;
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000448static int numfree = 0; /* number of frames currently in free_list */
Christian Heimes5b970ad2008-02-06 13:33:44 +0000449/* max value for numfree */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000450#define PyFrame_MAXFREELIST 200
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000451
Guido van Rossum3f5da241990-12-20 15:06:42 +0000452static void
Fred Drake1b190b42000-07-09 05:40:56 +0000453frame_dealloc(PyFrameObject *f)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000454{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000455 PyObject **p, **valuestack;
456 PyCodeObject *co;
Guido van Rossum7582bfb1997-02-14 16:27:29 +0000457
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000458 PyObject_GC_UnTrack(f);
459 Py_TRASHCAN_SAFE_BEGIN(f)
460 /* Kill all local variables */
461 valuestack = f->f_valuestack;
462 for (p = f->f_localsplus; p < valuestack; p++)
463 Py_CLEAR(*p);
Guido van Rossum7582bfb1997-02-14 16:27:29 +0000464
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000465 /* Free stack */
466 if (f->f_stacktop != NULL) {
467 for (p = valuestack; p < f->f_stacktop; p++)
468 Py_XDECREF(*p);
469 }
Tim Petersa13131c2006-04-15 03:15:24 +0000470
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000471 Py_XDECREF(f->f_back);
472 Py_DECREF(f->f_builtins);
473 Py_DECREF(f->f_globals);
474 Py_CLEAR(f->f_locals);
475 Py_CLEAR(f->f_trace);
476 Py_CLEAR(f->f_exc_type);
477 Py_CLEAR(f->f_exc_value);
478 Py_CLEAR(f->f_exc_traceback);
Richard Jones7c88dcc2006-05-23 10:37:38 +0000479
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000480 co = f->f_code;
481 if (co->co_zombieframe == NULL)
482 co->co_zombieframe = f;
483 else if (numfree < PyFrame_MAXFREELIST) {
484 ++numfree;
485 f->f_back = free_list;
486 free_list = f;
487 }
488 else
489 PyObject_GC_Del(f);
Richard Jones7c88dcc2006-05-23 10:37:38 +0000490
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000491 Py_DECREF(co);
492 Py_TRASHCAN_SAFE_END(f)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000493}
494
Neil Schemenauer19cd2922001-07-12 13:27:11 +0000495static int
496frame_traverse(PyFrameObject *f, visitproc visit, void *arg)
497{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000498 PyObject **fastlocals, **p;
499 int i, slots;
Neil Schemenauer19cd2922001-07-12 13:27:11 +0000500
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000501 Py_VISIT(f->f_back);
502 Py_VISIT(f->f_code);
503 Py_VISIT(f->f_builtins);
504 Py_VISIT(f->f_globals);
505 Py_VISIT(f->f_locals);
506 Py_VISIT(f->f_trace);
507 Py_VISIT(f->f_exc_type);
508 Py_VISIT(f->f_exc_value);
509 Py_VISIT(f->f_exc_traceback);
Neil Schemenauer19cd2922001-07-12 13:27:11 +0000510
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000511 /* locals */
512 slots = f->f_code->co_nlocals + PyTuple_GET_SIZE(f->f_code->co_cellvars) + PyTuple_GET_SIZE(f->f_code->co_freevars);
513 fastlocals = f->f_localsplus;
514 for (i = slots; --i >= 0; ++fastlocals)
515 Py_VISIT(*fastlocals);
Neil Schemenauer19cd2922001-07-12 13:27:11 +0000516
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000517 /* stack */
518 if (f->f_stacktop != NULL) {
519 for (p = f->f_valuestack; p < f->f_stacktop; p++)
520 Py_VISIT(*p);
521 }
522 return 0;
Neil Schemenauer19cd2922001-07-12 13:27:11 +0000523}
524
525static void
526frame_clear(PyFrameObject *f)
527{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000528 PyObject **fastlocals, **p, **oldtop;
529 int i, slots;
Neil Schemenauer19cd2922001-07-12 13:27:11 +0000530
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000531 /* Before anything else, make sure that this frame is clearly marked
532 * as being defunct! Else, e.g., a generator reachable from this
533 * frame may also point to this frame, believe itself to still be
534 * active, and try cleaning up this frame again.
535 */
536 oldtop = f->f_stacktop;
537 f->f_stacktop = NULL;
Phillip J. Eby8ebb28d2006-04-15 01:02:17 +0000538
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000539 Py_CLEAR(f->f_exc_type);
540 Py_CLEAR(f->f_exc_value);
541 Py_CLEAR(f->f_exc_traceback);
542 Py_CLEAR(f->f_trace);
Neil Schemenauer19cd2922001-07-12 13:27:11 +0000543
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000544 /* locals */
545 slots = f->f_code->co_nlocals + PyTuple_GET_SIZE(f->f_code->co_cellvars) + PyTuple_GET_SIZE(f->f_code->co_freevars);
546 fastlocals = f->f_localsplus;
547 for (i = slots; --i >= 0; ++fastlocals)
548 Py_CLEAR(*fastlocals);
Neil Schemenauer19cd2922001-07-12 13:27:11 +0000549
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000550 /* stack */
551 if (oldtop != NULL) {
552 for (p = f->f_valuestack; p < oldtop; p++)
553 Py_CLEAR(*p);
554 }
Neil Schemenauer19cd2922001-07-12 13:27:11 +0000555}
556
Robert Schuppenies9be2ec12008-07-10 15:24:04 +0000557static PyObject *
558frame_sizeof(PyFrameObject *f)
559{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000560 Py_ssize_t res, extras, ncells, nfrees;
Robert Schuppenies9be2ec12008-07-10 15:24:04 +0000561
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000562 ncells = PyTuple_GET_SIZE(f->f_code->co_cellvars);
563 nfrees = PyTuple_GET_SIZE(f->f_code->co_freevars);
564 extras = f->f_code->co_stacksize + f->f_code->co_nlocals +
565 ncells + nfrees;
566 /* subtract one as it is already included in PyFrameObject */
567 res = sizeof(PyFrameObject) + (extras-1) * sizeof(PyObject *);
Robert Schuppenies9be2ec12008-07-10 15:24:04 +0000568
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000569 return PyInt_FromSsize_t(res);
Robert Schuppenies9be2ec12008-07-10 15:24:04 +0000570}
571
572PyDoc_STRVAR(sizeof__doc__,
573"F.__sizeof__() -> size of F in memory, in bytes");
574
575static PyMethodDef frame_methods[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000576 {"__sizeof__", (PyCFunction)frame_sizeof, METH_NOARGS,
577 sizeof__doc__},
578 {NULL, NULL} /* sentinel */
Robert Schuppenies9be2ec12008-07-10 15:24:04 +0000579};
Neil Schemenauer19cd2922001-07-12 13:27:11 +0000580
Guido van Rossum18752471997-04-29 14:49:28 +0000581PyTypeObject PyFrame_Type = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000582 PyVarObject_HEAD_INIT(&PyType_Type, 0)
583 "frame",
584 sizeof(PyFrameObject),
585 sizeof(PyObject *),
586 (destructor)frame_dealloc, /* tp_dealloc */
587 0, /* tp_print */
588 0, /* tp_getattr */
589 0, /* tp_setattr */
590 0, /* tp_compare */
591 0, /* tp_repr */
592 0, /* tp_as_number */
593 0, /* tp_as_sequence */
594 0, /* tp_as_mapping */
595 0, /* tp_hash */
596 0, /* tp_call */
597 0, /* tp_str */
598 PyObject_GenericGetAttr, /* tp_getattro */
599 PyObject_GenericSetAttr, /* tp_setattro */
600 0, /* tp_as_buffer */
601 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
602 0, /* tp_doc */
603 (traverseproc)frame_traverse, /* tp_traverse */
604 (inquiry)frame_clear, /* tp_clear */
605 0, /* tp_richcompare */
606 0, /* tp_weaklistoffset */
607 0, /* tp_iter */
608 0, /* tp_iternext */
609 frame_methods, /* tp_methods */
610 frame_memberlist, /* tp_members */
611 frame_getsetlist, /* tp_getset */
612 0, /* tp_base */
613 0, /* tp_dict */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000614};
615
Neal Norwitzc91ed402002-12-30 22:29:22 +0000616static PyObject *builtin_object;
617
Neal Norwitzb2501f42002-12-31 03:42:13 +0000618int _PyFrame_Init()
Neal Norwitzc91ed402002-12-30 22:29:22 +0000619{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000620 builtin_object = PyString_InternFromString("__builtins__");
621 if (builtin_object == NULL)
622 return 0;
623 return 1;
Neal Norwitzc91ed402002-12-30 22:29:22 +0000624}
625
Guido van Rossum18752471997-04-29 14:49:28 +0000626PyFrameObject *
Tim Petersa13131c2006-04-15 03:15:24 +0000627PyFrame_New(PyThreadState *tstate, PyCodeObject *code, PyObject *globals,
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000628 PyObject *locals)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000629{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000630 PyFrameObject *back = tstate->frame;
631 PyFrameObject *f;
632 PyObject *builtins;
633 Py_ssize_t i;
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000634
Michael W. Hudson69734a52002-08-19 16:54:08 +0000635#ifdef Py_DEBUG
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000636 if (code == NULL || globals == NULL || !PyDict_Check(globals) ||
637 (locals != NULL && !PyMapping_Check(locals))) {
638 PyErr_BadInternalCall();
639 return NULL;
640 }
Michael W. Hudson69734a52002-08-19 16:54:08 +0000641#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000642 if (back == NULL || back->f_globals != globals) {
643 builtins = PyDict_GetItem(globals, builtin_object);
644 if (builtins) {
645 if (PyModule_Check(builtins)) {
646 builtins = PyModule_GetDict(builtins);
647 assert(!builtins || PyDict_Check(builtins));
648 }
649 else if (!PyDict_Check(builtins))
650 builtins = NULL;
651 }
652 if (builtins == NULL) {
653 /* No builtins! Make up a minimal one
654 Give them 'None', at least. */
655 builtins = PyDict_New();
656 if (builtins == NULL ||
657 PyDict_SetItemString(
658 builtins, "None", Py_None) < 0)
659 return NULL;
660 }
661 else
662 Py_INCREF(builtins);
Jeremy Hyltonbd5cbf82003-02-05 22:39:29 +0000663
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000664 }
665 else {
666 /* If we share the globals, we share the builtins.
667 Save a lookup and a call. */
668 builtins = back->f_builtins;
669 assert(builtins != NULL && PyDict_Check(builtins));
670 Py_INCREF(builtins);
671 }
672 if (code->co_zombieframe != NULL) {
673 f = code->co_zombieframe;
674 code->co_zombieframe = NULL;
675 _Py_NewReference((PyObject *)f);
676 assert(f->f_code == code);
677 }
678 else {
679 Py_ssize_t extras, ncells, nfrees;
680 ncells = PyTuple_GET_SIZE(code->co_cellvars);
681 nfrees = PyTuple_GET_SIZE(code->co_freevars);
682 extras = code->co_stacksize + code->co_nlocals + ncells +
683 nfrees;
684 if (free_list == NULL) {
685 f = PyObject_GC_NewVar(PyFrameObject, &PyFrame_Type,
686 extras);
687 if (f == NULL) {
688 Py_DECREF(builtins);
689 return NULL;
690 }
691 }
692 else {
693 assert(numfree > 0);
694 --numfree;
695 f = free_list;
696 free_list = free_list->f_back;
697 if (Py_SIZE(f) < extras) {
698 f = PyObject_GC_Resize(PyFrameObject, f, extras);
699 if (f == NULL) {
700 Py_DECREF(builtins);
701 return NULL;
702 }
703 }
704 _Py_NewReference((PyObject *)f);
705 }
Richard Jones7c88dcc2006-05-23 10:37:38 +0000706
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000707 f->f_code = code;
708 extras = code->co_nlocals + ncells + nfrees;
709 f->f_valuestack = f->f_localsplus + extras;
710 for (i=0; i<extras; i++)
711 f->f_localsplus[i] = NULL;
712 f->f_locals = NULL;
713 f->f_trace = NULL;
714 f->f_exc_type = f->f_exc_value = f->f_exc_traceback = NULL;
715 }
716 f->f_stacktop = f->f_valuestack;
717 f->f_builtins = builtins;
718 Py_XINCREF(back);
719 f->f_back = back;
720 Py_INCREF(code);
721 Py_INCREF(globals);
722 f->f_globals = globals;
723 /* Most functions have CO_NEWLOCALS and CO_OPTIMIZED set. */
724 if ((code->co_flags & (CO_NEWLOCALS | CO_OPTIMIZED)) ==
725 (CO_NEWLOCALS | CO_OPTIMIZED))
726 ; /* f_locals = NULL; will be set by PyFrame_FastToLocals() */
727 else if (code->co_flags & CO_NEWLOCALS) {
728 locals = PyDict_New();
729 if (locals == NULL) {
730 Py_DECREF(f);
731 return NULL;
732 }
733 f->f_locals = locals;
734 }
735 else {
736 if (locals == NULL)
737 locals = globals;
738 Py_INCREF(locals);
739 f->f_locals = locals;
740 }
741 f->f_tstate = tstate;
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000742
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000743 f->f_lasti = -1;
744 f->f_lineno = code->co_firstlineno;
745 f->f_iblock = 0;
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000746
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000747 _PyObject_GC_TRACK(f);
748 return f;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000749}
750
Guido van Rossum3f5da241990-12-20 15:06:42 +0000751/* Block management */
752
753void
Fred Drake1b190b42000-07-09 05:40:56 +0000754PyFrame_BlockSetup(PyFrameObject *f, int type, int handler, int level)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000755{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000756 PyTryBlock *b;
757 if (f->f_iblock >= CO_MAXBLOCKS)
758 Py_FatalError("XXX block stack overflow");
759 b = &f->f_blockstack[f->f_iblock++];
760 b->b_type = type;
761 b->b_level = level;
762 b->b_handler = handler;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000763}
764
Guido van Rossum18752471997-04-29 14:49:28 +0000765PyTryBlock *
Fred Drake1b190b42000-07-09 05:40:56 +0000766PyFrame_BlockPop(PyFrameObject *f)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000767{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000768 PyTryBlock *b;
769 if (f->f_iblock <= 0)
770 Py_FatalError("XXX block stack underflow");
771 b = &f->f_blockstack[--f->f_iblock];
772 return b;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000773}
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000774
Jeremy Hylton759410b2007-02-26 18:41:18 +0000775/* Convert between "fast" version of locals and dictionary version.
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000776
777 map and values are input arguments. map is a tuple of strings.
Jeremy Hylton759410b2007-02-26 18:41:18 +0000778 values is an array of PyObject*. At index i, map[i] is the name of
779 the variable with value values[i]. The function copies the first
780 nmap variable from map/values into dict. If values[i] is NULL,
781 the variable is deleted from dict.
782
783 If deref is true, then the values being copied are cell variables
784 and the value is extracted from the cell variable before being put
785 in dict.
786
787 Exceptions raised while modifying the dict are silently ignored,
788 because there is no good way to report them.
789 */
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000790
Guido van Rossumf68d8e52001-04-14 17:55:09 +0000791static void
Martin v. Löwis18e16552006-02-15 17:27:45 +0000792map_to_dict(PyObject *map, Py_ssize_t nmap, PyObject *dict, PyObject **values,
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000793 int deref)
Jeremy Hylton220ae7c2001-03-21 16:43:47 +0000794{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000795 Py_ssize_t j;
796 assert(PyTuple_Check(map));
797 assert(PyDict_Check(dict));
798 assert(PyTuple_Size(map) >= nmap);
799 for (j = nmap; --j >= 0; ) {
800 PyObject *key = PyTuple_GET_ITEM(map, j);
801 PyObject *value = values[j];
802 assert(PyString_Check(key));
803 if (deref) {
804 assert(PyCell_Check(value));
805 value = PyCell_GET(value);
806 }
807 if (value == NULL) {
808 if (PyObject_DelItem(dict, key) != 0)
809 PyErr_Clear();
810 }
811 else {
812 if (PyObject_SetItem(dict, key, value) != 0)
813 PyErr_Clear();
814 }
815 }
Jeremy Hylton220ae7c2001-03-21 16:43:47 +0000816}
817
Jeremy Hylton759410b2007-02-26 18:41:18 +0000818/* Copy values from the "locals" dict into the fast locals.
819
820 dict is an input argument containing string keys representing
821 variables names and arbitrary PyObject* as values.
822
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000823 map and values are input arguments. map is a tuple of strings.
Jeremy Hylton759410b2007-02-26 18:41:18 +0000824 values is an array of PyObject*. At index i, map[i] is the name of
825 the variable with value values[i]. The function copies the first
826 nmap variable from map/values into dict. If values[i] is NULL,
827 the variable is deleted from dict.
828
829 If deref is true, then the values being copied are cell variables
830 and the value is extracted from the cell variable before being put
831 in dict. If clear is true, then variables in map but not in dict
832 are set to NULL in map; if clear is false, variables missing in
833 dict are ignored.
834
835 Exceptions raised while modifying the dict are silently ignored,
836 because there is no good way to report them.
837*/
838
Guido van Rossum6b356e72001-04-14 17:55:41 +0000839static void
Martin v. Löwis18e16552006-02-15 17:27:45 +0000840dict_to_map(PyObject *map, Py_ssize_t nmap, PyObject *dict, PyObject **values,
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000841 int deref, int clear)
Jeremy Hylton220ae7c2001-03-21 16:43:47 +0000842{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000843 Py_ssize_t j;
844 assert(PyTuple_Check(map));
845 assert(PyDict_Check(dict));
846 assert(PyTuple_Size(map) >= nmap);
847 for (j = nmap; --j >= 0; ) {
848 PyObject *key = PyTuple_GET_ITEM(map, j);
849 PyObject *value = PyObject_GetItem(dict, key);
850 assert(PyString_Check(key));
851 /* We only care about NULLs if clear is true. */
852 if (value == NULL) {
853 PyErr_Clear();
854 if (!clear)
855 continue;
856 }
857 if (deref) {
858 assert(PyCell_Check(values[j]));
859 if (PyCell_GET(values[j]) != value) {
860 if (PyCell_Set(values[j], value) < 0)
861 PyErr_Clear();
862 }
863 } else if (values[j] != value) {
864 Py_XINCREF(value);
Serhiy Storchakabc62af12016-04-06 09:51:18 +0300865 Py_XSETREF(values[j], value);
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000866 }
867 Py_XDECREF(value);
868 }
Jeremy Hylton220ae7c2001-03-21 16:43:47 +0000869}
Jeremy Hylton2b724da2001-01-29 22:51:52 +0000870
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000871void
Fred Drake1b190b42000-07-09 05:40:56 +0000872PyFrame_FastToLocals(PyFrameObject *f)
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000873{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000874 /* Merge fast locals into f->f_locals */
875 PyObject *locals, *map;
876 PyObject **fast;
877 PyObject *error_type, *error_value, *error_traceback;
878 PyCodeObject *co;
879 Py_ssize_t j;
880 int ncells, nfreevars;
881 if (f == NULL)
882 return;
883 locals = f->f_locals;
884 if (locals == NULL) {
885 locals = f->f_locals = PyDict_New();
886 if (locals == NULL) {
887 PyErr_Clear(); /* Can't report it :-( */
888 return;
889 }
890 }
891 co = f->f_code;
892 map = co->co_varnames;
893 if (!PyTuple_Check(map))
894 return;
895 PyErr_Fetch(&error_type, &error_value, &error_traceback);
896 fast = f->f_localsplus;
897 j = PyTuple_GET_SIZE(map);
898 if (j > co->co_nlocals)
899 j = co->co_nlocals;
900 if (co->co_nlocals)
901 map_to_dict(map, j, locals, fast, 0);
902 ncells = PyTuple_GET_SIZE(co->co_cellvars);
903 nfreevars = PyTuple_GET_SIZE(co->co_freevars);
904 if (ncells || nfreevars) {
905 map_to_dict(co->co_cellvars, ncells,
906 locals, fast + co->co_nlocals, 1);
907 /* If the namespace is unoptimized, then one of the
908 following cases applies:
909 1. It does not contain free variables, because it
910 uses import * or is a top-level namespace.
911 2. It is a class namespace.
912 We don't want to accidentally copy free variables
913 into the locals dict used by the class.
914 */
915 if (co->co_flags & CO_OPTIMIZED) {
916 map_to_dict(co->co_freevars, nfreevars,
917 locals, fast + co->co_nlocals + ncells, 1);
918 }
919 }
920 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000921}
922
923void
Fred Drake1b190b42000-07-09 05:40:56 +0000924PyFrame_LocalsToFast(PyFrameObject *f, int clear)
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000925{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000926 /* Merge f->f_locals into fast locals */
927 PyObject *locals, *map;
928 PyObject **fast;
929 PyObject *error_type, *error_value, *error_traceback;
930 PyCodeObject *co;
931 Py_ssize_t j;
932 int ncells, nfreevars;
933 if (f == NULL)
934 return;
935 locals = f->f_locals;
936 co = f->f_code;
937 map = co->co_varnames;
938 if (locals == NULL)
939 return;
940 if (!PyTuple_Check(map))
941 return;
942 PyErr_Fetch(&error_type, &error_value, &error_traceback);
943 fast = f->f_localsplus;
944 j = PyTuple_GET_SIZE(map);
945 if (j > co->co_nlocals)
946 j = co->co_nlocals;
947 if (co->co_nlocals)
948 dict_to_map(co->co_varnames, j, locals, fast, 0, clear);
949 ncells = PyTuple_GET_SIZE(co->co_cellvars);
950 nfreevars = PyTuple_GET_SIZE(co->co_freevars);
951 if (ncells || nfreevars) {
952 dict_to_map(co->co_cellvars, ncells,
953 locals, fast + co->co_nlocals, 1, clear);
954 /* Same test as in PyFrame_FastToLocals() above. */
955 if (co->co_flags & CO_OPTIMIZED) {
956 dict_to_map(co->co_freevars, nfreevars,
957 locals, fast + co->co_nlocals + ncells, 1,
958 clear);
959 }
960 }
961 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000962}
Guido van Rossum404b95d1997-08-05 02:09:46 +0000963
964/* Clear out the free list */
Christian Heimes3b718a72008-02-14 12:47:33 +0000965int
966PyFrame_ClearFreeList(void)
Guido van Rossum404b95d1997-08-05 02:09:46 +0000967{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000968 int freelist_size = numfree;
969
970 while (free_list != NULL) {
971 PyFrameObject *f = free_list;
972 free_list = free_list->f_back;
973 PyObject_GC_Del(f);
974 --numfree;
975 }
976 assert(numfree == 0);
977 return freelist_size;
Christian Heimes3b718a72008-02-14 12:47:33 +0000978}
979
980void
981PyFrame_Fini(void)
982{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000983 (void)PyFrame_ClearFreeList();
984 Py_XDECREF(builtin_object);
985 builtin_object = NULL;
Guido van Rossum404b95d1997-08-05 02:09:46 +0000986}