blob: 295b613fe745a6ca13d94dcf971fd2df8cf4c4b8 [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
106 /* Kill all local variables */
107 fastlocals = f->f_localsplus;
108 for (i = f->f_nlocals; --i >= 0; ++fastlocals) {
Guido van Rossum18752471997-04-29 14:49:28 +0000109 Py_XDECREF(*fastlocals);
Guido van Rossum7582bfb1997-02-14 16:27:29 +0000110 }
111
Guido van Rossum18752471997-04-29 14:49:28 +0000112 Py_XDECREF(f->f_back);
113 Py_XDECREF(f->f_code);
114 Py_XDECREF(f->f_builtins);
115 Py_XDECREF(f->f_globals);
116 Py_XDECREF(f->f_locals);
117 Py_XDECREF(f->f_trace);
Guido van Rossuma027efa1997-05-05 20:56:21 +0000118 Py_XDECREF(f->f_exc_type);
119 Py_XDECREF(f->f_exc_value);
120 Py_XDECREF(f->f_exc_traceback);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000121 f->f_back = free_list;
122 free_list = f;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000123}
124
Guido van Rossum18752471997-04-29 14:49:28 +0000125PyTypeObject PyFrame_Type = {
126 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000127 0,
128 "frame",
Guido van Rossum18752471997-04-29 14:49:28 +0000129 sizeof(PyFrameObject),
Guido van Rossum3f5da241990-12-20 15:06:42 +0000130 0,
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000131 (destructor)frame_dealloc, /*tp_dealloc*/
Guido van Rossum3f5da241990-12-20 15:06:42 +0000132 0, /*tp_print*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000133 (getattrfunc)frame_getattr, /*tp_getattr*/
134 (setattrfunc)frame_setattr, /*tp_setattr*/
Guido van Rossum3f5da241990-12-20 15:06:42 +0000135 0, /*tp_compare*/
136 0, /*tp_repr*/
137 0, /*tp_as_number*/
138 0, /*tp_as_sequence*/
139 0, /*tp_as_mapping*/
140};
141
Guido van Rossum18752471997-04-29 14:49:28 +0000142PyFrameObject *
Guido van Rossuma027efa1997-05-05 20:56:21 +0000143PyFrame_New(tstate, code, globals, locals)
144 PyThreadState *tstate;
Guido van Rossum18752471997-04-29 14:49:28 +0000145 PyCodeObject *code;
146 PyObject *globals;
147 PyObject *locals;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000148{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000149 PyFrameObject *back = tstate->frame;
Guido van Rossum18752471997-04-29 14:49:28 +0000150 static PyObject *builtin_object;
151 PyFrameObject *f;
152 PyObject *builtins;
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000153 int extras = code->co_stacksize + code->co_nlocals;
154
Sjoerd Mullender5b7f3cd1995-04-04 11:47:41 +0000155 if (builtin_object == NULL) {
Guido van Rossumb56933e1997-01-18 07:58:41 +0000156 builtin_object = PyString_InternFromString("__builtins__");
Sjoerd Mullender5b7f3cd1995-04-04 11:47:41 +0000157 if (builtin_object == NULL)
158 return NULL;
159 }
Guido van Rossum18752471997-04-29 14:49:28 +0000160 if ((back != NULL && !PyFrame_Check(back)) ||
161 code == NULL || !PyCode_Check(code) ||
162 globals == NULL || !PyDict_Check(globals) ||
163 (locals != NULL && !PyDict_Check(locals))) {
164 PyErr_BadInternalCall();
Guido van Rossum3f5da241990-12-20 15:06:42 +0000165 return NULL;
166 }
Guido van Rossum18752471997-04-29 14:49:28 +0000167 builtins = PyDict_GetItem(globals, builtin_object);
168 if (builtins != NULL && PyModule_Check(builtins))
169 builtins = PyModule_GetDict(builtins);
Guido van Rossum404b95d1997-08-05 02:09:46 +0000170 if (builtins != NULL && !PyDict_Check(builtins))
171 builtins = NULL;
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000172 if (free_list == NULL) {
Guido van Rossum18752471997-04-29 14:49:28 +0000173 f = (PyFrameObject *)
174 malloc(sizeof(PyFrameObject) +
175 extras*sizeof(PyObject *));
Guido van Rossum2271bf71995-07-18 14:30:34 +0000176 if (f == NULL)
Guido van Rossum18752471997-04-29 14:49:28 +0000177 return (PyFrameObject *)PyErr_NoMemory();
178 f->ob_type = &PyFrame_Type;
179 _Py_NewReference(f);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000180 }
181 else {
182 f = free_list;
183 free_list = free_list->f_back;
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000184 if (f->f_nlocals + f->f_stacksize < extras) {
Guido van Rossum18752471997-04-29 14:49:28 +0000185 f = realloc(f, sizeof(PyFrameObject) +
186 extras*sizeof(PyObject *));
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000187 if (f == NULL)
Guido van Rossum18752471997-04-29 14:49:28 +0000188 return (PyFrameObject *)PyErr_NoMemory();
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000189 }
Guido van Rossum747596a1997-01-24 04:00:21 +0000190 else
191 extras = f->f_nlocals + f->f_stacksize;
Guido van Rossum18752471997-04-29 14:49:28 +0000192 f->ob_type = &PyFrame_Type;
193 _Py_NewReference(f);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000194 }
Guido van Rossum404b95d1997-08-05 02:09:46 +0000195 if (builtins == NULL) {
196 builtins = PyDict_New();
197 if (builtins == NULL)
198 return NULL;
199 }
200 else
201 Py_XINCREF(builtins);
202 f->f_builtins = builtins;
Guido van Rossum18752471997-04-29 14:49:28 +0000203 Py_XINCREF(back);
Guido van Rossum2271bf71995-07-18 14:30:34 +0000204 f->f_back = back;
Guido van Rossum18752471997-04-29 14:49:28 +0000205 Py_INCREF(code);
Guido van Rossum2271bf71995-07-18 14:30:34 +0000206 f->f_code = code;
Guido van Rossum18752471997-04-29 14:49:28 +0000207 Py_INCREF(globals);
Guido van Rossum2271bf71995-07-18 14:30:34 +0000208 f->f_globals = globals;
Guido van Rossumbdd207a1995-07-26 16:14:30 +0000209 if (code->co_flags & CO_NEWLOCALS) {
210 if (code->co_flags & CO_OPTIMIZED)
211 locals = NULL; /* Let fast_2_locals handle it */
212 else {
Guido van Rossum18752471997-04-29 14:49:28 +0000213 locals = PyDict_New();
Guido van Rossumbdd207a1995-07-26 16:14:30 +0000214 if (locals == NULL) {
Guido van Rossum18752471997-04-29 14:49:28 +0000215 Py_DECREF(f);
Guido van Rossumbdd207a1995-07-26 16:14:30 +0000216 return NULL;
217 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000218 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000219 }
Guido van Rossum2271bf71995-07-18 14:30:34 +0000220 else {
221 if (locals == NULL)
222 locals = globals;
Guido van Rossum18752471997-04-29 14:49:28 +0000223 Py_INCREF(locals);
Guido van Rossum2271bf71995-07-18 14:30:34 +0000224 }
225 f->f_locals = locals;
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000226 f->f_trace = NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000227 f->f_exc_type = f->f_exc_value = f->f_exc_traceback = NULL;
Guido van Rossumeb46d671997-08-02 02:59:08 +0000228 f->f_tstate = tstate;
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000229
Guido van Rossum2271bf71995-07-18 14:30:34 +0000230 f->f_lasti = 0;
Guido van Rossum747596a1997-01-24 04:00:21 +0000231 f->f_lineno = code->co_firstlineno;
Guido van Rossumeb46d671997-08-02 02:59:08 +0000232 f->f_restricted = (builtins != tstate->interp->builtins);
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000233 f->f_iblock = 0;
234 f->f_nlocals = code->co_nlocals;
Guido van Rossum747596a1997-01-24 04:00:21 +0000235 f->f_stacksize = extras - code->co_nlocals;
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000236
237 while (--extras >= 0)
238 f->f_localsplus[extras] = NULL;
239
240 f->f_valuestack = f->f_localsplus + f->f_nlocals;
241
Guido van Rossum3f5da241990-12-20 15:06:42 +0000242 return f;
243}
244
Guido van Rossum3f5da241990-12-20 15:06:42 +0000245/* Block management */
246
247void
Guido van Rossum18752471997-04-29 14:49:28 +0000248PyFrame_BlockSetup(f, type, handler, level)
249 PyFrameObject *f;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000250 int type;
251 int handler;
252 int level;
253{
Guido van Rossum18752471997-04-29 14:49:28 +0000254 PyTryBlock *b;
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000255 if (f->f_iblock >= CO_MAXBLOCKS)
Guido van Rossum18752471997-04-29 14:49:28 +0000256 Py_FatalError("XXX block stack overflow");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000257 b = &f->f_blockstack[f->f_iblock++];
258 b->b_type = type;
259 b->b_level = level;
260 b->b_handler = handler;
261}
262
Guido van Rossum18752471997-04-29 14:49:28 +0000263PyTryBlock *
264PyFrame_BlockPop(f)
265 PyFrameObject *f;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000266{
Guido van Rossum18752471997-04-29 14:49:28 +0000267 PyTryBlock *b;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000268 if (f->f_iblock <= 0)
Guido van Rossum18752471997-04-29 14:49:28 +0000269 Py_FatalError("XXX block stack underflow");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000270 b = &f->f_blockstack[--f->f_iblock];
271 return b;
272}
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000273
274/* Convert between "fast" version of locals and dictionary version */
275
276void
Guido van Rossum18752471997-04-29 14:49:28 +0000277PyFrame_FastToLocals(f)
278 PyFrameObject *f;
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000279{
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000280 /* Merge fast locals into f->f_locals */
Guido van Rossum18752471997-04-29 14:49:28 +0000281 PyObject *locals, *map;
282 PyObject **fast;
283 PyObject *error_type, *error_value, *error_traceback;
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000284 int j;
285 if (f == NULL)
286 return;
Guido van Rossum2271bf71995-07-18 14:30:34 +0000287 locals = f->f_locals;
288 if (locals == NULL) {
Guido van Rossum18752471997-04-29 14:49:28 +0000289 locals = f->f_locals = PyDict_New();
Guido van Rossum2271bf71995-07-18 14:30:34 +0000290 if (locals == NULL) {
Guido van Rossum18752471997-04-29 14:49:28 +0000291 PyErr_Clear(); /* Can't report it :-( */
Guido van Rossum2271bf71995-07-18 14:30:34 +0000292 return;
293 }
294 }
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000295 if (f->f_nlocals == 0)
Guido van Rossumbdd207a1995-07-26 16:14:30 +0000296 return;
297 map = f->f_code->co_varnames;
Guido van Rossum18752471997-04-29 14:49:28 +0000298 if (!PyDict_Check(locals) || !PyTuple_Check(map))
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000299 return;
Guido van Rossum18752471997-04-29 14:49:28 +0000300 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000301 fast = f->f_localsplus;
Guido van Rossum18752471997-04-29 14:49:28 +0000302 j = PyTuple_Size(map);
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000303 if (j > f->f_nlocals)
304 j = f->f_nlocals;
305 for (; --j >= 0; ) {
Guido van Rossum18752471997-04-29 14:49:28 +0000306 PyObject *key = PyTuple_GetItem(map, j);
307 PyObject *value = fast[j];
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000308 if (value == NULL) {
Guido van Rossum18752471997-04-29 14:49:28 +0000309 PyErr_Clear();
310 if (PyDict_DelItem(locals, key) != 0)
311 PyErr_Clear();
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000312 }
313 else {
Guido van Rossum18752471997-04-29 14:49:28 +0000314 if (PyDict_SetItem(locals, key, value) != 0)
315 PyErr_Clear();
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000316 }
317 }
Guido van Rossum18752471997-04-29 14:49:28 +0000318 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000319}
320
321void
Guido van Rossum18752471997-04-29 14:49:28 +0000322PyFrame_LocalsToFast(f, clear)
323 PyFrameObject *f;
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000324 int clear;
325{
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000326 /* Merge f->f_locals into fast locals */
Guido van Rossum18752471997-04-29 14:49:28 +0000327 PyObject *locals, *map;
328 PyObject **fast;
329 PyObject *error_type, *error_value, *error_traceback;
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000330 int j;
331 if (f == NULL)
332 return;
333 locals = f->f_locals;
Guido van Rossum2271bf71995-07-18 14:30:34 +0000334 map = f->f_code->co_varnames;
Guido van Rossum3bb63a81997-01-20 04:29:16 +0000335 if (locals == NULL || f->f_code->co_nlocals == 0)
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000336 return;
Guido van Rossum18752471997-04-29 14:49:28 +0000337 if (!PyDict_Check(locals) || !PyTuple_Check(map))
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000338 return;
Guido van Rossum18752471997-04-29 14:49:28 +0000339 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000340 fast = f->f_localsplus;
Guido van Rossum18752471997-04-29 14:49:28 +0000341 j = PyTuple_Size(map);
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000342 if (j > f->f_nlocals)
343 j = f->f_nlocals;
344 for (; --j >= 0; ) {
Guido van Rossum18752471997-04-29 14:49:28 +0000345 PyObject *key = PyTuple_GetItem(map, j);
346 PyObject *value = PyDict_GetItem(locals, key);
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000347 if (value == NULL)
Guido van Rossum18752471997-04-29 14:49:28 +0000348 PyErr_Clear();
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000349 else
Guido van Rossum18752471997-04-29 14:49:28 +0000350 Py_INCREF(value);
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000351 if (value != NULL || clear) {
Guido van Rossum18752471997-04-29 14:49:28 +0000352 Py_XDECREF(fast[j]);
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000353 fast[j] = value;
354 }
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000355 }
Guido van Rossum18752471997-04-29 14:49:28 +0000356 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000357}
Guido van Rossum404b95d1997-08-05 02:09:46 +0000358
359/* Clear out the free list */
360
361void
362PyFrame_Fini()
363{
364 while (free_list != NULL) {
365 PyFrameObject *f = free_list;
366 free_list = free_list->f_back;
367 PyMem_DEL(f);
368 }
369}