fix strange errors when setting attributes on tracebacks #4034
[python.git] / Objects / frameobject.c
blobc8cf71b34c0b554efd96d5bc9f07b9825c2aebeb
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 if (builtin_object == NULL)
608 return 0;
610 Traceback objects are not created the normal way (through calling the
611 type), so PyType_Ready has to be called here.
613 if (PyType_Ready(&PyTraceBack_Type)) {
614 Py_DECREF(builtin_object);
615 return 0;
617 return 1;
620 PyFrameObject *
621 PyFrame_New(PyThreadState *tstate, PyCodeObject *code, PyObject *globals,
622 PyObject *locals)
624 PyFrameObject *back = tstate->frame;
625 PyFrameObject *f;
626 PyObject *builtins;
627 Py_ssize_t i;
629 #ifdef Py_DEBUG
630 if (code == NULL || globals == NULL || !PyDict_Check(globals) ||
631 (locals != NULL && !PyMapping_Check(locals))) {
632 PyErr_BadInternalCall();
633 return NULL;
635 #endif
636 if (back == NULL || back->f_globals != globals) {
637 builtins = PyDict_GetItem(globals, builtin_object);
638 if (builtins) {
639 if (PyModule_Check(builtins)) {
640 builtins = PyModule_GetDict(builtins);
641 assert(!builtins || PyDict_Check(builtins));
643 else if (!PyDict_Check(builtins))
644 builtins = NULL;
646 if (builtins == NULL) {
647 /* No builtins! Make up a minimal one
648 Give them 'None', at least. */
649 builtins = PyDict_New();
650 if (builtins == NULL ||
651 PyDict_SetItemString(
652 builtins, "None", Py_None) < 0)
653 return NULL;
655 else
656 Py_INCREF(builtins);
659 else {
660 /* If we share the globals, we share the builtins.
661 Save a lookup and a call. */
662 builtins = back->f_builtins;
663 assert(builtins != NULL && PyDict_Check(builtins));
664 Py_INCREF(builtins);
666 if (code->co_zombieframe != NULL) {
667 f = code->co_zombieframe;
668 code->co_zombieframe = NULL;
669 _Py_NewReference((PyObject *)f);
670 assert(f->f_code == code);
672 else {
673 Py_ssize_t extras, ncells, nfrees;
674 ncells = PyTuple_GET_SIZE(code->co_cellvars);
675 nfrees = PyTuple_GET_SIZE(code->co_freevars);
676 extras = code->co_stacksize + code->co_nlocals + ncells +
677 nfrees;
678 if (free_list == NULL) {
679 f = PyObject_GC_NewVar(PyFrameObject, &PyFrame_Type,
680 extras);
681 if (f == NULL) {
682 Py_DECREF(builtins);
683 return NULL;
686 else {
687 assert(numfree > 0);
688 --numfree;
689 f = free_list;
690 free_list = free_list->f_back;
691 if (Py_SIZE(f) < extras) {
692 f = PyObject_GC_Resize(PyFrameObject, f, extras);
693 if (f == NULL) {
694 Py_DECREF(builtins);
695 return NULL;
698 _Py_NewReference((PyObject *)f);
701 f->f_code = code;
702 extras = code->co_nlocals + ncells + nfrees;
703 f->f_valuestack = f->f_localsplus + extras;
704 for (i=0; i<extras; i++)
705 f->f_localsplus[i] = NULL;
706 f->f_locals = NULL;
707 f->f_trace = NULL;
708 f->f_exc_type = f->f_exc_value = f->f_exc_traceback = NULL;
710 f->f_stacktop = f->f_valuestack;
711 f->f_builtins = builtins;
712 Py_XINCREF(back);
713 f->f_back = back;
714 Py_INCREF(code);
715 Py_INCREF(globals);
716 f->f_globals = globals;
717 /* Most functions have CO_NEWLOCALS and CO_OPTIMIZED set. */
718 if ((code->co_flags & (CO_NEWLOCALS | CO_OPTIMIZED)) ==
719 (CO_NEWLOCALS | CO_OPTIMIZED))
720 ; /* f_locals = NULL; will be set by PyFrame_FastToLocals() */
721 else if (code->co_flags & CO_NEWLOCALS) {
722 locals = PyDict_New();
723 if (locals == NULL) {
724 Py_DECREF(f);
725 return NULL;
727 f->f_locals = locals;
729 else {
730 if (locals == NULL)
731 locals = globals;
732 Py_INCREF(locals);
733 f->f_locals = locals;
735 f->f_tstate = tstate;
737 f->f_lasti = -1;
738 f->f_lineno = code->co_firstlineno;
739 f->f_iblock = 0;
741 _PyObject_GC_TRACK(f);
742 return f;
745 /* Block management */
747 void
748 PyFrame_BlockSetup(PyFrameObject *f, int type, int handler, int level)
750 PyTryBlock *b;
751 if (f->f_iblock >= CO_MAXBLOCKS)
752 Py_FatalError("XXX block stack overflow");
753 b = &f->f_blockstack[f->f_iblock++];
754 b->b_type = type;
755 b->b_level = level;
756 b->b_handler = handler;
759 PyTryBlock *
760 PyFrame_BlockPop(PyFrameObject *f)
762 PyTryBlock *b;
763 if (f->f_iblock <= 0)
764 Py_FatalError("XXX block stack underflow");
765 b = &f->f_blockstack[--f->f_iblock];
766 return b;
769 /* Convert between "fast" version of locals and dictionary version.
771 map and values are input arguments. map is a tuple of strings.
772 values is an array of PyObject*. At index i, map[i] is the name of
773 the variable with value values[i]. The function copies the first
774 nmap variable from map/values into dict. If values[i] is NULL,
775 the variable is deleted from dict.
777 If deref is true, then the values being copied are cell variables
778 and the value is extracted from the cell variable before being put
779 in dict.
781 Exceptions raised while modifying the dict are silently ignored,
782 because there is no good way to report them.
785 static void
786 map_to_dict(PyObject *map, Py_ssize_t nmap, PyObject *dict, PyObject **values,
787 int deref)
789 Py_ssize_t j;
790 assert(PyTuple_Check(map));
791 assert(PyDict_Check(dict));
792 assert(PyTuple_Size(map) >= nmap);
793 for (j = nmap; --j >= 0; ) {
794 PyObject *key = PyTuple_GET_ITEM(map, j);
795 PyObject *value = values[j];
796 assert(PyString_Check(key));
797 if (deref) {
798 assert(PyCell_Check(value));
799 value = PyCell_GET(value);
801 if (value == NULL) {
802 if (PyObject_DelItem(dict, key) != 0)
803 PyErr_Clear();
805 else {
806 if (PyObject_SetItem(dict, key, value) != 0)
807 PyErr_Clear();
812 /* Copy values from the "locals" dict into the fast locals.
814 dict is an input argument containing string keys representing
815 variables names and arbitrary PyObject* as values.
817 map and values are input arguments. map is a tuple of strings.
818 values is an array of PyObject*. At index i, map[i] is the name of
819 the variable with value values[i]. The function copies the first
820 nmap variable from map/values into dict. If values[i] is NULL,
821 the variable is deleted from dict.
823 If deref is true, then the values being copied are cell variables
824 and the value is extracted from the cell variable before being put
825 in dict. If clear is true, then variables in map but not in dict
826 are set to NULL in map; if clear is false, variables missing in
827 dict are ignored.
829 Exceptions raised while modifying the dict are silently ignored,
830 because there is no good way to report them.
833 static void
834 dict_to_map(PyObject *map, Py_ssize_t nmap, PyObject *dict, PyObject **values,
835 int deref, int clear)
837 Py_ssize_t j;
838 assert(PyTuple_Check(map));
839 assert(PyDict_Check(dict));
840 assert(PyTuple_Size(map) >= nmap);
841 for (j = nmap; --j >= 0; ) {
842 PyObject *key = PyTuple_GET_ITEM(map, j);
843 PyObject *value = PyObject_GetItem(dict, key);
844 assert(PyString_Check(key));
845 /* We only care about NULLs if clear is true. */
846 if (value == NULL) {
847 PyErr_Clear();
848 if (!clear)
849 continue;
851 if (deref) {
852 assert(PyCell_Check(values[j]));
853 if (PyCell_GET(values[j]) != value) {
854 if (PyCell_Set(values[j], value) < 0)
855 PyErr_Clear();
857 } else if (values[j] != value) {
858 Py_XINCREF(value);
859 Py_XDECREF(values[j]);
860 values[j] = value;
862 Py_XDECREF(value);
866 void
867 PyFrame_FastToLocals(PyFrameObject *f)
869 /* Merge fast locals into f->f_locals */
870 PyObject *locals, *map;
871 PyObject **fast;
872 PyObject *error_type, *error_value, *error_traceback;
873 PyCodeObject *co;
874 Py_ssize_t j;
875 int ncells, nfreevars;
876 if (f == NULL)
877 return;
878 locals = f->f_locals;
879 if (locals == NULL) {
880 locals = f->f_locals = PyDict_New();
881 if (locals == NULL) {
882 PyErr_Clear(); /* Can't report it :-( */
883 return;
886 co = f->f_code;
887 map = co->co_varnames;
888 if (!PyTuple_Check(map))
889 return;
890 PyErr_Fetch(&error_type, &error_value, &error_traceback);
891 fast = f->f_localsplus;
892 j = PyTuple_GET_SIZE(map);
893 if (j > co->co_nlocals)
894 j = co->co_nlocals;
895 if (co->co_nlocals)
896 map_to_dict(map, j, locals, fast, 0);
897 ncells = PyTuple_GET_SIZE(co->co_cellvars);
898 nfreevars = PyTuple_GET_SIZE(co->co_freevars);
899 if (ncells || nfreevars) {
900 map_to_dict(co->co_cellvars, ncells,
901 locals, fast + co->co_nlocals, 1);
902 /* If the namespace is unoptimized, then one of the
903 following cases applies:
904 1. It does not contain free variables, because it
905 uses import * or is a top-level namespace.
906 2. It is a class namespace.
907 We don't want to accidentally copy free variables
908 into the locals dict used by the class.
910 if (co->co_flags & CO_OPTIMIZED) {
911 map_to_dict(co->co_freevars, nfreevars,
912 locals, fast + co->co_nlocals + ncells, 1);
915 PyErr_Restore(error_type, error_value, error_traceback);
918 void
919 PyFrame_LocalsToFast(PyFrameObject *f, int clear)
921 /* Merge f->f_locals into fast locals */
922 PyObject *locals, *map;
923 PyObject **fast;
924 PyObject *error_type, *error_value, *error_traceback;
925 PyCodeObject *co;
926 Py_ssize_t j;
927 int ncells, nfreevars;
928 if (f == NULL)
929 return;
930 locals = f->f_locals;
931 co = f->f_code;
932 map = co->co_varnames;
933 if (locals == NULL)
934 return;
935 if (!PyTuple_Check(map))
936 return;
937 PyErr_Fetch(&error_type, &error_value, &error_traceback);
938 fast = f->f_localsplus;
939 j = PyTuple_GET_SIZE(map);
940 if (j > co->co_nlocals)
941 j = co->co_nlocals;
942 if (co->co_nlocals)
943 dict_to_map(co->co_varnames, j, locals, fast, 0, clear);
944 ncells = PyTuple_GET_SIZE(co->co_cellvars);
945 nfreevars = PyTuple_GET_SIZE(co->co_freevars);
946 if (ncells || nfreevars) {
947 dict_to_map(co->co_cellvars, ncells,
948 locals, fast + co->co_nlocals, 1, clear);
949 /* Same test as in PyFrame_FastToLocals() above. */
950 if (co->co_flags & CO_OPTIMIZED) {
951 dict_to_map(co->co_freevars, nfreevars,
952 locals, fast + co->co_nlocals + ncells, 1,
953 clear);
956 PyErr_Restore(error_type, error_value, error_traceback);
959 /* Clear out the free list */
961 PyFrame_ClearFreeList(void)
963 int freelist_size = numfree;
965 while (free_list != NULL) {
966 PyFrameObject *f = free_list;
967 free_list = free_list->f_back;
968 PyObject_GC_Del(f);
969 --numfree;
971 assert(numfree == 0);
972 return freelist_size;
975 void
976 PyFrame_Fini(void)
978 (void)PyFrame_ClearFreeList();
979 Py_XDECREF(builtin_object);
980 builtin_object = NULL;