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 return (builtin_object
!= NULL
);
611 PyFrame_New(PyThreadState
*tstate
, PyCodeObject
*code
, PyObject
*globals
,
614 PyFrameObject
*back
= tstate
->frame
;
620 if (code
== NULL
|| globals
== NULL
|| !PyDict_Check(globals
) ||
621 (locals
!= NULL
&& !PyMapping_Check(locals
))) {
622 PyErr_BadInternalCall();
626 if (back
== NULL
|| back
->f_globals
!= globals
) {
627 builtins
= PyDict_GetItem(globals
, builtin_object
);
629 if (PyModule_Check(builtins
)) {
630 builtins
= PyModule_GetDict(builtins
);
631 assert(!builtins
|| PyDict_Check(builtins
));
633 else if (!PyDict_Check(builtins
))
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)
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
));
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
);
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
+
668 if (free_list
== NULL
) {
669 f
= PyObject_GC_NewVar(PyFrameObject
, &PyFrame_Type
,
680 free_list
= free_list
->f_back
;
681 if (Py_SIZE(f
) < extras
) {
682 f
= PyObject_GC_Resize(PyFrameObject
, f
, extras
);
688 _Py_NewReference((PyObject
*)f
);
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
;
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
;
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
) {
717 f
->f_locals
= locals
;
723 f
->f_locals
= locals
;
725 f
->f_tstate
= tstate
;
728 f
->f_lineno
= code
->co_firstlineno
;
731 _PyObject_GC_TRACK(f
);
735 /* Block management */
738 PyFrame_BlockSetup(PyFrameObject
*f
, int type
, int handler
, int level
)
741 if (f
->f_iblock
>= CO_MAXBLOCKS
)
742 Py_FatalError("XXX block stack overflow");
743 b
= &f
->f_blockstack
[f
->f_iblock
++];
746 b
->b_handler
= handler
;
750 PyFrame_BlockPop(PyFrameObject
*f
)
753 if (f
->f_iblock
<= 0)
754 Py_FatalError("XXX block stack underflow");
755 b
= &f
->f_blockstack
[--f
->f_iblock
];
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
771 Exceptions raised while modifying the dict are silently ignored,
772 because there is no good way to report them.
776 map_to_dict(PyObject
*map
, Py_ssize_t nmap
, PyObject
*dict
, PyObject
**values
,
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
));
788 assert(PyCell_Check(value
));
789 value
= PyCell_GET(value
);
792 if (PyObject_DelItem(dict
, key
) != 0)
796 if (PyObject_SetItem(dict
, key
, value
) != 0)
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
819 Exceptions raised while modifying the dict are silently ignored,
820 because there is no good way to report them.
824 dict_to_map(PyObject
*map
, Py_ssize_t nmap
, PyObject
*dict
, PyObject
**values
,
825 int deref
, int clear
)
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. */
842 assert(PyCell_Check(values
[j
]));
843 if (PyCell_GET(values
[j
]) != value
) {
844 if (PyCell_Set(values
[j
], value
) < 0)
847 } else if (values
[j
] != value
) {
849 Py_XDECREF(values
[j
]);
857 PyFrame_FastToLocals(PyFrameObject
*f
)
859 /* Merge fast locals into f->f_locals */
860 PyObject
*locals
, *map
;
862 PyObject
*error_type
, *error_value
, *error_traceback
;
865 int ncells
, nfreevars
;
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 :-( */
877 map
= co
->co_varnames
;
878 if (!PyTuple_Check(map
))
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
)
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
);
909 PyFrame_LocalsToFast(PyFrameObject
*f
, int clear
)
911 /* Merge f->f_locals into fast locals */
912 PyObject
*locals
, *map
;
914 PyObject
*error_type
, *error_value
, *error_traceback
;
917 int ncells
, nfreevars
;
920 locals
= f
->f_locals
;
922 map
= co
->co_varnames
;
925 if (!PyTuple_Check(map
))
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
)
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,
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
;
961 assert(numfree
== 0);
962 return freelist_size
;
968 (void)PyFrame_ClearFreeList();
969 Py_XDECREF(builtin_object
);
970 builtin_object
= NULL
;