blob: b5af7b6ed6f31ad356bbf7547ebdb6ca7ef77e8e [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 Rossum3f5da241990-12-20 15:06:42 +000053 {NULL} /* Sentinel */
54};
55
Guido van Rossum18752471997-04-29 14:49:28 +000056static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +000057frame_getattr(f, name)
Guido van Rossum18752471997-04-29 14:49:28 +000058 PyFrameObject *f;
Guido van Rossum3f5da241990-12-20 15:06:42 +000059 char *name;
60{
Guido van Rossum1d5735e1994-08-30 08:27:36 +000061 if (strcmp(name, "f_locals") == 0)
Guido van Rossum18752471997-04-29 14:49:28 +000062 PyFrame_FastToLocals(f);
63 return PyMember_Get((char *)f, frame_memberlist, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +000064}
65
Guido van Rossum1d5735e1994-08-30 08:27:36 +000066static int
67frame_setattr(f, name, value)
Guido van Rossum18752471997-04-29 14:49:28 +000068 PyFrameObject *f;
Guido van Rossum1d5735e1994-08-30 08:27:36 +000069 char *name;
Guido van Rossum18752471997-04-29 14:49:28 +000070 PyObject *value;
Guido van Rossum1d5735e1994-08-30 08:27:36 +000071{
Guido van Rossum18752471997-04-29 14:49:28 +000072 return PyMember_Set((char *)f, frame_memberlist, name, value);
Guido van Rossum1d5735e1994-08-30 08:27:36 +000073}
74
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000075/* Stack frames are allocated and deallocated at a considerable rate.
76 In an attempt to improve the speed of function calls, we maintain a
77 separate free list of stack frames (just like integers are
78 allocated in a special way -- see intobject.c). When a stack frame
79 is on the free list, only the following members have a meaning:
80 ob_type == &Frametype
81 f_back next item on free list, or NULL
Guido van Rossumf3e85a01997-01-20 04:20:52 +000082 f_nlocals number of locals
83 f_stacksize size of value stack
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000084 Note that the value and block stacks are preserved -- this can save
85 another malloc() call or two (and two free() calls as well!).
86 Also note that, unlike for integers, each frame object is a
87 malloc'ed object in its own right -- it is only the actual calls to
88 malloc() that we are trying to save here, not the administration.
89 After all, while a typical program may make millions of calls, a
90 call depth of more than 20 or 30 is probably already exceptional
91 unless the program contains run-away recursion. I hope.
92*/
93
Guido van Rossum18752471997-04-29 14:49:28 +000094static PyFrameObject *free_list = NULL;
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000095
Guido van Rossum3f5da241990-12-20 15:06:42 +000096static void
97frame_dealloc(f)
Guido van Rossum18752471997-04-29 14:49:28 +000098 PyFrameObject *f;
Guido van Rossum3f5da241990-12-20 15:06:42 +000099{
Guido van Rossum7582bfb1997-02-14 16:27:29 +0000100 int i;
101 PyObject **fastlocals;
102
103 /* Kill all local variables */
104 fastlocals = f->f_localsplus;
105 for (i = f->f_nlocals; --i >= 0; ++fastlocals) {
Guido van Rossum18752471997-04-29 14:49:28 +0000106 Py_XDECREF(*fastlocals);
Guido van Rossum7582bfb1997-02-14 16:27:29 +0000107 }
108
Guido van Rossum18752471997-04-29 14:49:28 +0000109 Py_XDECREF(f->f_back);
110 Py_XDECREF(f->f_code);
111 Py_XDECREF(f->f_builtins);
112 Py_XDECREF(f->f_globals);
113 Py_XDECREF(f->f_locals);
114 Py_XDECREF(f->f_trace);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000115 f->f_back = free_list;
116 free_list = f;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000117}
118
Guido van Rossum18752471997-04-29 14:49:28 +0000119PyTypeObject PyFrame_Type = {
120 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000121 0,
122 "frame",
Guido van Rossum18752471997-04-29 14:49:28 +0000123 sizeof(PyFrameObject),
Guido van Rossum3f5da241990-12-20 15:06:42 +0000124 0,
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000125 (destructor)frame_dealloc, /*tp_dealloc*/
Guido van Rossum3f5da241990-12-20 15:06:42 +0000126 0, /*tp_print*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000127 (getattrfunc)frame_getattr, /*tp_getattr*/
128 (setattrfunc)frame_setattr, /*tp_setattr*/
Guido van Rossum3f5da241990-12-20 15:06:42 +0000129 0, /*tp_compare*/
130 0, /*tp_repr*/
131 0, /*tp_as_number*/
132 0, /*tp_as_sequence*/
133 0, /*tp_as_mapping*/
134};
135
Guido van Rossum18752471997-04-29 14:49:28 +0000136PyFrameObject *
137PyFrame_New(back, code, globals, locals)
138 PyFrameObject *back;
139 PyCodeObject *code;
140 PyObject *globals;
141 PyObject *locals;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000142{
Guido van Rossum18752471997-04-29 14:49:28 +0000143 static PyObject *builtin_object;
144 PyFrameObject *f;
145 PyObject *builtins;
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000146 int extras = code->co_stacksize + code->co_nlocals;
147
Sjoerd Mullender5b7f3cd1995-04-04 11:47:41 +0000148 if (builtin_object == NULL) {
Guido van Rossumb56933e1997-01-18 07:58:41 +0000149 builtin_object = PyString_InternFromString("__builtins__");
Sjoerd Mullender5b7f3cd1995-04-04 11:47:41 +0000150 if (builtin_object == NULL)
151 return NULL;
152 }
Guido van Rossum18752471997-04-29 14:49:28 +0000153 if ((back != NULL && !PyFrame_Check(back)) ||
154 code == NULL || !PyCode_Check(code) ||
155 globals == NULL || !PyDict_Check(globals) ||
156 (locals != NULL && !PyDict_Check(locals))) {
157 PyErr_BadInternalCall();
Guido van Rossum3f5da241990-12-20 15:06:42 +0000158 return NULL;
159 }
Guido van Rossum18752471997-04-29 14:49:28 +0000160 builtins = PyDict_GetItem(globals, builtin_object);
161 if (builtins != NULL && PyModule_Check(builtins))
162 builtins = PyModule_GetDict(builtins);
163 if (builtins == NULL || !PyDict_Check(builtins)) {
164 PyErr_SetString(PyExc_TypeError,
165 "bad __builtins__ dictionary");
Guido van Rossumc1134821995-01-10 10:39:16 +0000166 return NULL;
167 }
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000168 if (free_list == NULL) {
Guido van Rossum18752471997-04-29 14:49:28 +0000169 f = (PyFrameObject *)
170 malloc(sizeof(PyFrameObject) +
171 extras*sizeof(PyObject *));
Guido van Rossum2271bf71995-07-18 14:30:34 +0000172 if (f == NULL)
Guido van Rossum18752471997-04-29 14:49:28 +0000173 return (PyFrameObject *)PyErr_NoMemory();
174 f->ob_type = &PyFrame_Type;
175 _Py_NewReference(f);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000176 }
177 else {
178 f = free_list;
179 free_list = free_list->f_back;
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000180 if (f->f_nlocals + f->f_stacksize < extras) {
Guido van Rossum18752471997-04-29 14:49:28 +0000181 f = realloc(f, sizeof(PyFrameObject) +
182 extras*sizeof(PyObject *));
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000183 if (f == NULL)
Guido van Rossum18752471997-04-29 14:49:28 +0000184 return (PyFrameObject *)PyErr_NoMemory();
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000185 }
Guido van Rossum747596a1997-01-24 04:00:21 +0000186 else
187 extras = f->f_nlocals + f->f_stacksize;
Guido van Rossum18752471997-04-29 14:49:28 +0000188 f->ob_type = &PyFrame_Type;
189 _Py_NewReference(f);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000190 }
Guido van Rossum18752471997-04-29 14:49:28 +0000191 Py_XINCREF(back);
Guido van Rossum2271bf71995-07-18 14:30:34 +0000192 f->f_back = back;
Guido van Rossum18752471997-04-29 14:49:28 +0000193 Py_INCREF(code);
Guido van Rossum2271bf71995-07-18 14:30:34 +0000194 f->f_code = code;
Guido van Rossum18752471997-04-29 14:49:28 +0000195 Py_XINCREF(builtins);
Guido van Rossum2271bf71995-07-18 14:30:34 +0000196 f->f_builtins = builtins;
Guido van Rossum18752471997-04-29 14:49:28 +0000197 Py_INCREF(globals);
Guido van Rossum2271bf71995-07-18 14:30:34 +0000198 f->f_globals = globals;
Guido van Rossumbdd207a1995-07-26 16:14:30 +0000199 if (code->co_flags & CO_NEWLOCALS) {
200 if (code->co_flags & CO_OPTIMIZED)
201 locals = NULL; /* Let fast_2_locals handle it */
202 else {
Guido van Rossum18752471997-04-29 14:49:28 +0000203 locals = PyDict_New();
Guido van Rossumbdd207a1995-07-26 16:14:30 +0000204 if (locals == NULL) {
Guido van Rossum18752471997-04-29 14:49:28 +0000205 Py_DECREF(f);
Guido van Rossumbdd207a1995-07-26 16:14:30 +0000206 return NULL;
207 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000208 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000209 }
Guido van Rossum2271bf71995-07-18 14:30:34 +0000210 else {
211 if (locals == NULL)
212 locals = globals;
Guido van Rossum18752471997-04-29 14:49:28 +0000213 Py_INCREF(locals);
Guido van Rossum2271bf71995-07-18 14:30:34 +0000214 }
215 f->f_locals = locals;
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000216 f->f_trace = NULL;
217
Guido van Rossum2271bf71995-07-18 14:30:34 +0000218 f->f_lasti = 0;
Guido van Rossum747596a1997-01-24 04:00:21 +0000219 f->f_lineno = code->co_firstlineno;
Guido van Rossum18752471997-04-29 14:49:28 +0000220 f->f_restricted = (builtins != PyBuiltin_GetDict());
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000221 f->f_iblock = 0;
222 f->f_nlocals = code->co_nlocals;
Guido van Rossum747596a1997-01-24 04:00:21 +0000223 f->f_stacksize = extras - code->co_nlocals;
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000224
225 while (--extras >= 0)
226 f->f_localsplus[extras] = NULL;
227
228 f->f_valuestack = f->f_localsplus + f->f_nlocals;
229
Guido van Rossum3f5da241990-12-20 15:06:42 +0000230 return f;
231}
232
Guido van Rossum3f5da241990-12-20 15:06:42 +0000233/* Block management */
234
235void
Guido van Rossum18752471997-04-29 14:49:28 +0000236PyFrame_BlockSetup(f, type, handler, level)
237 PyFrameObject *f;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000238 int type;
239 int handler;
240 int level;
241{
Guido van Rossum18752471997-04-29 14:49:28 +0000242 PyTryBlock *b;
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000243 if (f->f_iblock >= CO_MAXBLOCKS)
Guido van Rossum18752471997-04-29 14:49:28 +0000244 Py_FatalError("XXX block stack overflow");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000245 b = &f->f_blockstack[f->f_iblock++];
246 b->b_type = type;
247 b->b_level = level;
248 b->b_handler = handler;
249}
250
Guido van Rossum18752471997-04-29 14:49:28 +0000251PyTryBlock *
252PyFrame_BlockPop(f)
253 PyFrameObject *f;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000254{
Guido van Rossum18752471997-04-29 14:49:28 +0000255 PyTryBlock *b;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000256 if (f->f_iblock <= 0)
Guido van Rossum18752471997-04-29 14:49:28 +0000257 Py_FatalError("XXX block stack underflow");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000258 b = &f->f_blockstack[--f->f_iblock];
259 return b;
260}
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000261
262/* Convert between "fast" version of locals and dictionary version */
263
264void
Guido van Rossum18752471997-04-29 14:49:28 +0000265PyFrame_FastToLocals(f)
266 PyFrameObject *f;
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000267{
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000268 /* Merge fast locals into f->f_locals */
Guido van Rossum18752471997-04-29 14:49:28 +0000269 PyObject *locals, *map;
270 PyObject **fast;
271 PyObject *error_type, *error_value, *error_traceback;
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000272 int j;
273 if (f == NULL)
274 return;
Guido van Rossum2271bf71995-07-18 14:30:34 +0000275 locals = f->f_locals;
276 if (locals == NULL) {
Guido van Rossum18752471997-04-29 14:49:28 +0000277 locals = f->f_locals = PyDict_New();
Guido van Rossum2271bf71995-07-18 14:30:34 +0000278 if (locals == NULL) {
Guido van Rossum18752471997-04-29 14:49:28 +0000279 PyErr_Clear(); /* Can't report it :-( */
Guido van Rossum2271bf71995-07-18 14:30:34 +0000280 return;
281 }
282 }
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000283 if (f->f_nlocals == 0)
Guido van Rossumbdd207a1995-07-26 16:14:30 +0000284 return;
285 map = f->f_code->co_varnames;
Guido van Rossum18752471997-04-29 14:49:28 +0000286 if (!PyDict_Check(locals) || !PyTuple_Check(map))
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000287 return;
Guido van Rossum18752471997-04-29 14:49:28 +0000288 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000289 fast = f->f_localsplus;
Guido van Rossum18752471997-04-29 14:49:28 +0000290 j = PyTuple_Size(map);
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000291 if (j > f->f_nlocals)
292 j = f->f_nlocals;
293 for (; --j >= 0; ) {
Guido van Rossum18752471997-04-29 14:49:28 +0000294 PyObject *key = PyTuple_GetItem(map, j);
295 PyObject *value = fast[j];
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000296 if (value == NULL) {
Guido van Rossum18752471997-04-29 14:49:28 +0000297 PyErr_Clear();
298 if (PyDict_DelItem(locals, key) != 0)
299 PyErr_Clear();
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000300 }
301 else {
Guido van Rossum18752471997-04-29 14:49:28 +0000302 if (PyDict_SetItem(locals, key, value) != 0)
303 PyErr_Clear();
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000304 }
305 }
Guido van Rossum18752471997-04-29 14:49:28 +0000306 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000307}
308
309void
Guido van Rossum18752471997-04-29 14:49:28 +0000310PyFrame_LocalsToFast(f, clear)
311 PyFrameObject *f;
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000312 int clear;
313{
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000314 /* Merge f->f_locals into fast locals */
Guido van Rossum18752471997-04-29 14:49:28 +0000315 PyObject *locals, *map;
316 PyObject **fast;
317 PyObject *error_type, *error_value, *error_traceback;
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000318 int j;
319 if (f == NULL)
320 return;
321 locals = f->f_locals;
Guido van Rossum2271bf71995-07-18 14:30:34 +0000322 map = f->f_code->co_varnames;
Guido van Rossum3bb63a81997-01-20 04:29:16 +0000323 if (locals == NULL || f->f_code->co_nlocals == 0)
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000324 return;
Guido van Rossum18752471997-04-29 14:49:28 +0000325 if (!PyDict_Check(locals) || !PyTuple_Check(map))
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000326 return;
Guido van Rossum18752471997-04-29 14:49:28 +0000327 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000328 fast = f->f_localsplus;
Guido van Rossum18752471997-04-29 14:49:28 +0000329 j = PyTuple_Size(map);
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000330 if (j > f->f_nlocals)
331 j = f->f_nlocals;
332 for (; --j >= 0; ) {
Guido van Rossum18752471997-04-29 14:49:28 +0000333 PyObject *key = PyTuple_GetItem(map, j);
334 PyObject *value = PyDict_GetItem(locals, key);
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000335 if (value == NULL)
Guido van Rossum18752471997-04-29 14:49:28 +0000336 PyErr_Clear();
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000337 else
Guido van Rossum18752471997-04-29 14:49:28 +0000338 Py_INCREF(value);
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000339 if (value != NULL || clear) {
Guido van Rossum18752471997-04-29 14:49:28 +0000340 Py_XDECREF(fast[j]);
Guido van Rossumf3e85a01997-01-20 04:20:52 +0000341 fast[j] = value;
342 }
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000343 }
Guido van Rossum18752471997-04-29 14:49:28 +0000344 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000345}