blob: 5a9723fc27bde4b61324afcfc3b3bbe740b6cd34 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
2Copyright 1991 by Stichting Mathematisch Centrum, Amsterdam, The
3Netherlands.
4
5 All Rights Reserved
6
7Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
9provided that the above copyright notice appear in all copies and that
10both that copyright notice and this permission notice appear in
11supporting documentation, and that the names of Stichting Mathematisch
12Centrum or CWI not be used in advertising or publicity pertaining to
13distribution of the software without specific, written prior permission.
14
15STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
16THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
17FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
18FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
20ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
21OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
22
23******************************************************************/
24
Guido van Rossum3f5da241990-12-20 15:06:42 +000025/* Execute compiled code */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000026
Guido van Rossum3f5da241990-12-20 15:06:42 +000027#include "allobjects.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000028
Guido van Rossum10dc2e81990-11-18 17:27:39 +000029#include "import.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000030#include "sysmodule.h"
31#include "compile.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000032#include "frameobject.h"
33#include "ceval.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000034#include "opcode.h"
Guido van Rossum86cd6e61991-01-21 15:12:35 +000035#include "bltinmodule.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000036#include "traceback.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000037
Guido van Rossum3f5da241990-12-20 15:06:42 +000038#ifndef NDEBUG
39#define TRACE
Guido van Rossum10dc2e81990-11-18 17:27:39 +000040#endif
41
Guido van Rossum3f5da241990-12-20 15:06:42 +000042#ifdef TRACE
43static int
44prtrace(v, str)
45 object *v;
46 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +000047{
Guido van Rossum3f5da241990-12-20 15:06:42 +000048 printf("%s ", str);
49 printobject(v, stdout, 0);
50 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +000051}
Guido van Rossum3f5da241990-12-20 15:06:42 +000052#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +000053
Guido van Rossum3f5da241990-12-20 15:06:42 +000054static frameobject *current_frame;
Guido van Rossum10dc2e81990-11-18 17:27:39 +000055
Guido van Rossum3f5da241990-12-20 15:06:42 +000056object *
57getlocals()
Guido van Rossum10dc2e81990-11-18 17:27:39 +000058{
Guido van Rossum3f5da241990-12-20 15:06:42 +000059 if (current_frame == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +000060 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000061 else
62 return current_frame->f_locals;
63}
64
65object *
66getglobals()
67{
68 if (current_frame == NULL)
69 return NULL;
70 else
71 return current_frame->f_globals;
72}
73
74void
75printtraceback(fp)
76 FILE *fp;
77{
78 object *v = tb_fetch();
79 if (v != NULL) {
80 fprintf(fp, "Stack backtrace (innermost last):\n");
81 tb_print(v, fp);
82 DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +000083 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +000084}
85
86
87/* XXX Mixing "print ...," and direct file I/O on stdin/stdout
88 XXX has some bad consequences. The needspace flag should
89 XXX really be part of the file object. */
90
91static int needspace;
92
93void
94flushline()
95{
96 FILE *fp = sysgetfile("stdout", stdout);
97 if (needspace) {
98 fprintf(fp, "\n");
99 needspace = 0;
100 }
101}
102
Guido van Rossum3f5da241990-12-20 15:06:42 +0000103
104/* Test a value used as condition, e.g., in a for or if statement */
105
106static int
107testbool(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000108 object *v;
109{
Guido van Rossum3f5da241990-12-20 15:06:42 +0000110 if (is_intobject(v))
111 return getintvalue(v) != 0;
112 if (is_floatobject(v))
113 return getfloatvalue(v) != 0.0;
114 if (v->ob_type->tp_as_sequence != NULL)
115 return (*v->ob_type->tp_as_sequence->sq_length)(v) != 0;
116 if (v->ob_type->tp_as_mapping != NULL)
117 return (*v->ob_type->tp_as_mapping->mp_length)(v) != 0;
118 if (v == None)
119 return 0;
120 /* All other objects are 'true' */
121 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000122}
123
124static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000125add(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000126 object *v, *w;
127{
128 if (v->ob_type->tp_as_number != NULL)
129 v = (*v->ob_type->tp_as_number->nb_add)(v, w);
130 else if (v->ob_type->tp_as_sequence != NULL)
131 v = (*v->ob_type->tp_as_sequence->sq_concat)(v, w);
132 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000133 err_setstr(TypeError, "+ not supported by operands");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000134 return NULL;
135 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000136 return v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000137}
138
139static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000140sub(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000141 object *v, *w;
142{
143 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000144 return (*v->ob_type->tp_as_number->nb_subtract)(v, w);
145 err_setstr(TypeError, "bad operand type(s) for -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000146 return NULL;
147}
148
149static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000150mul(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000151 object *v, *w;
152{
153 typeobject *tp;
154 if (is_intobject(v) && w->ob_type->tp_as_sequence != NULL) {
155 /* int*sequence -- swap v and w */
156 object *tmp = v;
157 v = w;
158 w = tmp;
159 }
160 tp = v->ob_type;
161 if (tp->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000162 return (*tp->tp_as_number->nb_multiply)(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000163 if (tp->tp_as_sequence != NULL) {
164 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000165 err_setstr(TypeError,
166 "can't multiply sequence with non-int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000167 return NULL;
168 }
169 if (tp->tp_as_sequence->sq_repeat == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000170 err_setstr(TypeError, "sequence does not support *");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000171 return NULL;
172 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000173 return (*tp->tp_as_sequence->sq_repeat)
174 (v, (int)getintvalue(w));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000175 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000176 err_setstr(TypeError, "bad operand type(s) for *");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000177 return NULL;
178}
179
180static object *
Guido van Rossum40d0b7e1990-12-20 23:03:11 +0000181divide(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000182 object *v, *w;
183{
184 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000185 return (*v->ob_type->tp_as_number->nb_divide)(v, w);
186 err_setstr(TypeError, "bad operand type(s) for /");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000187 return NULL;
188}
189
190static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000191rem(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000192 object *v, *w;
193{
194 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000195 return (*v->ob_type->tp_as_number->nb_remainder)(v, w);
196 err_setstr(TypeError, "bad operand type(s) for %");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000197 return NULL;
198}
199
200static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000201neg(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000202 object *v;
203{
204 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000205 return (*v->ob_type->tp_as_number->nb_negative)(v);
206 err_setstr(TypeError, "bad operand type(s) for unary -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000207 return NULL;
208}
209
210static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000211pos(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000212 object *v;
213{
214 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000215 return (*v->ob_type->tp_as_number->nb_positive)(v);
216 err_setstr(TypeError, "bad operand type(s) for unary +");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000217 return NULL;
218}
219
220static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000221not(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000222 object *v;
223{
Guido van Rossum3f5da241990-12-20 15:06:42 +0000224 int outcome = testbool(v);
225 object *w = outcome == 0 ? True : False;
226 INCREF(w);
227 return w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000228}
229
230static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000231call_builtin(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000232 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000233 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000234{
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000235 if (is_methodobject(func)) {
236 method meth = getmethod(func);
237 object *self = getself(func);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000238 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000239 }
240 if (is_classobject(func)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000241 if (arg != NULL) {
242 err_setstr(TypeError,
243 "classobject() allows no arguments");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000244 return NULL;
245 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000246 return newclassmemberobject(func);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000247 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000248 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000249 return NULL;
250}
251
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000252static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000253call_function(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000254 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000255 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000256{
Guido van Rossum3f5da241990-12-20 15:06:42 +0000257 object *newarg = NULL;
258 object *newlocals, *newglobals;
259 object *co, *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000260
261 if (is_classmethodobject(func)) {
262 object *self = classmethodgetself(func);
263 func = classmethodgetfunc(func);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000264 if (arg == NULL) {
265 arg = self;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000266 }
267 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000268 newarg = newtupleobject(2);
269 if (newarg == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000270 return NULL;
271 INCREF(self);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000272 INCREF(arg);
273 settupleitem(newarg, 0, self);
274 settupleitem(newarg, 1, arg);
275 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000276 }
277 }
278 else {
279 if (!is_funcobject(func)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000280 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000281 return NULL;
282 }
283 }
284
Guido van Rossum3f5da241990-12-20 15:06:42 +0000285 co = getfunccode(func);
286 if (co == NULL) {
287 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000288 return NULL;
289 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000290 if (!is_codeobject(co)) {
291 fprintf(stderr, "XXX Bad code\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000292 abort();
293 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000294 newlocals = newdictobject();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000295 if (newlocals == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000296 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000297 return NULL;
298 }
299
Guido van Rossum3f5da241990-12-20 15:06:42 +0000300 newglobals = getfuncglobals(func);
301 INCREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000302
Guido van Rossum3f5da241990-12-20 15:06:42 +0000303 v = eval_code((codeobject *)co, newglobals, newlocals, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000304
Guido van Rossum3f5da241990-12-20 15:06:42 +0000305 DECREF(newlocals);
306 DECREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000307
Guido van Rossum3f5da241990-12-20 15:06:42 +0000308 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000309
310 return v;
311}
312
313static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000314apply_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000315 object *v, *w;
316{
317 typeobject *tp = v->ob_type;
318 if (tp->tp_as_sequence == NULL && tp->tp_as_mapping == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000319 err_setstr(TypeError, "unsubscriptable object");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000320 return NULL;
321 }
322 if (tp->tp_as_sequence != NULL) {
323 int i;
324 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000325 err_setstr(TypeError, "sequence subscript not int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000326 return NULL;
327 }
328 i = getintvalue(w);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000329 return (*tp->tp_as_sequence->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000330 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000331 return (*tp->tp_as_mapping->mp_subscript)(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000332}
333
334static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000335loop_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000336 object *v, *w;
337{
338 sequence_methods *sq = v->ob_type->tp_as_sequence;
339 int i, n;
340 if (sq == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000341 err_setstr(TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000342 return NULL;
343 }
344 i = getintvalue(w);
345 n = (*sq->sq_length)(v);
346 if (i >= n)
347 return NULL; /* End of loop */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000348 return (*sq->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000349}
350
351static int
Guido van Rossum3f5da241990-12-20 15:06:42 +0000352slice_index(v, isize, pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000353 object *v;
354 int isize;
355 int *pi;
356{
357 if (v != NULL) {
358 if (!is_intobject(v)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000359 err_setstr(TypeError, "slice index must be int");
360 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000361 }
362 *pi = getintvalue(v);
363 if (*pi < 0)
364 *pi += isize;
365 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000366 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000367}
368
369static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000370apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000371 object *u, *v, *w;
372{
373 typeobject *tp = u->ob_type;
374 int ilow, ihigh, isize;
375 if (tp->tp_as_sequence == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000376 err_setstr(TypeError, "only sequences can be sliced");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000377 return NULL;
378 }
379 ilow = 0;
380 isize = ihigh = (*tp->tp_as_sequence->sq_length)(u);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000381 if (slice_index(v, isize, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000382 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000383 if (slice_index(w, isize, &ihigh) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000384 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000385 return (*tp->tp_as_sequence->sq_slice)(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000386}
Guido van Rossum3f5da241990-12-20 15:06:42 +0000387
388static int
389assign_subscript(w, key, v) /* w[key] = v */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000390 object *w;
391 object *key;
392 object *v;
393{
394 typeobject *tp = w->ob_type;
395 sequence_methods *sq;
396 mapping_methods *mp;
397 int (*func)();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000398 if ((sq = tp->tp_as_sequence) != NULL &&
399 (func = sq->sq_ass_item) != NULL) {
400 if (!is_intobject(key)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000401 err_setstr(TypeError,
402 "sequence subscript must be integer");
403 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000404 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000405 else
406 return (*func)(w, (int)getintvalue(key), v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000407 }
408 else if ((mp = tp->tp_as_mapping) != NULL &&
409 (func = mp->mp_ass_subscript) != NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000410 return (*func)(w, key, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000411 }
412 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000413 err_setstr(TypeError,
414 "can't assign to this subscripted object");
415 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000416 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000417}
418
Guido van Rossum3f5da241990-12-20 15:06:42 +0000419static int
420assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000421 object *u, *v, *w, *x;
422{
Guido van Rossum3f5da241990-12-20 15:06:42 +0000423 sequence_methods *sq = u->ob_type->tp_as_sequence;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000424 int ilow, ihigh, isize;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000425 if (sq == NULL) {
426 err_setstr(TypeError, "assign to slice of non-sequence");
427 return -1;
428 }
429 if (sq == NULL || sq->sq_ass_slice == NULL) {
430 err_setstr(TypeError, "unassignable slice");
431 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000432 }
433 ilow = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000434 isize = ihigh = (*sq->sq_length)(u);
435 if (slice_index(v, isize, &ilow) != 0)
436 return -1;
437 if (slice_index(w, isize, &ihigh) != 0)
438 return -1;
439 return (*sq->sq_ass_slice)(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000440}
441
442static int
443cmp_exception(err, v)
444 object *err, *v;
445{
446 if (is_tupleobject(v)) {
447 int i, n;
448 n = gettuplesize(v);
449 for (i = 0; i < n; i++) {
450 if (err == gettupleitem(v, i))
451 return 1;
452 }
453 return 0;
454 }
455 return err == v;
456}
457
Guido van Rossum3f5da241990-12-20 15:06:42 +0000458static int
459cmp_member(v, w)
460 object *v, *w;
461{
462 int i, n, cmp;
463 object *x;
464 sequence_methods *sq;
465 /* Special case for char in string */
466 if (is_stringobject(w)) {
467 register char *s, *end;
468 register char c;
469 if (!is_stringobject(v) || getstringsize(v) != 1) {
470 err_setstr(TypeError,
471 "string member test needs char left operand");
472 return -1;
473 }
474 c = getstringvalue(v)[0];
475 s = getstringvalue(w);
476 end = s + getstringsize(w);
477 while (s < end) {
478 if (c == *s++)
479 return 1;
480 }
481 return 0;
482 }
483 sq = w->ob_type->tp_as_sequence;
484 if (sq == NULL) {
485 err_setstr(TypeError,
486 "'in' or 'not in' needs sequence right argument");
487 return -1;
488 }
489 n = (*sq->sq_length)(w);
490 for (i = 0; i < n; i++) {
491 x = (*sq->sq_item)(w, i);
492 cmp = cmpobject(v, x);
493 XDECREF(x);
494 if (cmp == 0)
495 return 1;
496 }
497 return 0;
498}
499
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000500static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000501cmp_outcome(op, v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000502 enum cmp_op op;
503 register object *v;
504 register object *w;
505{
506 register int cmp;
507 register int res = 0;
508 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000509 case IS:
510 case IS_NOT:
511 res = (v == w);
512 if (op == IS_NOT)
513 res = !res;
514 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000515 case IN:
516 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +0000517 res = cmp_member(v, w);
518 if (res < 0)
519 return NULL;
520 if (op == NOT_IN)
521 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000522 break;
523 case EXC_MATCH:
Guido van Rossum3f5da241990-12-20 15:06:42 +0000524 res = cmp_exception(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000525 break;
526 default:
Guido van Rossum3f5da241990-12-20 15:06:42 +0000527 cmp = cmpobject(v, w);
528 switch (op) {
529 case LT: res = cmp < 0; break;
530 case LE: res = cmp <= 0; break;
531 case EQ: res = cmp == 0; break;
532 case NE: res = cmp != 0; break;
533 case GT: res = cmp > 0; break;
534 case GE: res = cmp >= 0; break;
535 /* XXX no default? (res is initialized to 0 though) */
536 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000537 }
538 v = res ? True : False;
539 INCREF(v);
540 return v;
541}
542
Guido van Rossum3f5da241990-12-20 15:06:42 +0000543static int
544import_from(locals, v, name)
545 object *locals;
Guido van Rossume9736fc1990-11-18 17:33:06 +0000546 object *v;
547 char *name;
548{
549 object *w, *x;
550 w = getmoduledict(v);
551 if (name[0] == '*') {
552 int i;
553 int n = getdictsize(w);
554 for (i = 0; i < n; i++) {
555 name = getdictkey(w, i);
556 if (name == NULL || name[0] == '_')
557 continue;
558 x = dictlookup(w, name);
559 if (x == NULL) {
560 /* XXX can't happen? */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000561 err_setstr(NameError, name);
562 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +0000563 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000564 if (dictinsert(locals, name, x) != 0)
565 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +0000566 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000567 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +0000568 }
569 else {
570 x = dictlookup(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000571 if (x == NULL) {
572 err_setstr(NameError, name);
573 return -1;
574 }
575 else
576 return dictinsert(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +0000577 }
578}
579
580static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000581build_class(v, w)
Guido van Rossume9736fc1990-11-18 17:33:06 +0000582 object *v; /* None or tuple containing base classes */
583 object *w; /* dictionary */
584{
585 if (is_tupleobject(v)) {
586 int i;
587 for (i = gettuplesize(v); --i >= 0; ) {
588 object *x = gettupleitem(v, i);
589 if (!is_classobject(x)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000590 err_setstr(TypeError,
591 "base is not a class object");
Guido van Rossume9736fc1990-11-18 17:33:06 +0000592 return NULL;
593 }
594 }
595 }
596 else {
597 v = NULL;
598 }
599 if (!is_dictobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000600 err_setstr(SystemError, "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +0000601 return NULL;
602 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000603 return newclassobject(v, w);
Guido van Rossume9736fc1990-11-18 17:33:06 +0000604}
605
Guido van Rossum3f5da241990-12-20 15:06:42 +0000606
607/* Status code for main loop (reason for stack unwind) */
608
609enum why_code {
610 WHY_NOT, /* No error */
611 WHY_EXCEPTION, /* Exception occurred */
612 WHY_RERAISE, /* Exception re-raised by 'finally' */
613 WHY_RETURN, /* 'return' statement */
614 WHY_BREAK /* 'break' statement */
615};
616
617/* Interpreter main loop */
618
619object *
620eval_code(co, globals, locals, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000621 codeobject *co;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000622 object *globals;
623 object *locals;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000624 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000625{
Guido van Rossum3f5da241990-12-20 15:06:42 +0000626 register unsigned char *next_instr;
627 register int opcode; /* Current opcode */
628 register int oparg; /* Current opcode argument, if any */
629 register object **stack_pointer;
630 register enum why_code why; /* Reason for block stack unwind */
631 register int err; /* Error status -- nonzero if error */
632 register object *x; /* Result object -- NULL if error */
633 register object *v; /* Temporary objects popped off stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000634 register object *w;
635 register object *u;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000636 register object *t;
637 register frameobject *f; /* Current frame */
638 int lineno; /* Current line number */
639 object *retval; /* Return value iff why == WHY_RETURN */
640 char *name; /* Name used by some instructions */
641 FILE *fp; /* Used by print operations */
642#ifdef TRACE
643 int trace = dictlookup(globals, "__trace__") != NULL;
644#endif
645
646/* Code access macros */
647
648#define GETCONST(i) Getconst(f, i)
649#define GETNAME(i) Getname(f, i)
Guido van Rossumb8824951991-04-03 18:59:50 +0000650#define GETNAMEV(i) Getnamev(f, i)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000651#define FIRST_INSTR() (GETUSTRINGVALUE(f->f_code->co_code))
652#define INSTR_OFFSET() (next_instr - FIRST_INSTR())
653#define NEXTOP() (*next_instr++)
654#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
655#define JUMPTO(x) (next_instr = FIRST_INSTR() + (x))
656#define JUMPBY(x) (next_instr += (x))
657
658/* Stack manipulation macros */
659
660#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
661#define EMPTY() (STACK_LEVEL() == 0)
662#define TOP() (stack_pointer[-1])
663#define BASIC_PUSH(v) (*stack_pointer++ = (v))
664#define BASIC_POP() (*--stack_pointer)
665
666#ifdef TRACE
667#define PUSH(v) (BASIC_PUSH(v), trace && prtrace(TOP(), "push"))
668#define POP() (trace && prtrace(TOP(), "pop"), BASIC_POP())
669#else
670#define PUSH(v) BASIC_PUSH(v)
671#define POP() BASIC_POP()
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000672#endif
673
674 f = newframeobject(
Guido van Rossum3f5da241990-12-20 15:06:42 +0000675 current_frame, /*back*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000676 co, /*code*/
Guido van Rossum3f5da241990-12-20 15:06:42 +0000677 globals, /*globals*/
678 locals, /*locals*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000679 50, /*nvalues*/
680 20); /*nblocks*/
Guido van Rossum3f5da241990-12-20 15:06:42 +0000681 if (f == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000682 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000683
684 current_frame = f;
685
686 next_instr = GETUSTRINGVALUE(f->f_code->co_code);
687
688 stack_pointer = f->f_valuestack;
689
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000690 if (arg != NULL) {
691 INCREF(arg);
692 PUSH(arg);
693 }
694
Guido van Rossum3f5da241990-12-20 15:06:42 +0000695 why = WHY_NOT;
696 err = 0;
697 x = None; /* Not a reference, just anything non-NULL */
698 lineno = -1;
699
700 for (;;) {
701 static ticker;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000702
Guido van Rossum3f5da241990-12-20 15:06:42 +0000703 /* Do periodic things */
704
705 if (--ticker < 0) {
706 ticker = 100;
707 if (intrcheck()) {
708 err_set(KeyboardInterrupt);
709 why = WHY_EXCEPTION;
710 tb_here(f, INSTR_OFFSET(), lineno);
711 break;
712 }
713 }
714
715 /* Extract opcode and argument */
716
717 opcode = NEXTOP();
718 if (HAS_ARG(opcode))
719 oparg = NEXTARG();
720
721#ifdef TRACE
722 /* Instruction tracing */
723
724 if (trace) {
725 if (HAS_ARG(opcode)) {
726 printf("%d: %d, %d\n",
727 (int) (INSTR_OFFSET() - 3),
728 opcode, oparg);
729 }
730 else {
731 printf("%d: %d\n",
732 (int) (INSTR_OFFSET() - 1), opcode);
733 }
734 }
735#endif
736
737 /* Main switch on opcode */
738
739 switch (opcode) {
740
741 /* BEWARE!
742 It is essential that any operation that fails sets either
743 x to NULL, err to nonzero, or why to anything but WHY_NOT,
744 and that no operation that succeeds does this! */
745
746 /* case STOP_CODE: this is an error! */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000747
748 case POP_TOP:
749 v = POP();
750 DECREF(v);
751 break;
752
753 case ROT_TWO:
754 v = POP();
755 w = POP();
756 PUSH(v);
757 PUSH(w);
758 break;
759
760 case ROT_THREE:
761 v = POP();
762 w = POP();
763 x = POP();
764 PUSH(v);
765 PUSH(x);
766 PUSH(w);
767 break;
768
Guido van Rossum3f5da241990-12-20 15:06:42 +0000769 case DUP_TOP:
770 v = TOP();
771 INCREF(v);
772 PUSH(v);
773 break;
774
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000775 case UNARY_POSITIVE:
776 v = POP();
Guido van Rossum3f5da241990-12-20 15:06:42 +0000777 x = pos(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000778 DECREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000779 PUSH(x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000780 break;
781
782 case UNARY_NEGATIVE:
783 v = POP();
Guido van Rossum3f5da241990-12-20 15:06:42 +0000784 x = neg(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000785 DECREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000786 PUSH(x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000787 break;
788
789 case UNARY_NOT:
790 v = POP();
Guido van Rossum3f5da241990-12-20 15:06:42 +0000791 x = not(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000792 DECREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000793 PUSH(x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000794 break;
795
796 case UNARY_CONVERT:
797 v = POP();
Guido van Rossum3f5da241990-12-20 15:06:42 +0000798 x = reprobject(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000799 DECREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000800 PUSH(x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000801 break;
802
803 case UNARY_CALL:
804 v = POP();
Guido van Rossume9736fc1990-11-18 17:33:06 +0000805 if (is_classmethodobject(v) || is_funcobject(v))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000806 x = call_function(v, (object *)NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000807 else
Guido van Rossum3f5da241990-12-20 15:06:42 +0000808 x = call_builtin(v, (object *)NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000809 DECREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000810 PUSH(x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000811 break;
812
813 case BINARY_MULTIPLY:
814 w = POP();
815 v = POP();
Guido van Rossum3f5da241990-12-20 15:06:42 +0000816 x = mul(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000817 DECREF(v);
818 DECREF(w);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000819 PUSH(x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000820 break;
821
822 case BINARY_DIVIDE:
823 w = POP();
824 v = POP();
Guido van Rossum40d0b7e1990-12-20 23:03:11 +0000825 x = divide(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000826 DECREF(v);
827 DECREF(w);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000828 PUSH(x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000829 break;
830
831 case BINARY_MODULO:
832 w = POP();
833 v = POP();
Guido van Rossum3f5da241990-12-20 15:06:42 +0000834 x = rem(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000835 DECREF(v);
836 DECREF(w);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000837 PUSH(x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000838 break;
839
840 case BINARY_ADD:
841 w = POP();
842 v = POP();
Guido van Rossum3f5da241990-12-20 15:06:42 +0000843 x = add(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000844 DECREF(v);
845 DECREF(w);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000846 PUSH(x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000847 break;
848
849 case BINARY_SUBTRACT:
850 w = POP();
851 v = POP();
Guido van Rossum3f5da241990-12-20 15:06:42 +0000852 x = sub(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000853 DECREF(v);
854 DECREF(w);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000855 PUSH(x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000856 break;
857
858 case BINARY_SUBSCR:
859 w = POP();
860 v = POP();
Guido van Rossum3f5da241990-12-20 15:06:42 +0000861 x = apply_subscript(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000862 DECREF(v);
863 DECREF(w);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000864 PUSH(x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000865 break;
866
867 case BINARY_CALL:
868 w = POP();
869 v = POP();
Guido van Rossume9736fc1990-11-18 17:33:06 +0000870 if (is_classmethodobject(v) || is_funcobject(v))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000871 x = call_function(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000872 else
Guido van Rossum3f5da241990-12-20 15:06:42 +0000873 x = call_builtin(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000874 DECREF(v);
875 DECREF(w);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000876 PUSH(x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000877 break;
878
Guido van Rossume9736fc1990-11-18 17:33:06 +0000879 case SLICE+0:
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000880 case SLICE+1:
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000881 case SLICE+2:
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000882 case SLICE+3:
Guido van Rossum3f5da241990-12-20 15:06:42 +0000883 if ((opcode-SLICE) & 2)
Guido van Rossume9736fc1990-11-18 17:33:06 +0000884 w = POP();
885 else
886 w = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000887 if ((opcode-SLICE) & 1)
Guido van Rossume9736fc1990-11-18 17:33:06 +0000888 v = POP();
889 else
890 v = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000891 u = POP();
Guido van Rossum3f5da241990-12-20 15:06:42 +0000892 x = apply_slice(u, v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000893 DECREF(u);
Guido van Rossume9736fc1990-11-18 17:33:06 +0000894 XDECREF(v);
895 XDECREF(w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000896 PUSH(x);
897 break;
898
Guido van Rossume9736fc1990-11-18 17:33:06 +0000899 case STORE_SLICE+0:
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000900 case STORE_SLICE+1:
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000901 case STORE_SLICE+2:
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000902 case STORE_SLICE+3:
Guido van Rossum3f5da241990-12-20 15:06:42 +0000903 if ((opcode-STORE_SLICE) & 2)
Guido van Rossume9736fc1990-11-18 17:33:06 +0000904 w = POP();
905 else
906 w = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000907 if ((opcode-STORE_SLICE) & 1)
Guido van Rossume9736fc1990-11-18 17:33:06 +0000908 v = POP();
909 else
910 v = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000911 u = POP();
Guido van Rossum3f5da241990-12-20 15:06:42 +0000912 t = POP();
913 err = assign_slice(u, v, w, t); /* u[v:w] = t */
914 DECREF(t);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000915 DECREF(u);
Guido van Rossume9736fc1990-11-18 17:33:06 +0000916 XDECREF(v);
917 XDECREF(w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000918 break;
919
Guido van Rossume9736fc1990-11-18 17:33:06 +0000920 case DELETE_SLICE+0:
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000921 case DELETE_SLICE+1:
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000922 case DELETE_SLICE+2:
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000923 case DELETE_SLICE+3:
Guido van Rossum3f5da241990-12-20 15:06:42 +0000924 if ((opcode-DELETE_SLICE) & 2)
Guido van Rossume9736fc1990-11-18 17:33:06 +0000925 w = POP();
926 else
927 w = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000928 if ((opcode-DELETE_SLICE) & 1)
Guido van Rossume9736fc1990-11-18 17:33:06 +0000929 v = POP();
930 else
931 v = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000932 u = POP();
Guido van Rossum3f5da241990-12-20 15:06:42 +0000933 err = assign_slice(u, v, w, (object *)NULL);
934 /* del u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000935 DECREF(u);
Guido van Rossume9736fc1990-11-18 17:33:06 +0000936 XDECREF(v);
937 XDECREF(w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000938 break;
939
940 case STORE_SUBSCR:
941 w = POP();
942 v = POP();
943 u = POP();
944 /* v[w] = u */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000945 err = assign_subscript(v, w, u);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000946 DECREF(u);
947 DECREF(v);
948 DECREF(w);
949 break;
950
951 case DELETE_SUBSCR:
952 w = POP();
953 v = POP();
954 /* del v[w] */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000955 err = assign_subscript(v, w, (object *)NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000956 DECREF(v);
957 DECREF(w);
958 break;
959
960 case PRINT_EXPR:
961 v = POP();
962 fp = sysgetfile("stdout", stdout);
963 /* Print value except if procedure result */
964 if (v != None) {
965 flushline();
966 printobject(v, fp, 0);
967 fprintf(fp, "\n");
968 }
969 DECREF(v);
970 break;
971
972 case PRINT_ITEM:
973 v = POP();
974 fp = sysgetfile("stdout", stdout);
975 if (needspace)
976 fprintf(fp, " ");
977 if (is_stringobject(v)) {
978 char *s = getstringvalue(v);
979 int len = getstringsize(v);
980 fwrite(s, 1, len, fp);
981 if (len > 0 && s[len-1] == '\n')
982 needspace = 0;
983 else
984 needspace = 1;
985 }
986 else {
987 printobject(v, fp, 0);
988 needspace = 1;
989 }
990 DECREF(v);
991 break;
992
993 case PRINT_NEWLINE:
994 fp = sysgetfile("stdout", stdout);
995 fprintf(fp, "\n");
996 needspace = 0;
997 break;
998
999 case BREAK_LOOP:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001000 why = WHY_BREAK;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001001 break;
1002
1003 case RAISE_EXCEPTION:
1004 v = POP();
1005 w = POP();
Guido van Rossum3f5da241990-12-20 15:06:42 +00001006 if (!is_stringobject(w))
1007 err_setstr(TypeError,
1008 "exceptions must be strings");
1009 else
1010 err_setval(w, v);
1011 DECREF(v);
1012 DECREF(w);
1013 why = WHY_EXCEPTION;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001014 break;
1015
Guido van Rossume9736fc1990-11-18 17:33:06 +00001016 case LOAD_LOCALS:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001017 v = f->f_locals;
Guido van Rossume9736fc1990-11-18 17:33:06 +00001018 INCREF(v);
1019 PUSH(v);
1020 break;
1021
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001022 case RETURN_VALUE:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001023 retval = POP();
1024 why = WHY_RETURN;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001025 break;
1026
1027 case REQUIRE_ARGS:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001028 if (EMPTY()) {
1029 err_setstr(TypeError,
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001030 "function expects argument(s)");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001031 why = WHY_EXCEPTION;
1032 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001033 break;
1034
1035 case REFUSE_ARGS:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001036 if (!EMPTY()) {
1037 err_setstr(TypeError,
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001038 "function expects no argument(s)");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001039 why = WHY_EXCEPTION;
1040 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001041 break;
1042
1043 case BUILD_FUNCTION:
1044 v = POP();
Guido van Rossum3f5da241990-12-20 15:06:42 +00001045 x = newfuncobject(v, f->f_globals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001046 DECREF(v);
1047 PUSH(x);
1048 break;
1049
1050 case POP_BLOCK:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001051 {
1052 block *b = pop_block(f);
1053 while (STACK_LEVEL() > b->b_level) {
1054 v = POP();
1055 DECREF(v);
1056 }
1057 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001058 break;
1059
1060 case END_FINALLY:
1061 v = POP();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001062 if (is_intobject(v)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001063 why = (enum why_code) getintvalue(v);
1064 if (why == WHY_RETURN)
1065 retval = POP();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001066 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001067 else if (is_stringobject(v)) {
1068 w = POP();
1069 err_setval(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001070 DECREF(w);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001071 w = POP();
1072 tb_store(w);
1073 DECREF(w);
1074 why = WHY_RERAISE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001075 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001076 else if (v != None) {
1077 err_setstr(SystemError,
1078 "'finally' pops bad exception");
1079 why = WHY_EXCEPTION;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001080 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001081 DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001082 break;
1083
Guido van Rossume9736fc1990-11-18 17:33:06 +00001084 case BUILD_CLASS:
1085 w = POP();
1086 v = POP();
Guido van Rossum3f5da241990-12-20 15:06:42 +00001087 x = build_class(v, w);
Guido van Rossume9736fc1990-11-18 17:33:06 +00001088 PUSH(x);
1089 DECREF(v);
1090 DECREF(w);
1091 break;
1092
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001093 case STORE_NAME:
Guido van Rossumb8824951991-04-03 18:59:50 +00001094 w = GETNAMEV(oparg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001095 v = POP();
Guido van Rossumb8824951991-04-03 18:59:50 +00001096 err = dict2insert(f->f_locals, w, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001097 DECREF(v);
1098 break;
1099
1100 case DELETE_NAME:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001101 name = GETNAME(oparg);
1102 if ((err = dictremove(f->f_locals, name)) != 0)
1103 err_setstr(NameError, name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001104 break;
1105
1106 case UNPACK_TUPLE:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001107 v = POP();
1108 if (!is_tupleobject(v)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001109 err_setstr(TypeError, "unpack non-tuple");
1110 why = WHY_EXCEPTION;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001111 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001112 else if (gettuplesize(v) != oparg) {
1113 err_setstr(RuntimeError,
1114 "unpack tuple of wrong size");
1115 why = WHY_EXCEPTION;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001116 }
1117 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001118 for (; --oparg >= 0; ) {
1119 w = gettupleitem(v, oparg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001120 INCREF(w);
1121 PUSH(w);
1122 }
1123 }
1124 DECREF(v);
1125 break;
1126
1127 case UNPACK_LIST:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001128 v = POP();
1129 if (!is_listobject(v)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001130 err_setstr(TypeError, "unpack non-list");
1131 why = WHY_EXCEPTION;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001132 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001133 else if (getlistsize(v) != oparg) {
1134 err_setstr(RuntimeError,
1135 "unpack list of wrong size");
1136 why = WHY_EXCEPTION;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001137 }
1138 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001139 for (; --oparg >= 0; ) {
1140 w = getlistitem(v, oparg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001141 INCREF(w);
1142 PUSH(w);
1143 }
1144 }
1145 DECREF(v);
1146 break;
1147
1148 case STORE_ATTR:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001149 name = GETNAME(oparg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001150 v = POP();
1151 u = POP();
Guido van Rossum3f5da241990-12-20 15:06:42 +00001152 err = setattr(v, name, u); /* v.name = u */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001153 DECREF(v);
1154 DECREF(u);
1155 break;
1156
1157 case DELETE_ATTR:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001158 name = GETNAME(oparg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001159 v = POP();
Guido van Rossum3f5da241990-12-20 15:06:42 +00001160 err = setattr(v, name, (object *)NULL);
1161 /* del v.name */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001162 DECREF(v);
1163 break;
1164
1165 case LOAD_CONST:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001166 x = GETCONST(oparg);
1167 INCREF(x);
1168 PUSH(x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001169 break;
1170
1171 case LOAD_NAME:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001172 name = GETNAME(oparg);
1173 x = dictlookup(f->f_locals, name);
1174 if (x == NULL) {
1175 x = dictlookup(f->f_globals, name);
1176 if (x == NULL)
1177 x = getbuiltin(name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001178 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001179 if (x == NULL)
1180 err_setstr(NameError, name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001181 else
Guido van Rossum3f5da241990-12-20 15:06:42 +00001182 INCREF(x);
1183 PUSH(x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001184 break;
1185
1186 case BUILD_TUPLE:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001187 x = newtupleobject(oparg);
1188 if (x != NULL) {
1189 for (; --oparg >= 0;) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001190 w = POP();
Guido van Rossum3f5da241990-12-20 15:06:42 +00001191 err = settupleitem(x, oparg, w);
1192 if (err != 0)
1193 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001194 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001195 PUSH(x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001196 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001197 break;
1198
1199 case BUILD_LIST:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001200 x = newlistobject(oparg);
1201 if (x != NULL) {
1202 for (; --oparg >= 0;) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001203 w = POP();
Guido van Rossum3f5da241990-12-20 15:06:42 +00001204 err = setlistitem(x, oparg, w);
1205 if (err != 0)
1206 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001207 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001208 PUSH(x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001209 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001210 break;
1211
1212 case BUILD_MAP:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001213 x = newdictobject();
1214 PUSH(x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001215 break;
1216
1217 case LOAD_ATTR:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001218 name = GETNAME(oparg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001219 v = POP();
Guido van Rossum3f5da241990-12-20 15:06:42 +00001220 x = getattr(v, name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001221 DECREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001222 PUSH(x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001223 break;
1224
1225 case COMPARE_OP:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001226 w = POP();
1227 v = POP();
Guido van Rossum3f5da241990-12-20 15:06:42 +00001228 x = cmp_outcome((enum cmp_op)oparg, v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001229 DECREF(v);
1230 DECREF(w);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001231 PUSH(x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001232 break;
1233
1234 case IMPORT_NAME:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001235 name = GETNAME(oparg);
1236 x = import_module(name);
1237 XINCREF(x);
1238 PUSH(x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001239 break;
1240
1241 case IMPORT_FROM:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001242 name = GETNAME(oparg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001243 v = TOP();
Guido van Rossum3f5da241990-12-20 15:06:42 +00001244 err = import_from(f->f_locals, v, name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001245 break;
1246
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001247 case JUMP_FORWARD:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001248 JUMPBY(oparg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001249 break;
1250
1251 case JUMP_IF_FALSE:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001252 if (!testbool(TOP()))
1253 JUMPBY(oparg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001254 break;
1255
1256 case JUMP_IF_TRUE:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001257 if (testbool(TOP()))
1258 JUMPBY(oparg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001259 break;
1260
1261 case JUMP_ABSOLUTE:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001262 JUMPTO(oparg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001263 break;
1264
1265 case FOR_LOOP:
1266 /* for v in s: ...
1267 On entry: stack contains s, i.
1268 On exit: stack contains s, i+1, s[i];
1269 but if loop exhausted:
Guido van Rossume9736fc1990-11-18 17:33:06 +00001270 s, i are popped, and we jump */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001271 w = POP(); /* Loop index */
1272 v = POP(); /* Sequence object */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001273 u = loop_subscript(v, w);
1274 if (u != NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001275 PUSH(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001276 x = newintobject(getintvalue(w)+1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001277 PUSH(x);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001278 DECREF(w);
1279 PUSH(u);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001280 }
1281 else {
1282 DECREF(v);
1283 DECREF(w);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001284 /* A NULL can mean "s exhausted"
1285 but also an error: */
1286 if (err_occurred())
1287 why = WHY_EXCEPTION;
1288 else
1289 JUMPBY(oparg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001290 }
1291 break;
1292
1293 case SETUP_LOOP:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001294 case SETUP_EXCEPT:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001295 case SETUP_FINALLY:
1296 setup_block(f, opcode, INSTR_OFFSET() + oparg,
1297 STACK_LEVEL());
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001298 break;
1299
Guido van Rossum3f5da241990-12-20 15:06:42 +00001300 case SET_LINENO:
1301#ifdef TRACE
1302 if (trace)
1303 printf("--- Line %d ---\n", oparg);
1304#endif
1305 lineno = oparg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001306 break;
1307
1308 default:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001309 fprintf(stderr,
1310 "XXX lineno: %d, opcode: %d\n",
1311 lineno, opcode);
1312 err_setstr(SystemError, "eval_code: unknown opcode");
1313 why = WHY_EXCEPTION;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001314 break;
1315
Guido van Rossum3f5da241990-12-20 15:06:42 +00001316 } /* switch */
1317
1318
1319 /* Quickly continue if no error occurred */
1320
1321 if (why == WHY_NOT) {
1322 if (err == 0 && x != NULL)
1323 continue; /* Normal, fast path */
1324 why = WHY_EXCEPTION;
1325 x = None;
1326 err = 0;
1327 }
1328
1329#ifndef NDEBUG
1330 /* Double-check exception status */
1331
1332 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
1333 if (!err_occurred()) {
1334 fprintf(stderr, "XXX ghost error\n");
1335 err_setstr(SystemError, "ghost error");
1336 why = WHY_EXCEPTION;
1337 }
1338 }
1339 else {
1340 if (err_occurred()) {
1341 fprintf(stderr, "XXX undetected error\n");
1342 why = WHY_EXCEPTION;
1343 }
1344 }
1345#endif
1346
1347 /* Log traceback info if this is a real exception */
1348
1349 if (why == WHY_EXCEPTION) {
1350 int lasti = INSTR_OFFSET() - 1;
1351 if (HAS_ARG(opcode))
1352 lasti -= 2;
1353 tb_here(f, lasti, lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001354 }
1355
Guido van Rossum3f5da241990-12-20 15:06:42 +00001356 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001357
Guido van Rossum3f5da241990-12-20 15:06:42 +00001358 if (why == WHY_RERAISE)
1359 why = WHY_EXCEPTION;
1360
1361 /* Unwind stacks if a (pseudo) exception occurred */
1362
1363 while (why != WHY_NOT && f->f_iblock > 0) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001364 block *b = pop_block(f);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001365 while (STACK_LEVEL() > b->b_level) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001366 v = POP();
1367 XDECREF(v);
1368 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001369 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1370 why = WHY_NOT;
1371 JUMPTO(b->b_handler);
1372 break;
1373 }
1374 if (b->b_type == SETUP_FINALLY ||
1375 b->b_type == SETUP_EXCEPT &&
1376 why == WHY_EXCEPTION) {
1377 if (why == WHY_EXCEPTION) {
1378 object *exc, *val;
1379 err_get(&exc, &val);
1380 if (val == NULL) {
1381 val = None;
1382 INCREF(val);
1383 }
1384 v = tb_fetch();
1385 /* Make the raw exception data
1386 available to the handler,
1387 so a program can emulate the
1388 Python main loop. Don't do
1389 this for 'finally'. */
1390 if (b->b_type == SETUP_EXCEPT) {
1391#if 0 /* Oops, this breaks too many things */
1392 sysset("exc_traceback", v);
1393#endif
1394 sysset("exc_value", val);
1395 sysset("exc_type", exc);
1396 err_clear();
1397 }
1398 PUSH(v);
1399 PUSH(val);
1400 PUSH(exc);
1401 }
1402 else {
1403 if (why == WHY_RETURN)
1404 PUSH(retval);
1405 v = newintobject((long)why);
1406 PUSH(v);
1407 }
1408 why = WHY_NOT;
1409 JUMPTO(b->b_handler);
1410 break;
1411 }
1412 } /* unwind stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001413
Guido van Rossum3f5da241990-12-20 15:06:42 +00001414 /* End the loop if we still have an error (or return) */
1415
1416 if (why != WHY_NOT)
1417 break;
1418
1419 } /* main loop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001420
Guido van Rossum3f5da241990-12-20 15:06:42 +00001421 /* Pop remaining stack entries */
1422
1423 while (!EMPTY()) {
1424 v = POP();
1425 XDECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001426 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001427
1428 /* Restore previous frame and release the current one */
1429
1430 current_frame = f->f_back;
1431 DECREF(f);
1432
1433 if (why == WHY_RETURN)
1434 return retval;
1435 else
1436 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001437}