blob: 1e672bb5d799910da23d763bbabe1a004757c21d [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum6610ad91995-01-04 19:07:38 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossumf70e43a1991-02-19 12:39:46 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000029
30******************************************************************/
31
Guido van Rossum3f5da241990-12-20 15:06:42 +000032/* Frame object implementation */
33
Guido van Rossum18752471997-04-29 14:49:28 +000034#include "Python.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000035
36#include "compile.h"
37#include "frameobject.h"
38#include "opcode.h"
39#include "structmember.h"
40
Guido van Rossum18752471997-04-29 14:49:28 +000041#define OFF(x) offsetof(PyFrameObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +000042
43static struct memberlist frame_memberlist[] = {
Guido van Rossum1d5735e1994-08-30 08:27:36 +000044 {"f_back", T_OBJECT, OFF(f_back), RO},
45 {"f_code", T_OBJECT, OFF(f_code), RO},
Guido van Rossumc1134821995-01-10 10:39:16 +000046 {"f_builtins", T_OBJECT, OFF(f_builtins),RO},
Guido van Rossum1d5735e1994-08-30 08:27:36 +000047 {"f_globals", T_OBJECT, OFF(f_globals), RO},
48 {"f_locals", T_OBJECT, OFF(f_locals), RO},
Guido van Rossum1d5735e1994-08-30 08:27:36 +000049 {"f_lasti", T_INT, OFF(f_lasti), RO},
50 {"f_lineno", T_INT, OFF(f_lineno), RO},
Guido van Rossumc1134821995-01-10 10:39:16 +000051 {"f_restricted",T_INT, OFF(f_restricted),RO},
Guido van Rossum1d5735e1994-08-30 08:27:36 +000052 {"f_trace", T_OBJECT, OFF(f_trace)},
Guido van Rossuma027efa1997-05-05 20:56:21 +000053 {"f_exc_type", T_OBJECT, OFF(f_exc_type)},
54 {"f_exc_value", T_OBJECT, OFF(f_exc_value)},
55 {"f_exc_traceback", T_OBJECT, OFF(f_exc_traceback)},
Guido van Rossum3f5da241990-12-20 15:06:42 +000056 {NULL} /* Sentinel */
57};
58
Guido van Rossum18752471997-04-29 14:49:28 +000059static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +000060frame_getattr(f, name)
Guido van Rossum18752471997-04-29 14:49:28 +000061 PyFrameObject *f;
Guido van Rossum3f5da241990-12-20 15:06:42 +000062 char *name;
63{
Guido van Rossum1d5735e1994-08-30 08:27:36 +000064 if (strcmp(name, "f_locals") == 0)
Guido van Rossum18752471997-04-29 14:49:28 +000065 PyFrame_FastToLocals(f);
66 return PyMember_Get((char *)f, frame_memberlist, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +000067}
68
Guido van Rossum1d5735e1994-08-30 08:27:36 +000069static int
70frame_setattr(f, name, value)
Guido van Rossum18752471997-04-29 14:49:28 +000071 PyFrameObject *f;
Guido van Rossum1d5735e1994-08-30 08:27:36 +000072 char *name;
Guido van Rossum18752471997-04-29 14:49:28 +000073 PyObject *value;
Guido van Rossum1d5735e1994-08-30 08:27:36 +000074{
Guido van Rossum18752471997-04-29 14:49:28 +000075 return PyMember_Set((char *)f, frame_memberlist, name, value);
Guido van Rossum1d5735e1994-08-30 08:27:36 +000076}
77
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000078/* Stack frames are allocated and deallocated at a considerable rate.
79 In an attempt to improve the speed of function calls, we maintain a
80 separate free list of stack frames (just like integers are
81 allocated in a special way -- see intobject.c). When a stack frame
82 is on the free list, only the following members have a meaning:
83 ob_type == &Frametype
84 f_back next item on free list, or NULL
Guido van Rossumf3e85a01997-01-20 04:20:52 +000085 f_nlocals number of locals
86 f_stacksize size of value stack
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000087 Note that the value and block stacks are preserved -- this can save
88 another malloc() call or two (and two free() calls as well!).
89 Also note that, unlike for integers, each frame object is a
90 malloc'ed object in its own right -- it is only the actual calls to
91 malloc() that we are trying to save here, not the administration.
92 After all, while a typical program may make millions of calls, a
93 call depth of more than 20 or 30 is probably already exceptional
94 unless the program contains run-away recursion. I hope.
95*/
96
Guido van Rossum18752471997-04-29 14:49:28 +000097static PyFrameObject *free_list = NULL;
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000098
Guido van Rossum3f5da241990-12-20 15:06:42 +000099static void
100frame_dealloc(f)
Guido van Rossum18752471997-04-29 14:49:28 +0000101 PyFrameObject *f;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000102{
Guido van Rossum7582bfb1997-02-14 16:27:29 +0000103 int i;
104 PyObject **fastlocals;
105
Guido van Rossumd724b232000-03-13 16:01:29 +0000106 Py_TRASHCAN_SAFE_BEGIN(f)
Guido van Rossum7582bfb1997-02-14 16:27:29 +0000107 /* Kill all local variables */
108 fastlocals = f->f_localsplus;
109 for (i = f->f_nlocals; --i >= 0; ++fastlocals) {
Guido van Rossum18752471997-04-29 14:49:28 +0000110 Py_XDECREF(*fastlocals);
Guido van Rossum7582bfb1997-02-14 16:27:29 +0000111 }
112
Guido van Rossum18752471997-04-29 14:49:28 +0000113 Py_XDECREF(f->f_back);
114 Py_XDECREF(f->f_code);
115 Py_XDECREF(f->f_builtins);
116 Py_XDECREF(f->f_globals);
117 Py_XDECREF(f->f_locals);
118 Py_XDECREF(f->f_trace);
Guido van Rossuma027efa1997-05-05 20:56:21 +0000119 Py_XDECREF(f->f_exc_type);
120 Py_XDECREF(f->f_exc_value);
121 Py_XDECREF(f->f_exc_traceback);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000122 f->f_back = free_list;
123 free_list = f;
Guido van Rossumd724b232000-03-13 16:01:29 +0000124 Py_TRASHCAN_SAFE_END(f)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000125}
126
Guido van Rossum18752471997-04-29 14:49:28 +0000127PyTypeObject PyFrame_Type = {
128 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000129 0,
130 "frame",
Guido van Rossum18752471997-04-29 14:49:28 +0000131 sizeof(PyFrameObject),
Guido van Rossum3f5da241990-12-20 15:06:42 +0000132 0,
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000133 (destructor)frame_dealloc, /*tp_dealloc*/
Guido van Rossum3f5da241990-12-20 15:06:42 +0000134 0, /*tp_print*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000135 (getattrfunc)frame_getattr, /*tp_getattr*/
136 (setattrfunc)frame_setattr, /*tp_setattr*/
Guido van Rossum3f5da241990-12-20 15:06:42 +0000137 0, /*tp_compare*/
138 0, /*tp_repr*/
139 0, /*tp_as_number*/
140 0, /*tp_as_sequence*/
141 0, /*tp_as_mapping*/
142};
143
Guido van Rossum18752471997-04-29 14:49:28 +0000144PyFrameObject *
Guido van Rossuma027efa1997-05-05 20:56:21 +0000145PyFrame_New(tstate, code, globals, locals)
146 PyThreadState *tstate;
Guido van Rossum18752471997-04-29 14:49:28 +0000147 PyCodeObject *code;
148 PyObject *globals;
149 PyObject *locals;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000150{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000151 PyFrameObject *back = tstate->frame;
Guido van Rossum18752471997-04-29 14:49:28 +0000152 static PyObject *builtin_object;
153 PyFrameObject *f;
154 PyObject *builtins;
Guido van Rossum67906af1998-09-25 14:11:46 +0000155 int extras;
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000156
Sjoerd Mullender5b7f3cd1995-04-04 11:47:41 +0000157 if (builtin_object == NULL) {
Guido van Rossumb56933e1997-01-18 07:58:41 +0000158 builtin_object = PyString_InternFromString("__builtins__");
Sjoerd Mullender5b7f3cd1995-04-04 11:47:41 +0000159 if (builtin_object == NULL)
160 return NULL;
161 }
Guido van Rossum18752471997-04-29 14:49:28 +0000162 if ((back != NULL && !PyFrame_Check(back)) ||
163 code == NULL || !PyCode_Check(code) ||
164 globals == NULL || !PyDict_Check(globals) ||
165 (locals != NULL && !PyDict_Check(locals))) {
166 PyErr_BadInternalCall();
Guido van Rossum3f5da241990-12-20 15:06:42 +0000167 return NULL;
168 }
Guido van Rossum67906af1998-09-25 14:11:46 +0000169 extras = code->co_stacksize + code->co_nlocals;
Guido van Rossumbde6ff71998-02-19 20:48:26 +0000170 if (back == NULL || back->f_globals != globals) {
171 builtins = PyDict_GetItem(globals, builtin_object);
172 if (builtins != NULL && PyModule_Check(builtins))
173 builtins = PyModule_GetDict(builtins);
174 }
175 else {
176 /* If we share the globals, we share the builtins.
177 Save a lookup and a call. */
178 builtins = back->f_builtins;
179 }
Guido van Rossum404b95d1997-08-05 02:09:46 +0000180 if (builtins != NULL && !PyDict_Check(builtins))
181 builtins = NULL;
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000182 if (free_list == NULL) {
Guido van Rossumb18618d2000-05-03 23:44:39 +0000183 /* PyObject_New is inlined */
Guido van Rossum18752471997-04-29 14:49:28 +0000184 f = (PyFrameObject *)
Guido van Rossumb18618d2000-05-03 23:44:39 +0000185 PyObject_MALLOC(sizeof(PyFrameObject) +
186 extras*sizeof(PyObject *));
Guido van Rossum2271bf71995-07-18 14:30:34 +0000187 if (f == NULL)
Guido van Rossum18752471997-04-29 14:49:28 +0000188 return (PyFrameObject *)PyErr_NoMemory();
Guido van Rossumb18618d2000-05-03 23:44:39 +0000189 PyObject_INIT(f, &PyFrame_Type);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000190 }
191 else {
192 f = free_list;
193 free_list = free_list->f_back;
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000194 if (f->f_nlocals + f->f_stacksize < extras) {
Guido van Rossum6345ac61997-10-31 20:32:13 +0000195 f = (PyFrameObject *)
Guido van Rossumb18618d2000-05-03 23:44:39 +0000196 PyObject_REALLOC(f, sizeof(PyFrameObject) +
197 extras*sizeof(PyObject *));
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000198 if (f == NULL)
Guido van Rossum18752471997-04-29 14:49:28 +0000199 return (PyFrameObject *)PyErr_NoMemory();
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000200 }
Guido van Rossum747596a1997-01-24 04:00:21 +0000201 else
202 extras = f->f_nlocals + f->f_stacksize;
Guido van Rossumb18618d2000-05-03 23:44:39 +0000203 PyObject_INIT(f, &PyFrame_Type);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000204 }
Guido van Rossum404b95d1997-08-05 02:09:46 +0000205 if (builtins == NULL) {
Guido van Rossumbde6ff71998-02-19 20:48:26 +0000206 /* No builtins! Make up a minimal one. */
Guido van Rossum404b95d1997-08-05 02:09:46 +0000207 builtins = PyDict_New();
Guido van Rossumf61618c1998-10-19 14:20:20 +0000208 if (builtins == NULL || /* Give them 'None', at least. */
209 PyDict_SetItemString(builtins, "None", Py_None) < 0) {
210 Py_DECREF(f);
Guido van Rossum404b95d1997-08-05 02:09:46 +0000211 return NULL;
Guido van Rossumf61618c1998-10-19 14:20:20 +0000212 }
Guido van Rossum404b95d1997-08-05 02:09:46 +0000213 }
214 else
215 Py_XINCREF(builtins);
216 f->f_builtins = builtins;
Guido van Rossum18752471997-04-29 14:49:28 +0000217 Py_XINCREF(back);
Guido van Rossum2271bf71995-07-18 14:30:34 +0000218 f->f_back = back;
Guido van Rossum18752471997-04-29 14:49:28 +0000219 Py_INCREF(code);
Guido van Rossum2271bf71995-07-18 14:30:34 +0000220 f->f_code = code;
Guido van Rossum18752471997-04-29 14:49:28 +0000221 Py_INCREF(globals);
Guido van Rossum2271bf71995-07-18 14:30:34 +0000222 f->f_globals = globals;
Guido van Rossumbdd207a1995-07-26 16:14:30 +0000223 if (code->co_flags & CO_NEWLOCALS) {
224 if (code->co_flags & CO_OPTIMIZED)
225 locals = NULL; /* Let fast_2_locals handle it */
226 else {
Guido van Rossum18752471997-04-29 14:49:28 +0000227 locals = PyDict_New();
Guido van Rossumbdd207a1995-07-26 16:14:30 +0000228 if (locals == NULL) {
Guido van Rossum18752471997-04-29 14:49:28 +0000229 Py_DECREF(f);
Guido van Rossumbdd207a1995-07-26 16:14:30 +0000230 return NULL;
231 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000232 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000233 }
Guido van Rossum2271bf71995-07-18 14:30:34 +0000234 else {
235 if (locals == NULL)
236 locals = globals;
Guido van Rossum18752471997-04-29 14:49:28 +0000237 Py_INCREF(locals);
Guido van Rossum2271bf71995-07-18 14:30:34 +0000238 }
239 f->f_locals = locals;
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000240 f->f_trace = NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000241 f->f_exc_type = f->f_exc_value = f->f_exc_traceback = NULL;
Guido van Rossumeb46d671997-08-02 02:59:08 +0000242 f->f_tstate = tstate;
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000243
Guido van Rossum2271bf71995-07-18 14:30:34 +0000244 f->f_lasti = 0;
Guido van Rossum747596a1997-01-24 04:00:21 +0000245 f->f_lineno = code->co_firstlineno;
Guido van Rossumeb46d671997-08-02 02:59:08 +0000246 f->f_restricted = (builtins != tstate->interp->builtins);
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000247 f->f_iblock = 0;
248 f->f_nlocals = code->co_nlocals;
Guido van Rossum747596a1997-01-24 04:00:21 +0000249 f->f_stacksize = extras - code->co_nlocals;
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000250
251 while (--extras >= 0)
252 f->f_localsplus[extras] = NULL;
253
254 f->f_valuestack = f->f_localsplus + f->f_nlocals;
255
Guido van Rossum3f5da241990-12-20 15:06:42 +0000256 return f;
257}
258
Guido van Rossum3f5da241990-12-20 15:06:42 +0000259/* Block management */
260
261void
Guido van Rossum18752471997-04-29 14:49:28 +0000262PyFrame_BlockSetup(f, type, handler, level)
263 PyFrameObject *f;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000264 int type;
265 int handler;
266 int level;
267{
Guido van Rossum18752471997-04-29 14:49:28 +0000268 PyTryBlock *b;
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000269 if (f->f_iblock >= CO_MAXBLOCKS)
Guido van Rossum18752471997-04-29 14:49:28 +0000270 Py_FatalError("XXX block stack overflow");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000271 b = &f->f_blockstack[f->f_iblock++];
272 b->b_type = type;
273 b->b_level = level;
274 b->b_handler = handler;
275}
276
Guido van Rossum18752471997-04-29 14:49:28 +0000277PyTryBlock *
278PyFrame_BlockPop(f)
279 PyFrameObject *f;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000280{
Guido van Rossum18752471997-04-29 14:49:28 +0000281 PyTryBlock *b;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000282 if (f->f_iblock <= 0)
Guido van Rossum18752471997-04-29 14:49:28 +0000283 Py_FatalError("XXX block stack underflow");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000284 b = &f->f_blockstack[--f->f_iblock];
285 return b;
286}
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000287
288/* Convert between "fast" version of locals and dictionary version */
289
290void
Guido van Rossum18752471997-04-29 14:49:28 +0000291PyFrame_FastToLocals(f)
292 PyFrameObject *f;
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000293{
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000294 /* Merge fast locals into f->f_locals */
Guido van Rossum18752471997-04-29 14:49:28 +0000295 PyObject *locals, *map;
296 PyObject **fast;
297 PyObject *error_type, *error_value, *error_traceback;
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000298 int j;
299 if (f == NULL)
300 return;
Guido van Rossum2271bf71995-07-18 14:30:34 +0000301 locals = f->f_locals;
302 if (locals == NULL) {
Guido van Rossum18752471997-04-29 14:49:28 +0000303 locals = f->f_locals = PyDict_New();
Guido van Rossum2271bf71995-07-18 14:30:34 +0000304 if (locals == NULL) {
Guido van Rossum18752471997-04-29 14:49:28 +0000305 PyErr_Clear(); /* Can't report it :-( */
Guido van Rossum2271bf71995-07-18 14:30:34 +0000306 return;
307 }
308 }
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000309 if (f->f_nlocals == 0)
Guido van Rossumbdd207a1995-07-26 16:14:30 +0000310 return;
311 map = f->f_code->co_varnames;
Guido van Rossum18752471997-04-29 14:49:28 +0000312 if (!PyDict_Check(locals) || !PyTuple_Check(map))
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000313 return;
Guido van Rossum18752471997-04-29 14:49:28 +0000314 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000315 fast = f->f_localsplus;
Guido van Rossum18752471997-04-29 14:49:28 +0000316 j = PyTuple_Size(map);
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000317 if (j > f->f_nlocals)
318 j = f->f_nlocals;
319 for (; --j >= 0; ) {
Guido van Rossum18752471997-04-29 14:49:28 +0000320 PyObject *key = PyTuple_GetItem(map, j);
321 PyObject *value = fast[j];
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000322 if (value == NULL) {
Guido van Rossum18752471997-04-29 14:49:28 +0000323 PyErr_Clear();
324 if (PyDict_DelItem(locals, key) != 0)
325 PyErr_Clear();
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000326 }
327 else {
Guido van Rossum18752471997-04-29 14:49:28 +0000328 if (PyDict_SetItem(locals, key, value) != 0)
329 PyErr_Clear();
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000330 }
331 }
Guido van Rossum18752471997-04-29 14:49:28 +0000332 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000333}
334
335void
Guido van Rossum18752471997-04-29 14:49:28 +0000336PyFrame_LocalsToFast(f, clear)
337 PyFrameObject *f;
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000338 int clear;
339{
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000340 /* Merge f->f_locals into fast locals */
Guido van Rossum18752471997-04-29 14:49:28 +0000341 PyObject *locals, *map;
342 PyObject **fast;
343 PyObject *error_type, *error_value, *error_traceback;
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000344 int j;
345 if (f == NULL)
346 return;
347 locals = f->f_locals;
Guido van Rossum2271bf71995-07-18 14:30:34 +0000348 map = f->f_code->co_varnames;
Guido van Rossum3bb63a81997-01-20 04:29:16 +0000349 if (locals == NULL || f->f_code->co_nlocals == 0)
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000350 return;
Guido van Rossum18752471997-04-29 14:49:28 +0000351 if (!PyDict_Check(locals) || !PyTuple_Check(map))
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000352 return;
Guido van Rossum18752471997-04-29 14:49:28 +0000353 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000354 fast = f->f_localsplus;
Guido van Rossum18752471997-04-29 14:49:28 +0000355 j = PyTuple_Size(map);
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000356 if (j > f->f_nlocals)
357 j = f->f_nlocals;
358 for (; --j >= 0; ) {
Guido van Rossum18752471997-04-29 14:49:28 +0000359 PyObject *key = PyTuple_GetItem(map, j);
360 PyObject *value = PyDict_GetItem(locals, key);
Guido van Rossume23eb571998-05-14 01:49:48 +0000361 Py_XINCREF(value);
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000362 if (value != NULL || clear) {
Guido van Rossum18752471997-04-29 14:49:28 +0000363 Py_XDECREF(fast[j]);
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000364 fast[j] = value;
365 }
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000366 }
Guido van Rossum18752471997-04-29 14:49:28 +0000367 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000368}
Guido van Rossum404b95d1997-08-05 02:09:46 +0000369
370/* Clear out the free list */
371
372void
373PyFrame_Fini()
374{
375 while (free_list != NULL) {
376 PyFrameObject *f = free_list;
377 free_list = free_list->f_back;
Guido van Rossumb18618d2000-05-03 23:44:39 +0000378 PyObject_DEL(f);
Guido van Rossum404b95d1997-08-05 02:09:46 +0000379 }
380}