blob: 7213d5b75b93e917a5d96b9020a9df4db62f969f [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)
650#define FIRST_INSTR() (GETUSTRINGVALUE(f->f_code->co_code))
651#define INSTR_OFFSET() (next_instr - FIRST_INSTR())
652#define NEXTOP() (*next_instr++)
653#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
654#define JUMPTO(x) (next_instr = FIRST_INSTR() + (x))
655#define JUMPBY(x) (next_instr += (x))
656
657/* Stack manipulation macros */
658
659#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
660#define EMPTY() (STACK_LEVEL() == 0)
661#define TOP() (stack_pointer[-1])
662#define BASIC_PUSH(v) (*stack_pointer++ = (v))
663#define BASIC_POP() (*--stack_pointer)
664
665#ifdef TRACE
666#define PUSH(v) (BASIC_PUSH(v), trace && prtrace(TOP(), "push"))
667#define POP() (trace && prtrace(TOP(), "pop"), BASIC_POP())
668#else
669#define PUSH(v) BASIC_PUSH(v)
670#define POP() BASIC_POP()
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000671#endif
672
673 f = newframeobject(
Guido van Rossum3f5da241990-12-20 15:06:42 +0000674 current_frame, /*back*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000675 co, /*code*/
Guido van Rossum3f5da241990-12-20 15:06:42 +0000676 globals, /*globals*/
677 locals, /*locals*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000678 50, /*nvalues*/
679 20); /*nblocks*/
Guido van Rossum3f5da241990-12-20 15:06:42 +0000680 if (f == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000681 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000682
683 current_frame = f;
684
685 next_instr = GETUSTRINGVALUE(f->f_code->co_code);
686
687 stack_pointer = f->f_valuestack;
688
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000689 if (arg != NULL) {
690 INCREF(arg);
691 PUSH(arg);
692 }
693
Guido van Rossum3f5da241990-12-20 15:06:42 +0000694 why = WHY_NOT;
695 err = 0;
696 x = None; /* Not a reference, just anything non-NULL */
697 lineno = -1;
698
699 for (;;) {
700 static ticker;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000701
Guido van Rossum3f5da241990-12-20 15:06:42 +0000702 /* Do periodic things */
703
704 if (--ticker < 0) {
705 ticker = 100;
706 if (intrcheck()) {
707 err_set(KeyboardInterrupt);
708 why = WHY_EXCEPTION;
709 tb_here(f, INSTR_OFFSET(), lineno);
710 break;
711 }
712 }
713
714 /* Extract opcode and argument */
715
716 opcode = NEXTOP();
717 if (HAS_ARG(opcode))
718 oparg = NEXTARG();
719
720#ifdef TRACE
721 /* Instruction tracing */
722
723 if (trace) {
724 if (HAS_ARG(opcode)) {
725 printf("%d: %d, %d\n",
726 (int) (INSTR_OFFSET() - 3),
727 opcode, oparg);
728 }
729 else {
730 printf("%d: %d\n",
731 (int) (INSTR_OFFSET() - 1), opcode);
732 }
733 }
734#endif
735
736 /* Main switch on opcode */
737
738 switch (opcode) {
739
740 /* BEWARE!
741 It is essential that any operation that fails sets either
742 x to NULL, err to nonzero, or why to anything but WHY_NOT,
743 and that no operation that succeeds does this! */
744
745 /* case STOP_CODE: this is an error! */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000746
747 case POP_TOP:
748 v = POP();
749 DECREF(v);
750 break;
751
752 case ROT_TWO:
753 v = POP();
754 w = POP();
755 PUSH(v);
756 PUSH(w);
757 break;
758
759 case ROT_THREE:
760 v = POP();
761 w = POP();
762 x = POP();
763 PUSH(v);
764 PUSH(x);
765 PUSH(w);
766 break;
767
Guido van Rossum3f5da241990-12-20 15:06:42 +0000768 case DUP_TOP:
769 v = TOP();
770 INCREF(v);
771 PUSH(v);
772 break;
773
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000774 case UNARY_POSITIVE:
775 v = POP();
Guido van Rossum3f5da241990-12-20 15:06:42 +0000776 x = pos(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000777 DECREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000778 PUSH(x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000779 break;
780
781 case UNARY_NEGATIVE:
782 v = POP();
Guido van Rossum3f5da241990-12-20 15:06:42 +0000783 x = neg(v);
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 UNARY_NOT:
789 v = POP();
Guido van Rossum3f5da241990-12-20 15:06:42 +0000790 x = not(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000791 DECREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000792 PUSH(x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000793 break;
794
795 case UNARY_CONVERT:
796 v = POP();
Guido van Rossum3f5da241990-12-20 15:06:42 +0000797 x = reprobject(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000798 DECREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000799 PUSH(x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000800 break;
801
802 case UNARY_CALL:
803 v = POP();
Guido van Rossume9736fc1990-11-18 17:33:06 +0000804 if (is_classmethodobject(v) || is_funcobject(v))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000805 x = call_function(v, (object *)NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000806 else
Guido van Rossum3f5da241990-12-20 15:06:42 +0000807 x = call_builtin(v, (object *)NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000808 DECREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000809 PUSH(x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000810 break;
811
812 case BINARY_MULTIPLY:
813 w = POP();
814 v = POP();
Guido van Rossum3f5da241990-12-20 15:06:42 +0000815 x = mul(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000816 DECREF(v);
817 DECREF(w);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000818 PUSH(x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000819 break;
820
821 case BINARY_DIVIDE:
822 w = POP();
823 v = POP();
Guido van Rossum40d0b7e1990-12-20 23:03:11 +0000824 x = divide(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000825 DECREF(v);
826 DECREF(w);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000827 PUSH(x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000828 break;
829
830 case BINARY_MODULO:
831 w = POP();
832 v = POP();
Guido van Rossum3f5da241990-12-20 15:06:42 +0000833 x = rem(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000834 DECREF(v);
835 DECREF(w);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000836 PUSH(x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000837 break;
838
839 case BINARY_ADD:
840 w = POP();
841 v = POP();
Guido van Rossum3f5da241990-12-20 15:06:42 +0000842 x = add(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000843 DECREF(v);
844 DECREF(w);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000845 PUSH(x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000846 break;
847
848 case BINARY_SUBTRACT:
849 w = POP();
850 v = POP();
Guido van Rossum3f5da241990-12-20 15:06:42 +0000851 x = sub(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000852 DECREF(v);
853 DECREF(w);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000854 PUSH(x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000855 break;
856
857 case BINARY_SUBSCR:
858 w = POP();
859 v = POP();
Guido van Rossum3f5da241990-12-20 15:06:42 +0000860 x = apply_subscript(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000861 DECREF(v);
862 DECREF(w);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000863 PUSH(x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000864 break;
865
866 case BINARY_CALL:
867 w = POP();
868 v = POP();
Guido van Rossume9736fc1990-11-18 17:33:06 +0000869 if (is_classmethodobject(v) || is_funcobject(v))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000870 x = call_function(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000871 else
Guido van Rossum3f5da241990-12-20 15:06:42 +0000872 x = call_builtin(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000873 DECREF(v);
874 DECREF(w);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000875 PUSH(x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000876 break;
877
Guido van Rossume9736fc1990-11-18 17:33:06 +0000878 case SLICE+0:
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000879 case SLICE+1:
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000880 case SLICE+2:
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000881 case SLICE+3:
Guido van Rossum3f5da241990-12-20 15:06:42 +0000882 if ((opcode-SLICE) & 2)
Guido van Rossume9736fc1990-11-18 17:33:06 +0000883 w = POP();
884 else
885 w = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000886 if ((opcode-SLICE) & 1)
Guido van Rossume9736fc1990-11-18 17:33:06 +0000887 v = POP();
888 else
889 v = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000890 u = POP();
Guido van Rossum3f5da241990-12-20 15:06:42 +0000891 x = apply_slice(u, v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000892 DECREF(u);
Guido van Rossume9736fc1990-11-18 17:33:06 +0000893 XDECREF(v);
894 XDECREF(w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000895 PUSH(x);
896 break;
897
Guido van Rossume9736fc1990-11-18 17:33:06 +0000898 case STORE_SLICE+0:
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000899 case STORE_SLICE+1:
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000900 case STORE_SLICE+2:
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000901 case STORE_SLICE+3:
Guido van Rossum3f5da241990-12-20 15:06:42 +0000902 if ((opcode-STORE_SLICE) & 2)
Guido van Rossume9736fc1990-11-18 17:33:06 +0000903 w = POP();
904 else
905 w = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000906 if ((opcode-STORE_SLICE) & 1)
Guido van Rossume9736fc1990-11-18 17:33:06 +0000907 v = POP();
908 else
909 v = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000910 u = POP();
Guido van Rossum3f5da241990-12-20 15:06:42 +0000911 t = POP();
912 err = assign_slice(u, v, w, t); /* u[v:w] = t */
913 DECREF(t);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000914 DECREF(u);
Guido van Rossume9736fc1990-11-18 17:33:06 +0000915 XDECREF(v);
916 XDECREF(w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000917 break;
918
Guido van Rossume9736fc1990-11-18 17:33:06 +0000919 case DELETE_SLICE+0:
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000920 case DELETE_SLICE+1:
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000921 case DELETE_SLICE+2:
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000922 case DELETE_SLICE+3:
Guido van Rossum3f5da241990-12-20 15:06:42 +0000923 if ((opcode-DELETE_SLICE) & 2)
Guido van Rossume9736fc1990-11-18 17:33:06 +0000924 w = POP();
925 else
926 w = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000927 if ((opcode-DELETE_SLICE) & 1)
Guido van Rossume9736fc1990-11-18 17:33:06 +0000928 v = POP();
929 else
930 v = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000931 u = POP();
Guido van Rossum3f5da241990-12-20 15:06:42 +0000932 err = assign_slice(u, v, w, (object *)NULL);
933 /* del u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000934 DECREF(u);
Guido van Rossume9736fc1990-11-18 17:33:06 +0000935 XDECREF(v);
936 XDECREF(w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000937 break;
938
939 case STORE_SUBSCR:
940 w = POP();
941 v = POP();
942 u = POP();
943 /* v[w] = u */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000944 err = assign_subscript(v, w, u);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000945 DECREF(u);
946 DECREF(v);
947 DECREF(w);
948 break;
949
950 case DELETE_SUBSCR:
951 w = POP();
952 v = POP();
953 /* del v[w] */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000954 err = assign_subscript(v, w, (object *)NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000955 DECREF(v);
956 DECREF(w);
957 break;
958
959 case PRINT_EXPR:
960 v = POP();
961 fp = sysgetfile("stdout", stdout);
962 /* Print value except if procedure result */
963 if (v != None) {
964 flushline();
965 printobject(v, fp, 0);
966 fprintf(fp, "\n");
967 }
968 DECREF(v);
969 break;
970
971 case PRINT_ITEM:
972 v = POP();
973 fp = sysgetfile("stdout", stdout);
974 if (needspace)
975 fprintf(fp, " ");
976 if (is_stringobject(v)) {
977 char *s = getstringvalue(v);
978 int len = getstringsize(v);
979 fwrite(s, 1, len, fp);
980 if (len > 0 && s[len-1] == '\n')
981 needspace = 0;
982 else
983 needspace = 1;
984 }
985 else {
986 printobject(v, fp, 0);
987 needspace = 1;
988 }
989 DECREF(v);
990 break;
991
992 case PRINT_NEWLINE:
993 fp = sysgetfile("stdout", stdout);
994 fprintf(fp, "\n");
995 needspace = 0;
996 break;
997
998 case BREAK_LOOP:
Guido van Rossum3f5da241990-12-20 15:06:42 +0000999 why = WHY_BREAK;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001000 break;
1001
1002 case RAISE_EXCEPTION:
1003 v = POP();
1004 w = POP();
Guido van Rossum3f5da241990-12-20 15:06:42 +00001005 if (!is_stringobject(w))
1006 err_setstr(TypeError,
1007 "exceptions must be strings");
1008 else
1009 err_setval(w, v);
1010 DECREF(v);
1011 DECREF(w);
1012 why = WHY_EXCEPTION;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001013 break;
1014
Guido van Rossume9736fc1990-11-18 17:33:06 +00001015 case LOAD_LOCALS:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001016 v = f->f_locals;
Guido van Rossume9736fc1990-11-18 17:33:06 +00001017 INCREF(v);
1018 PUSH(v);
1019 break;
1020
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001021 case RETURN_VALUE:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001022 retval = POP();
1023 why = WHY_RETURN;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001024 break;
1025
1026 case REQUIRE_ARGS:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001027 if (EMPTY()) {
1028 err_setstr(TypeError,
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001029 "function expects argument(s)");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001030 why = WHY_EXCEPTION;
1031 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001032 break;
1033
1034 case REFUSE_ARGS:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001035 if (!EMPTY()) {
1036 err_setstr(TypeError,
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001037 "function expects no argument(s)");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001038 why = WHY_EXCEPTION;
1039 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001040 break;
1041
1042 case BUILD_FUNCTION:
1043 v = POP();
Guido van Rossum3f5da241990-12-20 15:06:42 +00001044 x = newfuncobject(v, f->f_globals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001045 DECREF(v);
1046 PUSH(x);
1047 break;
1048
1049 case POP_BLOCK:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001050 {
1051 block *b = pop_block(f);
1052 while (STACK_LEVEL() > b->b_level) {
1053 v = POP();
1054 DECREF(v);
1055 }
1056 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001057 break;
1058
1059 case END_FINALLY:
1060 v = POP();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001061 if (is_intobject(v)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001062 why = (enum why_code) getintvalue(v);
1063 if (why == WHY_RETURN)
1064 retval = POP();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001065 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001066 else if (is_stringobject(v)) {
1067 w = POP();
1068 err_setval(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001069 DECREF(w);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001070 w = POP();
1071 tb_store(w);
1072 DECREF(w);
1073 why = WHY_RERAISE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001074 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001075 else if (v != None) {
1076 err_setstr(SystemError,
1077 "'finally' pops bad exception");
1078 why = WHY_EXCEPTION;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001079 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001080 DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001081 break;
1082
Guido van Rossume9736fc1990-11-18 17:33:06 +00001083 case BUILD_CLASS:
1084 w = POP();
1085 v = POP();
Guido van Rossum3f5da241990-12-20 15:06:42 +00001086 x = build_class(v, w);
Guido van Rossume9736fc1990-11-18 17:33:06 +00001087 PUSH(x);
1088 DECREF(v);
1089 DECREF(w);
1090 break;
1091
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001092 case STORE_NAME:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001093 name = GETNAME(oparg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001094 v = POP();
Guido van Rossum3f5da241990-12-20 15:06:42 +00001095 err = dictinsert(f->f_locals, name, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001096 DECREF(v);
1097 break;
1098
1099 case DELETE_NAME:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001100 name = GETNAME(oparg);
1101 if ((err = dictremove(f->f_locals, name)) != 0)
1102 err_setstr(NameError, name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001103 break;
1104
1105 case UNPACK_TUPLE:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001106 v = POP();
1107 if (!is_tupleobject(v)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001108 err_setstr(TypeError, "unpack non-tuple");
1109 why = WHY_EXCEPTION;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001110 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001111 else if (gettuplesize(v) != oparg) {
1112 err_setstr(RuntimeError,
1113 "unpack tuple of wrong size");
1114 why = WHY_EXCEPTION;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001115 }
1116 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001117 for (; --oparg >= 0; ) {
1118 w = gettupleitem(v, oparg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001119 INCREF(w);
1120 PUSH(w);
1121 }
1122 }
1123 DECREF(v);
1124 break;
1125
1126 case UNPACK_LIST:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001127 v = POP();
1128 if (!is_listobject(v)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001129 err_setstr(TypeError, "unpack non-list");
1130 why = WHY_EXCEPTION;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001131 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001132 else if (getlistsize(v) != oparg) {
1133 err_setstr(RuntimeError,
1134 "unpack list of wrong size");
1135 why = WHY_EXCEPTION;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001136 }
1137 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001138 for (; --oparg >= 0; ) {
1139 w = getlistitem(v, oparg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001140 INCREF(w);
1141 PUSH(w);
1142 }
1143 }
1144 DECREF(v);
1145 break;
1146
1147 case STORE_ATTR:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001148 name = GETNAME(oparg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001149 v = POP();
1150 u = POP();
Guido van Rossum3f5da241990-12-20 15:06:42 +00001151 err = setattr(v, name, u); /* v.name = u */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001152 DECREF(v);
1153 DECREF(u);
1154 break;
1155
1156 case DELETE_ATTR:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001157 name = GETNAME(oparg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001158 v = POP();
Guido van Rossum3f5da241990-12-20 15:06:42 +00001159 err = setattr(v, name, (object *)NULL);
1160 /* del v.name */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001161 DECREF(v);
1162 break;
1163
1164 case LOAD_CONST:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001165 x = GETCONST(oparg);
1166 INCREF(x);
1167 PUSH(x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001168 break;
1169
1170 case LOAD_NAME:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001171 name = GETNAME(oparg);
1172 x = dictlookup(f->f_locals, name);
1173 if (x == NULL) {
1174 x = dictlookup(f->f_globals, name);
1175 if (x == NULL)
1176 x = getbuiltin(name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001177 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001178 if (x == NULL)
1179 err_setstr(NameError, name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001180 else
Guido van Rossum3f5da241990-12-20 15:06:42 +00001181 INCREF(x);
1182 PUSH(x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001183 break;
1184
1185 case BUILD_TUPLE:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001186 x = newtupleobject(oparg);
1187 if (x != NULL) {
1188 for (; --oparg >= 0;) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001189 w = POP();
Guido van Rossum3f5da241990-12-20 15:06:42 +00001190 err = settupleitem(x, oparg, w);
1191 if (err != 0)
1192 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001193 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001194 PUSH(x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001195 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001196 break;
1197
1198 case BUILD_LIST:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001199 x = newlistobject(oparg);
1200 if (x != NULL) {
1201 for (; --oparg >= 0;) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001202 w = POP();
Guido van Rossum3f5da241990-12-20 15:06:42 +00001203 err = setlistitem(x, oparg, w);
1204 if (err != 0)
1205 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001206 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001207 PUSH(x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001208 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001209 break;
1210
1211 case BUILD_MAP:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001212 x = newdictobject();
1213 PUSH(x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001214 break;
1215
1216 case LOAD_ATTR:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001217 name = GETNAME(oparg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001218 v = POP();
Guido van Rossum3f5da241990-12-20 15:06:42 +00001219 x = getattr(v, name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001220 DECREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001221 PUSH(x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001222 break;
1223
1224 case COMPARE_OP:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001225 w = POP();
1226 v = POP();
Guido van Rossum3f5da241990-12-20 15:06:42 +00001227 x = cmp_outcome((enum cmp_op)oparg, v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001228 DECREF(v);
1229 DECREF(w);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001230 PUSH(x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001231 break;
1232
1233 case IMPORT_NAME:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001234 name = GETNAME(oparg);
1235 x = import_module(name);
1236 XINCREF(x);
1237 PUSH(x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001238 break;
1239
1240 case IMPORT_FROM:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001241 name = GETNAME(oparg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001242 v = TOP();
Guido van Rossum3f5da241990-12-20 15:06:42 +00001243 err = import_from(f->f_locals, v, name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001244 break;
1245
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001246 case JUMP_FORWARD:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001247 JUMPBY(oparg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001248 break;
1249
1250 case JUMP_IF_FALSE:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001251 if (!testbool(TOP()))
1252 JUMPBY(oparg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001253 break;
1254
1255 case JUMP_IF_TRUE:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001256 if (testbool(TOP()))
1257 JUMPBY(oparg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001258 break;
1259
1260 case JUMP_ABSOLUTE:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001261 JUMPTO(oparg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001262 break;
1263
1264 case FOR_LOOP:
1265 /* for v in s: ...
1266 On entry: stack contains s, i.
1267 On exit: stack contains s, i+1, s[i];
1268 but if loop exhausted:
Guido van Rossume9736fc1990-11-18 17:33:06 +00001269 s, i are popped, and we jump */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001270 w = POP(); /* Loop index */
1271 v = POP(); /* Sequence object */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001272 u = loop_subscript(v, w);
1273 if (u != NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001274 PUSH(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001275 x = newintobject(getintvalue(w)+1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001276 PUSH(x);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001277 DECREF(w);
1278 PUSH(u);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001279 }
1280 else {
1281 DECREF(v);
1282 DECREF(w);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001283 /* A NULL can mean "s exhausted"
1284 but also an error: */
1285 if (err_occurred())
1286 why = WHY_EXCEPTION;
1287 else
1288 JUMPBY(oparg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001289 }
1290 break;
1291
1292 case SETUP_LOOP:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001293 case SETUP_EXCEPT:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001294 case SETUP_FINALLY:
1295 setup_block(f, opcode, INSTR_OFFSET() + oparg,
1296 STACK_LEVEL());
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001297 break;
1298
Guido van Rossum3f5da241990-12-20 15:06:42 +00001299 case SET_LINENO:
1300#ifdef TRACE
1301 if (trace)
1302 printf("--- Line %d ---\n", oparg);
1303#endif
1304 lineno = oparg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001305 break;
1306
1307 default:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001308 fprintf(stderr,
1309 "XXX lineno: %d, opcode: %d\n",
1310 lineno, opcode);
1311 err_setstr(SystemError, "eval_code: unknown opcode");
1312 why = WHY_EXCEPTION;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001313 break;
1314
Guido van Rossum3f5da241990-12-20 15:06:42 +00001315 } /* switch */
1316
1317
1318 /* Quickly continue if no error occurred */
1319
1320 if (why == WHY_NOT) {
1321 if (err == 0 && x != NULL)
1322 continue; /* Normal, fast path */
1323 why = WHY_EXCEPTION;
1324 x = None;
1325 err = 0;
1326 }
1327
1328#ifndef NDEBUG
1329 /* Double-check exception status */
1330
1331 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
1332 if (!err_occurred()) {
1333 fprintf(stderr, "XXX ghost error\n");
1334 err_setstr(SystemError, "ghost error");
1335 why = WHY_EXCEPTION;
1336 }
1337 }
1338 else {
1339 if (err_occurred()) {
1340 fprintf(stderr, "XXX undetected error\n");
1341 why = WHY_EXCEPTION;
1342 }
1343 }
1344#endif
1345
1346 /* Log traceback info if this is a real exception */
1347
1348 if (why == WHY_EXCEPTION) {
1349 int lasti = INSTR_OFFSET() - 1;
1350 if (HAS_ARG(opcode))
1351 lasti -= 2;
1352 tb_here(f, lasti, lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001353 }
1354
Guido van Rossum3f5da241990-12-20 15:06:42 +00001355 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001356
Guido van Rossum3f5da241990-12-20 15:06:42 +00001357 if (why == WHY_RERAISE)
1358 why = WHY_EXCEPTION;
1359
1360 /* Unwind stacks if a (pseudo) exception occurred */
1361
1362 while (why != WHY_NOT && f->f_iblock > 0) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001363 block *b = pop_block(f);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001364 while (STACK_LEVEL() > b->b_level) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001365 v = POP();
1366 XDECREF(v);
1367 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001368 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1369 why = WHY_NOT;
1370 JUMPTO(b->b_handler);
1371 break;
1372 }
1373 if (b->b_type == SETUP_FINALLY ||
1374 b->b_type == SETUP_EXCEPT &&
1375 why == WHY_EXCEPTION) {
1376 if (why == WHY_EXCEPTION) {
1377 object *exc, *val;
1378 err_get(&exc, &val);
1379 if (val == NULL) {
1380 val = None;
1381 INCREF(val);
1382 }
1383 v = tb_fetch();
1384 /* Make the raw exception data
1385 available to the handler,
1386 so a program can emulate the
1387 Python main loop. Don't do
1388 this for 'finally'. */
1389 if (b->b_type == SETUP_EXCEPT) {
1390#if 0 /* Oops, this breaks too many things */
1391 sysset("exc_traceback", v);
1392#endif
1393 sysset("exc_value", val);
1394 sysset("exc_type", exc);
1395 err_clear();
1396 }
1397 PUSH(v);
1398 PUSH(val);
1399 PUSH(exc);
1400 }
1401 else {
1402 if (why == WHY_RETURN)
1403 PUSH(retval);
1404 v = newintobject((long)why);
1405 PUSH(v);
1406 }
1407 why = WHY_NOT;
1408 JUMPTO(b->b_handler);
1409 break;
1410 }
1411 } /* unwind stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001412
Guido van Rossum3f5da241990-12-20 15:06:42 +00001413 /* End the loop if we still have an error (or return) */
1414
1415 if (why != WHY_NOT)
1416 break;
1417
1418 } /* main loop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001419
Guido van Rossum3f5da241990-12-20 15:06:42 +00001420 /* Pop remaining stack entries */
1421
1422 while (!EMPTY()) {
1423 v = POP();
1424 XDECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001425 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001426
1427 /* Restore previous frame and release the current one */
1428
1429 current_frame = f->f_back;
1430 DECREF(f);
1431
1432 if (why == WHY_RETURN)
1433 return retval;
1434 else
1435 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001436}