blob: 1c12d9cbc23d6b5c45acdc1f949c5872679c65d0 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum34679b71993-01-26 13:33:44 +00002Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
3Amsterdam, The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
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"
Guido van Rossumff4949e1992-08-05 19:58:53 +000033#include "eval.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000034#include "ceval.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000035#include "opcode.h"
Guido van Rossum86cd6e61991-01-21 15:12:35 +000036#include "bltinmodule.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000037#include "traceback.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000038
Guido van Rossum04691fc1992-08-12 15:35:34 +000039/* Turn this on if your compiler chokes on the big switch: */
Guido van Rossumacbe8da1993-04-15 15:33:52 +000040/* #define CASE_TOO_BIG 1 /**/
Guido van Rossum04691fc1992-08-12 15:35:34 +000041
Guido van Rossumacbe8da1993-04-15 15:33:52 +000042/* Turn this on if you want to debug the interpreter: */
43/* (This can be on even if NDEBUG is defined) */
44/* #define DEBUG 1 /**/
45
46#if defined(DEBUG) || !defined(NDEBUG)
Guido van Rossum96a42c81992-01-12 02:29:51 +000047/* For debugging the interpreter: */
48#define LLTRACE 1 /* Low-level trace feature */
49#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000050#endif
51
Guido van Rossum5b722181993-03-30 17:46:03 +000052
Guido van Rossum374a9221991-04-04 10:40:29 +000053/* Forward declarations */
Guido van Rossum374a9221991-04-04 10:40:29 +000054
Guido van Rossum0a066c01992-03-27 17:29:15 +000055#ifdef LLTRACE
56static int prtrace PROTO((object *, char *));
57#endif
Guido van Rossum9c8d70d1992-03-23 18:19:28 +000058static void call_exc_trace PROTO((object **, object**, frameobject *));
59static int call_trace
60 PROTO((object **, object **, frameobject *, char *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000061static object *add PROTO((object *, object *));
62static object *sub PROTO((object *, object *));
63static object *mul PROTO((object *, object *));
64static object *divide PROTO((object *, object *));
65static object *rem PROTO((object *, object *));
66static object *neg PROTO((object *));
67static object *pos PROTO((object *));
68static object *not PROTO((object *));
69static object *invert PROTO((object *));
70static object *lshift PROTO((object *, object *));
71static object *rshift PROTO((object *, object *));
72static object *and PROTO((object *, object *));
73static object *xor PROTO((object *, object *));
74static object *or PROTO((object *, object *));
75static object *call_builtin PROTO((object *, object *));
76static object *call_function PROTO((object *, object *));
77static object *apply_subscript PROTO((object *, object *));
78static object *loop_subscript PROTO((object *, object *));
79static int slice_index PROTO((object *, int, int *));
80static object *apply_slice PROTO((object *, object *, object *));
81static int assign_subscript PROTO((object *, object *, object *));
82static int assign_slice PROTO((object *, object *, object *, object *));
83static int cmp_exception PROTO((object *, object *));
84static int cmp_member PROTO((object *, object *));
Guido van Rossum5b7313a1992-04-06 13:24:57 +000085static object *cmp_outcome PROTO((int, object *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000086static int import_from PROTO((object *, object *, object *));
Guido van Rossum25831651993-05-19 14:50:45 +000087static object *build_class PROTO((object *, object *, object *));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +000088static void locals_2_fast PROTO((frameobject *, int));
Guido van Rossum5b722181993-03-30 17:46:03 +000089static void fast_2_locals PROTO((frameobject *));
Guido van Rossumb3f72581993-05-21 19:56:10 +000090static int access_statement PROTO((object *, object *, frameobject *));
Guido van Rossum374a9221991-04-04 10:40:29 +000091
92
Guido van Rossum0a066c01992-03-27 17:29:15 +000093/* Pointer to current frame, used to link new frames to */
94
Guido van Rossum374a9221991-04-04 10:40:29 +000095static frameobject *current_frame;
96
Guido van Rossum1984f1e1992-08-04 12:41:02 +000097#ifdef USE_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +000098
Guido van Rossum1984f1e1992-08-04 12:41:02 +000099#include <errno.h>
100#include "thread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000101
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000102static type_lock interpreter_lock;
103
104void
105init_save_thread()
106{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000107 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000108 return;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000109 interpreter_lock = allocate_lock();
110 acquire_lock(interpreter_lock, 1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000111}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000112
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000113#endif
114
Guido van Rossumff4949e1992-08-05 19:58:53 +0000115/* Functions save_thread and restore_thread are always defined so
116 dynamically loaded modules needn't be compiled separately for use
117 with and without threads: */
118
Guido van Rossum04691fc1992-08-12 15:35:34 +0000119object *
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000120save_thread()
121{
122#ifdef USE_THREAD
123 if (interpreter_lock) {
Guido van Rossum04691fc1992-08-12 15:35:34 +0000124 object *res;
125 res = (object *)current_frame;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000126 current_frame = NULL;
127 release_lock(interpreter_lock);
128 return res;
129 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000130#endif
Guido van Rossum9575a441993-04-07 14:06:14 +0000131 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000132}
133
134void
135restore_thread(x)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000136 object *x;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000137{
138#ifdef USE_THREAD
139 if (interpreter_lock) {
140 int err;
141 err = errno;
142 acquire_lock(interpreter_lock, 1);
143 errno = err;
144 current_frame = (frameobject *)x;
145 }
146#endif
147}
148
149
Guido van Rossum374a9221991-04-04 10:40:29 +0000150/* Status code for main loop (reason for stack unwind) */
151
152enum why_code {
153 WHY_NOT, /* No error */
154 WHY_EXCEPTION, /* Exception occurred */
155 WHY_RERAISE, /* Exception re-raised by 'finally' */
156 WHY_RETURN, /* 'return' statement */
157 WHY_BREAK /* 'break' statement */
158};
159
160
161/* Interpreter main loop */
162
163object *
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000164eval_code(co, globals, locals, owner, arg)
Guido van Rossum374a9221991-04-04 10:40:29 +0000165 codeobject *co;
166 object *globals;
167 object *locals;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000168 object *owner;
Guido van Rossum374a9221991-04-04 10:40:29 +0000169 object *arg;
170{
171 register unsigned char *next_instr;
172 register int opcode; /* Current opcode */
173 register int oparg; /* Current opcode argument, if any */
174 register object **stack_pointer;
175 register enum why_code why; /* Reason for block stack unwind */
176 register int err; /* Error status -- nonzero if error */
177 register object *x; /* Result object -- NULL if error */
178 register object *v; /* Temporary objects popped off stack */
179 register object *w;
180 register object *u;
181 register object *t;
182 register frameobject *f; /* Current frame */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000183 register listobject *fastlocals = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000184 object *trace = NULL; /* Trace function or NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000185 object *retval; /* Return value iff why == WHY_RETURN */
186 char *name; /* Name used by some instructions */
Guido van Rossumb3f72581993-05-21 19:56:10 +0000187 int needmerge = 0; /* Set if need to merge locals back at end */
188 int defmode = 0; /* Default access mode for new variables */
Guido van Rossum96a42c81992-01-12 02:29:51 +0000189#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000190 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000191#endif
Guido van Rossum99bec951992-09-03 20:29:45 +0000192#ifdef DEBUG
193 /* Make it easier to find out where we are with dbx */
194 char *filename = getstringvalue(co->co_filename);
195#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000196
197/* Code access macros */
198
199#define GETCONST(i) Getconst(f, i)
200#define GETNAME(i) Getname(f, i)
201#define GETNAMEV(i) Getnamev(f, i)
202#define FIRST_INSTR() (GETUSTRINGVALUE(f->f_code->co_code))
203#define INSTR_OFFSET() (next_instr - FIRST_INSTR())
204#define NEXTOP() (*next_instr++)
205#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
206#define JUMPTO(x) (next_instr = FIRST_INSTR() + (x))
207#define JUMPBY(x) (next_instr += (x))
208
209/* Stack manipulation macros */
210
211#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
212#define EMPTY() (STACK_LEVEL() == 0)
213#define TOP() (stack_pointer[-1])
214#define BASIC_PUSH(v) (*stack_pointer++ = (v))
215#define BASIC_POP() (*--stack_pointer)
216
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000217#define CHECK_STACK(n) (STACK_LEVEL() + (n) < f->f_nvalues || \
218 (stack_pointer = extend_stack(f, STACK_LEVEL(), n)))
219
Guido van Rossum96a42c81992-01-12 02:29:51 +0000220#ifdef LLTRACE
221#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
222#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000223#else
224#define PUSH(v) BASIC_PUSH(v)
225#define POP() BASIC_POP()
226#endif
227
Guido van Rossum5b722181993-03-30 17:46:03 +0000228 if (globals == NULL) {
229 globals = getglobals();
230 if (locals == NULL) {
231 locals = getlocals();
232 needmerge = 1;
233 }
234 }
235 else {
236 if (locals == NULL)
237 locals = globals;
238 }
239
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000240#ifdef LLTRACE
241 lltrace = dictlookup(globals, "__lltrace__") != NULL;
242#endif
243
Guido van Rossum374a9221991-04-04 10:40:29 +0000244 f = newframeobject(
245 current_frame, /*back*/
246 co, /*code*/
247 globals, /*globals*/
248 locals, /*locals*/
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000249 owner, /*owner*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000250 50, /*nvalues*/
251 20); /*nblocks*/
252 if (f == NULL)
253 return NULL;
254
255 current_frame = f;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000256
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000257 if (sys_trace != NULL) {
258 /* sys_trace, if defined, is a function that will
Guido van Rossum96a42c81992-01-12 02:29:51 +0000259 be called on *every* entry to a code block.
260 Its return value, if not None, is a function that
261 will be called at the start of each executed line
262 of code. (Actually, the function must return
263 itself in order to continue tracing.)
264 The trace functions are called with three arguments:
265 a pointer to the current frame, a string indicating
266 why the function is called, and an argument which
267 depends on the situation. The global trace function
268 (sys.trace) is also called whenever an exception
269 is detected. */
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000270 if (call_trace(&sys_trace, &trace, f, "call", arg)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000271 /* Trace function raised an error */
Guido van Rossum96a42c81992-01-12 02:29:51 +0000272 current_frame = f->f_back;
273 DECREF(f);
274 return NULL;
275 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000276 }
277
278 if (sys_profile != NULL) {
279 /* Similar for sys_profile, except it needn't return
280 itself and isn't called for "line" events */
281 if (call_trace(&sys_profile, (object**)0, f, "call", arg)) {
282 current_frame = f->f_back;
283 DECREF(f);
284 return NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000285 }
286 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000287
288 next_instr = GETUSTRINGVALUE(f->f_code->co_code);
Guido van Rossum374a9221991-04-04 10:40:29 +0000289 stack_pointer = f->f_valuestack;
290
291 if (arg != NULL) {
292 INCREF(arg);
293 PUSH(arg);
294 }
295
296 why = WHY_NOT;
297 err = 0;
298 x = None; /* Not a reference, just anything non-NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000299
300 for (;;) {
Guido van Rossum4965bc81991-05-14 11:51:49 +0000301 static int ticker;
Guido van Rossum374a9221991-04-04 10:40:29 +0000302
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000303 /* Do periodic things.
304 Doing this every time through the loop would add
305 too much overhead (a function call per instruction).
306 So we do it only every tenth instruction. */
Guido van Rossum374a9221991-04-04 10:40:29 +0000307
308 if (--ticker < 0) {
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000309 ticker = 10;
Guido van Rossum374a9221991-04-04 10:40:29 +0000310 if (intrcheck()) {
311 err_set(KeyboardInterrupt);
312 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000313 goto on_error;
314 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000315
316#ifdef USE_THREAD
317 if (interpreter_lock) {
318 /* Give another thread a chance */
319
320 current_frame = NULL;
321 release_lock(interpreter_lock);
322
323 /* Other threads may run now */
324
325 acquire_lock(interpreter_lock, 1);
326 current_frame = f;
327 }
328#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000329 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000330
Guido van Rossum374a9221991-04-04 10:40:29 +0000331 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000332
333#ifdef DEBUG
334 f->f_lasti = INSTR_OFFSET();
335#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000336
337 opcode = NEXTOP();
338 if (HAS_ARG(opcode))
339 oparg = NEXTARG();
340
Guido van Rossum96a42c81992-01-12 02:29:51 +0000341#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000342 /* Instruction tracing */
343
Guido van Rossum96a42c81992-01-12 02:29:51 +0000344 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000345 if (HAS_ARG(opcode)) {
346 printf("%d: %d, %d\n",
347 (int) (INSTR_OFFSET() - 3),
348 opcode, oparg);
349 }
350 else {
351 printf("%d: %d\n",
352 (int) (INSTR_OFFSET() - 1), opcode);
353 }
354 }
355#endif
356
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000357 if (!CHECK_STACK(3)) {
358 x = NULL;
359 break;
360 }
361
Guido van Rossum374a9221991-04-04 10:40:29 +0000362 /* Main switch on opcode */
363
364 switch (opcode) {
365
366 /* BEWARE!
367 It is essential that any operation that fails sets either
368 x to NULL, err to nonzero, or why to anything but WHY_NOT,
369 and that no operation that succeeds does this! */
370
371 /* case STOP_CODE: this is an error! */
372
373 case POP_TOP:
374 v = POP();
375 DECREF(v);
376 break;
377
378 case ROT_TWO:
379 v = POP();
380 w = POP();
381 PUSH(v);
382 PUSH(w);
383 break;
384
385 case ROT_THREE:
386 v = POP();
387 w = POP();
388 x = POP();
389 PUSH(v);
390 PUSH(x);
391 PUSH(w);
392 break;
393
394 case DUP_TOP:
395 v = TOP();
396 INCREF(v);
397 PUSH(v);
398 break;
399
400 case UNARY_POSITIVE:
401 v = POP();
402 x = pos(v);
403 DECREF(v);
404 PUSH(x);
405 break;
406
407 case UNARY_NEGATIVE:
408 v = POP();
409 x = neg(v);
410 DECREF(v);
411 PUSH(x);
412 break;
413
414 case UNARY_NOT:
415 v = POP();
416 x = not(v);
417 DECREF(v);
418 PUSH(x);
419 break;
420
421 case UNARY_CONVERT:
422 v = POP();
423 x = reprobject(v);
424 DECREF(v);
425 PUSH(x);
426 break;
427
428 case UNARY_CALL:
429 v = POP();
Guido van Rossum96a42c81992-01-12 02:29:51 +0000430 f->f_lasti = INSTR_OFFSET() - 1; /* For tracing */
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000431 x = call_object(v, (object *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +0000432 DECREF(v);
433 PUSH(x);
434 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000435
436 case UNARY_INVERT:
437 v = POP();
438 x = invert(v);
439 DECREF(v);
440 PUSH(x);
441 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000442
443 case BINARY_MULTIPLY:
444 w = POP();
445 v = POP();
446 x = mul(v, w);
447 DECREF(v);
448 DECREF(w);
449 PUSH(x);
450 break;
451
452 case BINARY_DIVIDE:
453 w = POP();
454 v = POP();
455 x = divide(v, w);
456 DECREF(v);
457 DECREF(w);
458 PUSH(x);
459 break;
460
461 case BINARY_MODULO:
462 w = POP();
463 v = POP();
464 x = rem(v, w);
465 DECREF(v);
466 DECREF(w);
467 PUSH(x);
468 break;
469
470 case BINARY_ADD:
471 w = POP();
472 v = POP();
473 x = add(v, w);
474 DECREF(v);
475 DECREF(w);
476 PUSH(x);
477 break;
478
479 case BINARY_SUBTRACT:
480 w = POP();
481 v = POP();
482 x = sub(v, w);
483 DECREF(v);
484 DECREF(w);
485 PUSH(x);
486 break;
487
488 case BINARY_SUBSCR:
489 w = POP();
490 v = POP();
491 x = apply_subscript(v, w);
492 DECREF(v);
493 DECREF(w);
494 PUSH(x);
495 break;
496
497 case BINARY_CALL:
498 w = POP();
499 v = POP();
Guido van Rossum96a42c81992-01-12 02:29:51 +0000500 f->f_lasti = INSTR_OFFSET() - 1; /* For tracing */
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000501 x = call_object(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000502 DECREF(v);
503 DECREF(w);
504 PUSH(x);
505 break;
506
Guido van Rossum7928cd71991-10-24 14:59:31 +0000507 case BINARY_LSHIFT:
508 w = POP();
509 v = POP();
510 x = lshift(v, w);
511 DECREF(v);
512 DECREF(w);
513 PUSH(x);
514 break;
515
516 case BINARY_RSHIFT:
517 w = POP();
518 v = POP();
519 x = rshift(v, w);
520 DECREF(v);
521 DECREF(w);
522 PUSH(x);
523 break;
524
525 case BINARY_AND:
526 w = POP();
527 v = POP();
528 x = and(v, w);
529 DECREF(v);
530 DECREF(w);
531 PUSH(x);
532 break;
533
534 case BINARY_XOR:
535 w = POP();
536 v = POP();
537 x = xor(v, w);
538 DECREF(v);
539 DECREF(w);
540 PUSH(x);
541 break;
542
543 case BINARY_OR:
544 w = POP();
545 v = POP();
546 x = or(v, w);
547 DECREF(v);
548 DECREF(w);
549 PUSH(x);
550 break;
551
Guido van Rossum374a9221991-04-04 10:40:29 +0000552 case SLICE+0:
553 case SLICE+1:
554 case SLICE+2:
555 case SLICE+3:
556 if ((opcode-SLICE) & 2)
557 w = POP();
558 else
559 w = NULL;
560 if ((opcode-SLICE) & 1)
561 v = POP();
562 else
563 v = NULL;
564 u = POP();
565 x = apply_slice(u, v, w);
566 DECREF(u);
567 XDECREF(v);
568 XDECREF(w);
569 PUSH(x);
570 break;
571
572 case STORE_SLICE+0:
573 case STORE_SLICE+1:
574 case STORE_SLICE+2:
575 case STORE_SLICE+3:
576 if ((opcode-STORE_SLICE) & 2)
577 w = POP();
578 else
579 w = NULL;
580 if ((opcode-STORE_SLICE) & 1)
581 v = POP();
582 else
583 v = NULL;
584 u = POP();
585 t = POP();
586 err = assign_slice(u, v, w, t); /* u[v:w] = t */
587 DECREF(t);
588 DECREF(u);
589 XDECREF(v);
590 XDECREF(w);
591 break;
592
593 case DELETE_SLICE+0:
594 case DELETE_SLICE+1:
595 case DELETE_SLICE+2:
596 case DELETE_SLICE+3:
597 if ((opcode-DELETE_SLICE) & 2)
598 w = POP();
599 else
600 w = NULL;
601 if ((opcode-DELETE_SLICE) & 1)
602 v = POP();
603 else
604 v = NULL;
605 u = POP();
606 err = assign_slice(u, v, w, (object *)NULL);
607 /* del u[v:w] */
608 DECREF(u);
609 XDECREF(v);
610 XDECREF(w);
611 break;
612
613 case STORE_SUBSCR:
614 w = POP();
615 v = POP();
616 u = POP();
617 /* v[w] = u */
618 err = assign_subscript(v, w, u);
619 DECREF(u);
620 DECREF(v);
621 DECREF(w);
622 break;
623
624 case DELETE_SUBSCR:
625 w = POP();
626 v = POP();
627 /* del v[w] */
628 err = assign_subscript(v, w, (object *)NULL);
629 DECREF(v);
630 DECREF(w);
631 break;
632
633 case PRINT_EXPR:
634 v = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +0000635 /* Print value except if procedure result */
636 if (v != None) {
637 flushline();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000638 x = sysget("stdout");
639 softspace(x, 1);
640 err = writeobject(v, x, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000641 flushline();
642 }
643 DECREF(v);
644 break;
645
646 case PRINT_ITEM:
647 v = POP();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000648 w = sysget("stdout");
649 if (softspace(w, 1))
650 writestring(" ", w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000651 if (is_stringobject(v)) {
652 char *s = getstringvalue(v);
653 int len = getstringsize(v);
Guido van Rossum3165fe61992-09-25 21:59:05 +0000654 err = writeobject(v, w, PRINT_RAW);
655 if (err == 0 && len > 0 && s[len-1] == '\n')
656 softspace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000657 }
658 else {
Guido van Rossum3165fe61992-09-25 21:59:05 +0000659 err = writeobject(v, w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000660 }
661 DECREF(v);
662 break;
663
664 case PRINT_NEWLINE:
Guido van Rossum3165fe61992-09-25 21:59:05 +0000665 x = sysget("stdout");
666 if (x == NULL)
667 err_setstr(RuntimeError, "lost sys.stdout");
668 else {
669 writestring("\n", x);
670 softspace(x, 0);
671 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000672 break;
673
674 case BREAK_LOOP:
675 why = WHY_BREAK;
676 break;
677
678 case RAISE_EXCEPTION:
679 v = POP();
680 w = POP();
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000681 /* A tuple is equivalent to its first element here */
682 while (is_tupleobject(w)) {
683 u = w;
684 w = gettupleitem(u, 0);
685 DECREF(u);
686 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000687 if (!is_stringobject(w))
688 err_setstr(TypeError,
689 "exceptions must be strings");
690 else
691 err_setval(w, v);
692 DECREF(v);
693 DECREF(w);
694 why = WHY_EXCEPTION;
695 break;
696
697 case LOAD_LOCALS:
698 v = f->f_locals;
699 INCREF(v);
700 PUSH(v);
701 break;
702
703 case RETURN_VALUE:
704 retval = POP();
705 why = WHY_RETURN;
706 break;
707
Guido van Rossum374a9221991-04-04 10:40:29 +0000708 case BUILD_FUNCTION:
709 v = POP();
710 x = newfuncobject(v, f->f_globals);
711 DECREF(v);
712 PUSH(x);
713 break;
714
715 case POP_BLOCK:
716 {
717 block *b = pop_block(f);
718 while (STACK_LEVEL() > b->b_level) {
719 v = POP();
720 DECREF(v);
721 }
722 }
723 break;
724
725 case END_FINALLY:
726 v = POP();
727 if (is_intobject(v)) {
728 why = (enum why_code) getintvalue(v);
729 if (why == WHY_RETURN)
730 retval = POP();
731 }
732 else if (is_stringobject(v)) {
733 w = POP();
734 err_setval(v, w);
735 DECREF(w);
736 w = POP();
737 tb_store(w);
738 DECREF(w);
739 why = WHY_RERAISE;
740 }
741 else if (v != None) {
742 err_setstr(SystemError,
743 "'finally' pops bad exception");
744 why = WHY_EXCEPTION;
745 }
746 DECREF(v);
747 break;
748
749 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +0000750 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +0000751 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +0000752 w = POP();
753 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000754 PUSH(x);
Guido van Rossum25831651993-05-19 14:50:45 +0000755 DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +0000756 DECREF(v);
757 DECREF(w);
758 break;
759
760 case STORE_NAME:
761 w = GETNAMEV(oparg);
762 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +0000763 u = dict2lookup(f->f_locals, w);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000764 if (u == NULL) {
765 if (defmode != 0) {
766 if (v != None)
767 u = (object *)v->ob_type;
768 else
769 u = NULL;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000770 x = newaccessobject(v, f->f_locals,
Guido van Rossumb3f72581993-05-21 19:56:10 +0000771 (typeobject *)u,
772 defmode);
773 DECREF(v);
774 if (x == NULL)
775 break;
776 v = x;
777 }
778 }
779 else if (is_accessobject(u)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000780 err = setaccessvalue(u, f->f_locals, v);
Guido van Rossum25831651993-05-19 14:50:45 +0000781 DECREF(v);
782 break;
783 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000784 err = dict2insert(f->f_locals, w, v);
785 DECREF(v);
786 break;
787
788 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000789 w = GETNAMEV(oparg);
Guido van Rossum25831651993-05-19 14:50:45 +0000790 u = dict2lookup(f->f_locals, w);
791 if (u != NULL && is_accessobject(u)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000792 err = setaccessvalue(u, f->f_locals,
Guido van Rossum25831651993-05-19 14:50:45 +0000793 (object *)NULL);
794 break;
795 }
Guido van Rossumdf62e441991-08-16 08:56:04 +0000796 if ((err = dict2remove(f->f_locals, w)) != 0)
797 err_setstr(NameError, getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000798 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000799
800#ifdef CASE_TOO_BIG
801 default: switch (opcode) {
802#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000803
Guido van Rossum6a3f9a81992-01-14 18:29:20 +0000804 case UNPACK_VARARG:
805 if (EMPTY()) {
806 err_setstr(TypeError,
807 "no argument list");
808 why = WHY_EXCEPTION;
809 break;
810 }
811 v = POP();
812 if (!is_tupleobject(v)) {
813 err_setstr(TypeError,
814 "bad argument list");
815 why = WHY_EXCEPTION;
816 }
817 else if (gettuplesize(v) < oparg) {
818 err_setstr(TypeError,
819 "not enough arguments");
820 why = WHY_EXCEPTION;
821 }
822 else if (oparg == 0) {
823 PUSH(v);
824 break;
825 }
826 else {
827 x = gettupleslice(v, oparg, gettuplesize(v));
828 if (x != NULL) {
829 PUSH(x);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000830 if (!CHECK_STACK(oparg)) {
831 x = NULL;
832 break;
833 }
Guido van Rossum6a3f9a81992-01-14 18:29:20 +0000834 for (; --oparg >= 0; ) {
835 w = gettupleitem(v, oparg);
836 INCREF(w);
837 PUSH(w);
838 }
839 }
840 }
841 DECREF(v);
842 break;
843
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000844 case UNPACK_ARG:
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000845 {
846 int n;
847 if (EMPTY()) {
848 err_setstr(TypeError,
849 "no argument list");
850 why = WHY_EXCEPTION;
851 break;
852 }
853 v = POP();
854 if (!is_tupleobject(v)) {
855 err_setstr(TypeError,
856 "bad argument list");
857 why = WHY_EXCEPTION;
858 break;
859 }
860 n = gettuplesize(v);
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000861#ifdef COMPAT_HACKS
862/* Implement various compatibility hacks (for 0.9.4 or earlier):
863 (a) f(a,b,...) accepts f((1,2,...))
864 (b) f((a,b,...)) accepts f(1,2,...)
865 (c) f(self,(a,b,...)) accepts f(x,1,2,...)
866*/
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000867 if (n == 1 && oparg != 1) {
868 /* Rule (a) */
869 w = gettupleitem(v, 0);
870 if (is_tupleobject(w)) {
871 INCREF(w);
872 DECREF(v);
873 v = w;
874 n = gettuplesize(v);
875 }
876 }
877 else if (n != 1 && oparg == 1) {
878 /* Rule (b) */
879 PUSH(v);
880 break;
881 /* Don't fall through */
882 }
883 else if (n > 2 && oparg == 2) {
884 /* Rule (c) */
885 int i;
886 w = newtupleobject(n-1);
887 u = newtupleobject(2);
888 if (u == NULL || w == NULL) {
889 XDECREF(w);
890 XDECREF(u);
891 DECREF(v);
892 why = WHY_EXCEPTION;
893 break;
894 }
895 t = gettupleitem(v, 0);
896 INCREF(t);
897 settupleitem(u, 0, t);
898 for (i = 1; i < n; i++) {
899 t = gettupleitem(v, i);
900 INCREF(t);
901 settupleitem(w, i-1, t);
902 }
903 settupleitem(u, 1, w);
904 DECREF(v);
905 v = u;
906 n = 2;
907 }
Guido van Rossum5f59d601992-12-14 16:59:51 +0000908#endif /* Disabled compatibility hacks */
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000909 if (n != oparg) {
910 err_setstr(TypeError,
911 "arg count mismatch");
912 why = WHY_EXCEPTION;
913 DECREF(v);
914 break;
915 }
916 PUSH(v);
917 }
918 /* Fall through */
Guido van Rossum374a9221991-04-04 10:40:29 +0000919 case UNPACK_TUPLE:
920 v = POP();
921 if (!is_tupleobject(v)) {
922 err_setstr(TypeError, "unpack non-tuple");
923 why = WHY_EXCEPTION;
924 }
925 else if (gettuplesize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000926 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +0000927 "unpack tuple of wrong size");
928 why = WHY_EXCEPTION;
929 }
930 else {
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000931 if (!CHECK_STACK(oparg)) {
932 x = NULL;
933 break;
934 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000935 for (; --oparg >= 0; ) {
936 w = gettupleitem(v, oparg);
937 INCREF(w);
938 PUSH(w);
939 }
940 }
941 DECREF(v);
942 break;
943
944 case UNPACK_LIST:
945 v = POP();
946 if (!is_listobject(v)) {
947 err_setstr(TypeError, "unpack non-list");
948 why = WHY_EXCEPTION;
949 }
950 else if (getlistsize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000951 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +0000952 "unpack list of wrong size");
953 why = WHY_EXCEPTION;
954 }
955 else {
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000956 if (!CHECK_STACK(oparg)) {
957 x = NULL;
958 break;
959 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000960 for (; --oparg >= 0; ) {
961 w = getlistitem(v, oparg);
962 INCREF(w);
963 PUSH(w);
964 }
965 }
966 DECREF(v);
967 break;
968
969 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +0000970 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +0000971 v = POP();
972 u = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +0000973 err = setattro(v, w, u); /* v.w = u */
Guido van Rossum374a9221991-04-04 10:40:29 +0000974 DECREF(v);
975 DECREF(u);
976 break;
977
978 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +0000979 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +0000980 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +0000981 err = setattro(v, w, (object *)NULL); /* del v.w */
Guido van Rossum374a9221991-04-04 10:40:29 +0000982 DECREF(v);
983 break;
984
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000985 case STORE_GLOBAL:
986 w = GETNAMEV(oparg);
987 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +0000988 u = dict2lookup(f->f_locals, w);
989 if (u != NULL && is_accessobject(u)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000990 err = setaccessvalue(u, f->f_globals, v);
Guido van Rossum25831651993-05-19 14:50:45 +0000991 DECREF(v);
992 break;
993 }
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000994 err = dict2insert(f->f_globals, w, v);
995 DECREF(v);
996 break;
997
998 case DELETE_GLOBAL:
999 w = GETNAMEV(oparg);
Guido van Rossum25831651993-05-19 14:50:45 +00001000 u = dict2lookup(f->f_locals, w);
1001 if (u != NULL && is_accessobject(u)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001002 err = setaccessvalue(u, f->f_globals,
Guido van Rossum25831651993-05-19 14:50:45 +00001003 (object *)NULL);
1004 break;
1005 }
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001006 if ((err = dict2remove(f->f_globals, w)) != 0)
1007 err_setstr(NameError, getstringvalue(w));
1008 break;
1009
Guido van Rossum374a9221991-04-04 10:40:29 +00001010 case LOAD_CONST:
1011 x = GETCONST(oparg);
1012 INCREF(x);
1013 PUSH(x);
1014 break;
1015
1016 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001017 w = GETNAMEV(oparg);
1018 x = dict2lookup(f->f_locals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001019 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001020 err_clear();
1021 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001022 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001023 err_clear();
1024 x = getbuiltin(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001025 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001026 err_setstr(NameError,
1027 getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +00001028 break;
1029 }
1030 }
1031 }
Guido van Rossum25831651993-05-19 14:50:45 +00001032 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001033 x = getaccessvalue(x, f->f_globals /* XXX */);
Guido van Rossum25831651993-05-19 14:50:45 +00001034 if (x == NULL)
1035 break;
1036 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001037 else
1038 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001039 PUSH(x);
1040 break;
1041
1042 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001043 w = GETNAMEV(oparg);
1044 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001045 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001046 err_clear();
1047 x = getbuiltin(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001048 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001049 err_setstr(NameError,
1050 getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +00001051 break;
1052 }
1053 }
Guido van Rossum25831651993-05-19 14:50:45 +00001054 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001055 x = getaccessvalue(x, f->f_globals);
Guido van Rossum25831651993-05-19 14:50:45 +00001056 if (x == NULL)
1057 break;
1058 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001059 else
1060 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001061 PUSH(x);
1062 break;
1063
1064 case LOAD_LOCAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001065 w = GETNAMEV(oparg);
1066 x = dict2lookup(f->f_locals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001067 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001068 err_setstr(NameError, getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +00001069 break;
1070 }
Guido van Rossum25831651993-05-19 14:50:45 +00001071 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001072 x = getaccessvalue(x, f->f_locals);
Guido van Rossum25831651993-05-19 14:50:45 +00001073 if (x == NULL)
1074 break;
1075 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001076 else
1077 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001078 PUSH(x);
1079 break;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001080
1081 case RESERVE_FAST:
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001082 x = GETCONST(oparg);
1083 if (x == None)
1084 break;
1085 if (x == NULL || !is_dictobject(x)) {
1086 fatal("bad RESERVE_FAST");
1087 err_setstr(SystemError, "bad RESERVE_FAST");
1088 x = NULL;
1089 break;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001090 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001091 XDECREF(f->f_fastlocals);
1092 XDECREF(f->f_localmap);
1093 INCREF(x);
1094 f->f_localmap = x;
1095 f->f_fastlocals = x = newlistobject(
1096 x->ob_type->tp_as_mapping->mp_length(x));
1097 fastlocals = (listobject *) x;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001098 break;
1099
1100 case LOAD_FAST:
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001101 x = GETLISTITEM(fastlocals, oparg);
1102 if (x == NULL) {
1103 err_setstr(NameError,
1104 "undefined local variable");
1105 break;
1106 }
Guido van Rossum25831651993-05-19 14:50:45 +00001107 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001108 x = getaccessvalue(x, f->f_locals);
Guido van Rossum25831651993-05-19 14:50:45 +00001109 if (x == NULL)
1110 break;
1111 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001112 else
1113 INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001114 PUSH(x);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001115 break;
1116
1117 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001118 v = POP();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001119 w = GETLISTITEM(fastlocals, oparg);
Guido van Rossum25831651993-05-19 14:50:45 +00001120 if (w != NULL && is_accessobject(w)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001121 err = setaccessvalue(w, f->f_locals, v);
Guido van Rossum25831651993-05-19 14:50:45 +00001122 DECREF(v);
1123 break;
1124 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001125 XDECREF(w);
Guido van Rossum25831651993-05-19 14:50:45 +00001126 GETLISTITEM(fastlocals, oparg) = v;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001127 break;
1128
1129 case DELETE_FAST:
1130 x = GETLISTITEM(fastlocals, oparg);
1131 if (x == NULL) {
1132 err_setstr(NameError,
1133 "undefined local variable");
1134 break;
1135 }
Guido van Rossum25831651993-05-19 14:50:45 +00001136 if (w != NULL && is_accessobject(w)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001137 err = setaccessvalue(w, f->f_locals,
1138 (object *)NULL);
Guido van Rossum25831651993-05-19 14:50:45 +00001139 break;
1140 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001141 DECREF(x);
1142 GETLISTITEM(fastlocals, oparg) = NULL;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001143 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001144
1145 case BUILD_TUPLE:
1146 x = newtupleobject(oparg);
1147 if (x != NULL) {
1148 for (; --oparg >= 0;) {
1149 w = POP();
1150 err = settupleitem(x, oparg, w);
1151 if (err != 0)
1152 break;
1153 }
1154 PUSH(x);
1155 }
1156 break;
1157
1158 case BUILD_LIST:
1159 x = newlistobject(oparg);
1160 if (x != NULL) {
1161 for (; --oparg >= 0;) {
1162 w = POP();
1163 err = setlistitem(x, oparg, w);
1164 if (err != 0)
1165 break;
1166 }
1167 PUSH(x);
1168 }
1169 break;
1170
1171 case BUILD_MAP:
1172 x = newdictobject();
1173 PUSH(x);
1174 break;
1175
1176 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001177 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001178 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001179 x = getattro(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001180 DECREF(v);
1181 PUSH(x);
1182 break;
1183
1184 case COMPARE_OP:
1185 w = POP();
1186 v = POP();
Guido van Rossum5b7313a1992-04-06 13:24:57 +00001187 x = cmp_outcome(oparg, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001188 DECREF(v);
1189 DECREF(w);
1190 PUSH(x);
1191 break;
1192
1193 case IMPORT_NAME:
1194 name = GETNAME(oparg);
1195 x = import_module(name);
1196 XINCREF(x);
1197 PUSH(x);
1198 break;
1199
1200 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001201 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001202 v = TOP();
Guido van Rossumdf62e441991-08-16 08:56:04 +00001203 err = import_from(f->f_locals, v, w);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001204 locals_2_fast(f, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001205 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001206
1207 case ACCESS_MODE:
1208 v = POP();
1209 w = GETNAMEV(oparg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00001210 if (getstringvalue(w)[0] == '*')
1211 defmode = getintvalue(v);
1212 else
1213 err = access_statement(w, v, f);
Guido van Rossum25831651993-05-19 14:50:45 +00001214 DECREF(v);
1215 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001216
1217 case JUMP_FORWARD:
1218 JUMPBY(oparg);
1219 break;
1220
1221 case JUMP_IF_FALSE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001222 err = testbool(TOP());
1223 if (err > 0)
1224 err = 0;
1225 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001226 JUMPBY(oparg);
1227 break;
1228
1229 case JUMP_IF_TRUE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001230 err = testbool(TOP());
1231 if (err > 0) {
1232 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001233 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001234 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001235 break;
1236
1237 case JUMP_ABSOLUTE:
1238 JUMPTO(oparg);
1239 break;
1240
1241 case FOR_LOOP:
1242 /* for v in s: ...
1243 On entry: stack contains s, i.
1244 On exit: stack contains s, i+1, s[i];
1245 but if loop exhausted:
1246 s, i are popped, and we jump */
1247 w = POP(); /* Loop index */
1248 v = POP(); /* Sequence object */
1249 u = loop_subscript(v, w);
1250 if (u != NULL) {
1251 PUSH(v);
1252 x = newintobject(getintvalue(w)+1);
1253 PUSH(x);
1254 DECREF(w);
1255 PUSH(u);
1256 }
1257 else {
1258 DECREF(v);
1259 DECREF(w);
1260 /* A NULL can mean "s exhausted"
1261 but also an error: */
1262 if (err_occurred())
1263 why = WHY_EXCEPTION;
1264 else
1265 JUMPBY(oparg);
1266 }
1267 break;
1268
1269 case SETUP_LOOP:
1270 case SETUP_EXCEPT:
1271 case SETUP_FINALLY:
1272 setup_block(f, opcode, INSTR_OFFSET() + oparg,
1273 STACK_LEVEL());
1274 break;
1275
1276 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001277#ifdef LLTRACE
1278 if (lltrace)
Guido van Rossum374a9221991-04-04 10:40:29 +00001279 printf("--- Line %d ---\n", oparg);
1280#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001281 f->f_lineno = oparg;
1282 if (trace != NULL) {
1283 /* Trace each line of code reached */
1284 f->f_lasti = INSTR_OFFSET();
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001285 err = call_trace(&trace, &trace,
1286 f, "line", None);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001287 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001288 break;
1289
1290 default:
1291 fprintf(stderr,
1292 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001293 f->f_lineno, opcode);
Guido van Rossum374a9221991-04-04 10:40:29 +00001294 err_setstr(SystemError, "eval_code: unknown opcode");
1295 why = WHY_EXCEPTION;
1296 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001297
1298#ifdef CASE_TOO_BIG
1299 }
1300#endif
1301
Guido van Rossum374a9221991-04-04 10:40:29 +00001302 } /* switch */
1303
1304 on_error:
1305
1306 /* Quickly continue if no error occurred */
1307
1308 if (why == WHY_NOT) {
1309 if (err == 0 && x != NULL)
1310 continue; /* Normal, fast path */
1311 why = WHY_EXCEPTION;
1312 x = None;
1313 err = 0;
1314 }
1315
Guido van Rossum801dcae1992-04-08 11:32:32 +00001316#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001317 /* Double-check exception status */
1318
1319 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
1320 if (!err_occurred()) {
1321 fprintf(stderr, "XXX ghost error\n");
1322 err_setstr(SystemError, "ghost error");
1323 why = WHY_EXCEPTION;
1324 }
1325 }
1326 else {
1327 if (err_occurred()) {
1328 fprintf(stderr, "XXX undetected error\n");
Guido van Rossum99bec951992-09-03 20:29:45 +00001329 abort();
1330 /* NOTREACHED */
Guido van Rossum374a9221991-04-04 10:40:29 +00001331 why = WHY_EXCEPTION;
1332 }
1333 }
1334#endif
1335
1336 /* Log traceback info if this is a real exception */
1337
1338 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001339 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001340 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001341 f->f_lasti -= 2;
1342 tb_here(f);
1343
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001344 if (trace)
1345 call_exc_trace(&trace, &trace, f);
1346 if (sys_profile)
1347 call_exc_trace(&sys_profile, (object**)0, f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001348 }
1349
1350 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1351
1352 if (why == WHY_RERAISE)
1353 why = WHY_EXCEPTION;
1354
1355 /* Unwind stacks if a (pseudo) exception occurred */
1356
1357 while (why != WHY_NOT && f->f_iblock > 0) {
1358 block *b = pop_block(f);
1359 while (STACK_LEVEL() > b->b_level) {
1360 v = POP();
1361 XDECREF(v);
1362 }
1363 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1364 why = WHY_NOT;
1365 JUMPTO(b->b_handler);
1366 break;
1367 }
1368 if (b->b_type == SETUP_FINALLY ||
1369 b->b_type == SETUP_EXCEPT &&
1370 why == WHY_EXCEPTION) {
1371 if (why == WHY_EXCEPTION) {
1372 object *exc, *val;
1373 err_get(&exc, &val);
1374 if (val == NULL) {
1375 val = None;
1376 INCREF(val);
1377 }
1378 v = tb_fetch();
1379 /* Make the raw exception data
1380 available to the handler,
1381 so a program can emulate the
1382 Python main loop. Don't do
1383 this for 'finally'. */
1384 if (b->b_type == SETUP_EXCEPT) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001385 sysset("exc_traceback", v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001386 sysset("exc_value", val);
1387 sysset("exc_type", exc);
Guido van Rossum374a9221991-04-04 10:40:29 +00001388 }
1389 PUSH(v);
1390 PUSH(val);
1391 PUSH(exc);
1392 }
1393 else {
1394 if (why == WHY_RETURN)
1395 PUSH(retval);
1396 v = newintobject((long)why);
1397 PUSH(v);
1398 }
1399 why = WHY_NOT;
1400 JUMPTO(b->b_handler);
1401 break;
1402 }
1403 } /* unwind stack */
1404
1405 /* End the loop if we still have an error (or return) */
1406
1407 if (why != WHY_NOT)
1408 break;
1409
1410 } /* main loop */
1411
1412 /* Pop remaining stack entries */
1413
1414 while (!EMPTY()) {
1415 v = POP();
1416 XDECREF(v);
1417 }
1418
Guido van Rossum96a42c81992-01-12 02:29:51 +00001419 if (why != WHY_RETURN)
1420 retval = NULL;
1421
1422 if (trace) {
1423 if (why == WHY_RETURN) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001424 if (call_trace(&trace, &trace, f, "return", retval)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001425 XDECREF(retval);
1426 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001427 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001428 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001429 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001430 XDECREF(trace);
1431 }
1432
1433 if (sys_profile && why == WHY_RETURN) {
1434 if (call_trace(&sys_profile, (object**)0,
1435 f, "return", retval)) {
1436 XDECREF(retval);
1437 retval = NULL;
1438 why = WHY_EXCEPTION;
1439 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001440 }
Guido van Rossum5b722181993-03-30 17:46:03 +00001441
1442 if (fastlocals && (f->ob_refcnt > 1 || f->f_locals->ob_refcnt > 2))
1443 fast_2_locals(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001444
Guido van Rossum374a9221991-04-04 10:40:29 +00001445 /* Restore previous frame and release the current one */
1446
1447 current_frame = f->f_back;
1448 DECREF(f);
Guido van Rossum5b722181993-03-30 17:46:03 +00001449
1450 if (needmerge)
1451 locals_2_fast(current_frame, 1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001452
Guido van Rossum96a42c81992-01-12 02:29:51 +00001453 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001454}
1455
Guido van Rossum96a42c81992-01-12 02:29:51 +00001456#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00001457static int
1458prtrace(v, str)
1459 object *v;
1460 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001461{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001462 printf("%s ", str);
Guido van Rossum90933611991-06-07 16:10:43 +00001463 if (printobject(v, stdout, 0) != 0)
1464 err_clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001465 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001466}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001467#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001468
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001469static void
1470call_exc_trace(p_trace, p_newtrace, f)
1471 object **p_trace, **p_newtrace;
1472 frameobject *f;
1473{
1474 object *type, *value, *traceback, *arg;
1475 int err;
1476 err_get(&type, &value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00001477 if (value == NULL) {
1478 value = None;
1479 INCREF(value);
1480 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001481 traceback = tb_fetch();
1482 arg = newtupleobject(3);
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001483 if (arg == NULL)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001484 goto cleanup;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001485 settupleitem(arg, 0, type);
1486 settupleitem(arg, 1, value);
1487 settupleitem(arg, 2, traceback);
1488 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001489 if (!err) {
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001490 cleanup:
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001491 /* Restore original exception */
1492 err_setval(type, value);
1493 tb_store(traceback);
1494 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001495 XDECREF(arg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001496}
1497
1498static int
1499call_trace(p_trace, p_newtrace, f, msg, arg)
1500 object **p_trace; /* in/out; may not be NULL;
1501 may not point to NULL variable initially */
1502 object **p_newtrace; /* in/out; may be NULL;
1503 may point to NULL variable;
1504 may be same variable as p_newtrace */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001505 frameobject *f;
1506 char *msg;
1507 object *arg;
1508{
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001509 object *arglist, *what;
1510 object *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001511 static int tracing = 0;
1512
1513 if (tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001514 /* Don't do recursive traces */
1515 if (p_newtrace) {
1516 XDECREF(*p_newtrace);
1517 *p_newtrace = NULL;
1518 }
1519 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001520 }
1521
1522 arglist = newtupleobject(3);
1523 if (arglist == NULL)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001524 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001525 what = newstringobject(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001526 if (what == NULL)
1527 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001528 INCREF(f);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001529 settupleitem(arglist, 0, (object *)f);
1530 settupleitem(arglist, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001531 if (arg == NULL)
1532 arg = None;
1533 INCREF(arg);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001534 settupleitem(arglist, 2, arg);
1535 tracing++;
Guido van Rossum5b722181993-03-30 17:46:03 +00001536 fast_2_locals(f);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001537 res = call_object(*p_trace, arglist);
Guido van Rossum5b722181993-03-30 17:46:03 +00001538 locals_2_fast(f, 1);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001539 tracing--;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001540 cleanup:
1541 XDECREF(arglist);
1542 if (res == NULL) {
1543 /* The trace proc raised an exception */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001544 tb_here(f);
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001545 DECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001546 *p_trace = NULL;
1547 if (p_newtrace) {
1548 XDECREF(*p_newtrace);
1549 *p_newtrace = NULL;
1550 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001551 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001552 }
1553 else {
1554 if (p_newtrace) {
1555 XDECREF(*p_newtrace);
1556 if (res == None)
1557 *p_newtrace = NULL;
1558 else {
1559 INCREF(res);
1560 *p_newtrace = res;
1561 }
1562 }
1563 DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001564 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001565 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001566}
1567
Guido van Rossum5b722181993-03-30 17:46:03 +00001568static void
1569fast_2_locals(f)
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001570 frameobject *f;
Guido van Rossum5b722181993-03-30 17:46:03 +00001571{
1572 /* Merge f->f_fastlocals into f->f_locals */
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001573 object *locals, *fast, *map;
Guido van Rossum5b722181993-03-30 17:46:03 +00001574 object *error_type, *error_value;
Guido van Rossum25831651993-05-19 14:50:45 +00001575 int pos;
1576 object *key, *value;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001577 if (f == NULL)
Guido van Rossum5b722181993-03-30 17:46:03 +00001578 return;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001579 locals = f->f_locals;
1580 fast = f->f_fastlocals;
1581 map = f->f_localmap;
1582 if (locals == NULL || fast == NULL || map == NULL)
Guido van Rossum5b722181993-03-30 17:46:03 +00001583 return;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001584 if (!is_dictobject(locals) || !is_listobject(fast) ||
1585 !is_dictobject(map))
Guido van Rossum5b722181993-03-30 17:46:03 +00001586 return;
1587 err_get(&error_type, &error_value);
Guido van Rossum25831651993-05-19 14:50:45 +00001588 pos = 0;
1589 while (mappinggetnext(map, &pos, &key, &value)) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001590 int j;
Guido van Rossum25831651993-05-19 14:50:45 +00001591 if (!is_intobject(value))
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001592 continue;
1593 j = getintvalue(value);
1594 value = getlistitem(fast, j);
1595 if (value == NULL) {
1596 err_clear();
1597 if (dict2remove(locals, key) != 0)
1598 err_clear();
1599 }
1600 else {
1601 if (dict2insert(locals, key, value) != 0)
1602 err_clear();
1603 }
1604 }
Guido van Rossum5b722181993-03-30 17:46:03 +00001605 err_setval(error_type, error_value);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001606}
1607
1608static void
1609locals_2_fast(f, clear)
1610 frameobject *f;
1611 int clear;
1612{
1613 /* Merge f->f_locals into f->f_fastlocals */
1614 object *locals, *fast, *map;
Guido van Rossumacbe8da1993-04-15 15:33:52 +00001615 object *error_type, *error_value;
Guido van Rossum25831651993-05-19 14:50:45 +00001616 int pos;
1617 object *key, *value;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001618 if (f == NULL)
1619 return;
1620 locals = f->f_locals;
1621 fast = f->f_fastlocals;
1622 map = f->f_localmap;
1623 if (locals == NULL || fast == NULL || map == NULL)
1624 return;
1625 if (!is_dictobject(locals) || !is_listobject(fast) ||
1626 !is_dictobject(map))
1627 return;
Guido van Rossumacbe8da1993-04-15 15:33:52 +00001628 err_get(&error_type, &error_value);
Guido van Rossum25831651993-05-19 14:50:45 +00001629 pos = 0;
1630 while (mappinggetnext(map, &pos, &key, &value)) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001631 int j;
Guido van Rossum25831651993-05-19 14:50:45 +00001632 if (!is_intobject(value))
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001633 continue;
1634 j = getintvalue(value);
1635 value = dict2lookup(locals, key);
1636 if (value == NULL)
1637 err_clear();
1638 else
1639 INCREF(value);
1640 if (value != NULL || clear)
1641 if (setlistitem(fast, j, value) != 0)
1642 err_clear();
1643 }
Guido van Rossumacbe8da1993-04-15 15:33:52 +00001644 err_setval(error_type, error_value);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001645}
1646
1647void
1648mergelocals()
1649{
1650 locals_2_fast(current_frame, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001651}
1652
1653object *
Guido van Rossum5b722181993-03-30 17:46:03 +00001654getlocals()
1655{
1656 if (current_frame == NULL)
1657 return NULL;
1658 fast_2_locals(current_frame);
1659 return current_frame->f_locals;
1660}
1661
1662object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001663getglobals()
1664{
1665 if (current_frame == NULL)
1666 return NULL;
1667 else
1668 return current_frame->f_globals;
1669}
1670
Guido van Rossum81daa321993-05-20 14:24:46 +00001671object *
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001672getowner()
Guido van Rossum81daa321993-05-20 14:24:46 +00001673{
1674 if (current_frame == NULL)
1675 return NULL;
1676 else
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001677 return current_frame->f_owner;
Guido van Rossum81daa321993-05-20 14:24:46 +00001678}
1679
Guido van Rossum3f5da241990-12-20 15:06:42 +00001680void
Guido van Rossum3165fe61992-09-25 21:59:05 +00001681printtraceback(f)
1682 object *f;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001683{
1684 object *v = tb_fetch();
1685 if (v != NULL) {
Guido van Rossum3165fe61992-09-25 21:59:05 +00001686 writestring("Stack backtrace (innermost last):\n", f);
1687 tb_print(v, f);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001688 DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001689 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001690}
1691
1692
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001693void
1694flushline()
1695{
Guido van Rossum3165fe61992-09-25 21:59:05 +00001696 object *f = sysget("stdout");
1697 if (softspace(f, 0))
1698 writestring("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001699}
1700
Guido van Rossum3f5da241990-12-20 15:06:42 +00001701
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001702static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001703or(v, w)
1704 object *v, *w;
1705{
1706 if (v->ob_type->tp_as_number != NULL) {
1707 object *x;
1708 object * (*f) FPROTO((object *, object *));
1709 if (coerce(&v, &w) != 0)
1710 return NULL;
1711 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
1712 x = (*f)(v, w);
1713 DECREF(v);
1714 DECREF(w);
1715 if (f != NULL)
1716 return x;
1717 }
1718 err_setstr(TypeError, "bad operand type(s) for |");
1719 return NULL;
1720}
1721
1722static object *
1723xor(v, w)
1724 object *v, *w;
1725{
1726 if (v->ob_type->tp_as_number != NULL) {
1727 object *x;
1728 object * (*f) FPROTO((object *, object *));
1729 if (coerce(&v, &w) != 0)
1730 return NULL;
1731 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
1732 x = (*f)(v, w);
1733 DECREF(v);
1734 DECREF(w);
1735 if (f != NULL)
1736 return x;
1737 }
1738 err_setstr(TypeError, "bad operand type(s) for ^");
1739 return NULL;
1740}
1741
1742static object *
1743and(v, w)
1744 object *v, *w;
1745{
1746 if (v->ob_type->tp_as_number != NULL) {
1747 object *x;
1748 object * (*f) FPROTO((object *, object *));
1749 if (coerce(&v, &w) != 0)
1750 return NULL;
1751 if ((f = v->ob_type->tp_as_number->nb_and) != NULL)
1752 x = (*f)(v, w);
1753 DECREF(v);
1754 DECREF(w);
1755 if (f != NULL)
1756 return x;
1757 }
1758 err_setstr(TypeError, "bad operand type(s) for &");
1759 return NULL;
1760}
1761
1762static object *
1763lshift(v, w)
1764 object *v, *w;
1765{
1766 if (v->ob_type->tp_as_number != NULL) {
1767 object *x;
1768 object * (*f) FPROTO((object *, object *));
1769 if (coerce(&v, &w) != 0)
1770 return NULL;
1771 if ((f = v->ob_type->tp_as_number->nb_lshift) != NULL)
1772 x = (*f)(v, w);
1773 DECREF(v);
1774 DECREF(w);
1775 if (f != NULL)
1776 return x;
1777 }
1778 err_setstr(TypeError, "bad operand type(s) for <<");
1779 return NULL;
1780}
1781
1782static object *
1783rshift(v, w)
1784 object *v, *w;
1785{
1786 if (v->ob_type->tp_as_number != NULL) {
1787 object *x;
1788 object * (*f) FPROTO((object *, object *));
1789 if (coerce(&v, &w) != 0)
1790 return NULL;
1791 if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
1792 x = (*f)(v, w);
1793 DECREF(v);
1794 DECREF(w);
1795 if (f != NULL)
1796 return x;
1797 }
1798 err_setstr(TypeError, "bad operand type(s) for >>");
1799 return NULL;
1800}
1801
1802static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001803add(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001804 object *v, *w;
1805{
Guido van Rossume6eefc21992-08-14 12:06:52 +00001806 if (v->ob_type->tp_as_sequence != NULL)
1807 return (*v->ob_type->tp_as_sequence->sq_concat)(v, w);
1808 else if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001809 object *x;
1810 if (coerce(&v, &w) != 0)
1811 return NULL;
1812 x = (*v->ob_type->tp_as_number->nb_add)(v, w);
1813 DECREF(v);
1814 DECREF(w);
1815 return x;
1816 }
Guido van Rossum34679b71993-01-26 13:33:44 +00001817 err_setstr(TypeError, "bad operand type(s) for +");
1818 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001819}
1820
1821static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001822sub(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001823 object *v, *w;
1824{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001825 if (v->ob_type->tp_as_number != NULL) {
1826 object *x;
1827 if (coerce(&v, &w) != 0)
1828 return NULL;
1829 x = (*v->ob_type->tp_as_number->nb_subtract)(v, w);
1830 DECREF(v);
1831 DECREF(w);
1832 return x;
1833 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001834 err_setstr(TypeError, "bad operand type(s) for -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001835 return NULL;
1836}
1837
1838static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001839mul(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001840 object *v, *w;
1841{
1842 typeobject *tp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001843 tp = v->ob_type;
1844 if (tp->tp_as_number != NULL &&
1845 w->ob_type->tp_as_sequence != NULL &&
1846 !is_instanceobject(v)) {
1847 /* number*sequence -- swap v and w */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001848 object *tmp = v;
1849 v = w;
1850 w = tmp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001851 tp = v->ob_type;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001852 }
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001853 if (tp->tp_as_number != NULL) {
1854 object *x;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001855 if (is_instanceobject(v)) {
1856 /* Instances of user-defined classes get their
1857 other argument uncoerced, so they may
1858 implement sequence*number as well as
1859 number*number. */
1860 INCREF(v);
1861 INCREF(w);
1862 }
1863 else if (coerce(&v, &w) != 0)
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001864 return NULL;
1865 x = (*v->ob_type->tp_as_number->nb_multiply)(v, w);
1866 DECREF(v);
1867 DECREF(w);
1868 return x;
1869 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001870 if (tp->tp_as_sequence != NULL) {
1871 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001872 err_setstr(TypeError,
1873 "can't multiply sequence with non-int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001874 return NULL;
1875 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001876 return (*tp->tp_as_sequence->sq_repeat)
1877 (v, (int)getintvalue(w));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001878 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001879 err_setstr(TypeError, "bad operand type(s) for *");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001880 return NULL;
1881}
1882
1883static object *
Guido van Rossum40d0b7e1990-12-20 23:03:11 +00001884divide(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001885 object *v, *w;
1886{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001887 if (v->ob_type->tp_as_number != NULL) {
1888 object *x;
1889 if (coerce(&v, &w) != 0)
1890 return NULL;
1891 x = (*v->ob_type->tp_as_number->nb_divide)(v, w);
1892 DECREF(v);
1893 DECREF(w);
1894 return x;
1895 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001896 err_setstr(TypeError, "bad operand type(s) for /");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001897 return NULL;
1898}
1899
1900static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001901rem(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001902 object *v, *w;
1903{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001904 if (v->ob_type->tp_as_number != NULL) {
1905 object *x;
1906 if (coerce(&v, &w) != 0)
1907 return NULL;
1908 x = (*v->ob_type->tp_as_number->nb_remainder)(v, w);
1909 DECREF(v);
1910 DECREF(w);
1911 return x;
1912 }
Guido van Rossume5372401993-03-16 12:15:04 +00001913 if (is_stringobject(v)) {
1914 return formatstring(v, w);
1915 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001916 err_setstr(TypeError, "bad operand type(s) for %");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001917 return NULL;
1918}
1919
1920static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001921neg(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001922 object *v;
1923{
1924 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001925 return (*v->ob_type->tp_as_number->nb_negative)(v);
1926 err_setstr(TypeError, "bad operand type(s) for unary -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001927 return NULL;
1928}
1929
1930static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001931pos(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001932 object *v;
1933{
1934 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001935 return (*v->ob_type->tp_as_number->nb_positive)(v);
1936 err_setstr(TypeError, "bad operand type(s) for unary +");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001937 return NULL;
1938}
1939
1940static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001941invert(v)
1942 object *v;
1943{
Guido van Rossum9b1d33b1992-02-11 15:56:02 +00001944 object * (*f) FPROTO((object *));
Guido van Rossum7928cd71991-10-24 14:59:31 +00001945 if (v->ob_type->tp_as_number != NULL &&
1946 (f = v->ob_type->tp_as_number->nb_invert) != NULL)
1947 return (*f)(v);
1948 err_setstr(TypeError, "bad operand type(s) for unary ~");
1949 return NULL;
1950}
1951
1952static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001953not(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001954 object *v;
1955{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001956 int outcome = testbool(v);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001957 object *w;
1958 if (outcome < 0)
1959 return NULL;
1960 if (outcome == 0)
1961 w = True;
1962 else
1963 w = False;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001964 INCREF(w);
1965 return w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001966}
Guido van Rossum234f9421993-06-17 12:35:49 +00001967
1968
Guido van Rossum83bf35c1991-07-27 21:32:34 +00001969/* External interface to call any callable object. The arg may be NULL. */
1970
1971object *
1972call_object(func, arg)
1973 object *func;
1974 object *arg;
1975{
1976 if (is_instancemethodobject(func) || is_funcobject(func))
1977 return call_function(func, arg);
1978 else
1979 return call_builtin(func, arg);
1980}
1981
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001982static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001983call_builtin(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001984 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001985 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001986{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001987 if (is_methodobject(func)) {
1988 method meth = getmethod(func);
1989 object *self = getself(func);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001990 if (!getvarargs(func) && arg != NULL && is_tupleobject(arg)) {
1991 int size = gettuplesize(arg);
1992 if (size == 1)
1993 arg = gettupleitem(arg, 0);
1994 else if (size == 0)
1995 arg = NULL;
1996 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001997 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001998 }
1999 if (is_classobject(func)) {
Guido van Rossum25831651993-05-19 14:50:45 +00002000 return newinstanceobject(func, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002001 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002002 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002003 return NULL;
2004}
2005
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002006static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002007call_function(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002008 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002009 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002010{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002011 object *newarg = NULL;
2012 object *newlocals, *newglobals;
Guido van Rossum81daa321993-05-20 14:24:46 +00002013 object *class = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002014 object *co, *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002015
Guido van Rossume8122f11991-05-05 20:03:07 +00002016 if (is_instancemethodobject(func)) {
2017 object *self = instancemethodgetself(func);
Guido van Rossum81daa321993-05-20 14:24:46 +00002018 class = instancemethodgetclass(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00002019 func = instancemethodgetfunc(func);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002020 if (self == NULL) {
2021 /* Unbound methods must be called with an instance of
2022 the class (or a derived class) as first argument */
2023 if (arg != NULL && is_tupleobject(arg) &&
2024 gettuplesize(arg) >= 1) {
2025 self = gettupleitem(arg, 0);
2026 if (self != NULL &&
2027 is_instanceobject(self) &&
2028 issubclass((object *)
2029 (((instanceobject *)self)->in_class),
2030 class))
2031 /* self = self */ ;
2032 else
2033 self = NULL;
2034 }
2035 if (self == NULL) {
2036 err_setstr(TypeError,
2037 "unbound method must be called with class instance argument");
2038 return NULL;
2039 }
2040 }
2041 else {
Guido van Rossum81daa321993-05-20 14:24:46 +00002042 int argcount;
2043 if (arg == NULL)
2044 argcount = 0;
2045 else if (is_tupleobject(arg))
2046 argcount = gettuplesize(arg);
2047 else
2048 argcount = 1;
2049 newarg = newtupleobject(argcount + 1);
2050 if (newarg == NULL)
2051 return NULL;
2052 INCREF(self);
2053 settupleitem(newarg, 0, self);
2054 if (arg != NULL && !is_tupleobject(arg)) {
2055 INCREF(arg);
2056 settupleitem(newarg, 1, arg);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002057 }
Guido van Rossum81daa321993-05-20 14:24:46 +00002058 else {
2059 int i;
2060 object *v;
2061 for (i = 0; i < argcount; i++) {
2062 v = gettupleitem(arg, i);
2063 XINCREF(v);
2064 settupleitem(newarg, i+1, v);
2065 }
2066 }
2067 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002068 }
2069 }
2070 else {
2071 if (!is_funcobject(func)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002072 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002073 return NULL;
2074 }
2075 }
2076
Guido van Rossum3f5da241990-12-20 15:06:42 +00002077 co = getfunccode(func);
2078 if (co == NULL) {
2079 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002080 return NULL;
2081 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002082 if (!is_codeobject(co)) {
2083 fprintf(stderr, "XXX Bad code\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002084 abort();
2085 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002086 newlocals = newdictobject();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002087 if (newlocals == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002088 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002089 return NULL;
2090 }
2091
Guido van Rossum3f5da241990-12-20 15:06:42 +00002092 newglobals = getfuncglobals(func);
2093 INCREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002094
Guido van Rossum81daa321993-05-20 14:24:46 +00002095 v = eval_code((codeobject *)co, newglobals, newlocals, class, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002096
Guido van Rossum3f5da241990-12-20 15:06:42 +00002097 DECREF(newlocals);
2098 DECREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002099
Guido van Rossum3f5da241990-12-20 15:06:42 +00002100 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002101
2102 return v;
2103}
2104
2105static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002106apply_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002107 object *v, *w;
2108{
2109 typeobject *tp = v->ob_type;
2110 if (tp->tp_as_sequence == NULL && tp->tp_as_mapping == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002111 err_setstr(TypeError, "unsubscriptable object");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002112 return NULL;
2113 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00002114 if (tp->tp_as_mapping != NULL) {
2115 return (*tp->tp_as_mapping->mp_subscript)(v, w);
2116 }
2117 else {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002118 int i;
2119 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002120 err_setstr(TypeError, "sequence subscript not int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002121 return NULL;
2122 }
2123 i = getintvalue(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002124 if (i < 0) {
2125 int len = (*tp->tp_as_sequence->sq_length)(v);
2126 if (len < 0)
2127 return NULL;
2128 i += len;
2129 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002130 return (*tp->tp_as_sequence->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002131 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002132}
2133
2134static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002135loop_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002136 object *v, *w;
2137{
2138 sequence_methods *sq = v->ob_type->tp_as_sequence;
2139 int i, n;
2140 if (sq == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002141 err_setstr(TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002142 return NULL;
2143 }
2144 i = getintvalue(w);
2145 n = (*sq->sq_length)(v);
Guido van Rossumd014ea61992-11-26 10:30:26 +00002146 if (n < 0)
2147 return NULL; /* Exception */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002148 if (i >= n)
2149 return NULL; /* End of loop */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002150 return (*sq->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002151}
2152
2153static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00002154slice_index(v, isize, pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002155 object *v;
2156 int isize;
2157 int *pi;
2158{
2159 if (v != NULL) {
2160 if (!is_intobject(v)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002161 err_setstr(TypeError, "slice index must be int");
2162 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002163 }
2164 *pi = getintvalue(v);
2165 if (*pi < 0)
2166 *pi += isize;
2167 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002168 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002169}
2170
2171static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002172apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002173 object *u, *v, *w;
2174{
2175 typeobject *tp = u->ob_type;
2176 int ilow, ihigh, isize;
2177 if (tp->tp_as_sequence == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002178 err_setstr(TypeError, "only sequences can be sliced");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002179 return NULL;
2180 }
2181 ilow = 0;
2182 isize = ihigh = (*tp->tp_as_sequence->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002183 if (isize < 0)
2184 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002185 if (slice_index(v, isize, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002186 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002187 if (slice_index(w, isize, &ihigh) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002188 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002189 return (*tp->tp_as_sequence->sq_slice)(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002190}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002191
2192static int
2193assign_subscript(w, key, v) /* w[key] = v */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002194 object *w;
2195 object *key;
2196 object *v;
2197{
2198 typeobject *tp = w->ob_type;
2199 sequence_methods *sq;
2200 mapping_methods *mp;
2201 int (*func)();
Guido van Rossum04691fc1992-08-12 15:35:34 +00002202 if ((mp = tp->tp_as_mapping) != NULL &&
2203 (func = mp->mp_ass_subscript) != NULL) {
2204 return (*func)(w, key, v);
2205 }
2206 else if ((sq = tp->tp_as_sequence) != NULL &&
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002207 (func = sq->sq_ass_item) != NULL) {
2208 if (!is_intobject(key)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002209 err_setstr(TypeError,
Guido van Rossum98256aa1991-12-24 13:25:19 +00002210 "sequence subscript must be integer (assign or del)");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002211 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002212 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00002213 else {
2214 int i = getintvalue(key);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002215 if (i < 0) {
2216 int len = (*sq->sq_length)(w);
2217 if (len < 0)
2218 return -1;
2219 i += len;
2220 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00002221 return (*func)(w, i, v);
2222 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002223 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002224 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002225 err_setstr(TypeError,
2226 "can't assign to this subscripted object");
2227 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002228 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002229}
2230
Guido van Rossum3f5da241990-12-20 15:06:42 +00002231static int
2232assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002233 object *u, *v, *w, *x;
2234{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002235 sequence_methods *sq = u->ob_type->tp_as_sequence;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002236 int ilow, ihigh, isize;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002237 if (sq == NULL) {
2238 err_setstr(TypeError, "assign to slice of non-sequence");
2239 return -1;
2240 }
2241 if (sq == NULL || sq->sq_ass_slice == NULL) {
2242 err_setstr(TypeError, "unassignable slice");
2243 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002244 }
2245 ilow = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002246 isize = ihigh = (*sq->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002247 if (isize < 0)
2248 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002249 if (slice_index(v, isize, &ilow) != 0)
2250 return -1;
2251 if (slice_index(w, isize, &ihigh) != 0)
2252 return -1;
2253 return (*sq->sq_ass_slice)(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002254}
2255
2256static int
2257cmp_exception(err, v)
2258 object *err, *v;
2259{
2260 if (is_tupleobject(v)) {
2261 int i, n;
2262 n = gettuplesize(v);
2263 for (i = 0; i < n; i++) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00002264 /* Test recursively */
2265 if (cmp_exception(err, gettupleitem(v, i)))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002266 return 1;
2267 }
2268 return 0;
2269 }
2270 return err == v;
2271}
2272
Guido van Rossum3f5da241990-12-20 15:06:42 +00002273static int
2274cmp_member(v, w)
2275 object *v, *w;
2276{
2277 int i, n, cmp;
2278 object *x;
2279 sequence_methods *sq;
2280 /* Special case for char in string */
2281 if (is_stringobject(w)) {
2282 register char *s, *end;
2283 register char c;
2284 if (!is_stringobject(v) || getstringsize(v) != 1) {
2285 err_setstr(TypeError,
2286 "string member test needs char left operand");
2287 return -1;
2288 }
2289 c = getstringvalue(v)[0];
2290 s = getstringvalue(w);
2291 end = s + getstringsize(w);
2292 while (s < end) {
2293 if (c == *s++)
2294 return 1;
2295 }
2296 return 0;
2297 }
2298 sq = w->ob_type->tp_as_sequence;
2299 if (sq == NULL) {
2300 err_setstr(TypeError,
2301 "'in' or 'not in' needs sequence right argument");
2302 return -1;
2303 }
2304 n = (*sq->sq_length)(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002305 if (n < 0)
2306 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002307 for (i = 0; i < n; i++) {
2308 x = (*sq->sq_item)(w, i);
2309 cmp = cmpobject(v, x);
2310 XDECREF(x);
2311 if (cmp == 0)
2312 return 1;
2313 }
2314 return 0;
2315}
2316
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002317static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002318cmp_outcome(op, v, w)
Guido van Rossum5b7313a1992-04-06 13:24:57 +00002319 int op;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002320 register object *v;
2321 register object *w;
2322{
2323 register int cmp;
2324 register int res = 0;
2325 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002326 case IS:
2327 case IS_NOT:
2328 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002329 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002330 res = !res;
2331 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002332 case IN:
2333 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002334 res = cmp_member(v, w);
2335 if (res < 0)
2336 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002337 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002338 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002339 break;
2340 case EXC_MATCH:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002341 res = cmp_exception(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002342 break;
2343 default:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002344 cmp = cmpobject(v, w);
2345 switch (op) {
2346 case LT: res = cmp < 0; break;
2347 case LE: res = cmp <= 0; break;
2348 case EQ: res = cmp == 0; break;
2349 case NE: res = cmp != 0; break;
2350 case GT: res = cmp > 0; break;
2351 case GE: res = cmp >= 0; break;
2352 /* XXX no default? (res is initialized to 0 though) */
2353 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002354 }
2355 v = res ? True : False;
2356 INCREF(v);
2357 return v;
2358}
2359
Guido van Rossum3f5da241990-12-20 15:06:42 +00002360static int
2361import_from(locals, v, name)
2362 object *locals;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002363 object *v;
Guido van Rossumdf62e441991-08-16 08:56:04 +00002364 object *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002365{
2366 object *w, *x;
2367 w = getmoduledict(v);
Guido van Rossumdf62e441991-08-16 08:56:04 +00002368 if (getstringvalue(name)[0] == '*') {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002369 int pos, err;
Guido van Rossum25831651993-05-19 14:50:45 +00002370 object *name, *value;
2371 pos = 0;
2372 while (mappinggetnext(w, &pos, &name, &value)) {
2373 if (!is_stringobject(name) ||
2374 getstringvalue(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002375 continue;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002376 if (is_accessobject(value)) {
2377 value = getaccessvalue(value, (object *)NULL);
2378 if (value == NULL) {
2379 err_clear();
2380 continue;
2381 }
2382 }
2383 else
2384 INCREF(value);
2385 err = dict2insert(locals, name, value);
2386 DECREF(value);
2387 if (err != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002388 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002389 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002390 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002391 }
2392 else {
Guido van Rossumdf62e441991-08-16 08:56:04 +00002393 x = dict2lookup(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002394 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00002395 char buf[250];
Guido van Rossum16dfd291992-02-05 11:17:30 +00002396 sprintf(buf, "cannot import name %.230s",
Guido van Rossum98256aa1991-12-24 13:25:19 +00002397 getstringvalue(name));
2398 err_setstr(ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002399 return -1;
2400 }
2401 else
Guido van Rossumdf62e441991-08-16 08:56:04 +00002402 return dict2insert(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002403 }
2404}
2405
2406static object *
Guido van Rossum25831651993-05-19 14:50:45 +00002407build_class(methods, bases, name)
2408 object *methods; /* dictionary */
2409 object *bases; /* tuple containing classes */
2410 object *name; /* string */
Guido van Rossume9736fc1990-11-18 17:33:06 +00002411{
Guido van Rossum25831651993-05-19 14:50:45 +00002412 int i;
2413 if (!is_tupleobject(bases)) {
2414 err_setstr(SystemError, "build_class with non-tuple bases");
2415 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002416 }
Guido van Rossum25831651993-05-19 14:50:45 +00002417 if (!is_dictobject(methods)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002418 err_setstr(SystemError, "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002419 return NULL;
2420 }
Guido van Rossum25831651993-05-19 14:50:45 +00002421 if (!is_stringobject(name)) {
2422 err_setstr(SystemError, "build_class witn non-string name");
2423 return NULL;
2424 }
2425 for (i = gettuplesize(bases); --i >= 0; ) {
2426 object *base = gettupleitem(bases, i);
2427 if (!is_classobject(base)) {
2428 err_setstr(TypeError,
2429 "base is not a class object");
2430 return NULL;
2431 }
2432 }
2433 return newclassobject(bases, methods, name);
2434}
2435
2436static int
Guido van Rossumb3f72581993-05-21 19:56:10 +00002437access_statement(name, vmode, f)
Guido van Rossum25831651993-05-19 14:50:45 +00002438 object *name;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002439 object *vmode;
Guido van Rossum25831651993-05-19 14:50:45 +00002440 frameobject *f;
2441{
Guido van Rossumb3f72581993-05-21 19:56:10 +00002442 int mode = getintvalue(vmode);
Guido van Rossum81daa321993-05-20 14:24:46 +00002443 object *value, *ac;
2444 typeobject *type;
2445 int fastind, ret;
2446 fastind = -1;
Guido van Rossum25831651993-05-19 14:50:45 +00002447 if (f->f_localmap == NULL)
2448 value = dict2lookup(f->f_locals, name);
2449 else {
2450 value = dict2lookup(f->f_localmap, name);
2451 if (value == NULL || !is_intobject(value))
2452 value = NULL;
2453 else {
Guido van Rossum81daa321993-05-20 14:24:46 +00002454 fastind = getintvalue(value);
2455 if (0 <= fastind &&
2456 fastind < getlistsize(f->f_fastlocals))
2457 value = getlistitem(f->f_fastlocals, fastind);
Guido van Rossum25831651993-05-19 14:50:45 +00002458 else {
2459 value = NULL;
Guido van Rossum81daa321993-05-20 14:24:46 +00002460 fastind = -1;
Guido van Rossum25831651993-05-19 14:50:45 +00002461 }
2462 }
2463 }
2464 if (value && is_accessobject(value)) {
2465 err_setstr(AccessError, "can't override access");
2466 return -1;
2467 }
2468 err_clear();
Guido van Rossum81daa321993-05-20 14:24:46 +00002469 if (value != NULL && value != None)
2470 type = value->ob_type;
2471 else
2472 type = NULL;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002473 ac = newaccessobject(value, f->f_locals, type, mode);
Guido van Rossum25831651993-05-19 14:50:45 +00002474 if (ac == NULL)
2475 return -1;
Guido van Rossum81daa321993-05-20 14:24:46 +00002476 if (fastind >= 0)
2477 ret = setlistitem(f->f_fastlocals, fastind, ac);
Guido van Rossum25831651993-05-19 14:50:45 +00002478 else {
2479 ret = dict2insert(f->f_locals, name, ac);
2480 DECREF(ac);
2481 }
2482 return ret;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002483}