1 /* Frame object implementation */
6 #include "frameobject.h"
8 #include "structmember.h"
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
},
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) \
36 static int frame_set_ ## NAME(PyFrameObject *f, PyObject *new) { \
37 if (PyErr_WarnPy3k(#NAME " has been removed in 3.x", 2) < 0) \
50 WARN_GET_SET(f_exc_traceback
)
51 WARN_GET_SET(f_exc_type
)
52 WARN_GET_SET(f_exc_value
)
56 frame_getlocals(PyFrameObject
*f
, void *closure
)
58 PyFrame_FastToLocals(f
);
59 Py_INCREF(f
->f_locals
);
64 frame_getlineno(PyFrameObject
*f
, void *closure
)
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
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.
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");
123 /* You can only do this from within a trace function, not via
124 * _getframe or similar hackery. */
127 PyErr_Format(PyExc_ValueError
,
128 "f_lineno can only be set by a trace function");
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",
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
);
145 line
= f
->f_code
->co_firstlineno
;
147 for (offset
= 0; offset
< lnotab_len
; offset
+= 2) {
148 addr
+= lnotab
[offset
];
149 line
+= lnotab
[offset
+1];
150 if (line
>= new_lineno
) {
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",
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");
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
));
200 for (addr
= 0; addr
< code_len
; addr
++) {
201 unsigned char op
= code
[addr
];
206 blockstack
[blockstack_top
++] = addr
;
207 in_finally
[blockstack_top
-1] = 0;
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;
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
) {
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
) {
241 for (i
= blockstack_top
-1; i
>= 0; i
--) {
243 setup_addr
= blockstack
[i
];
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
) {
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");
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. */
284 for (addr
= min_addr
; addr
< max_addr
; addr
++) {
285 unsigned char op
= code
[addr
];
298 min_delta_iblock
= MIN(min_delta_iblock
, delta_iblock
);
300 if (op
>= HAVE_ARGUMENT
) {
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
) {
309 new_iblock
= f
->f_iblock
+ delta_iblock
;
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");
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
);
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
;
339 frame_gettrace(PyFrameObject
*f
, void *closure
)
341 PyObject
* trace
= f
->f_trace
;
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
;
362 f
->f_lineno
= PyCode_Addr2Line(f
->f_code
, f
->f_lasti
);
364 Py_XDECREF(old_value
);
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;
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
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
439 frame_dealloc(PyFrameObject
*f
)
441 PyObject
**p
, **valuestack
;
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
++)
452 if (f
->f_stacktop
!= NULL
) {
453 for (p
= valuestack
; p
< f
->f_stacktop
; 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
);
467 if (co
->co_zombieframe
== NULL
)
468 co
->co_zombieframe
= f
;
469 else if (numfree
< PyFrame_MAXFREELIST
) {
471 f
->f_back
= free_list
;
478 Py_TRASHCAN_SAFE_END(f
)
482 frame_traverse(PyFrameObject
*f
, visitproc visit
, void *arg
)
484 PyObject
**fastlocals
, **p
;
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
);
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
);
504 if (f
->f_stacktop
!= NULL
) {
505 for (p
= f
->f_valuestack
; p
< f
->f_stacktop
; p
++)
512 frame_clear(PyFrameObject
*f
)
514 PyObject
**fastlocals
, **p
, **oldtop
;
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
);
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
);
537 if (oldtop
!= NULL
) {
538 for (p
= f
->f_valuestack
; p
< oldtop
; p
++)
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
+
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
,
564 {NULL
, NULL
} /* sentinel */
567 PyTypeObject PyFrame_Type
= {
568 PyVarObject_HEAD_INIT(&PyType_Type
, 0)
570 sizeof(PyFrameObject
),
572 (destructor
)frame_dealloc
, /* tp_dealloc */
578 0, /* tp_as_number */
579 0, /* tp_as_sequence */
580 0, /* tp_as_mapping */
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 */
589 (traverseproc
)frame_traverse
, /* tp_traverse */
590 (inquiry
)frame_clear
, /* tp_clear */
591 0, /* tp_richcompare */
592 0, /* tp_weaklistoffset */
595 frame_methods
, /* tp_methods */
596 frame_memberlist
, /* tp_members */
597 frame_getsetlist
, /* tp_getset */
602 static PyObject
*builtin_object
;
606 builtin_object
= PyString_InternFromString("__builtins__");
607 if (builtin_object
== NULL
)
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
);
621 PyFrame_New(PyThreadState
*tstate
, PyCodeObject
*code
, PyObject
*globals
,
624 PyFrameObject
*back
= tstate
->frame
;
630 if (code
== NULL
|| globals
== NULL
|| !PyDict_Check(globals
) ||
631 (locals
!= NULL
&& !PyMapping_Check(locals
))) {
632 PyErr_BadInternalCall();
636 if (back
== NULL
|| back
->f_globals
!= globals
) {
637 builtins
= PyDict_GetItem(globals
, builtin_object
);
639 if (PyModule_Check(builtins
)) {
640 builtins
= PyModule_GetDict(builtins
);
641 assert(!builtins
|| PyDict_Check(builtins
));
643 else if (!PyDict_Check(builtins
))
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)
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
));
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
);
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
+
678 if (free_list
== NULL
) {
679 f
= PyObject_GC_NewVar(PyFrameObject
, &PyFrame_Type
,
690 free_list
= free_list
->f_back
;
691 if (Py_SIZE(f
) < extras
) {
692 f
= PyObject_GC_Resize(PyFrameObject
, f
, extras
);
698 _Py_NewReference((PyObject
*)f
);
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
;
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
;
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
) {
727 f
->f_locals
= locals
;
733 f
->f_locals
= locals
;
735 f
->f_tstate
= tstate
;
738 f
->f_lineno
= code
->co_firstlineno
;
741 _PyObject_GC_TRACK(f
);
745 /* Block management */
748 PyFrame_BlockSetup(PyFrameObject
*f
, int type
, int handler
, int level
)
751 if (f
->f_iblock
>= CO_MAXBLOCKS
)
752 Py_FatalError("XXX block stack overflow");
753 b
= &f
->f_blockstack
[f
->f_iblock
++];
756 b
->b_handler
= handler
;
760 PyFrame_BlockPop(PyFrameObject
*f
)
763 if (f
->f_iblock
<= 0)
764 Py_FatalError("XXX block stack underflow");
765 b
= &f
->f_blockstack
[--f
->f_iblock
];
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
781 Exceptions raised while modifying the dict are silently ignored,
782 because there is no good way to report them.
786 map_to_dict(PyObject
*map
, Py_ssize_t nmap
, PyObject
*dict
, PyObject
**values
,
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
));
798 assert(PyCell_Check(value
));
799 value
= PyCell_GET(value
);
802 if (PyObject_DelItem(dict
, key
) != 0)
806 if (PyObject_SetItem(dict
, key
, value
) != 0)
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
829 Exceptions raised while modifying the dict are silently ignored,
830 because there is no good way to report them.
834 dict_to_map(PyObject
*map
, Py_ssize_t nmap
, PyObject
*dict
, PyObject
**values
,
835 int deref
, int clear
)
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. */
852 assert(PyCell_Check(values
[j
]));
853 if (PyCell_GET(values
[j
]) != value
) {
854 if (PyCell_Set(values
[j
], value
) < 0)
857 } else if (values
[j
] != value
) {
859 Py_XDECREF(values
[j
]);
867 PyFrame_FastToLocals(PyFrameObject
*f
)
869 /* Merge fast locals into f->f_locals */
870 PyObject
*locals
, *map
;
872 PyObject
*error_type
, *error_value
, *error_traceback
;
875 int ncells
, nfreevars
;
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 :-( */
887 map
= co
->co_varnames
;
888 if (!PyTuple_Check(map
))
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
)
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
);
919 PyFrame_LocalsToFast(PyFrameObject
*f
, int clear
)
921 /* Merge f->f_locals into fast locals */
922 PyObject
*locals
, *map
;
924 PyObject
*error_type
, *error_value
, *error_traceback
;
927 int ncells
, nfreevars
;
930 locals
= f
->f_locals
;
932 map
= co
->co_varnames
;
935 if (!PyTuple_Check(map
))
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
)
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,
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
;
971 assert(numfree
== 0);
972 return freelist_size
;
978 (void)PyFrame_ClearFreeList();
979 Py_XDECREF(builtin_object
);
980 builtin_object
= NULL
;