blob: bca3386b18d6edf3b415460fa4f60492324f7169 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum6d023c91995-01-04 19:12:13 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossumf70e43a1991-02-19 12:39:46 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000029
30******************************************************************/
31
Guido van Rossum3f5da241990-12-20 15:06:42 +000032/* Execute compiled code */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000033
Guido van Rossum681d79a1995-07-18 14:51:37 +000034/* XXX TO DO:
35 XXX how to pass arguments to call_trace?
Guido van Rossum681d79a1995-07-18 14:51:37 +000036 XXX speed up searching for keywords by using a dictionary
Guido van Rossum681d79a1995-07-18 14:51:37 +000037 XXX document it!
38 */
39
Guido van Rossumb209a111997-04-29 18:18:01 +000040#include "Python.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000041
Guido van Rossum10dc2e81990-11-18 17:27:39 +000042#include "compile.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000043#include "frameobject.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000044#include "eval.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000045#include "opcode.h"
Guido van Rossumdb3165e1993-10-18 17:06:59 +000046#include "graminit.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000047
Guido van Rossumc6004111993-11-05 10:22:19 +000048#include <ctype.h>
49
Guido van Rossum04691fc1992-08-12 15:35:34 +000050/* Turn this on if your compiler chokes on the big switch: */
Guido van Rossum1ae940a1995-01-02 19:04:15 +000051/* #define CASE_TOO_BIG 1 */
Guido van Rossum04691fc1992-08-12 15:35:34 +000052
Guido van Rossum408027e1996-12-30 16:17:54 +000053#ifdef Py_DEBUG
Guido van Rossum96a42c81992-01-12 02:29:51 +000054/* For debugging the interpreter: */
55#define LLTRACE 1 /* Low-level trace feature */
56#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000057#endif
58
Guido van Rossum5b722181993-03-30 17:46:03 +000059
Guido van Rossum374a9221991-04-04 10:40:29 +000060/* Forward declarations */
Guido van Rossum374a9221991-04-04 10:40:29 +000061
Guido van Rossumb209a111997-04-29 18:18:01 +000062static PyObject *eval_code2 Py_PROTO((PyCodeObject *,
63 PyObject *, PyObject *,
64 PyObject **, int,
65 PyObject **, int,
66 PyObject **, int,
67 PyObject *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000068#ifdef LLTRACE
Guido van Rossumb209a111997-04-29 18:18:01 +000069static int prtrace Py_PROTO((PyObject *, char *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000070#endif
Guido van Rossumb209a111997-04-29 18:18:01 +000071static void call_exc_trace Py_PROTO((PyObject **, PyObject**, PyFrameObject *));
Guido van Rossum9c8d70d1992-03-23 18:19:28 +000072static int call_trace
Guido van Rossumb209a111997-04-29 18:18:01 +000073 Py_PROTO((PyObject **, PyObject **, PyFrameObject *, char *, PyObject *));
74static PyObject *add Py_PROTO((PyObject *, PyObject *));
75static PyObject *sub Py_PROTO((PyObject *, PyObject *));
76static PyObject *powerop Py_PROTO((PyObject *, PyObject *));
77static PyObject *mul Py_PROTO((PyObject *, PyObject *));
78static PyObject *divide Py_PROTO((PyObject *, PyObject *));
79static PyObject *mod Py_PROTO((PyObject *, PyObject *));
80static PyObject *neg Py_PROTO((PyObject *));
81static PyObject *pos Py_PROTO((PyObject *));
82static PyObject *not Py_PROTO((PyObject *));
83static PyObject *invert Py_PROTO((PyObject *));
84static PyObject *lshift Py_PROTO((PyObject *, PyObject *));
85static PyObject *rshift Py_PROTO((PyObject *, PyObject *));
86static PyObject *and Py_PROTO((PyObject *, PyObject *));
87static PyObject *xor Py_PROTO((PyObject *, PyObject *));
88static PyObject *or Py_PROTO((PyObject *, PyObject *));
89static PyObject *call_builtin Py_PROTO((PyObject *, PyObject *, PyObject *));
90static PyObject *call_function Py_PROTO((PyObject *, PyObject *, PyObject *));
91static PyObject *apply_subscript Py_PROTO((PyObject *, PyObject *));
92static PyObject *loop_subscript Py_PROTO((PyObject *, PyObject *));
93static int slice_index Py_PROTO((PyObject *, int, int *));
94static PyObject *apply_slice Py_PROTO((PyObject *, PyObject *, PyObject *));
95static int assign_subscript Py_PROTO((PyObject *, PyObject *, PyObject *));
96static int assign_slice Py_PROTO((PyObject *, PyObject *, PyObject *, PyObject *));
97static int cmp_exception Py_PROTO((PyObject *, PyObject *));
98static int cmp_member Py_PROTO((PyObject *, PyObject *));
99static PyObject *cmp_outcome Py_PROTO((int, PyObject *, PyObject *));
100static int import_from Py_PROTO((PyObject *, PyObject *, PyObject *));
101static PyObject *build_class Py_PROTO((PyObject *, PyObject *, PyObject *));
102static int exec_statement Py_PROTO((PyObject *, PyObject *, PyObject *));
103static PyObject *find_from_args Py_PROTO((PyFrameObject *, int));
Guido van Rossum374a9221991-04-04 10:40:29 +0000104
105
Guido van Rossum950361c1997-01-24 13:49:28 +0000106/* Dynamic execution profile */
107#ifdef DYNAMIC_EXECUTION_PROFILE
108#ifdef DXPAIRS
109static long dxpairs[257][256];
110#define dxp dxpairs[256]
111#else
112static long dxp[256];
113#endif
114#endif
115
116
Guido van Rossum0a066c01992-03-27 17:29:15 +0000117/* Pointer to current frame, used to link new frames to */
118
Guido van Rossumb209a111997-04-29 18:18:01 +0000119static PyFrameObject *current_frame;
Guido van Rossum374a9221991-04-04 10:40:29 +0000120
Guido van Rossume59214e1994-08-30 08:01:59 +0000121#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000122
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000123#include <errno.h>
124#include "thread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000125
Guido van Rossuma9672091994-09-14 13:31:22 +0000126static type_lock interpreter_lock = 0;
127static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000128
129void
Guido van Rossumb209a111997-04-29 18:18:01 +0000130PyEval_InitThreads()
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000131{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000132 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000133 return;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000134 interpreter_lock = allocate_lock();
135 acquire_lock(interpreter_lock, 1);
Guido van Rossuma9672091994-09-14 13:31:22 +0000136 main_thread = get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000137}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000138
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000139#endif
140
Guido van Rossumff4949e1992-08-05 19:58:53 +0000141/* Functions save_thread and restore_thread are always defined so
142 dynamically loaded modules needn't be compiled separately for use
143 with and without threads: */
144
Guido van Rossumb209a111997-04-29 18:18:01 +0000145PyObject *
146PyEval_SaveThread()
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000147{
Guido van Rossume59214e1994-08-30 08:01:59 +0000148#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000149 if (interpreter_lock) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000150 PyObject *res;
151 res = (PyObject *)current_frame;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000152 current_frame = NULL;
153 release_lock(interpreter_lock);
154 return res;
155 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000156#endif
Guido van Rossum9575a441993-04-07 14:06:14 +0000157 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000158}
159
160void
Guido van Rossumb209a111997-04-29 18:18:01 +0000161PyEval_RestoreThread(x)
162 PyObject *x;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000163{
Guido van Rossume59214e1994-08-30 08:01:59 +0000164#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000165 if (interpreter_lock) {
166 int err;
167 err = errno;
168 acquire_lock(interpreter_lock, 1);
169 errno = err;
Guido van Rossumb209a111997-04-29 18:18:01 +0000170 current_frame = (PyFrameObject *)x;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000171 }
172#endif
173}
174
175
Guido van Rossuma9672091994-09-14 13:31:22 +0000176/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
177 signal handlers or Mac I/O completion routines) can schedule calls
178 to a function to be called synchronously.
179 The synchronous function is called with one void* argument.
180 It should return 0 for success or -1 for failure -- failure should
181 be accompanied by an exception.
182
183 If registry succeeds, the registry function returns 0; if it fails
184 (e.g. due to too many pending calls) it returns -1 (without setting
185 an exception condition).
186
187 Note that because registry may occur from within signal handlers,
188 or other asynchronous events, calling malloc() is unsafe!
189
190#ifdef WITH_THREAD
191 Any thread can schedule pending calls, but only the main thread
192 will execute them.
193#endif
194
195 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
196 There are two possible race conditions:
197 (1) nested asynchronous registry calls;
198 (2) registry calls made while pending calls are being processed.
199 While (1) is very unlikely, (2) is a real possibility.
200 The current code is safe against (2), but not against (1).
201 The safety against (2) is derived from the fact that only one
202 thread (the main thread) ever takes things out of the queue.
203*/
204
Guido van Rossum8861b741996-07-30 16:49:37 +0000205static int ticker = 0; /* main loop counter to do periodic things */
206
Guido van Rossuma9672091994-09-14 13:31:22 +0000207#define NPENDINGCALLS 32
208static struct {
Guido van Rossumb209a111997-04-29 18:18:01 +0000209 int (*func) Py_PROTO((ANY *));
Guido van Rossuma9672091994-09-14 13:31:22 +0000210 ANY *arg;
211} pendingcalls[NPENDINGCALLS];
212static volatile int pendingfirst = 0;
213static volatile int pendinglast = 0;
214
215int
216Py_AddPendingCall(func, arg)
Guido van Rossumb209a111997-04-29 18:18:01 +0000217 int (*func) Py_PROTO((ANY *));
Guido van Rossuma9672091994-09-14 13:31:22 +0000218 ANY *arg;
219{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000220 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000221 int i, j;
222 /* XXX Begin critical section */
223 /* XXX If you want this to be safe against nested
224 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000225 if (busy)
226 return -1;
227 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000228 i = pendinglast;
229 j = (i + 1) % NPENDINGCALLS;
230 if (j == pendingfirst)
231 return -1; /* Queue full */
232 pendingcalls[i].func = func;
233 pendingcalls[i].arg = arg;
234 pendinglast = j;
Guido van Rossum8861b741996-07-30 16:49:37 +0000235 ticker = 0; /* Signal main loop */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000236 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000237 /* XXX End critical section */
238 return 0;
239}
240
Guido van Rossum180d7b41994-09-29 09:45:57 +0000241int
242Py_MakePendingCalls()
Guido van Rossuma9672091994-09-14 13:31:22 +0000243{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000244 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000245#ifdef WITH_THREAD
Guido van Rossum1aa14831997-01-21 05:34:20 +0000246 if (main_thread && get_thread_ident() != main_thread) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000247 ticker = 0; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000248 return 0;
Guido van Rossum8861b741996-07-30 16:49:37 +0000249 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000250#endif
Guido van Rossum8861b741996-07-30 16:49:37 +0000251 if (busy) {
252 ticker = 0; /* We're not done yet */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000253 return 0;
Guido van Rossum8861b741996-07-30 16:49:37 +0000254 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000255 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000256 for (;;) {
257 int i;
Guido van Rossumb209a111997-04-29 18:18:01 +0000258 int (*func) Py_PROTO((ANY *));
Guido van Rossuma9672091994-09-14 13:31:22 +0000259 ANY *arg;
260 i = pendingfirst;
261 if (i == pendinglast)
262 break; /* Queue empty */
263 func = pendingcalls[i].func;
264 arg = pendingcalls[i].arg;
265 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000266 if (func(arg) < 0) {
267 busy = 0;
Guido van Rossum8861b741996-07-30 16:49:37 +0000268 ticker = 0; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000269 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000270 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000271 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000272 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000273 return 0;
274}
275
276
Guido van Rossum374a9221991-04-04 10:40:29 +0000277/* Status code for main loop (reason for stack unwind) */
278
279enum why_code {
280 WHY_NOT, /* No error */
281 WHY_EXCEPTION, /* Exception occurred */
282 WHY_RERAISE, /* Exception re-raised by 'finally' */
283 WHY_RETURN, /* 'return' statement */
284 WHY_BREAK /* 'break' statement */
285};
286
Guido van Rossumb209a111997-04-29 18:18:01 +0000287static enum why_code do_raise Py_PROTO((PyObject *, PyObject *, PyObject *));
Guido van Rossum1aa14831997-01-21 05:34:20 +0000288
Guido van Rossum374a9221991-04-04 10:40:29 +0000289
Guido van Rossum681d79a1995-07-18 14:51:37 +0000290/* Backward compatible interface */
Guido van Rossum374a9221991-04-04 10:40:29 +0000291
Guido van Rossumb209a111997-04-29 18:18:01 +0000292PyObject *
293PyEval_EvalCode(co, globals, locals)
294 PyCodeObject *co;
295 PyObject *globals;
296 PyObject *locals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000297{
298 return eval_code2(co,
299 globals, locals,
Guido van Rossumb209a111997-04-29 18:18:01 +0000300 (PyObject **)NULL, 0,
301 (PyObject **)NULL, 0,
302 (PyObject **)NULL, 0,
303 (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000304}
305
306
307/* Interpreter main loop */
308
Guido van Rossum8861b741996-07-30 16:49:37 +0000309#ifndef MAX_RECURSION_DEPTH
310#define MAX_RECURSION_DEPTH 10000
311#endif
312
313static int recursion_depth = 0;
314
Guido van Rossumb209a111997-04-29 18:18:01 +0000315static PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +0000316eval_code2(co, globals, locals,
317 args, argcount, kws, kwcount, defs, defcount, owner)
Guido van Rossumb209a111997-04-29 18:18:01 +0000318 PyCodeObject *co;
319 PyObject *globals;
320 PyObject *locals;
321 PyObject **args;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000322 int argcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000323 PyObject **kws; /* length: 2*kwcount */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000324 int kwcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000325 PyObject **defs;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000326 int defcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000327 PyObject *owner;
Guido van Rossum374a9221991-04-04 10:40:29 +0000328{
Guido van Rossum950361c1997-01-24 13:49:28 +0000329#ifdef DXPAIRS
330 int lastopcode = 0;
331#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000332 register unsigned char *next_instr;
Guido van Rossum150b2df1996-12-05 23:17:11 +0000333 register int opcode = 0; /* Current opcode */
334 register int oparg = 0; /* Current opcode argument, if any */
Guido van Rossumb209a111997-04-29 18:18:01 +0000335 register PyObject **stack_pointer;
Guido van Rossum374a9221991-04-04 10:40:29 +0000336 register enum why_code why; /* Reason for block stack unwind */
337 register int err; /* Error status -- nonzero if error */
Guido van Rossumb209a111997-04-29 18:18:01 +0000338 register PyObject *x; /* Result object -- NULL if error */
339 register PyObject *v; /* Temporary objects popped off stack */
340 register PyObject *w;
341 register PyObject *u;
342 register PyObject *t;
343 register PyFrameObject *f; /* Current frame */
344 register PyObject **fastlocals = NULL;
345 PyObject *retval = NULL; /* Return value */
Guido van Rossum96a42c81992-01-12 02:29:51 +0000346#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000347 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000348#endif
Guido van Rossum408027e1996-12-30 16:17:54 +0000349#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000350 /* Make it easier to find out where we are with a debugger */
Guido van Rossumb209a111997-04-29 18:18:01 +0000351 char *filename = PyString_AsString(co->co_filename);
Guido van Rossum99bec951992-09-03 20:29:45 +0000352#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000353
354/* Code access macros */
355
356#define GETCONST(i) Getconst(f, i)
357#define GETNAME(i) Getname(f, i)
358#define GETNAMEV(i) Getnamev(f, i)
Guido van Rossumdeb0c5e1997-01-27 23:42:36 +0000359#define FIRST_INSTR() (GETUSTRINGVALUE(co->co_code))
Guido van Rossum374a9221991-04-04 10:40:29 +0000360#define INSTR_OFFSET() (next_instr - FIRST_INSTR())
361#define NEXTOP() (*next_instr++)
362#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
363#define JUMPTO(x) (next_instr = FIRST_INSTR() + (x))
364#define JUMPBY(x) (next_instr += (x))
365
366/* Stack manipulation macros */
367
368#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
369#define EMPTY() (STACK_LEVEL() == 0)
370#define TOP() (stack_pointer[-1])
371#define BASIC_PUSH(v) (*stack_pointer++ = (v))
372#define BASIC_POP() (*--stack_pointer)
373
Guido van Rossum96a42c81992-01-12 02:29:51 +0000374#ifdef LLTRACE
375#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
376#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000377#else
378#define PUSH(v) BASIC_PUSH(v)
379#define POP() BASIC_POP()
380#endif
381
Guido van Rossum681d79a1995-07-18 14:51:37 +0000382/* Local variable macros */
383
384#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumb209a111997-04-29 18:18:01 +0000385#define SETLOCAL(i, value) do { Py_XDECREF(GETLOCAL(i)); \
Guido van Rossum681d79a1995-07-18 14:51:37 +0000386 GETLOCAL(i) = value; } while (0)
387
Guido van Rossum8861b741996-07-30 16:49:37 +0000388#ifdef USE_STACKCHECK
389 if (recursion_depth%10 == 0 && PyOS_CheckStack()) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000390 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
Guido van Rossum8861b741996-07-30 16:49:37 +0000391 return NULL;
392 }
393#endif
394
Guido van Rossum681d79a1995-07-18 14:51:37 +0000395 if (globals == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000396 PyErr_SetString(PyExc_SystemError, "eval_code2: NULL globals");
Guido van Rossum6135a871995-01-09 17:53:26 +0000397 return NULL;
Guido van Rossum5b722181993-03-30 17:46:03 +0000398 }
399
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000400#ifdef LLTRACE
Guido van Rossumb209a111997-04-29 18:18:01 +0000401 lltrace = PyDict_GetItemString(globals, "__lltrace__") != NULL;
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000402#endif
403
Guido van Rossumb209a111997-04-29 18:18:01 +0000404 f = PyFrame_New(
Guido van Rossum374a9221991-04-04 10:40:29 +0000405 current_frame, /*back*/
406 co, /*code*/
407 globals, /*globals*/
Guido van Rossum76836021997-01-20 04:26:20 +0000408 locals); /*locals*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000409 if (f == NULL)
410 return NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000411
Guido van Rossum374a9221991-04-04 10:40:29 +0000412 current_frame = f;
Guido van Rossumdeb0c5e1997-01-27 23:42:36 +0000413 fastlocals = f->f_localsplus;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000414
415 if (co->co_argcount > 0 ||
416 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
417 int i;
418 int n = argcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000419 PyObject *kwdict = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000420 if (co->co_flags & CO_VARKEYWORDS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000421 kwdict = PyDict_New();
Guido van Rossum681d79a1995-07-18 14:51:37 +0000422 if (kwdict == NULL)
423 goto fail;
Guido van Rossum8c5df061997-01-24 04:19:24 +0000424 i = co->co_argcount;
425 if (co->co_flags & CO_VARARGS)
426 i++;
427 SETLOCAL(i, kwdict);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000428 }
429 if (argcount > co->co_argcount) {
430 if (!(co->co_flags & CO_VARARGS)) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000431 PyErr_SetString(PyExc_TypeError, "too many arguments");
Guido van Rossum681d79a1995-07-18 14:51:37 +0000432 goto fail;
433 }
434 n = co->co_argcount;
435 }
436 for (i = 0; i < n; i++) {
437 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000438 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000439 SETLOCAL(i, x);
440 }
441 if (co->co_flags & CO_VARARGS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000442 u = PyTuple_New(argcount - n);
Guido van Rossum8c5df061997-01-24 04:19:24 +0000443 if (u == NULL)
444 goto fail;
445 SETLOCAL(co->co_argcount, u);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000446 for (i = n; i < argcount; i++) {
447 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000448 Py_INCREF(x);
449 PyTuple_SET_ITEM(u, i-n, x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000450 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000451 }
452 for (i = 0; i < kwcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000453 PyObject *keyword = kws[2*i];
454 PyObject *value = kws[2*i + 1];
Guido van Rossum681d79a1995-07-18 14:51:37 +0000455 int j;
456 /* XXX slow -- speed up using dictionary? */
457 for (j = 0; j < co->co_argcount; j++) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000458 PyObject *nm = PyTuple_GET_ITEM(co->co_varnames, j);
459 if (PyObject_Compare(keyword, nm) == 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000460 break;
461 }
462 if (j >= co->co_argcount) {
463 if (kwdict == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000464 PyErr_Format(PyExc_TypeError,
Guido van Rossumc43b6851997-03-10 22:58:23 +0000465 "unexpected keyword argument: %.400s",
Guido van Rossumb209a111997-04-29 18:18:01 +0000466 PyString_AsString(keyword));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000467 goto fail;
468 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000469 PyDict_SetItem(kwdict, keyword, value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000470 }
471 else {
472 if (GETLOCAL(j) != NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000473 PyErr_SetString(PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +0000474 "keyword parameter redefined");
475 goto fail;
476 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000477 Py_INCREF(value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000478 SETLOCAL(j, value);
479 }
480 }
481 if (argcount < co->co_argcount) {
482 int m = co->co_argcount - defcount;
483 for (i = argcount; i < m; i++) {
484 if (GETLOCAL(i) == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000485 PyErr_SetString(PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +0000486 "not enough arguments");
487 goto fail;
488 }
489 }
490 if (n > m)
491 i = n - m;
492 else
493 i = 0;
494 for (; i < defcount; i++) {
495 if (GETLOCAL(m+i) == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000496 PyObject *def = defs[i];
497 Py_INCREF(def);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000498 SETLOCAL(m+i, def);
499 }
500 }
501 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000502 }
503 else {
504 if (argcount > 0 || kwcount > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000505 PyErr_SetString(PyExc_TypeError, "no arguments expected");
Guido van Rossum8c5df061997-01-24 04:19:24 +0000506 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000507 }
508 }
509
Guido van Rossumb209a111997-04-29 18:18:01 +0000510 if (_PySys_TraceFunc != NULL) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000511 /* sys_trace, if defined, is a function that will
Guido van Rossum96a42c81992-01-12 02:29:51 +0000512 be called on *every* entry to a code block.
513 Its return value, if not None, is a function that
514 will be called at the start of each executed line
515 of code. (Actually, the function must return
516 itself in order to continue tracing.)
517 The trace functions are called with three arguments:
518 a pointer to the current frame, a string indicating
519 why the function is called, and an argument which
520 depends on the situation. The global trace function
521 (sys.trace) is also called whenever an exception
522 is detected. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000523 if (call_trace(&_PySys_TraceFunc, &f->f_trace, f, "call",
524 Py_None/*XXX how to compute arguments now?*/)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000525 /* Trace function raised an error */
Guido van Rossum8c5df061997-01-24 04:19:24 +0000526 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000527 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000528 }
529
Guido van Rossumb209a111997-04-29 18:18:01 +0000530 if (_PySys_ProfileFunc != NULL) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000531 /* Similar for sys_profile, except it needn't return
532 itself and isn't called for "line" events */
Guido van Rossumb209a111997-04-29 18:18:01 +0000533 if (call_trace(&_PySys_ProfileFunc, (PyObject**)0, f, "call",
534 Py_None/*XXX*/)) {
Guido van Rossum8c5df061997-01-24 04:19:24 +0000535 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000536 }
537 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000538
Guido van Rossum8861b741996-07-30 16:49:37 +0000539 if (++recursion_depth > MAX_RECURSION_DEPTH) {
540 --recursion_depth;
Guido van Rossumb209a111997-04-29 18:18:01 +0000541 PyErr_SetString(PyExc_RuntimeError, "Maximum recursion depth exceeded");
Guido van Rossum8861b741996-07-30 16:49:37 +0000542 current_frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +0000543 Py_DECREF(f);
Guido van Rossum8861b741996-07-30 16:49:37 +0000544 return NULL;
545 }
546
Guido van Rossumdeb0c5e1997-01-27 23:42:36 +0000547 next_instr = GETUSTRINGVALUE(co->co_code);
Guido van Rossum374a9221991-04-04 10:40:29 +0000548 stack_pointer = f->f_valuestack;
549
Guido van Rossum374a9221991-04-04 10:40:29 +0000550 why = WHY_NOT;
551 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000552 x = Py_None; /* Not a reference, just anything non-NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000553
554 for (;;) {
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000555 /* Do periodic things.
556 Doing this every time through the loop would add
557 too much overhead (a function call per instruction).
Guido van Rossum8861b741996-07-30 16:49:37 +0000558 So we do it only every Nth instruction.
559
560 The ticker is reset to zero if there are pending
Guido van Rossum70d44781997-01-21 06:15:24 +0000561 calls (see Py_AddPendingCall() and
Guido van Rossum8861b741996-07-30 16:49:37 +0000562 Py_MakePendingCalls() above). */
Guido van Rossuma9672091994-09-14 13:31:22 +0000563
Guido van Rossum374a9221991-04-04 10:40:29 +0000564 if (--ticker < 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000565 ticker = _PySys_CheckInterval;
Guido van Rossum8861b741996-07-30 16:49:37 +0000566 if (pendingfirst != pendinglast) {
567 if (Py_MakePendingCalls() < 0) {
568 why = WHY_EXCEPTION;
569 goto on_error;
570 }
571 }
Guido van Rossum8c5df061997-01-24 04:19:24 +0000572#ifdef macintosh
573#undef HAVE_SIGNAL_H
574#endif
Guido van Rossum70d44781997-01-21 06:15:24 +0000575#ifndef HAVE_SIGNAL_H /* Is this the right #define? */
576/* If we have true signals, the signal handler will call
577 Py_AddPendingCall() so we don't have to call sigcheck().
578 On the Mac and DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000579 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000580 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000581 goto on_error;
582 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000583#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000584
Guido van Rossume59214e1994-08-30 08:01:59 +0000585#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000586 if (interpreter_lock) {
587 /* Give another thread a chance */
588
589 current_frame = NULL;
590 release_lock(interpreter_lock);
591
592 /* Other threads may run now */
593
594 acquire_lock(interpreter_lock, 1);
595 current_frame = f;
596 }
597#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000598 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000599
Guido van Rossum374a9221991-04-04 10:40:29 +0000600 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000601
Guido van Rossum408027e1996-12-30 16:17:54 +0000602#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000603 f->f_lasti = INSTR_OFFSET();
604#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000605
606 opcode = NEXTOP();
607 if (HAS_ARG(opcode))
608 oparg = NEXTARG();
Guido van Rossum950361c1997-01-24 13:49:28 +0000609#ifdef DYNAMIC_EXECUTION_PROFILE
610#ifdef DXPAIRS
611 dxpairs[lastopcode][opcode]++;
612 lastopcode = opcode;
613#endif
614 dxp[opcode]++;
615#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000616
Guido van Rossum96a42c81992-01-12 02:29:51 +0000617#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000618 /* Instruction tracing */
619
Guido van Rossum96a42c81992-01-12 02:29:51 +0000620 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000621 if (HAS_ARG(opcode)) {
622 printf("%d: %d, %d\n",
623 (int) (INSTR_OFFSET() - 3),
624 opcode, oparg);
625 }
626 else {
627 printf("%d: %d\n",
628 (int) (INSTR_OFFSET() - 1), opcode);
629 }
630 }
631#endif
632
633 /* Main switch on opcode */
634
635 switch (opcode) {
636
637 /* BEWARE!
638 It is essential that any operation that fails sets either
639 x to NULL, err to nonzero, or why to anything but WHY_NOT,
640 and that no operation that succeeds does this! */
641
642 /* case STOP_CODE: this is an error! */
643
644 case POP_TOP:
645 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000646 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000647 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000648
649 case ROT_TWO:
650 v = POP();
651 w = POP();
652 PUSH(v);
653 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000654 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000655
656 case ROT_THREE:
657 v = POP();
658 w = POP();
659 x = POP();
660 PUSH(v);
661 PUSH(x);
662 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000663 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000664
665 case DUP_TOP:
666 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000667 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000668 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000669 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000670
671 case UNARY_POSITIVE:
672 v = POP();
673 x = pos(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000674 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000675 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000676 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000677 break;
678
679 case UNARY_NEGATIVE:
680 v = POP();
681 x = neg(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000682 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000683 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000684 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000685 break;
686
687 case UNARY_NOT:
688 v = POP();
689 x = not(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000690 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000691 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000692 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000693 break;
694
695 case UNARY_CONVERT:
696 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000697 x = PyObject_Repr(v);
698 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000699 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000700 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000701 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000702
703 case UNARY_INVERT:
704 v = POP();
705 x = invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000706 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000707 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000708 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000709 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000710
Guido van Rossum50564e81996-01-12 01:13:16 +0000711 case BINARY_POWER:
712 w = POP();
713 v = POP();
Guido van Rossum3b4da591996-06-19 21:49:17 +0000714 x = powerop(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000715 Py_DECREF(v);
716 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000717 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000718 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000719 break;
720
Guido van Rossum374a9221991-04-04 10:40:29 +0000721 case BINARY_MULTIPLY:
722 w = POP();
723 v = POP();
724 x = mul(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000725 Py_DECREF(v);
726 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000727 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000728 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000729 break;
730
731 case BINARY_DIVIDE:
732 w = POP();
733 v = POP();
734 x = divide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000735 Py_DECREF(v);
736 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000737 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000738 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000739 break;
740
741 case BINARY_MODULO:
742 w = POP();
743 v = POP();
Guido van Rossum06186511995-01-07 12:40:10 +0000744 x = mod(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000745 Py_DECREF(v);
746 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000747 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000748 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000749 break;
750
751 case BINARY_ADD:
752 w = POP();
753 v = POP();
754 x = add(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000755 Py_DECREF(v);
756 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000757 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000758 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000759 break;
760
761 case BINARY_SUBTRACT:
762 w = POP();
763 v = POP();
764 x = sub(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000765 Py_DECREF(v);
766 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000767 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000768 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000769 break;
770
771 case BINARY_SUBSCR:
772 w = POP();
773 v = POP();
774 x = apply_subscript(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000775 Py_DECREF(v);
776 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000777 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000778 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000779 break;
780
Guido van Rossum7928cd71991-10-24 14:59:31 +0000781 case BINARY_LSHIFT:
782 w = POP();
783 v = POP();
784 x = lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000785 Py_DECREF(v);
786 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000787 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000788 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000789 break;
790
791 case BINARY_RSHIFT:
792 w = POP();
793 v = POP();
794 x = rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000795 Py_DECREF(v);
796 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000797 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000798 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000799 break;
800
801 case BINARY_AND:
802 w = POP();
803 v = POP();
804 x = and(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000805 Py_DECREF(v);
806 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000807 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000808 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000809 break;
810
811 case BINARY_XOR:
812 w = POP();
813 v = POP();
814 x = xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000815 Py_DECREF(v);
816 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000817 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000818 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000819 break;
820
821 case BINARY_OR:
822 w = POP();
823 v = POP();
824 x = or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000825 Py_DECREF(v);
826 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000827 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000828 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000829 break;
830
Guido van Rossum374a9221991-04-04 10:40:29 +0000831 case SLICE+0:
832 case SLICE+1:
833 case SLICE+2:
834 case SLICE+3:
835 if ((opcode-SLICE) & 2)
836 w = POP();
837 else
838 w = NULL;
839 if ((opcode-SLICE) & 1)
840 v = POP();
841 else
842 v = NULL;
843 u = POP();
844 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000845 Py_DECREF(u);
846 Py_XDECREF(v);
847 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000848 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000849 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000850 break;
851
852 case STORE_SLICE+0:
853 case STORE_SLICE+1:
854 case STORE_SLICE+2:
855 case STORE_SLICE+3:
856 if ((opcode-STORE_SLICE) & 2)
857 w = POP();
858 else
859 w = NULL;
860 if ((opcode-STORE_SLICE) & 1)
861 v = POP();
862 else
863 v = NULL;
864 u = POP();
865 t = POP();
866 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +0000867 Py_DECREF(t);
868 Py_DECREF(u);
869 Py_XDECREF(v);
870 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000871 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000872 break;
873
874 case DELETE_SLICE+0:
875 case DELETE_SLICE+1:
876 case DELETE_SLICE+2:
877 case DELETE_SLICE+3:
878 if ((opcode-DELETE_SLICE) & 2)
879 w = POP();
880 else
881 w = NULL;
882 if ((opcode-DELETE_SLICE) & 1)
883 v = POP();
884 else
885 v = NULL;
886 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000887 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +0000888 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +0000889 Py_DECREF(u);
890 Py_XDECREF(v);
891 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000892 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000893 break;
894
895 case STORE_SUBSCR:
896 w = POP();
897 v = POP();
898 u = POP();
899 /* v[w] = u */
900 err = assign_subscript(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +0000901 Py_DECREF(u);
902 Py_DECREF(v);
903 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000904 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000905 break;
906
907 case DELETE_SUBSCR:
908 w = POP();
909 v = POP();
910 /* del v[w] */
Guido van Rossumb209a111997-04-29 18:18:01 +0000911 err = assign_subscript(v, w, (PyObject *)NULL);
912 Py_DECREF(v);
913 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000914 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000915 break;
916
917 case PRINT_EXPR:
918 v = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +0000919 /* Print value except if procedure result */
Guido van Rossume59214e1994-08-30 08:01:59 +0000920 /* Before printing, also assign to '_' */
Guido van Rossumb209a111997-04-29 18:18:01 +0000921 if (v != Py_None &&
922 (err = PyDict_SetItemString(f->f_builtins, "_", v)) == 0 &&
923 !Py_SuppressPrintingFlag) {
924 Py_FlushLine();
925 x = PySys_GetObject("stdout");
926 err = PyFile_WriteObject(v, x, 0);
927 PyFile_SoftSpace(x, 1);
928 Py_FlushLine();
Guido van Rossum374a9221991-04-04 10:40:29 +0000929 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000930 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000931 break;
932
933 case PRINT_ITEM:
934 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000935 w = PySys_GetObject("stdout");
936 if (PyFile_SoftSpace(w, 1))
937 PyFile_WriteString(" ", w);
938 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
939 if (err == 0 && PyString_Check(v)) {
Guido van Rossumc6004111993-11-05 10:22:19 +0000940 /* XXX move into writeobject() ? */
Guido van Rossumb209a111997-04-29 18:18:01 +0000941 char *s = PyString_AsString(v);
942 int len = PyString_Size(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000943 if (len > 0 &&
944 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +0000945 s[len-1] != ' ')
Guido van Rossumb209a111997-04-29 18:18:01 +0000946 PyFile_SoftSpace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000947 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000948 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000949 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000950 break;
951
952 case PRINT_NEWLINE:
Guido van Rossumb209a111997-04-29 18:18:01 +0000953 x = PySys_GetObject("stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +0000954 if (x == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +0000955 PyErr_SetString(PyExc_RuntimeError, "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +0000956 else {
Guido van Rossumb209a111997-04-29 18:18:01 +0000957 PyFile_WriteString("\n", x);
958 PyFile_SoftSpace(x, 0);
Guido van Rossum3165fe61992-09-25 21:59:05 +0000959 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000960 break;
961
962 case BREAK_LOOP:
963 why = WHY_BREAK;
964 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +0000965
Guido van Rossumf10570b1995-07-07 22:53:21 +0000966 case RAISE_VARARGS:
967 u = v = w = NULL;
968 switch (oparg) {
969 case 3:
970 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +0000971 /* Fallthrough */
972 case 2:
973 v = POP(); /* value */
974 /* Fallthrough */
975 case 1:
976 w = POP(); /* exc */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +0000977 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +0000978 break;
979 default:
Guido van Rossumb209a111997-04-29 18:18:01 +0000980 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +0000981 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +0000982 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +0000983 break;
984 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000985 break;
986
987 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +0000988 if ((x = f->f_locals) == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000989 PyErr_SetString(PyExc_SystemError, "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +0000990 break;
991 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000992 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000993 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +0000994 break;
995
996 case RETURN_VALUE:
997 retval = POP();
998 why = WHY_RETURN;
999 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001000
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001001 case EXEC_STMT:
1002 w = POP();
1003 v = POP();
1004 u = POP();
1005 err = exec_statement(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001006 Py_DECREF(u);
1007 Py_DECREF(v);
1008 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001009 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001010
Guido van Rossum374a9221991-04-04 10:40:29 +00001011 case POP_BLOCK:
1012 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001013 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001014 while (STACK_LEVEL() > b->b_level) {
1015 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001016 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001017 }
1018 }
1019 break;
1020
1021 case END_FINALLY:
1022 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001023 if (PyInt_Check(v)) {
1024 why = (enum why_code) PyInt_AsLong(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001025 if (why == WHY_RETURN)
1026 retval = POP();
1027 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001028 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001029 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001030 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001031 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001032 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001033 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001034 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001035 else if (v != Py_None) {
1036 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001037 "'finally' pops bad exception");
1038 why = WHY_EXCEPTION;
1039 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001040 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001041 break;
1042
1043 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001044 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001045 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001046 w = POP();
1047 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001048 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001049 Py_DECREF(u);
1050 Py_DECREF(v);
1051 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001052 break;
1053
1054 case STORE_NAME:
1055 w = GETNAMEV(oparg);
1056 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001057 if ((x = f->f_locals) == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001058 PyErr_SetString(PyExc_SystemError, "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001059 break;
1060 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001061 err = PyDict_SetItem(x, w, v);
1062 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001063 break;
1064
1065 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001066 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001067 if ((x = f->f_locals) == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001068 PyErr_SetString(PyExc_SystemError, "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001069 break;
1070 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001071 if ((err = PyDict_DelItem(x, w)) != 0)
1072 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001073 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001074
1075#ifdef CASE_TOO_BIG
1076 default: switch (opcode) {
1077#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001078
1079 case UNPACK_TUPLE:
1080 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001081 if (!PyTuple_Check(v)) {
1082 PyErr_SetString(PyExc_TypeError, "unpack non-tuple");
Guido van Rossum374a9221991-04-04 10:40:29 +00001083 why = WHY_EXCEPTION;
1084 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001085 else if (PyTuple_Size(v) != oparg) {
1086 PyErr_SetString(PyExc_ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001087 "unpack tuple of wrong size");
1088 why = WHY_EXCEPTION;
1089 }
1090 else {
1091 for (; --oparg >= 0; ) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001092 w = PyTuple_GET_ITEM(v, oparg);
1093 Py_INCREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001094 PUSH(w);
1095 }
1096 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001097 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001098 break;
1099
1100 case UNPACK_LIST:
1101 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001102 if (!PyList_Check(v)) {
1103 PyErr_SetString(PyExc_TypeError, "unpack non-list");
Guido van Rossum374a9221991-04-04 10:40:29 +00001104 why = WHY_EXCEPTION;
1105 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001106 else if (PyList_Size(v) != oparg) {
1107 PyErr_SetString(PyExc_ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001108 "unpack list of wrong size");
1109 why = WHY_EXCEPTION;
1110 }
1111 else {
1112 for (; --oparg >= 0; ) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001113 w = PyList_GetItem(v, oparg);
1114 Py_INCREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001115 PUSH(w);
1116 }
1117 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001118 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001119 break;
1120
1121 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001122 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001123 v = POP();
1124 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001125 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1126 Py_DECREF(v);
1127 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001128 break;
1129
1130 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001131 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001132 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001133 err = PyObject_SetAttr(v, w, (PyObject *)NULL); /* del v.w */
1134 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001135 break;
1136
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001137 case STORE_GLOBAL:
1138 w = GETNAMEV(oparg);
1139 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001140 err = PyDict_SetItem(f->f_globals, w, v);
1141 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001142 break;
1143
1144 case DELETE_GLOBAL:
1145 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001146 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
1147 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001148 break;
1149
Guido van Rossum374a9221991-04-04 10:40:29 +00001150 case LOAD_CONST:
1151 x = GETCONST(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001152 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001153 PUSH(x);
1154 break;
1155
1156 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001157 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001158 if ((x = f->f_locals) == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001159 PyErr_SetString(PyExc_SystemError, "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001160 break;
1161 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001162 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001163 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001164 PyErr_Clear();
1165 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001166 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001167 PyErr_Clear();
1168 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001169 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001170 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001171 break;
1172 }
1173 }
1174 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001175 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001176 PUSH(x);
1177 break;
1178
1179 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001180 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001181 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001182 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001183 PyErr_Clear();
1184 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001185 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001186 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001187 break;
1188 }
1189 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001190 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001191 PUSH(x);
1192 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001193
Guido van Rossum9bfef441993-03-29 10:43:31 +00001194 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001195 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001196 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001197 PyErr_SetObject(PyExc_NameError,
1198 PyTuple_GetItem(co->co_varnames,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001199 oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001200 break;
1201 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001202 Py_INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001203 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001204 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001205 break;
1206
1207 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001208 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001209 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001210 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001211
1212 case DELETE_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001213 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001214 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001215
1216 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001217 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001218 if (x != NULL) {
1219 for (; --oparg >= 0;) {
1220 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001221 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001222 }
1223 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001224 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001225 }
1226 break;
1227
1228 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001229 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001230 if (x != NULL) {
1231 for (; --oparg >= 0;) {
1232 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001233 err = PyList_SetItem(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001234 if (err != 0)
1235 break;
1236 }
1237 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001238 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001239 }
1240 break;
1241
1242 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001243 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001244 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001245 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001246 break;
1247
1248 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001249 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001250 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001251 x = PyObject_GetAttr(v, w);
1252 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001253 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001254 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001255 break;
1256
1257 case COMPARE_OP:
1258 w = POP();
1259 v = POP();
Guido van Rossum5b7313a1992-04-06 13:24:57 +00001260 x = cmp_outcome(oparg, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001261 Py_DECREF(v);
1262 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001263 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001264 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001265 break;
1266
1267 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001268 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001269 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001270 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001271 PyErr_SetString(PyExc_ImportError,
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001272 "__import__ not found");
1273 break;
1274 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001275 if (PyCFunction_Check(x)) {
1276 u = Py_None;
1277 Py_INCREF(u);
Guido van Rossum24c13741995-02-14 09:42:43 +00001278 }
1279 else {
1280 u = find_from_args(f, INSTR_OFFSET());
1281 if (u == NULL) {
1282 x = u;
1283 break;
1284 }
1285 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001286 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001287 w,
1288 f->f_globals,
Guido van Rossumb209a111997-04-29 18:18:01 +00001289 f->f_locals == NULL ? Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001290 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001291 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001292 if (w == NULL) {
1293 x = NULL;
1294 break;
1295 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001296 x = PyEval_CallObject(x, w);
1297 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001298 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001299 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001300 break;
1301
1302 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001303 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001304 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001305 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001306 if ((x = f->f_locals) == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001307 PyErr_SetString(PyExc_SystemError, "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001308 break;
1309 }
1310 err = import_from(x, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001311 PyFrame_LocalsToFast(f, 0);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001312 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001313 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001314
Guido van Rossum374a9221991-04-04 10:40:29 +00001315 case JUMP_FORWARD:
1316 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001317 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001318
1319 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001320 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001321 if (err > 0)
1322 err = 0;
1323 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001324 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001325 else
1326 break;
1327 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001328
1329 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001330 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001331 if (err > 0) {
1332 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001333 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001334 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001335 else if (err == 0)
1336 ;
1337 else
1338 break;
1339 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001340
1341 case JUMP_ABSOLUTE:
1342 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001343 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001344
1345 case FOR_LOOP:
1346 /* for v in s: ...
1347 On entry: stack contains s, i.
1348 On exit: stack contains s, i+1, s[i];
1349 but if loop exhausted:
1350 s, i are popped, and we jump */
1351 w = POP(); /* Loop index */
1352 v = POP(); /* Sequence object */
1353 u = loop_subscript(v, w);
1354 if (u != NULL) {
1355 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001356 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001357 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001358 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001359 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001360 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001361 }
1362 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001363 Py_DECREF(v);
1364 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001365 /* A NULL can mean "s exhausted"
1366 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001367 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001368 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001369 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001370 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001371 continue;
1372 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001373 }
1374 break;
1375
1376 case SETUP_LOOP:
1377 case SETUP_EXCEPT:
1378 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001379 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Guido van Rossum374a9221991-04-04 10:40:29 +00001380 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001381 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001382
1383 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001384#ifdef LLTRACE
1385 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001386 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001387#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001388 f->f_lineno = oparg;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001389 if (f->f_trace == NULL)
1390 continue;
1391 /* Trace each line of code reached */
1392 f->f_lasti = INSTR_OFFSET();
1393 err = call_trace(&f->f_trace, &f->f_trace,
Guido van Rossumb209a111997-04-29 18:18:01 +00001394 f, "line", Py_None);
Guido van Rossum374a9221991-04-04 10:40:29 +00001395 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001396
1397 case CALL_FUNCTION:
1398 {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001399 int na = oparg & 0xff;
1400 int nk = (oparg>>8) & 0xff;
1401 int n = na + 2*nk;
Guido van Rossumb209a111997-04-29 18:18:01 +00001402 PyObject **pfunc = stack_pointer - n - 1;
1403 PyObject *func = *pfunc;
1404 PyObject *self = NULL;
1405 PyObject *class = NULL;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001406 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Guido van Rossumb209a111997-04-29 18:18:01 +00001407 if (PyMethod_Check(func)) {
1408 self = PyMethod_Self(func);
1409 class = PyMethod_Class(func);
1410 func = PyMethod_Function(func);
1411 Py_INCREF(func);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001412 if (self != NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001413 Py_INCREF(self);
1414 Py_DECREF(*pfunc);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001415 *pfunc = self;
1416 na++;
1417 n++;
1418 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001419 else {
1420 /* Unbound methods must be
1421 called with an instance of
1422 the class (or a derived
1423 class) as first argument */
1424 if (na > 0 &&
1425 (self = stack_pointer[-n])
1426 != NULL &&
Guido van Rossumb209a111997-04-29 18:18:01 +00001427 PyInstance_Check(self) &&
1428 PyClass_IsSubclass(
1429 (PyObject *)
1430 (((PyInstanceObject *)self)
Guido van Rossum681d79a1995-07-18 14:51:37 +00001431 ->in_class),
1432 class))
1433 /* Handy-dandy */ ;
1434 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001435 PyErr_SetString(PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001436 "unbound method must be called with class instance 1st argument");
Guido van Rossum72b56e81995-12-10 04:57:42 +00001437 x = NULL;
1438 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001439 }
1440 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001441 }
1442 else
Guido van Rossumb209a111997-04-29 18:18:01 +00001443 Py_INCREF(func);
1444 if (PyFunction_Check(func)) {
1445 PyObject *co = PyFunction_GetCode(func);
1446 PyObject *globals = PyFunction_GetGlobals(func);
1447 PyObject *argdefs = PyFunction_GetDefaults(func);
1448 PyObject **d;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001449 int nd;
1450 if (argdefs != NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001451 d = &PyTuple_GET_ITEM(argdefs, 0);
1452 nd = ((PyTupleObject *)argdefs)->ob_size;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001453 }
1454 else {
1455 d = NULL;
1456 nd = 0;
1457 }
1458 x = eval_code2(
Guido van Rossumb209a111997-04-29 18:18:01 +00001459 (PyCodeObject *)co,
1460 globals, (PyObject *)NULL,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001461 stack_pointer-n, na,
1462 stack_pointer-2*nk, nk,
1463 d, nd,
1464 class);
1465 }
1466 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001467 PyObject *args = PyTuple_New(na);
1468 PyObject *kwdict = NULL;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001469 if (args == NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001470 x = NULL;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001471 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001472 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001473 if (nk > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001474 kwdict = PyDict_New();
Guido van Rossumff8b4941995-07-26 18:16:42 +00001475 if (kwdict == NULL) {
1476 x = NULL;
1477 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001478 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001479 err = 0;
1480 while (--nk >= 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001481 PyObject *value = POP();
1482 PyObject *key = POP();
1483 err = PyDict_SetItem(
Guido van Rossumff8b4941995-07-26 18:16:42 +00001484 kwdict, key, value);
Guido van Rossumb209a111997-04-29 18:18:01 +00001485 Py_DECREF(key);
1486 Py_DECREF(value);
Guido van Rossumd0eb4291997-01-27 21:30:09 +00001487 if (err)
Guido van Rossumff8b4941995-07-26 18:16:42 +00001488 break;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001489 }
1490 if (err) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001491 Py_DECREF(args);
1492 Py_DECREF(kwdict);
Guido van Rossumff8b4941995-07-26 18:16:42 +00001493 break;
1494 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001495 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001496 while (--na >= 0) {
1497 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001498 PyTuple_SET_ITEM(args, na, w);
Guido van Rossumff8b4941995-07-26 18:16:42 +00001499 }
1500 x = PyEval_CallObjectWithKeywords(
1501 func, args, kwdict);
Guido van Rossumb209a111997-04-29 18:18:01 +00001502 Py_DECREF(args);
1503 Py_XDECREF(kwdict);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001504 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001505 Py_DECREF(func);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001506 while (stack_pointer > pfunc) {
1507 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001508 Py_DECREF(w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001509 }
1510 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001511 if (x != NULL) continue;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001512 break;
1513 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001514
Guido van Rossum681d79a1995-07-18 14:51:37 +00001515 case MAKE_FUNCTION:
1516 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00001517 x = PyFunction_New(v, f->f_globals);
1518 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001519 /* XXX Maybe this should be a separate opcode? */
1520 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001521 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001522 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001523 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001524 x = NULL;
1525 break;
1526 }
1527 while (--oparg >= 0) {
1528 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001529 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001530 }
1531 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001532 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001533 }
1534 PUSH(x);
1535 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001536
1537 case BUILD_SLICE:
1538 if (oparg == 3)
1539 w = POP();
1540 else
1541 w = NULL;
1542 v = POP();
1543 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00001544 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001545 Py_DECREF(u);
1546 Py_DECREF(v);
1547 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00001548 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001549 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00001550 break;
1551
1552
Guido van Rossum374a9221991-04-04 10:40:29 +00001553 default:
1554 fprintf(stderr,
1555 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001556 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00001557 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00001558 why = WHY_EXCEPTION;
1559 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001560
1561#ifdef CASE_TOO_BIG
1562 }
1563#endif
1564
Guido van Rossum374a9221991-04-04 10:40:29 +00001565 } /* switch */
1566
1567 on_error:
1568
1569 /* Quickly continue if no error occurred */
1570
1571 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001572 if (err == 0 && x != NULL) {
1573#ifdef CHECKEXC
Guido van Rossumb209a111997-04-29 18:18:01 +00001574 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00001575 fprintf(stderr,
1576 "XXX undetected error\n");
1577 else
1578#endif
1579 continue; /* Normal, fast path */
1580 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001581 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00001582 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00001583 err = 0;
1584 }
1585
Guido van Rossum801dcae1992-04-08 11:32:32 +00001586#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001587 /* Double-check exception status */
1588
1589 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001590 if (!PyErr_Occurred()) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001591 fprintf(stderr, "XXX ghost error\n");
Guido van Rossumb209a111997-04-29 18:18:01 +00001592 PyErr_SetString(PyExc_SystemError, "ghost error");
Guido van Rossum374a9221991-04-04 10:40:29 +00001593 why = WHY_EXCEPTION;
1594 }
1595 }
1596 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001597 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001598 fprintf(stderr,
1599 "XXX undetected error (why=%d)\n",
1600 why);
1601 why = WHY_EXCEPTION;
1602 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001603 }
1604#endif
1605
1606 /* Log traceback info if this is a real exception */
1607
1608 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001609 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001610 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001611 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00001612 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001613
Guido van Rossume59214e1994-08-30 08:01:59 +00001614 if (f->f_trace)
1615 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossumb209a111997-04-29 18:18:01 +00001616 if (_PySys_ProfileFunc)
1617 call_exc_trace(&_PySys_ProfileFunc, (PyObject**)0, f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001618 }
1619
1620 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1621
1622 if (why == WHY_RERAISE)
1623 why = WHY_EXCEPTION;
1624
1625 /* Unwind stacks if a (pseudo) exception occurred */
1626
1627 while (why != WHY_NOT && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001628 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001629 while (STACK_LEVEL() > b->b_level) {
1630 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001631 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001632 }
1633 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1634 why = WHY_NOT;
1635 JUMPTO(b->b_handler);
1636 break;
1637 }
1638 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00001639 (b->b_type == SETUP_EXCEPT &&
1640 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001641 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001642 PyObject *exc, *val, *tb;
1643 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001644 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001645 val = Py_None;
1646 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00001647 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001648 /* Make the raw exception data
1649 available to the handler,
1650 so a program can emulate the
1651 Python main loop. Don't do
1652 this for 'finally'. */
1653 if (b->b_type == SETUP_EXCEPT) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001654 PySys_SetObject("exc_traceback", tb);
1655 PySys_SetObject("exc_value", val);
1656 PySys_SetObject("exc_type", exc);
Guido van Rossum374a9221991-04-04 10:40:29 +00001657 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001658 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001659 PUSH(val);
1660 PUSH(exc);
1661 }
1662 else {
1663 if (why == WHY_RETURN)
1664 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00001665 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00001666 PUSH(v);
1667 }
1668 why = WHY_NOT;
1669 JUMPTO(b->b_handler);
1670 break;
1671 }
1672 } /* unwind stack */
1673
1674 /* End the loop if we still have an error (or return) */
1675
1676 if (why != WHY_NOT)
1677 break;
1678
1679 } /* main loop */
1680
1681 /* Pop remaining stack entries */
1682
1683 while (!EMPTY()) {
1684 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001685 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001686 }
1687
Guido van Rossum96a42c81992-01-12 02:29:51 +00001688 if (why != WHY_RETURN)
1689 retval = NULL;
1690
Guido van Rossume59214e1994-08-30 08:01:59 +00001691 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001692 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001693 if (call_trace(&f->f_trace, &f->f_trace, f,
1694 "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001695 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001696 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001697 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001698 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001699 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001700 }
1701
Guido van Rossumb209a111997-04-29 18:18:01 +00001702 if (_PySys_ProfileFunc && why == WHY_RETURN) {
1703 if (call_trace(&_PySys_ProfileFunc, (PyObject**)0,
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001704 f, "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001705 Py_XDECREF(retval);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001706 retval = NULL;
1707 why = WHY_EXCEPTION;
1708 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001709 }
Guido van Rossuma4240131997-01-21 21:18:36 +00001710
Guido van Rossum8c5df061997-01-24 04:19:24 +00001711 --recursion_depth;
1712
1713 fail: /* Jump here from prelude on failure */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001714
Guido van Rossum374a9221991-04-04 10:40:29 +00001715 /* Restore previous frame and release the current one */
Guido van Rossum681d79a1995-07-18 14:51:37 +00001716
Guido van Rossum374a9221991-04-04 10:40:29 +00001717 current_frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +00001718 Py_DECREF(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001719
Guido van Rossum96a42c81992-01-12 02:29:51 +00001720 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001721}
1722
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001723/* Logic for the raise statement (too complicated for inlining).
1724 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00001725static enum why_code
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001726do_raise(type, value, tb)
Guido van Rossumb209a111997-04-29 18:18:01 +00001727 PyObject *type, *value, *tb;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001728{
1729 /* We support the following forms of raise:
1730 raise <class>, <classinstance>
1731 raise <class>, <argument tuple>
1732 raise <class>, None
1733 raise <class>, <argument>
1734 raise <classinstance>, None
1735 raise <string>, <object>
1736 raise <string>, None
1737
1738 An omitted second argument is the same as None.
1739
1740 In addition, raise <tuple>, <anything> is the same as
1741 raising the tuple's first item (and it better have one!);
1742 this rule is applied recursively.
1743
1744 Finally, an optional third argument can be supplied, which
1745 gives the traceback to be substituted (useful when
1746 re-raising an exception after examining it). */
1747
1748 /* First, check the traceback argument, replacing None with
1749 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00001750 if (tb == Py_None) {
1751 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001752 tb = NULL;
1753 }
1754 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001755 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001756 "raise 3rd arg must be traceback or None");
1757 goto raise_error;
1758 }
1759
1760 /* Next, replace a missing value with None */
1761 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001762 value = Py_None;
1763 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001764 }
1765
1766 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00001767 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
1768 PyObject *tmp = type;
1769 type = PyTuple_GET_ITEM(type, 0);
1770 Py_INCREF(type);
1771 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001772 }
1773
1774 /* Now switch on the exception's type */
Guido van Rossumb209a111997-04-29 18:18:01 +00001775 if (PyString_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001776 ;
1777 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001778 else if (PyClass_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001779 /* Raising a class. If the value is an instance, it
1780 better be an instance of the class. If it is not,
1781 it will be used to create an instance. */
Guido van Rossumb209a111997-04-29 18:18:01 +00001782 if (PyInstance_Check(value)) {
1783 PyObject *inclass = (PyObject*)
1784 (((PyInstanceObject*)value)->in_class);
1785 if (!PyClass_IsSubclass(inclass, type)) {
1786 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001787 "raise <class>, <instance> requires that <instance> is a member of <class>");
1788 goto raise_error;
1789 }
1790 }
1791 else {
1792 /* Go instantiate the class */
Guido van Rossumb209a111997-04-29 18:18:01 +00001793 PyObject *args, *res;
1794 if (value == Py_None)
1795 args = Py_BuildValue("()");
1796 else if (PyTuple_Check(value)) {
1797 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001798 args = value;
1799 }
1800 else
Guido van Rossumb209a111997-04-29 18:18:01 +00001801 args = Py_BuildValue("(O)", value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001802 if (args == NULL)
1803 goto raise_error;
Guido van Rossumb209a111997-04-29 18:18:01 +00001804 res = PyEval_CallObject(type, args);
1805 Py_DECREF(args);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001806 if (res == NULL)
1807 goto raise_error;
Guido van Rossumb209a111997-04-29 18:18:01 +00001808 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001809 value = res;
1810 }
1811 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001812 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001813 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00001814 if (value != Py_None) {
1815 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001816 "instance exception may not have a separate value");
1817 goto raise_error;
1818 }
1819 else {
1820 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00001821 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001822 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00001823 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
1824 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001825 }
1826 }
1827 else {
1828 /* Not something you can raise. You get an exception
1829 anyway, just not what you specified :-) */
Guido van Rossumb209a111997-04-29 18:18:01 +00001830 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001831 "exceptions must be strings, classes, or instances");
1832 goto raise_error;
1833 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001834 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001835 if (tb == NULL)
1836 return WHY_EXCEPTION;
1837 else
1838 return WHY_RERAISE;
1839 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00001840 Py_XDECREF(value);
1841 Py_XDECREF(type);
1842 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001843 return WHY_EXCEPTION;
1844}
1845
Guido van Rossum96a42c81992-01-12 02:29:51 +00001846#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00001847static int
1848prtrace(v, str)
Guido van Rossumb209a111997-04-29 18:18:01 +00001849 PyObject *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001850 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001851{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001852 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00001853 if (PyObject_Print(v, stdout, 0) != 0)
1854 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001855 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001856}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001857#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001858
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001859static void
1860call_exc_trace(p_trace, p_newtrace, f)
Guido van Rossumb209a111997-04-29 18:18:01 +00001861 PyObject **p_trace, **p_newtrace;
1862 PyFrameObject *f;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001863{
Guido van Rossumb209a111997-04-29 18:18:01 +00001864 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001865 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00001866 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00001867 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001868 value = Py_None;
1869 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00001870 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001871 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001872 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001873 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001874 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001875 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001876 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001877 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001878 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00001879 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001880 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001881 Py_XDECREF(type);
1882 Py_XDECREF(value);
1883 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001884 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001885}
1886
1887static int
1888call_trace(p_trace, p_newtrace, f, msg, arg)
Guido van Rossumb209a111997-04-29 18:18:01 +00001889 PyObject **p_trace; /* in/out; may not be NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001890 may not point to NULL variable initially */
Guido van Rossumb209a111997-04-29 18:18:01 +00001891 PyObject **p_newtrace; /* in/out; may be NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001892 may point to NULL variable;
1893 may be same variable as p_newtrace */
Guido van Rossumb209a111997-04-29 18:18:01 +00001894 PyFrameObject *f;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001895 char *msg;
Guido van Rossumb209a111997-04-29 18:18:01 +00001896 PyObject *arg;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001897{
Guido van Rossumb209a111997-04-29 18:18:01 +00001898 PyObject *args, *what;
1899 PyObject *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001900 static int tracing = 0;
1901
1902 if (tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001903 /* Don't do recursive traces */
1904 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001905 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001906 *p_newtrace = NULL;
1907 }
1908 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001909 }
1910
Guido van Rossumb209a111997-04-29 18:18:01 +00001911 args = PyTuple_New(3);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001912 if (args == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00001913 goto Py_Cleanup;
1914 what = PyString_FromString(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001915 if (what == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00001916 goto Py_Cleanup;
1917 Py_INCREF(f);
1918 PyTuple_SET_ITEM(args, 0, (PyObject *)f);
1919 PyTuple_SET_ITEM(args, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001920 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00001921 arg = Py_None;
1922 Py_INCREF(arg);
1923 PyTuple_SET_ITEM(args, 2, arg);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001924 tracing++;
Guido van Rossumb209a111997-04-29 18:18:01 +00001925 PyFrame_FastToLocals(f);
1926 res = PyEval_CallObject(*p_trace, args); /* May clear *p_trace! */
1927 PyFrame_LocalsToFast(f, 1);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001928 tracing--;
Guido van Rossumb209a111997-04-29 18:18:01 +00001929 Py_Cleanup:
1930 Py_XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001931 if (res == NULL) {
1932 /* The trace proc raised an exception */
Guido van Rossumb209a111997-04-29 18:18:01 +00001933 PyTraceBack_Here(f);
1934 Py_XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001935 *p_trace = NULL;
1936 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001937 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001938 *p_newtrace = NULL;
1939 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001940 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001941 }
1942 else {
1943 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001944 Py_XDECREF(*p_newtrace);
1945 if (res == Py_None)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001946 *p_newtrace = NULL;
1947 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001948 Py_INCREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001949 *p_newtrace = res;
1950 }
1951 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001952 Py_DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001953 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001954 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001955}
1956
Guido van Rossumb209a111997-04-29 18:18:01 +00001957PyObject *
1958PyEval_GetBuiltins()
Guido van Rossum6135a871995-01-09 17:53:26 +00001959{
1960 if (current_frame == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00001961 return PyBuiltin_GetModule();
Guido van Rossum6135a871995-01-09 17:53:26 +00001962 else
1963 return current_frame->f_builtins;
1964}
1965
Guido van Rossumb209a111997-04-29 18:18:01 +00001966PyObject *
1967PyEval_GetLocals()
Guido van Rossum5b722181993-03-30 17:46:03 +00001968{
1969 if (current_frame == NULL)
1970 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00001971 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00001972 return current_frame->f_locals;
1973}
1974
Guido van Rossumb209a111997-04-29 18:18:01 +00001975PyObject *
1976PyEval_GetGlobals()
Guido van Rossum3f5da241990-12-20 15:06:42 +00001977{
1978 if (current_frame == NULL)
1979 return NULL;
1980 else
1981 return current_frame->f_globals;
1982}
1983
Guido van Rossumb209a111997-04-29 18:18:01 +00001984PyObject *
1985PyEval_GetFrame()
Guido van Rossume59214e1994-08-30 08:01:59 +00001986{
Guido van Rossumb209a111997-04-29 18:18:01 +00001987 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00001988}
1989
Guido van Rossum6135a871995-01-09 17:53:26 +00001990int
Guido van Rossumb209a111997-04-29 18:18:01 +00001991PyEval_GetRestricted()
Guido van Rossum6135a871995-01-09 17:53:26 +00001992{
1993 return current_frame == NULL ? 0 : current_frame->f_restricted;
1994}
1995
Guido van Rossum3f5da241990-12-20 15:06:42 +00001996void
Guido van Rossumb209a111997-04-29 18:18:01 +00001997Py_FlushLine()
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001998{
Guido van Rossumb209a111997-04-29 18:18:01 +00001999 PyObject *f = PySys_GetObject("stdout");
2000 if (PyFile_SoftSpace(f, 0))
2001 PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002002}
2003
Guido van Rossum3f5da241990-12-20 15:06:42 +00002004
Guido van Rossum06186511995-01-07 12:40:10 +00002005#define BINOP(opname, ropname, thisfunc) \
Guido van Rossumb209a111997-04-29 18:18:01 +00002006 if (!PyInstance_Check(v) && !PyInstance_Check(w)) \
Guido van Rossum06186511995-01-07 12:40:10 +00002007 ; \
2008 else \
Guido van Rossumb209a111997-04-29 18:18:01 +00002009 return PyInstance_DoBinOp(v, w, opname, ropname, thisfunc)
Guido van Rossum180d7b41994-09-29 09:45:57 +00002010
2011
Guido van Rossumb209a111997-04-29 18:18:01 +00002012static PyObject *
Guido van Rossum7928cd71991-10-24 14:59:31 +00002013or(v, w)
Guido van Rossumb209a111997-04-29 18:18:01 +00002014 PyObject *v, *w;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002015{
Guido van Rossum06186511995-01-07 12:40:10 +00002016 BINOP("__or__", "__ror__", or);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002017 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002018 PyObject *x = NULL;
2019 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
2020 if (PyNumber_Coerce(&v, &w) != 0)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002021 return NULL;
2022 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
2023 x = (*f)(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00002024 Py_DECREF(v);
2025 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002026 if (f != NULL)
2027 return x;
2028 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002029 PyErr_SetString(PyExc_TypeError, "bad operand type(s) for |");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002030 return NULL;
2031}
2032
Guido van Rossumb209a111997-04-29 18:18:01 +00002033static PyObject *
Guido van Rossum7928cd71991-10-24 14:59:31 +00002034xor(v, w)
Guido van Rossumb209a111997-04-29 18:18:01 +00002035 PyObject *v, *w;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002036{
Guido van Rossum06186511995-01-07 12:40:10 +00002037 BINOP("__xor__", "__rxor__", xor);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002038 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002039 PyObject *x = NULL;
2040 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
2041 if (PyNumber_Coerce(&v, &w) != 0)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002042 return NULL;
2043 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
2044 x = (*f)(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00002045 Py_DECREF(v);
2046 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002047 if (f != NULL)
2048 return x;
2049 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002050 PyErr_SetString(PyExc_TypeError, "bad operand type(s) for ^");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002051 return NULL;
2052}
2053
Guido van Rossumb209a111997-04-29 18:18:01 +00002054static PyObject *
Guido van Rossum7928cd71991-10-24 14:59:31 +00002055and(v, w)
Guido van Rossumb209a111997-04-29 18:18:01 +00002056 PyObject *v, *w;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002057{
Guido van Rossum06186511995-01-07 12:40:10 +00002058 BINOP("__and__", "__rand__", and);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002059 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002060 PyObject *x = NULL;
2061 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
2062 if (PyNumber_Coerce(&v, &w) != 0)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002063 return NULL;
2064 if ((f = v->ob_type->tp_as_number->nb_and) != NULL)
2065 x = (*f)(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00002066 Py_DECREF(v);
2067 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002068 if (f != NULL)
2069 return x;
2070 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002071 PyErr_SetString(PyExc_TypeError, "bad operand type(s) for &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002072 return NULL;
2073}
2074
Guido van Rossumb209a111997-04-29 18:18:01 +00002075static PyObject *
Guido van Rossum7928cd71991-10-24 14:59:31 +00002076lshift(v, w)
Guido van Rossumb209a111997-04-29 18:18:01 +00002077 PyObject *v, *w;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002078{
Guido van Rossum06186511995-01-07 12:40:10 +00002079 BINOP("__lshift__", "__rlshift__", lshift);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002080 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002081 PyObject *x = NULL;
2082 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
2083 if (PyNumber_Coerce(&v, &w) != 0)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002084 return NULL;
2085 if ((f = v->ob_type->tp_as_number->nb_lshift) != NULL)
2086 x = (*f)(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00002087 Py_DECREF(v);
2088 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002089 if (f != NULL)
2090 return x;
2091 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002092 PyErr_SetString(PyExc_TypeError, "bad operand type(s) for <<");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002093 return NULL;
2094}
2095
Guido van Rossumb209a111997-04-29 18:18:01 +00002096static PyObject *
Guido van Rossum7928cd71991-10-24 14:59:31 +00002097rshift(v, w)
Guido van Rossumb209a111997-04-29 18:18:01 +00002098 PyObject *v, *w;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002099{
Guido van Rossum06186511995-01-07 12:40:10 +00002100 BINOP("__rshift__", "__rrshift__", rshift);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002101 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002102 PyObject *x = NULL;
2103 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
2104 if (PyNumber_Coerce(&v, &w) != 0)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002105 return NULL;
2106 if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
2107 x = (*f)(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00002108 Py_DECREF(v);
2109 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002110 if (f != NULL)
2111 return x;
2112 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002113 PyErr_SetString(PyExc_TypeError, "bad operand type(s) for >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002114 return NULL;
2115}
2116
Guido van Rossumb209a111997-04-29 18:18:01 +00002117static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002118add(v, w)
Guido van Rossumb209a111997-04-29 18:18:01 +00002119 PyObject *v, *w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002120{
Guido van Rossum06186511995-01-07 12:40:10 +00002121 BINOP("__add__", "__radd__", add);
Guido van Rossume6eefc21992-08-14 12:06:52 +00002122 if (v->ob_type->tp_as_sequence != NULL)
2123 return (*v->ob_type->tp_as_sequence->sq_concat)(v, w);
2124 else if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002125 PyObject *x;
2126 if (PyNumber_Coerce(&v, &w) != 0)
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002127 return NULL;
2128 x = (*v->ob_type->tp_as_number->nb_add)(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00002129 Py_DECREF(v);
2130 Py_DECREF(w);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002131 return x;
2132 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002133 PyErr_SetString(PyExc_TypeError, "bad operand type(s) for +");
Guido van Rossum34679b71993-01-26 13:33:44 +00002134 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002135}
2136
Guido van Rossumb209a111997-04-29 18:18:01 +00002137static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002138sub(v, w)
Guido van Rossumb209a111997-04-29 18:18:01 +00002139 PyObject *v, *w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002140{
Guido van Rossum06186511995-01-07 12:40:10 +00002141 BINOP("__sub__", "__rsub__", sub);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002142 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002143 PyObject *x;
2144 if (PyNumber_Coerce(&v, &w) != 0)
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002145 return NULL;
2146 x = (*v->ob_type->tp_as_number->nb_subtract)(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00002147 Py_DECREF(v);
2148 Py_DECREF(w);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002149 return x;
2150 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002151 PyErr_SetString(PyExc_TypeError, "bad operand type(s) for -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002152 return NULL;
2153}
2154
Guido van Rossumb209a111997-04-29 18:18:01 +00002155static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002156mul(v, w)
Guido van Rossumb209a111997-04-29 18:18:01 +00002157 PyObject *v, *w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002158{
Guido van Rossumb209a111997-04-29 18:18:01 +00002159 PyTypeObject *tp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00002160 tp = v->ob_type;
Guido van Rossum06186511995-01-07 12:40:10 +00002161 BINOP("__mul__", "__rmul__", mul);
Guido van Rossume6eefc21992-08-14 12:06:52 +00002162 if (tp->tp_as_number != NULL &&
2163 w->ob_type->tp_as_sequence != NULL &&
Guido van Rossumb209a111997-04-29 18:18:01 +00002164 !PyInstance_Check(v)) {
Guido van Rossume6eefc21992-08-14 12:06:52 +00002165 /* number*sequence -- swap v and w */
Guido van Rossumb209a111997-04-29 18:18:01 +00002166 PyObject *tmp = v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002167 v = w;
2168 w = tmp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00002169 tp = v->ob_type;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002170 }
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002171 if (tp->tp_as_number != NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002172 PyObject *x;
2173 if (PyInstance_Check(v)) {
Guido van Rossume6eefc21992-08-14 12:06:52 +00002174 /* Instances of user-defined classes get their
2175 other argument uncoerced, so they may
2176 implement sequence*number as well as
2177 number*number. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002178 Py_INCREF(v);
2179 Py_INCREF(w);
Guido van Rossume6eefc21992-08-14 12:06:52 +00002180 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002181 else if (PyNumber_Coerce(&v, &w) != 0)
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002182 return NULL;
2183 x = (*v->ob_type->tp_as_number->nb_multiply)(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00002184 Py_DECREF(v);
2185 Py_DECREF(w);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002186 return x;
2187 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002188 if (tp->tp_as_sequence != NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002189 if (!PyInt_Check(w)) {
2190 PyErr_SetString(PyExc_TypeError,
Guido van Rossum3f5da241990-12-20 15:06:42 +00002191 "can't multiply sequence with non-int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002192 return NULL;
2193 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002194 return (*tp->tp_as_sequence->sq_repeat)
Guido van Rossumb209a111997-04-29 18:18:01 +00002195 (v, (int)PyInt_AsLong(w));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002196 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002197 PyErr_SetString(PyExc_TypeError, "bad operand type(s) for *");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002198 return NULL;
2199}
2200
Guido van Rossumb209a111997-04-29 18:18:01 +00002201static PyObject *
Guido van Rossum40d0b7e1990-12-20 23:03:11 +00002202divide(v, w)
Guido van Rossumb209a111997-04-29 18:18:01 +00002203 PyObject *v, *w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002204{
Guido van Rossum06186511995-01-07 12:40:10 +00002205 BINOP("__div__", "__rdiv__", divide);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002206 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002207 PyObject *x;
2208 if (PyNumber_Coerce(&v, &w) != 0)
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002209 return NULL;
2210 x = (*v->ob_type->tp_as_number->nb_divide)(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00002211 Py_DECREF(v);
2212 Py_DECREF(w);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002213 return x;
2214 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002215 PyErr_SetString(PyExc_TypeError, "bad operand type(s) for /");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002216 return NULL;
2217}
2218
Guido van Rossumb209a111997-04-29 18:18:01 +00002219static PyObject *
Guido van Rossum06186511995-01-07 12:40:10 +00002220mod(v, w)
Guido van Rossumb209a111997-04-29 18:18:01 +00002221 PyObject *v, *w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002222{
Guido van Rossumb209a111997-04-29 18:18:01 +00002223 if (PyString_Check(v)) {
2224 return PyString_Format(v, w);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002225 }
Guido van Rossum06186511995-01-07 12:40:10 +00002226 BINOP("__mod__", "__rmod__", mod);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002227 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002228 PyObject *x;
2229 if (PyNumber_Coerce(&v, &w) != 0)
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002230 return NULL;
2231 x = (*v->ob_type->tp_as_number->nb_remainder)(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00002232 Py_DECREF(v);
2233 Py_DECREF(w);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002234 return x;
2235 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002236 PyErr_SetString(PyExc_TypeError, "bad operand type(s) for %");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002237 return NULL;
2238}
2239
Guido van Rossumb209a111997-04-29 18:18:01 +00002240static PyObject *
Guido van Rossum3b4da591996-06-19 21:49:17 +00002241powerop(v, w)
Guido van Rossumb209a111997-04-29 18:18:01 +00002242 PyObject *v, *w;
Guido van Rossum50564e81996-01-12 01:13:16 +00002243{
Guido van Rossumb209a111997-04-29 18:18:01 +00002244 PyObject *res;
Guido van Rossum3b4da591996-06-19 21:49:17 +00002245 BINOP("__pow__", "__rpow__", powerop);
Guido van Rossum50564e81996-01-12 01:13:16 +00002246 if (v->ob_type->tp_as_number == NULL ||
2247 w->ob_type->tp_as_number == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002248 PyErr_SetString(PyExc_TypeError, "pow() requires numeric arguments");
Guido van Rossum50564e81996-01-12 01:13:16 +00002249 return NULL;
2250 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002251 if (PyNumber_Coerce(&v, &w) != 0)
Guido van Rossum50564e81996-01-12 01:13:16 +00002252 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002253 res = (*v->ob_type->tp_as_number->nb_power)(v, w, Py_None);
2254 Py_DECREF(v);
2255 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +00002256 return res;
2257}
2258
Guido van Rossumb209a111997-04-29 18:18:01 +00002259static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002260neg(v)
Guido van Rossumb209a111997-04-29 18:18:01 +00002261 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002262{
2263 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002264 return (*v->ob_type->tp_as_number->nb_negative)(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00002265 PyErr_SetString(PyExc_TypeError, "bad operand type(s) for unary -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002266 return NULL;
2267}
2268
Guido van Rossumb209a111997-04-29 18:18:01 +00002269static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002270pos(v)
Guido van Rossumb209a111997-04-29 18:18:01 +00002271 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002272{
2273 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002274 return (*v->ob_type->tp_as_number->nb_positive)(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00002275 PyErr_SetString(PyExc_TypeError, "bad operand type(s) for unary +");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002276 return NULL;
2277}
2278
Guido van Rossumb209a111997-04-29 18:18:01 +00002279static PyObject *
Guido van Rossum7928cd71991-10-24 14:59:31 +00002280invert(v)
Guido van Rossumb209a111997-04-29 18:18:01 +00002281 PyObject *v;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002282{
Guido van Rossumb209a111997-04-29 18:18:01 +00002283 PyObject * (*f) Py_FPROTO((PyObject *));
Guido van Rossum7928cd71991-10-24 14:59:31 +00002284 if (v->ob_type->tp_as_number != NULL &&
2285 (f = v->ob_type->tp_as_number->nb_invert) != NULL)
2286 return (*f)(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00002287 PyErr_SetString(PyExc_TypeError, "bad operand type(s) for unary ~");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002288 return NULL;
2289}
2290
Guido van Rossumb209a111997-04-29 18:18:01 +00002291static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002292not(v)
Guido van Rossumb209a111997-04-29 18:18:01 +00002293 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002294{
Guido van Rossumb209a111997-04-29 18:18:01 +00002295 int outcome = PyObject_IsTrue(v);
2296 PyObject *w;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002297 if (outcome < 0)
2298 return NULL;
2299 if (outcome == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002300 w = Py_True;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002301 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002302 w = Py_False;
2303 Py_INCREF(w);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002304 return w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002305}
Guido van Rossum234f9421993-06-17 12:35:49 +00002306
2307
Guido van Rossum681d79a1995-07-18 14:51:37 +00002308/* External interface to call any callable object.
2309 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002310
Guido van Rossumb209a111997-04-29 18:18:01 +00002311PyObject *
2312PyEval_CallObject(func, arg)
2313 PyObject *func;
2314 PyObject *arg;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002315{
Guido van Rossumb209a111997-04-29 18:18:01 +00002316 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002317}
Guido van Rossume59214e1994-08-30 08:01:59 +00002318
Guido van Rossumb209a111997-04-29 18:18:01 +00002319PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002320PyEval_CallObjectWithKeywords(func, arg, kw)
Guido van Rossumb209a111997-04-29 18:18:01 +00002321 PyObject *func;
2322 PyObject *arg;
2323 PyObject *kw;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002324{
2325 ternaryfunc call;
Guido van Rossumb209a111997-04-29 18:18:01 +00002326 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002327
2328 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002329 arg = PyTuple_New(0);
2330 else if (!PyTuple_Check(arg)) {
2331 PyErr_SetString(PyExc_TypeError, "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002332 return NULL;
2333 }
2334 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002335 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002336
Guido van Rossumb209a111997-04-29 18:18:01 +00002337 if (kw != NULL && !PyDict_Check(kw)) {
2338 PyErr_SetString(PyExc_TypeError, "keyword list must be a dictionary");
Guido van Rossume3e61c11995-08-04 04:14:47 +00002339 return NULL;
2340 }
2341
Guido van Rossum150b2df1996-12-05 23:17:11 +00002342 if ((call = func->ob_type->tp_call) != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002343 result = (*call)(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002344 else if (PyMethod_Check(func) || PyFunction_Check(func))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002345 result = call_function(func, arg, kw);
2346 else
2347 result = call_builtin(func, arg, kw);
2348
Guido van Rossumb209a111997-04-29 18:18:01 +00002349 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002350
Guido van Rossumb209a111997-04-29 18:18:01 +00002351 if (result == NULL && !PyErr_Occurred())
2352 PyErr_SetString(PyExc_SystemError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002353 "NULL result without error in call_object");
Guido van Rossume59214e1994-08-30 08:01:59 +00002354
2355 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002356}
2357
Guido van Rossumb209a111997-04-29 18:18:01 +00002358static PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002359call_builtin(func, arg, kw)
Guido van Rossumb209a111997-04-29 18:18:01 +00002360 PyObject *func;
2361 PyObject *arg;
2362 PyObject *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002363{
Guido van Rossumb209a111997-04-29 18:18:01 +00002364 if (PyCFunction_Check(func)) {
2365 PyCFunction meth = PyCFunction_GetFunction(func);
2366 PyObject *self = PyCFunction_GetSelf(func);
2367 int flags = PyCFunction_GetFlags(func);
Guido van Rossumff8b4941995-07-26 18:16:42 +00002368 if (!(flags & METH_VARARGS)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002369 int size = PyTuple_Size(arg);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002370 if (size == 1)
Guido van Rossumb209a111997-04-29 18:18:01 +00002371 arg = PyTuple_GET_ITEM(arg, 0);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002372 else if (size == 0)
2373 arg = NULL;
2374 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002375 if (flags & METH_KEYWORDS)
2376 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002377 if (kw != NULL && PyDict_Size(kw) != 0) {
2378 PyErr_SetString(PyExc_TypeError,
Guido van Rossumff8b4941995-07-26 18:16:42 +00002379 "this function takes no keyword arguments");
2380 return NULL;
2381 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002382 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002383 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002384 if (PyClass_Check(func)) {
2385 return PyInstance_New(func, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002386 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002387 if (PyInstance_Check(func)) {
2388 PyObject *res, *call = PyObject_GetAttrString(func,"__call__");
Guido van Rossume59214e1994-08-30 08:01:59 +00002389 if (call == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002390 PyErr_Clear();
2391 PyErr_SetString(PyExc_AttributeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002392 "no __call__ method defined");
Guido van Rossume59214e1994-08-30 08:01:59 +00002393 return NULL;
2394 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002395 res = PyEval_CallObjectWithKeywords(call, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002396 Py_DECREF(call);
Guido van Rossume59214e1994-08-30 08:01:59 +00002397 return res;
2398 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002399 PyErr_SetString(PyExc_TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002400 return NULL;
2401}
2402
Guido van Rossumb209a111997-04-29 18:18:01 +00002403static PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002404call_function(func, arg, kw)
Guido van Rossumb209a111997-04-29 18:18:01 +00002405 PyObject *func;
2406 PyObject *arg;
2407 PyObject *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002408{
Guido van Rossumb209a111997-04-29 18:18:01 +00002409 PyObject *class = NULL; /* == owner */
2410 PyObject *argdefs;
2411 PyObject **d, **k;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002412 int nk, nd;
Guido van Rossumb209a111997-04-29 18:18:01 +00002413 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002414
Guido van Rossumb209a111997-04-29 18:18:01 +00002415 if (kw != NULL && !PyDict_Check(kw)) {
2416 PyErr_BadInternalCall();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002417 return NULL;
2418 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002419
Guido van Rossumb209a111997-04-29 18:18:01 +00002420 if (PyMethod_Check(func)) {
2421 PyObject *self = PyMethod_Self(func);
2422 class = PyMethod_Class(func);
2423 func = PyMethod_Function(func);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002424 if (self == NULL) {
2425 /* Unbound methods must be called with an instance of
2426 the class (or a derived class) as first argument */
Guido van Rossumb209a111997-04-29 18:18:01 +00002427 if (PyTuple_Size(arg) >= 1) {
2428 self = PyTuple_GET_ITEM(arg, 0);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002429 if (self != NULL &&
Guido van Rossumb209a111997-04-29 18:18:01 +00002430 PyInstance_Check(self) &&
2431 PyClass_IsSubclass((PyObject *)
2432 (((PyInstanceObject *)self)->in_class),
Guido van Rossumb3f72581993-05-21 19:56:10 +00002433 class))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002434 /* Handy-dandy */ ;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002435 else
2436 self = NULL;
2437 }
2438 if (self == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002439 PyErr_SetString(PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002440 "unbound method must be called with class instance 1st argument");
Guido van Rossumb3f72581993-05-21 19:56:10 +00002441 return NULL;
2442 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002443 Py_INCREF(arg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002444 }
2445 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002446 int argcount = PyTuple_Size(arg);
2447 PyObject *newarg = PyTuple_New(argcount + 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002448 int i;
Guido van Rossum81daa321993-05-20 14:24:46 +00002449 if (newarg == NULL)
2450 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002451 Py_INCREF(self);
2452 PyTuple_SET_ITEM(newarg, 0, self);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002453 for (i = 0; i < argcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002454 PyObject *v = PyTuple_GET_ITEM(arg, i);
2455 Py_XINCREF(v);
2456 PyTuple_SET_ITEM(newarg, i+1, v);
Guido van Rossum81daa321993-05-20 14:24:46 +00002457 }
2458 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002459 }
2460 }
2461 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002462 if (!PyFunction_Check(func)) {
2463 PyErr_SetString(PyExc_TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002464 return NULL;
2465 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002466 Py_INCREF(arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002467 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002468
2469 argdefs = PyFunction_GetDefaults(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00002470 if (argdefs != NULL && PyTuple_Check(argdefs)) {
2471 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
2472 nd = PyTuple_Size(argdefs);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002473 }
2474 else {
2475 d = NULL;
2476 nd = 0;
2477 }
2478
2479 if (kw != NULL) {
2480 int pos, i;
Guido van Rossumb209a111997-04-29 18:18:01 +00002481 nk = PyDict_Size(kw);
2482 k = PyMem_NEW(PyObject *, 2*nk);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002483 if (k == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002484 PyErr_NoMemory();
2485 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002486 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00002487 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002488 pos = i = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00002489 while (PyDict_Next(kw, &pos, &k[i], &k[i+1]))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002490 i += 2;
2491 nk = i/2;
2492 /* XXX This is broken if the caller deletes dict items! */
2493 }
2494 else {
2495 k = NULL;
2496 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00002497 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002498
Guido van Rossum681d79a1995-07-18 14:51:37 +00002499 result = eval_code2(
Guido van Rossumb209a111997-04-29 18:18:01 +00002500 (PyCodeObject *)PyFunction_GetCode(func),
2501 PyFunction_GetGlobals(func), (PyObject *)NULL,
2502 &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg),
Guido van Rossum681d79a1995-07-18 14:51:37 +00002503 k, nk,
2504 d, nd,
2505 class);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002506
Guido van Rossumb209a111997-04-29 18:18:01 +00002507 Py_DECREF(arg);
2508 PyMem_XDEL(k);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002509
Guido van Rossum681d79a1995-07-18 14:51:37 +00002510 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002511}
2512
Guido van Rossum3b9c6671996-07-30 18:40:29 +00002513#define SLICE_ERROR_MSG \
2514 "standard sequence type does not support step size other than one"
2515
Guido van Rossumb209a111997-04-29 18:18:01 +00002516static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002517apply_subscript(v, w)
Guido van Rossumb209a111997-04-29 18:18:01 +00002518 PyObject *v, *w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002519{
Guido van Rossumb209a111997-04-29 18:18:01 +00002520 PyTypeObject *tp = v->ob_type;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002521 if (tp->tp_as_sequence == NULL && tp->tp_as_mapping == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002522 PyErr_SetString(PyExc_TypeError, "unsubscriptable object");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002523 return NULL;
2524 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00002525 if (tp->tp_as_mapping != NULL) {
2526 return (*tp->tp_as_mapping->mp_subscript)(v, w);
2527 }
2528 else {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002529 int i;
Guido van Rossumb209a111997-04-29 18:18:01 +00002530 if (!PyInt_Check(w)) {
Guido van Rossum3b9c6671996-07-30 18:40:29 +00002531 if (PySlice_Check(w)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002532 PyErr_SetString(PyExc_ValueError, SLICE_ERROR_MSG);
Guido van Rossum3b9c6671996-07-30 18:40:29 +00002533 } else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002534 PyErr_SetString(PyExc_TypeError,
Guido van Rossum3b9c6671996-07-30 18:40:29 +00002535 "sequence subscript not int");
2536 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002537 return NULL;
2538 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002539 i = PyInt_AsLong(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002540 if (i < 0) {
2541 int len = (*tp->tp_as_sequence->sq_length)(v);
2542 if (len < 0)
2543 return NULL;
2544 i += len;
2545 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002546 return (*tp->tp_as_sequence->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002547 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002548}
2549
Guido van Rossumb209a111997-04-29 18:18:01 +00002550static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002551loop_subscript(v, w)
Guido van Rossumb209a111997-04-29 18:18:01 +00002552 PyObject *v, *w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002553{
Guido van Rossumb209a111997-04-29 18:18:01 +00002554 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00002555 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002556 if (sq == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002557 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002558 return NULL;
2559 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002560 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00002561 v = (*sq->sq_item)(v, i);
2562 if (v)
2563 return v;
Guido van Rossumb209a111997-04-29 18:18:01 +00002564 if (PyErr_Occurred() == PyExc_IndexError)
2565 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00002566 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002567}
2568
2569static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00002570slice_index(v, isize, pi)
Guido van Rossumb209a111997-04-29 18:18:01 +00002571 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002572 int isize;
2573 int *pi;
2574{
2575 if (v != NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002576 if (!PyInt_Check(v)) {
2577 PyErr_SetString(PyExc_TypeError, "slice index must be int");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002578 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002579 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002580 *pi = PyInt_AsLong(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002581 if (*pi < 0)
2582 *pi += isize;
2583 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002584 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002585}
2586
Guido van Rossumb209a111997-04-29 18:18:01 +00002587static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002588apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00002589 PyObject *u, *v, *w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002590{
Guido van Rossumb209a111997-04-29 18:18:01 +00002591 PyTypeObject *tp = u->ob_type;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002592 int ilow, ihigh, isize;
2593 if (tp->tp_as_sequence == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002594 PyErr_SetString(PyExc_TypeError, "only sequences can be sliced");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002595 return NULL;
2596 }
2597 ilow = 0;
2598 isize = ihigh = (*tp->tp_as_sequence->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002599 if (isize < 0)
2600 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002601 if (slice_index(v, isize, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002602 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002603 if (slice_index(w, isize, &ihigh) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002604 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002605 return (*tp->tp_as_sequence->sq_slice)(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002606}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002607
2608static int
2609assign_subscript(w, key, v) /* w[key] = v */
Guido van Rossumb209a111997-04-29 18:18:01 +00002610 PyObject *w;
2611 PyObject *key;
2612 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002613{
Guido van Rossumb209a111997-04-29 18:18:01 +00002614 PyTypeObject *tp = w->ob_type;
2615 PySequenceMethods *sq;
2616 PyMappingMethods *mp;
Guido van Rossum1d339e81995-02-17 15:04:21 +00002617 int (*func1)();
2618 int (*func2)();
Guido van Rossum04691fc1992-08-12 15:35:34 +00002619 if ((mp = tp->tp_as_mapping) != NULL &&
Guido van Rossum1d339e81995-02-17 15:04:21 +00002620 (func1 = mp->mp_ass_subscript) != NULL) {
2621 return (*func1)(w, key, v);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002622 }
2623 else if ((sq = tp->tp_as_sequence) != NULL &&
Guido van Rossum1d339e81995-02-17 15:04:21 +00002624 (func2 = sq->sq_ass_item) != NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002625 if (!PyInt_Check(key)) {
2626 PyErr_SetString(PyExc_TypeError,
Guido van Rossum98256aa1991-12-24 13:25:19 +00002627 "sequence subscript must be integer (assign or del)");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002628 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002629 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00002630 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002631 int i = PyInt_AsLong(key);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002632 if (i < 0) {
2633 int len = (*sq->sq_length)(w);
2634 if (len < 0)
2635 return -1;
2636 i += len;
2637 }
Guido van Rossum1d339e81995-02-17 15:04:21 +00002638 return (*func2)(w, i, v);
Guido van Rossum98256aa1991-12-24 13:25:19 +00002639 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002640 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002641 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002642 PyErr_SetString(PyExc_TypeError,
Guido van Rossum3f5da241990-12-20 15:06:42 +00002643 "can't assign to this subscripted object");
2644 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002645 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002646}
2647
Guido van Rossum3f5da241990-12-20 15:06:42 +00002648static int
2649assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossumb209a111997-04-29 18:18:01 +00002650 PyObject *u, *v, *w, *x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002651{
Guido van Rossumb209a111997-04-29 18:18:01 +00002652 PySequenceMethods *sq = u->ob_type->tp_as_sequence;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002653 int ilow, ihigh, isize;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002654 if (sq == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002655 PyErr_SetString(PyExc_TypeError, "assign to slice of non-sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002656 return -1;
2657 }
2658 if (sq == NULL || sq->sq_ass_slice == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002659 PyErr_SetString(PyExc_TypeError, "unassignable slice");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002660 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002661 }
2662 ilow = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002663 isize = ihigh = (*sq->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002664 if (isize < 0)
2665 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002666 if (slice_index(v, isize, &ilow) != 0)
2667 return -1;
2668 if (slice_index(w, isize, &ihigh) != 0)
2669 return -1;
2670 return (*sq->sq_ass_slice)(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002671}
2672
2673static int
2674cmp_exception(err, v)
Guido van Rossumb209a111997-04-29 18:18:01 +00002675 PyObject *err, *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002676{
Guido van Rossumb209a111997-04-29 18:18:01 +00002677 if (PyTuple_Check(v)) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002678 int i, n;
Guido van Rossumb209a111997-04-29 18:18:01 +00002679 n = PyTuple_Size(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002680 for (i = 0; i < n; i++) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00002681 /* Test recursively */
Guido van Rossumb209a111997-04-29 18:18:01 +00002682 if (cmp_exception(err, PyTuple_GET_ITEM(v, i)))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002683 return 1;
2684 }
2685 return 0;
2686 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002687 if (PyClass_Check(v) && PyClass_Check(err))
2688 return PyClass_IsSubclass(err, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002689 return err == v;
2690}
2691
Guido van Rossum3f5da241990-12-20 15:06:42 +00002692static int
2693cmp_member(v, w)
Guido van Rossumb209a111997-04-29 18:18:01 +00002694 PyObject *v, *w;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002695{
Guido van Rossume59214e1994-08-30 08:01:59 +00002696 int i, cmp;
Guido van Rossumb209a111997-04-29 18:18:01 +00002697 PyObject *x;
2698 PySequenceMethods *sq;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002699 /* Special case for char in string */
Guido van Rossumb209a111997-04-29 18:18:01 +00002700 if (PyString_Check(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002701 register char *s, *end;
2702 register char c;
Guido van Rossumb209a111997-04-29 18:18:01 +00002703 if (!PyString_Check(v) || PyString_Size(v) != 1) {
2704 PyErr_SetString(PyExc_TypeError,
Guido van Rossum3f5da241990-12-20 15:06:42 +00002705 "string member test needs char left operand");
2706 return -1;
2707 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002708 c = PyString_AsString(v)[0];
2709 s = PyString_AsString(w);
2710 end = s + PyString_Size(w);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002711 while (s < end) {
2712 if (c == *s++)
2713 return 1;
2714 }
2715 return 0;
2716 }
2717 sq = w->ob_type->tp_as_sequence;
2718 if (sq == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002719 PyErr_SetString(PyExc_TypeError,
Guido van Rossum3f5da241990-12-20 15:06:42 +00002720 "'in' or 'not in' needs sequence right argument");
2721 return -1;
2722 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002723 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002724 x = (*sq->sq_item)(w, i);
Guido van Rossume59214e1994-08-30 08:01:59 +00002725 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002726 if (PyErr_Occurred() == PyExc_IndexError) {
2727 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00002728 break;
2729 }
2730 return -1;
2731 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002732 cmp = PyObject_Compare(v, x);
2733 Py_XDECREF(x);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002734 if (cmp == 0)
2735 return 1;
2736 }
2737 return 0;
2738}
2739
Guido van Rossumb209a111997-04-29 18:18:01 +00002740static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002741cmp_outcome(op, v, w)
Guido van Rossum5b7313a1992-04-06 13:24:57 +00002742 int op;
Guido van Rossumb209a111997-04-29 18:18:01 +00002743 register PyObject *v;
2744 register PyObject *w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002745{
2746 register int cmp;
2747 register int res = 0;
2748 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002749 case IS:
2750 case IS_NOT:
2751 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002752 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002753 res = !res;
2754 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002755 case IN:
2756 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002757 res = cmp_member(v, w);
2758 if (res < 0)
2759 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002760 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002761 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002762 break;
2763 case EXC_MATCH:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002764 res = cmp_exception(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002765 break;
2766 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00002767 cmp = PyObject_Compare(v, w);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002768 switch (op) {
2769 case LT: res = cmp < 0; break;
2770 case LE: res = cmp <= 0; break;
2771 case EQ: res = cmp == 0; break;
2772 case NE: res = cmp != 0; break;
2773 case GT: res = cmp > 0; break;
2774 case GE: res = cmp >= 0; break;
2775 /* XXX no default? (res is initialized to 0 though) */
2776 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002777 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002778 v = res ? Py_True : Py_False;
2779 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002780 return v;
2781}
2782
Guido van Rossum3f5da241990-12-20 15:06:42 +00002783static int
2784import_from(locals, v, name)
Guido van Rossumb209a111997-04-29 18:18:01 +00002785 PyObject *locals;
2786 PyObject *v;
2787 PyObject *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002788{
Guido van Rossumb209a111997-04-29 18:18:01 +00002789 PyObject *w, *x;
2790 if (!PyModule_Check(v)) {
2791 PyErr_SetString(PyExc_TypeError, "import-from requires module object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002792 return -1;
2793 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002794 w = PyModule_GetDict(v);
2795 if (PyString_AsString(name)[0] == '*') {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002796 int pos, err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002797 PyObject *name, *value;
Guido van Rossum25831651993-05-19 14:50:45 +00002798 pos = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00002799 while (PyDict_Next(w, &pos, &name, &value)) {
2800 if (!PyString_Check(name) ||
2801 PyString_AsString(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002802 continue;
Guido van Rossumb209a111997-04-29 18:18:01 +00002803 Py_INCREF(value);
2804 err = PyDict_SetItem(locals, name, value);
2805 Py_DECREF(value);
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002806 if (err != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002807 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002808 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002809 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002810 }
2811 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002812 x = PyDict_GetItem(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002813 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00002814 char buf[250];
Guido van Rossum16dfd291992-02-05 11:17:30 +00002815 sprintf(buf, "cannot import name %.230s",
Guido van Rossumb209a111997-04-29 18:18:01 +00002816 PyString_AsString(name));
2817 PyErr_SetString(PyExc_ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002818 return -1;
2819 }
2820 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002821 return PyDict_SetItem(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002822 }
2823}
2824
Guido van Rossumb209a111997-04-29 18:18:01 +00002825static PyObject *
Guido van Rossum25831651993-05-19 14:50:45 +00002826build_class(methods, bases, name)
Guido van Rossumb209a111997-04-29 18:18:01 +00002827 PyObject *methods; /* dictionary */
2828 PyObject *bases; /* tuple containing classes */
2829 PyObject *name; /* string */
Guido van Rossume9736fc1990-11-18 17:33:06 +00002830{
Guido van Rossum25831651993-05-19 14:50:45 +00002831 int i;
Guido van Rossumb209a111997-04-29 18:18:01 +00002832 if (!PyTuple_Check(bases)) {
2833 PyErr_SetString(PyExc_SystemError, "build_class with non-tuple bases");
Guido van Rossum25831651993-05-19 14:50:45 +00002834 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002835 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002836 if (!PyDict_Check(methods)) {
2837 PyErr_SetString(PyExc_SystemError, "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002838 return NULL;
2839 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002840 if (!PyString_Check(name)) {
2841 PyErr_SetString(PyExc_SystemError, "build_class witn non-string name");
Guido van Rossum25831651993-05-19 14:50:45 +00002842 return NULL;
2843 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002844 for (i = PyTuple_Size(bases); --i >= 0; ) {
2845 PyObject *base = PyTuple_GET_ITEM(bases, i);
2846 if (!PyClass_Check(base)) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002847 /* Call the base's *type*, if it is callable.
2848 This code is a hook for Donald Beaudry's
2849 and Jim Fulton's type extensions. In
2850 unexended Python it will never be triggered
2851 since its types are not callable. */
2852 if (base->ob_type->ob_type->tp_call) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002853 PyObject *args;
2854 PyObject *class;
2855 args = Py_BuildValue("(OOO)", name, bases, methods);
2856 class = PyEval_CallObject((PyObject *)base->ob_type,
Guido van Rossum150b2df1996-12-05 23:17:11 +00002857 args);
Guido van Rossumb209a111997-04-29 18:18:01 +00002858 Py_DECREF(args);
Guido van Rossum150b2df1996-12-05 23:17:11 +00002859 return class;
2860 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002861 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +00002862 "base is not a class object");
2863 return NULL;
2864 }
2865 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002866 return PyClass_New(bases, methods, name);
Guido van Rossum25831651993-05-19 14:50:45 +00002867}
2868
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002869static int
2870exec_statement(prog, globals, locals)
Guido van Rossumb209a111997-04-29 18:18:01 +00002871 PyObject *prog;
2872 PyObject *globals;
2873 PyObject *locals;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002874{
2875 char *s;
2876 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00002877 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002878 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002879
Guido van Rossumb209a111997-04-29 18:18:01 +00002880 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
2881 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002882 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00002883 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002884 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00002885 locals = PyTuple_GetItem(prog, 2);
2886 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002887 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002888 if (globals == Py_None) {
2889 globals = PyEval_GetGlobals();
2890 if (locals == Py_None) {
2891 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002892 plain = 1;
2893 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002894 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002895 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002896 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00002897 if (!PyString_Check(prog) &&
2898 !PyCode_Check(prog) &&
2899 !PyFile_Check(prog)) {
2900 PyErr_SetString(PyExc_TypeError,
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002901 "exec 1st arg must be string, code or file object");
2902 return -1;
2903 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002904 if (!PyDict_Check(globals) || !PyDict_Check(locals)) {
2905 PyErr_SetString(PyExc_TypeError,
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002906 "exec 2nd/3rd args must be dict or None");
2907 return -1;
2908 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002909 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
2910 PyDict_SetItemString(globals, "__builtins__", current_frame->f_builtins);
2911 if (PyCode_Check(prog)) {
2912 if (PyEval_EvalCode((PyCodeObject *) prog, globals, locals) == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002913 return -1;
2914 return 0;
2915 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002916 if (PyFile_Check(prog)) {
2917 FILE *fp = PyFile_AsFile(prog);
2918 char *name = PyString_AsString(PyFile_Name(prog));
2919 if (PyRun_File(fp, name, file_input, globals, locals) == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002920 return -1;
2921 return 0;
2922 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002923 s = PyString_AsString(prog);
2924 if (strlen(s) != PyString_Size(prog)) {
2925 PyErr_SetString(PyExc_ValueError, "embedded '\\0' in exec string");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002926 return -1;
2927 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002928 v = PyRun_String(s, file_input, globals, locals);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002929 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002930 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00002931 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002932 if (plain)
Guido van Rossumb209a111997-04-29 18:18:01 +00002933 PyFrame_LocalsToFast(current_frame, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002934 return 0;
2935}
Guido van Rossum24c13741995-02-14 09:42:43 +00002936
Guido van Rossum1aa14831997-01-21 05:34:20 +00002937/* Hack for ni.py */
Guido van Rossumb209a111997-04-29 18:18:01 +00002938static PyObject *
Guido van Rossum24c13741995-02-14 09:42:43 +00002939find_from_args(f, nexti)
Guido van Rossumb209a111997-04-29 18:18:01 +00002940 PyFrameObject *f;
Guido van Rossum24c13741995-02-14 09:42:43 +00002941 int nexti;
2942{
2943 int opcode;
2944 int oparg;
Guido van Rossumb209a111997-04-29 18:18:01 +00002945 PyObject *list, *name;
Guido van Rossum24c13741995-02-14 09:42:43 +00002946 unsigned char *next_instr;
2947
2948 next_instr = GETUSTRINGVALUE(f->f_code->co_code) + nexti;
2949 opcode = (*next_instr++);
2950 if (opcode != IMPORT_FROM) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002951 Py_INCREF(Py_None);
2952 return Py_None;
Guido van Rossum24c13741995-02-14 09:42:43 +00002953 }
2954
Guido van Rossumb209a111997-04-29 18:18:01 +00002955 list = PyList_New(0);
Guido van Rossum24c13741995-02-14 09:42:43 +00002956 if (list == NULL)
2957 return NULL;
2958
2959 do {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002960 oparg = (next_instr[1]<<8) + next_instr[0];
2961 next_instr += 2;
Guido van Rossum24c13741995-02-14 09:42:43 +00002962 name = Getnamev(f, oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002963 if (PyList_Append(list, name) < 0) {
2964 Py_DECREF(list);
Guido van Rossum24c13741995-02-14 09:42:43 +00002965 break;
2966 }
2967 opcode = (*next_instr++);
2968 } while (opcode == IMPORT_FROM);
2969
2970 return list;
2971}
Guido van Rossum950361c1997-01-24 13:49:28 +00002972
2973
2974#ifdef DYNAMIC_EXECUTION_PROFILE
2975
2976PyObject *
2977getarray(a)
2978 long a[256];
2979{
2980 int i;
2981 PyObject *l = PyList_New(256);
2982 if (l == NULL) return NULL;
2983 for (i = 0; i < 256; i++) {
2984 PyObject *x = PyInt_FromLong(a[i]);
2985 if (x == NULL) {
2986 Py_DECREF(l);
2987 return NULL;
2988 }
2989 PyList_SetItem(l, i, x);
2990 }
2991 for (i = 0; i < 256; i++)
2992 a[i] = 0;
2993 return l;
2994}
2995
2996PyObject *
2997_Py_GetDXProfile(self, args)
2998 PyObject *self, *args;
2999{
3000#ifndef DXPAIRS
3001 return getarray(dxp);
3002#else
3003 int i;
3004 PyObject *l = PyList_New(257);
3005 if (l == NULL) return NULL;
3006 for (i = 0; i < 257; i++) {
3007 PyObject *x = getarray(dxpairs[i]);
3008 if (x == NULL) {
3009 Py_DECREF(l);
3010 return NULL;
3011 }
3012 PyList_SetItem(l, i, x);
3013 }
3014 return l;
3015#endif
3016}
3017
3018#endif