blob: bda9d5b4b203464a33c7da6abba3f31fd527094c [file] [log] [blame]
Guido van Rossum3f5da241990-12-20 15:06:42 +00001/* Execute compiled code */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002
Guido van Rossum3f5da241990-12-20 15:06:42 +00003#include "allobjects.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005#include "import.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +00006#include "sysmodule.h"
7#include "compile.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +00008#include "frameobject.h"
9#include "ceval.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000010#include "opcode.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000011#include "builtinmodule.h"
12#include "traceback.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000013
Guido van Rossum3f5da241990-12-20 15:06:42 +000014#ifndef NDEBUG
15#define TRACE
Guido van Rossum10dc2e81990-11-18 17:27:39 +000016#endif
17
Guido van Rossum3f5da241990-12-20 15:06:42 +000018#ifdef TRACE
19static int
20prtrace(v, str)
21 object *v;
22 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +000023{
Guido van Rossum3f5da241990-12-20 15:06:42 +000024 printf("%s ", str);
25 printobject(v, stdout, 0);
26 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +000027}
Guido van Rossum3f5da241990-12-20 15:06:42 +000028#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +000029
Guido van Rossum3f5da241990-12-20 15:06:42 +000030static frameobject *current_frame;
Guido van Rossum10dc2e81990-11-18 17:27:39 +000031
Guido van Rossum3f5da241990-12-20 15:06:42 +000032object *
33getlocals()
Guido van Rossum10dc2e81990-11-18 17:27:39 +000034{
Guido van Rossum3f5da241990-12-20 15:06:42 +000035 if (current_frame == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +000036 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000037 else
38 return current_frame->f_locals;
39}
40
41object *
42getglobals()
43{
44 if (current_frame == NULL)
45 return NULL;
46 else
47 return current_frame->f_globals;
48}
49
50void
51printtraceback(fp)
52 FILE *fp;
53{
54 object *v = tb_fetch();
55 if (v != NULL) {
56 fprintf(fp, "Stack backtrace (innermost last):\n");
57 tb_print(v, fp);
58 DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +000059 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +000060}
61
62
63/* XXX Mixing "print ...," and direct file I/O on stdin/stdout
64 XXX has some bad consequences. The needspace flag should
65 XXX really be part of the file object. */
66
67static int needspace;
68
69void
70flushline()
71{
72 FILE *fp = sysgetfile("stdout", stdout);
73 if (needspace) {
74 fprintf(fp, "\n");
75 needspace = 0;
76 }
77}
78
Guido van Rossum3f5da241990-12-20 15:06:42 +000079
80/* Test a value used as condition, e.g., in a for or if statement */
81
82static int
83testbool(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +000084 object *v;
85{
Guido van Rossum3f5da241990-12-20 15:06:42 +000086 if (is_intobject(v))
87 return getintvalue(v) != 0;
88 if (is_floatobject(v))
89 return getfloatvalue(v) != 0.0;
90 if (v->ob_type->tp_as_sequence != NULL)
91 return (*v->ob_type->tp_as_sequence->sq_length)(v) != 0;
92 if (v->ob_type->tp_as_mapping != NULL)
93 return (*v->ob_type->tp_as_mapping->mp_length)(v) != 0;
94 if (v == None)
95 return 0;
96 /* All other objects are 'true' */
97 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +000098}
99
100static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000101add(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000102 object *v, *w;
103{
104 if (v->ob_type->tp_as_number != NULL)
105 v = (*v->ob_type->tp_as_number->nb_add)(v, w);
106 else if (v->ob_type->tp_as_sequence != NULL)
107 v = (*v->ob_type->tp_as_sequence->sq_concat)(v, w);
108 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000109 err_setstr(TypeError, "+ not supported by operands");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000110 return NULL;
111 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000112 return v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000113}
114
115static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000116sub(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000117 object *v, *w;
118{
119 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000120 return (*v->ob_type->tp_as_number->nb_subtract)(v, w);
121 err_setstr(TypeError, "bad operand type(s) for -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000122 return NULL;
123}
124
125static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000126mul(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000127 object *v, *w;
128{
129 typeobject *tp;
130 if (is_intobject(v) && w->ob_type->tp_as_sequence != NULL) {
131 /* int*sequence -- swap v and w */
132 object *tmp = v;
133 v = w;
134 w = tmp;
135 }
136 tp = v->ob_type;
137 if (tp->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000138 return (*tp->tp_as_number->nb_multiply)(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000139 if (tp->tp_as_sequence != NULL) {
140 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000141 err_setstr(TypeError,
142 "can't multiply sequence with non-int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000143 return NULL;
144 }
145 if (tp->tp_as_sequence->sq_repeat == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000146 err_setstr(TypeError, "sequence does not support *");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000147 return NULL;
148 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000149 return (*tp->tp_as_sequence->sq_repeat)
150 (v, (int)getintvalue(w));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000151 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000152 err_setstr(TypeError, "bad operand type(s) for *");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000153 return NULL;
154}
155
156static object *
Guido van Rossum40d0b7e1990-12-20 23:03:11 +0000157divide(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000158 object *v, *w;
159{
160 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000161 return (*v->ob_type->tp_as_number->nb_divide)(v, w);
162 err_setstr(TypeError, "bad operand type(s) for /");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000163 return NULL;
164}
165
166static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000167rem(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000168 object *v, *w;
169{
170 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000171 return (*v->ob_type->tp_as_number->nb_remainder)(v, w);
172 err_setstr(TypeError, "bad operand type(s) for %");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000173 return NULL;
174}
175
176static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000177neg(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000178 object *v;
179{
180 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000181 return (*v->ob_type->tp_as_number->nb_negative)(v);
182 err_setstr(TypeError, "bad operand type(s) for unary -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000183 return NULL;
184}
185
186static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000187pos(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000188 object *v;
189{
190 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000191 return (*v->ob_type->tp_as_number->nb_positive)(v);
192 err_setstr(TypeError, "bad operand type(s) for unary +");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000193 return NULL;
194}
195
196static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000197not(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000198 object *v;
199{
Guido van Rossum3f5da241990-12-20 15:06:42 +0000200 int outcome = testbool(v);
201 object *w = outcome == 0 ? True : False;
202 INCREF(w);
203 return w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000204}
205
206static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000207call_builtin(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000208 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000209 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000210{
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000211 if (is_methodobject(func)) {
212 method meth = getmethod(func);
213 object *self = getself(func);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000214 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000215 }
216 if (is_classobject(func)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000217 if (arg != NULL) {
218 err_setstr(TypeError,
219 "classobject() allows no arguments");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000220 return NULL;
221 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000222 return newclassmemberobject(func);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000223 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000224 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000225 return NULL;
226}
227
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000228static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000229call_function(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000230 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000231 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000232{
Guido van Rossum3f5da241990-12-20 15:06:42 +0000233 object *newarg = NULL;
234 object *newlocals, *newglobals;
235 object *co, *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000236
237 if (is_classmethodobject(func)) {
238 object *self = classmethodgetself(func);
239 func = classmethodgetfunc(func);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000240 if (arg == NULL) {
241 arg = self;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000242 }
243 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000244 newarg = newtupleobject(2);
245 if (newarg == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000246 return NULL;
247 INCREF(self);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000248 INCREF(arg);
249 settupleitem(newarg, 0, self);
250 settupleitem(newarg, 1, arg);
251 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000252 }
253 }
254 else {
255 if (!is_funcobject(func)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000256 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000257 return NULL;
258 }
259 }
260
Guido van Rossum3f5da241990-12-20 15:06:42 +0000261 co = getfunccode(func);
262 if (co == NULL) {
263 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000264 return NULL;
265 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000266 if (!is_codeobject(co)) {
267 fprintf(stderr, "XXX Bad code\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000268 abort();
269 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000270 newlocals = newdictobject();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000271 if (newlocals == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000272 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000273 return NULL;
274 }
275
Guido van Rossum3f5da241990-12-20 15:06:42 +0000276 newglobals = getfuncglobals(func);
277 INCREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000278
Guido van Rossum3f5da241990-12-20 15:06:42 +0000279 v = eval_code((codeobject *)co, newglobals, newlocals, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000280
Guido van Rossum3f5da241990-12-20 15:06:42 +0000281 DECREF(newlocals);
282 DECREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000283
Guido van Rossum3f5da241990-12-20 15:06:42 +0000284 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000285
286 return v;
287}
288
289static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000290apply_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000291 object *v, *w;
292{
293 typeobject *tp = v->ob_type;
294 if (tp->tp_as_sequence == NULL && tp->tp_as_mapping == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000295 err_setstr(TypeError, "unsubscriptable object");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000296 return NULL;
297 }
298 if (tp->tp_as_sequence != NULL) {
299 int i;
300 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000301 err_setstr(TypeError, "sequence subscript not int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000302 return NULL;
303 }
304 i = getintvalue(w);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000305 return (*tp->tp_as_sequence->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000306 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000307 return (*tp->tp_as_mapping->mp_subscript)(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000308}
309
310static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000311loop_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000312 object *v, *w;
313{
314 sequence_methods *sq = v->ob_type->tp_as_sequence;
315 int i, n;
316 if (sq == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000317 err_setstr(TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000318 return NULL;
319 }
320 i = getintvalue(w);
321 n = (*sq->sq_length)(v);
322 if (i >= n)
323 return NULL; /* End of loop */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000324 return (*sq->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000325}
326
327static int
Guido van Rossum3f5da241990-12-20 15:06:42 +0000328slice_index(v, isize, pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000329 object *v;
330 int isize;
331 int *pi;
332{
333 if (v != NULL) {
334 if (!is_intobject(v)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000335 err_setstr(TypeError, "slice index must be int");
336 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000337 }
338 *pi = getintvalue(v);
339 if (*pi < 0)
340 *pi += isize;
341 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000342 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000343}
344
345static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000346apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000347 object *u, *v, *w;
348{
349 typeobject *tp = u->ob_type;
350 int ilow, ihigh, isize;
351 if (tp->tp_as_sequence == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000352 err_setstr(TypeError, "only sequences can be sliced");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000353 return NULL;
354 }
355 ilow = 0;
356 isize = ihigh = (*tp->tp_as_sequence->sq_length)(u);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000357 if (slice_index(v, isize, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000358 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000359 if (slice_index(w, isize, &ihigh) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000360 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000361 return (*tp->tp_as_sequence->sq_slice)(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000362}
Guido van Rossum3f5da241990-12-20 15:06:42 +0000363
364static int
365assign_subscript(w, key, v) /* w[key] = v */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000366 object *w;
367 object *key;
368 object *v;
369{
370 typeobject *tp = w->ob_type;
371 sequence_methods *sq;
372 mapping_methods *mp;
373 int (*func)();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000374 if ((sq = tp->tp_as_sequence) != NULL &&
375 (func = sq->sq_ass_item) != NULL) {
376 if (!is_intobject(key)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000377 err_setstr(TypeError,
378 "sequence subscript must be integer");
379 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000380 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000381 else
382 return (*func)(w, (int)getintvalue(key), v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000383 }
384 else if ((mp = tp->tp_as_mapping) != NULL &&
385 (func = mp->mp_ass_subscript) != NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000386 return (*func)(w, key, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000387 }
388 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000389 err_setstr(TypeError,
390 "can't assign to this subscripted object");
391 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000392 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000393}
394
Guido van Rossum3f5da241990-12-20 15:06:42 +0000395static int
396assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000397 object *u, *v, *w, *x;
398{
Guido van Rossum3f5da241990-12-20 15:06:42 +0000399 sequence_methods *sq = u->ob_type->tp_as_sequence;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000400 int ilow, ihigh, isize;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000401 if (sq == NULL) {
402 err_setstr(TypeError, "assign to slice of non-sequence");
403 return -1;
404 }
405 if (sq == NULL || sq->sq_ass_slice == NULL) {
406 err_setstr(TypeError, "unassignable slice");
407 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000408 }
409 ilow = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000410 isize = ihigh = (*sq->sq_length)(u);
411 if (slice_index(v, isize, &ilow) != 0)
412 return -1;
413 if (slice_index(w, isize, &ihigh) != 0)
414 return -1;
415 return (*sq->sq_ass_slice)(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000416}
417
418static int
419cmp_exception(err, v)
420 object *err, *v;
421{
422 if (is_tupleobject(v)) {
423 int i, n;
424 n = gettuplesize(v);
425 for (i = 0; i < n; i++) {
426 if (err == gettupleitem(v, i))
427 return 1;
428 }
429 return 0;
430 }
431 return err == v;
432}
433
Guido van Rossum3f5da241990-12-20 15:06:42 +0000434static int
435cmp_member(v, w)
436 object *v, *w;
437{
438 int i, n, cmp;
439 object *x;
440 sequence_methods *sq;
441 /* Special case for char in string */
442 if (is_stringobject(w)) {
443 register char *s, *end;
444 register char c;
445 if (!is_stringobject(v) || getstringsize(v) != 1) {
446 err_setstr(TypeError,
447 "string member test needs char left operand");
448 return -1;
449 }
450 c = getstringvalue(v)[0];
451 s = getstringvalue(w);
452 end = s + getstringsize(w);
453 while (s < end) {
454 if (c == *s++)
455 return 1;
456 }
457 return 0;
458 }
459 sq = w->ob_type->tp_as_sequence;
460 if (sq == NULL) {
461 err_setstr(TypeError,
462 "'in' or 'not in' needs sequence right argument");
463 return -1;
464 }
465 n = (*sq->sq_length)(w);
466 for (i = 0; i < n; i++) {
467 x = (*sq->sq_item)(w, i);
468 cmp = cmpobject(v, x);
469 XDECREF(x);
470 if (cmp == 0)
471 return 1;
472 }
473 return 0;
474}
475
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000476static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000477cmp_outcome(op, v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000478 enum cmp_op op;
479 register object *v;
480 register object *w;
481{
482 register int cmp;
483 register int res = 0;
484 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000485 case IS:
486 case IS_NOT:
487 res = (v == w);
488 if (op == IS_NOT)
489 res = !res;
490 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000491 case IN:
492 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +0000493 res = cmp_member(v, w);
494 if (res < 0)
495 return NULL;
496 if (op == NOT_IN)
497 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000498 break;
499 case EXC_MATCH:
Guido van Rossum3f5da241990-12-20 15:06:42 +0000500 res = cmp_exception(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000501 break;
502 default:
Guido van Rossum3f5da241990-12-20 15:06:42 +0000503 cmp = cmpobject(v, w);
504 switch (op) {
505 case LT: res = cmp < 0; break;
506 case LE: res = cmp <= 0; break;
507 case EQ: res = cmp == 0; break;
508 case NE: res = cmp != 0; break;
509 case GT: res = cmp > 0; break;
510 case GE: res = cmp >= 0; break;
511 /* XXX no default? (res is initialized to 0 though) */
512 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000513 }
514 v = res ? True : False;
515 INCREF(v);
516 return v;
517}
518
Guido van Rossum3f5da241990-12-20 15:06:42 +0000519static int
520import_from(locals, v, name)
521 object *locals;
Guido van Rossume9736fc1990-11-18 17:33:06 +0000522 object *v;
523 char *name;
524{
525 object *w, *x;
526 w = getmoduledict(v);
527 if (name[0] == '*') {
528 int i;
529 int n = getdictsize(w);
530 for (i = 0; i < n; i++) {
531 name = getdictkey(w, i);
532 if (name == NULL || name[0] == '_')
533 continue;
534 x = dictlookup(w, name);
535 if (x == NULL) {
536 /* XXX can't happen? */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000537 err_setstr(NameError, name);
538 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +0000539 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000540 if (dictinsert(locals, name, x) != 0)
541 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +0000542 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000543 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +0000544 }
545 else {
546 x = dictlookup(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000547 if (x == NULL) {
548 err_setstr(NameError, name);
549 return -1;
550 }
551 else
552 return dictinsert(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +0000553 }
554}
555
556static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000557build_class(v, w)
Guido van Rossume9736fc1990-11-18 17:33:06 +0000558 object *v; /* None or tuple containing base classes */
559 object *w; /* dictionary */
560{
561 if (is_tupleobject(v)) {
562 int i;
563 for (i = gettuplesize(v); --i >= 0; ) {
564 object *x = gettupleitem(v, i);
565 if (!is_classobject(x)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000566 err_setstr(TypeError,
567 "base is not a class object");
Guido van Rossume9736fc1990-11-18 17:33:06 +0000568 return NULL;
569 }
570 }
571 }
572 else {
573 v = NULL;
574 }
575 if (!is_dictobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000576 err_setstr(SystemError, "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +0000577 return NULL;
578 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000579 return newclassobject(v, w);
Guido van Rossume9736fc1990-11-18 17:33:06 +0000580}
581
Guido van Rossum3f5da241990-12-20 15:06:42 +0000582
583/* Status code for main loop (reason for stack unwind) */
584
585enum why_code {
586 WHY_NOT, /* No error */
587 WHY_EXCEPTION, /* Exception occurred */
588 WHY_RERAISE, /* Exception re-raised by 'finally' */
589 WHY_RETURN, /* 'return' statement */
590 WHY_BREAK /* 'break' statement */
591};
592
593/* Interpreter main loop */
594
595object *
596eval_code(co, globals, locals, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000597 codeobject *co;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000598 object *globals;
599 object *locals;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000600 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000601{
Guido van Rossum3f5da241990-12-20 15:06:42 +0000602 register unsigned char *next_instr;
603 register int opcode; /* Current opcode */
604 register int oparg; /* Current opcode argument, if any */
605 register object **stack_pointer;
606 register enum why_code why; /* Reason for block stack unwind */
607 register int err; /* Error status -- nonzero if error */
608 register object *x; /* Result object -- NULL if error */
609 register object *v; /* Temporary objects popped off stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000610 register object *w;
611 register object *u;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000612 register object *t;
613 register frameobject *f; /* Current frame */
614 int lineno; /* Current line number */
615 object *retval; /* Return value iff why == WHY_RETURN */
616 char *name; /* Name used by some instructions */
617 FILE *fp; /* Used by print operations */
618#ifdef TRACE
619 int trace = dictlookup(globals, "__trace__") != NULL;
620#endif
621
622/* Code access macros */
623
624#define GETCONST(i) Getconst(f, i)
625#define GETNAME(i) Getname(f, i)
626#define FIRST_INSTR() (GETUSTRINGVALUE(f->f_code->co_code))
627#define INSTR_OFFSET() (next_instr - FIRST_INSTR())
628#define NEXTOP() (*next_instr++)
629#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
630#define JUMPTO(x) (next_instr = FIRST_INSTR() + (x))
631#define JUMPBY(x) (next_instr += (x))
632
633/* Stack manipulation macros */
634
635#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
636#define EMPTY() (STACK_LEVEL() == 0)
637#define TOP() (stack_pointer[-1])
638#define BASIC_PUSH(v) (*stack_pointer++ = (v))
639#define BASIC_POP() (*--stack_pointer)
640
641#ifdef TRACE
642#define PUSH(v) (BASIC_PUSH(v), trace && prtrace(TOP(), "push"))
643#define POP() (trace && prtrace(TOP(), "pop"), BASIC_POP())
644#else
645#define PUSH(v) BASIC_PUSH(v)
646#define POP() BASIC_POP()
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000647#endif
648
649 f = newframeobject(
Guido van Rossum3f5da241990-12-20 15:06:42 +0000650 current_frame, /*back*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000651 co, /*code*/
Guido van Rossum3f5da241990-12-20 15:06:42 +0000652 globals, /*globals*/
653 locals, /*locals*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000654 50, /*nvalues*/
655 20); /*nblocks*/
Guido van Rossum3f5da241990-12-20 15:06:42 +0000656 if (f == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000657 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000658
659 current_frame = f;
660
661 next_instr = GETUSTRINGVALUE(f->f_code->co_code);
662
663 stack_pointer = f->f_valuestack;
664
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000665 if (arg != NULL) {
666 INCREF(arg);
667 PUSH(arg);
668 }
669
Guido van Rossum3f5da241990-12-20 15:06:42 +0000670 why = WHY_NOT;
671 err = 0;
672 x = None; /* Not a reference, just anything non-NULL */
673 lineno = -1;
674
675 for (;;) {
676 static ticker;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000677
Guido van Rossum3f5da241990-12-20 15:06:42 +0000678 /* Do periodic things */
679
680 if (--ticker < 0) {
681 ticker = 100;
682 if (intrcheck()) {
683 err_set(KeyboardInterrupt);
684 why = WHY_EXCEPTION;
685 tb_here(f, INSTR_OFFSET(), lineno);
686 break;
687 }
688 }
689
690 /* Extract opcode and argument */
691
692 opcode = NEXTOP();
693 if (HAS_ARG(opcode))
694 oparg = NEXTARG();
695
696#ifdef TRACE
697 /* Instruction tracing */
698
699 if (trace) {
700 if (HAS_ARG(opcode)) {
701 printf("%d: %d, %d\n",
702 (int) (INSTR_OFFSET() - 3),
703 opcode, oparg);
704 }
705 else {
706 printf("%d: %d\n",
707 (int) (INSTR_OFFSET() - 1), opcode);
708 }
709 }
710#endif
711
712 /* Main switch on opcode */
713
714 switch (opcode) {
715
716 /* BEWARE!
717 It is essential that any operation that fails sets either
718 x to NULL, err to nonzero, or why to anything but WHY_NOT,
719 and that no operation that succeeds does this! */
720
721 /* case STOP_CODE: this is an error! */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000722
723 case POP_TOP:
724 v = POP();
725 DECREF(v);
726 break;
727
728 case ROT_TWO:
729 v = POP();
730 w = POP();
731 PUSH(v);
732 PUSH(w);
733 break;
734
735 case ROT_THREE:
736 v = POP();
737 w = POP();
738 x = POP();
739 PUSH(v);
740 PUSH(x);
741 PUSH(w);
742 break;
743
Guido van Rossum3f5da241990-12-20 15:06:42 +0000744 case DUP_TOP:
745 v = TOP();
746 INCREF(v);
747 PUSH(v);
748 break;
749
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000750 case UNARY_POSITIVE:
751 v = POP();
Guido van Rossum3f5da241990-12-20 15:06:42 +0000752 x = pos(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000753 DECREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000754 PUSH(x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000755 break;
756
757 case UNARY_NEGATIVE:
758 v = POP();
Guido van Rossum3f5da241990-12-20 15:06:42 +0000759 x = neg(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000760 DECREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000761 PUSH(x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000762 break;
763
764 case UNARY_NOT:
765 v = POP();
Guido van Rossum3f5da241990-12-20 15:06:42 +0000766 x = not(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000767 DECREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000768 PUSH(x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000769 break;
770
771 case UNARY_CONVERT:
772 v = POP();
Guido van Rossum3f5da241990-12-20 15:06:42 +0000773 x = reprobject(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000774 DECREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000775 PUSH(x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000776 break;
777
778 case UNARY_CALL:
779 v = POP();
Guido van Rossume9736fc1990-11-18 17:33:06 +0000780 if (is_classmethodobject(v) || is_funcobject(v))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000781 x = call_function(v, (object *)NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000782 else
Guido van Rossum3f5da241990-12-20 15:06:42 +0000783 x = call_builtin(v, (object *)NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000784 DECREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000785 PUSH(x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000786 break;
787
788 case BINARY_MULTIPLY:
789 w = POP();
790 v = POP();
Guido van Rossum3f5da241990-12-20 15:06:42 +0000791 x = mul(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000792 DECREF(v);
793 DECREF(w);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000794 PUSH(x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000795 break;
796
797 case BINARY_DIVIDE:
798 w = POP();
799 v = POP();
Guido van Rossum40d0b7e1990-12-20 23:03:11 +0000800 x = divide(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000801 DECREF(v);
802 DECREF(w);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000803 PUSH(x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000804 break;
805
806 case BINARY_MODULO:
807 w = POP();
808 v = POP();
Guido van Rossum3f5da241990-12-20 15:06:42 +0000809 x = rem(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000810 DECREF(v);
811 DECREF(w);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000812 PUSH(x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000813 break;
814
815 case BINARY_ADD:
816 w = POP();
817 v = POP();
Guido van Rossum3f5da241990-12-20 15:06:42 +0000818 x = add(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000819 DECREF(v);
820 DECREF(w);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000821 PUSH(x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000822 break;
823
824 case BINARY_SUBTRACT:
825 w = POP();
826 v = POP();
Guido van Rossum3f5da241990-12-20 15:06:42 +0000827 x = sub(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000828 DECREF(v);
829 DECREF(w);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000830 PUSH(x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000831 break;
832
833 case BINARY_SUBSCR:
834 w = POP();
835 v = POP();
Guido van Rossum3f5da241990-12-20 15:06:42 +0000836 x = apply_subscript(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000837 DECREF(v);
838 DECREF(w);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000839 PUSH(x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000840 break;
841
842 case BINARY_CALL:
843 w = POP();
844 v = POP();
Guido van Rossume9736fc1990-11-18 17:33:06 +0000845 if (is_classmethodobject(v) || is_funcobject(v))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000846 x = call_function(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000847 else
Guido van Rossum3f5da241990-12-20 15:06:42 +0000848 x = call_builtin(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000849 DECREF(v);
850 DECREF(w);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000851 PUSH(x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000852 break;
853
Guido van Rossume9736fc1990-11-18 17:33:06 +0000854 case SLICE+0:
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000855 case SLICE+1:
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000856 case SLICE+2:
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000857 case SLICE+3:
Guido van Rossum3f5da241990-12-20 15:06:42 +0000858 if ((opcode-SLICE) & 2)
Guido van Rossume9736fc1990-11-18 17:33:06 +0000859 w = POP();
860 else
861 w = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000862 if ((opcode-SLICE) & 1)
Guido van Rossume9736fc1990-11-18 17:33:06 +0000863 v = POP();
864 else
865 v = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000866 u = POP();
Guido van Rossum3f5da241990-12-20 15:06:42 +0000867 x = apply_slice(u, v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000868 DECREF(u);
Guido van Rossume9736fc1990-11-18 17:33:06 +0000869 XDECREF(v);
870 XDECREF(w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000871 PUSH(x);
872 break;
873
Guido van Rossume9736fc1990-11-18 17:33:06 +0000874 case STORE_SLICE+0:
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000875 case STORE_SLICE+1:
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000876 case STORE_SLICE+2:
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000877 case STORE_SLICE+3:
Guido van Rossum3f5da241990-12-20 15:06:42 +0000878 if ((opcode-STORE_SLICE) & 2)
Guido van Rossume9736fc1990-11-18 17:33:06 +0000879 w = POP();
880 else
881 w = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000882 if ((opcode-STORE_SLICE) & 1)
Guido van Rossume9736fc1990-11-18 17:33:06 +0000883 v = POP();
884 else
885 v = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000886 u = POP();
Guido van Rossum3f5da241990-12-20 15:06:42 +0000887 t = POP();
888 err = assign_slice(u, v, w, t); /* u[v:w] = t */
889 DECREF(t);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000890 DECREF(u);
Guido van Rossume9736fc1990-11-18 17:33:06 +0000891 XDECREF(v);
892 XDECREF(w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000893 break;
894
Guido van Rossume9736fc1990-11-18 17:33:06 +0000895 case DELETE_SLICE+0:
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000896 case DELETE_SLICE+1:
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000897 case DELETE_SLICE+2:
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000898 case DELETE_SLICE+3:
Guido van Rossum3f5da241990-12-20 15:06:42 +0000899 if ((opcode-DELETE_SLICE) & 2)
Guido van Rossume9736fc1990-11-18 17:33:06 +0000900 w = POP();
901 else
902 w = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000903 if ((opcode-DELETE_SLICE) & 1)
Guido van Rossume9736fc1990-11-18 17:33:06 +0000904 v = POP();
905 else
906 v = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000907 u = POP();
Guido van Rossum3f5da241990-12-20 15:06:42 +0000908 err = assign_slice(u, v, w, (object *)NULL);
909 /* del u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000910 DECREF(u);
Guido van Rossume9736fc1990-11-18 17:33:06 +0000911 XDECREF(v);
912 XDECREF(w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000913 break;
914
915 case STORE_SUBSCR:
916 w = POP();
917 v = POP();
918 u = POP();
919 /* v[w] = u */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000920 err = assign_subscript(v, w, u);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000921 DECREF(u);
922 DECREF(v);
923 DECREF(w);
924 break;
925
926 case DELETE_SUBSCR:
927 w = POP();
928 v = POP();
929 /* del v[w] */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000930 err = assign_subscript(v, w, (object *)NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000931 DECREF(v);
932 DECREF(w);
933 break;
934
935 case PRINT_EXPR:
936 v = POP();
937 fp = sysgetfile("stdout", stdout);
938 /* Print value except if procedure result */
939 if (v != None) {
940 flushline();
941 printobject(v, fp, 0);
942 fprintf(fp, "\n");
943 }
944 DECREF(v);
945 break;
946
947 case PRINT_ITEM:
948 v = POP();
949 fp = sysgetfile("stdout", stdout);
950 if (needspace)
951 fprintf(fp, " ");
952 if (is_stringobject(v)) {
953 char *s = getstringvalue(v);
954 int len = getstringsize(v);
955 fwrite(s, 1, len, fp);
956 if (len > 0 && s[len-1] == '\n')
957 needspace = 0;
958 else
959 needspace = 1;
960 }
961 else {
962 printobject(v, fp, 0);
963 needspace = 1;
964 }
965 DECREF(v);
966 break;
967
968 case PRINT_NEWLINE:
969 fp = sysgetfile("stdout", stdout);
970 fprintf(fp, "\n");
971 needspace = 0;
972 break;
973
974 case BREAK_LOOP:
Guido van Rossum3f5da241990-12-20 15:06:42 +0000975 why = WHY_BREAK;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000976 break;
977
978 case RAISE_EXCEPTION:
979 v = POP();
980 w = POP();
Guido van Rossum3f5da241990-12-20 15:06:42 +0000981 if (!is_stringobject(w))
982 err_setstr(TypeError,
983 "exceptions must be strings");
984 else
985 err_setval(w, v);
986 DECREF(v);
987 DECREF(w);
988 why = WHY_EXCEPTION;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000989 break;
990
Guido van Rossume9736fc1990-11-18 17:33:06 +0000991 case LOAD_LOCALS:
Guido van Rossum3f5da241990-12-20 15:06:42 +0000992 v = f->f_locals;
Guido van Rossume9736fc1990-11-18 17:33:06 +0000993 INCREF(v);
994 PUSH(v);
995 break;
996
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000997 case RETURN_VALUE:
Guido van Rossum3f5da241990-12-20 15:06:42 +0000998 retval = POP();
999 why = WHY_RETURN;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001000 break;
1001
1002 case REQUIRE_ARGS:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001003 if (EMPTY()) {
1004 err_setstr(TypeError,
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001005 "function expects argument(s)");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001006 why = WHY_EXCEPTION;
1007 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001008 break;
1009
1010 case REFUSE_ARGS:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001011 if (!EMPTY()) {
1012 err_setstr(TypeError,
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001013 "function expects no argument(s)");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001014 why = WHY_EXCEPTION;
1015 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001016 break;
1017
1018 case BUILD_FUNCTION:
1019 v = POP();
Guido van Rossum3f5da241990-12-20 15:06:42 +00001020 x = newfuncobject(v, f->f_globals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001021 DECREF(v);
1022 PUSH(x);
1023 break;
1024
1025 case POP_BLOCK:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001026 {
1027 block *b = pop_block(f);
1028 while (STACK_LEVEL() > b->b_level) {
1029 v = POP();
1030 DECREF(v);
1031 }
1032 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001033 break;
1034
1035 case END_FINALLY:
1036 v = POP();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001037 if (is_intobject(v)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001038 why = (enum why_code) getintvalue(v);
1039 if (why == WHY_RETURN)
1040 retval = POP();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001041 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001042 else if (is_stringobject(v)) {
1043 w = POP();
1044 err_setval(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001045 DECREF(w);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001046 w = POP();
1047 tb_store(w);
1048 DECREF(w);
1049 why = WHY_RERAISE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001050 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001051 else if (v != None) {
1052 err_setstr(SystemError,
1053 "'finally' pops bad exception");
1054 why = WHY_EXCEPTION;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001055 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001056 DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001057 break;
1058
Guido van Rossume9736fc1990-11-18 17:33:06 +00001059 case BUILD_CLASS:
1060 w = POP();
1061 v = POP();
Guido van Rossum3f5da241990-12-20 15:06:42 +00001062 x = build_class(v, w);
Guido van Rossume9736fc1990-11-18 17:33:06 +00001063 PUSH(x);
1064 DECREF(v);
1065 DECREF(w);
1066 break;
1067
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001068 case STORE_NAME:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001069 name = GETNAME(oparg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001070 v = POP();
Guido van Rossum3f5da241990-12-20 15:06:42 +00001071 err = dictinsert(f->f_locals, name, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001072 DECREF(v);
1073 break;
1074
1075 case DELETE_NAME:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001076 name = GETNAME(oparg);
1077 if ((err = dictremove(f->f_locals, name)) != 0)
1078 err_setstr(NameError, name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001079 break;
1080
1081 case UNPACK_TUPLE:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001082 v = POP();
1083 if (!is_tupleobject(v)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001084 err_setstr(TypeError, "unpack non-tuple");
1085 why = WHY_EXCEPTION;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001086 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001087 else if (gettuplesize(v) != oparg) {
1088 err_setstr(RuntimeError,
1089 "unpack tuple of wrong size");
1090 why = WHY_EXCEPTION;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001091 }
1092 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001093 for (; --oparg >= 0; ) {
1094 w = gettupleitem(v, oparg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001095 INCREF(w);
1096 PUSH(w);
1097 }
1098 }
1099 DECREF(v);
1100 break;
1101
1102 case UNPACK_LIST:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001103 v = POP();
1104 if (!is_listobject(v)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001105 err_setstr(TypeError, "unpack non-list");
1106 why = WHY_EXCEPTION;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001107 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001108 else if (getlistsize(v) != oparg) {
1109 err_setstr(RuntimeError,
1110 "unpack list of wrong size");
1111 why = WHY_EXCEPTION;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001112 }
1113 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001114 for (; --oparg >= 0; ) {
1115 w = getlistitem(v, oparg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001116 INCREF(w);
1117 PUSH(w);
1118 }
1119 }
1120 DECREF(v);
1121 break;
1122
1123 case STORE_ATTR:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001124 name = GETNAME(oparg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001125 v = POP();
1126 u = POP();
Guido van Rossum3f5da241990-12-20 15:06:42 +00001127 err = setattr(v, name, u); /* v.name = u */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001128 DECREF(v);
1129 DECREF(u);
1130 break;
1131
1132 case DELETE_ATTR:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001133 name = GETNAME(oparg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001134 v = POP();
Guido van Rossum3f5da241990-12-20 15:06:42 +00001135 err = setattr(v, name, (object *)NULL);
1136 /* del v.name */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001137 DECREF(v);
1138 break;
1139
1140 case LOAD_CONST:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001141 x = GETCONST(oparg);
1142 INCREF(x);
1143 PUSH(x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001144 break;
1145
1146 case LOAD_NAME:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001147 name = GETNAME(oparg);
1148 x = dictlookup(f->f_locals, name);
1149 if (x == NULL) {
1150 x = dictlookup(f->f_globals, name);
1151 if (x == NULL)
1152 x = getbuiltin(name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001153 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001154 if (x == NULL)
1155 err_setstr(NameError, name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001156 else
Guido van Rossum3f5da241990-12-20 15:06:42 +00001157 INCREF(x);
1158 PUSH(x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001159 break;
1160
1161 case BUILD_TUPLE:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001162 x = newtupleobject(oparg);
1163 if (x != NULL) {
1164 for (; --oparg >= 0;) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001165 w = POP();
Guido van Rossum3f5da241990-12-20 15:06:42 +00001166 err = settupleitem(x, oparg, w);
1167 if (err != 0)
1168 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001169 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001170 PUSH(x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001171 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001172 break;
1173
1174 case BUILD_LIST:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001175 x = newlistobject(oparg);
1176 if (x != NULL) {
1177 for (; --oparg >= 0;) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001178 w = POP();
Guido van Rossum3f5da241990-12-20 15:06:42 +00001179 err = setlistitem(x, oparg, w);
1180 if (err != 0)
1181 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001182 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001183 PUSH(x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001184 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001185 break;
1186
1187 case BUILD_MAP:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001188 x = newdictobject();
1189 PUSH(x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001190 break;
1191
1192 case LOAD_ATTR:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001193 name = GETNAME(oparg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001194 v = POP();
Guido van Rossum3f5da241990-12-20 15:06:42 +00001195 x = getattr(v, name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001196 DECREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001197 PUSH(x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001198 break;
1199
1200 case COMPARE_OP:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001201 w = POP();
1202 v = POP();
Guido van Rossum3f5da241990-12-20 15:06:42 +00001203 x = cmp_outcome((enum cmp_op)oparg, v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001204 DECREF(v);
1205 DECREF(w);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001206 PUSH(x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001207 break;
1208
1209 case IMPORT_NAME:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001210 name = GETNAME(oparg);
1211 x = import_module(name);
1212 XINCREF(x);
1213 PUSH(x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001214 break;
1215
1216 case IMPORT_FROM:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001217 name = GETNAME(oparg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001218 v = TOP();
Guido van Rossum3f5da241990-12-20 15:06:42 +00001219 err = import_from(f->f_locals, v, name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001220 break;
1221
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001222 case JUMP_FORWARD:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001223 JUMPBY(oparg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001224 break;
1225
1226 case JUMP_IF_FALSE:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001227 if (!testbool(TOP()))
1228 JUMPBY(oparg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001229 break;
1230
1231 case JUMP_IF_TRUE:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001232 if (testbool(TOP()))
1233 JUMPBY(oparg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001234 break;
1235
1236 case JUMP_ABSOLUTE:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001237 JUMPTO(oparg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001238 break;
1239
1240 case FOR_LOOP:
1241 /* for v in s: ...
1242 On entry: stack contains s, i.
1243 On exit: stack contains s, i+1, s[i];
1244 but if loop exhausted:
Guido van Rossume9736fc1990-11-18 17:33:06 +00001245 s, i are popped, and we jump */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001246 w = POP(); /* Loop index */
1247 v = POP(); /* Sequence object */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001248 u = loop_subscript(v, w);
1249 if (u != NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001250 PUSH(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001251 x = newintobject(getintvalue(w)+1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001252 PUSH(x);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001253 DECREF(w);
1254 PUSH(u);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001255 }
1256 else {
1257 DECREF(v);
1258 DECREF(w);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001259 /* A NULL can mean "s exhausted"
1260 but also an error: */
1261 if (err_occurred())
1262 why = WHY_EXCEPTION;
1263 else
1264 JUMPBY(oparg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001265 }
1266 break;
1267
1268 case SETUP_LOOP:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001269 case SETUP_EXCEPT:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001270 case SETUP_FINALLY:
1271 setup_block(f, opcode, INSTR_OFFSET() + oparg,
1272 STACK_LEVEL());
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001273 break;
1274
Guido van Rossum3f5da241990-12-20 15:06:42 +00001275 case SET_LINENO:
1276#ifdef TRACE
1277 if (trace)
1278 printf("--- Line %d ---\n", oparg);
1279#endif
1280 lineno = oparg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001281 break;
1282
1283 default:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001284 fprintf(stderr,
1285 "XXX lineno: %d, opcode: %d\n",
1286 lineno, opcode);
1287 err_setstr(SystemError, "eval_code: unknown opcode");
1288 why = WHY_EXCEPTION;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001289 break;
1290
Guido van Rossum3f5da241990-12-20 15:06:42 +00001291 } /* switch */
1292
1293
1294 /* Quickly continue if no error occurred */
1295
1296 if (why == WHY_NOT) {
1297 if (err == 0 && x != NULL)
1298 continue; /* Normal, fast path */
1299 why = WHY_EXCEPTION;
1300 x = None;
1301 err = 0;
1302 }
1303
1304#ifndef NDEBUG
1305 /* Double-check exception status */
1306
1307 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
1308 if (!err_occurred()) {
1309 fprintf(stderr, "XXX ghost error\n");
1310 err_setstr(SystemError, "ghost error");
1311 why = WHY_EXCEPTION;
1312 }
1313 }
1314 else {
1315 if (err_occurred()) {
1316 fprintf(stderr, "XXX undetected error\n");
1317 why = WHY_EXCEPTION;
1318 }
1319 }
1320#endif
1321
1322 /* Log traceback info if this is a real exception */
1323
1324 if (why == WHY_EXCEPTION) {
1325 int lasti = INSTR_OFFSET() - 1;
1326 if (HAS_ARG(opcode))
1327 lasti -= 2;
1328 tb_here(f, lasti, lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001329 }
1330
Guido van Rossum3f5da241990-12-20 15:06:42 +00001331 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001332
Guido van Rossum3f5da241990-12-20 15:06:42 +00001333 if (why == WHY_RERAISE)
1334 why = WHY_EXCEPTION;
1335
1336 /* Unwind stacks if a (pseudo) exception occurred */
1337
1338 while (why != WHY_NOT && f->f_iblock > 0) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001339 block *b = pop_block(f);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001340 while (STACK_LEVEL() > b->b_level) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001341 v = POP();
1342 XDECREF(v);
1343 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001344 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1345 why = WHY_NOT;
1346 JUMPTO(b->b_handler);
1347 break;
1348 }
1349 if (b->b_type == SETUP_FINALLY ||
1350 b->b_type == SETUP_EXCEPT &&
1351 why == WHY_EXCEPTION) {
1352 if (why == WHY_EXCEPTION) {
1353 object *exc, *val;
1354 err_get(&exc, &val);
1355 if (val == NULL) {
1356 val = None;
1357 INCREF(val);
1358 }
1359 v = tb_fetch();
1360 /* Make the raw exception data
1361 available to the handler,
1362 so a program can emulate the
1363 Python main loop. Don't do
1364 this for 'finally'. */
1365 if (b->b_type == SETUP_EXCEPT) {
1366#if 0 /* Oops, this breaks too many things */
1367 sysset("exc_traceback", v);
1368#endif
1369 sysset("exc_value", val);
1370 sysset("exc_type", exc);
1371 err_clear();
1372 }
1373 PUSH(v);
1374 PUSH(val);
1375 PUSH(exc);
1376 }
1377 else {
1378 if (why == WHY_RETURN)
1379 PUSH(retval);
1380 v = newintobject((long)why);
1381 PUSH(v);
1382 }
1383 why = WHY_NOT;
1384 JUMPTO(b->b_handler);
1385 break;
1386 }
1387 } /* unwind stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001388
Guido van Rossum3f5da241990-12-20 15:06:42 +00001389 /* End the loop if we still have an error (or return) */
1390
1391 if (why != WHY_NOT)
1392 break;
1393
1394 } /* main loop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001395
Guido van Rossum3f5da241990-12-20 15:06:42 +00001396 /* Pop remaining stack entries */
1397
1398 while (!EMPTY()) {
1399 v = POP();
1400 XDECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001401 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001402
1403 /* Restore previous frame and release the current one */
1404
1405 current_frame = f->f_back;
1406 DECREF(f);
1407
1408 if (why == WHY_RETURN)
1409 return retval;
1410 else
1411 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001412}