blob: 70e3d0028545102324574eb8bb2063af16c8983d [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 Rossumfd71b9e2000-06-30 23:50:40 +00007Copyright (c) 2000, BeOpen.com.
8Copyright (c) 1995-2000, Corporation for National Research Initiatives.
9Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
10All rights reserved.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000011
Guido van Rossumfd71b9e2000-06-30 23:50:40 +000012See the file "Misc/COPYRIGHT" for information on usage and
13redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000014
15******************************************************************/
16
Guido van Rossum3f5da241990-12-20 15:06:42 +000017/* Execute compiled code */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000018
Guido van Rossum681d79a1995-07-18 14:51:37 +000019/* XXX TO DO:
20 XXX how to pass arguments to call_trace?
Guido van Rossum681d79a1995-07-18 14:51:37 +000021 XXX speed up searching for keywords by using a dictionary
Guido van Rossum681d79a1995-07-18 14:51:37 +000022 XXX document it!
23 */
24
Guido van Rossumb209a111997-04-29 18:18:01 +000025#include "Python.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000026
Guido van Rossum10dc2e81990-11-18 17:27:39 +000027#include "compile.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000028#include "frameobject.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000029#include "eval.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000030#include "opcode.h"
31
Guido van Rossumc6004111993-11-05 10:22:19 +000032#include <ctype.h>
33
Guido van Rossuma027efa1997-05-05 20:56:21 +000034#ifdef HAVE_LIMITS_H
35#include <limits.h>
36#else
37#define INT_MAX 2147483647
38#endif
39
Guido van Rossum04691fc1992-08-12 15:35:34 +000040/* Turn this on if your compiler chokes on the big switch: */
Guido van Rossum1ae940a1995-01-02 19:04:15 +000041/* #define CASE_TOO_BIG 1 */
Guido van Rossum04691fc1992-08-12 15:35:34 +000042
Guido van Rossum408027e1996-12-30 16:17:54 +000043#ifdef Py_DEBUG
Guido van Rossum96a42c81992-01-12 02:29:51 +000044/* For debugging the interpreter: */
45#define LLTRACE 1 /* Low-level trace feature */
46#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000047#endif
48
Guido van Rossum5b722181993-03-30 17:46:03 +000049
Guido van Rossum374a9221991-04-04 10:40:29 +000050/* Forward declarations */
Guido van Rossum374a9221991-04-04 10:40:29 +000051
Guido van Rossumb209a111997-04-29 18:18:01 +000052static PyObject *eval_code2 Py_PROTO((PyCodeObject *,
53 PyObject *, PyObject *,
54 PyObject **, int,
55 PyObject **, int,
56 PyObject **, int,
57 PyObject *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000058#ifdef LLTRACE
Guido van Rossumb209a111997-04-29 18:18:01 +000059static int prtrace Py_PROTO((PyObject *, char *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000060#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +000061static void call_exc_trace Py_PROTO((PyObject **, PyObject**,
62 PyFrameObject *));
63static int call_trace Py_PROTO((PyObject **, PyObject **,
64 PyFrameObject *, char *, PyObject *));
Guido van Rossumb209a111997-04-29 18:18:01 +000065static PyObject *call_builtin Py_PROTO((PyObject *, PyObject *, PyObject *));
66static PyObject *call_function Py_PROTO((PyObject *, PyObject *, PyObject *));
Guido van Rossumb209a111997-04-29 18:18:01 +000067static PyObject *loop_subscript Py_PROTO((PyObject *, PyObject *));
Guido van Rossumb209a111997-04-29 18:18:01 +000068static PyObject *apply_slice Py_PROTO((PyObject *, PyObject *, PyObject *));
Guido van Rossuma027efa1997-05-05 20:56:21 +000069static int assign_slice Py_PROTO((PyObject *, PyObject *,
70 PyObject *, PyObject *));
Guido van Rossumb209a111997-04-29 18:18:01 +000071static PyObject *cmp_outcome Py_PROTO((int, PyObject *, PyObject *));
72static int import_from Py_PROTO((PyObject *, PyObject *, PyObject *));
73static PyObject *build_class Py_PROTO((PyObject *, PyObject *, PyObject *));
Guido van Rossuma027efa1997-05-05 20:56:21 +000074static int exec_statement Py_PROTO((PyFrameObject *,
75 PyObject *, PyObject *, PyObject *));
Guido van Rossumb209a111997-04-29 18:18:01 +000076static PyObject *find_from_args Py_PROTO((PyFrameObject *, int));
Guido van Rossuma027efa1997-05-05 20:56:21 +000077static void set_exc_info Py_PROTO((PyThreadState *,
78 PyObject *, PyObject *, PyObject *));
79static void reset_exc_info Py_PROTO((PyThreadState *));
Guido van Rossum374a9221991-04-04 10:40:29 +000080
81
Guido van Rossum950361c1997-01-24 13:49:28 +000082/* Dynamic execution profile */
83#ifdef DYNAMIC_EXECUTION_PROFILE
84#ifdef DXPAIRS
85static long dxpairs[257][256];
86#define dxp dxpairs[256]
87#else
88static long dxp[256];
89#endif
90#endif
91
92
Guido van Rossume59214e1994-08-30 08:01:59 +000093#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +000094
Guido van Rossum2571cc81999-04-07 16:07:23 +000095#ifndef DONT_HAVE_ERRNO_H
Guido van Rossum1984f1e1992-08-04 12:41:02 +000096#include <errno.h>
Guido van Rossum2571cc81999-04-07 16:07:23 +000097#endif
Guido van Rossum49b56061998-10-01 20:42:43 +000098#include "pythread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000099
Guido van Rossuma027efa1997-05-05 20:56:21 +0000100extern int _PyThread_Started; /* Flag for Py_Exit */
101
Guido van Rossum65d5b571998-12-21 19:32:43 +0000102static PyThread_type_lock interpreter_lock = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000103static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000104
105void
Guido van Rossumb209a111997-04-29 18:18:01 +0000106PyEval_InitThreads()
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000107{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000108 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000109 return;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000110 _PyThread_Started = 1;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000111 interpreter_lock = PyThread_allocate_lock();
112 PyThread_acquire_lock(interpreter_lock, 1);
113 main_thread = PyThread_get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000114}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000115
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000116void
Guido van Rossum25ce5661997-08-02 03:10:38 +0000117PyEval_AcquireLock()
118{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000119 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000120}
121
122void
123PyEval_ReleaseLock()
124{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000125 PyThread_release_lock(interpreter_lock);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000126}
127
128void
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000129PyEval_AcquireThread(tstate)
130 PyThreadState *tstate;
131{
132 if (tstate == NULL)
133 Py_FatalError("PyEval_AcquireThread: NULL new thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000134 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000135 if (PyThreadState_Swap(tstate) != NULL)
136 Py_FatalError(
137 "PyEval_AcquireThread: non-NULL old thread state");
138}
139
140void
141PyEval_ReleaseThread(tstate)
142 PyThreadState *tstate;
143{
144 if (tstate == NULL)
145 Py_FatalError("PyEval_ReleaseThread: NULL thread state");
146 if (PyThreadState_Swap(NULL) != tstate)
147 Py_FatalError("PyEval_ReleaseThread: wrong thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000148 PyThread_release_lock(interpreter_lock);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000149}
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000150#endif
151
Guido van Rossumff4949e1992-08-05 19:58:53 +0000152/* Functions save_thread and restore_thread are always defined so
153 dynamically loaded modules needn't be compiled separately for use
154 with and without threads: */
155
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000156PyThreadState *
Guido van Rossumb209a111997-04-29 18:18:01 +0000157PyEval_SaveThread()
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000158{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000159 PyThreadState *tstate = PyThreadState_Swap(NULL);
160 if (tstate == NULL)
161 Py_FatalError("PyEval_SaveThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000162#ifdef WITH_THREAD
Guido van Rossumb74eca91997-09-30 22:03:16 +0000163 if (interpreter_lock)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000164 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000165#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000166 return tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000167}
168
169void
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000170PyEval_RestoreThread(tstate)
171 PyThreadState *tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000172{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000173 if (tstate == NULL)
174 Py_FatalError("PyEval_RestoreThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000175#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000176 if (interpreter_lock) {
Guido van Rossumb74eca91997-09-30 22:03:16 +0000177 int err = errno;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000178 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000179 errno = err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000180 }
181#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000182 PyThreadState_Swap(tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000183}
184
185
Guido van Rossuma9672091994-09-14 13:31:22 +0000186/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
187 signal handlers or Mac I/O completion routines) can schedule calls
188 to a function to be called synchronously.
189 The synchronous function is called with one void* argument.
190 It should return 0 for success or -1 for failure -- failure should
191 be accompanied by an exception.
192
193 If registry succeeds, the registry function returns 0; if it fails
194 (e.g. due to too many pending calls) it returns -1 (without setting
195 an exception condition).
196
197 Note that because registry may occur from within signal handlers,
198 or other asynchronous events, calling malloc() is unsafe!
199
200#ifdef WITH_THREAD
201 Any thread can schedule pending calls, but only the main thread
202 will execute them.
203#endif
204
205 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
206 There are two possible race conditions:
207 (1) nested asynchronous registry calls;
208 (2) registry calls made while pending calls are being processed.
209 While (1) is very unlikely, (2) is a real possibility.
210 The current code is safe against (2), but not against (1).
211 The safety against (2) is derived from the fact that only one
212 thread (the main thread) ever takes things out of the queue.
Guido van Rossuma9672091994-09-14 13:31:22 +0000213
Guido van Rossuma027efa1997-05-05 20:56:21 +0000214 XXX Darn! With the advent of thread state, we should have an array
215 of pending calls per thread in the thread state! Later...
216*/
Guido van Rossum8861b741996-07-30 16:49:37 +0000217
Guido van Rossuma9672091994-09-14 13:31:22 +0000218#define NPENDINGCALLS 32
219static struct {
Guido van Rossumb209a111997-04-29 18:18:01 +0000220 int (*func) Py_PROTO((ANY *));
Guido van Rossuma9672091994-09-14 13:31:22 +0000221 ANY *arg;
222} pendingcalls[NPENDINGCALLS];
223static volatile int pendingfirst = 0;
224static volatile int pendinglast = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000225static volatile int things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000226
227int
228Py_AddPendingCall(func, arg)
Guido van Rossumb209a111997-04-29 18:18:01 +0000229 int (*func) Py_PROTO((ANY *));
Guido van Rossuma9672091994-09-14 13:31:22 +0000230 ANY *arg;
231{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000232 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000233 int i, j;
234 /* XXX Begin critical section */
235 /* XXX If you want this to be safe against nested
236 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000237 if (busy)
238 return -1;
239 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000240 i = pendinglast;
241 j = (i + 1) % NPENDINGCALLS;
242 if (j == pendingfirst)
243 return -1; /* Queue full */
244 pendingcalls[i].func = func;
245 pendingcalls[i].arg = arg;
246 pendinglast = j;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000247 things_to_do = 1; /* Signal main loop */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000248 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000249 /* XXX End critical section */
250 return 0;
251}
252
Guido van Rossum180d7b41994-09-29 09:45:57 +0000253int
254Py_MakePendingCalls()
Guido van Rossuma9672091994-09-14 13:31:22 +0000255{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000256 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000257#ifdef WITH_THREAD
Guido van Rossum65d5b571998-12-21 19:32:43 +0000258 if (main_thread && PyThread_get_thread_ident() != main_thread)
Guido van Rossuma9672091994-09-14 13:31:22 +0000259 return 0;
260#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000261 if (busy)
Guido van Rossum180d7b41994-09-29 09:45:57 +0000262 return 0;
263 busy = 1;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000264 things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000265 for (;;) {
266 int i;
Guido van Rossumb209a111997-04-29 18:18:01 +0000267 int (*func) Py_PROTO((ANY *));
Guido van Rossuma9672091994-09-14 13:31:22 +0000268 ANY *arg;
269 i = pendingfirst;
270 if (i == pendinglast)
271 break; /* Queue empty */
272 func = pendingcalls[i].func;
273 arg = pendingcalls[i].arg;
274 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000275 if (func(arg) < 0) {
276 busy = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000277 things_to_do = 1; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000278 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000279 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000280 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000281 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000282 return 0;
283}
284
285
Guido van Rossum374a9221991-04-04 10:40:29 +0000286/* Status code for main loop (reason for stack unwind) */
287
288enum why_code {
289 WHY_NOT, /* No error */
290 WHY_EXCEPTION, /* Exception occurred */
291 WHY_RERAISE, /* Exception re-raised by 'finally' */
292 WHY_RETURN, /* 'return' statement */
293 WHY_BREAK /* 'break' statement */
294};
295
Guido van Rossumb209a111997-04-29 18:18:01 +0000296static enum why_code do_raise Py_PROTO((PyObject *, PyObject *, PyObject *));
Barry Warsawe42b18f1997-08-25 22:13:04 +0000297static int unpack_sequence Py_PROTO((PyObject *, int, PyObject **));
Guido van Rossum1aa14831997-01-21 05:34:20 +0000298
Guido van Rossum374a9221991-04-04 10:40:29 +0000299
Guido van Rossumb209a111997-04-29 18:18:01 +0000300PyObject *
301PyEval_EvalCode(co, globals, locals)
302 PyCodeObject *co;
303 PyObject *globals;
304 PyObject *locals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000305{
306 return eval_code2(co,
307 globals, locals,
Guido van Rossumb209a111997-04-29 18:18:01 +0000308 (PyObject **)NULL, 0,
309 (PyObject **)NULL, 0,
310 (PyObject **)NULL, 0,
311 (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000312}
313
314
315/* Interpreter main loop */
316
Guido van Rossum8861b741996-07-30 16:49:37 +0000317#ifndef MAX_RECURSION_DEPTH
318#define MAX_RECURSION_DEPTH 10000
319#endif
320
Guido van Rossumb209a111997-04-29 18:18:01 +0000321static PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +0000322eval_code2(co, globals, locals,
323 args, argcount, kws, kwcount, defs, defcount, owner)
Guido van Rossumb209a111997-04-29 18:18:01 +0000324 PyCodeObject *co;
325 PyObject *globals;
326 PyObject *locals;
327 PyObject **args;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000328 int argcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000329 PyObject **kws; /* length: 2*kwcount */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000330 int kwcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000331 PyObject **defs;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000332 int defcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000333 PyObject *owner;
Guido van Rossum374a9221991-04-04 10:40:29 +0000334{
Guido van Rossum950361c1997-01-24 13:49:28 +0000335#ifdef DXPAIRS
336 int lastopcode = 0;
337#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000338 register unsigned char *next_instr;
Guido van Rossum50cd3481998-11-17 17:02:51 +0000339 register int opcode; /* Current opcode */
340 register int oparg; /* Current opcode argument, if any */
Guido van Rossumb209a111997-04-29 18:18:01 +0000341 register PyObject **stack_pointer;
Guido van Rossum374a9221991-04-04 10:40:29 +0000342 register enum why_code why; /* Reason for block stack unwind */
343 register int err; /* Error status -- nonzero if error */
Guido van Rossumb209a111997-04-29 18:18:01 +0000344 register PyObject *x; /* Result object -- NULL if error */
345 register PyObject *v; /* Temporary objects popped off stack */
346 register PyObject *w;
347 register PyObject *u;
348 register PyObject *t;
349 register PyFrameObject *f; /* Current frame */
Guido van Rossum50cd3481998-11-17 17:02:51 +0000350 register PyObject **fastlocals;
Guido van Rossum014518f1998-11-23 21:09:51 +0000351 PyObject *retval = NULL; /* Return value */
Guido van Rossum885553e1998-12-21 18:33:30 +0000352 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossumd076c731998-10-07 19:42:25 +0000353 unsigned char *first_instr;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000354#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000355 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000356#endif
Guido van Rossum408027e1996-12-30 16:17:54 +0000357#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000358 /* Make it easier to find out where we are with a debugger */
Guido van Rossumb209a111997-04-29 18:18:01 +0000359 char *filename = PyString_AsString(co->co_filename);
Guido van Rossum99bec951992-09-03 20:29:45 +0000360#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000361
362/* Code access macros */
363
364#define GETCONST(i) Getconst(f, i)
365#define GETNAME(i) Getname(f, i)
366#define GETNAMEV(i) Getnamev(f, i)
Guido van Rossumd076c731998-10-07 19:42:25 +0000367#define INSTR_OFFSET() (next_instr - first_instr)
Guido van Rossum374a9221991-04-04 10:40:29 +0000368#define NEXTOP() (*next_instr++)
369#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossumd076c731998-10-07 19:42:25 +0000370#define JUMPTO(x) (next_instr = first_instr + (x))
Guido van Rossum374a9221991-04-04 10:40:29 +0000371#define JUMPBY(x) (next_instr += (x))
372
373/* Stack manipulation macros */
374
375#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
376#define EMPTY() (STACK_LEVEL() == 0)
377#define TOP() (stack_pointer[-1])
378#define BASIC_PUSH(v) (*stack_pointer++ = (v))
379#define BASIC_POP() (*--stack_pointer)
380
Guido van Rossum96a42c81992-01-12 02:29:51 +0000381#ifdef LLTRACE
382#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
383#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000384#else
385#define PUSH(v) BASIC_PUSH(v)
386#define POP() BASIC_POP()
387#endif
388
Guido van Rossum681d79a1995-07-18 14:51:37 +0000389/* Local variable macros */
390
391#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumb209a111997-04-29 18:18:01 +0000392#define SETLOCAL(i, value) do { Py_XDECREF(GETLOCAL(i)); \
Guido van Rossum681d79a1995-07-18 14:51:37 +0000393 GETLOCAL(i) = value; } while (0)
394
Guido van Rossuma027efa1997-05-05 20:56:21 +0000395/* Start of code */
396
Guido van Rossum8861b741996-07-30 16:49:37 +0000397#ifdef USE_STACKCHECK
Guido van Rossuma027efa1997-05-05 20:56:21 +0000398 if (tstate->recursion_depth%10 == 0 && PyOS_CheckStack()) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000399 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
Guido van Rossum8861b741996-07-30 16:49:37 +0000400 return NULL;
401 }
402#endif
403
Guido van Rossum681d79a1995-07-18 14:51:37 +0000404 if (globals == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000405 PyErr_SetString(PyExc_SystemError, "eval_code2: NULL globals");
Guido van Rossum6135a871995-01-09 17:53:26 +0000406 return NULL;
Guido van Rossum5b722181993-03-30 17:46:03 +0000407 }
408
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000409#ifdef LLTRACE
Guido van Rossumb209a111997-04-29 18:18:01 +0000410 lltrace = PyDict_GetItemString(globals, "__lltrace__") != NULL;
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000411#endif
412
Guido van Rossumb209a111997-04-29 18:18:01 +0000413 f = PyFrame_New(
Guido van Rossuma027efa1997-05-05 20:56:21 +0000414 tstate, /*back*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000415 co, /*code*/
416 globals, /*globals*/
Guido van Rossum76836021997-01-20 04:26:20 +0000417 locals); /*locals*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000418 if (f == NULL)
419 return NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000420
Guido van Rossuma027efa1997-05-05 20:56:21 +0000421 tstate->frame = f;
Guido van Rossumdeb0c5e1997-01-27 23:42:36 +0000422 fastlocals = f->f_localsplus;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000423
424 if (co->co_argcount > 0 ||
425 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
426 int i;
427 int n = argcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000428 PyObject *kwdict = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000429 if (co->co_flags & CO_VARKEYWORDS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000430 kwdict = PyDict_New();
Guido van Rossum681d79a1995-07-18 14:51:37 +0000431 if (kwdict == NULL)
432 goto fail;
Guido van Rossum8c5df061997-01-24 04:19:24 +0000433 i = co->co_argcount;
434 if (co->co_flags & CO_VARARGS)
435 i++;
436 SETLOCAL(i, kwdict);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000437 }
438 if (argcount > co->co_argcount) {
439 if (!(co->co_flags & CO_VARARGS)) {
Guido van Rossumdf9db1e1997-11-19 16:05:40 +0000440 PyErr_Format(PyExc_TypeError,
441 "too many arguments; expected %d, got %d",
442 co->co_argcount, argcount);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000443 goto fail;
444 }
445 n = co->co_argcount;
446 }
447 for (i = 0; i < n; i++) {
448 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000449 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000450 SETLOCAL(i, x);
451 }
452 if (co->co_flags & CO_VARARGS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000453 u = PyTuple_New(argcount - n);
Guido van Rossum8c5df061997-01-24 04:19:24 +0000454 if (u == NULL)
455 goto fail;
456 SETLOCAL(co->co_argcount, u);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000457 for (i = n; i < argcount; i++) {
458 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000459 Py_INCREF(x);
460 PyTuple_SET_ITEM(u, i-n, x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000461 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000462 }
463 for (i = 0; i < kwcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000464 PyObject *keyword = kws[2*i];
465 PyObject *value = kws[2*i + 1];
Guido van Rossum681d79a1995-07-18 14:51:37 +0000466 int j;
Guido van Rossum25da5be1999-10-26 00:12:20 +0000467 if (keyword == NULL || !PyString_Check(keyword)) {
468 PyErr_SetString(PyExc_TypeError,
469 "keywords must be strings");
470 goto fail;
471 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000472 /* XXX slow -- speed up using dictionary? */
473 for (j = 0; j < co->co_argcount; j++) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000474 PyObject *nm = PyTuple_GET_ITEM(
475 co->co_varnames, j);
Guido van Rossumb209a111997-04-29 18:18:01 +0000476 if (PyObject_Compare(keyword, nm) == 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000477 break;
478 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000479 /* Check errors from Compare */
480 if (PyErr_Occurred())
481 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000482 if (j >= co->co_argcount) {
483 if (kwdict == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000484 PyErr_Format(PyExc_TypeError,
Guido van Rossuma027efa1997-05-05 20:56:21 +0000485 "unexpected keyword argument: %.400s",
Jeremy Hylton76901512000-03-28 23:49:17 +0000486 PyString_AsString(keyword));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000487 goto fail;
488 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000489 PyDict_SetItem(kwdict, keyword, value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000490 }
491 else {
492 if (GETLOCAL(j) != NULL) {
Jeremy Hylton76901512000-03-28 23:49:17 +0000493 PyErr_Format(PyExc_TypeError,
494 "keyword parameter redefined: %.400s",
495 PyString_AsString(keyword));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000496 goto fail;
497 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000498 Py_INCREF(value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000499 SETLOCAL(j, value);
500 }
501 }
502 if (argcount < co->co_argcount) {
503 int m = co->co_argcount - defcount;
504 for (i = argcount; i < m; i++) {
505 if (GETLOCAL(i) == NULL) {
Guido van Rossumdf9db1e1997-11-19 16:05:40 +0000506 PyErr_Format(PyExc_TypeError,
507 "not enough arguments; expected %d, got %d",
508 m, i);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000509 goto fail;
510 }
511 }
512 if (n > m)
513 i = n - m;
514 else
515 i = 0;
516 for (; i < defcount; i++) {
517 if (GETLOCAL(m+i) == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000518 PyObject *def = defs[i];
519 Py_INCREF(def);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000520 SETLOCAL(m+i, def);
521 }
522 }
523 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000524 }
525 else {
526 if (argcount > 0 || kwcount > 0) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000527 PyErr_SetString(PyExc_TypeError,
528 "no arguments expected");
Guido van Rossum8c5df061997-01-24 04:19:24 +0000529 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000530 }
531 }
532
Guido van Rossuma027efa1997-05-05 20:56:21 +0000533 if (tstate->sys_tracefunc != NULL) {
534 /* tstate->sys_tracefunc, if defined, is a function that
535 will be called on *every* entry to a code block.
Guido van Rossum96a42c81992-01-12 02:29:51 +0000536 Its return value, if not None, is a function that
537 will be called at the start of each executed line
538 of code. (Actually, the function must return
539 itself in order to continue tracing.)
540 The trace functions are called with three arguments:
541 a pointer to the current frame, a string indicating
542 why the function is called, and an argument which
543 depends on the situation. The global trace function
544 (sys.trace) is also called whenever an exception
545 is detected. */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000546 if (call_trace(&tstate->sys_tracefunc,
547 &f->f_trace, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000548 Py_None/*XXX how to compute arguments now?*/)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000549 /* Trace function raised an error */
Guido van Rossum8c5df061997-01-24 04:19:24 +0000550 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000551 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000552 }
553
Guido van Rossuma027efa1997-05-05 20:56:21 +0000554 if (tstate->sys_profilefunc != NULL) {
555 /* Similar for sys_profilefunc, except it needn't return
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000556 itself and isn't called for "line" events */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000557 if (call_trace(&tstate->sys_profilefunc,
558 (PyObject**)0, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000559 Py_None/*XXX*/)) {
Guido van Rossum8c5df061997-01-24 04:19:24 +0000560 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000561 }
562 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000563
Guido van Rossuma027efa1997-05-05 20:56:21 +0000564 if (++tstate->recursion_depth > MAX_RECURSION_DEPTH) {
565 --tstate->recursion_depth;
566 PyErr_SetString(PyExc_RuntimeError,
567 "Maximum recursion depth exceeded");
568 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +0000569 Py_DECREF(f);
Guido van Rossum8861b741996-07-30 16:49:37 +0000570 return NULL;
571 }
572
Guido van Rossumd076c731998-10-07 19:42:25 +0000573 _PyCode_GETCODEPTR(co, &first_instr);
574 next_instr = first_instr;
Guido van Rossum374a9221991-04-04 10:40:29 +0000575 stack_pointer = f->f_valuestack;
576
Guido van Rossum374a9221991-04-04 10:40:29 +0000577 why = WHY_NOT;
578 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000579 x = Py_None; /* Not a reference, just anything non-NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000580
581 for (;;) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000582 /* Do periodic things. Doing this every time through
583 the loop would add too much overhead, so we do it
584 only every Nth instruction. We also do it if
585 ``things_to_do'' is set, i.e. when an asynchronous
586 event needs attention (e.g. a signal handler or
587 async I/O handler); see Py_AddPendingCall() and
588 Py_MakePendingCalls() above. */
Guido van Rossuma9672091994-09-14 13:31:22 +0000589
Guido van Rossuma027efa1997-05-05 20:56:21 +0000590 if (things_to_do || --tstate->ticker < 0) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000591 tstate->ticker = tstate->interp->checkinterval;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000592 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000593 if (Py_MakePendingCalls() < 0) {
594 why = WHY_EXCEPTION;
595 goto on_error;
596 }
597 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000598#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000599 /* If we have true signals, the signal handler
600 will call Py_AddPendingCall() so we don't
601 have to call sigcheck(). On the Mac and
602 DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000603 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000604 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000605 goto on_error;
606 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000607#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000608
Guido van Rossume59214e1994-08-30 08:01:59 +0000609#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000610 if (interpreter_lock) {
611 /* Give another thread a chance */
612
Guido van Rossum25ce5661997-08-02 03:10:38 +0000613 if (PyThreadState_Swap(NULL) != tstate)
614 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000615 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000616
617 /* Other threads may run now */
618
Guido van Rossum65d5b571998-12-21 19:32:43 +0000619 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000620 if (PyThreadState_Swap(tstate) != NULL)
621 Py_FatalError("ceval: orphan tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000622 }
623#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000624 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000625
Guido van Rossum374a9221991-04-04 10:40:29 +0000626 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000627
Guido van Rossum408027e1996-12-30 16:17:54 +0000628#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000629 f->f_lasti = INSTR_OFFSET();
630#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000631
632 opcode = NEXTOP();
633 if (HAS_ARG(opcode))
634 oparg = NEXTARG();
Guido van Rossum950361c1997-01-24 13:49:28 +0000635#ifdef DYNAMIC_EXECUTION_PROFILE
636#ifdef DXPAIRS
637 dxpairs[lastopcode][opcode]++;
638 lastopcode = opcode;
639#endif
640 dxp[opcode]++;
641#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000642
Guido van Rossum96a42c81992-01-12 02:29:51 +0000643#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000644 /* Instruction tracing */
645
Guido van Rossum96a42c81992-01-12 02:29:51 +0000646 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000647 if (HAS_ARG(opcode)) {
648 printf("%d: %d, %d\n",
649 (int) (INSTR_OFFSET() - 3),
650 opcode, oparg);
651 }
652 else {
653 printf("%d: %d\n",
654 (int) (INSTR_OFFSET() - 1), opcode);
655 }
656 }
657#endif
658
659 /* Main switch on opcode */
660
661 switch (opcode) {
662
663 /* BEWARE!
664 It is essential that any operation that fails sets either
665 x to NULL, err to nonzero, or why to anything but WHY_NOT,
666 and that no operation that succeeds does this! */
667
668 /* case STOP_CODE: this is an error! */
669
670 case POP_TOP:
671 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000672 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000673 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000674
675 case ROT_TWO:
676 v = POP();
677 w = POP();
678 PUSH(v);
679 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000680 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000681
682 case ROT_THREE:
683 v = POP();
684 w = POP();
685 x = POP();
686 PUSH(v);
687 PUSH(x);
688 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000689 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000690
691 case DUP_TOP:
692 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000693 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000694 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000695 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000696
697 case UNARY_POSITIVE:
698 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000699 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000700 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000701 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000702 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000703 break;
704
705 case UNARY_NEGATIVE:
706 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000707 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000708 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000709 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000710 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000711 break;
712
713 case UNARY_NOT:
714 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000715 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000716 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000717 if (err == 0) {
718 Py_INCREF(Py_True);
719 PUSH(Py_True);
720 continue;
721 }
722 else if (err > 0) {
723 Py_INCREF(Py_False);
724 PUSH(Py_False);
725 err = 0;
726 continue;
727 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000728 break;
729
730 case UNARY_CONVERT:
731 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000732 x = PyObject_Repr(v);
733 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000734 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000735 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000736 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000737
738 case UNARY_INVERT:
739 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000740 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000741 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000742 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000743 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000744 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000745
Guido van Rossum50564e81996-01-12 01:13:16 +0000746 case BINARY_POWER:
747 w = POP();
748 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000749 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000750 Py_DECREF(v);
751 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000752 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000753 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000754 break;
755
Guido van Rossum374a9221991-04-04 10:40:29 +0000756 case BINARY_MULTIPLY:
757 w = POP();
758 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000759 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000760 Py_DECREF(v);
761 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000762 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000763 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000764 break;
765
766 case BINARY_DIVIDE:
767 w = POP();
768 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000769 x = PyNumber_Divide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000770 Py_DECREF(v);
771 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000772 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000773 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000774 break;
775
776 case BINARY_MODULO:
777 w = POP();
778 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000779 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000780 Py_DECREF(v);
781 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000782 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000783 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000784 break;
785
786 case BINARY_ADD:
787 w = POP();
788 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000789 if (PyInt_Check(v) && PyInt_Check(w)) {
790 /* INLINE: int + int */
791 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000792 a = PyInt_AS_LONG(v);
793 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000794 i = a + b;
795 if ((i^a) < 0 && (i^b) < 0) {
796 PyErr_SetString(PyExc_OverflowError,
797 "integer addition");
798 x = NULL;
799 }
800 else
801 x = PyInt_FromLong(i);
802 }
803 else
804 x = PyNumber_Add(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000805 Py_DECREF(v);
806 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000807 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000808 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000809 break;
810
811 case BINARY_SUBTRACT:
812 w = POP();
813 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000814 if (PyInt_Check(v) && PyInt_Check(w)) {
815 /* INLINE: int - int */
816 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000817 a = PyInt_AS_LONG(v);
818 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000819 i = a - b;
820 if ((i^a) < 0 && (i^~b) < 0) {
821 PyErr_SetString(PyExc_OverflowError,
822 "integer subtraction");
823 x = NULL;
824 }
825 else
826 x = PyInt_FromLong(i);
827 }
828 else
829 x = PyNumber_Subtract(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000830 Py_DECREF(v);
831 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000832 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000833 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000834 break;
835
836 case BINARY_SUBSCR:
837 w = POP();
838 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000839 if (PyList_Check(v) && PyInt_Check(w)) {
840 /* INLINE: list[int] */
841 long i = PyInt_AsLong(w);
842 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +0000843 i += PyList_GET_SIZE(v);
Guido van Rossumc12da691997-07-17 23:12:42 +0000844 if (i < 0 ||
Guido van Rossumfa00e951998-07-08 15:02:37 +0000845 i >= PyList_GET_SIZE(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +0000846 PyErr_SetString(PyExc_IndexError,
847 "list index out of range");
848 x = NULL;
849 }
850 else {
Guido van Rossumfa00e951998-07-08 15:02:37 +0000851 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +0000852 Py_INCREF(x);
853 }
854 }
855 else
856 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000857 Py_DECREF(v);
858 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000859 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000860 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000861 break;
862
Guido van Rossum7928cd71991-10-24 14:59:31 +0000863 case BINARY_LSHIFT:
864 w = POP();
865 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000866 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000867 Py_DECREF(v);
868 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000869 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000870 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000871 break;
872
873 case BINARY_RSHIFT:
874 w = POP();
875 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000876 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000877 Py_DECREF(v);
878 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000879 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000880 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000881 break;
882
883 case BINARY_AND:
884 w = POP();
885 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000886 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000887 Py_DECREF(v);
888 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000889 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000890 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000891 break;
892
893 case BINARY_XOR:
894 w = POP();
895 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000896 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000897 Py_DECREF(v);
898 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000899 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000900 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000901 break;
902
903 case BINARY_OR:
904 w = POP();
905 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000906 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000907 Py_DECREF(v);
908 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000909 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000910 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000911 break;
912
Guido van Rossum374a9221991-04-04 10:40:29 +0000913 case SLICE+0:
914 case SLICE+1:
915 case SLICE+2:
916 case SLICE+3:
917 if ((opcode-SLICE) & 2)
918 w = POP();
919 else
920 w = NULL;
921 if ((opcode-SLICE) & 1)
922 v = POP();
923 else
924 v = NULL;
925 u = POP();
926 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000927 Py_DECREF(u);
928 Py_XDECREF(v);
929 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000930 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000931 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000932 break;
933
934 case STORE_SLICE+0:
935 case STORE_SLICE+1:
936 case STORE_SLICE+2:
937 case STORE_SLICE+3:
938 if ((opcode-STORE_SLICE) & 2)
939 w = POP();
940 else
941 w = NULL;
942 if ((opcode-STORE_SLICE) & 1)
943 v = POP();
944 else
945 v = NULL;
946 u = POP();
947 t = POP();
948 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +0000949 Py_DECREF(t);
950 Py_DECREF(u);
951 Py_XDECREF(v);
952 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000953 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000954 break;
955
956 case DELETE_SLICE+0:
957 case DELETE_SLICE+1:
958 case DELETE_SLICE+2:
959 case DELETE_SLICE+3:
960 if ((opcode-DELETE_SLICE) & 2)
961 w = POP();
962 else
963 w = NULL;
964 if ((opcode-DELETE_SLICE) & 1)
965 v = POP();
966 else
967 v = NULL;
968 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000969 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +0000970 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +0000971 Py_DECREF(u);
972 Py_XDECREF(v);
973 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000974 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000975 break;
976
977 case STORE_SUBSCR:
978 w = POP();
979 v = POP();
980 u = POP();
981 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +0000982 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +0000983 Py_DECREF(u);
984 Py_DECREF(v);
985 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000986 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000987 break;
988
989 case DELETE_SUBSCR:
990 w = POP();
991 v = POP();
992 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +0000993 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000994 Py_DECREF(v);
995 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000996 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000997 break;
998
999 case PRINT_EXPR:
1000 v = POP();
Guido van Rossumaa06b0e1997-12-26 22:15:57 +00001001 /* Print value except if None */
1002 /* After printing, also assign to '_' */
1003 /* Before, set '_' to None to avoid recursion */
Guido van Rossumb209a111997-04-29 18:18:01 +00001004 if (v != Py_None &&
Guido van Rossuma027efa1997-05-05 20:56:21 +00001005 (err = PyDict_SetItemString(
Guido van Rossumaa06b0e1997-12-26 22:15:57 +00001006 f->f_builtins, "_", Py_None)) == 0) {
Guido van Rossumbe270261997-05-22 22:26:18 +00001007 err = Py_FlushLine();
Guido van Rossumc12da691997-07-17 23:12:42 +00001008 if (err == 0) {
Guido van Rossumbe270261997-05-22 22:26:18 +00001009 x = PySys_GetObject("stdout");
Guido van Rossum8f183201997-12-31 05:53:15 +00001010 if (x == NULL) {
1011 PyErr_SetString(
1012 PyExc_RuntimeError,
1013 "lost sys.stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00001014 err = -1;
Guido van Rossum8f183201997-12-31 05:53:15 +00001015 }
Guido van Rossumbe270261997-05-22 22:26:18 +00001016 }
1017 if (err == 0)
1018 err = PyFile_WriteObject(v, x, 0);
1019 if (err == 0) {
1020 PyFile_SoftSpace(x, 1);
1021 err = Py_FlushLine();
1022 }
Guido van Rossumaa06b0e1997-12-26 22:15:57 +00001023 if (err == 0) {
1024 err = PyDict_SetItemString(
1025 f->f_builtins, "_", v);
1026 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001027 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001028 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001029 break;
1030
1031 case PRINT_ITEM:
1032 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001033 w = PySys_GetObject("stdout");
Guido van Rossum8f183201997-12-31 05:53:15 +00001034 if (w == NULL) {
1035 PyErr_SetString(PyExc_RuntimeError,
1036 "lost sys.stdout");
1037 err = -1;
1038 }
1039 else if (PyFile_SoftSpace(w, 1))
Guido van Rossumbe270261997-05-22 22:26:18 +00001040 err = PyFile_WriteString(" ", w);
1041 if (err == 0)
1042 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Guido van Rossumb209a111997-04-29 18:18:01 +00001043 if (err == 0 && PyString_Check(v)) {
Guido van Rossumc6004111993-11-05 10:22:19 +00001044 /* XXX move into writeobject() ? */
Guido van Rossumb209a111997-04-29 18:18:01 +00001045 char *s = PyString_AsString(v);
1046 int len = PyString_Size(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +00001047 if (len > 0 &&
1048 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +00001049 s[len-1] != ' ')
Guido van Rossumb209a111997-04-29 18:18:01 +00001050 PyFile_SoftSpace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001051 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001052 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001053 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001054 break;
1055
1056 case PRINT_NEWLINE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001057 x = PySys_GetObject("stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001058 if (x == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00001059 PyErr_SetString(PyExc_RuntimeError,
1060 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001061 else {
Guido van Rossumbe270261997-05-22 22:26:18 +00001062 err = PyFile_WriteString("\n", x);
1063 if (err == 0)
1064 PyFile_SoftSpace(x, 0);
Guido van Rossum3165fe61992-09-25 21:59:05 +00001065 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001066 break;
1067
1068 case BREAK_LOOP:
1069 why = WHY_BREAK;
1070 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001071
Guido van Rossumf10570b1995-07-07 22:53:21 +00001072 case RAISE_VARARGS:
1073 u = v = w = NULL;
1074 switch (oparg) {
1075 case 3:
1076 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001077 /* Fallthrough */
1078 case 2:
1079 v = POP(); /* value */
1080 /* Fallthrough */
1081 case 1:
1082 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001083 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001084 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001085 break;
1086 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001087 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001088 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001089 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001090 break;
1091 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001092 break;
1093
1094 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001095 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001096 PyErr_SetString(PyExc_SystemError,
1097 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001098 break;
1099 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001100 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001101 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001102 break;
1103
1104 case RETURN_VALUE:
1105 retval = POP();
1106 why = WHY_RETURN;
1107 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001108
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001109 case EXEC_STMT:
1110 w = POP();
1111 v = POP();
1112 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001113 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001114 Py_DECREF(u);
1115 Py_DECREF(v);
1116 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001117 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001118
Guido van Rossum374a9221991-04-04 10:40:29 +00001119 case POP_BLOCK:
1120 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001121 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001122 while (STACK_LEVEL() > b->b_level) {
1123 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001124 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001125 }
1126 }
1127 break;
1128
1129 case END_FINALLY:
1130 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001131 if (PyInt_Check(v)) {
1132 why = (enum why_code) PyInt_AsLong(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001133 if (why == WHY_RETURN)
1134 retval = POP();
1135 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001136 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001137 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001138 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001139 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001140 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001141 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001142 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001143 else if (v != Py_None) {
1144 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001145 "'finally' pops bad exception");
1146 why = WHY_EXCEPTION;
1147 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001148 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001149 break;
1150
1151 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001152 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001153 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001154 w = POP();
1155 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001156 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001157 Py_DECREF(u);
1158 Py_DECREF(v);
1159 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001160 break;
1161
1162 case STORE_NAME:
1163 w = GETNAMEV(oparg);
1164 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001165 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001166 PyErr_SetString(PyExc_SystemError,
1167 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001168 break;
1169 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001170 err = PyDict_SetItem(x, w, v);
1171 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001172 break;
1173
1174 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001175 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001176 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001177 PyErr_SetString(PyExc_SystemError,
1178 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001179 break;
1180 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001181 if ((err = PyDict_DelItem(x, w)) != 0)
1182 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001183 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001184
1185#ifdef CASE_TOO_BIG
1186 default: switch (opcode) {
1187#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001188
1189 case UNPACK_TUPLE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001190 case UNPACK_LIST:
1191 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001192 if (PyTuple_Check(v)) {
1193 if (PyTuple_Size(v) != oparg) {
1194 PyErr_SetString(PyExc_ValueError,
1195 "unpack tuple of wrong size");
1196 why = WHY_EXCEPTION;
1197 }
1198 else {
1199 for (; --oparg >= 0; ) {
1200 w = PyTuple_GET_ITEM(v, oparg);
1201 Py_INCREF(w);
1202 PUSH(w);
1203 }
1204 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001205 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001206 else if (PyList_Check(v)) {
1207 if (PyList_Size(v) != oparg) {
1208 PyErr_SetString(PyExc_ValueError,
1209 "unpack list of wrong size");
1210 why = WHY_EXCEPTION;
1211 }
1212 else {
1213 for (; --oparg >= 0; ) {
1214 w = PyList_GET_ITEM(v, oparg);
1215 Py_INCREF(w);
1216 PUSH(w);
1217 }
1218 }
1219 }
1220 else if (PySequence_Check(v)) {
1221 if (unpack_sequence(v, oparg,
1222 stack_pointer + oparg))
1223 stack_pointer += oparg;
1224 else
1225 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001226 }
1227 else {
Barry Warsawe42b18f1997-08-25 22:13:04 +00001228 PyErr_SetString(PyExc_TypeError,
1229 "unpack non-sequence");
1230 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001231 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001232 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001233 break;
1234
1235 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001236 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001237 v = POP();
1238 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001239 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1240 Py_DECREF(v);
1241 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001242 break;
1243
1244 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001245 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001246 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001247 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1248 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001249 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001250 break;
1251
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001252 case STORE_GLOBAL:
1253 w = GETNAMEV(oparg);
1254 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001255 err = PyDict_SetItem(f->f_globals, w, v);
1256 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001257 break;
1258
1259 case DELETE_GLOBAL:
1260 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001261 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
1262 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001263 break;
1264
Guido van Rossum374a9221991-04-04 10:40:29 +00001265 case LOAD_CONST:
1266 x = GETCONST(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001267 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001268 PUSH(x);
1269 break;
1270
1271 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001272 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001273 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001274 PyErr_SetString(PyExc_SystemError,
1275 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001276 break;
1277 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001278 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001279 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001280 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001281 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001282 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001283 if (x == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001284 PyErr_SetObject(
1285 PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001286 break;
1287 }
1288 }
1289 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001290 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001291 PUSH(x);
1292 break;
1293
1294 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001295 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001296 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001297 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001298 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001299 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001300 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001301 break;
1302 }
1303 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001304 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001305 PUSH(x);
1306 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001307
Guido van Rossum9bfef441993-03-29 10:43:31 +00001308 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001309 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001310 if (x == NULL) {
Guido van Rossum87460821999-06-22 14:47:32 +00001311 PyErr_SetObject(PyExc_UnboundLocalError,
Guido van Rossumb209a111997-04-29 18:18:01 +00001312 PyTuple_GetItem(co->co_varnames,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001313 oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001314 break;
1315 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001316 Py_INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001317 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001318 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001319 break;
1320
1321 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001322 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001323 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001324 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001325
1326 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001327 x = GETLOCAL(oparg);
1328 if (x == NULL) {
Guido van Rossum87460821999-06-22 14:47:32 +00001329 PyErr_SetObject(PyExc_UnboundLocalError,
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001330 PyTuple_GetItem(co->co_varnames,
1331 oparg));
1332 break;
1333 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001334 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001335 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001336
1337 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001338 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001339 if (x != NULL) {
1340 for (; --oparg >= 0;) {
1341 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001342 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001343 }
1344 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001345 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001346 }
1347 break;
1348
1349 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001350 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001351 if (x != NULL) {
1352 for (; --oparg >= 0;) {
1353 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001354 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001355 }
1356 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001357 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001358 }
1359 break;
1360
1361 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001362 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001363 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001364 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001365 break;
1366
1367 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001368 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001369 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001370 x = PyObject_GetAttr(v, w);
1371 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001372 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001373 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001374 break;
1375
1376 case COMPARE_OP:
1377 w = POP();
1378 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +00001379 if (PyInt_Check(v) && PyInt_Check(w)) {
1380 /* INLINE: cmp(int, int) */
1381 register long a, b;
1382 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001383 a = PyInt_AS_LONG(v);
1384 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001385 switch (oparg) {
1386 case LT: res = a < b; break;
1387 case LE: res = a <= b; break;
1388 case EQ: res = a == b; break;
1389 case NE: res = a != b; break;
1390 case GT: res = a > b; break;
1391 case GE: res = a >= b; break;
1392 case IS: res = v == w; break;
1393 case IS_NOT: res = v != w; break;
1394 default: goto slow_compare;
1395 }
1396 x = res ? Py_True : Py_False;
1397 Py_INCREF(x);
1398 }
1399 else {
1400 slow_compare:
1401 x = cmp_outcome(oparg, v, w);
1402 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001403 Py_DECREF(v);
1404 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001405 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001406 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001407 break;
1408
1409 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001410 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001411 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001412 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001413 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001414 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001415 break;
1416 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001417 u = find_from_args(f, INSTR_OFFSET());
1418 if (u == NULL) {
1419 x = u;
1420 break;
Guido van Rossum24c13741995-02-14 09:42:43 +00001421 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001422 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001423 w,
1424 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001425 f->f_locals == NULL ?
1426 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001427 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001428 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001429 if (w == NULL) {
1430 x = NULL;
1431 break;
1432 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001433 x = PyEval_CallObject(x, w);
1434 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001435 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001436 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001437 break;
1438
1439 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001440 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001441 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001442 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001443 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001444 PyErr_SetString(PyExc_SystemError,
1445 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001446 break;
1447 }
1448 err = import_from(x, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001449 PyFrame_LocalsToFast(f, 0);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001450 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001451 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001452
Guido van Rossum374a9221991-04-04 10:40:29 +00001453 case JUMP_FORWARD:
1454 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001455 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001456
1457 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001458 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001459 if (err > 0)
1460 err = 0;
1461 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001462 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001463 else
1464 break;
1465 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001466
1467 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001468 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001469 if (err > 0) {
1470 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001471 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001472 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001473 else if (err == 0)
1474 ;
1475 else
1476 break;
1477 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001478
1479 case JUMP_ABSOLUTE:
1480 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001481 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001482
1483 case FOR_LOOP:
1484 /* for v in s: ...
1485 On entry: stack contains s, i.
1486 On exit: stack contains s, i+1, s[i];
1487 but if loop exhausted:
1488 s, i are popped, and we jump */
1489 w = POP(); /* Loop index */
1490 v = POP(); /* Sequence object */
1491 u = loop_subscript(v, w);
1492 if (u != NULL) {
1493 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001494 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001495 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001496 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001497 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001498 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001499 }
1500 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001501 Py_DECREF(v);
1502 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001503 /* A NULL can mean "s exhausted"
1504 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001505 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001506 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001507 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001508 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001509 continue;
1510 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001511 }
1512 break;
1513
1514 case SETUP_LOOP:
1515 case SETUP_EXCEPT:
1516 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001517 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Guido van Rossum374a9221991-04-04 10:40:29 +00001518 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001519 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001520
1521 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001522#ifdef LLTRACE
1523 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001524 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001525#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001526 f->f_lineno = oparg;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001527 if (f->f_trace == NULL)
1528 continue;
1529 /* Trace each line of code reached */
1530 f->f_lasti = INSTR_OFFSET();
1531 err = call_trace(&f->f_trace, &f->f_trace,
Guido van Rossumb209a111997-04-29 18:18:01 +00001532 f, "line", Py_None);
Guido van Rossum374a9221991-04-04 10:40:29 +00001533 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001534
1535 case CALL_FUNCTION:
Jeremy Hylton76901512000-03-28 23:49:17 +00001536 case CALL_FUNCTION_VAR:
1537 case CALL_FUNCTION_KW:
1538 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00001539 {
Jeremy Hylton76901512000-03-28 23:49:17 +00001540 int na = oparg & 0xff;
1541 int nk = (oparg>>8) & 0xff;
1542 int flags = (opcode - CALL_FUNCTION) & 3;
1543 int n = na + 2*nk + (flags & 1) + ((flags >> 1) & 1);
1544 PyObject **pfunc = stack_pointer - n - 1;
1545 PyObject *func = *pfunc;
1546 PyObject *self = NULL;
1547 PyObject *class = NULL;
1548 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
1549 if (PyMethod_Check(func)) {
1550 self = PyMethod_Self(func);
1551 class = PyMethod_Class(func);
1552 func = PyMethod_Function(func);
1553 Py_INCREF(func);
1554 if (self != NULL) {
1555 Py_INCREF(self);
1556 Py_DECREF(*pfunc);
1557 *pfunc = self;
1558 na++;
1559 n++;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001560 }
1561 else {
Jeremy Hylton76901512000-03-28 23:49:17 +00001562 /* Unbound methods must be called with an
1563 instance of the class (or a derived
1564 class) as first argument */
1565 if (na > 0 && (self = stack_pointer[-n]) != NULL
1566 && PyInstance_Check(self)
1567 && PyClass_IsSubclass((PyObject *)
1568 (((PyInstanceObject *)self)->in_class),
1569 class))
1570 /* Handy-dandy */ ;
1571 else {
1572 PyErr_SetString(PyExc_TypeError,
1573 "unbound method must be called with class instance 1st argument");
1574 x = NULL;
1575 break;
1576 }
1577 }
1578 }
1579 else
1580 Py_INCREF(func);
1581 if (PyFunction_Check(func) && flags == 0) {
1582 PyObject *co = PyFunction_GetCode(func);
1583 PyObject *globals = PyFunction_GetGlobals(func);
1584 PyObject *argdefs = PyFunction_GetDefaults(func);
1585 PyObject **d;
1586 int nd;
1587 if (argdefs != NULL) {
1588 d = &PyTuple_GET_ITEM(argdefs, 0);
1589 nd = ((PyTupleObject *)argdefs)->ob_size;
1590 }
1591 else {
1592 d = NULL;
1593 nd = 0;
1594 }
1595 x = eval_code2((PyCodeObject *)co, globals,
1596 (PyObject *)NULL, stack_pointer-n, na,
1597 stack_pointer-2*nk, nk, d, nd,
1598 class);
1599 }
1600 else {
1601 int nstar = 0;
Jeremy Hylton387b1012000-03-31 01:22:54 +00001602 PyObject *callargs;
Jeremy Hylton76901512000-03-28 23:49:17 +00001603 PyObject *stararg = 0;
1604 PyObject *kwdict = NULL;
1605 if (flags & 2) {
1606 kwdict = POP();
1607 if (!PyDict_Check(kwdict)) {
1608 PyErr_SetString(PyExc_TypeError,
1609 "** argument must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00001610 goto extcall_fail;
Jeremy Hylton76901512000-03-28 23:49:17 +00001611 }
1612 }
1613 if (flags & 1) {
1614 stararg = POP();
1615 if (!PySequence_Check(stararg)) {
1616 PyErr_SetString(PyExc_TypeError,
1617 "* argument must be a sequence");
Guido van Rossum25826c92000-04-21 21:17:39 +00001618 goto extcall_fail;
Jeremy Hylton76901512000-03-28 23:49:17 +00001619 }
Jeremy Hylton074c3e62000-03-30 23:55:31 +00001620 /* Convert abstract sequence to concrete tuple */
1621 if (!PyTuple_Check(stararg)) {
1622 PyObject *t = NULL;
1623 t = PySequence_Tuple(stararg);
1624 if (t == NULL) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001625 goto extcall_fail;
Jeremy Hylton074c3e62000-03-30 23:55:31 +00001626 }
1627 Py_DECREF(stararg);
1628 stararg = t;
1629 }
1630 nstar = PyTuple_GET_SIZE(stararg);
Barry Warsaw4961ef72000-03-29 18:30:03 +00001631 if (nstar < 0) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001632 goto extcall_fail;
Barry Warsaw4961ef72000-03-29 18:30:03 +00001633 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001634 }
1635 if (nk > 0) {
1636 if (kwdict == NULL) {
1637 kwdict = PyDict_New();
1638 if (kwdict == NULL) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001639 goto extcall_fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001640 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001641 }
Jeremy Hylton074c3e62000-03-30 23:55:31 +00001642 else {
1643 PyObject *d = PyDict_Copy(kwdict);
1644 if (d == NULL) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001645 goto extcall_fail;
Jeremy Hylton074c3e62000-03-30 23:55:31 +00001646 }
1647 Py_DECREF(kwdict);
1648 kwdict = d;
1649 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001650 err = 0;
1651 while (--nk >= 0) {
1652 PyObject *value = POP();
1653 PyObject *key = POP();
1654 if (PyDict_GetItem(kwdict, key) != NULL) {
1655 err = 1;
1656 PyErr_Format(PyExc_TypeError,
1657 "keyword parameter redefined: %.400s",
1658 PyString_AsString(key));
Jeremy Hylton387b1012000-03-31 01:22:54 +00001659 Py_DECREF(key);
1660 Py_DECREF(value);
Guido van Rossum25826c92000-04-21 21:17:39 +00001661 goto extcall_fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001662 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001663 err = PyDict_SetItem(kwdict, key, value);
1664 Py_DECREF(key);
1665 Py_DECREF(value);
1666 if (err)
1667 break;
1668 }
1669 if (err) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001670 extcall_fail:
1671 Py_XDECREF(kwdict);
1672 Py_XDECREF(stararg);
1673 Py_DECREF(func);
1674 x=NULL;
Jeremy Hylton76901512000-03-28 23:49:17 +00001675 break;
1676 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001677 }
Jeremy Hylton387b1012000-03-31 01:22:54 +00001678 callargs = PyTuple_New(na + nstar);
1679 if (callargs == NULL) {
Jeremy Hylton76901512000-03-28 23:49:17 +00001680 x = NULL;
1681 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001682 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001683 if (stararg) {
Jeremy Hylton76901512000-03-28 23:49:17 +00001684 int i;
Jeremy Hylton76901512000-03-28 23:49:17 +00001685 for (i = 0; i < nstar; i++) {
1686 PyObject *a = PyTuple_GET_ITEM(stararg, i);
1687 Py_INCREF(a);
Jeremy Hylton387b1012000-03-31 01:22:54 +00001688 PyTuple_SET_ITEM(callargs, na + i, a);
Jeremy Hylton76901512000-03-28 23:49:17 +00001689 }
1690 Py_DECREF(stararg);
1691 }
1692 while (--na >= 0) {
1693 w = POP();
Jeremy Hylton387b1012000-03-31 01:22:54 +00001694 PyTuple_SET_ITEM(callargs, na, w);
Jeremy Hylton76901512000-03-28 23:49:17 +00001695 }
Jeremy Hylton387b1012000-03-31 01:22:54 +00001696 x = PyEval_CallObjectWithKeywords(func,
1697 callargs,
1698 kwdict);
1699 Py_DECREF(callargs);
Jeremy Hylton76901512000-03-28 23:49:17 +00001700 Py_XDECREF(kwdict);
1701 }
1702 Py_DECREF(func);
1703 while (stack_pointer > pfunc) {
1704 w = POP();
1705 Py_DECREF(w);
1706 }
1707 PUSH(x);
1708 if (x != NULL) continue;
1709 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001710 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001711
Guido van Rossum681d79a1995-07-18 14:51:37 +00001712 case MAKE_FUNCTION:
1713 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00001714 x = PyFunction_New(v, f->f_globals);
1715 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001716 /* XXX Maybe this should be a separate opcode? */
1717 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001718 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001719 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001720 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001721 x = NULL;
1722 break;
1723 }
1724 while (--oparg >= 0) {
1725 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001726 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001727 }
1728 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001729 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001730 }
1731 PUSH(x);
1732 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001733
1734 case BUILD_SLICE:
1735 if (oparg == 3)
1736 w = POP();
1737 else
1738 w = NULL;
1739 v = POP();
1740 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00001741 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001742 Py_DECREF(u);
1743 Py_DECREF(v);
1744 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00001745 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001746 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00001747 break;
1748
1749
Guido van Rossum374a9221991-04-04 10:40:29 +00001750 default:
1751 fprintf(stderr,
1752 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001753 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00001754 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00001755 why = WHY_EXCEPTION;
1756 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001757
1758#ifdef CASE_TOO_BIG
1759 }
1760#endif
1761
Guido van Rossum374a9221991-04-04 10:40:29 +00001762 } /* switch */
1763
1764 on_error:
1765
1766 /* Quickly continue if no error occurred */
1767
1768 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001769 if (err == 0 && x != NULL) {
1770#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00001771 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00001772 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00001773 fprintf(stderr,
1774 "XXX undetected error\n");
1775 else
1776#endif
1777 continue; /* Normal, fast path */
1778 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001779 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00001780 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00001781 err = 0;
1782 }
1783
Guido van Rossum374a9221991-04-04 10:40:29 +00001784 /* Double-check exception status */
1785
1786 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001787 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001788 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00001789 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00001790 why = WHY_EXCEPTION;
1791 }
1792 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00001793#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001794 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00001795 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00001796 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001797 fprintf(stderr,
1798 "XXX undetected error (why=%d)\n",
1799 why);
1800 why = WHY_EXCEPTION;
1801 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001802 }
1803#endif
1804
1805 /* Log traceback info if this is a real exception */
1806
1807 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001808 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001809 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001810 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00001811 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001812
Guido van Rossume59214e1994-08-30 08:01:59 +00001813 if (f->f_trace)
1814 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001815 if (tstate->sys_profilefunc)
1816 call_exc_trace(&tstate->sys_profilefunc,
1817 (PyObject**)0, f);
Guido van Rossum014518f1998-11-23 21:09:51 +00001818 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001819
1820 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1821
1822 if (why == WHY_RERAISE)
1823 why = WHY_EXCEPTION;
1824
1825 /* Unwind stacks if a (pseudo) exception occurred */
1826
1827 while (why != WHY_NOT && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001828 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001829 while (STACK_LEVEL() > b->b_level) {
1830 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001831 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001832 }
1833 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1834 why = WHY_NOT;
1835 JUMPTO(b->b_handler);
1836 break;
1837 }
1838 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00001839 (b->b_type == SETUP_EXCEPT &&
1840 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001841 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001842 PyObject *exc, *val, *tb;
1843 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001844 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001845 val = Py_None;
1846 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00001847 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001848 /* Make the raw exception data
1849 available to the handler,
1850 so a program can emulate the
1851 Python main loop. Don't do
1852 this for 'finally'. */
1853 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00001854 PyErr_NormalizeException(
1855 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001856 set_exc_info(tstate,
1857 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001858 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001859 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001860 PUSH(val);
1861 PUSH(exc);
1862 }
1863 else {
1864 if (why == WHY_RETURN)
1865 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00001866 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00001867 PUSH(v);
1868 }
1869 why = WHY_NOT;
1870 JUMPTO(b->b_handler);
1871 break;
1872 }
1873 } /* unwind stack */
1874
1875 /* End the loop if we still have an error (or return) */
1876
1877 if (why != WHY_NOT)
1878 break;
1879
1880 } /* main loop */
1881
1882 /* Pop remaining stack entries */
1883
1884 while (!EMPTY()) {
1885 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001886 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001887 }
1888
Guido van Rossum96a42c81992-01-12 02:29:51 +00001889 if (why != WHY_RETURN)
1890 retval = NULL;
1891
Guido van Rossume59214e1994-08-30 08:01:59 +00001892 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001893 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001894 if (call_trace(&f->f_trace, &f->f_trace, f,
1895 "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001896 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001897 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001898 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001899 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001900 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001901 }
1902
Guido van Rossuma027efa1997-05-05 20:56:21 +00001903 if (tstate->sys_profilefunc && why == WHY_RETURN) {
1904 if (call_trace(&tstate->sys_profilefunc, (PyObject**)0,
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001905 f, "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001906 Py_XDECREF(retval);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001907 retval = NULL;
1908 why = WHY_EXCEPTION;
1909 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001910 }
Guido van Rossuma4240131997-01-21 21:18:36 +00001911
Guido van Rossuma027efa1997-05-05 20:56:21 +00001912 reset_exc_info(tstate);
1913
1914 --tstate->recursion_depth;
Guido van Rossum8c5df061997-01-24 04:19:24 +00001915
1916 fail: /* Jump here from prelude on failure */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001917
Guido van Rossum374a9221991-04-04 10:40:29 +00001918 /* Restore previous frame and release the current one */
Guido van Rossum681d79a1995-07-18 14:51:37 +00001919
Guido van Rossuma027efa1997-05-05 20:56:21 +00001920 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +00001921 Py_DECREF(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001922
Guido van Rossum96a42c81992-01-12 02:29:51 +00001923 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001924}
1925
Guido van Rossuma027efa1997-05-05 20:56:21 +00001926static void
1927set_exc_info(tstate, type, value, tb)
1928 PyThreadState *tstate;
1929 PyObject *type;
1930 PyObject *value;
1931 PyObject *tb;
1932{
1933 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001934 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00001935
Guido van Rossuma027efa1997-05-05 20:56:21 +00001936 frame = tstate->frame;
1937 if (frame->f_exc_type == NULL) {
1938 /* This frame didn't catch an exception before */
1939 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00001940 if (tstate->exc_type == NULL) {
1941 Py_INCREF(Py_None);
1942 tstate->exc_type = Py_None;
1943 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001944 tmp_type = frame->f_exc_type;
1945 tmp_value = frame->f_exc_value;
1946 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001947 Py_XINCREF(tstate->exc_type);
1948 Py_XINCREF(tstate->exc_value);
1949 Py_XINCREF(tstate->exc_traceback);
1950 frame->f_exc_type = tstate->exc_type;
1951 frame->f_exc_value = tstate->exc_value;
1952 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001953 Py_XDECREF(tmp_type);
1954 Py_XDECREF(tmp_value);
1955 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001956 }
1957 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001958 tmp_type = tstate->exc_type;
1959 tmp_value = tstate->exc_value;
1960 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001961 Py_XINCREF(type);
1962 Py_XINCREF(value);
1963 Py_XINCREF(tb);
1964 tstate->exc_type = type;
1965 tstate->exc_value = value;
1966 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001967 Py_XDECREF(tmp_type);
1968 Py_XDECREF(tmp_value);
1969 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001970 /* For b/w compatibility */
1971 PySys_SetObject("exc_type", type);
1972 PySys_SetObject("exc_value", value);
1973 PySys_SetObject("exc_traceback", tb);
1974}
1975
1976static void
1977reset_exc_info(tstate)
1978 PyThreadState *tstate;
1979{
1980 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001981 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001982 frame = tstate->frame;
1983 if (frame->f_exc_type != NULL) {
1984 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001985 tmp_type = tstate->exc_type;
1986 tmp_value = tstate->exc_value;
1987 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001988 Py_XINCREF(frame->f_exc_type);
1989 Py_XINCREF(frame->f_exc_value);
1990 Py_XINCREF(frame->f_exc_traceback);
1991 tstate->exc_type = frame->f_exc_type;
1992 tstate->exc_value = frame->f_exc_value;
1993 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001994 Py_XDECREF(tmp_type);
1995 Py_XDECREF(tmp_value);
1996 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001997 /* For b/w compatibility */
1998 PySys_SetObject("exc_type", frame->f_exc_type);
1999 PySys_SetObject("exc_value", frame->f_exc_value);
2000 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
2001 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002002 tmp_type = frame->f_exc_type;
2003 tmp_value = frame->f_exc_value;
2004 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002005 frame->f_exc_type = NULL;
2006 frame->f_exc_value = NULL;
2007 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002008 Py_XDECREF(tmp_type);
2009 Py_XDECREF(tmp_value);
2010 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002011}
2012
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002013/* Logic for the raise statement (too complicated for inlining).
2014 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00002015static enum why_code
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002016do_raise(type, value, tb)
Guido van Rossumb209a111997-04-29 18:18:01 +00002017 PyObject *type, *value, *tb;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002018{
Guido van Rossumd295f121998-04-09 21:39:57 +00002019 if (type == NULL) {
2020 /* Reraise */
2021 PyThreadState *tstate = PyThreadState_Get();
2022 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
2023 value = tstate->exc_value;
2024 tb = tstate->exc_traceback;
2025 Py_XINCREF(type);
2026 Py_XINCREF(value);
2027 Py_XINCREF(tb);
2028 }
2029
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002030 /* We support the following forms of raise:
2031 raise <class>, <classinstance>
2032 raise <class>, <argument tuple>
2033 raise <class>, None
2034 raise <class>, <argument>
2035 raise <classinstance>, None
2036 raise <string>, <object>
2037 raise <string>, None
2038
2039 An omitted second argument is the same as None.
2040
2041 In addition, raise <tuple>, <anything> is the same as
2042 raising the tuple's first item (and it better have one!);
2043 this rule is applied recursively.
2044
2045 Finally, an optional third argument can be supplied, which
2046 gives the traceback to be substituted (useful when
2047 re-raising an exception after examining it). */
2048
2049 /* First, check the traceback argument, replacing None with
2050 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002051 if (tb == Py_None) {
2052 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002053 tb = NULL;
2054 }
2055 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002056 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002057 "raise 3rd arg must be traceback or None");
2058 goto raise_error;
2059 }
2060
2061 /* Next, replace a missing value with None */
2062 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002063 value = Py_None;
2064 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002065 }
2066
2067 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002068 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2069 PyObject *tmp = type;
2070 type = PyTuple_GET_ITEM(type, 0);
2071 Py_INCREF(type);
2072 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002073 }
2074
Barry Warsaw4249f541997-08-22 21:26:19 +00002075 if (PyString_Check(type))
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002076 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002077
2078 else if (PyClass_Check(type))
2079 PyErr_NormalizeException(&type, &value, &tb);
2080
Guido van Rossumb209a111997-04-29 18:18:01 +00002081 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002082 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002083 if (value != Py_None) {
2084 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002085 "instance exception may not have a separate value");
2086 goto raise_error;
2087 }
2088 else {
2089 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002090 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002091 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002092 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2093 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002094 }
2095 }
2096 else {
2097 /* Not something you can raise. You get an exception
2098 anyway, just not what you specified :-) */
Guido van Rossumb209a111997-04-29 18:18:01 +00002099 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002100 "exceptions must be strings, classes, or instances");
2101 goto raise_error;
2102 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002103 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002104 if (tb == NULL)
2105 return WHY_EXCEPTION;
2106 else
2107 return WHY_RERAISE;
2108 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002109 Py_XDECREF(value);
2110 Py_XDECREF(type);
2111 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002112 return WHY_EXCEPTION;
2113}
2114
Barry Warsawe42b18f1997-08-25 22:13:04 +00002115static int
2116unpack_sequence(v, argcnt, sp)
2117 PyObject *v;
2118 int argcnt;
2119 PyObject **sp;
2120{
2121 int i;
2122 PyObject *w;
2123
2124 for (i = 0; i < argcnt; i++) {
2125 if (! (w = PySequence_GetItem(v, i))) {
2126 if (PyErr_ExceptionMatches(PyExc_IndexError))
2127 PyErr_SetString(PyExc_ValueError,
2128 "unpack sequence of wrong size");
2129 goto finally;
2130 }
2131 *--sp = w;
2132 }
2133 /* we better get an IndexError now */
2134 if (PySequence_GetItem(v, i) == NULL) {
2135 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
2136 PyErr_Clear();
2137 return 1;
2138 }
2139 /* some other exception occurred. fall through to finally */
2140 }
2141 else
2142 PyErr_SetString(PyExc_ValueError,
2143 "unpack sequence of wrong size");
2144 /* fall through */
2145finally:
Barry Warsaw91010551997-08-25 22:30:51 +00002146 for (; i > 0; i--, sp++)
2147 Py_DECREF(*sp);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002148
2149 return 0;
2150}
2151
2152
Guido van Rossum96a42c81992-01-12 02:29:51 +00002153#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002154static int
2155prtrace(v, str)
Guido van Rossumb209a111997-04-29 18:18:01 +00002156 PyObject *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002157 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002158{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002159 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002160 if (PyObject_Print(v, stdout, 0) != 0)
2161 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002162 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00002163 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002164}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002165#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002166
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002167static void
2168call_exc_trace(p_trace, p_newtrace, f)
Guido van Rossumb209a111997-04-29 18:18:01 +00002169 PyObject **p_trace, **p_newtrace;
2170 PyFrameObject *f;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002171{
Guido van Rossumb209a111997-04-29 18:18:01 +00002172 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002173 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002174 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002175 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002176 value = Py_None;
2177 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002178 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002179 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002180 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002181 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002182 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002183 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002184 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002185 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002186 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002187 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002188 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002189 Py_XDECREF(type);
2190 Py_XDECREF(value);
2191 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002192 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002193}
2194
2195static int
2196call_trace(p_trace, p_newtrace, f, msg, arg)
Guido van Rossumb209a111997-04-29 18:18:01 +00002197 PyObject **p_trace; /* in/out; may not be NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002198 may not point to NULL variable initially */
Guido van Rossumb209a111997-04-29 18:18:01 +00002199 PyObject **p_newtrace; /* in/out; may be NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002200 may point to NULL variable;
2201 may be same variable as p_newtrace */
Guido van Rossumb209a111997-04-29 18:18:01 +00002202 PyFrameObject *f;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002203 char *msg;
Guido van Rossumb209a111997-04-29 18:18:01 +00002204 PyObject *arg;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002205{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002206 PyThreadState *tstate = f->f_tstate;
Guido van Rossumb209a111997-04-29 18:18:01 +00002207 PyObject *args, *what;
2208 PyObject *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002209
Guido van Rossuma027efa1997-05-05 20:56:21 +00002210 if (tstate->tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002211 /* Don't do recursive traces */
2212 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002213 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002214 *p_newtrace = NULL;
2215 }
2216 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002217 }
2218
Guido van Rossumb209a111997-04-29 18:18:01 +00002219 args = PyTuple_New(3);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002220 if (args == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002221 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002222 what = PyString_FromString(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002223 if (what == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002224 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002225 Py_INCREF(f);
2226 PyTuple_SET_ITEM(args, 0, (PyObject *)f);
2227 PyTuple_SET_ITEM(args, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002228 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002229 arg = Py_None;
2230 Py_INCREF(arg);
2231 PyTuple_SET_ITEM(args, 2, arg);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002232 tstate->tracing++;
Guido van Rossumb209a111997-04-29 18:18:01 +00002233 PyFrame_FastToLocals(f);
2234 res = PyEval_CallObject(*p_trace, args); /* May clear *p_trace! */
2235 PyFrame_LocalsToFast(f, 1);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002236 tstate->tracing--;
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002237 cleanup:
Guido van Rossumb209a111997-04-29 18:18:01 +00002238 Py_XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002239 if (res == NULL) {
2240 /* The trace proc raised an exception */
Guido van Rossumb209a111997-04-29 18:18:01 +00002241 PyTraceBack_Here(f);
2242 Py_XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002243 *p_trace = NULL;
2244 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002245 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002246 *p_newtrace = NULL;
2247 }
Barry Warsawf6202631999-09-08 16:26:33 +00002248 /* to be extra double plus sure we don't get recursive
2249 * calls inf either tracefunc or profilefunc gets an
2250 * exception, zap the global variables.
2251 */
2252 Py_XDECREF(tstate->sys_tracefunc);
2253 tstate->sys_tracefunc = NULL;
2254 Py_XDECREF(tstate->sys_profilefunc);
2255 tstate->sys_profilefunc = NULL;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002256 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002257 }
2258 else {
2259 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002260 Py_XDECREF(*p_newtrace);
2261 if (res == Py_None)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002262 *p_newtrace = NULL;
2263 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002264 Py_INCREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002265 *p_newtrace = res;
2266 }
2267 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002268 Py_DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002269 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002270 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002271}
2272
Guido van Rossumb209a111997-04-29 18:18:01 +00002273PyObject *
2274PyEval_GetBuiltins()
Guido van Rossum6135a871995-01-09 17:53:26 +00002275{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002276 PyThreadState *tstate = PyThreadState_Get();
2277 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002278 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002279 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002280 else
2281 return current_frame->f_builtins;
2282}
2283
Guido van Rossumb209a111997-04-29 18:18:01 +00002284PyObject *
2285PyEval_GetLocals()
Guido van Rossum5b722181993-03-30 17:46:03 +00002286{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002287 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002288 if (current_frame == NULL)
2289 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002290 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002291 return current_frame->f_locals;
2292}
2293
Guido van Rossumb209a111997-04-29 18:18:01 +00002294PyObject *
2295PyEval_GetGlobals()
Guido van Rossum3f5da241990-12-20 15:06:42 +00002296{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002297 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002298 if (current_frame == NULL)
2299 return NULL;
2300 else
2301 return current_frame->f_globals;
2302}
2303
Guido van Rossumb209a111997-04-29 18:18:01 +00002304PyObject *
2305PyEval_GetFrame()
Guido van Rossume59214e1994-08-30 08:01:59 +00002306{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002307 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002308 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002309}
2310
Guido van Rossum6135a871995-01-09 17:53:26 +00002311int
Guido van Rossumb209a111997-04-29 18:18:01 +00002312PyEval_GetRestricted()
Guido van Rossum6135a871995-01-09 17:53:26 +00002313{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002314 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002315 return current_frame == NULL ? 0 : current_frame->f_restricted;
2316}
2317
Guido van Rossumbe270261997-05-22 22:26:18 +00002318int
Guido van Rossumb209a111997-04-29 18:18:01 +00002319Py_FlushLine()
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002320{
Guido van Rossumb209a111997-04-29 18:18:01 +00002321 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002322 if (f == NULL)
2323 return 0;
2324 if (!PyFile_SoftSpace(f, 0))
2325 return 0;
2326 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002327}
2328
Guido van Rossum3f5da241990-12-20 15:06:42 +00002329
Guido van Rossum681d79a1995-07-18 14:51:37 +00002330/* External interface to call any callable object.
2331 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002332
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002333#undef PyEval_CallObject
2334/* for backward compatibility: export this interface */
2335
Guido van Rossumb209a111997-04-29 18:18:01 +00002336PyObject *
2337PyEval_CallObject(func, arg)
2338 PyObject *func;
2339 PyObject *arg;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002340{
Guido van Rossumb209a111997-04-29 18:18:01 +00002341 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002342}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002343#define PyEval_CallObject(func,arg) \
2344 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00002345
Guido van Rossumb209a111997-04-29 18:18:01 +00002346PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002347PyEval_CallObjectWithKeywords(func, arg, kw)
Guido van Rossumb209a111997-04-29 18:18:01 +00002348 PyObject *func;
2349 PyObject *arg;
2350 PyObject *kw;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002351{
2352 ternaryfunc call;
Guido van Rossumb209a111997-04-29 18:18:01 +00002353 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002354
2355 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002356 arg = PyTuple_New(0);
2357 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002358 PyErr_SetString(PyExc_TypeError,
2359 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002360 return NULL;
2361 }
2362 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002363 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002364
Guido van Rossumb209a111997-04-29 18:18:01 +00002365 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002366 PyErr_SetString(PyExc_TypeError,
2367 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00002368 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00002369 return NULL;
2370 }
2371
Guido van Rossum150b2df1996-12-05 23:17:11 +00002372 if ((call = func->ob_type->tp_call) != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002373 result = (*call)(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002374 else if (PyMethod_Check(func) || PyFunction_Check(func))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002375 result = call_function(func, arg, kw);
2376 else
2377 result = call_builtin(func, arg, kw);
2378
Guido van Rossumb209a111997-04-29 18:18:01 +00002379 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002380
Guido van Rossumb209a111997-04-29 18:18:01 +00002381 if (result == NULL && !PyErr_Occurred())
2382 PyErr_SetString(PyExc_SystemError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002383 "NULL result without error in call_object");
Guido van Rossume59214e1994-08-30 08:01:59 +00002384
2385 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002386}
2387
Guido van Rossumb209a111997-04-29 18:18:01 +00002388static PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002389call_builtin(func, arg, kw)
Guido van Rossumb209a111997-04-29 18:18:01 +00002390 PyObject *func;
2391 PyObject *arg;
2392 PyObject *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002393{
Guido van Rossumb209a111997-04-29 18:18:01 +00002394 if (PyCFunction_Check(func)) {
2395 PyCFunction meth = PyCFunction_GetFunction(func);
2396 PyObject *self = PyCFunction_GetSelf(func);
2397 int flags = PyCFunction_GetFlags(func);
Guido van Rossumff8b4941995-07-26 18:16:42 +00002398 if (!(flags & METH_VARARGS)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002399 int size = PyTuple_Size(arg);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002400 if (size == 1)
Guido van Rossumb209a111997-04-29 18:18:01 +00002401 arg = PyTuple_GET_ITEM(arg, 0);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002402 else if (size == 0)
2403 arg = NULL;
2404 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002405 if (flags & METH_KEYWORDS)
2406 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002407 if (kw != NULL && PyDict_Size(kw) != 0) {
2408 PyErr_SetString(PyExc_TypeError,
Guido van Rossumff8b4941995-07-26 18:16:42 +00002409 "this function takes no keyword arguments");
2410 return NULL;
2411 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002412 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002413 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002414 if (PyClass_Check(func)) {
2415 return PyInstance_New(func, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002416 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002417 if (PyInstance_Check(func)) {
2418 PyObject *res, *call = PyObject_GetAttrString(func,"__call__");
Guido van Rossume59214e1994-08-30 08:01:59 +00002419 if (call == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002420 PyErr_Clear();
2421 PyErr_SetString(PyExc_AttributeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002422 "no __call__ method defined");
Guido van Rossume59214e1994-08-30 08:01:59 +00002423 return NULL;
2424 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002425 res = PyEval_CallObjectWithKeywords(call, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002426 Py_DECREF(call);
Guido van Rossume59214e1994-08-30 08:01:59 +00002427 return res;
2428 }
Guido van Rossumba98a421999-11-15 19:29:33 +00002429 PyErr_Format(PyExc_TypeError, "call of non-function (type %.400s)",
Guido van Rossum2d1ad391998-08-25 18:16:54 +00002430 func->ob_type->tp_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002431 return NULL;
2432}
2433
Guido van Rossumb209a111997-04-29 18:18:01 +00002434static PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002435call_function(func, arg, kw)
Guido van Rossumb209a111997-04-29 18:18:01 +00002436 PyObject *func;
2437 PyObject *arg;
2438 PyObject *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002439{
Guido van Rossumb209a111997-04-29 18:18:01 +00002440 PyObject *class = NULL; /* == owner */
2441 PyObject *argdefs;
2442 PyObject **d, **k;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002443 int nk, nd;
Guido van Rossumb209a111997-04-29 18:18:01 +00002444 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002445
Guido van Rossumb209a111997-04-29 18:18:01 +00002446 if (kw != NULL && !PyDict_Check(kw)) {
2447 PyErr_BadInternalCall();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002448 return NULL;
2449 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002450
Guido van Rossumb209a111997-04-29 18:18:01 +00002451 if (PyMethod_Check(func)) {
2452 PyObject *self = PyMethod_Self(func);
2453 class = PyMethod_Class(func);
2454 func = PyMethod_Function(func);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002455 if (self == NULL) {
2456 /* Unbound methods must be called with an instance of
2457 the class (or a derived class) as first argument */
Guido van Rossumb209a111997-04-29 18:18:01 +00002458 if (PyTuple_Size(arg) >= 1) {
2459 self = PyTuple_GET_ITEM(arg, 0);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002460 if (self != NULL &&
Guido van Rossumb209a111997-04-29 18:18:01 +00002461 PyInstance_Check(self) &&
2462 PyClass_IsSubclass((PyObject *)
2463 (((PyInstanceObject *)self)->in_class),
Guido van Rossumb3f72581993-05-21 19:56:10 +00002464 class))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002465 /* Handy-dandy */ ;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002466 else
2467 self = NULL;
2468 }
2469 if (self == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002470 PyErr_SetString(PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002471 "unbound method must be called with class instance 1st argument");
Guido van Rossumb3f72581993-05-21 19:56:10 +00002472 return NULL;
2473 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002474 Py_INCREF(arg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002475 }
2476 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002477 int argcount = PyTuple_Size(arg);
2478 PyObject *newarg = PyTuple_New(argcount + 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002479 int i;
Guido van Rossum81daa321993-05-20 14:24:46 +00002480 if (newarg == NULL)
2481 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002482 Py_INCREF(self);
2483 PyTuple_SET_ITEM(newarg, 0, self);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002484 for (i = 0; i < argcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002485 PyObject *v = PyTuple_GET_ITEM(arg, i);
2486 Py_XINCREF(v);
2487 PyTuple_SET_ITEM(newarg, i+1, v);
Guido van Rossum81daa321993-05-20 14:24:46 +00002488 }
2489 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002490 }
Guido van Rossum7859f871998-07-08 14:58:16 +00002491 if (!PyFunction_Check(func)) {
2492 result = PyEval_CallObjectWithKeywords(func, arg, kw);
2493 Py_DECREF(arg);
2494 return result;
2495 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002496 }
2497 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002498 if (!PyFunction_Check(func)) {
Guido van Rossum2d1ad391998-08-25 18:16:54 +00002499 PyErr_Format(PyExc_TypeError,
Guido van Rossum5db862d2000-04-10 12:46:51 +00002500 "call of non-function (type %.200s)",
Guido van Rossum2d1ad391998-08-25 18:16:54 +00002501 func->ob_type->tp_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002502 return NULL;
2503 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002504 Py_INCREF(arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002505 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002506
2507 argdefs = PyFunction_GetDefaults(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00002508 if (argdefs != NULL && PyTuple_Check(argdefs)) {
2509 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
2510 nd = PyTuple_Size(argdefs);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002511 }
2512 else {
2513 d = NULL;
2514 nd = 0;
2515 }
2516
2517 if (kw != NULL) {
2518 int pos, i;
Guido van Rossumb209a111997-04-29 18:18:01 +00002519 nk = PyDict_Size(kw);
2520 k = PyMem_NEW(PyObject *, 2*nk);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002521 if (k == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002522 PyErr_NoMemory();
2523 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002524 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00002525 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002526 pos = i = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00002527 while (PyDict_Next(kw, &pos, &k[i], &k[i+1]))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002528 i += 2;
2529 nk = i/2;
2530 /* XXX This is broken if the caller deletes dict items! */
2531 }
2532 else {
2533 k = NULL;
2534 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00002535 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002536
Guido van Rossum681d79a1995-07-18 14:51:37 +00002537 result = eval_code2(
Guido van Rossumb209a111997-04-29 18:18:01 +00002538 (PyCodeObject *)PyFunction_GetCode(func),
2539 PyFunction_GetGlobals(func), (PyObject *)NULL,
2540 &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg),
Guido van Rossum681d79a1995-07-18 14:51:37 +00002541 k, nk,
2542 d, nd,
2543 class);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002544
Guido van Rossumb209a111997-04-29 18:18:01 +00002545 Py_DECREF(arg);
Guido van Rossumb18618d2000-05-03 23:44:39 +00002546 if (k != NULL)
2547 PyMem_DEL(k);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002548
Guido van Rossum681d79a1995-07-18 14:51:37 +00002549 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002550}
2551
Guido van Rossum3b9c6671996-07-30 18:40:29 +00002552#define SLICE_ERROR_MSG \
2553 "standard sequence type does not support step size other than one"
2554
Guido van Rossumb209a111997-04-29 18:18:01 +00002555static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002556loop_subscript(v, w)
Guido van Rossumb209a111997-04-29 18:18:01 +00002557 PyObject *v, *w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002558{
Guido van Rossumb209a111997-04-29 18:18:01 +00002559 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00002560 int i;
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00002561 if (sq == NULL || sq->sq_item == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002562 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002563 return NULL;
2564 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002565 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00002566 v = (*sq->sq_item)(v, i);
2567 if (v)
2568 return v;
Barry Warsaw4249f541997-08-22 21:26:19 +00002569 if (PyErr_ExceptionMatches(PyExc_IndexError))
Guido van Rossumb209a111997-04-29 18:18:01 +00002570 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00002571 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002572}
2573
Guido van Rossum20c6add2000-05-08 14:06:50 +00002574/* Extract a slice index from a PyInt or PyLong, the index is bound to
2575 the range [-INT_MAX+1, INTMAX]. Returns 0 and an exception if there is
2576 and error. Returns 1 on success.*/
2577
2578int
2579_PyEval_SliceIndex(v, pi)
Guido van Rossumb209a111997-04-29 18:18:01 +00002580 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002581 int *pi;
2582{
2583 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002584 long x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00002585 if (PyInt_Check(v)) {
2586 x = PyInt_AsLong(v);
2587 } else if (PyLong_Check(v)) {
2588 x = PyLong_AsLong(v);
2589 if (x==-1 && PyErr_Occurred()) {
2590 PyObject *long_zero;
2591
2592 if (!PyErr_ExceptionMatches( PyExc_OverflowError ) ) {
2593 /* It's not an overflow error, so just
2594 signal an error */
Guido van Rossum20c6add2000-05-08 14:06:50 +00002595 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00002596 }
2597
2598 /* It's an overflow error, so we need to
2599 check the sign of the long integer,
2600 set the value to INT_MAX or 0, and clear
2601 the error. */
2602
2603 /* Create a long integer with a value of 0 */
2604 long_zero = PyLong_FromLong( 0L );
Guido van Rossum20c6add2000-05-08 14:06:50 +00002605 if (long_zero == NULL) return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00002606
2607 /* Check sign */
2608 if (PyObject_Compare(long_zero, v) < 0)
2609 x = INT_MAX;
2610 else
2611 x = 0;
2612
2613 /* Free the long integer we created, and clear the
2614 OverflowError */
2615 Py_DECREF(long_zero);
2616 PyErr_Clear();
2617 }
2618 } else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002619 PyErr_SetString(PyExc_TypeError,
2620 "slice index must be int");
Guido van Rossum20c6add2000-05-08 14:06:50 +00002621 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002622 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00002623 /* Truncate -- very long indices are truncated anyway */
2624 if (x > INT_MAX)
2625 x = INT_MAX;
2626 else if (x < -INT_MAX)
2627 x = 0;
2628 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002629 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00002630 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002631}
2632
Guido van Rossumb209a111997-04-29 18:18:01 +00002633static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002634apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00002635 PyObject *u, *v, *w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002636{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002637 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00002638 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002639 return NULL;
Guido van Rossum20c6add2000-05-08 14:06:50 +00002640 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum04691fc1992-08-12 15:35:34 +00002641 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002642 return PySequence_GetSlice(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002643}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002644
2645static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00002646assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossumb209a111997-04-29 18:18:01 +00002647 PyObject *u, *v, *w, *x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002648{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002649 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00002650 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum3f5da241990-12-20 15:06:42 +00002651 return -1;
Guido van Rossum20c6add2000-05-08 14:06:50 +00002652 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum3f5da241990-12-20 15:06:42 +00002653 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002654 if (x == NULL)
2655 return PySequence_DelSlice(u, ilow, ihigh);
2656 else
2657 return PySequence_SetSlice(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002658}
2659
Guido van Rossumb209a111997-04-29 18:18:01 +00002660static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002661cmp_outcome(op, v, w)
Guido van Rossum5b7313a1992-04-06 13:24:57 +00002662 int op;
Guido van Rossumb209a111997-04-29 18:18:01 +00002663 register PyObject *v;
2664 register PyObject *w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002665{
2666 register int cmp;
2667 register int res = 0;
2668 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002669 case IS:
2670 case IS_NOT:
2671 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002672 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002673 res = !res;
2674 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002675 case IN:
2676 case NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00002677 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002678 if (res < 0)
2679 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002680 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002681 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002682 break;
2683 case EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00002684 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002685 break;
2686 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00002687 cmp = PyObject_Compare(v, w);
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002688 if (cmp && PyErr_Occurred())
2689 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002690 switch (op) {
2691 case LT: res = cmp < 0; break;
2692 case LE: res = cmp <= 0; break;
2693 case EQ: res = cmp == 0; break;
2694 case NE: res = cmp != 0; break;
2695 case GT: res = cmp > 0; break;
2696 case GE: res = cmp >= 0; break;
2697 /* XXX no default? (res is initialized to 0 though) */
2698 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002699 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002700 v = res ? Py_True : Py_False;
2701 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002702 return v;
2703}
2704
Guido van Rossum3f5da241990-12-20 15:06:42 +00002705static int
2706import_from(locals, v, name)
Guido van Rossumb209a111997-04-29 18:18:01 +00002707 PyObject *locals;
2708 PyObject *v;
2709 PyObject *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002710{
Guido van Rossumb209a111997-04-29 18:18:01 +00002711 PyObject *w, *x;
2712 if (!PyModule_Check(v)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002713 PyErr_SetString(PyExc_TypeError,
2714 "import-from requires module object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002715 return -1;
2716 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002717 w = PyModule_GetDict(v);
2718 if (PyString_AsString(name)[0] == '*') {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002719 int pos, err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002720 PyObject *name, *value;
Guido van Rossum25831651993-05-19 14:50:45 +00002721 pos = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00002722 while (PyDict_Next(w, &pos, &name, &value)) {
2723 if (!PyString_Check(name) ||
2724 PyString_AsString(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002725 continue;
Guido van Rossumb209a111997-04-29 18:18:01 +00002726 Py_INCREF(value);
2727 err = PyDict_SetItem(locals, name, value);
2728 Py_DECREF(value);
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002729 if (err != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002730 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002731 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002732 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002733 }
2734 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002735 x = PyDict_GetItem(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002736 if (x == NULL) {
Jeremy Hylton76901512000-03-28 23:49:17 +00002737 PyErr_Format(PyExc_ImportError,
2738 "cannot import name %.230s",
2739 PyString_AsString(name));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002740 return -1;
2741 }
2742 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002743 return PyDict_SetItem(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002744 }
2745}
2746
Guido van Rossumb209a111997-04-29 18:18:01 +00002747static PyObject *
Guido van Rossum25831651993-05-19 14:50:45 +00002748build_class(methods, bases, name)
Guido van Rossumb209a111997-04-29 18:18:01 +00002749 PyObject *methods; /* dictionary */
2750 PyObject *bases; /* tuple containing classes */
2751 PyObject *name; /* string */
Guido van Rossume9736fc1990-11-18 17:33:06 +00002752{
Guido van Rossumcd649651997-08-22 16:56:16 +00002753 int i, n;
Guido van Rossumb209a111997-04-29 18:18:01 +00002754 if (!PyTuple_Check(bases)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002755 PyErr_SetString(PyExc_SystemError,
2756 "build_class with non-tuple bases");
Guido van Rossum25831651993-05-19 14:50:45 +00002757 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002758 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002759 if (!PyDict_Check(methods)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002760 PyErr_SetString(PyExc_SystemError,
2761 "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002762 return NULL;
2763 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002764 if (!PyString_Check(name)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002765 PyErr_SetString(PyExc_SystemError,
Guido van Rossum7a5b7962000-03-31 13:52:29 +00002766 "build_class with non-string name");
Guido van Rossum25831651993-05-19 14:50:45 +00002767 return NULL;
2768 }
Guido van Rossumcd649651997-08-22 16:56:16 +00002769 n = PyTuple_Size(bases);
2770 for (i = 0; i < n; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002771 PyObject *base = PyTuple_GET_ITEM(bases, i);
2772 if (!PyClass_Check(base)) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002773 /* Call the base's *type*, if it is callable.
2774 This code is a hook for Donald Beaudry's
2775 and Jim Fulton's type extensions. In
2776 unexended Python it will never be triggered
Guido van Rossum55b9ab51997-07-31 03:54:02 +00002777 since its types are not callable.
2778 Ditto: call the bases's *class*, if it has
2779 one. This makes the same thing possible
2780 without writing C code. A true meta-object
2781 protocol! */
2782 PyObject *basetype = (PyObject *)base->ob_type;
2783 PyObject *callable = NULL;
2784 if (PyCallable_Check(basetype))
2785 callable = basetype;
2786 else
2787 callable = PyObject_GetAttrString(
2788 base, "__class__");
2789 if (callable) {
2790 PyObject *args;
2791 PyObject *newclass = NULL;
2792 args = Py_BuildValue(
2793 "(OOO)", name, bases, methods);
2794 if (args != NULL) {
2795 newclass = PyEval_CallObject(
2796 callable, args);
2797 Py_DECREF(args);
2798 }
Guido van Rossum730806d1998-04-10 22:27:42 +00002799 if (callable != basetype) {
Guido van Rossum55b9ab51997-07-31 03:54:02 +00002800 Py_DECREF(callable);
Guido van Rossum730806d1998-04-10 22:27:42 +00002801 }
Guido van Rossum55b9ab51997-07-31 03:54:02 +00002802 return newclass;
Guido van Rossum150b2df1996-12-05 23:17:11 +00002803 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002804 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +00002805 "base is not a class object");
2806 return NULL;
2807 }
2808 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002809 return PyClass_New(bases, methods, name);
Guido van Rossum25831651993-05-19 14:50:45 +00002810}
2811
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002812static int
Guido van Rossuma027efa1997-05-05 20:56:21 +00002813exec_statement(f, prog, globals, locals)
2814 PyFrameObject *f;
Guido van Rossumb209a111997-04-29 18:18:01 +00002815 PyObject *prog;
2816 PyObject *globals;
2817 PyObject *locals;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002818{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002819 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00002820 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002821 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002822
Guido van Rossumb209a111997-04-29 18:18:01 +00002823 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
2824 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002825 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00002826 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002827 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00002828 locals = PyTuple_GetItem(prog, 2);
2829 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002830 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002831 if (globals == Py_None) {
2832 globals = PyEval_GetGlobals();
2833 if (locals == Py_None) {
2834 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002835 plain = 1;
2836 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002837 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002838 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002839 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00002840 if (!PyString_Check(prog) &&
2841 !PyCode_Check(prog) &&
2842 !PyFile_Check(prog)) {
2843 PyErr_SetString(PyExc_TypeError,
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002844 "exec 1st arg must be string, code or file object");
2845 return -1;
2846 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002847 if (!PyDict_Check(globals) || !PyDict_Check(locals)) {
2848 PyErr_SetString(PyExc_TypeError,
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002849 "exec 2nd/3rd args must be dict or None");
2850 return -1;
2851 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002852 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002853 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00002854 if (PyCode_Check(prog)) {
Guido van Rossuma400d8a2000-01-12 22:45:54 +00002855 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002856 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00002857 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002858 FILE *fp = PyFile_AsFile(prog);
2859 char *name = PyString_AsString(PyFile_Name(prog));
Guido van Rossuma400d8a2000-01-12 22:45:54 +00002860 v = PyRun_File(fp, name, Py_file_input, globals, locals);
2861 }
2862 else {
2863 char *s = PyString_AsString(prog);
Guido van Rossum582acec2000-06-28 22:07:35 +00002864 if (strlen(s) != (size_t)PyString_Size(prog)) {
Guido van Rossuma400d8a2000-01-12 22:45:54 +00002865 PyErr_SetString(PyExc_ValueError,
2866 "embedded '\\0' in exec string");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002867 return -1;
Guido van Rossuma400d8a2000-01-12 22:45:54 +00002868 }
2869 v = PyRun_String(s, Py_file_input, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002870 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00002871 if (plain)
2872 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002873 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002874 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00002875 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002876 return 0;
2877}
Guido van Rossum24c13741995-02-14 09:42:43 +00002878
Guido van Rossum1aa14831997-01-21 05:34:20 +00002879/* Hack for ni.py */
Guido van Rossumb209a111997-04-29 18:18:01 +00002880static PyObject *
Guido van Rossum24c13741995-02-14 09:42:43 +00002881find_from_args(f, nexti)
Guido van Rossumb209a111997-04-29 18:18:01 +00002882 PyFrameObject *f;
Guido van Rossum24c13741995-02-14 09:42:43 +00002883 int nexti;
2884{
2885 int opcode;
2886 int oparg;
Guido van Rossumb209a111997-04-29 18:18:01 +00002887 PyObject *list, *name;
Guido van Rossum24c13741995-02-14 09:42:43 +00002888 unsigned char *next_instr;
2889
Guido van Rossumd076c731998-10-07 19:42:25 +00002890 _PyCode_GETCODEPTR(f->f_code, &next_instr);
2891 next_instr += nexti;
2892
Guido van Rossum24c13741995-02-14 09:42:43 +00002893 opcode = (*next_instr++);
2894 if (opcode != IMPORT_FROM) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002895 Py_INCREF(Py_None);
2896 return Py_None;
Guido van Rossum24c13741995-02-14 09:42:43 +00002897 }
2898
Guido van Rossumb209a111997-04-29 18:18:01 +00002899 list = PyList_New(0);
Guido van Rossum24c13741995-02-14 09:42:43 +00002900 if (list == NULL)
2901 return NULL;
2902
2903 do {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002904 oparg = (next_instr[1]<<8) + next_instr[0];
2905 next_instr += 2;
Guido van Rossum24c13741995-02-14 09:42:43 +00002906 name = Getnamev(f, oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002907 if (PyList_Append(list, name) < 0) {
2908 Py_DECREF(list);
Guido van Rossum24c13741995-02-14 09:42:43 +00002909 break;
2910 }
2911 opcode = (*next_instr++);
2912 } while (opcode == IMPORT_FROM);
2913
2914 return list;
2915}
Guido van Rossum950361c1997-01-24 13:49:28 +00002916
2917
2918#ifdef DYNAMIC_EXECUTION_PROFILE
2919
2920PyObject *
2921getarray(a)
2922 long a[256];
2923{
2924 int i;
2925 PyObject *l = PyList_New(256);
2926 if (l == NULL) return NULL;
2927 for (i = 0; i < 256; i++) {
2928 PyObject *x = PyInt_FromLong(a[i]);
2929 if (x == NULL) {
2930 Py_DECREF(l);
2931 return NULL;
2932 }
2933 PyList_SetItem(l, i, x);
2934 }
2935 for (i = 0; i < 256; i++)
2936 a[i] = 0;
2937 return l;
2938}
2939
2940PyObject *
2941_Py_GetDXProfile(self, args)
2942 PyObject *self, *args;
2943{
2944#ifndef DXPAIRS
2945 return getarray(dxp);
2946#else
2947 int i;
2948 PyObject *l = PyList_New(257);
2949 if (l == NULL) return NULL;
2950 for (i = 0; i < 257; i++) {
2951 PyObject *x = getarray(dxpairs[i]);
2952 if (x == NULL) {
2953 Py_DECREF(l);
2954 return NULL;
2955 }
2956 PyList_SetItem(l, i, x);
2957 }
2958 return l;
2959#endif
2960}
2961
2962#endif