annotate Python/ceval.c @ 69:cccd534f2280 legacy-trunk

Initial revision
author Guido van Rossum <guido@python.org>
date Sun, 18 Nov 1990 17:27:39 +0000
parents
children 5e8a0b40a4bd
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1 /* Evaluate compiled expression nodes */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3 #include <stdio.h>
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
4 #include <ctype.h>
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
5 #include "string.h"
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
6
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
7 #include "PROTO.h"
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
8 #include "object.h"
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
9 #include "objimpl.h"
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
10 #include "intobject.h"
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
11 #include "stringobject.h"
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
12 #include "tupleobject.h"
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
13 #include "listobject.h"
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
14 #include "dictobject.h"
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
15 #include "builtinobject.h"
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
16 #include "methodobject.h"
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
17 #include "moduleobject.h"
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
18 #include "context.h"
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
19 #include "funcobject.h"
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
20 #include "classobject.h"
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
21 #include "token.h"
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
22 #include "graminit.h"
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
23 #include "run.h"
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
24 #include "import.h"
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
25 #include "support.h"
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
26 #include "sysmodule.h"
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
27 #include "compile.h"
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
28 #include "opcode.h"
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
29
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
30 /* List access macros */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
31 #ifdef NDEBUG
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
32 #define GETITEM(v, i) GETLISTITEM((listobject *)(v), (i))
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
33 #define GETITEMNAME(v, i) GETSTRINGVALUE((stringobject *)GETITEM((v), (i)))
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
34 #else
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
35 #define GETITEM(v, i) getlistitem((v), (i))
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
36 #define GETITEMNAME(v, i) getstringvalue(getlistitem((v), (i)))
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
37 #endif
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
38
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
39 typedef struct {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
40 int b_type; /* what kind of block this is */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
41 int b_handler; /* where to jump to find handler */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
42 int b_level; /* value stack level to pop to */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
43 } block;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
44
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
45 typedef struct _frame {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
46 OB_HEAD
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
47 struct _frame *f_back; /* previous frame, or NULL */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
48 codeobject *f_code; /* code segment */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
49 object *f_locals; /* local symbol table (dictobject) */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
50 object *f_globals; /* global symbol table (dictobject) */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
51 object **f_valuestack; /* malloc'ed array */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
52 block *f_blockstack; /* malloc'ed array */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
53 int f_nvalues; /* size of f_valuestack */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
54 int f_nblocks; /* size of f_blockstack */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
55 int f_ivalue; /* index in f_valuestack */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
56 int f_iblock; /* index in f_blockstack */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
57 int f_nexti; /* index in f_code (next instruction) */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
58 } frameobject;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
59
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
60 #define is_frameobject(op) ((op)->ob_type == &Frametype)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
61
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
62 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
63 frame_dealloc(f)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
64 frameobject *f;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
65 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
66 XDECREF(f->f_back);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
67 XDECREF(f->f_code);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
68 XDECREF(f->f_locals);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
69 XDECREF(f->f_globals);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
70 XDEL(f->f_valuestack);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
71 XDEL(f->f_blockstack);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
72 DEL(f);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
73 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
74 typeobject Frametype = {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
75 OB_HEAD_INIT(&Typetype)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
76 0,
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
77 "frame",
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
78 sizeof(frameobject),
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
79 0,
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
80 frame_dealloc, /*tp_dealloc*/
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
81 0, /*tp_print*/
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
82 0, /*tp_getattr*/
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
83 0, /*tp_setattr*/
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
84 0, /*tp_compare*/
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
85 0, /*tp_repr*/
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
86 0, /*tp_as_number*/
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
87 0, /*tp_as_sequence*/
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
88 0, /*tp_as_mapping*/
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
89 };
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
90
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
91 static frameobject * newframeobject PROTO(
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
92 (frameobject *, codeobject *, object *, object *, int, int));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
93
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
94 static frameobject *
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
95 newframeobject(back, code, locals, globals, nvalues, nblocks)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
96 frameobject *back;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
97 codeobject *code;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
98 object *locals;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
99 object *globals;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
100 int nvalues;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
101 int nblocks;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
102 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
103 frameobject *f;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
104 if ((back != NULL && !is_frameobject(back)) ||
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
105 code == NULL || !is_codeobject(code) ||
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
106 locals == NULL || !is_dictobject(locals) ||
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
107 globals == NULL || !is_dictobject(globals) ||
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
108 nvalues < 0 || nblocks < 0) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
109 err_badcall();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
110 return NULL;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
111 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
112 f = NEWOBJ(frameobject, &Frametype);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
113 if (f != NULL) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
114 if (back)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
115 INCREF(back);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
116 f->f_back = back;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
117 INCREF(code);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
118 f->f_code = code;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
119 INCREF(locals);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
120 f->f_locals = locals;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
121 INCREF(globals);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
122 f->f_globals = globals;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
123 f->f_valuestack = NEW(object *, nvalues+1);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
124 f->f_blockstack = NEW(block, nblocks+1);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
125 f->f_nvalues = nvalues;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
126 f->f_nblocks = nblocks;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
127 f->f_ivalue = f->f_iblock = f->f_nexti = 0;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
128 if (f->f_valuestack == NULL || f->f_blockstack == NULL) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
129 err_nomem();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
130 DECREF(f);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
131 f = NULL;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
132 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
133 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
134 return f;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
135 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
136
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
137 #define Push(f, v) ((f)->f_valuestack[(f)->f_ivalue++] = (v))
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
138 #define Pop(f) ((f)->f_valuestack[--(f)->f_ivalue])
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
139 #define Top(f) ((f)->f_valuestack[(f)->f_ivalue-1])
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
140 #define Empty(f) ((f)->f_ivalue == 0)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
141 #define Full(f) ((f)->f_ivalue == (f)->f_nvalues)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
142 #define Nextbyte(f) (GETSTRINGVALUE((f)->f_code->co_code)[(f)->f_nexti++])
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
143 #define Peekbyte(f) (GETSTRINGVALUE((f)->f_code->co_code)[(f)->f_nexti])
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
144 #define Prevbyte(f) (GETSTRINGVALUE((f)->f_code->co_code)[(f)->f_nexti-1])
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
145 #define Jumpto(f, x) ((f)->f_nexti = (x))
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
146 #define Jumpby(f, x) ((f)->f_nexti += (x))
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
147 #define Getconst(f, i) (GETITEM((f)->f_code->co_consts, (i)))
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
148 #define Getname(f, i) (GETITEMNAME((f)->f_code->co_names, (i)))
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
149
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
150 /* Corresponding functions, for debugging */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
151
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
152 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
153 push(f, v)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
154 frameobject *f;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
155 object *v;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
156 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
157 if (Full(f)) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
158 printf("stack overflow\n");
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
159 abort();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
160 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
161 Push(f, v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
162 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
163
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
164 static object *
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
165 pop(f)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
166 frameobject *f;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
167 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
168 if (Empty(f)) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
169 printf("stack underflow\n");
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
170 abort();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
171 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
172 return Pop(f);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
173 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
174
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
175 static object *
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
176 top(f)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
177 frameobject *f;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
178 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
179 if (Empty(f)) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
180 printf("stack underflow\n");
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
181 abort();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
182 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
183 return Top(f);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
184 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
185
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
186 static int
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
187 nextbyte(f)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
188 frameobject *f;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
189 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
190 stringobject *code = (f)->f_code->co_code;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
191 if (f->f_nexti >= getstringsize((object *)code)) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
192 printf("ran off end of instructions\n");
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
193 abort();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
194 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
195 return GETSTRINGVALUE(code)[f->f_nexti++];
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
196 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
197
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
198 /* Tracing versions */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
199
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
200 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
201 trace_push(f, v)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
202 frameobject *f;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
203 object *v;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
204 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
205 printf("\tpush ");
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
206 printobject(v, stdout, 0);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
207 printf("\n");
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
208 push(f, v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
209 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
210
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
211 static object *
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
212 trace_pop(f)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
213 frameobject *f;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
214 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
215 object *v;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
216 v = pop(f);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
217 printf("\tpop ");
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
218 printobject(v, stdout, 0);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
219 printf("\n");
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
220 return v;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
221 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
222
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
223 static object *
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
224 trace_top(f)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
225 frameobject *f;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
226 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
227 object *v;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
228 v = top(f);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
229 printf("\ttop ");
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
230 printobject(v, stdout, 0);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
231 printf("\n");
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
232 return v;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
233 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
234
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
235 static int
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
236 trace_nextop(f)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
237 frameobject *f;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
238 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
239 int op;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
240 int arg;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
241
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
242 printf("%d: ", f->f_nexti);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
243 op = nextbyte(f);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
244 if (op < HAVE_ARGUMENT)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
245 printf("op %3d\n", op);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
246 else {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
247 arg = Peekbyte(f);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
248 printf("op %3d arg %3d\n", op, arg);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
249 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
250 return op;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
251 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
252
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
253 /* Block management */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
254
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
255 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
256 setup_block(f, type, handler)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
257 frameobject *f;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
258 int type;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
259 int handler;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
260 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
261 block *b;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
262 if (f->f_iblock >= f->f_nblocks) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
263 printf("block stack overflow\n");
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
264 abort();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
265 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
266 b = &f->f_blockstack[f->f_iblock++];
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
267 b->b_type = type;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
268 b->b_level = f->f_ivalue;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
269 b->b_handler = handler + f->f_nexti;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
270 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
271
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
272 static block *
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
273 pop_block(f)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
274 frameobject *f;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
275 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
276 block *b;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
277 if (f->f_iblock <= 0) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
278 printf("block stack underflow\n");
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
279 abort();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
280 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
281 b = &f->f_blockstack[--f->f_iblock];
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
282 while (f->f_ivalue > b->b_level) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
283 object *v = Pop(f);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
284 XDECREF(v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
285 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
286 return b;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
287 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
288
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
289
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
290 /* XXX Mixing "print ...," and direct file I/O on stdin/stdout
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
291 XXX has some bad consequences. The needspace flag should
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
292 XXX really be part of the file object. */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
293
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
294 static int needspace;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
295
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
296 void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
297 flushline()
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
298 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
299 FILE *fp = sysgetfile("stdout", stdout);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
300 if (needspace) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
301 fprintf(fp, "\n");
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
302 needspace = 0;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
303 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
304 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
305
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
306 static object *
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
307 checkerror(ctx, v)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
308 context *ctx;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
309 object *v;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
310 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
311 if (v == NULL)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
312 puterrno(ctx);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
313 return v;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
314 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
315
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
316 static object *
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
317 add(ctx, v, w)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
318 context *ctx;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
319 object *v, *w;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
320 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
321 if (v->ob_type->tp_as_number != NULL)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
322 v = (*v->ob_type->tp_as_number->nb_add)(v, w);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
323 else if (v->ob_type->tp_as_sequence != NULL)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
324 v = (*v->ob_type->tp_as_sequence->sq_concat)(v, w);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
325 else {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
326 type_error(ctx, "+ not supported by operands");
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
327 return NULL;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
328 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
329 return checkerror(ctx, v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
330 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
331
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
332 static object *
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
333 sub(ctx, v, w)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
334 context *ctx;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
335 object *v, *w;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
336 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
337 if (v->ob_type->tp_as_number != NULL)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
338 return checkerror(ctx,
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
339 (*v->ob_type->tp_as_number->nb_subtract)(v, w));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
340 type_error(ctx, "bad operand type(s) for -");
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
341 return NULL;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
342 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
343
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
344 static object *
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
345 mul(ctx, v, w)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
346 context *ctx;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
347 object *v, *w;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
348 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
349 typeobject *tp;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
350 if (is_intobject(v) && w->ob_type->tp_as_sequence != NULL) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
351 /* int*sequence -- swap v and w */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
352 object *tmp = v;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
353 v = w;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
354 w = tmp;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
355 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
356 tp = v->ob_type;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
357 if (tp->tp_as_number != NULL)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
358 return checkerror(ctx, (*tp->tp_as_number->nb_multiply)(v, w));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
359 if (tp->tp_as_sequence != NULL) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
360 if (!is_intobject(w)) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
361 type_error(ctx, "can't multiply sequence with non-int");
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
362 return NULL;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
363 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
364 if (tp->tp_as_sequence->sq_repeat == NULL) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
365 type_error(ctx, "sequence does not support *");
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
366 return NULL;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
367 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
368 return checkerror(ctx, (*tp->tp_as_sequence->sq_repeat)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
369 (v, (int)getintvalue(w)));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
370 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
371 type_error(ctx, "bad operand type(s) for *");
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
372 return NULL;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
373 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
374
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
375 static object *
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
376 div(ctx, v, w)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
377 context *ctx;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
378 object *v, *w;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
379 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
380 if (v->ob_type->tp_as_number != NULL)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
381 return checkerror(ctx,
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
382 (*v->ob_type->tp_as_number->nb_divide)(v, w));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
383 type_error(ctx, "bad operand type(s) for /");
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
384 return NULL;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
385 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
386
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
387 static object *
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
388 rem(ctx, v, w)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
389 context *ctx;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
390 object *v, *w;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
391 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
392 if (v->ob_type->tp_as_number != NULL)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
393 return checkerror(ctx,
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
394 (*v->ob_type->tp_as_number->nb_remainder)(v, w));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
395 type_error(ctx, "bad operand type(s) for %");
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
396 return NULL;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
397 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
398
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
399 static object *
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
400 neg(ctx, v)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
401 context *ctx;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
402 object *v;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
403 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
404 if (v->ob_type->tp_as_number != NULL)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
405 return checkerror(ctx,
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
406 (*v->ob_type->tp_as_number->nb_negative)(v));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
407 type_error(ctx, "bad operand type(s) for unary -");
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
408 return NULL;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
409 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
410
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
411 static object *
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
412 pos(ctx, v)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
413 context *ctx;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
414 object *v;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
415 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
416 if (v->ob_type->tp_as_number != NULL)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
417 return checkerror(ctx,
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
418 (*v->ob_type->tp_as_number->nb_positive)(v));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
419 type_error(ctx, "bad operand type(s) for unary +");
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
420 return NULL;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
421 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
422
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
423 static object *
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
424 not(ctx, v)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
425 context *ctx;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
426 object *v;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
427 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
428 int outcome = testbool(ctx, v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
429 if (ctx->ctx_exception)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
430 return NULL;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
431 return checkerror(ctx, newintobject((long) !outcome));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
432 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
433
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
434 static object *
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
435 call_builtin(ctx, func, args)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
436 context *ctx;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
437 object *func;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
438 object *args;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
439 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
440 if (is_builtinobject(func)) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
441 function funcptr = getbuiltinfunction(func);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
442 return (*funcptr)(ctx, args);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
443 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
444 if (is_methodobject(func)) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
445 method meth = getmethod(func);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
446 object *self = getself(func);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
447 return checkerror(ctx, (*meth)(self, args));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
448 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
449 if (is_classobject(func)) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
450 if (args != NULL) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
451 type_error(ctx, "classobject() allows no arguments");
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
452 return NULL;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
453 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
454 return checkerror(ctx, newclassmemberobject(func));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
455 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
456 type_error(ctx, "call of non-function");
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
457 return NULL;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
458 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
459
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
460 static object *eval_compiled PROTO((context *, codeobject *, object *, int));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
461
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
462 /* XXX Eventually, this should not call eval_compiled recursively
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
463 but create a new frame */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
464
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
465 static object *
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
466 call_function(ctx, func, args)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
467 context *ctx;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
468 object *func;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
469 object *args;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
470 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
471 object *newargs = NULL;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
472 object *savelocals, *newlocals, *saveglobals;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
473 object *c, *v;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
474
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
475 if (is_classmethodobject(func)) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
476 object *self = classmethodgetself(func);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
477 func = classmethodgetfunc(func);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
478 if (args == NULL) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
479 args = self;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
480 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
481 else {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
482 newargs = checkerror(ctx, newtupleobject(2));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
483 if (newargs == NULL)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
484 return NULL;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
485 INCREF(self);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
486 INCREF(args);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
487 settupleitem(newargs, 0, self);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
488 settupleitem(newargs, 1, args);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
489 args = newargs;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
490 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
491 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
492 else {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
493 if (!is_funcobject(func)) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
494 type_error(ctx, "call of non-function");
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
495 return NULL;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
496 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
497 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
498
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
499 c = checkerror(ctx, getfunccode(func));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
500 if (c == NULL) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
501 XDECREF(newargs);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
502 return NULL;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
503 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
504 if (!is_codeobject(c)) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
505 printf("Bad code\n");
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
506 abort();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
507 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
508 newlocals = checkerror(ctx, newdictobject());
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
509 if (newlocals == NULL) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
510 XDECREF(newargs);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
511 return NULL;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
512 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
513
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
514 savelocals = ctx->ctx_locals;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
515 ctx->ctx_locals = newlocals;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
516 saveglobals = ctx->ctx_globals;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
517 ctx->ctx_globals = getfuncglobals(func);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
518
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
519 v = eval_compiled(ctx, (codeobject *)c, args, 1);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
520
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
521 DECREF(ctx->ctx_locals);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
522 ctx->ctx_locals = savelocals;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
523 ctx->ctx_globals = saveglobals;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
524
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
525 XDECREF(newargs);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
526
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
527 return v;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
528 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
529
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
530 static object *
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
531 apply_subscript(ctx, v, w)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
532 context *ctx;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
533 object *v, *w;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
534 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
535 typeobject *tp = v->ob_type;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
536 if (tp->tp_as_sequence == NULL && tp->tp_as_mapping == NULL) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
537 type_error(ctx, "unsubscriptable object");
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
538 return NULL;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
539 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
540 if (tp->tp_as_sequence != NULL) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
541 int i;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
542 if (!is_intobject(w)) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
543 type_error(ctx, "sequence subscript not int");
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
544 return NULL;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
545 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
546 i = getintvalue(w);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
547 return checkerror(ctx, (*tp->tp_as_sequence->sq_item)(v, i));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
548 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
549 return checkerror(ctx, (*tp->tp_as_mapping->mp_subscript)(v, w));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
550 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
551
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
552 static object *
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
553 loop_subscript(ctx, v, w)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
554 context *ctx;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
555 object *v, *w;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
556 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
557 sequence_methods *sq = v->ob_type->tp_as_sequence;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
558 int i, n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
559 if (sq == NULL) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
560 type_error(ctx, "loop over non-sequence");
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
561 return NULL;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
562 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
563 i = getintvalue(w);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
564 n = (*sq->sq_length)(v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
565 if (i >= n)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
566 return NULL; /* End of loop */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
567 return checkerror(ctx, (*sq->sq_item)(v, i));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
568 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
569
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
570 static int
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
571 slice_index(ctx, v, isize, pi)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
572 context *ctx;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
573 object *v;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
574 int isize;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
575 int *pi;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
576 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
577 if (v != NULL) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
578 if (!is_intobject(v)) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
579 type_error(ctx, "slice index must be int");
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
580 return 0;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
581 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
582 *pi = getintvalue(v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
583 if (*pi < 0)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
584 *pi += isize;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
585 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
586 return 1;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
587 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
588
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
589 static object *
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
590 apply_slice(ctx, u, v, w) /* u[v:w] */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
591 context *ctx;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
592 object *u, *v, *w;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
593 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
594 typeobject *tp = u->ob_type;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
595 int ilow, ihigh, isize;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
596 if (tp->tp_as_sequence == NULL) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
597 type_error(ctx, "only sequences can be sliced");
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
598 return NULL;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
599 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
600 ilow = 0;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
601 isize = ihigh = (*tp->tp_as_sequence->sq_length)(u);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
602 if (!slice_index(ctx, v, isize, &ilow))
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
603 return NULL;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
604 if (!slice_index(ctx, w, isize, &ihigh))
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
605 return NULL;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
606 return checkerror(ctx, (*tp->tp_as_sequence->sq_slice)(u, ilow, ihigh));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
607 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
608 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
609 assign_subscript(ctx, w, key, v)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
610 context *ctx;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
611 object *w;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
612 object *key;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
613 object *v;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
614 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
615 typeobject *tp = w->ob_type;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
616 sequence_methods *sq;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
617 mapping_methods *mp;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
618 int (*func)();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
619 int err;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
620 if ((sq = tp->tp_as_sequence) != NULL &&
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
621 (func = sq->sq_ass_item) != NULL) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
622 if (!is_intobject(key)) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
623 type_error(ctx, "sequence subscript must be integer");
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
624 return;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
625 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
626 err = (*func)(w, (int)getintvalue(key), v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
627 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
628 else if ((mp = tp->tp_as_mapping) != NULL &&
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
629 (func = mp->mp_ass_subscript) != NULL) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
630 err = (*func)(w, key, v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
631 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
632 else {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
633 type_error(ctx, "can't assign to this subscripted object");
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
634 return;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
635 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
636 if (err != 0)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
637 puterrno(ctx);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
638 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
639
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
640 static void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
641 assign_slice(ctx, u, v, w, x) /* u[v:w] = x */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
642 context *ctx;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
643 object *u, *v, *w, *x;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
644 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
645 typeobject *tp = u->ob_type;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
646 int ilow, ihigh, isize;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
647 if (tp->tp_as_sequence == NULL ||
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
648 tp->tp_as_sequence->sq_ass_slice == NULL) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
649 type_error(ctx, "unassignable slice");
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
650 return;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
651 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
652 ilow = 0;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
653 isize = ihigh = (*tp->tp_as_sequence->sq_length)(u);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
654 if (!slice_index(ctx, v, isize, &ilow))
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
655 return;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
656 if (!slice_index(ctx, w, isize, &ihigh))
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
657 return;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
658 if ((*tp->tp_as_sequence->sq_ass_slice)(u, ilow, ihigh, x) != 0)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
659 puterrno(ctx);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
660 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
661
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
662 static int
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
663 cmp_exception(err, v)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
664 object *err, *v;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
665 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
666 if (is_tupleobject(v)) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
667 int i, n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
668 n = gettuplesize(v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
669 for (i = 0; i < n; i++) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
670 if (err == gettupleitem(v, i))
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
671 return 1;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
672 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
673 return 0;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
674 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
675 return err == v;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
676 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
677
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
678 static object *
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
679 cmp_outcome(ctx, op, v, w)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
680 register context *ctx;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
681 enum cmp_op op;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
682 register object *v;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
683 register object *w;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
684 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
685 register int cmp;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
686 register int res = 0;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
687 switch (op) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
688 case IN:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
689 case NOT_IN:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
690 cmp = cmp_member(ctx, v, w);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
691 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
692 case IS:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
693 case IS_NOT:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
694 cmp = (v == w);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
695 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
696 case EXC_MATCH:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
697 cmp = cmp_exception(v, w);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
698 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
699 default:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
700 cmp = cmp_values(ctx, v, w);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
701 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
702 if (ctx->ctx_exception)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
703 return NULL;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
704 switch (op) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
705 case EXC_MATCH:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
706 case IS:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
707 case IN: res = cmp; break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
708 case IS_NOT:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
709 case NOT_IN: res = !cmp; break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
710 case LT: res = cmp < 0; break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
711 case LE: res = cmp <= 0; break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
712 case EQ: res = cmp == 0; break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
713 case NE: res = cmp != 0; break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
714 case GT: res = cmp > 0; break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
715 case GE: res = cmp >= 0; break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
716 /* XXX no default? */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
717 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
718 v = res ? True : False;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
719 INCREF(v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
720 return v;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
721 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
722
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
723 static object *
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
724 eval_compiled(ctx, co, arg, needvalue)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
725 context *ctx;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
726 codeobject *co;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
727 object *arg;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
728 int needvalue;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
729 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
730 frameobject *f;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
731 register object *v;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
732 register object *w;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
733 register object *u;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
734 register object *x;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
735 char *name;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
736 int n, i;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
737 enum cmp_op op;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
738 FILE *fp;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
739 #ifndef NDEBUG
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
740 int trace = dictlookup(ctx->ctx_globals, "__trace") != NULL;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
741 #endif
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
742
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
743 f = newframeobject(
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
744 (frameobject *)NULL, /*back*/
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
745 co, /*code*/
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
746 ctx->ctx_locals, /*locals*/
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
747 ctx->ctx_globals, /*globals*/
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
748 50, /*nvalues*/
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
749 20); /*nblocks*/
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
750 if (f == NULL) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
751 puterrno(ctx);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
752 return NULL;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
753 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
754
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
755 #define EMPTY() Empty(f)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
756 #define FULL() Full(f)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
757 #define GETCONST(i) Getconst(f, i)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
758 #define GETNAME(i) Getname(f, i)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
759 #define JUMPTO(x) Jumpto(f, x)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
760 #define JUMPBY(x) Jumpby(f, x)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
761
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
762 #ifdef NDEBUG
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
763
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
764 #define PUSH(v) Push(f, v)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
765 #define TOP() Top(f)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
766 #define POP() Pop(f)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
767 #define NEXTOP() Nextbyte(f)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
768 #define NEXTI() Nextbyte(f)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
769
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
770 #else
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
771
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
772 #define PUSH(v) if(trace) trace_push(f, v); else push(f, v)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
773 #define TOP() (trace ? trace_top(f) : top(f))
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
774 #define POP() (trace ? trace_pop(f) : pop(f))
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
775 #define NEXTOP() (trace ? trace_nextop(f) : nextbyte(f))
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
776 #define NEXTI() (nextbyte(f))
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
777
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
778 #endif
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
779
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
780 if (arg != NULL) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
781 INCREF(arg);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
782 PUSH(arg);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
783 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
784
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
785 while (f->f_nexti < getstringsize((object *)f->f_code->co_code) &&
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
786 !ctx->ctx_exception) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
787
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
788 switch (NEXTOP()) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
789
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
790 case DUP_TOP:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
791 v = TOP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
792 INCREF(v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
793 PUSH(v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
794 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
795
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
796 case POP_TOP:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
797 v = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
798 DECREF(v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
799 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
800
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
801 case ROT_TWO:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
802 v = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
803 w = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
804 PUSH(v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
805 PUSH(w);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
806 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
807
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
808 case ROT_THREE:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
809 v = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
810 w = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
811 x = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
812 PUSH(v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
813 PUSH(x);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
814 PUSH(w);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
815 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
816
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
817 case UNARY_POSITIVE:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
818 v = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
819 u = pos(ctx, v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
820 DECREF(v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
821 PUSH(u);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
822 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
823
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
824 case UNARY_NEGATIVE:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
825 v = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
826 u = neg(ctx, v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
827 DECREF(v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
828 PUSH(u);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
829 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
830
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
831 case UNARY_NOT:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
832 v = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
833 u = not(ctx, v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
834 DECREF(v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
835 PUSH(u);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
836 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
837
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
838 case UNARY_CONVERT:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
839 v = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
840 u = checkerror(ctx, reprobject(v));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
841 DECREF(v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
842 PUSH(u);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
843 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
844
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
845 case UNARY_CALL:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
846 v = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
847 if (is_classmemberobject(v) || is_funcobject(v))
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
848 u = call_function(ctx, v, (object *)NULL);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
849 else
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
850 u = call_builtin(ctx, v, (object *)NULL);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
851 DECREF(v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
852 PUSH(u);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
853 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
854
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
855 case BINARY_MULTIPLY:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
856 w = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
857 v = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
858 u = mul(ctx, v, w);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
859 DECREF(v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
860 DECREF(w);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
861 PUSH(u);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
862 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
863
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
864 case BINARY_DIVIDE:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
865 w = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
866 v = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
867 u = div(ctx, v, w);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
868 DECREF(v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
869 DECREF(w);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
870 PUSH(u);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
871 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
872
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
873 case BINARY_MODULO:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
874 w = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
875 v = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
876 u = rem(ctx, v, w);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
877 DECREF(v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
878 DECREF(w);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
879 PUSH(u);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
880 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
881
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
882 case BINARY_ADD:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
883 w = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
884 v = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
885 u = add(ctx, v, w);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
886 DECREF(v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
887 DECREF(w);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
888 PUSH(u);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
889 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
890
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
891 case BINARY_SUBTRACT:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
892 w = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
893 v = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
894 u = sub(ctx, v, w);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
895 DECREF(v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
896 DECREF(w);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
897 PUSH(u);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
898 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
899
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
900 case BINARY_SUBSCR:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
901 w = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
902 v = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
903 u = apply_subscript(ctx, v, w);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
904 DECREF(v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
905 DECREF(w);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
906 PUSH(u);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
907 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
908
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
909 case BINARY_CALL:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
910 w = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
911 v = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
912 if (is_classmemberobject(v) || is_funcobject(v))
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
913 u = call_function(ctx, v, w);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
914 else
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
915 u = call_builtin(ctx, v, w);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
916 DECREF(v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
917 DECREF(w);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
918 PUSH(u);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
919 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
920
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
921 case SLICE:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
922 w = NULL;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
923 v = NULL;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
924 u = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
925 x = apply_slice(ctx, u, v, w);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
926 DECREF(u);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
927 PUSH(x);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
928 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
929
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
930 case SLICE+1:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
931 w = NULL;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
932 v = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
933 u = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
934 x = apply_slice(ctx, u, v, w);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
935 DECREF(u);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
936 DECREF(v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
937 PUSH(x);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
938 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
939
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
940 case SLICE+2:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
941 w = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
942 v = NULL;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
943 u = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
944 x = apply_slice(ctx, u, v, w);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
945 DECREF(u);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
946 DECREF(w);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
947 PUSH(x);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
948 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
949
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
950 case SLICE+3:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
951 w = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
952 v = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
953 u = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
954 x = apply_slice(ctx, u, v, w);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
955 DECREF(u);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
956 DECREF(v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
957 DECREF(w);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
958 PUSH(x);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
959 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
960
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
961 case STORE_SLICE:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
962 w = NULL;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
963 v = NULL;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
964 u = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
965 x = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
966 assign_slice(ctx, u, v, w, x); /* u[:] = x */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
967 DECREF(x);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
968 DECREF(u);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
969 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
970
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
971 case STORE_SLICE+1:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
972 w = NULL;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
973 v = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
974 u = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
975 x = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
976 assign_slice(ctx, u, v, w, x); /* u[v:] = x */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
977 DECREF(x);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
978 DECREF(u);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
979 DECREF(v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
980 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
981
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
982 case STORE_SLICE+2:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
983 w = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
984 v = NULL;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
985 u = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
986 x = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
987 assign_slice(ctx, u, v, w, x); /* u[:w] = x */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
988 DECREF(x);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
989 DECREF(u);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
990 DECREF(w);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
991 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
992
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
993 case STORE_SLICE+3:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
994 w = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
995 v = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
996 u = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
997 x = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
998 assign_slice(ctx, u, v, w, x); /* u[v:w] = x */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
999 DECREF(x);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1000 DECREF(u);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1001 DECREF(v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1002 DECREF(w);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1003 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1004
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1005 case DELETE_SLICE:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1006 w = NULL;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1007 v = NULL;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1008 u = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1009 x = NULL;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1010 assign_slice(ctx, u, v, w, x); /* del u[:] */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1011 DECREF(u);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1012 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1013
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1014 case DELETE_SLICE+1:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1015 w = NULL;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1016 v = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1017 u = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1018 x = NULL;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1019 assign_slice(ctx, u, v, w, x); /* del u[v:] */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1020 DECREF(u);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1021 DECREF(v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1022 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1023
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1024 case DELETE_SLICE+2:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1025 w = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1026 v = NULL;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1027 u = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1028 x = NULL;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1029 assign_slice(ctx, u, v, w, x); /* del u[:w] */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1030 DECREF(u);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1031 DECREF(w);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1032 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1033
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1034 case DELETE_SLICE+3:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1035 w = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1036 v = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1037 u = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1038 x = NULL;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1039 assign_slice(ctx, u, v, w, x); /* del u[v:w] */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1040 DECREF(u);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1041 DECREF(v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1042 DECREF(w);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1043 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1044
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1045 case STORE_SUBSCR:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1046 w = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1047 v = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1048 u = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1049 /* v[w] = u */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1050 assign_subscript(ctx, v, w, u);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1051 DECREF(u);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1052 DECREF(v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1053 DECREF(w);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1054 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1055
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1056 case DELETE_SUBSCR:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1057 w = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1058 v = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1059 /* del v[w] */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1060 assign_subscript(ctx, v, w, (object *)NULL);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1061 DECREF(v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1062 DECREF(w);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1063 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1064
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1065 case PRINT_EXPR:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1066 v = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1067 fp = sysgetfile("stdout", stdout);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1068 /* Print value except if procedure result */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1069 if (v != None) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1070 flushline();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1071 printobject(v, fp, 0);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1072 fprintf(fp, "\n");
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1073 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1074 DECREF(v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1075 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1076
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1077 case PRINT_ITEM:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1078 v = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1079 fp = sysgetfile("stdout", stdout);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1080 if (needspace)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1081 fprintf(fp, " ");
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1082 if (is_stringobject(v)) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1083 char *s = getstringvalue(v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1084 int len = getstringsize(v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1085 fwrite(s, 1, len, fp);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1086 if (len > 0 && s[len-1] == '\n')
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1087 needspace = 0;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1088 else
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1089 needspace = 1;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1090 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1091 else {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1092 printobject(v, fp, 0);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1093 needspace = 1;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1094 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1095 DECREF(v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1096 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1097
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1098 case PRINT_NEWLINE:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1099 fp = sysgetfile("stdout", stdout);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1100 fprintf(fp, "\n");
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1101 needspace = 0;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1102 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1103
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1104 case BREAK_LOOP:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1105 raise_pseudo(ctx, BREAK_PSEUDO);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1106 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1107
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1108 case RAISE_EXCEPTION:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1109 v = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1110 w = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1111 if (!is_stringobject(w)) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1112 DECREF(v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1113 DECREF(v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1114 type_error(ctx, "exceptions must be strings");
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1115 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1116 else {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1117 raise_exception(ctx, w, v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1118 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1119 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1120
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1121 case RETURN_VALUE:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1122 v = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1123 raise_pseudo(ctx, RETURN_PSEUDO);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1124 ctx->ctx_errval = v;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1125 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1126
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1127 case REQUIRE_ARGS:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1128 if (EMPTY())
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1129 type_error(ctx,
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1130 "function expects argument(s)");
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1131 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1132
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1133 case REFUSE_ARGS:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1134 if (!EMPTY())
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1135 type_error(ctx,
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1136 "function expects no argument(s)");
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1137 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1138
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1139 case BUILD_FUNCTION:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1140 v = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1141 x = checkerror(ctx, newfuncobject(v, ctx->ctx_globals));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1142 DECREF(v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1143 PUSH(x);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1144 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1145
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1146 case POP_BLOCK:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1147 (void) pop_block(f);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1148 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1149
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1150 case END_FINALLY:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1151 v = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1152 w = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1153 if (is_intobject(v)) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1154 raise_pseudo(ctx, (int)getintvalue(v));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1155 DECREF(v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1156 if (w == None)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1157 DECREF(w);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1158 else
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1159 ctx->ctx_errval = w;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1160 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1161 else if (is_stringobject(v))
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1162 raise_exception(ctx, v, w);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1163 else if (v == None) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1164 DECREF(v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1165 DECREF(w);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1166 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1167 else {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1168 sys_error(ctx, "'finally' pops bad exception");
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1169 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1170 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1171
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1172 case STORE_NAME:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1173 i = NEXTI();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1174 name = GETNAME(i);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1175 v = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1176 if (dictinsert(ctx->ctx_locals, name, v) != 0)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1177 mem_error(ctx, "insert in symbol table");
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1178 DECREF(v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1179 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1180
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1181 case DELETE_NAME:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1182 i = NEXTI();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1183 name = GETNAME(i);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1184 if (dictremove(ctx->ctx_locals, name) != 0)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1185 name_error(ctx, name);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1186 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1187
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1188 case UNPACK_TUPLE:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1189 n = NEXTI();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1190 v = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1191 if (!is_tupleobject(v)) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1192 type_error(ctx, "unpack non-tuple");
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1193 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1194 else if (gettuplesize(v) != n) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1195 error(ctx, "unpack tuple of wrong size");
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1196 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1197 else {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1198 for (i = n; --i >= 0; ) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1199 w = gettupleitem(v, i);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1200 INCREF(w);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1201 PUSH(w);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1202 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1203 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1204 DECREF(v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1205 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1206
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1207 case UNPACK_LIST:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1208 n = NEXTI();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1209 v = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1210 if (!is_listobject(v)) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1211 type_error(ctx, "unpack non-list");
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1212 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1213 else if (getlistsize(v) != n) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1214 error(ctx, "unpack tuple of wrong size");
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1215 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1216 else {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1217 for (i = n; --i >= 0; ) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1218 w = getlistitem(v, i);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1219 INCREF(w);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1220 PUSH(w);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1221 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1222 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1223 DECREF(v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1224 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1225
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1226 case STORE_ATTR:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1227 i = NEXTI();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1228 name = GETNAME(i);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1229 v = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1230 u = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1231 /* v.name = u */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1232 if (v->ob_type->tp_setattr == NULL) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1233 type_error(ctx, "object without writable attributes");
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1234 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1235 else {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1236 if ((*v->ob_type->tp_setattr)(v, name, u) != 0)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1237 puterrno(ctx);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1238 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1239 DECREF(v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1240 DECREF(u);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1241 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1242
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1243 case DELETE_ATTR:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1244 i = NEXTI();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1245 name = GETNAME(i);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1246 v = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1247 /* del v.name */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1248 if (v->ob_type->tp_setattr == NULL) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1249 type_error(ctx,
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1250 "object without writable attributes");
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1251 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1252 else {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1253 if ((*v->ob_type->tp_setattr)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1254 (v, name, (object *)NULL) != 0)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1255 puterrno(ctx);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1256 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1257 DECREF(v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1258 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1259
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1260 case LOAD_CONST:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1261 i = NEXTI();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1262 v = GETCONST(i);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1263 INCREF(v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1264 PUSH(v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1265 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1266
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1267 case LOAD_NAME:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1268 i = NEXTI();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1269 name = GETNAME(i);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1270 v = dictlookup(ctx->ctx_locals, name);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1271 if (v == NULL) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1272 v = dictlookup(ctx->ctx_globals, name);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1273 if (v == NULL)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1274 v = dictlookup(ctx->ctx_builtins, name);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1275 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1276 if (v == NULL)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1277 name_error(ctx, name);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1278 /* XXX could optimize */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1279 else
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1280 INCREF(v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1281 PUSH(v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1282 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1283
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1284 case BUILD_TUPLE:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1285 n = NEXTI();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1286 v = checkerror(ctx, newtupleobject(n));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1287 if (v != NULL) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1288 for (i = n; --i >= 0;) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1289 w = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1290 settupleitem(v, i, w);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1291 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1292 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1293 PUSH(v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1294 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1295
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1296 case BUILD_LIST:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1297 n = NEXTI();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1298 v = checkerror(ctx, newlistobject(n));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1299 if (v != NULL) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1300 for (i = n; --i >= 0;) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1301 w = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1302 setlistitem(v, i, w);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1303 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1304 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1305 PUSH(v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1306 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1307
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1308 case BUILD_MAP:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1309 (void) NEXTI();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1310 v = checkerror(ctx, newdictobject());
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1311 PUSH(v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1312 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1313
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1314 case LOAD_ATTR:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1315 i = NEXTI();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1316 name = GETNAME(i);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1317 v = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1318 if (v->ob_type->tp_getattr == NULL) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1319 type_error(ctx, "attribute-less object");
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1320 u = NULL;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1321 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1322 else {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1323 u = checkerror(ctx,
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1324 (*v->ob_type->tp_getattr)(v, name));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1325 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1326 DECREF(v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1327 PUSH(u);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1328 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1329
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1330 case COMPARE_OP:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1331 op = NEXTI();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1332 w = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1333 v = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1334 u = cmp_outcome(ctx, op, v, w);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1335 DECREF(v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1336 DECREF(w);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1337 PUSH(u);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1338 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1339
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1340 case IMPORT_NAME:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1341 i = NEXTI();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1342 name = GETNAME(i);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1343 u = import_module(ctx, name);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1344 if (u != NULL) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1345 INCREF(u);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1346 PUSH(u);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1347 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1348 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1349
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1350 case IMPORT_FROM:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1351 i = NEXTI();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1352 name = GETNAME(i);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1353 v = TOP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1354 w = getmoduledict(v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1355 x = dictlookup(w, name);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1356 if (x == NULL)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1357 name_error(ctx, name);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1358 else if (dictinsert(ctx->ctx_locals, name, x) != 0)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1359 puterrno(ctx);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1360 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1361
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1362 /* WARNING!
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1363 Don't assign an expression containing NEXTI() directly
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1364 to nexti. This expands to "nexti = ... + *nexti++"
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1365 which has undefined evaluation order. On some machines
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1366 (e.g., mips!) the nexti++ is done after the assignment
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1367 to nexti. */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1368
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1369 case JUMP_FORWARD:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1370 n = NEXTI();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1371 JUMPBY(n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1372 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1373
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1374 case JUMP_IF_FALSE:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1375 n = NEXTI();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1376 if (!testbool(ctx, TOP()))
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1377 JUMPBY(n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1378 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1379
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1380 case JUMP_IF_TRUE:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1381 n = NEXTI();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1382 if (testbool(ctx, TOP()))
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1383 JUMPBY(n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1384 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1385
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1386 case JUMP_ABSOLUTE:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1387 n = NEXTI();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1388 JUMPTO(n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1389 /* XXX Should check for interrupts more often? */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1390 if (intrcheck())
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1391 intr_error(ctx);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1392 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1393
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1394 case FOR_LOOP:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1395 /* for v in s: ...
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1396 On entry: stack contains s, i.
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1397 On exit: stack contains s, i+1, s[i];
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1398 but if loop exhausted:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1399 s, i are popped, and we jump n bytes */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1400 n = NEXTI();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1401 w = POP(); /* Loop index */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1402 v = POP(); /* Sequence object */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1403 x = loop_subscript(ctx, v, w);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1404 if (x != NULL) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1405 PUSH(v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1406 u = checkerror(ctx,
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1407 newintobject(getintvalue(w)+1));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1408 PUSH(u);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1409 DECREF(w);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1410 PUSH(x);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1411 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1412 else {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1413 DECREF(v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1414 DECREF(w);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1415 JUMPBY(n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1416 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1417 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1418
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1419 case SETUP_LOOP:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1420 n = NEXTI();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1421 setup_block(f, SETUP_LOOP, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1422 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1423
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1424 case SETUP_EXCEPT:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1425 n = NEXTI();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1426 setup_block(f, SETUP_EXCEPT, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1427 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1428
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1429 case SETUP_FINALLY:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1430 n = NEXTI();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1431 setup_block(f, SETUP_FINALLY, n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1432 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1433
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1434 default:
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1435 printf("opcode %d\n", Prevbyte(f));
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1436 sys_error(ctx, "eval_compiled: unknown opcode");
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1437 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1438
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1439 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1440
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1441 /* Unwind block stack if an exception occurred */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1442
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1443 while (ctx->ctx_exception && f->f_iblock > 0) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1444 block *b = pop_block(f);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1445 if (b->b_type == SETUP_LOOP &&
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1446 ctx->ctx_exception == BREAK_PSEUDO) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1447 clear_exception(ctx);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1448 JUMPTO(b->b_handler);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1449 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1450 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1451 else if (b->b_type == SETUP_FINALLY ||
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1452 b->b_type == SETUP_EXCEPT &&
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1453 ctx->ctx_exception == CATCHABLE_EXCEPTION) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1454 v = ctx->ctx_errval;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1455 if (v == NULL)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1456 v = None;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1457 INCREF(v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1458 PUSH(v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1459 v = ctx->ctx_error;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1460 if (v == NULL)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1461 v = newintobject(ctx->ctx_exception);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1462 else
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1463 INCREF(v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1464 PUSH(v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1465 clear_exception(ctx);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1466 JUMPTO(b->b_handler);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1467 break;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1468 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1469 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1470 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1471
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1472 if (ctx->ctx_exception) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1473 while (!EMPTY()) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1474 v = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1475 XDECREF(v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1476 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1477 v = NULL;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1478 if (ctx->ctx_exception == RETURN_PSEUDO) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1479 if (needvalue) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1480 v = ctx->ctx_errval;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1481 INCREF(v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1482 clear_exception(ctx);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1483 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1484 else {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1485 /* XXX Can detect this statically! */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1486 type_error(ctx, "unexpected return statement");
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1487 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1488 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1489 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1490 else {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1491 if (needvalue)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1492 v = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1493 else
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1494 v = NULL;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1495 if (!EMPTY()) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1496 sys_error(ctx, "stack not cleaned up");
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1497 XDECREF(v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1498 while (!EMPTY()) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1499 v = POP();
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1500 XDECREF(v);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1501 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1502 v = NULL;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1503 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1504 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1505
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1506 #undef EMPTY
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1507 #undef FULL
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1508 #undef GETCONST
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1509 #undef GETNAME
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1510 #undef JUMPTO
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1511 #undef JUMPBY
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1512
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1513 #undef NEXTOP
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1514 #undef NEXTI
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1515 #undef POP
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1516 #undef TOP
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1517 #undef PUSH
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1518
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1519 DECREF(f);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1520 return v;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1521
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1522 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1523
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1524 /* Provisional interface until everything is compilable */
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1525
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1526 #include "node.h"
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1527
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1528 static object *
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1529 eval_or_exec(ctx, n, arg, needvalue)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1530 context *ctx;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1531 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1532 object *arg;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1533 int needvalue;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1534 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1535 object *v;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1536 codeobject *co = compile(n);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1537 if (co == NULL) {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1538 puterrno(ctx);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1539 return NULL;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1540 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1541 v = eval_compiled(ctx, co, arg, needvalue);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1542 DECREF(co);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1543 return v;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1544 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1545
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1546 object *
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1547 eval_node(ctx, n)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1548 context *ctx;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1549 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1550 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1551 return eval_or_exec(ctx, n, (object *)NULL, 1/*needvalue*/);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1552 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1553
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1554 void
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1555 exec_node(ctx, n)
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1556 context *ctx;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1557 node *n;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1558 {
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1559 (void) eval_or_exec(ctx, n, (object *)NULL, 0/*needvalue*/);
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1560 }