Issue #3680: Reference cycles created through a dict, set or deque iterator did not...
[python.git] / Objects / frameobject.c
blob1ea586feea1c58a9b6e2bc3f6f30832071d61d2b
1 /* Frame object implementation */
3 #include "Python.h"
5 #include "code.h"
6 #include "frameobject.h"
7 #include "opcode.h"
8 #include "structmember.h"
10 #undef MIN
11 #undef MAX
12 #define MIN(a, b) ((a) < (b) ? (a) : (b))
13 #define MAX(a, b) ((a) > (b) ? (a) : (b))
15 #define OFF(x) offsetof(PyFrameObject, x)
17 static PyMemberDef frame_memberlist[] = {
18 {"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 */
26 #define WARN_GET_SET(NAME) \
27 static 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 } \
36 static 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; \
50 WARN_GET_SET(f_exc_traceback)
51 WARN_GET_SET(f_exc_type)
52 WARN_GET_SET(f_exc_value)
55 static PyObject *
56 frame_getlocals(PyFrameObject *f, void *closure)
58 PyFrame_FastToLocals(f);
59 Py_INCREF(f->f_locals);
60 return f->f_locals;
63 static PyObject *
64 frame_getlineno(PyFrameObject *f, void *closure)
66 int lineno;
68 if (f->f_trace)
69 lineno = f->f_lineno;
70 else
71 lineno = PyCode_Addr2Line(f->f_code, f->f_lasti);
73 return PyInt_FromLong(lineno);
76 /* Setter for f_lineno - you can set f_lineno from within a trace function in
77 * order to jump to a given line of code, subject to some restrictions. Most
78 * 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:
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.
91 static int
92 frame_setlineno(PyFrameObject *f, PyObject* p_new_lineno)
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 */
97 unsigned char *code = NULL; /* The bytecode for the frame... */
98 Py_ssize_t code_len = 0; /* ...and its length */
99 char *lnotab = NULL; /* Iterating over co_lnotab */
100 Py_ssize_t lnotab_len = 0; /* (ditto) */
101 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) */
114 unsigned char setup_op = 0; /* (ditto) */
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;
123 /* You can only do this from within a trace function, not via
124 * _getframe or similar hackery. */
125 if (!f->f_trace)
127 PyErr_Format(PyExc_ValueError,
128 "f_lineno can only be set by a trace function");
129 return -1;
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;
141 /* Find the bytecode offset for the start of the given line, or the
142 * first code-owning line after it. */
143 PyString_AsStringAndSize(f->f_code->co_lnotab, &lnotab, &lnotab_len);
144 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;
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;
165 /* We're now ready to look at the bytecode. */
166 PyString_AsStringAndSize(f->f_code->co_code, (char **)&code, &code_len);
167 min_addr = MIN(new_lasti, f->f_lasti);
168 max_addr = MAX(new_lasti, f->f_lasti);
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;
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
188 * up. So we walk the bytecode, maintaining a simulated blockstack.
189 * 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;
210 case POP_BLOCK:
211 assert(blockstack_top > 0);
212 setup_op = code[blockstack[blockstack_top-1]];
213 if (setup_op == SETUP_FINALLY) {
214 in_finally[blockstack_top-1] = 1;
216 else {
217 blockstack_top--;
219 break;
221 case END_FINALLY:
222 /* Ignore END_FINALLYs for SETUP_EXCEPTs - they exist
223 * in the bytecode but don't correspond to an actual
224 * '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--;
232 break;
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;
248 if (setup_addr != -1) {
249 if (addr == new_lasti) {
250 new_lasti_setup_addr = setup_addr;
253 if (addr == f->f_lasti) {
254 f_lasti_setup_addr = setup_addr;
259 if (op >= HAVE_ARGUMENT) {
260 addr += 2;
264 /* Verify that the blockstack tracking code didn't get lost. */
265 assert(blockstack_top == 0);
267 /* After all that, are we jumping into / out of a 'finally' block? */
268 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;
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;
293 case POP_BLOCK:
294 delta_iblock--;
295 break;
298 min_delta_iblock = MIN(min_delta_iblock, delta_iblock);
300 if (op >= HAVE_ARGUMENT) {
301 addr += 2;
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;
311 else {
312 /* Backwards jump. */
313 new_iblock = f->f_iblock - delta_iblock;
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;
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);
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;
338 static PyObject *
339 frame_gettrace(PyFrameObject *f, void *closure)
341 PyObject* trace = f->f_trace;
343 if (trace == NULL)
344 trace = Py_None;
346 Py_INCREF(trace);
348 return trace;
351 static int
352 frame_settrace(PyFrameObject *f, PyObject* v, void *closure)
354 /* We rely on f_lineno being accurate when f_trace is set. */
356 PyObject* old_value = f->f_trace;
358 Py_XINCREF(v);
359 f->f_trace = v;
361 if (v != NULL)
362 f->f_lineno = PyCode_Addr2Line(f->f_code, f->f_lasti);
364 Py_XDECREF(old_value);
366 return 0;
369 static PyObject *
370 frame_getrestricted(PyFrameObject *f, void *closure)
372 return PyBool_FromLong(PyFrame_IsRestricted(f));
375 static PyGetSetDef frame_getsetlist[] = {
376 {"f_locals", (getter)frame_getlocals, NULL, NULL},
377 {"f_lineno", (getter)frame_getlineno,
378 (setter)frame_setlineno, NULL},
379 {"f_trace", (getter)frame_gettrace, (setter)frame_settrace, NULL},
380 {"f_restricted",(getter)frame_getrestricted,NULL, NULL},
381 {"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},
390 /* Stack frames are allocated and deallocated at a considerable rate.
391 In an attempt to improve the speed of function calls, we:
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.
400 In zombie mode, no field of PyFrameObject holds a reference, but
401 the following fields are still valid:
403 * ob_type, ob_size, f_code, f_valuestack;
405 * f_locals, f_trace,
406 f_exc_type, f_exc_value, f_exc_traceback are NULL;
408 * f_localsplus does not require re-allocation and
409 the local variables in f_localsplus are NULL.
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:
415 ob_type == &Frametype
416 f_back next item on free list, or NULL
417 f_stacksize size of value stack
418 ob_size size of localsplus
419 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.
428 Later, PyFrame_MAXFREELIST was added to bound the # of frames saved on
429 free_list. Else programs creating lots of cyclic trash involving
430 frames could provoke free_list into growing without bound.
433 static PyFrameObject *free_list = NULL;
434 static int numfree = 0; /* number of frames currently in free_list */
435 /* max value for numfree */
436 #define PyFrame_MAXFREELIST 200
438 static void
439 frame_dealloc(PyFrameObject *f)
441 PyObject **p, **valuestack;
442 PyCodeObject *co;
444 PyObject_GC_UnTrack(f);
445 Py_TRASHCAN_SAFE_BEGIN(f)
446 /* Kill all local variables */
447 valuestack = f->f_valuestack;
448 for (p = f->f_localsplus; p < valuestack; p++)
449 Py_CLEAR(*p);
451 /* Free stack */
452 if (f->f_stacktop != NULL) {
453 for (p = valuestack; p < f->f_stacktop; p++)
454 Py_XDECREF(*p);
457 Py_XDECREF(f->f_back);
458 Py_DECREF(f->f_builtins);
459 Py_DECREF(f->f_globals);
460 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);
466 co = f->f_code;
467 if (co->co_zombieframe == NULL)
468 co->co_zombieframe = f;
469 else if (numfree < PyFrame_MAXFREELIST) {
470 ++numfree;
471 f->f_back = free_list;
472 free_list = f;
474 else
475 PyObject_GC_Del(f);
477 Py_DECREF(co);
478 Py_TRASHCAN_SAFE_END(f)
481 static int
482 frame_traverse(PyFrameObject *f, visitproc visit, void *arg)
484 PyObject **fastlocals, **p;
485 int i, slots;
487 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);
497 /* locals */
498 slots = f->f_code->co_nlocals + PyTuple_GET_SIZE(f->f_code->co_cellvars) + PyTuple_GET_SIZE(f->f_code->co_freevars);
499 fastlocals = f->f_localsplus;
500 for (i = slots; --i >= 0; ++fastlocals)
501 Py_VISIT(*fastlocals);
503 /* stack */
504 if (f->f_stacktop != NULL) {
505 for (p = f->f_valuestack; p < f->f_stacktop; p++)
506 Py_VISIT(*p);
508 return 0;
511 static void
512 frame_clear(PyFrameObject *f)
514 PyObject **fastlocals, **p, **oldtop;
515 int i, slots;
517 /* Before anything else, make sure that this frame is clearly marked
518 * 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.
522 oldtop = f->f_stacktop;
523 f->f_stacktop = NULL;
525 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);
530 /* locals */
531 slots = f->f_code->co_nlocals + PyTuple_GET_SIZE(f->f_code->co_cellvars) + PyTuple_GET_SIZE(f->f_code->co_freevars);
532 fastlocals = f->f_localsplus;
533 for (i = slots; --i >= 0; ++fastlocals)
534 Py_CLEAR(*fastlocals);
536 /* stack */
537 if (oldtop != NULL) {
538 for (p = f->f_valuestack; p < oldtop; p++)
539 Py_CLEAR(*p);
543 static PyObject *
544 frame_sizeof(PyFrameObject *f)
546 Py_ssize_t res, extras, ncells, nfrees;
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;
552 /* subtract one as it is already included in PyFrameObject */
553 res = sizeof(PyFrameObject) + (extras-1) * sizeof(PyObject *);
555 return PyInt_FromSsize_t(res);
558 PyDoc_STRVAR(sizeof__doc__,
559 "F.__sizeof__() -> size of F in memory, in bytes");
561 static PyMethodDef frame_methods[] = {
562 {"__sizeof__", (PyCFunction)frame_sizeof, METH_NOARGS,
563 sizeof__doc__},
564 {NULL, NULL} /* sentinel */
567 PyTypeObject PyFrame_Type = {
568 PyVarObject_HEAD_INIT(&PyType_Type, 0)
569 "frame",
570 sizeof(PyFrameObject),
571 sizeof(PyObject *),
572 (destructor)frame_dealloc, /* tp_dealloc */
573 0, /* tp_print */
574 0, /* tp_getattr */
575 0, /* tp_setattr */
576 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 */
584 PyObject_GenericGetAttr, /* tp_getattro */
585 PyObject_GenericSetAttr, /* tp_setattro */
586 0, /* tp_as_buffer */
587 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
588 0, /* tp_doc */
589 (traverseproc)frame_traverse, /* tp_traverse */
590 (inquiry)frame_clear, /* tp_clear */
591 0, /* tp_richcompare */
592 0, /* tp_weaklistoffset */
593 0, /* tp_iter */
594 0, /* tp_iternext */
595 frame_methods, /* tp_methods */
596 frame_memberlist, /* tp_members */
597 frame_getsetlist, /* tp_getset */
598 0, /* tp_base */
599 0, /* tp_dict */
602 static PyObject *builtin_object;
604 int _PyFrame_Init()
606 builtin_object = PyString_InternFromString("__builtins__");
607 return (builtin_object != NULL);
610 PyFrameObject *
611 PyFrame_New(PyThreadState *tstate, PyCodeObject *code, PyObject *globals,
612 PyObject *locals)
614 PyFrameObject *back = tstate->frame;
615 PyFrameObject *f;
616 PyObject *builtins;
617 Py_ssize_t i;
619 #ifdef Py_DEBUG
620 if (code == NULL || globals == NULL || !PyDict_Check(globals) ||
621 (locals != NULL && !PyMapping_Check(locals))) {
622 PyErr_BadInternalCall();
623 return NULL;
625 #endif
626 if (back == NULL || back->f_globals != globals) {
627 builtins = PyDict_GetItem(globals, builtin_object);
628 if (builtins) {
629 if (PyModule_Check(builtins)) {
630 builtins = PyModule_GetDict(builtins);
631 assert(!builtins || PyDict_Check(builtins));
633 else if (!PyDict_Check(builtins))
634 builtins = NULL;
636 if (builtins == NULL) {
637 /* No builtins! Make up a minimal one
638 Give them 'None', at least. */
639 builtins = PyDict_New();
640 if (builtins == NULL ||
641 PyDict_SetItemString(
642 builtins, "None", Py_None) < 0)
643 return NULL;
645 else
646 Py_INCREF(builtins);
649 else {
650 /* If we share the globals, we share the builtins.
651 Save a lookup and a call. */
652 builtins = back->f_builtins;
653 assert(builtins != NULL && PyDict_Check(builtins));
654 Py_INCREF(builtins);
656 if (code->co_zombieframe != NULL) {
657 f = code->co_zombieframe;
658 code->co_zombieframe = NULL;
659 _Py_NewReference((PyObject *)f);
660 assert(f->f_code == code);
662 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;
676 else {
677 assert(numfree > 0);
678 --numfree;
679 f = free_list;
680 free_list = free_list->f_back;
681 if (Py_SIZE(f) < extras) {
682 f = PyObject_GC_Resize(PyFrameObject, f, extras);
683 if (f == NULL) {
684 Py_DECREF(builtins);
685 return NULL;
688 _Py_NewReference((PyObject *)f);
691 f->f_code = code;
692 extras = code->co_nlocals + ncells + nfrees;
693 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;
698 f->f_exc_type = f->f_exc_value = f->f_exc_traceback = NULL;
700 f->f_stacktop = f->f_valuestack;
701 f->f_builtins = builtins;
702 Py_XINCREF(back);
703 f->f_back = back;
704 Py_INCREF(code);
705 Py_INCREF(globals);
706 f->f_globals = globals;
707 /* Most functions have CO_NEWLOCALS and CO_OPTIMIZED set. */
708 if ((code->co_flags & (CO_NEWLOCALS | CO_OPTIMIZED)) ==
709 (CO_NEWLOCALS | CO_OPTIMIZED))
710 ; /* f_locals = NULL; will be set by PyFrame_FastToLocals() */
711 else if (code->co_flags & CO_NEWLOCALS) {
712 locals = PyDict_New();
713 if (locals == NULL) {
714 Py_DECREF(f);
715 return NULL;
717 f->f_locals = locals;
719 else {
720 if (locals == NULL)
721 locals = globals;
722 Py_INCREF(locals);
723 f->f_locals = locals;
725 f->f_tstate = tstate;
727 f->f_lasti = -1;
728 f->f_lineno = code->co_firstlineno;
729 f->f_iblock = 0;
731 _PyObject_GC_TRACK(f);
732 return f;
735 /* Block management */
737 void
738 PyFrame_BlockSetup(PyFrameObject *f, int type, int handler, int level)
740 PyTryBlock *b;
741 if (f->f_iblock >= CO_MAXBLOCKS)
742 Py_FatalError("XXX block stack overflow");
743 b = &f->f_blockstack[f->f_iblock++];
744 b->b_type = type;
745 b->b_level = level;
746 b->b_handler = handler;
749 PyTryBlock *
750 PyFrame_BlockPop(PyFrameObject *f)
752 PyTryBlock *b;
753 if (f->f_iblock <= 0)
754 Py_FatalError("XXX block stack underflow");
755 b = &f->f_blockstack[--f->f_iblock];
756 return b;
759 /* Convert between "fast" version of locals and dictionary version.
761 map and values are input arguments. map is a tuple of strings.
762 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.
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.
771 Exceptions raised while modifying the dict are silently ignored,
772 because there is no good way to report them.
775 static void
776 map_to_dict(PyObject *map, Py_ssize_t nmap, PyObject *dict, PyObject **values,
777 int deref)
779 Py_ssize_t j;
780 assert(PyTuple_Check(map));
781 assert(PyDict_Check(dict));
782 assert(PyTuple_Size(map) >= nmap);
783 for (j = nmap; --j >= 0; ) {
784 PyObject *key = PyTuple_GET_ITEM(map, j);
785 PyObject *value = values[j];
786 assert(PyString_Check(key));
787 if (deref) {
788 assert(PyCell_Check(value));
789 value = PyCell_GET(value);
791 if (value == NULL) {
792 if (PyObject_DelItem(dict, key) != 0)
793 PyErr_Clear();
795 else {
796 if (PyObject_SetItem(dict, key, value) != 0)
797 PyErr_Clear();
802 /* Copy values from the "locals" dict into the fast locals.
804 dict is an input argument containing string keys representing
805 variables names and arbitrary PyObject* as values.
807 map and values are input arguments. map is a tuple of strings.
808 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.
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.
819 Exceptions raised while modifying the dict are silently ignored,
820 because there is no good way to report them.
823 static void
824 dict_to_map(PyObject *map, Py_ssize_t nmap, PyObject *dict, PyObject **values,
825 int deref, int clear)
827 Py_ssize_t j;
828 assert(PyTuple_Check(map));
829 assert(PyDict_Check(dict));
830 assert(PyTuple_Size(map) >= nmap);
831 for (j = nmap; --j >= 0; ) {
832 PyObject *key = PyTuple_GET_ITEM(map, j);
833 PyObject *value = PyObject_GetItem(dict, key);
834 assert(PyString_Check(key));
835 /* We only care about NULLs if clear is true. */
836 if (value == NULL) {
837 PyErr_Clear();
838 if (!clear)
839 continue;
841 if (deref) {
842 assert(PyCell_Check(values[j]));
843 if (PyCell_GET(values[j]) != value) {
844 if (PyCell_Set(values[j], value) < 0)
845 PyErr_Clear();
847 } else if (values[j] != value) {
848 Py_XINCREF(value);
849 Py_XDECREF(values[j]);
850 values[j] = value;
852 Py_XDECREF(value);
856 void
857 PyFrame_FastToLocals(PyFrameObject *f)
859 /* Merge fast locals into f->f_locals */
860 PyObject *locals, *map;
861 PyObject **fast;
862 PyObject *error_type, *error_value, *error_traceback;
863 PyCodeObject *co;
864 Py_ssize_t j;
865 int ncells, nfreevars;
866 if (f == NULL)
867 return;
868 locals = f->f_locals;
869 if (locals == NULL) {
870 locals = f->f_locals = PyDict_New();
871 if (locals == NULL) {
872 PyErr_Clear(); /* Can't report it :-( */
873 return;
876 co = f->f_code;
877 map = co->co_varnames;
878 if (!PyTuple_Check(map))
879 return;
880 PyErr_Fetch(&error_type, &error_value, &error_traceback);
881 fast = f->f_localsplus;
882 j = PyTuple_GET_SIZE(map);
883 if (j > co->co_nlocals)
884 j = co->co_nlocals;
885 if (co->co_nlocals)
886 map_to_dict(map, j, locals, fast, 0);
887 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);
892 /* 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.
900 if (co->co_flags & CO_OPTIMIZED) {
901 map_to_dict(co->co_freevars, nfreevars,
902 locals, fast + co->co_nlocals + ncells, 1);
905 PyErr_Restore(error_type, error_value, error_traceback);
908 void
909 PyFrame_LocalsToFast(PyFrameObject *f, int clear)
911 /* Merge f->f_locals into fast locals */
912 PyObject *locals, *map;
913 PyObject **fast;
914 PyObject *error_type, *error_value, *error_traceback;
915 PyCodeObject *co;
916 Py_ssize_t j;
917 int ncells, nfreevars;
918 if (f == NULL)
919 return;
920 locals = f->f_locals;
921 co = f->f_code;
922 map = co->co_varnames;
923 if (locals == NULL)
924 return;
925 if (!PyTuple_Check(map))
926 return;
927 PyErr_Fetch(&error_type, &error_value, &error_traceback);
928 fast = f->f_localsplus;
929 j = PyTuple_GET_SIZE(map);
930 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);
939 /* 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);
946 PyErr_Restore(error_type, error_value, error_traceback);
949 /* Clear out the free list */
951 PyFrame_ClearFreeList(void)
953 int freelist_size = numfree;
955 while (free_list != NULL) {
956 PyFrameObject *f = free_list;
957 free_list = free_list->f_back;
958 PyObject_GC_Del(f);
959 --numfree;
961 assert(numfree == 0);
962 return freelist_size;
965 void
966 PyFrame_Fini(void)
968 (void)PyFrame_ClearFreeList();
969 Py_XDECREF(builtin_object);
970 builtin_object = NULL;