blob: 45d0a6ac41b6f6c81ba551b59ef088924d053dba [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: */
40/* #define CASE_TOO_BIG 1 /**/
41
Guido van Rossum3f5da241990-12-20 15:06:42 +000042#ifndef NDEBUG
Guido van Rossum96a42c81992-01-12 02:29:51 +000043/* For debugging the interpreter: */
44#define LLTRACE 1 /* Low-level trace feature */
45#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000046#endif
47
Guido van Rossum374a9221991-04-04 10:40:29 +000048/* Forward declarations */
Guido van Rossum374a9221991-04-04 10:40:29 +000049
Guido van Rossum0a066c01992-03-27 17:29:15 +000050#ifdef LLTRACE
51static int prtrace PROTO((object *, char *));
52#endif
Guido van Rossum9c8d70d1992-03-23 18:19:28 +000053static void call_exc_trace PROTO((object **, object**, frameobject *));
54static int call_trace
55 PROTO((object **, object **, frameobject *, char *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000056static int testbool PROTO((object *));
57static object *add PROTO((object *, object *));
58static object *sub PROTO((object *, object *));
59static object *mul PROTO((object *, object *));
60static object *divide PROTO((object *, object *));
61static object *rem PROTO((object *, object *));
62static object *neg PROTO((object *));
63static object *pos PROTO((object *));
64static object *not PROTO((object *));
65static object *invert PROTO((object *));
66static object *lshift PROTO((object *, object *));
67static object *rshift PROTO((object *, object *));
68static object *and PROTO((object *, object *));
69static object *xor PROTO((object *, object *));
70static object *or PROTO((object *, object *));
71static object *call_builtin PROTO((object *, object *));
72static object *call_function PROTO((object *, object *));
73static object *apply_subscript PROTO((object *, object *));
74static object *loop_subscript PROTO((object *, object *));
75static int slice_index PROTO((object *, int, int *));
76static object *apply_slice PROTO((object *, object *, object *));
77static int assign_subscript PROTO((object *, object *, object *));
78static int assign_slice PROTO((object *, object *, object *, object *));
79static int cmp_exception PROTO((object *, object *));
80static int cmp_member PROTO((object *, object *));
Guido van Rossum5b7313a1992-04-06 13:24:57 +000081static object *cmp_outcome PROTO((int, object *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000082static int import_from PROTO((object *, object *, object *));
83static object *build_class PROTO((object *, object *));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +000084static void locals_2_fast PROTO((frameobject *, int));
Guido van Rossum374a9221991-04-04 10:40:29 +000085
86
Guido van Rossum0a066c01992-03-27 17:29:15 +000087/* Pointer to current frame, used to link new frames to */
88
Guido van Rossum374a9221991-04-04 10:40:29 +000089static frameobject *current_frame;
90
Guido van Rossum1984f1e1992-08-04 12:41:02 +000091#ifdef USE_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +000092
Guido van Rossum1984f1e1992-08-04 12:41:02 +000093#include <errno.h>
94#include "thread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000095
Guido van Rossum1984f1e1992-08-04 12:41:02 +000096static type_lock interpreter_lock;
97
98void
99init_save_thread()
100{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000101 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000102 return;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000103 interpreter_lock = allocate_lock();
104 acquire_lock(interpreter_lock, 1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000105}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000106
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000107#endif
108
Guido van Rossumff4949e1992-08-05 19:58:53 +0000109/* Functions save_thread and restore_thread are always defined so
110 dynamically loaded modules needn't be compiled separately for use
111 with and without threads: */
112
Guido van Rossum04691fc1992-08-12 15:35:34 +0000113object *
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000114save_thread()
115{
116#ifdef USE_THREAD
117 if (interpreter_lock) {
Guido van Rossum04691fc1992-08-12 15:35:34 +0000118 object *res;
119 res = (object *)current_frame;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000120 current_frame = NULL;
121 release_lock(interpreter_lock);
122 return res;
123 }
124 else
125 return NULL;
126#endif
127}
128
129void
130restore_thread(x)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000131 object *x;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000132{
133#ifdef USE_THREAD
134 if (interpreter_lock) {
135 int err;
136 err = errno;
137 acquire_lock(interpreter_lock, 1);
138 errno = err;
139 current_frame = (frameobject *)x;
140 }
141#endif
142}
143
144
Guido van Rossum374a9221991-04-04 10:40:29 +0000145/* Status code for main loop (reason for stack unwind) */
146
147enum why_code {
148 WHY_NOT, /* No error */
149 WHY_EXCEPTION, /* Exception occurred */
150 WHY_RERAISE, /* Exception re-raised by 'finally' */
151 WHY_RETURN, /* 'return' statement */
152 WHY_BREAK /* 'break' statement */
153};
154
155
156/* Interpreter main loop */
157
158object *
159eval_code(co, globals, locals, arg)
160 codeobject *co;
161 object *globals;
162 object *locals;
163 object *arg;
164{
165 register unsigned char *next_instr;
166 register int opcode; /* Current opcode */
167 register int oparg; /* Current opcode argument, if any */
168 register object **stack_pointer;
169 register enum why_code why; /* Reason for block stack unwind */
170 register int err; /* Error status -- nonzero if error */
171 register object *x; /* Result object -- NULL if error */
172 register object *v; /* Temporary objects popped off stack */
173 register object *w;
174 register object *u;
175 register object *t;
176 register frameobject *f; /* Current frame */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000177 register listobject *fastlocals = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000178 object *trace = NULL; /* Trace function or NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000179 object *retval; /* Return value iff why == WHY_RETURN */
180 char *name; /* Name used by some instructions */
Guido van Rossum96a42c81992-01-12 02:29:51 +0000181#ifdef LLTRACE
182 int lltrace = dictlookup(globals, "__lltrace__") != NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +0000183#endif
Guido van Rossum99bec951992-09-03 20:29:45 +0000184#ifdef DEBUG
185 /* Make it easier to find out where we are with dbx */
186 char *filename = getstringvalue(co->co_filename);
187#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000188
189/* Code access macros */
190
191#define GETCONST(i) Getconst(f, i)
192#define GETNAME(i) Getname(f, i)
193#define GETNAMEV(i) Getnamev(f, i)
194#define FIRST_INSTR() (GETUSTRINGVALUE(f->f_code->co_code))
195#define INSTR_OFFSET() (next_instr - FIRST_INSTR())
196#define NEXTOP() (*next_instr++)
197#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
198#define JUMPTO(x) (next_instr = FIRST_INSTR() + (x))
199#define JUMPBY(x) (next_instr += (x))
200
201/* Stack manipulation macros */
202
203#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
204#define EMPTY() (STACK_LEVEL() == 0)
205#define TOP() (stack_pointer[-1])
206#define BASIC_PUSH(v) (*stack_pointer++ = (v))
207#define BASIC_POP() (*--stack_pointer)
208
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000209#define CHECK_STACK(n) (STACK_LEVEL() + (n) < f->f_nvalues || \
210 (stack_pointer = extend_stack(f, STACK_LEVEL(), n)))
211
Guido van Rossum96a42c81992-01-12 02:29:51 +0000212#ifdef LLTRACE
213#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
214#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000215#else
216#define PUSH(v) BASIC_PUSH(v)
217#define POP() BASIC_POP()
218#endif
219
220 f = newframeobject(
221 current_frame, /*back*/
222 co, /*code*/
223 globals, /*globals*/
224 locals, /*locals*/
225 50, /*nvalues*/
226 20); /*nblocks*/
227 if (f == NULL)
228 return NULL;
229
230 current_frame = f;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000231
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000232 if (sys_trace != NULL) {
233 /* sys_trace, if defined, is a function that will
Guido van Rossum96a42c81992-01-12 02:29:51 +0000234 be called on *every* entry to a code block.
235 Its return value, if not None, is a function that
236 will be called at the start of each executed line
237 of code. (Actually, the function must return
238 itself in order to continue tracing.)
239 The trace functions are called with three arguments:
240 a pointer to the current frame, a string indicating
241 why the function is called, and an argument which
242 depends on the situation. The global trace function
243 (sys.trace) is also called whenever an exception
244 is detected. */
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000245 if (call_trace(&sys_trace, &trace, f, "call", arg)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000246 /* Trace function raised an error */
Guido van Rossum96a42c81992-01-12 02:29:51 +0000247 current_frame = f->f_back;
248 DECREF(f);
249 return NULL;
250 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000251 }
252
253 if (sys_profile != NULL) {
254 /* Similar for sys_profile, except it needn't return
255 itself and isn't called for "line" events */
256 if (call_trace(&sys_profile, (object**)0, f, "call", arg)) {
257 current_frame = f->f_back;
258 DECREF(f);
259 return NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000260 }
261 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000262
263 next_instr = GETUSTRINGVALUE(f->f_code->co_code);
Guido van Rossum374a9221991-04-04 10:40:29 +0000264 stack_pointer = f->f_valuestack;
265
266 if (arg != NULL) {
267 INCREF(arg);
268 PUSH(arg);
269 }
270
271 why = WHY_NOT;
272 err = 0;
273 x = None; /* Not a reference, just anything non-NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000274
275 for (;;) {
Guido van Rossum4965bc81991-05-14 11:51:49 +0000276 static int ticker;
Guido van Rossum374a9221991-04-04 10:40:29 +0000277
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000278 /* Do periodic things.
279 Doing this every time through the loop would add
280 too much overhead (a function call per instruction).
281 So we do it only every tenth instruction. */
Guido van Rossum374a9221991-04-04 10:40:29 +0000282
283 if (--ticker < 0) {
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000284 ticker = 10;
Guido van Rossum374a9221991-04-04 10:40:29 +0000285 if (intrcheck()) {
286 err_set(KeyboardInterrupt);
287 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000288 goto on_error;
289 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000290
291#ifdef USE_THREAD
292 if (interpreter_lock) {
293 /* Give another thread a chance */
294
295 current_frame = NULL;
296 release_lock(interpreter_lock);
297
298 /* Other threads may run now */
299
300 acquire_lock(interpreter_lock, 1);
301 current_frame = f;
302 }
303#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000304 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000305
Guido van Rossum374a9221991-04-04 10:40:29 +0000306 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000307
308#ifdef DEBUG
309 f->f_lasti = INSTR_OFFSET();
310#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000311
312 opcode = NEXTOP();
313 if (HAS_ARG(opcode))
314 oparg = NEXTARG();
315
Guido van Rossum96a42c81992-01-12 02:29:51 +0000316#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000317 /* Instruction tracing */
318
Guido van Rossum96a42c81992-01-12 02:29:51 +0000319 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000320 if (HAS_ARG(opcode)) {
321 printf("%d: %d, %d\n",
322 (int) (INSTR_OFFSET() - 3),
323 opcode, oparg);
324 }
325 else {
326 printf("%d: %d\n",
327 (int) (INSTR_OFFSET() - 1), opcode);
328 }
329 }
330#endif
331
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000332 if (!CHECK_STACK(3)) {
333 x = NULL;
334 break;
335 }
336
Guido van Rossum374a9221991-04-04 10:40:29 +0000337 /* Main switch on opcode */
338
339 switch (opcode) {
340
341 /* BEWARE!
342 It is essential that any operation that fails sets either
343 x to NULL, err to nonzero, or why to anything but WHY_NOT,
344 and that no operation that succeeds does this! */
345
346 /* case STOP_CODE: this is an error! */
347
348 case POP_TOP:
349 v = POP();
350 DECREF(v);
351 break;
352
353 case ROT_TWO:
354 v = POP();
355 w = POP();
356 PUSH(v);
357 PUSH(w);
358 break;
359
360 case ROT_THREE:
361 v = POP();
362 w = POP();
363 x = POP();
364 PUSH(v);
365 PUSH(x);
366 PUSH(w);
367 break;
368
369 case DUP_TOP:
370 v = TOP();
371 INCREF(v);
372 PUSH(v);
373 break;
374
375 case UNARY_POSITIVE:
376 v = POP();
377 x = pos(v);
378 DECREF(v);
379 PUSH(x);
380 break;
381
382 case UNARY_NEGATIVE:
383 v = POP();
384 x = neg(v);
385 DECREF(v);
386 PUSH(x);
387 break;
388
389 case UNARY_NOT:
390 v = POP();
391 x = not(v);
392 DECREF(v);
393 PUSH(x);
394 break;
395
396 case UNARY_CONVERT:
397 v = POP();
398 x = reprobject(v);
399 DECREF(v);
400 PUSH(x);
401 break;
402
403 case UNARY_CALL:
404 v = POP();
Guido van Rossum96a42c81992-01-12 02:29:51 +0000405 f->f_lasti = INSTR_OFFSET() - 1; /* For tracing */
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000406 x = call_object(v, (object *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +0000407 DECREF(v);
408 PUSH(x);
409 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000410
411 case UNARY_INVERT:
412 v = POP();
413 x = invert(v);
414 DECREF(v);
415 PUSH(x);
416 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000417
418 case BINARY_MULTIPLY:
419 w = POP();
420 v = POP();
421 x = mul(v, w);
422 DECREF(v);
423 DECREF(w);
424 PUSH(x);
425 break;
426
427 case BINARY_DIVIDE:
428 w = POP();
429 v = POP();
430 x = divide(v, w);
431 DECREF(v);
432 DECREF(w);
433 PUSH(x);
434 break;
435
436 case BINARY_MODULO:
437 w = POP();
438 v = POP();
439 x = rem(v, w);
440 DECREF(v);
441 DECREF(w);
442 PUSH(x);
443 break;
444
445 case BINARY_ADD:
446 w = POP();
447 v = POP();
448 x = add(v, w);
449 DECREF(v);
450 DECREF(w);
451 PUSH(x);
452 break;
453
454 case BINARY_SUBTRACT:
455 w = POP();
456 v = POP();
457 x = sub(v, w);
458 DECREF(v);
459 DECREF(w);
460 PUSH(x);
461 break;
462
463 case BINARY_SUBSCR:
464 w = POP();
465 v = POP();
466 x = apply_subscript(v, w);
467 DECREF(v);
468 DECREF(w);
469 PUSH(x);
470 break;
471
472 case BINARY_CALL:
473 w = POP();
474 v = POP();
Guido van Rossum96a42c81992-01-12 02:29:51 +0000475 f->f_lasti = INSTR_OFFSET() - 1; /* For tracing */
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000476 x = call_object(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000477 DECREF(v);
478 DECREF(w);
479 PUSH(x);
480 break;
481
Guido van Rossum7928cd71991-10-24 14:59:31 +0000482 case BINARY_LSHIFT:
483 w = POP();
484 v = POP();
485 x = lshift(v, w);
486 DECREF(v);
487 DECREF(w);
488 PUSH(x);
489 break;
490
491 case BINARY_RSHIFT:
492 w = POP();
493 v = POP();
494 x = rshift(v, w);
495 DECREF(v);
496 DECREF(w);
497 PUSH(x);
498 break;
499
500 case BINARY_AND:
501 w = POP();
502 v = POP();
503 x = and(v, w);
504 DECREF(v);
505 DECREF(w);
506 PUSH(x);
507 break;
508
509 case BINARY_XOR:
510 w = POP();
511 v = POP();
512 x = xor(v, w);
513 DECREF(v);
514 DECREF(w);
515 PUSH(x);
516 break;
517
518 case BINARY_OR:
519 w = POP();
520 v = POP();
521 x = or(v, w);
522 DECREF(v);
523 DECREF(w);
524 PUSH(x);
525 break;
526
Guido van Rossum374a9221991-04-04 10:40:29 +0000527 case SLICE+0:
528 case SLICE+1:
529 case SLICE+2:
530 case SLICE+3:
531 if ((opcode-SLICE) & 2)
532 w = POP();
533 else
534 w = NULL;
535 if ((opcode-SLICE) & 1)
536 v = POP();
537 else
538 v = NULL;
539 u = POP();
540 x = apply_slice(u, v, w);
541 DECREF(u);
542 XDECREF(v);
543 XDECREF(w);
544 PUSH(x);
545 break;
546
547 case STORE_SLICE+0:
548 case STORE_SLICE+1:
549 case STORE_SLICE+2:
550 case STORE_SLICE+3:
551 if ((opcode-STORE_SLICE) & 2)
552 w = POP();
553 else
554 w = NULL;
555 if ((opcode-STORE_SLICE) & 1)
556 v = POP();
557 else
558 v = NULL;
559 u = POP();
560 t = POP();
561 err = assign_slice(u, v, w, t); /* u[v:w] = t */
562 DECREF(t);
563 DECREF(u);
564 XDECREF(v);
565 XDECREF(w);
566 break;
567
568 case DELETE_SLICE+0:
569 case DELETE_SLICE+1:
570 case DELETE_SLICE+2:
571 case DELETE_SLICE+3:
572 if ((opcode-DELETE_SLICE) & 2)
573 w = POP();
574 else
575 w = NULL;
576 if ((opcode-DELETE_SLICE) & 1)
577 v = POP();
578 else
579 v = NULL;
580 u = POP();
581 err = assign_slice(u, v, w, (object *)NULL);
582 /* del u[v:w] */
583 DECREF(u);
584 XDECREF(v);
585 XDECREF(w);
586 break;
587
588 case STORE_SUBSCR:
589 w = POP();
590 v = POP();
591 u = POP();
592 /* v[w] = u */
593 err = assign_subscript(v, w, u);
594 DECREF(u);
595 DECREF(v);
596 DECREF(w);
597 break;
598
599 case DELETE_SUBSCR:
600 w = POP();
601 v = POP();
602 /* del v[w] */
603 err = assign_subscript(v, w, (object *)NULL);
604 DECREF(v);
605 DECREF(w);
606 break;
607
608 case PRINT_EXPR:
609 v = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +0000610 /* Print value except if procedure result */
611 if (v != None) {
612 flushline();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000613 x = sysget("stdout");
614 softspace(x, 1);
615 err = writeobject(v, x, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000616 flushline();
617 }
618 DECREF(v);
619 break;
620
621 case PRINT_ITEM:
622 v = POP();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000623 w = sysget("stdout");
624 if (softspace(w, 1))
625 writestring(" ", w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000626 if (is_stringobject(v)) {
627 char *s = getstringvalue(v);
628 int len = getstringsize(v);
Guido van Rossum3165fe61992-09-25 21:59:05 +0000629 err = writeobject(v, w, PRINT_RAW);
630 if (err == 0 && len > 0 && s[len-1] == '\n')
631 softspace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000632 }
633 else {
Guido van Rossum3165fe61992-09-25 21:59:05 +0000634 err = writeobject(v, w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000635 }
636 DECREF(v);
637 break;
638
639 case PRINT_NEWLINE:
Guido van Rossum3165fe61992-09-25 21:59:05 +0000640 x = sysget("stdout");
641 if (x == NULL)
642 err_setstr(RuntimeError, "lost sys.stdout");
643 else {
644 writestring("\n", x);
645 softspace(x, 0);
646 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000647 break;
648
649 case BREAK_LOOP:
650 why = WHY_BREAK;
651 break;
652
653 case RAISE_EXCEPTION:
654 v = POP();
655 w = POP();
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000656 /* A tuple is equivalent to its first element here */
657 while (is_tupleobject(w)) {
658 u = w;
659 w = gettupleitem(u, 0);
660 DECREF(u);
661 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000662 if (!is_stringobject(w))
663 err_setstr(TypeError,
664 "exceptions must be strings");
665 else
666 err_setval(w, v);
667 DECREF(v);
668 DECREF(w);
669 why = WHY_EXCEPTION;
670 break;
671
672 case LOAD_LOCALS:
673 v = f->f_locals;
674 INCREF(v);
675 PUSH(v);
676 break;
677
678 case RETURN_VALUE:
679 retval = POP();
680 why = WHY_RETURN;
681 break;
682
Guido van Rossum374a9221991-04-04 10:40:29 +0000683 case BUILD_FUNCTION:
684 v = POP();
685 x = newfuncobject(v, f->f_globals);
686 DECREF(v);
687 PUSH(x);
688 break;
689
690 case POP_BLOCK:
691 {
692 block *b = pop_block(f);
693 while (STACK_LEVEL() > b->b_level) {
694 v = POP();
695 DECREF(v);
696 }
697 }
698 break;
699
700 case END_FINALLY:
701 v = POP();
702 if (is_intobject(v)) {
703 why = (enum why_code) getintvalue(v);
704 if (why == WHY_RETURN)
705 retval = POP();
706 }
707 else if (is_stringobject(v)) {
708 w = POP();
709 err_setval(v, w);
710 DECREF(w);
711 w = POP();
712 tb_store(w);
713 DECREF(w);
714 why = WHY_RERAISE;
715 }
716 else if (v != None) {
717 err_setstr(SystemError,
718 "'finally' pops bad exception");
719 why = WHY_EXCEPTION;
720 }
721 DECREF(v);
722 break;
723
724 case BUILD_CLASS:
725 w = POP();
726 v = POP();
727 x = build_class(v, w);
728 PUSH(x);
729 DECREF(v);
730 DECREF(w);
731 break;
732
733 case STORE_NAME:
734 w = GETNAMEV(oparg);
735 v = POP();
736 err = dict2insert(f->f_locals, w, v);
737 DECREF(v);
738 break;
739
740 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000741 w = GETNAMEV(oparg);
742 if ((err = dict2remove(f->f_locals, w)) != 0)
743 err_setstr(NameError, getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000744 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000745
746#ifdef CASE_TOO_BIG
747 default: switch (opcode) {
748#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000749
Guido van Rossum6a3f9a81992-01-14 18:29:20 +0000750 case UNPACK_VARARG:
751 if (EMPTY()) {
752 err_setstr(TypeError,
753 "no argument list");
754 why = WHY_EXCEPTION;
755 break;
756 }
757 v = POP();
758 if (!is_tupleobject(v)) {
759 err_setstr(TypeError,
760 "bad argument list");
761 why = WHY_EXCEPTION;
762 }
763 else if (gettuplesize(v) < oparg) {
764 err_setstr(TypeError,
765 "not enough arguments");
766 why = WHY_EXCEPTION;
767 }
768 else if (oparg == 0) {
769 PUSH(v);
770 break;
771 }
772 else {
773 x = gettupleslice(v, oparg, gettuplesize(v));
774 if (x != NULL) {
775 PUSH(x);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000776 if (!CHECK_STACK(oparg)) {
777 x = NULL;
778 break;
779 }
Guido van Rossum6a3f9a81992-01-14 18:29:20 +0000780 for (; --oparg >= 0; ) {
781 w = gettupleitem(v, oparg);
782 INCREF(w);
783 PUSH(w);
784 }
785 }
786 }
787 DECREF(v);
788 break;
789
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000790 case UNPACK_ARG:
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000791 {
792 int n;
793 if (EMPTY()) {
794 err_setstr(TypeError,
795 "no argument list");
796 why = WHY_EXCEPTION;
797 break;
798 }
799 v = POP();
800 if (!is_tupleobject(v)) {
801 err_setstr(TypeError,
802 "bad argument list");
803 why = WHY_EXCEPTION;
804 break;
805 }
806 n = gettuplesize(v);
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000807#ifdef COMPAT_HACKS
808/* Implement various compatibility hacks (for 0.9.4 or earlier):
809 (a) f(a,b,...) accepts f((1,2,...))
810 (b) f((a,b,...)) accepts f(1,2,...)
811 (c) f(self,(a,b,...)) accepts f(x,1,2,...)
812*/
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000813 if (n == 1 && oparg != 1) {
814 /* Rule (a) */
815 w = gettupleitem(v, 0);
816 if (is_tupleobject(w)) {
817 INCREF(w);
818 DECREF(v);
819 v = w;
820 n = gettuplesize(v);
821 }
822 }
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000823 else if (n != 1 && oparg == 1) {
824 /* Rule (b) */
825 PUSH(v);
826 break;
827 /* Don't fall through */
828 }
829 else if (n > 2 && oparg == 2) {
830 /* Rule (c) */
831 int i;
832 w = newtupleobject(n-1);
833 u = newtupleobject(2);
834 if (u == NULL || w == NULL) {
835 XDECREF(w);
836 XDECREF(u);
837 DECREF(v);
838 why = WHY_EXCEPTION;
839 break;
840 }
841 t = gettupleitem(v, 0);
842 INCREF(t);
843 settupleitem(u, 0, t);
844 for (i = 1; i < n; i++) {
845 t = gettupleitem(v, i);
846 INCREF(t);
847 settupleitem(w, i-1, t);
848 }
849 settupleitem(u, 1, w);
850 DECREF(v);
851 v = u;
852 n = 2;
853 }
Guido van Rossum5f59d601992-12-14 16:59:51 +0000854#endif /* Disabled compatibility hacks */
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000855 if (n != oparg) {
856 err_setstr(TypeError,
857 "arg count mismatch");
858 why = WHY_EXCEPTION;
859 DECREF(v);
860 break;
861 }
862 PUSH(v);
863 }
864 /* Fall through */
Guido van Rossum374a9221991-04-04 10:40:29 +0000865 case UNPACK_TUPLE:
866 v = POP();
867 if (!is_tupleobject(v)) {
868 err_setstr(TypeError, "unpack non-tuple");
869 why = WHY_EXCEPTION;
870 }
871 else if (gettuplesize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000872 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +0000873 "unpack tuple of wrong size");
874 why = WHY_EXCEPTION;
875 }
876 else {
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000877 if (!CHECK_STACK(oparg)) {
878 x = NULL;
879 break;
880 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000881 for (; --oparg >= 0; ) {
882 w = gettupleitem(v, oparg);
883 INCREF(w);
884 PUSH(w);
885 }
886 }
887 DECREF(v);
888 break;
889
890 case UNPACK_LIST:
891 v = POP();
892 if (!is_listobject(v)) {
893 err_setstr(TypeError, "unpack non-list");
894 why = WHY_EXCEPTION;
895 }
896 else if (getlistsize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000897 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +0000898 "unpack list of wrong size");
899 why = WHY_EXCEPTION;
900 }
901 else {
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000902 if (!CHECK_STACK(oparg)) {
903 x = NULL;
904 break;
905 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000906 for (; --oparg >= 0; ) {
907 w = getlistitem(v, oparg);
908 INCREF(w);
909 PUSH(w);
910 }
911 }
912 DECREF(v);
913 break;
914
915 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +0000916 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +0000917 v = POP();
918 u = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +0000919 err = setattro(v, w, u); /* v.w = u */
Guido van Rossum374a9221991-04-04 10:40:29 +0000920 DECREF(v);
921 DECREF(u);
922 break;
923
924 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +0000925 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +0000926 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +0000927 err = setattro(v, w, (object *)NULL); /* del v.w */
Guido van Rossum374a9221991-04-04 10:40:29 +0000928 DECREF(v);
929 break;
930
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000931 case STORE_GLOBAL:
932 w = GETNAMEV(oparg);
933 v = POP();
934 err = dict2insert(f->f_globals, w, v);
935 DECREF(v);
936 break;
937
938 case DELETE_GLOBAL:
939 w = GETNAMEV(oparg);
940 if ((err = dict2remove(f->f_globals, w)) != 0)
941 err_setstr(NameError, getstringvalue(w));
942 break;
943
Guido van Rossum374a9221991-04-04 10:40:29 +0000944 case LOAD_CONST:
945 x = GETCONST(oparg);
946 INCREF(x);
947 PUSH(x);
948 break;
949
950 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000951 w = GETNAMEV(oparg);
952 x = dict2lookup(f->f_locals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000953 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000954 err_clear();
955 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000956 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000957 err_clear();
958 x = getbuiltin(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000959 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000960 err_setstr(NameError,
961 getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000962 break;
963 }
964 }
965 }
966 INCREF(x);
967 PUSH(x);
968 break;
969
970 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000971 w = GETNAMEV(oparg);
972 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000973 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000974 err_clear();
975 x = getbuiltin(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000976 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000977 err_setstr(NameError,
978 getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000979 break;
980 }
981 }
982 INCREF(x);
983 PUSH(x);
984 break;
985
986 case LOAD_LOCAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000987 w = GETNAMEV(oparg);
988 x = dict2lookup(f->f_locals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000989 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000990 err_setstr(NameError, getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000991 break;
992 }
993 INCREF(x);
994 PUSH(x);
995 break;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000996
997 case RESERVE_FAST:
Guido van Rossum8b17d6b1993-03-30 13:18:41 +0000998 x = GETCONST(oparg);
999 if (x == None)
1000 break;
1001 if (x == NULL || !is_dictobject(x)) {
1002 fatal("bad RESERVE_FAST");
1003 err_setstr(SystemError, "bad RESERVE_FAST");
1004 x = NULL;
1005 break;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001006 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001007 XDECREF(f->f_fastlocals);
1008 XDECREF(f->f_localmap);
1009 INCREF(x);
1010 f->f_localmap = x;
1011 f->f_fastlocals = x = newlistobject(
1012 x->ob_type->tp_as_mapping->mp_length(x));
1013 fastlocals = (listobject *) x;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001014 break;
1015
1016 case LOAD_FAST:
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001017 x = GETLISTITEM(fastlocals, oparg);
1018 if (x == NULL) {
1019 err_setstr(NameError,
1020 "undefined local variable");
1021 break;
1022 }
1023 INCREF(x);
1024 PUSH(x);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001025 break;
1026
1027 case STORE_FAST:
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001028 w = GETLISTITEM(fastlocals, oparg);
1029 XDECREF(w);
1030 w = POP();
1031 GETLISTITEM(fastlocals, oparg) = w;
1032 break;
1033
1034 case DELETE_FAST:
1035 x = GETLISTITEM(fastlocals, oparg);
1036 if (x == NULL) {
1037 err_setstr(NameError,
1038 "undefined local variable");
1039 break;
1040 }
1041 DECREF(x);
1042 GETLISTITEM(fastlocals, oparg) = NULL;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001043 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001044
1045 case BUILD_TUPLE:
1046 x = newtupleobject(oparg);
1047 if (x != NULL) {
1048 for (; --oparg >= 0;) {
1049 w = POP();
1050 err = settupleitem(x, oparg, w);
1051 if (err != 0)
1052 break;
1053 }
1054 PUSH(x);
1055 }
1056 break;
1057
1058 case BUILD_LIST:
1059 x = newlistobject(oparg);
1060 if (x != NULL) {
1061 for (; --oparg >= 0;) {
1062 w = POP();
1063 err = setlistitem(x, oparg, w);
1064 if (err != 0)
1065 break;
1066 }
1067 PUSH(x);
1068 }
1069 break;
1070
1071 case BUILD_MAP:
1072 x = newdictobject();
1073 PUSH(x);
1074 break;
1075
1076 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001077 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001078 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001079 x = getattro(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001080 DECREF(v);
1081 PUSH(x);
1082 break;
1083
1084 case COMPARE_OP:
1085 w = POP();
1086 v = POP();
Guido van Rossum5b7313a1992-04-06 13:24:57 +00001087 x = cmp_outcome(oparg, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001088 DECREF(v);
1089 DECREF(w);
1090 PUSH(x);
1091 break;
1092
1093 case IMPORT_NAME:
1094 name = GETNAME(oparg);
1095 x = import_module(name);
1096 XINCREF(x);
1097 PUSH(x);
1098 break;
1099
1100 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001101 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001102 v = TOP();
Guido van Rossumdf62e441991-08-16 08:56:04 +00001103 err = import_from(f->f_locals, v, w);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001104 locals_2_fast(f, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001105 break;
1106
1107 case JUMP_FORWARD:
1108 JUMPBY(oparg);
1109 break;
1110
1111 case JUMP_IF_FALSE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001112 err = testbool(TOP());
1113 if (err > 0)
1114 err = 0;
1115 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001116 JUMPBY(oparg);
1117 break;
1118
1119 case JUMP_IF_TRUE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001120 err = testbool(TOP());
1121 if (err > 0) {
1122 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001123 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001124 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001125 break;
1126
1127 case JUMP_ABSOLUTE:
1128 JUMPTO(oparg);
1129 break;
1130
1131 case FOR_LOOP:
1132 /* for v in s: ...
1133 On entry: stack contains s, i.
1134 On exit: stack contains s, i+1, s[i];
1135 but if loop exhausted:
1136 s, i are popped, and we jump */
1137 w = POP(); /* Loop index */
1138 v = POP(); /* Sequence object */
1139 u = loop_subscript(v, w);
1140 if (u != NULL) {
1141 PUSH(v);
1142 x = newintobject(getintvalue(w)+1);
1143 PUSH(x);
1144 DECREF(w);
1145 PUSH(u);
1146 }
1147 else {
1148 DECREF(v);
1149 DECREF(w);
1150 /* A NULL can mean "s exhausted"
1151 but also an error: */
1152 if (err_occurred())
1153 why = WHY_EXCEPTION;
1154 else
1155 JUMPBY(oparg);
1156 }
1157 break;
1158
1159 case SETUP_LOOP:
1160 case SETUP_EXCEPT:
1161 case SETUP_FINALLY:
1162 setup_block(f, opcode, INSTR_OFFSET() + oparg,
1163 STACK_LEVEL());
1164 break;
1165
1166 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001167#ifdef LLTRACE
1168 if (lltrace)
Guido van Rossum374a9221991-04-04 10:40:29 +00001169 printf("--- Line %d ---\n", oparg);
1170#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001171 f->f_lineno = oparg;
1172 if (trace != NULL) {
1173 /* Trace each line of code reached */
1174 f->f_lasti = INSTR_OFFSET();
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001175 err = call_trace(&trace, &trace,
1176 f, "line", None);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001177 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001178 break;
1179
1180 default:
1181 fprintf(stderr,
1182 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001183 f->f_lineno, opcode);
Guido van Rossum374a9221991-04-04 10:40:29 +00001184 err_setstr(SystemError, "eval_code: unknown opcode");
1185 why = WHY_EXCEPTION;
1186 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001187
1188#ifdef CASE_TOO_BIG
1189 }
1190#endif
1191
Guido van Rossum374a9221991-04-04 10:40:29 +00001192 } /* switch */
1193
1194 on_error:
1195
1196 /* Quickly continue if no error occurred */
1197
1198 if (why == WHY_NOT) {
1199 if (err == 0 && x != NULL)
1200 continue; /* Normal, fast path */
1201 why = WHY_EXCEPTION;
1202 x = None;
1203 err = 0;
1204 }
1205
Guido van Rossum801dcae1992-04-08 11:32:32 +00001206#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001207 /* Double-check exception status */
1208
1209 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
1210 if (!err_occurred()) {
1211 fprintf(stderr, "XXX ghost error\n");
1212 err_setstr(SystemError, "ghost error");
1213 why = WHY_EXCEPTION;
1214 }
1215 }
1216 else {
1217 if (err_occurred()) {
1218 fprintf(stderr, "XXX undetected error\n");
Guido van Rossum99bec951992-09-03 20:29:45 +00001219 abort();
1220 /* NOTREACHED */
Guido van Rossum374a9221991-04-04 10:40:29 +00001221 why = WHY_EXCEPTION;
1222 }
1223 }
1224#endif
1225
1226 /* Log traceback info if this is a real exception */
1227
1228 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001229 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001230 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001231 f->f_lasti -= 2;
1232 tb_here(f);
1233
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001234 if (trace)
1235 call_exc_trace(&trace, &trace, f);
1236 if (sys_profile)
1237 call_exc_trace(&sys_profile, (object**)0, f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001238 }
1239
1240 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1241
1242 if (why == WHY_RERAISE)
1243 why = WHY_EXCEPTION;
1244
1245 /* Unwind stacks if a (pseudo) exception occurred */
1246
1247 while (why != WHY_NOT && f->f_iblock > 0) {
1248 block *b = pop_block(f);
1249 while (STACK_LEVEL() > b->b_level) {
1250 v = POP();
1251 XDECREF(v);
1252 }
1253 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1254 why = WHY_NOT;
1255 JUMPTO(b->b_handler);
1256 break;
1257 }
1258 if (b->b_type == SETUP_FINALLY ||
1259 b->b_type == SETUP_EXCEPT &&
1260 why == WHY_EXCEPTION) {
1261 if (why == WHY_EXCEPTION) {
1262 object *exc, *val;
1263 err_get(&exc, &val);
1264 if (val == NULL) {
1265 val = None;
1266 INCREF(val);
1267 }
1268 v = tb_fetch();
1269 /* Make the raw exception data
1270 available to the handler,
1271 so a program can emulate the
1272 Python main loop. Don't do
1273 this for 'finally'. */
1274 if (b->b_type == SETUP_EXCEPT) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001275 sysset("exc_traceback", v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001276 sysset("exc_value", val);
1277 sysset("exc_type", exc);
Guido van Rossum374a9221991-04-04 10:40:29 +00001278 }
1279 PUSH(v);
1280 PUSH(val);
1281 PUSH(exc);
1282 }
1283 else {
1284 if (why == WHY_RETURN)
1285 PUSH(retval);
1286 v = newintobject((long)why);
1287 PUSH(v);
1288 }
1289 why = WHY_NOT;
1290 JUMPTO(b->b_handler);
1291 break;
1292 }
1293 } /* unwind stack */
1294
1295 /* End the loop if we still have an error (or return) */
1296
1297 if (why != WHY_NOT)
1298 break;
1299
1300 } /* main loop */
1301
1302 /* Pop remaining stack entries */
1303
1304 while (!EMPTY()) {
1305 v = POP();
1306 XDECREF(v);
1307 }
1308
Guido van Rossum96a42c81992-01-12 02:29:51 +00001309 if (why != WHY_RETURN)
1310 retval = NULL;
1311
1312 if (trace) {
1313 if (why == WHY_RETURN) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001314 if (call_trace(&trace, &trace, f, "return", retval)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001315 XDECREF(retval);
1316 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001317 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001318 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001319 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001320 XDECREF(trace);
1321 }
1322
1323 if (sys_profile && why == WHY_RETURN) {
1324 if (call_trace(&sys_profile, (object**)0,
1325 f, "return", retval)) {
1326 XDECREF(retval);
1327 retval = NULL;
1328 why = WHY_EXCEPTION;
1329 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001330 }
1331
Guido van Rossum374a9221991-04-04 10:40:29 +00001332 /* Restore previous frame and release the current one */
1333
1334 current_frame = f->f_back;
1335 DECREF(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001336
Guido van Rossum96a42c81992-01-12 02:29:51 +00001337 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001338}
1339
Guido van Rossum96a42c81992-01-12 02:29:51 +00001340#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00001341static int
1342prtrace(v, str)
1343 object *v;
1344 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001345{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001346 printf("%s ", str);
Guido van Rossum90933611991-06-07 16:10:43 +00001347 if (printobject(v, stdout, 0) != 0)
1348 err_clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001349 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001350}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001351#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001352
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001353static void
1354call_exc_trace(p_trace, p_newtrace, f)
1355 object **p_trace, **p_newtrace;
1356 frameobject *f;
1357{
1358 object *type, *value, *traceback, *arg;
1359 int err;
1360 err_get(&type, &value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00001361 if (value == NULL) {
1362 value = None;
1363 INCREF(value);
1364 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001365 traceback = tb_fetch();
1366 arg = newtupleobject(3);
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001367 if (arg == NULL)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001368 goto cleanup;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001369 settupleitem(arg, 0, type);
1370 settupleitem(arg, 1, value);
1371 settupleitem(arg, 2, traceback);
1372 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001373 if (!err) {
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001374 cleanup:
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001375 /* Restore original exception */
1376 err_setval(type, value);
1377 tb_store(traceback);
1378 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001379 XDECREF(arg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001380}
1381
1382static int
1383call_trace(p_trace, p_newtrace, f, msg, arg)
1384 object **p_trace; /* in/out; may not be NULL;
1385 may not point to NULL variable initially */
1386 object **p_newtrace; /* in/out; may be NULL;
1387 may point to NULL variable;
1388 may be same variable as p_newtrace */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001389 frameobject *f;
1390 char *msg;
1391 object *arg;
1392{
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001393 object *arglist, *what;
1394 object *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001395 static int tracing = 0;
1396
1397 if (tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001398 /* Don't do recursive traces */
1399 if (p_newtrace) {
1400 XDECREF(*p_newtrace);
1401 *p_newtrace = NULL;
1402 }
1403 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001404 }
1405
1406 arglist = newtupleobject(3);
1407 if (arglist == NULL)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001408 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001409 what = newstringobject(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001410 if (what == NULL)
1411 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001412 INCREF(f);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001413 settupleitem(arglist, 0, (object *)f);
1414 settupleitem(arglist, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001415 if (arg == NULL)
1416 arg = None;
1417 INCREF(arg);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001418 settupleitem(arglist, 2, arg);
1419 tracing++;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001420 res = call_object(*p_trace, arglist);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001421 tracing--;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001422 cleanup:
1423 XDECREF(arglist);
1424 if (res == NULL) {
1425 /* The trace proc raised an exception */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001426 tb_here(f);
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001427 DECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001428 *p_trace = NULL;
1429 if (p_newtrace) {
1430 XDECREF(*p_newtrace);
1431 *p_newtrace = NULL;
1432 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001433 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001434 }
1435 else {
1436 if (p_newtrace) {
1437 XDECREF(*p_newtrace);
1438 if (res == None)
1439 *p_newtrace = NULL;
1440 else {
1441 INCREF(res);
1442 *p_newtrace = res;
1443 }
1444 }
1445 DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001446 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001447 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001448}
1449
Guido van Rossum3f5da241990-12-20 15:06:42 +00001450object *
1451getlocals()
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001452{
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001453 /* Merge f->f_fastlocals into f->f_locals, then return the latter */
1454 frameobject *f;
1455 object *locals, *fast, *map;
1456 int i;
1457 f = current_frame;
1458 if (f == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001459 return NULL;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001460 locals = f->f_locals;
1461 fast = f->f_fastlocals;
1462 map = f->f_localmap;
1463 if (locals == NULL || fast == NULL || map == NULL)
1464 return locals;
1465 if (!is_dictobject(locals) || !is_listobject(fast) ||
1466 !is_dictobject(map))
1467 return locals;
1468 i = getdictsize(map);
1469 while (--i >= 0) {
1470 object *key;
1471 object *value;
1472 int j;
1473 key = getdict2key(map, i);
1474 if (key == NULL)
1475 continue;
1476 value = dict2lookup(map, key);
1477 if (value == NULL || !is_intobject(value))
1478 continue;
1479 j = getintvalue(value);
1480 value = getlistitem(fast, j);
1481 if (value == NULL) {
1482 err_clear();
1483 if (dict2remove(locals, key) != 0)
1484 err_clear();
1485 }
1486 else {
1487 if (dict2insert(locals, key, value) != 0)
1488 err_clear();
1489 }
1490 }
1491 return locals;
1492}
1493
1494static void
1495locals_2_fast(f, clear)
1496 frameobject *f;
1497 int clear;
1498{
1499 /* Merge f->f_locals into f->f_fastlocals */
1500 object *locals, *fast, *map;
1501 int i;
1502 if (f == NULL)
1503 return;
1504 locals = f->f_locals;
1505 fast = f->f_fastlocals;
1506 map = f->f_localmap;
1507 if (locals == NULL || fast == NULL || map == NULL)
1508 return;
1509 if (!is_dictobject(locals) || !is_listobject(fast) ||
1510 !is_dictobject(map))
1511 return;
1512 i = getdictsize(map);
1513 while (--i >= 0) {
1514 object *key;
1515 object *value;
1516 int j;
1517 key = getdict2key(map, i);
1518 if (key == NULL)
1519 continue;
1520 value = dict2lookup(map, key);
1521 if (value == NULL || !is_intobject(value))
1522 continue;
1523 j = getintvalue(value);
1524 value = dict2lookup(locals, key);
1525 if (value == NULL)
1526 err_clear();
1527 else
1528 INCREF(value);
1529 if (value != NULL || clear)
1530 if (setlistitem(fast, j, value) != 0)
1531 err_clear();
1532 }
1533}
1534
1535void
1536mergelocals()
1537{
1538 locals_2_fast(current_frame, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001539}
1540
1541object *
1542getglobals()
1543{
1544 if (current_frame == NULL)
1545 return NULL;
1546 else
1547 return current_frame->f_globals;
1548}
1549
1550void
Guido van Rossum3165fe61992-09-25 21:59:05 +00001551printtraceback(f)
1552 object *f;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001553{
1554 object *v = tb_fetch();
1555 if (v != NULL) {
Guido van Rossum3165fe61992-09-25 21:59:05 +00001556 writestring("Stack backtrace (innermost last):\n", f);
1557 tb_print(v, f);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001558 DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001559 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001560}
1561
1562
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001563void
1564flushline()
1565{
Guido van Rossum3165fe61992-09-25 21:59:05 +00001566 object *f = sysget("stdout");
1567 if (softspace(f, 0))
1568 writestring("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001569}
1570
Guido van Rossum3f5da241990-12-20 15:06:42 +00001571
Guido van Rossum04691fc1992-08-12 15:35:34 +00001572/* Test a value used as condition, e.g., in a for or if statement.
1573 Return -1 if an error occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001574
1575static int
1576testbool(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001577 object *v;
1578{
Guido van Rossum04691fc1992-08-12 15:35:34 +00001579 int res;
Guido van Rossum4965bc81991-05-14 11:51:49 +00001580 if (v == None)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001581 res = 0;
1582 else if (v->ob_type->tp_as_number != NULL)
1583 res = (*v->ob_type->tp_as_number->nb_nonzero)(v);
1584 else if (v->ob_type->tp_as_mapping != NULL)
1585 res = (*v->ob_type->tp_as_mapping->mp_length)(v);
1586 else if (v->ob_type->tp_as_sequence != NULL)
1587 res = (*v->ob_type->tp_as_sequence->sq_length)(v);
1588 else
Guido van Rossumf9a2d331992-08-19 16:41:45 +00001589 res = 1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001590 if (res > 0)
1591 res = 1;
1592 return res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001593}
1594
1595static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001596or(v, w)
1597 object *v, *w;
1598{
1599 if (v->ob_type->tp_as_number != NULL) {
1600 object *x;
1601 object * (*f) FPROTO((object *, object *));
1602 if (coerce(&v, &w) != 0)
1603 return NULL;
1604 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
1605 x = (*f)(v, w);
1606 DECREF(v);
1607 DECREF(w);
1608 if (f != NULL)
1609 return x;
1610 }
1611 err_setstr(TypeError, "bad operand type(s) for |");
1612 return NULL;
1613}
1614
1615static object *
1616xor(v, w)
1617 object *v, *w;
1618{
1619 if (v->ob_type->tp_as_number != NULL) {
1620 object *x;
1621 object * (*f) FPROTO((object *, object *));
1622 if (coerce(&v, &w) != 0)
1623 return NULL;
1624 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
1625 x = (*f)(v, w);
1626 DECREF(v);
1627 DECREF(w);
1628 if (f != NULL)
1629 return x;
1630 }
1631 err_setstr(TypeError, "bad operand type(s) for ^");
1632 return NULL;
1633}
1634
1635static object *
1636and(v, w)
1637 object *v, *w;
1638{
1639 if (v->ob_type->tp_as_number != NULL) {
1640 object *x;
1641 object * (*f) FPROTO((object *, object *));
1642 if (coerce(&v, &w) != 0)
1643 return NULL;
1644 if ((f = v->ob_type->tp_as_number->nb_and) != NULL)
1645 x = (*f)(v, w);
1646 DECREF(v);
1647 DECREF(w);
1648 if (f != NULL)
1649 return x;
1650 }
1651 err_setstr(TypeError, "bad operand type(s) for &");
1652 return NULL;
1653}
1654
1655static object *
1656lshift(v, w)
1657 object *v, *w;
1658{
1659 if (v->ob_type->tp_as_number != NULL) {
1660 object *x;
1661 object * (*f) FPROTO((object *, object *));
1662 if (coerce(&v, &w) != 0)
1663 return NULL;
1664 if ((f = v->ob_type->tp_as_number->nb_lshift) != NULL)
1665 x = (*f)(v, w);
1666 DECREF(v);
1667 DECREF(w);
1668 if (f != NULL)
1669 return x;
1670 }
1671 err_setstr(TypeError, "bad operand type(s) for <<");
1672 return NULL;
1673}
1674
1675static object *
1676rshift(v, w)
1677 object *v, *w;
1678{
1679 if (v->ob_type->tp_as_number != NULL) {
1680 object *x;
1681 object * (*f) FPROTO((object *, object *));
1682 if (coerce(&v, &w) != 0)
1683 return NULL;
1684 if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
1685 x = (*f)(v, w);
1686 DECREF(v);
1687 DECREF(w);
1688 if (f != NULL)
1689 return x;
1690 }
1691 err_setstr(TypeError, "bad operand type(s) for >>");
1692 return NULL;
1693}
1694
1695static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001696add(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001697 object *v, *w;
1698{
Guido van Rossume6eefc21992-08-14 12:06:52 +00001699 if (v->ob_type->tp_as_sequence != NULL)
1700 return (*v->ob_type->tp_as_sequence->sq_concat)(v, w);
1701 else if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001702 object *x;
1703 if (coerce(&v, &w) != 0)
1704 return NULL;
1705 x = (*v->ob_type->tp_as_number->nb_add)(v, w);
1706 DECREF(v);
1707 DECREF(w);
1708 return x;
1709 }
Guido van Rossum34679b71993-01-26 13:33:44 +00001710 err_setstr(TypeError, "bad operand type(s) for +");
1711 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001712}
1713
1714static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001715sub(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001716 object *v, *w;
1717{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001718 if (v->ob_type->tp_as_number != NULL) {
1719 object *x;
1720 if (coerce(&v, &w) != 0)
1721 return NULL;
1722 x = (*v->ob_type->tp_as_number->nb_subtract)(v, w);
1723 DECREF(v);
1724 DECREF(w);
1725 return x;
1726 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001727 err_setstr(TypeError, "bad operand type(s) for -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001728 return NULL;
1729}
1730
1731static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001732mul(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001733 object *v, *w;
1734{
1735 typeobject *tp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001736 tp = v->ob_type;
1737 if (tp->tp_as_number != NULL &&
1738 w->ob_type->tp_as_sequence != NULL &&
1739 !is_instanceobject(v)) {
1740 /* number*sequence -- swap v and w */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001741 object *tmp = v;
1742 v = w;
1743 w = tmp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001744 tp = v->ob_type;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001745 }
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001746 if (tp->tp_as_number != NULL) {
1747 object *x;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001748 if (is_instanceobject(v)) {
1749 /* Instances of user-defined classes get their
1750 other argument uncoerced, so they may
1751 implement sequence*number as well as
1752 number*number. */
1753 INCREF(v);
1754 INCREF(w);
1755 }
1756 else if (coerce(&v, &w) != 0)
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001757 return NULL;
1758 x = (*v->ob_type->tp_as_number->nb_multiply)(v, w);
1759 DECREF(v);
1760 DECREF(w);
1761 return x;
1762 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001763 if (tp->tp_as_sequence != NULL) {
1764 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001765 err_setstr(TypeError,
1766 "can't multiply sequence with non-int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001767 return NULL;
1768 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001769 return (*tp->tp_as_sequence->sq_repeat)
1770 (v, (int)getintvalue(w));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001771 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001772 err_setstr(TypeError, "bad operand type(s) for *");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001773 return NULL;
1774}
1775
1776static object *
Guido van Rossum40d0b7e1990-12-20 23:03:11 +00001777divide(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001778 object *v, *w;
1779{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001780 if (v->ob_type->tp_as_number != NULL) {
1781 object *x;
1782 if (coerce(&v, &w) != 0)
1783 return NULL;
1784 x = (*v->ob_type->tp_as_number->nb_divide)(v, w);
1785 DECREF(v);
1786 DECREF(w);
1787 return x;
1788 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001789 err_setstr(TypeError, "bad operand type(s) for /");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001790 return NULL;
1791}
1792
1793static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001794rem(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001795 object *v, *w;
1796{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001797 if (v->ob_type->tp_as_number != NULL) {
1798 object *x;
1799 if (coerce(&v, &w) != 0)
1800 return NULL;
1801 x = (*v->ob_type->tp_as_number->nb_remainder)(v, w);
1802 DECREF(v);
1803 DECREF(w);
1804 return x;
1805 }
Guido van Rossume5372401993-03-16 12:15:04 +00001806 if (is_stringobject(v)) {
1807 return formatstring(v, w);
1808 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001809 err_setstr(TypeError, "bad operand type(s) for %");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001810 return NULL;
1811}
1812
1813static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001814neg(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001815 object *v;
1816{
1817 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001818 return (*v->ob_type->tp_as_number->nb_negative)(v);
1819 err_setstr(TypeError, "bad operand type(s) for unary -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001820 return NULL;
1821}
1822
1823static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001824pos(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001825 object *v;
1826{
1827 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001828 return (*v->ob_type->tp_as_number->nb_positive)(v);
1829 err_setstr(TypeError, "bad operand type(s) for unary +");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001830 return NULL;
1831}
1832
1833static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001834invert(v)
1835 object *v;
1836{
Guido van Rossum9b1d33b1992-02-11 15:56:02 +00001837 object * (*f) FPROTO((object *));
Guido van Rossum7928cd71991-10-24 14:59:31 +00001838 if (v->ob_type->tp_as_number != NULL &&
1839 (f = v->ob_type->tp_as_number->nb_invert) != NULL)
1840 return (*f)(v);
1841 err_setstr(TypeError, "bad operand type(s) for unary ~");
1842 return NULL;
1843}
1844
1845static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001846not(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001847 object *v;
1848{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001849 int outcome = testbool(v);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001850 object *w;
1851 if (outcome < 0)
1852 return NULL;
1853 if (outcome == 0)
1854 w = True;
1855 else
1856 w = False;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001857 INCREF(w);
1858 return w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001859}
Guido van Rossum83bf35c1991-07-27 21:32:34 +00001860/* External interface to call any callable object. The arg may be NULL. */
1861
1862object *
1863call_object(func, arg)
1864 object *func;
1865 object *arg;
1866{
1867 if (is_instancemethodobject(func) || is_funcobject(func))
1868 return call_function(func, arg);
1869 else
1870 return call_builtin(func, arg);
1871}
1872
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001873static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001874call_builtin(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001875 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001876 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001877{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001878 if (is_methodobject(func)) {
1879 method meth = getmethod(func);
1880 object *self = getself(func);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001881 if (!getvarargs(func) && arg != NULL && is_tupleobject(arg)) {
1882 int size = gettuplesize(arg);
1883 if (size == 1)
1884 arg = gettupleitem(arg, 0);
1885 else if (size == 0)
1886 arg = NULL;
1887 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001888 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001889 }
1890 if (is_classobject(func)) {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001891 if (arg != NULL &&
1892 !(is_tupleobject(arg) &&
1893 gettuplesize(arg) == 0)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001894 err_setstr(TypeError,
1895 "classobject() allows no arguments");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001896 return NULL;
1897 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001898 return newinstanceobject(func);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001899 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001900 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001901 return NULL;
1902}
1903
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001904static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001905call_function(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001906 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001907 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001908{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001909 object *newarg = NULL;
1910 object *newlocals, *newglobals;
1911 object *co, *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001912
Guido van Rossume8122f11991-05-05 20:03:07 +00001913 if (is_instancemethodobject(func)) {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001914 int argcount;
Guido van Rossume8122f11991-05-05 20:03:07 +00001915 object *self = instancemethodgetself(func);
1916 func = instancemethodgetfunc(func);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001917 if (arg == NULL)
1918 argcount = 0;
1919 else if (is_tupleobject(arg))
1920 argcount = gettuplesize(arg);
1921 else
1922 argcount = 1;
1923 newarg = newtupleobject(argcount + 1);
1924 if (newarg == NULL)
1925 return NULL;
1926 INCREF(self);
1927 settupleitem(newarg, 0, self);
1928 if (arg != NULL && !is_tupleobject(arg)) {
1929 INCREF(arg);
1930 settupleitem(newarg, 1, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001931 }
1932 else {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001933 int i;
1934 object *v;
1935 for (i = 0; i < argcount; i++) {
1936 v = gettupleitem(arg, i);
1937 XINCREF(v);
1938 settupleitem(newarg, i+1, v);
1939 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001940 }
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001941 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001942 }
1943 else {
1944 if (!is_funcobject(func)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001945 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001946 return NULL;
1947 }
1948 }
1949
Guido van Rossum3f5da241990-12-20 15:06:42 +00001950 co = getfunccode(func);
1951 if (co == NULL) {
1952 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001953 return NULL;
1954 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001955 if (!is_codeobject(co)) {
1956 fprintf(stderr, "XXX Bad code\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001957 abort();
1958 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001959 newlocals = newdictobject();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001960 if (newlocals == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001961 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001962 return NULL;
1963 }
1964
Guido van Rossum3f5da241990-12-20 15:06:42 +00001965 newglobals = getfuncglobals(func);
1966 INCREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001967
Guido van Rossum3f5da241990-12-20 15:06:42 +00001968 v = eval_code((codeobject *)co, newglobals, newlocals, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001969
Guido van Rossum3f5da241990-12-20 15:06:42 +00001970 DECREF(newlocals);
1971 DECREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001972
Guido van Rossum3f5da241990-12-20 15:06:42 +00001973 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001974
1975 return v;
1976}
1977
1978static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001979apply_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001980 object *v, *w;
1981{
1982 typeobject *tp = v->ob_type;
1983 if (tp->tp_as_sequence == NULL && tp->tp_as_mapping == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001984 err_setstr(TypeError, "unsubscriptable object");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001985 return NULL;
1986 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001987 if (tp->tp_as_mapping != NULL) {
1988 return (*tp->tp_as_mapping->mp_subscript)(v, w);
1989 }
1990 else {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001991 int i;
1992 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001993 err_setstr(TypeError, "sequence subscript not int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001994 return NULL;
1995 }
1996 i = getintvalue(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001997 if (i < 0) {
1998 int len = (*tp->tp_as_sequence->sq_length)(v);
1999 if (len < 0)
2000 return NULL;
2001 i += len;
2002 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002003 return (*tp->tp_as_sequence->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002004 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002005}
2006
2007static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002008loop_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002009 object *v, *w;
2010{
2011 sequence_methods *sq = v->ob_type->tp_as_sequence;
2012 int i, n;
2013 if (sq == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002014 err_setstr(TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002015 return NULL;
2016 }
2017 i = getintvalue(w);
2018 n = (*sq->sq_length)(v);
Guido van Rossumd014ea61992-11-26 10:30:26 +00002019 if (n < 0)
2020 return NULL; /* Exception */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002021 if (i >= n)
2022 return NULL; /* End of loop */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002023 return (*sq->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002024}
2025
2026static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00002027slice_index(v, isize, pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002028 object *v;
2029 int isize;
2030 int *pi;
2031{
2032 if (v != NULL) {
2033 if (!is_intobject(v)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002034 err_setstr(TypeError, "slice index must be int");
2035 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002036 }
2037 *pi = getintvalue(v);
2038 if (*pi < 0)
2039 *pi += isize;
2040 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002041 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002042}
2043
2044static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002045apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002046 object *u, *v, *w;
2047{
2048 typeobject *tp = u->ob_type;
2049 int ilow, ihigh, isize;
2050 if (tp->tp_as_sequence == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002051 err_setstr(TypeError, "only sequences can be sliced");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002052 return NULL;
2053 }
2054 ilow = 0;
2055 isize = ihigh = (*tp->tp_as_sequence->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002056 if (isize < 0)
2057 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002058 if (slice_index(v, isize, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002059 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002060 if (slice_index(w, isize, &ihigh) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002061 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002062 return (*tp->tp_as_sequence->sq_slice)(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002063}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002064
2065static int
2066assign_subscript(w, key, v) /* w[key] = v */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002067 object *w;
2068 object *key;
2069 object *v;
2070{
2071 typeobject *tp = w->ob_type;
2072 sequence_methods *sq;
2073 mapping_methods *mp;
2074 int (*func)();
Guido van Rossum04691fc1992-08-12 15:35:34 +00002075 if ((mp = tp->tp_as_mapping) != NULL &&
2076 (func = mp->mp_ass_subscript) != NULL) {
2077 return (*func)(w, key, v);
2078 }
2079 else if ((sq = tp->tp_as_sequence) != NULL &&
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002080 (func = sq->sq_ass_item) != NULL) {
2081 if (!is_intobject(key)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002082 err_setstr(TypeError,
Guido van Rossum98256aa1991-12-24 13:25:19 +00002083 "sequence subscript must be integer (assign or del)");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002084 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002085 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00002086 else {
2087 int i = getintvalue(key);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002088 if (i < 0) {
2089 int len = (*sq->sq_length)(w);
2090 if (len < 0)
2091 return -1;
2092 i += len;
2093 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00002094 return (*func)(w, i, v);
2095 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002096 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002097 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002098 err_setstr(TypeError,
2099 "can't assign to this subscripted object");
2100 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002101 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002102}
2103
Guido van Rossum3f5da241990-12-20 15:06:42 +00002104static int
2105assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002106 object *u, *v, *w, *x;
2107{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002108 sequence_methods *sq = u->ob_type->tp_as_sequence;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002109 int ilow, ihigh, isize;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002110 if (sq == NULL) {
2111 err_setstr(TypeError, "assign to slice of non-sequence");
2112 return -1;
2113 }
2114 if (sq == NULL || sq->sq_ass_slice == NULL) {
2115 err_setstr(TypeError, "unassignable slice");
2116 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002117 }
2118 ilow = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002119 isize = ihigh = (*sq->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002120 if (isize < 0)
2121 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002122 if (slice_index(v, isize, &ilow) != 0)
2123 return -1;
2124 if (slice_index(w, isize, &ihigh) != 0)
2125 return -1;
2126 return (*sq->sq_ass_slice)(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002127}
2128
2129static int
2130cmp_exception(err, v)
2131 object *err, *v;
2132{
2133 if (is_tupleobject(v)) {
2134 int i, n;
2135 n = gettuplesize(v);
2136 for (i = 0; i < n; i++) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00002137 /* Test recursively */
2138 if (cmp_exception(err, gettupleitem(v, i)))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002139 return 1;
2140 }
2141 return 0;
2142 }
2143 return err == v;
2144}
2145
Guido van Rossum3f5da241990-12-20 15:06:42 +00002146static int
2147cmp_member(v, w)
2148 object *v, *w;
2149{
2150 int i, n, cmp;
2151 object *x;
2152 sequence_methods *sq;
2153 /* Special case for char in string */
2154 if (is_stringobject(w)) {
2155 register char *s, *end;
2156 register char c;
2157 if (!is_stringobject(v) || getstringsize(v) != 1) {
2158 err_setstr(TypeError,
2159 "string member test needs char left operand");
2160 return -1;
2161 }
2162 c = getstringvalue(v)[0];
2163 s = getstringvalue(w);
2164 end = s + getstringsize(w);
2165 while (s < end) {
2166 if (c == *s++)
2167 return 1;
2168 }
2169 return 0;
2170 }
2171 sq = w->ob_type->tp_as_sequence;
2172 if (sq == NULL) {
2173 err_setstr(TypeError,
2174 "'in' or 'not in' needs sequence right argument");
2175 return -1;
2176 }
2177 n = (*sq->sq_length)(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002178 if (n < 0)
2179 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002180 for (i = 0; i < n; i++) {
2181 x = (*sq->sq_item)(w, i);
2182 cmp = cmpobject(v, x);
2183 XDECREF(x);
2184 if (cmp == 0)
2185 return 1;
2186 }
2187 return 0;
2188}
2189
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002190static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002191cmp_outcome(op, v, w)
Guido van Rossum5b7313a1992-04-06 13:24:57 +00002192 int op;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002193 register object *v;
2194 register object *w;
2195{
2196 register int cmp;
2197 register int res = 0;
2198 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002199 case IS:
2200 case IS_NOT:
2201 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002202 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002203 res = !res;
2204 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002205 case IN:
2206 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002207 res = cmp_member(v, w);
2208 if (res < 0)
2209 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002210 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002211 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002212 break;
2213 case EXC_MATCH:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002214 res = cmp_exception(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002215 break;
2216 default:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002217 cmp = cmpobject(v, w);
2218 switch (op) {
2219 case LT: res = cmp < 0; break;
2220 case LE: res = cmp <= 0; break;
2221 case EQ: res = cmp == 0; break;
2222 case NE: res = cmp != 0; break;
2223 case GT: res = cmp > 0; break;
2224 case GE: res = cmp >= 0; break;
2225 /* XXX no default? (res is initialized to 0 though) */
2226 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002227 }
2228 v = res ? True : False;
2229 INCREF(v);
2230 return v;
2231}
2232
Guido van Rossum3f5da241990-12-20 15:06:42 +00002233static int
2234import_from(locals, v, name)
2235 object *locals;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002236 object *v;
Guido van Rossumdf62e441991-08-16 08:56:04 +00002237 object *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002238{
2239 object *w, *x;
2240 w = getmoduledict(v);
Guido van Rossumdf62e441991-08-16 08:56:04 +00002241 if (getstringvalue(name)[0] == '*') {
Guido van Rossume9736fc1990-11-18 17:33:06 +00002242 int i;
2243 int n = getdictsize(w);
2244 for (i = 0; i < n; i++) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00002245 name = getdict2key(w, i);
2246 if (name == NULL || getstringvalue(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002247 continue;
Guido van Rossumdf62e441991-08-16 08:56:04 +00002248 x = dict2lookup(w, name);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002249 if (x == NULL) {
2250 /* XXX can't happen? */
Guido van Rossum98256aa1991-12-24 13:25:19 +00002251 err_setstr(SystemError, getstringvalue(name));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002252 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002253 }
Guido van Rossumdf62e441991-08-16 08:56:04 +00002254 if (dict2insert(locals, name, x) != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002255 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002256 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002257 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002258 }
2259 else {
Guido van Rossumdf62e441991-08-16 08:56:04 +00002260 x = dict2lookup(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002261 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00002262 char buf[250];
Guido van Rossum16dfd291992-02-05 11:17:30 +00002263 sprintf(buf, "cannot import name %.230s",
Guido van Rossum98256aa1991-12-24 13:25:19 +00002264 getstringvalue(name));
2265 err_setstr(ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002266 return -1;
2267 }
2268 else
Guido van Rossumdf62e441991-08-16 08:56:04 +00002269 return dict2insert(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002270 }
2271}
2272
2273static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002274build_class(v, w)
Guido van Rossume9736fc1990-11-18 17:33:06 +00002275 object *v; /* None or tuple containing base classes */
2276 object *w; /* dictionary */
2277{
2278 if (is_tupleobject(v)) {
2279 int i;
2280 for (i = gettuplesize(v); --i >= 0; ) {
2281 object *x = gettupleitem(v, i);
2282 if (!is_classobject(x)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002283 err_setstr(TypeError,
2284 "base is not a class object");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002285 return NULL;
2286 }
2287 }
2288 }
2289 else {
2290 v = NULL;
2291 }
2292 if (!is_dictobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002293 err_setstr(SystemError, "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002294 return NULL;
2295 }
Guido van Rossum7e3090c1991-10-20 20:26:16 +00002296 return newclassobject(v, w, (object *) NULL);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002297}