blob: ef5bced21195cd7e6be884f38fc7634e2b7d6a45 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum6d023c91995-01-04 19:12:13 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossumf70e43a1991-02-19 12:39:46 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000029
30******************************************************************/
31
Guido van Rossum3f5da241990-12-20 15:06:42 +000032/* Execute compiled code */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000033
Guido van Rossum681d79a1995-07-18 14:51:37 +000034/* XXX TO DO:
35 XXX how to pass arguments to call_trace?
Guido van Rossum681d79a1995-07-18 14:51:37 +000036 XXX speed up searching for keywords by using a dictionary
Guido van Rossum681d79a1995-07-18 14:51:37 +000037 XXX document it!
38 */
39
Guido van Rossumb209a111997-04-29 18:18:01 +000040#include "Python.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000041
Guido van Rossum10dc2e81990-11-18 17:27:39 +000042#include "compile.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000043#include "frameobject.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000044#include "eval.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000045#include "opcode.h"
46
Guido van Rossumc6004111993-11-05 10:22:19 +000047#include <ctype.h>
48
Guido van Rossuma027efa1997-05-05 20:56:21 +000049#ifdef HAVE_LIMITS_H
50#include <limits.h>
51#else
52#define INT_MAX 2147483647
53#endif
54
Guido van Rossum04691fc1992-08-12 15:35:34 +000055/* Turn this on if your compiler chokes on the big switch: */
Guido van Rossum1ae940a1995-01-02 19:04:15 +000056/* #define CASE_TOO_BIG 1 */
Guido van Rossum04691fc1992-08-12 15:35:34 +000057
Guido van Rossum408027e1996-12-30 16:17:54 +000058#ifdef Py_DEBUG
Guido van Rossum96a42c81992-01-12 02:29:51 +000059/* For debugging the interpreter: */
60#define LLTRACE 1 /* Low-level trace feature */
61#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000062#endif
63
Guido van Rossum5b722181993-03-30 17:46:03 +000064
Guido van Rossum374a9221991-04-04 10:40:29 +000065/* Forward declarations */
Guido van Rossum374a9221991-04-04 10:40:29 +000066
Guido van Rossumb209a111997-04-29 18:18:01 +000067static PyObject *eval_code2 Py_PROTO((PyCodeObject *,
68 PyObject *, PyObject *,
69 PyObject **, int,
70 PyObject **, int,
71 PyObject **, int,
72 PyObject *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000073#ifdef LLTRACE
Guido van Rossumb209a111997-04-29 18:18:01 +000074static int prtrace Py_PROTO((PyObject *, char *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000075#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +000076static void call_exc_trace Py_PROTO((PyObject **, PyObject**,
77 PyFrameObject *));
78static int call_trace Py_PROTO((PyObject **, PyObject **,
79 PyFrameObject *, char *, PyObject *));
Guido van Rossumb209a111997-04-29 18:18:01 +000080static PyObject *call_builtin Py_PROTO((PyObject *, PyObject *, PyObject *));
81static PyObject *call_function Py_PROTO((PyObject *, PyObject *, PyObject *));
Guido van Rossumb209a111997-04-29 18:18:01 +000082static PyObject *loop_subscript Py_PROTO((PyObject *, PyObject *));
Guido van Rossuma027efa1997-05-05 20:56:21 +000083static int slice_index Py_PROTO((PyObject *, int *));
Guido van Rossumb209a111997-04-29 18:18:01 +000084static PyObject *apply_slice Py_PROTO((PyObject *, PyObject *, PyObject *));
Guido van Rossuma027efa1997-05-05 20:56:21 +000085static int assign_slice Py_PROTO((PyObject *, PyObject *,
86 PyObject *, PyObject *));
Guido van Rossumb209a111997-04-29 18:18:01 +000087static PyObject *cmp_outcome Py_PROTO((int, PyObject *, PyObject *));
88static int import_from Py_PROTO((PyObject *, PyObject *, PyObject *));
89static PyObject *build_class Py_PROTO((PyObject *, PyObject *, PyObject *));
Guido van Rossuma027efa1997-05-05 20:56:21 +000090static int exec_statement Py_PROTO((PyFrameObject *,
91 PyObject *, PyObject *, PyObject *));
Guido van Rossumb209a111997-04-29 18:18:01 +000092static PyObject *find_from_args Py_PROTO((PyFrameObject *, int));
Guido van Rossuma027efa1997-05-05 20:56:21 +000093static void set_exc_info Py_PROTO((PyThreadState *,
94 PyObject *, PyObject *, PyObject *));
95static void reset_exc_info Py_PROTO((PyThreadState *));
Guido van Rossum374a9221991-04-04 10:40:29 +000096
97
Guido van Rossum950361c1997-01-24 13:49:28 +000098/* Dynamic execution profile */
99#ifdef DYNAMIC_EXECUTION_PROFILE
100#ifdef DXPAIRS
101static long dxpairs[257][256];
102#define dxp dxpairs[256]
103#else
104static long dxp[256];
105#endif
106#endif
107
108
Guido van Rossume59214e1994-08-30 08:01:59 +0000109#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000110
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000111#include <errno.h>
Guido van Rossum49b56061998-10-01 20:42:43 +0000112#include "pythread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000113
Guido van Rossuma027efa1997-05-05 20:56:21 +0000114extern int _PyThread_Started; /* Flag for Py_Exit */
115
Guido van Rossum65d5b571998-12-21 19:32:43 +0000116static PyThread_type_lock interpreter_lock = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000117static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000118
119void
Guido van Rossumb209a111997-04-29 18:18:01 +0000120PyEval_InitThreads()
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000121{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000122 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000123 return;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000124 _PyThread_Started = 1;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000125 interpreter_lock = PyThread_allocate_lock();
126 PyThread_acquire_lock(interpreter_lock, 1);
127 main_thread = PyThread_get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000128}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000129
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000130void
Guido van Rossum25ce5661997-08-02 03:10:38 +0000131PyEval_AcquireLock()
132{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000133 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000134}
135
136void
137PyEval_ReleaseLock()
138{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000139 PyThread_release_lock(interpreter_lock);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000140}
141
142void
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000143PyEval_AcquireThread(tstate)
144 PyThreadState *tstate;
145{
146 if (tstate == NULL)
147 Py_FatalError("PyEval_AcquireThread: NULL new thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000148 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000149 if (PyThreadState_Swap(tstate) != NULL)
150 Py_FatalError(
151 "PyEval_AcquireThread: non-NULL old thread state");
152}
153
154void
155PyEval_ReleaseThread(tstate)
156 PyThreadState *tstate;
157{
158 if (tstate == NULL)
159 Py_FatalError("PyEval_ReleaseThread: NULL thread state");
160 if (PyThreadState_Swap(NULL) != tstate)
161 Py_FatalError("PyEval_ReleaseThread: wrong thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000162 PyThread_release_lock(interpreter_lock);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000163}
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000164#endif
165
Guido van Rossumff4949e1992-08-05 19:58:53 +0000166/* Functions save_thread and restore_thread are always defined so
167 dynamically loaded modules needn't be compiled separately for use
168 with and without threads: */
169
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000170PyThreadState *
Guido van Rossumb209a111997-04-29 18:18:01 +0000171PyEval_SaveThread()
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000172{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000173 PyThreadState *tstate = PyThreadState_Swap(NULL);
174 if (tstate == NULL)
175 Py_FatalError("PyEval_SaveThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000176#ifdef WITH_THREAD
Guido van Rossumb74eca91997-09-30 22:03:16 +0000177 if (interpreter_lock)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000178 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000179#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000180 return tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000181}
182
183void
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000184PyEval_RestoreThread(tstate)
185 PyThreadState *tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000186{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000187 if (tstate == NULL)
188 Py_FatalError("PyEval_RestoreThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000189#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000190 if (interpreter_lock) {
Guido van Rossumb74eca91997-09-30 22:03:16 +0000191 int err = errno;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000192 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000193 errno = err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000194 }
195#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000196 PyThreadState_Swap(tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000197}
198
199
Guido van Rossuma9672091994-09-14 13:31:22 +0000200/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
201 signal handlers or Mac I/O completion routines) can schedule calls
202 to a function to be called synchronously.
203 The synchronous function is called with one void* argument.
204 It should return 0 for success or -1 for failure -- failure should
205 be accompanied by an exception.
206
207 If registry succeeds, the registry function returns 0; if it fails
208 (e.g. due to too many pending calls) it returns -1 (without setting
209 an exception condition).
210
211 Note that because registry may occur from within signal handlers,
212 or other asynchronous events, calling malloc() is unsafe!
213
214#ifdef WITH_THREAD
215 Any thread can schedule pending calls, but only the main thread
216 will execute them.
217#endif
218
219 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
220 There are two possible race conditions:
221 (1) nested asynchronous registry calls;
222 (2) registry calls made while pending calls are being processed.
223 While (1) is very unlikely, (2) is a real possibility.
224 The current code is safe against (2), but not against (1).
225 The safety against (2) is derived from the fact that only one
226 thread (the main thread) ever takes things out of the queue.
Guido van Rossuma9672091994-09-14 13:31:22 +0000227
Guido van Rossuma027efa1997-05-05 20:56:21 +0000228 XXX Darn! With the advent of thread state, we should have an array
229 of pending calls per thread in the thread state! Later...
230*/
Guido van Rossum8861b741996-07-30 16:49:37 +0000231
Guido van Rossuma9672091994-09-14 13:31:22 +0000232#define NPENDINGCALLS 32
233static struct {
Guido van Rossumb209a111997-04-29 18:18:01 +0000234 int (*func) Py_PROTO((ANY *));
Guido van Rossuma9672091994-09-14 13:31:22 +0000235 ANY *arg;
236} pendingcalls[NPENDINGCALLS];
237static volatile int pendingfirst = 0;
238static volatile int pendinglast = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000239static volatile int things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000240
241int
242Py_AddPendingCall(func, arg)
Guido van Rossumb209a111997-04-29 18:18:01 +0000243 int (*func) Py_PROTO((ANY *));
Guido van Rossuma9672091994-09-14 13:31:22 +0000244 ANY *arg;
245{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000246 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000247 int i, j;
248 /* XXX Begin critical section */
249 /* XXX If you want this to be safe against nested
250 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000251 if (busy)
252 return -1;
253 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000254 i = pendinglast;
255 j = (i + 1) % NPENDINGCALLS;
256 if (j == pendingfirst)
257 return -1; /* Queue full */
258 pendingcalls[i].func = func;
259 pendingcalls[i].arg = arg;
260 pendinglast = j;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000261 things_to_do = 1; /* Signal main loop */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000262 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000263 /* XXX End critical section */
264 return 0;
265}
266
Guido van Rossum180d7b41994-09-29 09:45:57 +0000267int
268Py_MakePendingCalls()
Guido van Rossuma9672091994-09-14 13:31:22 +0000269{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000270 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000271#ifdef WITH_THREAD
Guido van Rossum65d5b571998-12-21 19:32:43 +0000272 if (main_thread && PyThread_get_thread_ident() != main_thread)
Guido van Rossuma9672091994-09-14 13:31:22 +0000273 return 0;
274#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000275 if (busy)
Guido van Rossum180d7b41994-09-29 09:45:57 +0000276 return 0;
277 busy = 1;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000278 things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000279 for (;;) {
280 int i;
Guido van Rossumb209a111997-04-29 18:18:01 +0000281 int (*func) Py_PROTO((ANY *));
Guido van Rossuma9672091994-09-14 13:31:22 +0000282 ANY *arg;
283 i = pendingfirst;
284 if (i == pendinglast)
285 break; /* Queue empty */
286 func = pendingcalls[i].func;
287 arg = pendingcalls[i].arg;
288 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000289 if (func(arg) < 0) {
290 busy = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000291 things_to_do = 1; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000292 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000293 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000294 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000295 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000296 return 0;
297}
298
299
Guido van Rossum374a9221991-04-04 10:40:29 +0000300/* Status code for main loop (reason for stack unwind) */
301
302enum why_code {
303 WHY_NOT, /* No error */
304 WHY_EXCEPTION, /* Exception occurred */
305 WHY_RERAISE, /* Exception re-raised by 'finally' */
306 WHY_RETURN, /* 'return' statement */
307 WHY_BREAK /* 'break' statement */
308};
309
Guido van Rossumb209a111997-04-29 18:18:01 +0000310static enum why_code do_raise Py_PROTO((PyObject *, PyObject *, PyObject *));
Barry Warsawe42b18f1997-08-25 22:13:04 +0000311static int unpack_sequence Py_PROTO((PyObject *, int, PyObject **));
Guido van Rossum1aa14831997-01-21 05:34:20 +0000312
Guido van Rossum374a9221991-04-04 10:40:29 +0000313
Guido van Rossum681d79a1995-07-18 14:51:37 +0000314/* Backward compatible interface */
Guido van Rossum374a9221991-04-04 10:40:29 +0000315
Guido van Rossumb209a111997-04-29 18:18:01 +0000316PyObject *
317PyEval_EvalCode(co, globals, locals)
318 PyCodeObject *co;
319 PyObject *globals;
320 PyObject *locals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000321{
322 return eval_code2(co,
323 globals, locals,
Guido van Rossumb209a111997-04-29 18:18:01 +0000324 (PyObject **)NULL, 0,
325 (PyObject **)NULL, 0,
326 (PyObject **)NULL, 0,
327 (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000328}
329
330
331/* Interpreter main loop */
332
Guido van Rossum8861b741996-07-30 16:49:37 +0000333#ifndef MAX_RECURSION_DEPTH
334#define MAX_RECURSION_DEPTH 10000
335#endif
336
Guido van Rossumb209a111997-04-29 18:18:01 +0000337static PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +0000338eval_code2(co, globals, locals,
339 args, argcount, kws, kwcount, defs, defcount, owner)
Guido van Rossumb209a111997-04-29 18:18:01 +0000340 PyCodeObject *co;
341 PyObject *globals;
342 PyObject *locals;
343 PyObject **args;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000344 int argcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000345 PyObject **kws; /* length: 2*kwcount */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000346 int kwcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000347 PyObject **defs;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000348 int defcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000349 PyObject *owner;
Guido van Rossum374a9221991-04-04 10:40:29 +0000350{
Guido van Rossum950361c1997-01-24 13:49:28 +0000351#ifdef DXPAIRS
352 int lastopcode = 0;
353#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000354 register unsigned char *next_instr;
Guido van Rossum50cd3481998-11-17 17:02:51 +0000355 register int opcode; /* Current opcode */
356 register int oparg; /* Current opcode argument, if any */
Guido van Rossumb209a111997-04-29 18:18:01 +0000357 register PyObject **stack_pointer;
Guido van Rossum374a9221991-04-04 10:40:29 +0000358 register enum why_code why; /* Reason for block stack unwind */
359 register int err; /* Error status -- nonzero if error */
Guido van Rossumb209a111997-04-29 18:18:01 +0000360 register PyObject *x; /* Result object -- NULL if error */
361 register PyObject *v; /* Temporary objects popped off stack */
362 register PyObject *w;
363 register PyObject *u;
364 register PyObject *t;
365 register PyFrameObject *f; /* Current frame */
Guido van Rossum50cd3481998-11-17 17:02:51 +0000366 register PyObject **fastlocals;
Guido van Rossum014518f1998-11-23 21:09:51 +0000367 PyObject *retval = NULL; /* Return value */
Guido van Rossum885553e1998-12-21 18:33:30 +0000368 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossumd076c731998-10-07 19:42:25 +0000369 unsigned char *first_instr;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000370#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000371 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000372#endif
Guido van Rossum408027e1996-12-30 16:17:54 +0000373#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000374 /* Make it easier to find out where we are with a debugger */
Guido van Rossumb209a111997-04-29 18:18:01 +0000375 char *filename = PyString_AsString(co->co_filename);
Guido van Rossum99bec951992-09-03 20:29:45 +0000376#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000377
378/* Code access macros */
379
380#define GETCONST(i) Getconst(f, i)
381#define GETNAME(i) Getname(f, i)
382#define GETNAMEV(i) Getnamev(f, i)
Guido van Rossumd076c731998-10-07 19:42:25 +0000383#define INSTR_OFFSET() (next_instr - first_instr)
Guido van Rossum374a9221991-04-04 10:40:29 +0000384#define NEXTOP() (*next_instr++)
385#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossumd076c731998-10-07 19:42:25 +0000386#define JUMPTO(x) (next_instr = first_instr + (x))
Guido van Rossum374a9221991-04-04 10:40:29 +0000387#define JUMPBY(x) (next_instr += (x))
388
389/* Stack manipulation macros */
390
391#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
392#define EMPTY() (STACK_LEVEL() == 0)
393#define TOP() (stack_pointer[-1])
394#define BASIC_PUSH(v) (*stack_pointer++ = (v))
395#define BASIC_POP() (*--stack_pointer)
396
Guido van Rossum96a42c81992-01-12 02:29:51 +0000397#ifdef LLTRACE
398#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
399#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000400#else
401#define PUSH(v) BASIC_PUSH(v)
402#define POP() BASIC_POP()
403#endif
404
Guido van Rossum681d79a1995-07-18 14:51:37 +0000405/* Local variable macros */
406
407#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumb209a111997-04-29 18:18:01 +0000408#define SETLOCAL(i, value) do { Py_XDECREF(GETLOCAL(i)); \
Guido van Rossum681d79a1995-07-18 14:51:37 +0000409 GETLOCAL(i) = value; } while (0)
410
Guido van Rossuma027efa1997-05-05 20:56:21 +0000411/* Start of code */
412
Guido van Rossum8861b741996-07-30 16:49:37 +0000413#ifdef USE_STACKCHECK
Guido van Rossuma027efa1997-05-05 20:56:21 +0000414 if (tstate->recursion_depth%10 == 0 && PyOS_CheckStack()) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000415 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
Guido van Rossum8861b741996-07-30 16:49:37 +0000416 return NULL;
417 }
418#endif
419
Guido van Rossum681d79a1995-07-18 14:51:37 +0000420 if (globals == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000421 PyErr_SetString(PyExc_SystemError, "eval_code2: NULL globals");
Guido van Rossum6135a871995-01-09 17:53:26 +0000422 return NULL;
Guido van Rossum5b722181993-03-30 17:46:03 +0000423 }
424
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000425#ifdef LLTRACE
Guido van Rossumb209a111997-04-29 18:18:01 +0000426 lltrace = PyDict_GetItemString(globals, "__lltrace__") != NULL;
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000427#endif
428
Guido van Rossumb209a111997-04-29 18:18:01 +0000429 f = PyFrame_New(
Guido van Rossuma027efa1997-05-05 20:56:21 +0000430 tstate, /*back*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000431 co, /*code*/
432 globals, /*globals*/
Guido van Rossum76836021997-01-20 04:26:20 +0000433 locals); /*locals*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000434 if (f == NULL)
435 return NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000436
Guido van Rossuma027efa1997-05-05 20:56:21 +0000437 tstate->frame = f;
Guido van Rossumdeb0c5e1997-01-27 23:42:36 +0000438 fastlocals = f->f_localsplus;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000439
440 if (co->co_argcount > 0 ||
441 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
442 int i;
443 int n = argcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000444 PyObject *kwdict = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000445 if (co->co_flags & CO_VARKEYWORDS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000446 kwdict = PyDict_New();
Guido van Rossum681d79a1995-07-18 14:51:37 +0000447 if (kwdict == NULL)
448 goto fail;
Guido van Rossum8c5df061997-01-24 04:19:24 +0000449 i = co->co_argcount;
450 if (co->co_flags & CO_VARARGS)
451 i++;
452 SETLOCAL(i, kwdict);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000453 }
454 if (argcount > co->co_argcount) {
455 if (!(co->co_flags & CO_VARARGS)) {
Guido van Rossumdf9db1e1997-11-19 16:05:40 +0000456 PyErr_Format(PyExc_TypeError,
457 "too many arguments; expected %d, got %d",
458 co->co_argcount, argcount);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000459 goto fail;
460 }
461 n = co->co_argcount;
462 }
463 for (i = 0; i < n; i++) {
464 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000465 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000466 SETLOCAL(i, x);
467 }
468 if (co->co_flags & CO_VARARGS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000469 u = PyTuple_New(argcount - n);
Guido van Rossum8c5df061997-01-24 04:19:24 +0000470 if (u == NULL)
471 goto fail;
472 SETLOCAL(co->co_argcount, u);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000473 for (i = n; i < argcount; i++) {
474 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000475 Py_INCREF(x);
476 PyTuple_SET_ITEM(u, i-n, x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000477 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000478 }
479 for (i = 0; i < kwcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000480 PyObject *keyword = kws[2*i];
481 PyObject *value = kws[2*i + 1];
Guido van Rossum681d79a1995-07-18 14:51:37 +0000482 int j;
483 /* XXX slow -- speed up using dictionary? */
484 for (j = 0; j < co->co_argcount; j++) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000485 PyObject *nm = PyTuple_GET_ITEM(
486 co->co_varnames, j);
Guido van Rossumb209a111997-04-29 18:18:01 +0000487 if (PyObject_Compare(keyword, nm) == 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000488 break;
489 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000490 /* Check errors from Compare */
491 if (PyErr_Occurred())
492 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000493 if (j >= co->co_argcount) {
494 if (kwdict == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000495 PyErr_Format(PyExc_TypeError,
Guido van Rossuma027efa1997-05-05 20:56:21 +0000496 "unexpected keyword argument: %.400s",
497 PyString_AsString(keyword));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000498 goto fail;
499 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000500 PyDict_SetItem(kwdict, keyword, value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000501 }
502 else {
503 if (GETLOCAL(j) != NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000504 PyErr_SetString(PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +0000505 "keyword parameter redefined");
506 goto fail;
507 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000508 Py_INCREF(value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000509 SETLOCAL(j, value);
510 }
511 }
512 if (argcount < co->co_argcount) {
513 int m = co->co_argcount - defcount;
514 for (i = argcount; i < m; i++) {
515 if (GETLOCAL(i) == NULL) {
Guido van Rossumdf9db1e1997-11-19 16:05:40 +0000516 PyErr_Format(PyExc_TypeError,
517 "not enough arguments; expected %d, got %d",
518 m, i);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000519 goto fail;
520 }
521 }
522 if (n > m)
523 i = n - m;
524 else
525 i = 0;
526 for (; i < defcount; i++) {
527 if (GETLOCAL(m+i) == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000528 PyObject *def = defs[i];
529 Py_INCREF(def);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000530 SETLOCAL(m+i, def);
531 }
532 }
533 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000534 }
535 else {
536 if (argcount > 0 || kwcount > 0) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000537 PyErr_SetString(PyExc_TypeError,
538 "no arguments expected");
Guido van Rossum8c5df061997-01-24 04:19:24 +0000539 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000540 }
541 }
542
Guido van Rossuma027efa1997-05-05 20:56:21 +0000543 if (tstate->sys_tracefunc != NULL) {
544 /* tstate->sys_tracefunc, if defined, is a function that
545 will be called on *every* entry to a code block.
Guido van Rossum96a42c81992-01-12 02:29:51 +0000546 Its return value, if not None, is a function that
547 will be called at the start of each executed line
548 of code. (Actually, the function must return
549 itself in order to continue tracing.)
550 The trace functions are called with three arguments:
551 a pointer to the current frame, a string indicating
552 why the function is called, and an argument which
553 depends on the situation. The global trace function
554 (sys.trace) is also called whenever an exception
555 is detected. */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000556 if (call_trace(&tstate->sys_tracefunc,
557 &f->f_trace, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000558 Py_None/*XXX how to compute arguments now?*/)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000559 /* Trace function raised an error */
Guido van Rossum8c5df061997-01-24 04:19:24 +0000560 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000561 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000562 }
563
Guido van Rossuma027efa1997-05-05 20:56:21 +0000564 if (tstate->sys_profilefunc != NULL) {
565 /* Similar for sys_profilefunc, except it needn't return
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000566 itself and isn't called for "line" events */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000567 if (call_trace(&tstate->sys_profilefunc,
568 (PyObject**)0, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000569 Py_None/*XXX*/)) {
Guido van Rossum8c5df061997-01-24 04:19:24 +0000570 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000571 }
572 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000573
Guido van Rossuma027efa1997-05-05 20:56:21 +0000574 if (++tstate->recursion_depth > MAX_RECURSION_DEPTH) {
575 --tstate->recursion_depth;
576 PyErr_SetString(PyExc_RuntimeError,
577 "Maximum recursion depth exceeded");
578 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +0000579 Py_DECREF(f);
Guido van Rossum8861b741996-07-30 16:49:37 +0000580 return NULL;
581 }
582
Guido van Rossumd076c731998-10-07 19:42:25 +0000583 _PyCode_GETCODEPTR(co, &first_instr);
584 next_instr = first_instr;
Guido van Rossum374a9221991-04-04 10:40:29 +0000585 stack_pointer = f->f_valuestack;
586
Guido van Rossum374a9221991-04-04 10:40:29 +0000587 why = WHY_NOT;
588 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000589 x = Py_None; /* Not a reference, just anything non-NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000590
591 for (;;) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000592 /* Do periodic things. Doing this every time through
593 the loop would add too much overhead, so we do it
594 only every Nth instruction. We also do it if
595 ``things_to_do'' is set, i.e. when an asynchronous
596 event needs attention (e.g. a signal handler or
597 async I/O handler); see Py_AddPendingCall() and
598 Py_MakePendingCalls() above. */
Guido van Rossuma9672091994-09-14 13:31:22 +0000599
Guido van Rossuma027efa1997-05-05 20:56:21 +0000600 if (things_to_do || --tstate->ticker < 0) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000601 tstate->ticker = tstate->interp->checkinterval;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000602 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000603 if (Py_MakePendingCalls() < 0) {
604 why = WHY_EXCEPTION;
605 goto on_error;
606 }
607 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000608#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000609 /* If we have true signals, the signal handler
610 will call Py_AddPendingCall() so we don't
611 have to call sigcheck(). On the Mac and
612 DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000613 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000614 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000615 goto on_error;
616 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000617#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000618
Guido van Rossume59214e1994-08-30 08:01:59 +0000619#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000620 if (interpreter_lock) {
621 /* Give another thread a chance */
622
Guido van Rossum25ce5661997-08-02 03:10:38 +0000623 if (PyThreadState_Swap(NULL) != tstate)
624 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000625 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000626
627 /* Other threads may run now */
628
Guido van Rossum65d5b571998-12-21 19:32:43 +0000629 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000630 if (PyThreadState_Swap(tstate) != NULL)
631 Py_FatalError("ceval: orphan tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000632 }
633#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000634 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000635
Guido van Rossum374a9221991-04-04 10:40:29 +0000636 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000637
Guido van Rossum408027e1996-12-30 16:17:54 +0000638#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000639 f->f_lasti = INSTR_OFFSET();
640#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000641
642 opcode = NEXTOP();
643 if (HAS_ARG(opcode))
644 oparg = NEXTARG();
Guido van Rossum950361c1997-01-24 13:49:28 +0000645#ifdef DYNAMIC_EXECUTION_PROFILE
646#ifdef DXPAIRS
647 dxpairs[lastopcode][opcode]++;
648 lastopcode = opcode;
649#endif
650 dxp[opcode]++;
651#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000652
Guido van Rossum96a42c81992-01-12 02:29:51 +0000653#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000654 /* Instruction tracing */
655
Guido van Rossum96a42c81992-01-12 02:29:51 +0000656 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000657 if (HAS_ARG(opcode)) {
658 printf("%d: %d, %d\n",
659 (int) (INSTR_OFFSET() - 3),
660 opcode, oparg);
661 }
662 else {
663 printf("%d: %d\n",
664 (int) (INSTR_OFFSET() - 1), opcode);
665 }
666 }
667#endif
668
669 /* Main switch on opcode */
670
671 switch (opcode) {
672
673 /* BEWARE!
674 It is essential that any operation that fails sets either
675 x to NULL, err to nonzero, or why to anything but WHY_NOT,
676 and that no operation that succeeds does this! */
677
678 /* case STOP_CODE: this is an error! */
679
680 case POP_TOP:
681 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000682 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000683 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000684
685 case ROT_TWO:
686 v = POP();
687 w = POP();
688 PUSH(v);
689 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000690 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000691
692 case ROT_THREE:
693 v = POP();
694 w = POP();
695 x = POP();
696 PUSH(v);
697 PUSH(x);
698 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000699 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000700
701 case DUP_TOP:
702 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000703 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000704 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000705 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000706
707 case UNARY_POSITIVE:
708 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000709 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000710 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000711 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000712 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000713 break;
714
715 case UNARY_NEGATIVE:
716 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000717 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000718 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000719 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000720 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000721 break;
722
723 case UNARY_NOT:
724 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000725 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000726 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000727 if (err == 0) {
728 Py_INCREF(Py_True);
729 PUSH(Py_True);
730 continue;
731 }
732 else if (err > 0) {
733 Py_INCREF(Py_False);
734 PUSH(Py_False);
735 err = 0;
736 continue;
737 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000738 break;
739
740 case UNARY_CONVERT:
741 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000742 x = PyObject_Repr(v);
743 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000744 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000745 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000746 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000747
748 case UNARY_INVERT:
749 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000750 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000751 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000752 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000753 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000754 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000755
Guido van Rossum50564e81996-01-12 01:13:16 +0000756 case BINARY_POWER:
757 w = POP();
758 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000759 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000760 Py_DECREF(v);
761 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000762 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000763 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000764 break;
765
Guido van Rossum374a9221991-04-04 10:40:29 +0000766 case BINARY_MULTIPLY:
767 w = POP();
768 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000769 x = PyNumber_Multiply(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_DIVIDE:
777 w = POP();
778 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000779 x = PyNumber_Divide(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_MODULO:
787 w = POP();
788 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000789 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000790 Py_DECREF(v);
791 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000792 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000793 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000794 break;
795
796 case BINARY_ADD:
797 w = POP();
798 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000799 if (PyInt_Check(v) && PyInt_Check(w)) {
800 /* INLINE: int + int */
801 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000802 a = PyInt_AS_LONG(v);
803 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000804 i = a + b;
805 if ((i^a) < 0 && (i^b) < 0) {
806 PyErr_SetString(PyExc_OverflowError,
807 "integer addition");
808 x = NULL;
809 }
810 else
811 x = PyInt_FromLong(i);
812 }
813 else
814 x = PyNumber_Add(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000815 Py_DECREF(v);
816 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000817 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000818 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000819 break;
820
821 case BINARY_SUBTRACT:
822 w = POP();
823 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000824 if (PyInt_Check(v) && PyInt_Check(w)) {
825 /* INLINE: int - int */
826 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000827 a = PyInt_AS_LONG(v);
828 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000829 i = a - b;
830 if ((i^a) < 0 && (i^~b) < 0) {
831 PyErr_SetString(PyExc_OverflowError,
832 "integer subtraction");
833 x = NULL;
834 }
835 else
836 x = PyInt_FromLong(i);
837 }
838 else
839 x = PyNumber_Subtract(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000840 Py_DECREF(v);
841 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000842 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000843 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000844 break;
845
846 case BINARY_SUBSCR:
847 w = POP();
848 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000849 if (PyList_Check(v) && PyInt_Check(w)) {
850 /* INLINE: list[int] */
851 long i = PyInt_AsLong(w);
852 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +0000853 i += PyList_GET_SIZE(v);
Guido van Rossumc12da691997-07-17 23:12:42 +0000854 if (i < 0 ||
Guido van Rossumfa00e951998-07-08 15:02:37 +0000855 i >= PyList_GET_SIZE(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +0000856 PyErr_SetString(PyExc_IndexError,
857 "list index out of range");
858 x = NULL;
859 }
860 else {
Guido van Rossumfa00e951998-07-08 15:02:37 +0000861 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +0000862 Py_INCREF(x);
863 }
864 }
865 else
866 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000867 Py_DECREF(v);
868 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000869 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000870 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000871 break;
872
Guido van Rossum7928cd71991-10-24 14:59:31 +0000873 case BINARY_LSHIFT:
874 w = POP();
875 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000876 x = PyNumber_Lshift(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_RSHIFT:
884 w = POP();
885 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000886 x = PyNumber_Rshift(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_AND:
894 w = POP();
895 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000896 x = PyNumber_And(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_XOR:
904 w = POP();
905 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000906 x = PyNumber_Xor(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
913 case BINARY_OR:
914 w = POP();
915 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000916 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000917 Py_DECREF(v);
918 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000919 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000920 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000921 break;
922
Guido van Rossum374a9221991-04-04 10:40:29 +0000923 case SLICE+0:
924 case SLICE+1:
925 case SLICE+2:
926 case SLICE+3:
927 if ((opcode-SLICE) & 2)
928 w = POP();
929 else
930 w = NULL;
931 if ((opcode-SLICE) & 1)
932 v = POP();
933 else
934 v = NULL;
935 u = POP();
936 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000937 Py_DECREF(u);
938 Py_XDECREF(v);
939 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000940 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000941 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000942 break;
943
944 case STORE_SLICE+0:
945 case STORE_SLICE+1:
946 case STORE_SLICE+2:
947 case STORE_SLICE+3:
948 if ((opcode-STORE_SLICE) & 2)
949 w = POP();
950 else
951 w = NULL;
952 if ((opcode-STORE_SLICE) & 1)
953 v = POP();
954 else
955 v = NULL;
956 u = POP();
957 t = POP();
958 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +0000959 Py_DECREF(t);
960 Py_DECREF(u);
961 Py_XDECREF(v);
962 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000963 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000964 break;
965
966 case DELETE_SLICE+0:
967 case DELETE_SLICE+1:
968 case DELETE_SLICE+2:
969 case DELETE_SLICE+3:
970 if ((opcode-DELETE_SLICE) & 2)
971 w = POP();
972 else
973 w = NULL;
974 if ((opcode-DELETE_SLICE) & 1)
975 v = POP();
976 else
977 v = NULL;
978 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000979 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +0000980 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +0000981 Py_DECREF(u);
982 Py_XDECREF(v);
983 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000984 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000985 break;
986
987 case STORE_SUBSCR:
988 w = POP();
989 v = POP();
990 u = POP();
991 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +0000992 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +0000993 Py_DECREF(u);
994 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 DELETE_SUBSCR:
1000 w = POP();
1001 v = POP();
1002 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001003 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001004 Py_DECREF(v);
1005 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001006 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001007 break;
1008
1009 case PRINT_EXPR:
1010 v = POP();
Guido van Rossumaa06b0e1997-12-26 22:15:57 +00001011 /* Print value except if None */
1012 /* After printing, also assign to '_' */
1013 /* Before, set '_' to None to avoid recursion */
Guido van Rossumb209a111997-04-29 18:18:01 +00001014 if (v != Py_None &&
Guido van Rossuma027efa1997-05-05 20:56:21 +00001015 (err = PyDict_SetItemString(
Guido van Rossumaa06b0e1997-12-26 22:15:57 +00001016 f->f_builtins, "_", Py_None)) == 0) {
Guido van Rossumbe270261997-05-22 22:26:18 +00001017 err = Py_FlushLine();
Guido van Rossumc12da691997-07-17 23:12:42 +00001018 if (err == 0) {
Guido van Rossumbe270261997-05-22 22:26:18 +00001019 x = PySys_GetObject("stdout");
Guido van Rossum8f183201997-12-31 05:53:15 +00001020 if (x == NULL) {
1021 PyErr_SetString(
1022 PyExc_RuntimeError,
1023 "lost sys.stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00001024 err = -1;
Guido van Rossum8f183201997-12-31 05:53:15 +00001025 }
Guido van Rossumbe270261997-05-22 22:26:18 +00001026 }
1027 if (err == 0)
1028 err = PyFile_WriteObject(v, x, 0);
1029 if (err == 0) {
1030 PyFile_SoftSpace(x, 1);
1031 err = Py_FlushLine();
1032 }
Guido van Rossumaa06b0e1997-12-26 22:15:57 +00001033 if (err == 0) {
1034 err = PyDict_SetItemString(
1035 f->f_builtins, "_", v);
1036 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001037 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001038 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001039 break;
1040
1041 case PRINT_ITEM:
1042 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001043 w = PySys_GetObject("stdout");
Guido van Rossum8f183201997-12-31 05:53:15 +00001044 if (w == NULL) {
1045 PyErr_SetString(PyExc_RuntimeError,
1046 "lost sys.stdout");
1047 err = -1;
1048 }
1049 else if (PyFile_SoftSpace(w, 1))
Guido van Rossumbe270261997-05-22 22:26:18 +00001050 err = PyFile_WriteString(" ", w);
1051 if (err == 0)
1052 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Guido van Rossumb209a111997-04-29 18:18:01 +00001053 if (err == 0 && PyString_Check(v)) {
Guido van Rossumc6004111993-11-05 10:22:19 +00001054 /* XXX move into writeobject() ? */
Guido van Rossumb209a111997-04-29 18:18:01 +00001055 char *s = PyString_AsString(v);
1056 int len = PyString_Size(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +00001057 if (len > 0 &&
1058 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +00001059 s[len-1] != ' ')
Guido van Rossumb209a111997-04-29 18:18:01 +00001060 PyFile_SoftSpace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001061 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001062 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001063 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001064 break;
1065
1066 case PRINT_NEWLINE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001067 x = PySys_GetObject("stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001068 if (x == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00001069 PyErr_SetString(PyExc_RuntimeError,
1070 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001071 else {
Guido van Rossumbe270261997-05-22 22:26:18 +00001072 err = PyFile_WriteString("\n", x);
1073 if (err == 0)
1074 PyFile_SoftSpace(x, 0);
Guido van Rossum3165fe61992-09-25 21:59:05 +00001075 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001076 break;
1077
1078 case BREAK_LOOP:
1079 why = WHY_BREAK;
1080 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001081
Guido van Rossumf10570b1995-07-07 22:53:21 +00001082 case RAISE_VARARGS:
1083 u = v = w = NULL;
1084 switch (oparg) {
1085 case 3:
1086 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001087 /* Fallthrough */
1088 case 2:
1089 v = POP(); /* value */
1090 /* Fallthrough */
1091 case 1:
1092 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001093 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001094 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001095 break;
1096 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001097 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001098 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001099 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001100 break;
1101 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001102 break;
1103
1104 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001105 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001106 PyErr_SetString(PyExc_SystemError,
1107 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001108 break;
1109 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001110 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001111 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001112 break;
1113
1114 case RETURN_VALUE:
1115 retval = POP();
1116 why = WHY_RETURN;
1117 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001118
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001119 case EXEC_STMT:
1120 w = POP();
1121 v = POP();
1122 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001123 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001124 Py_DECREF(u);
1125 Py_DECREF(v);
1126 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001127 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001128
Guido van Rossum374a9221991-04-04 10:40:29 +00001129 case POP_BLOCK:
1130 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001131 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001132 while (STACK_LEVEL() > b->b_level) {
1133 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001134 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001135 }
1136 }
1137 break;
1138
1139 case END_FINALLY:
1140 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001141 if (PyInt_Check(v)) {
1142 why = (enum why_code) PyInt_AsLong(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001143 if (why == WHY_RETURN)
1144 retval = POP();
1145 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001146 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001147 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001148 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001149 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001150 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001151 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001152 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001153 else if (v != Py_None) {
1154 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001155 "'finally' pops bad exception");
1156 why = WHY_EXCEPTION;
1157 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001158 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001159 break;
1160
1161 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001162 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001163 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001164 w = POP();
1165 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001166 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001167 Py_DECREF(u);
1168 Py_DECREF(v);
1169 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001170 break;
1171
1172 case STORE_NAME:
1173 w = GETNAMEV(oparg);
1174 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001175 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001176 PyErr_SetString(PyExc_SystemError,
1177 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001178 break;
1179 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001180 err = PyDict_SetItem(x, w, v);
1181 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001182 break;
1183
1184 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001185 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001186 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001187 PyErr_SetString(PyExc_SystemError,
1188 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001189 break;
1190 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001191 if ((err = PyDict_DelItem(x, w)) != 0)
1192 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001193 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001194
1195#ifdef CASE_TOO_BIG
1196 default: switch (opcode) {
1197#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001198
1199 case UNPACK_TUPLE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001200 case UNPACK_LIST:
1201 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001202 if (PyTuple_Check(v)) {
1203 if (PyTuple_Size(v) != oparg) {
1204 PyErr_SetString(PyExc_ValueError,
1205 "unpack tuple of wrong size");
1206 why = WHY_EXCEPTION;
1207 }
1208 else {
1209 for (; --oparg >= 0; ) {
1210 w = PyTuple_GET_ITEM(v, oparg);
1211 Py_INCREF(w);
1212 PUSH(w);
1213 }
1214 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001215 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001216 else if (PyList_Check(v)) {
1217 if (PyList_Size(v) != oparg) {
1218 PyErr_SetString(PyExc_ValueError,
1219 "unpack list of wrong size");
1220 why = WHY_EXCEPTION;
1221 }
1222 else {
1223 for (; --oparg >= 0; ) {
1224 w = PyList_GET_ITEM(v, oparg);
1225 Py_INCREF(w);
1226 PUSH(w);
1227 }
1228 }
1229 }
1230 else if (PySequence_Check(v)) {
1231 if (unpack_sequence(v, oparg,
1232 stack_pointer + oparg))
1233 stack_pointer += oparg;
1234 else
1235 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001236 }
1237 else {
Barry Warsawe42b18f1997-08-25 22:13:04 +00001238 PyErr_SetString(PyExc_TypeError,
1239 "unpack non-sequence");
1240 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001241 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001242 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001243 break;
1244
1245 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001246 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001247 v = POP();
1248 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001249 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1250 Py_DECREF(v);
1251 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001252 break;
1253
1254 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001255 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001256 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001257 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1258 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001259 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001260 break;
1261
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001262 case STORE_GLOBAL:
1263 w = GETNAMEV(oparg);
1264 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001265 err = PyDict_SetItem(f->f_globals, w, v);
1266 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001267 break;
1268
1269 case DELETE_GLOBAL:
1270 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001271 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
1272 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001273 break;
1274
Guido van Rossum374a9221991-04-04 10:40:29 +00001275 case LOAD_CONST:
1276 x = GETCONST(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001277 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001278 PUSH(x);
1279 break;
1280
1281 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001282 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001283 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001284 PyErr_SetString(PyExc_SystemError,
1285 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001286 break;
1287 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001288 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001289 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001290 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001291 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001292 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001293 if (x == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001294 PyErr_SetObject(
1295 PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001296 break;
1297 }
1298 }
1299 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001300 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001301 PUSH(x);
1302 break;
1303
1304 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001305 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001306 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001307 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001308 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001309 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001310 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001311 break;
1312 }
1313 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001314 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001315 PUSH(x);
1316 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001317
Guido van Rossum9bfef441993-03-29 10:43:31 +00001318 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001319 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001320 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001321 PyErr_SetObject(PyExc_NameError,
1322 PyTuple_GetItem(co->co_varnames,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001323 oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001324 break;
1325 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001326 Py_INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001327 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001328 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001329 break;
1330
1331 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001332 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001333 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001334 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001335
1336 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001337 x = GETLOCAL(oparg);
1338 if (x == NULL) {
1339 PyErr_SetObject(PyExc_NameError,
1340 PyTuple_GetItem(co->co_varnames,
1341 oparg));
1342 break;
1343 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001344 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001345 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001346
1347 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001348 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001349 if (x != NULL) {
1350 for (; --oparg >= 0;) {
1351 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001352 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001353 }
1354 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001355 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001356 }
1357 break;
1358
1359 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001360 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001361 if (x != NULL) {
1362 for (; --oparg >= 0;) {
1363 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001364 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001365 }
1366 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001367 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001368 }
1369 break;
1370
1371 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001372 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001373 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001374 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001375 break;
1376
1377 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001378 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001379 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001380 x = PyObject_GetAttr(v, w);
1381 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001382 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001383 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001384 break;
1385
1386 case COMPARE_OP:
1387 w = POP();
1388 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +00001389 if (PyInt_Check(v) && PyInt_Check(w)) {
1390 /* INLINE: cmp(int, int) */
1391 register long a, b;
1392 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001393 a = PyInt_AS_LONG(v);
1394 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001395 switch (oparg) {
1396 case LT: res = a < b; break;
1397 case LE: res = a <= b; break;
1398 case EQ: res = a == b; break;
1399 case NE: res = a != b; break;
1400 case GT: res = a > b; break;
1401 case GE: res = a >= b; break;
1402 case IS: res = v == w; break;
1403 case IS_NOT: res = v != w; break;
1404 default: goto slow_compare;
1405 }
1406 x = res ? Py_True : Py_False;
1407 Py_INCREF(x);
1408 }
1409 else {
1410 slow_compare:
1411 x = cmp_outcome(oparg, v, w);
1412 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001413 Py_DECREF(v);
1414 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001415 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001416 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001417 break;
1418
1419 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001420 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001421 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001422 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001423 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001424 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001425 break;
1426 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001427 u = find_from_args(f, INSTR_OFFSET());
1428 if (u == NULL) {
1429 x = u;
1430 break;
Guido van Rossum24c13741995-02-14 09:42:43 +00001431 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001432 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001433 w,
1434 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001435 f->f_locals == NULL ?
1436 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001437 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001438 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001439 if (w == NULL) {
1440 x = NULL;
1441 break;
1442 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001443 x = PyEval_CallObject(x, w);
1444 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001445 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001446 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001447 break;
1448
1449 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001450 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001451 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001452 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001453 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001454 PyErr_SetString(PyExc_SystemError,
1455 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001456 break;
1457 }
1458 err = import_from(x, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001459 PyFrame_LocalsToFast(f, 0);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001460 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001461 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001462
Guido van Rossum374a9221991-04-04 10:40:29 +00001463 case JUMP_FORWARD:
1464 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001465 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001466
1467 case JUMP_IF_FALSE:
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;
1471 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001472 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001473 else
1474 break;
1475 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001476
1477 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001478 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001479 if (err > 0) {
1480 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001481 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001482 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001483 else if (err == 0)
1484 ;
1485 else
1486 break;
1487 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001488
1489 case JUMP_ABSOLUTE:
1490 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001491 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001492
1493 case FOR_LOOP:
1494 /* for v in s: ...
1495 On entry: stack contains s, i.
1496 On exit: stack contains s, i+1, s[i];
1497 but if loop exhausted:
1498 s, i are popped, and we jump */
1499 w = POP(); /* Loop index */
1500 v = POP(); /* Sequence object */
1501 u = loop_subscript(v, w);
1502 if (u != NULL) {
1503 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001504 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001505 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001506 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001507 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001508 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001509 }
1510 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001511 Py_DECREF(v);
1512 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001513 /* A NULL can mean "s exhausted"
1514 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001515 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001516 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001517 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001518 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001519 continue;
1520 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001521 }
1522 break;
1523
1524 case SETUP_LOOP:
1525 case SETUP_EXCEPT:
1526 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001527 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Guido van Rossum374a9221991-04-04 10:40:29 +00001528 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001529 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001530
1531 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001532#ifdef LLTRACE
1533 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001534 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001535#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001536 f->f_lineno = oparg;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001537 if (f->f_trace == NULL)
1538 continue;
1539 /* Trace each line of code reached */
1540 f->f_lasti = INSTR_OFFSET();
1541 err = call_trace(&f->f_trace, &f->f_trace,
Guido van Rossumb209a111997-04-29 18:18:01 +00001542 f, "line", Py_None);
Guido van Rossum374a9221991-04-04 10:40:29 +00001543 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001544
1545 case CALL_FUNCTION:
1546 {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001547 int na = oparg & 0xff;
1548 int nk = (oparg>>8) & 0xff;
1549 int n = na + 2*nk;
Guido van Rossumb209a111997-04-29 18:18:01 +00001550 PyObject **pfunc = stack_pointer - n - 1;
1551 PyObject *func = *pfunc;
1552 PyObject *self = NULL;
1553 PyObject *class = NULL;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001554 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Guido van Rossumb209a111997-04-29 18:18:01 +00001555 if (PyMethod_Check(func)) {
1556 self = PyMethod_Self(func);
1557 class = PyMethod_Class(func);
1558 func = PyMethod_Function(func);
1559 Py_INCREF(func);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001560 if (self != NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001561 Py_INCREF(self);
1562 Py_DECREF(*pfunc);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001563 *pfunc = self;
1564 na++;
1565 n++;
1566 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001567 else {
1568 /* Unbound methods must be
1569 called with an instance of
1570 the class (or a derived
1571 class) as first argument */
1572 if (na > 0 &&
1573 (self = stack_pointer[-n])
1574 != NULL &&
Guido van Rossumb209a111997-04-29 18:18:01 +00001575 PyInstance_Check(self) &&
1576 PyClass_IsSubclass(
1577 (PyObject *)
1578 (((PyInstanceObject *)self)
Guido van Rossum681d79a1995-07-18 14:51:37 +00001579 ->in_class),
1580 class))
1581 /* Handy-dandy */ ;
1582 else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001583 PyErr_SetString(
1584 PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001585 "unbound method must be called with class instance 1st argument");
Guido van Rossum72b56e81995-12-10 04:57:42 +00001586 x = NULL;
1587 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001588 }
1589 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001590 }
1591 else
Guido van Rossumb209a111997-04-29 18:18:01 +00001592 Py_INCREF(func);
1593 if (PyFunction_Check(func)) {
1594 PyObject *co = PyFunction_GetCode(func);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001595 PyObject *globals =
1596 PyFunction_GetGlobals(func);
1597 PyObject *argdefs =
1598 PyFunction_GetDefaults(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00001599 PyObject **d;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001600 int nd;
1601 if (argdefs != NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001602 d = &PyTuple_GET_ITEM(argdefs, 0);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001603 nd = ((PyTupleObject *)argdefs) ->
1604 ob_size;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001605 }
1606 else {
1607 d = NULL;
1608 nd = 0;
1609 }
1610 x = eval_code2(
Guido van Rossumb209a111997-04-29 18:18:01 +00001611 (PyCodeObject *)co,
1612 globals, (PyObject *)NULL,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001613 stack_pointer-n, na,
1614 stack_pointer-2*nk, nk,
1615 d, nd,
1616 class);
1617 }
1618 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001619 PyObject *args = PyTuple_New(na);
1620 PyObject *kwdict = NULL;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001621 if (args == NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001622 x = NULL;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001623 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001624 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001625 if (nk > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001626 kwdict = PyDict_New();
Guido van Rossumff8b4941995-07-26 18:16:42 +00001627 if (kwdict == NULL) {
1628 x = NULL;
1629 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001630 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001631 err = 0;
1632 while (--nk >= 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001633 PyObject *value = POP();
1634 PyObject *key = POP();
1635 err = PyDict_SetItem(
Guido van Rossumff8b4941995-07-26 18:16:42 +00001636 kwdict, key, value);
Guido van Rossumb209a111997-04-29 18:18:01 +00001637 Py_DECREF(key);
1638 Py_DECREF(value);
Guido van Rossumd0eb4291997-01-27 21:30:09 +00001639 if (err)
Guido van Rossumff8b4941995-07-26 18:16:42 +00001640 break;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001641 }
1642 if (err) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001643 Py_DECREF(args);
1644 Py_DECREF(kwdict);
Guido van Rossumff8b4941995-07-26 18:16:42 +00001645 break;
1646 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001647 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001648 while (--na >= 0) {
1649 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001650 PyTuple_SET_ITEM(args, na, w);
Guido van Rossumff8b4941995-07-26 18:16:42 +00001651 }
1652 x = PyEval_CallObjectWithKeywords(
1653 func, args, kwdict);
Guido van Rossumb209a111997-04-29 18:18:01 +00001654 Py_DECREF(args);
1655 Py_XDECREF(kwdict);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001656 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001657 Py_DECREF(func);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001658 while (stack_pointer > pfunc) {
1659 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001660 Py_DECREF(w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001661 }
1662 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001663 if (x != NULL) continue;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001664 break;
1665 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001666
Guido van Rossum681d79a1995-07-18 14:51:37 +00001667 case MAKE_FUNCTION:
1668 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00001669 x = PyFunction_New(v, f->f_globals);
1670 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001671 /* XXX Maybe this should be a separate opcode? */
1672 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001673 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001674 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001675 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001676 x = NULL;
1677 break;
1678 }
1679 while (--oparg >= 0) {
1680 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001681 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001682 }
1683 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001684 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001685 }
1686 PUSH(x);
1687 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001688
1689 case BUILD_SLICE:
1690 if (oparg == 3)
1691 w = POP();
1692 else
1693 w = NULL;
1694 v = POP();
1695 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00001696 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001697 Py_DECREF(u);
1698 Py_DECREF(v);
1699 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00001700 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001701 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00001702 break;
1703
1704
Guido van Rossum374a9221991-04-04 10:40:29 +00001705 default:
1706 fprintf(stderr,
1707 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001708 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00001709 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00001710 why = WHY_EXCEPTION;
1711 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001712
1713#ifdef CASE_TOO_BIG
1714 }
1715#endif
1716
Guido van Rossum374a9221991-04-04 10:40:29 +00001717 } /* switch */
1718
1719 on_error:
1720
1721 /* Quickly continue if no error occurred */
1722
1723 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001724 if (err == 0 && x != NULL) {
1725#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00001726 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00001727 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00001728 fprintf(stderr,
1729 "XXX undetected error\n");
1730 else
1731#endif
1732 continue; /* Normal, fast path */
1733 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001734 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00001735 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00001736 err = 0;
1737 }
1738
Guido van Rossum374a9221991-04-04 10:40:29 +00001739 /* Double-check exception status */
1740
1741 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001742 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001743 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00001744 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00001745 why = WHY_EXCEPTION;
1746 }
1747 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00001748#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001749 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00001750 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00001751 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001752 fprintf(stderr,
1753 "XXX undetected error (why=%d)\n",
1754 why);
1755 why = WHY_EXCEPTION;
1756 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001757 }
1758#endif
1759
1760 /* Log traceback info if this is a real exception */
1761
1762 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001763 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001764 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001765 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00001766 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001767
Guido van Rossume59214e1994-08-30 08:01:59 +00001768 if (f->f_trace)
1769 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001770 if (tstate->sys_profilefunc)
1771 call_exc_trace(&tstate->sys_profilefunc,
1772 (PyObject**)0, f);
Guido van Rossum014518f1998-11-23 21:09:51 +00001773 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001774
1775 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1776
1777 if (why == WHY_RERAISE)
1778 why = WHY_EXCEPTION;
1779
1780 /* Unwind stacks if a (pseudo) exception occurred */
1781
1782 while (why != WHY_NOT && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001783 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001784 while (STACK_LEVEL() > b->b_level) {
1785 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001786 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001787 }
1788 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1789 why = WHY_NOT;
1790 JUMPTO(b->b_handler);
1791 break;
1792 }
1793 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00001794 (b->b_type == SETUP_EXCEPT &&
1795 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001796 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001797 PyObject *exc, *val, *tb;
1798 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001799 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001800 val = Py_None;
1801 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00001802 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001803 /* Make the raw exception data
1804 available to the handler,
1805 so a program can emulate the
1806 Python main loop. Don't do
1807 this for 'finally'. */
1808 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00001809 PyErr_NormalizeException(
1810 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001811 set_exc_info(tstate,
1812 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001813 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001814 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001815 PUSH(val);
1816 PUSH(exc);
1817 }
1818 else {
1819 if (why == WHY_RETURN)
1820 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00001821 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00001822 PUSH(v);
1823 }
1824 why = WHY_NOT;
1825 JUMPTO(b->b_handler);
1826 break;
1827 }
1828 } /* unwind stack */
1829
1830 /* End the loop if we still have an error (or return) */
1831
1832 if (why != WHY_NOT)
1833 break;
1834
1835 } /* main loop */
1836
1837 /* Pop remaining stack entries */
1838
1839 while (!EMPTY()) {
1840 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001841 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001842 }
1843
Guido van Rossum96a42c81992-01-12 02:29:51 +00001844 if (why != WHY_RETURN)
1845 retval = NULL;
1846
Guido van Rossume59214e1994-08-30 08:01:59 +00001847 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001848 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001849 if (call_trace(&f->f_trace, &f->f_trace, f,
1850 "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001851 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001852 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001853 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001854 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001855 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001856 }
1857
Guido van Rossuma027efa1997-05-05 20:56:21 +00001858 if (tstate->sys_profilefunc && why == WHY_RETURN) {
1859 if (call_trace(&tstate->sys_profilefunc, (PyObject**)0,
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001860 f, "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001861 Py_XDECREF(retval);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001862 retval = NULL;
1863 why = WHY_EXCEPTION;
1864 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001865 }
Guido van Rossuma4240131997-01-21 21:18:36 +00001866
Guido van Rossuma027efa1997-05-05 20:56:21 +00001867 reset_exc_info(tstate);
1868
1869 --tstate->recursion_depth;
Guido van Rossum8c5df061997-01-24 04:19:24 +00001870
1871 fail: /* Jump here from prelude on failure */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001872
Guido van Rossum374a9221991-04-04 10:40:29 +00001873 /* Restore previous frame and release the current one */
Guido van Rossum681d79a1995-07-18 14:51:37 +00001874
Guido van Rossuma027efa1997-05-05 20:56:21 +00001875 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +00001876 Py_DECREF(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001877
Guido van Rossum96a42c81992-01-12 02:29:51 +00001878 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001879}
1880
Guido van Rossuma027efa1997-05-05 20:56:21 +00001881static void
1882set_exc_info(tstate, type, value, tb)
1883 PyThreadState *tstate;
1884 PyObject *type;
1885 PyObject *value;
1886 PyObject *tb;
1887{
1888 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001889 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00001890
Guido van Rossuma027efa1997-05-05 20:56:21 +00001891 frame = tstate->frame;
1892 if (frame->f_exc_type == NULL) {
1893 /* This frame didn't catch an exception before */
1894 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00001895 if (tstate->exc_type == NULL) {
1896 Py_INCREF(Py_None);
1897 tstate->exc_type = Py_None;
1898 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001899 tmp_type = frame->f_exc_type;
1900 tmp_value = frame->f_exc_value;
1901 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001902 Py_XINCREF(tstate->exc_type);
1903 Py_XINCREF(tstate->exc_value);
1904 Py_XINCREF(tstate->exc_traceback);
1905 frame->f_exc_type = tstate->exc_type;
1906 frame->f_exc_value = tstate->exc_value;
1907 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001908 Py_XDECREF(tmp_type);
1909 Py_XDECREF(tmp_value);
1910 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001911 }
1912 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001913 tmp_type = tstate->exc_type;
1914 tmp_value = tstate->exc_value;
1915 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001916 Py_XINCREF(type);
1917 Py_XINCREF(value);
1918 Py_XINCREF(tb);
1919 tstate->exc_type = type;
1920 tstate->exc_value = value;
1921 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001922 Py_XDECREF(tmp_type);
1923 Py_XDECREF(tmp_value);
1924 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001925 /* For b/w compatibility */
1926 PySys_SetObject("exc_type", type);
1927 PySys_SetObject("exc_value", value);
1928 PySys_SetObject("exc_traceback", tb);
1929}
1930
1931static void
1932reset_exc_info(tstate)
1933 PyThreadState *tstate;
1934{
1935 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001936 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001937 frame = tstate->frame;
1938 if (frame->f_exc_type != NULL) {
1939 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001940 tmp_type = tstate->exc_type;
1941 tmp_value = tstate->exc_value;
1942 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001943 Py_XINCREF(frame->f_exc_type);
1944 Py_XINCREF(frame->f_exc_value);
1945 Py_XINCREF(frame->f_exc_traceback);
1946 tstate->exc_type = frame->f_exc_type;
1947 tstate->exc_value = frame->f_exc_value;
1948 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001949 Py_XDECREF(tmp_type);
1950 Py_XDECREF(tmp_value);
1951 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001952 /* For b/w compatibility */
1953 PySys_SetObject("exc_type", frame->f_exc_type);
1954 PySys_SetObject("exc_value", frame->f_exc_value);
1955 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
1956 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001957 tmp_type = frame->f_exc_type;
1958 tmp_value = frame->f_exc_value;
1959 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001960 frame->f_exc_type = NULL;
1961 frame->f_exc_value = NULL;
1962 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001963 Py_XDECREF(tmp_type);
1964 Py_XDECREF(tmp_value);
1965 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001966}
1967
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001968/* Logic for the raise statement (too complicated for inlining).
1969 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00001970static enum why_code
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001971do_raise(type, value, tb)
Guido van Rossumb209a111997-04-29 18:18:01 +00001972 PyObject *type, *value, *tb;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001973{
Guido van Rossumd295f121998-04-09 21:39:57 +00001974 if (type == NULL) {
1975 /* Reraise */
1976 PyThreadState *tstate = PyThreadState_Get();
1977 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
1978 value = tstate->exc_value;
1979 tb = tstate->exc_traceback;
1980 Py_XINCREF(type);
1981 Py_XINCREF(value);
1982 Py_XINCREF(tb);
1983 }
1984
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001985 /* We support the following forms of raise:
1986 raise <class>, <classinstance>
1987 raise <class>, <argument tuple>
1988 raise <class>, None
1989 raise <class>, <argument>
1990 raise <classinstance>, None
1991 raise <string>, <object>
1992 raise <string>, None
1993
1994 An omitted second argument is the same as None.
1995
1996 In addition, raise <tuple>, <anything> is the same as
1997 raising the tuple's first item (and it better have one!);
1998 this rule is applied recursively.
1999
2000 Finally, an optional third argument can be supplied, which
2001 gives the traceback to be substituted (useful when
2002 re-raising an exception after examining it). */
2003
2004 /* First, check the traceback argument, replacing None with
2005 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002006 if (tb == Py_None) {
2007 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002008 tb = NULL;
2009 }
2010 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002011 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002012 "raise 3rd arg must be traceback or None");
2013 goto raise_error;
2014 }
2015
2016 /* Next, replace a missing value with None */
2017 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002018 value = Py_None;
2019 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002020 }
2021
2022 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002023 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2024 PyObject *tmp = type;
2025 type = PyTuple_GET_ITEM(type, 0);
2026 Py_INCREF(type);
2027 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002028 }
2029
Barry Warsaw4249f541997-08-22 21:26:19 +00002030 if (PyString_Check(type))
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002031 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002032
2033 else if (PyClass_Check(type))
2034 PyErr_NormalizeException(&type, &value, &tb);
2035
Guido van Rossumb209a111997-04-29 18:18:01 +00002036 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002037 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002038 if (value != Py_None) {
2039 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002040 "instance exception may not have a separate value");
2041 goto raise_error;
2042 }
2043 else {
2044 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002045 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002046 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002047 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2048 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002049 }
2050 }
2051 else {
2052 /* Not something you can raise. You get an exception
2053 anyway, just not what you specified :-) */
Guido van Rossumb209a111997-04-29 18:18:01 +00002054 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002055 "exceptions must be strings, classes, or instances");
2056 goto raise_error;
2057 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002058 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002059 if (tb == NULL)
2060 return WHY_EXCEPTION;
2061 else
2062 return WHY_RERAISE;
2063 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002064 Py_XDECREF(value);
2065 Py_XDECREF(type);
2066 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002067 return WHY_EXCEPTION;
2068}
2069
Barry Warsawe42b18f1997-08-25 22:13:04 +00002070static int
2071unpack_sequence(v, argcnt, sp)
2072 PyObject *v;
2073 int argcnt;
2074 PyObject **sp;
2075{
2076 int i;
2077 PyObject *w;
2078
2079 for (i = 0; i < argcnt; i++) {
2080 if (! (w = PySequence_GetItem(v, i))) {
2081 if (PyErr_ExceptionMatches(PyExc_IndexError))
2082 PyErr_SetString(PyExc_ValueError,
2083 "unpack sequence of wrong size");
2084 goto finally;
2085 }
2086 *--sp = w;
2087 }
2088 /* we better get an IndexError now */
2089 if (PySequence_GetItem(v, i) == NULL) {
2090 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
2091 PyErr_Clear();
2092 return 1;
2093 }
2094 /* some other exception occurred. fall through to finally */
2095 }
2096 else
2097 PyErr_SetString(PyExc_ValueError,
2098 "unpack sequence of wrong size");
2099 /* fall through */
2100finally:
Barry Warsaw91010551997-08-25 22:30:51 +00002101 for (; i > 0; i--, sp++)
2102 Py_DECREF(*sp);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002103
2104 return 0;
2105}
2106
2107
Guido van Rossum96a42c81992-01-12 02:29:51 +00002108#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002109static int
2110prtrace(v, str)
Guido van Rossumb209a111997-04-29 18:18:01 +00002111 PyObject *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002112 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002113{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002114 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002115 if (PyObject_Print(v, stdout, 0) != 0)
2116 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002117 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002118}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002119#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002120
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002121static void
2122call_exc_trace(p_trace, p_newtrace, f)
Guido van Rossumb209a111997-04-29 18:18:01 +00002123 PyObject **p_trace, **p_newtrace;
2124 PyFrameObject *f;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002125{
Guido van Rossumb209a111997-04-29 18:18:01 +00002126 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002127 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002128 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002129 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002130 value = Py_None;
2131 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002132 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002133 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002134 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002135 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002136 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002137 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002138 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002139 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002140 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002141 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002142 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002143 Py_XDECREF(type);
2144 Py_XDECREF(value);
2145 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002146 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002147}
2148
2149static int
2150call_trace(p_trace, p_newtrace, f, msg, arg)
Guido van Rossumb209a111997-04-29 18:18:01 +00002151 PyObject **p_trace; /* in/out; may not be NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002152 may not point to NULL variable initially */
Guido van Rossumb209a111997-04-29 18:18:01 +00002153 PyObject **p_newtrace; /* in/out; may be NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002154 may point to NULL variable;
2155 may be same variable as p_newtrace */
Guido van Rossumb209a111997-04-29 18:18:01 +00002156 PyFrameObject *f;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002157 char *msg;
Guido van Rossumb209a111997-04-29 18:18:01 +00002158 PyObject *arg;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002159{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002160 PyThreadState *tstate = f->f_tstate;
Guido van Rossumb209a111997-04-29 18:18:01 +00002161 PyObject *args, *what;
2162 PyObject *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002163
Guido van Rossuma027efa1997-05-05 20:56:21 +00002164 if (tstate->tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002165 /* Don't do recursive traces */
2166 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002167 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002168 *p_newtrace = NULL;
2169 }
2170 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002171 }
2172
Guido van Rossumb209a111997-04-29 18:18:01 +00002173 args = PyTuple_New(3);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002174 if (args == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002175 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002176 what = PyString_FromString(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002177 if (what == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002178 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002179 Py_INCREF(f);
2180 PyTuple_SET_ITEM(args, 0, (PyObject *)f);
2181 PyTuple_SET_ITEM(args, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002182 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002183 arg = Py_None;
2184 Py_INCREF(arg);
2185 PyTuple_SET_ITEM(args, 2, arg);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002186 tstate->tracing++;
Guido van Rossumb209a111997-04-29 18:18:01 +00002187 PyFrame_FastToLocals(f);
2188 res = PyEval_CallObject(*p_trace, args); /* May clear *p_trace! */
2189 PyFrame_LocalsToFast(f, 1);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002190 tstate->tracing--;
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002191 cleanup:
Guido van Rossumb209a111997-04-29 18:18:01 +00002192 Py_XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002193 if (res == NULL) {
2194 /* The trace proc raised an exception */
Guido van Rossumb209a111997-04-29 18:18:01 +00002195 PyTraceBack_Here(f);
2196 Py_XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002197 *p_trace = NULL;
2198 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002199 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002200 *p_newtrace = NULL;
2201 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002202 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002203 }
2204 else {
2205 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002206 Py_XDECREF(*p_newtrace);
2207 if (res == Py_None)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002208 *p_newtrace = NULL;
2209 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002210 Py_INCREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002211 *p_newtrace = res;
2212 }
2213 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002214 Py_DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002215 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002216 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002217}
2218
Guido van Rossumb209a111997-04-29 18:18:01 +00002219PyObject *
2220PyEval_GetBuiltins()
Guido van Rossum6135a871995-01-09 17:53:26 +00002221{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002222 PyThreadState *tstate = PyThreadState_Get();
2223 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002224 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002225 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002226 else
2227 return current_frame->f_builtins;
2228}
2229
Guido van Rossumb209a111997-04-29 18:18:01 +00002230PyObject *
2231PyEval_GetLocals()
Guido van Rossum5b722181993-03-30 17:46:03 +00002232{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002233 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002234 if (current_frame == NULL)
2235 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002236 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002237 return current_frame->f_locals;
2238}
2239
Guido van Rossumb209a111997-04-29 18:18:01 +00002240PyObject *
2241PyEval_GetGlobals()
Guido van Rossum3f5da241990-12-20 15:06:42 +00002242{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002243 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002244 if (current_frame == NULL)
2245 return NULL;
2246 else
2247 return current_frame->f_globals;
2248}
2249
Guido van Rossumb209a111997-04-29 18:18:01 +00002250PyObject *
2251PyEval_GetFrame()
Guido van Rossume59214e1994-08-30 08:01:59 +00002252{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002253 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002254 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002255}
2256
Guido van Rossum6135a871995-01-09 17:53:26 +00002257int
Guido van Rossumb209a111997-04-29 18:18:01 +00002258PyEval_GetRestricted()
Guido van Rossum6135a871995-01-09 17:53:26 +00002259{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002260 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002261 return current_frame == NULL ? 0 : current_frame->f_restricted;
2262}
2263
Guido van Rossumbe270261997-05-22 22:26:18 +00002264int
Guido van Rossumb209a111997-04-29 18:18:01 +00002265Py_FlushLine()
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002266{
Guido van Rossumb209a111997-04-29 18:18:01 +00002267 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002268 if (f == NULL)
2269 return 0;
2270 if (!PyFile_SoftSpace(f, 0))
2271 return 0;
2272 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002273}
2274
Guido van Rossum3f5da241990-12-20 15:06:42 +00002275
Guido van Rossum681d79a1995-07-18 14:51:37 +00002276/* External interface to call any callable object.
2277 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002278
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002279#undef PyEval_CallObject
2280/* for backward compatibility: export this interface */
2281
Guido van Rossumb209a111997-04-29 18:18:01 +00002282PyObject *
2283PyEval_CallObject(func, arg)
2284 PyObject *func;
2285 PyObject *arg;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002286{
Guido van Rossumb209a111997-04-29 18:18:01 +00002287 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002288}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002289#define PyEval_CallObject(func,arg) \
2290 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00002291
Guido van Rossumb209a111997-04-29 18:18:01 +00002292PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002293PyEval_CallObjectWithKeywords(func, arg, kw)
Guido van Rossumb209a111997-04-29 18:18:01 +00002294 PyObject *func;
2295 PyObject *arg;
2296 PyObject *kw;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002297{
2298 ternaryfunc call;
Guido van Rossumb209a111997-04-29 18:18:01 +00002299 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002300
2301 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002302 arg = PyTuple_New(0);
2303 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002304 PyErr_SetString(PyExc_TypeError,
2305 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002306 return NULL;
2307 }
2308 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002309 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002310
Guido van Rossumb209a111997-04-29 18:18:01 +00002311 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002312 PyErr_SetString(PyExc_TypeError,
2313 "keyword list must be a dictionary");
Guido van Rossume3e61c11995-08-04 04:14:47 +00002314 return NULL;
2315 }
2316
Guido van Rossum150b2df1996-12-05 23:17:11 +00002317 if ((call = func->ob_type->tp_call) != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002318 result = (*call)(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002319 else if (PyMethod_Check(func) || PyFunction_Check(func))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002320 result = call_function(func, arg, kw);
2321 else
2322 result = call_builtin(func, arg, kw);
2323
Guido van Rossumb209a111997-04-29 18:18:01 +00002324 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002325
Guido van Rossumb209a111997-04-29 18:18:01 +00002326 if (result == NULL && !PyErr_Occurred())
2327 PyErr_SetString(PyExc_SystemError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002328 "NULL result without error in call_object");
Guido van Rossume59214e1994-08-30 08:01:59 +00002329
2330 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002331}
2332
Guido van Rossumb209a111997-04-29 18:18:01 +00002333static PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002334call_builtin(func, arg, kw)
Guido van Rossumb209a111997-04-29 18:18:01 +00002335 PyObject *func;
2336 PyObject *arg;
2337 PyObject *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002338{
Guido van Rossumb209a111997-04-29 18:18:01 +00002339 if (PyCFunction_Check(func)) {
2340 PyCFunction meth = PyCFunction_GetFunction(func);
2341 PyObject *self = PyCFunction_GetSelf(func);
2342 int flags = PyCFunction_GetFlags(func);
Guido van Rossumff8b4941995-07-26 18:16:42 +00002343 if (!(flags & METH_VARARGS)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002344 int size = PyTuple_Size(arg);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002345 if (size == 1)
Guido van Rossumb209a111997-04-29 18:18:01 +00002346 arg = PyTuple_GET_ITEM(arg, 0);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002347 else if (size == 0)
2348 arg = NULL;
2349 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002350 if (flags & METH_KEYWORDS)
2351 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002352 if (kw != NULL && PyDict_Size(kw) != 0) {
2353 PyErr_SetString(PyExc_TypeError,
Guido van Rossumff8b4941995-07-26 18:16:42 +00002354 "this function takes no keyword arguments");
2355 return NULL;
2356 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002357 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002358 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002359 if (PyClass_Check(func)) {
2360 return PyInstance_New(func, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002361 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002362 if (PyInstance_Check(func)) {
2363 PyObject *res, *call = PyObject_GetAttrString(func,"__call__");
Guido van Rossume59214e1994-08-30 08:01:59 +00002364 if (call == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002365 PyErr_Clear();
2366 PyErr_SetString(PyExc_AttributeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002367 "no __call__ method defined");
Guido van Rossume59214e1994-08-30 08:01:59 +00002368 return NULL;
2369 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002370 res = PyEval_CallObjectWithKeywords(call, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002371 Py_DECREF(call);
Guido van Rossume59214e1994-08-30 08:01:59 +00002372 return res;
2373 }
Guido van Rossum2d1ad391998-08-25 18:16:54 +00002374 PyErr_Format(PyExc_TypeError, "call of non-function (type %s)",
2375 func->ob_type->tp_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002376 return NULL;
2377}
2378
Guido van Rossumb209a111997-04-29 18:18:01 +00002379static PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002380call_function(func, arg, kw)
Guido van Rossumb209a111997-04-29 18:18:01 +00002381 PyObject *func;
2382 PyObject *arg;
2383 PyObject *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002384{
Guido van Rossumb209a111997-04-29 18:18:01 +00002385 PyObject *class = NULL; /* == owner */
2386 PyObject *argdefs;
2387 PyObject **d, **k;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002388 int nk, nd;
Guido van Rossumb209a111997-04-29 18:18:01 +00002389 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002390
Guido van Rossumb209a111997-04-29 18:18:01 +00002391 if (kw != NULL && !PyDict_Check(kw)) {
2392 PyErr_BadInternalCall();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002393 return NULL;
2394 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002395
Guido van Rossumb209a111997-04-29 18:18:01 +00002396 if (PyMethod_Check(func)) {
2397 PyObject *self = PyMethod_Self(func);
2398 class = PyMethod_Class(func);
2399 func = PyMethod_Function(func);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002400 if (self == NULL) {
2401 /* Unbound methods must be called with an instance of
2402 the class (or a derived class) as first argument */
Guido van Rossumb209a111997-04-29 18:18:01 +00002403 if (PyTuple_Size(arg) >= 1) {
2404 self = PyTuple_GET_ITEM(arg, 0);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002405 if (self != NULL &&
Guido van Rossumb209a111997-04-29 18:18:01 +00002406 PyInstance_Check(self) &&
2407 PyClass_IsSubclass((PyObject *)
2408 (((PyInstanceObject *)self)->in_class),
Guido van Rossumb3f72581993-05-21 19:56:10 +00002409 class))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002410 /* Handy-dandy */ ;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002411 else
2412 self = NULL;
2413 }
2414 if (self == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002415 PyErr_SetString(PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002416 "unbound method must be called with class instance 1st argument");
Guido van Rossumb3f72581993-05-21 19:56:10 +00002417 return NULL;
2418 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002419 Py_INCREF(arg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002420 }
2421 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002422 int argcount = PyTuple_Size(arg);
2423 PyObject *newarg = PyTuple_New(argcount + 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002424 int i;
Guido van Rossum81daa321993-05-20 14:24:46 +00002425 if (newarg == NULL)
2426 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002427 Py_INCREF(self);
2428 PyTuple_SET_ITEM(newarg, 0, self);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002429 for (i = 0; i < argcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002430 PyObject *v = PyTuple_GET_ITEM(arg, i);
2431 Py_XINCREF(v);
2432 PyTuple_SET_ITEM(newarg, i+1, v);
Guido van Rossum81daa321993-05-20 14:24:46 +00002433 }
2434 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002435 }
Guido van Rossum7859f871998-07-08 14:58:16 +00002436 if (!PyFunction_Check(func)) {
2437 result = PyEval_CallObjectWithKeywords(func, arg, kw);
2438 Py_DECREF(arg);
2439 return result;
2440 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002441 }
2442 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002443 if (!PyFunction_Check(func)) {
Guido van Rossum2d1ad391998-08-25 18:16:54 +00002444 PyErr_Format(PyExc_TypeError,
2445 "call of non-function (type %s)",
2446 func->ob_type->tp_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002447 return NULL;
2448 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002449 Py_INCREF(arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002450 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002451
2452 argdefs = PyFunction_GetDefaults(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00002453 if (argdefs != NULL && PyTuple_Check(argdefs)) {
2454 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
2455 nd = PyTuple_Size(argdefs);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002456 }
2457 else {
2458 d = NULL;
2459 nd = 0;
2460 }
2461
2462 if (kw != NULL) {
2463 int pos, i;
Guido van Rossumb209a111997-04-29 18:18:01 +00002464 nk = PyDict_Size(kw);
2465 k = PyMem_NEW(PyObject *, 2*nk);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002466 if (k == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002467 PyErr_NoMemory();
2468 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002469 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00002470 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002471 pos = i = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00002472 while (PyDict_Next(kw, &pos, &k[i], &k[i+1]))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002473 i += 2;
2474 nk = i/2;
2475 /* XXX This is broken if the caller deletes dict items! */
2476 }
2477 else {
2478 k = NULL;
2479 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00002480 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002481
Guido van Rossum681d79a1995-07-18 14:51:37 +00002482 result = eval_code2(
Guido van Rossumb209a111997-04-29 18:18:01 +00002483 (PyCodeObject *)PyFunction_GetCode(func),
2484 PyFunction_GetGlobals(func), (PyObject *)NULL,
2485 &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg),
Guido van Rossum681d79a1995-07-18 14:51:37 +00002486 k, nk,
2487 d, nd,
2488 class);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002489
Guido van Rossumb209a111997-04-29 18:18:01 +00002490 Py_DECREF(arg);
2491 PyMem_XDEL(k);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002492
Guido van Rossum681d79a1995-07-18 14:51:37 +00002493 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002494}
2495
Guido van Rossum3b9c6671996-07-30 18:40:29 +00002496#define SLICE_ERROR_MSG \
2497 "standard sequence type does not support step size other than one"
2498
Guido van Rossumb209a111997-04-29 18:18:01 +00002499static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002500loop_subscript(v, w)
Guido van Rossumb209a111997-04-29 18:18:01 +00002501 PyObject *v, *w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002502{
Guido van Rossumb209a111997-04-29 18:18:01 +00002503 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00002504 int i;
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00002505 if (sq == NULL || sq->sq_item == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002506 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002507 return NULL;
2508 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002509 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00002510 v = (*sq->sq_item)(v, i);
2511 if (v)
2512 return v;
Barry Warsaw4249f541997-08-22 21:26:19 +00002513 if (PyErr_ExceptionMatches(PyExc_IndexError))
Guido van Rossumb209a111997-04-29 18:18:01 +00002514 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00002515 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002516}
2517
2518static int
Guido van Rossuma027efa1997-05-05 20:56:21 +00002519slice_index(v, pi)
Guido van Rossumb209a111997-04-29 18:18:01 +00002520 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002521 int *pi;
2522{
2523 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002524 long x;
Guido van Rossumb209a111997-04-29 18:18:01 +00002525 if (!PyInt_Check(v)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002526 PyErr_SetString(PyExc_TypeError,
2527 "slice index must be int");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002528 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002529 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00002530 x = PyInt_AsLong(v);
2531 /* Truncate -- very long indices are truncated anyway */
2532 if (x > INT_MAX)
2533 x = INT_MAX;
2534 else if (x < -INT_MAX)
2535 x = 0;
2536 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002537 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002538 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002539}
2540
Guido van Rossumb209a111997-04-29 18:18:01 +00002541static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002542apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00002543 PyObject *u, *v, *w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002544{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002545 int ilow = 0, ihigh = INT_MAX;
2546 if (slice_index(v, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002547 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002548 if (slice_index(w, &ihigh) != 0)
Guido van Rossum04691fc1992-08-12 15:35:34 +00002549 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002550 return PySequence_GetSlice(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002551}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002552
2553static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00002554assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossumb209a111997-04-29 18:18:01 +00002555 PyObject *u, *v, *w, *x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002556{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002557 int ilow = 0, ihigh = INT_MAX;
2558 if (slice_index(v, &ilow) != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002559 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002560 if (slice_index(w, &ihigh) != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002561 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002562 if (x == NULL)
2563 return PySequence_DelSlice(u, ilow, ihigh);
2564 else
2565 return PySequence_SetSlice(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002566}
2567
Guido van Rossumb209a111997-04-29 18:18:01 +00002568static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002569cmp_outcome(op, v, w)
Guido van Rossum5b7313a1992-04-06 13:24:57 +00002570 int op;
Guido van Rossumb209a111997-04-29 18:18:01 +00002571 register PyObject *v;
2572 register PyObject *w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002573{
2574 register int cmp;
2575 register int res = 0;
2576 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002577 case IS:
2578 case IS_NOT:
2579 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002580 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002581 res = !res;
2582 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002583 case IN:
2584 case NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00002585 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002586 if (res < 0)
2587 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002588 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002589 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002590 break;
2591 case EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00002592 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002593 break;
2594 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00002595 cmp = PyObject_Compare(v, w);
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002596 if (cmp && PyErr_Occurred())
2597 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002598 switch (op) {
2599 case LT: res = cmp < 0; break;
2600 case LE: res = cmp <= 0; break;
2601 case EQ: res = cmp == 0; break;
2602 case NE: res = cmp != 0; break;
2603 case GT: res = cmp > 0; break;
2604 case GE: res = cmp >= 0; break;
2605 /* XXX no default? (res is initialized to 0 though) */
2606 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002607 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002608 v = res ? Py_True : Py_False;
2609 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002610 return v;
2611}
2612
Guido van Rossum3f5da241990-12-20 15:06:42 +00002613static int
2614import_from(locals, v, name)
Guido van Rossumb209a111997-04-29 18:18:01 +00002615 PyObject *locals;
2616 PyObject *v;
2617 PyObject *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002618{
Guido van Rossumb209a111997-04-29 18:18:01 +00002619 PyObject *w, *x;
2620 if (!PyModule_Check(v)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002621 PyErr_SetString(PyExc_TypeError,
2622 "import-from requires module object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002623 return -1;
2624 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002625 w = PyModule_GetDict(v);
2626 if (PyString_AsString(name)[0] == '*') {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002627 int pos, err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002628 PyObject *name, *value;
Guido van Rossum25831651993-05-19 14:50:45 +00002629 pos = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00002630 while (PyDict_Next(w, &pos, &name, &value)) {
2631 if (!PyString_Check(name) ||
2632 PyString_AsString(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002633 continue;
Guido van Rossumb209a111997-04-29 18:18:01 +00002634 Py_INCREF(value);
2635 err = PyDict_SetItem(locals, name, value);
2636 Py_DECREF(value);
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002637 if (err != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002638 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002639 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002640 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002641 }
2642 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002643 x = PyDict_GetItem(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002644 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00002645 char buf[250];
Guido van Rossum16dfd291992-02-05 11:17:30 +00002646 sprintf(buf, "cannot import name %.230s",
Guido van Rossumb209a111997-04-29 18:18:01 +00002647 PyString_AsString(name));
2648 PyErr_SetString(PyExc_ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002649 return -1;
2650 }
2651 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002652 return PyDict_SetItem(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002653 }
2654}
2655
Guido van Rossumb209a111997-04-29 18:18:01 +00002656static PyObject *
Guido van Rossum25831651993-05-19 14:50:45 +00002657build_class(methods, bases, name)
Guido van Rossumb209a111997-04-29 18:18:01 +00002658 PyObject *methods; /* dictionary */
2659 PyObject *bases; /* tuple containing classes */
2660 PyObject *name; /* string */
Guido van Rossume9736fc1990-11-18 17:33:06 +00002661{
Guido van Rossumcd649651997-08-22 16:56:16 +00002662 int i, n;
Guido van Rossumb209a111997-04-29 18:18:01 +00002663 if (!PyTuple_Check(bases)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002664 PyErr_SetString(PyExc_SystemError,
2665 "build_class with non-tuple bases");
Guido van Rossum25831651993-05-19 14:50:45 +00002666 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002667 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002668 if (!PyDict_Check(methods)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002669 PyErr_SetString(PyExc_SystemError,
2670 "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002671 return NULL;
2672 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002673 if (!PyString_Check(name)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002674 PyErr_SetString(PyExc_SystemError,
2675 "build_class witn non-string name");
Guido van Rossum25831651993-05-19 14:50:45 +00002676 return NULL;
2677 }
Guido van Rossumcd649651997-08-22 16:56:16 +00002678 n = PyTuple_Size(bases);
2679 for (i = 0; i < n; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002680 PyObject *base = PyTuple_GET_ITEM(bases, i);
2681 if (!PyClass_Check(base)) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002682 /* Call the base's *type*, if it is callable.
2683 This code is a hook for Donald Beaudry's
2684 and Jim Fulton's type extensions. In
2685 unexended Python it will never be triggered
Guido van Rossum55b9ab51997-07-31 03:54:02 +00002686 since its types are not callable.
2687 Ditto: call the bases's *class*, if it has
2688 one. This makes the same thing possible
2689 without writing C code. A true meta-object
2690 protocol! */
2691 PyObject *basetype = (PyObject *)base->ob_type;
2692 PyObject *callable = NULL;
2693 if (PyCallable_Check(basetype))
2694 callable = basetype;
2695 else
2696 callable = PyObject_GetAttrString(
2697 base, "__class__");
2698 if (callable) {
2699 PyObject *args;
2700 PyObject *newclass = NULL;
2701 args = Py_BuildValue(
2702 "(OOO)", name, bases, methods);
2703 if (args != NULL) {
2704 newclass = PyEval_CallObject(
2705 callable, args);
2706 Py_DECREF(args);
2707 }
Guido van Rossum730806d1998-04-10 22:27:42 +00002708 if (callable != basetype) {
Guido van Rossum55b9ab51997-07-31 03:54:02 +00002709 Py_DECREF(callable);
Guido van Rossum730806d1998-04-10 22:27:42 +00002710 }
Guido van Rossum55b9ab51997-07-31 03:54:02 +00002711 return newclass;
Guido van Rossum150b2df1996-12-05 23:17:11 +00002712 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002713 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +00002714 "base is not a class object");
2715 return NULL;
2716 }
2717 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002718 return PyClass_New(bases, methods, name);
Guido van Rossum25831651993-05-19 14:50:45 +00002719}
2720
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002721static int
Guido van Rossuma027efa1997-05-05 20:56:21 +00002722exec_statement(f, prog, globals, locals)
2723 PyFrameObject *f;
Guido van Rossumb209a111997-04-29 18:18:01 +00002724 PyObject *prog;
2725 PyObject *globals;
2726 PyObject *locals;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002727{
2728 char *s;
2729 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00002730 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002731 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002732
Guido van Rossumb209a111997-04-29 18:18:01 +00002733 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
2734 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002735 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00002736 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002737 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00002738 locals = PyTuple_GetItem(prog, 2);
2739 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002740 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002741 if (globals == Py_None) {
2742 globals = PyEval_GetGlobals();
2743 if (locals == Py_None) {
2744 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002745 plain = 1;
2746 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002747 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002748 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002749 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00002750 if (!PyString_Check(prog) &&
2751 !PyCode_Check(prog) &&
2752 !PyFile_Check(prog)) {
2753 PyErr_SetString(PyExc_TypeError,
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002754 "exec 1st arg must be string, code or file object");
2755 return -1;
2756 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002757 if (!PyDict_Check(globals) || !PyDict_Check(locals)) {
2758 PyErr_SetString(PyExc_TypeError,
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002759 "exec 2nd/3rd args must be dict or None");
2760 return -1;
2761 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002762 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002763 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00002764 if (PyCode_Check(prog)) {
Guido van Rossumdfed7251997-11-11 16:29:38 +00002765 v = PyEval_EvalCode((PyCodeObject *) prog,
2766 globals, locals);
2767 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002768 return -1;
Guido van Rossumdfed7251997-11-11 16:29:38 +00002769 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002770 return 0;
2771 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002772 if (PyFile_Check(prog)) {
2773 FILE *fp = PyFile_AsFile(prog);
2774 char *name = PyString_AsString(PyFile_Name(prog));
Guido van Rossumb05a5c71997-05-07 17:46:13 +00002775 if (PyRun_File(fp, name, Py_file_input,
2776 globals, locals) == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002777 return -1;
2778 return 0;
2779 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002780 s = PyString_AsString(prog);
Guido van Rossum5f15b961997-05-13 17:50:01 +00002781 if ((int)strlen(s) != PyString_Size(prog)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002782 PyErr_SetString(PyExc_ValueError,
2783 "embedded '\\0' in exec string");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002784 return -1;
2785 }
Guido van Rossumb05a5c71997-05-07 17:46:13 +00002786 v = PyRun_String(s, Py_file_input, globals, locals);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002787 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002788 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00002789 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002790 if (plain)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002791 PyFrame_LocalsToFast(f, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002792 return 0;
2793}
Guido van Rossum24c13741995-02-14 09:42:43 +00002794
Guido van Rossum1aa14831997-01-21 05:34:20 +00002795/* Hack for ni.py */
Guido van Rossumb209a111997-04-29 18:18:01 +00002796static PyObject *
Guido van Rossum24c13741995-02-14 09:42:43 +00002797find_from_args(f, nexti)
Guido van Rossumb209a111997-04-29 18:18:01 +00002798 PyFrameObject *f;
Guido van Rossum24c13741995-02-14 09:42:43 +00002799 int nexti;
2800{
2801 int opcode;
2802 int oparg;
Guido van Rossumb209a111997-04-29 18:18:01 +00002803 PyObject *list, *name;
Guido van Rossum24c13741995-02-14 09:42:43 +00002804 unsigned char *next_instr;
2805
Guido van Rossumd076c731998-10-07 19:42:25 +00002806 _PyCode_GETCODEPTR(f->f_code, &next_instr);
2807 next_instr += nexti;
2808
Guido van Rossum24c13741995-02-14 09:42:43 +00002809 opcode = (*next_instr++);
2810 if (opcode != IMPORT_FROM) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002811 Py_INCREF(Py_None);
2812 return Py_None;
Guido van Rossum24c13741995-02-14 09:42:43 +00002813 }
2814
Guido van Rossumb209a111997-04-29 18:18:01 +00002815 list = PyList_New(0);
Guido van Rossum24c13741995-02-14 09:42:43 +00002816 if (list == NULL)
2817 return NULL;
2818
2819 do {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002820 oparg = (next_instr[1]<<8) + next_instr[0];
2821 next_instr += 2;
Guido van Rossum24c13741995-02-14 09:42:43 +00002822 name = Getnamev(f, oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002823 if (PyList_Append(list, name) < 0) {
2824 Py_DECREF(list);
Guido van Rossum24c13741995-02-14 09:42:43 +00002825 break;
2826 }
2827 opcode = (*next_instr++);
2828 } while (opcode == IMPORT_FROM);
2829
2830 return list;
2831}
Guido van Rossum950361c1997-01-24 13:49:28 +00002832
2833
2834#ifdef DYNAMIC_EXECUTION_PROFILE
2835
2836PyObject *
2837getarray(a)
2838 long a[256];
2839{
2840 int i;
2841 PyObject *l = PyList_New(256);
2842 if (l == NULL) return NULL;
2843 for (i = 0; i < 256; i++) {
2844 PyObject *x = PyInt_FromLong(a[i]);
2845 if (x == NULL) {
2846 Py_DECREF(l);
2847 return NULL;
2848 }
2849 PyList_SetItem(l, i, x);
2850 }
2851 for (i = 0; i < 256; i++)
2852 a[i] = 0;
2853 return l;
2854}
2855
2856PyObject *
2857_Py_GetDXProfile(self, args)
2858 PyObject *self, *args;
2859{
2860#ifndef DXPAIRS
2861 return getarray(dxp);
2862#else
2863 int i;
2864 PyObject *l = PyList_New(257);
2865 if (l == NULL) return NULL;
2866 for (i = 0; i < 257; i++) {
2867 PyObject *x = getarray(dxpairs[i]);
2868 if (x == NULL) {
2869 Py_DECREF(l);
2870 return NULL;
2871 }
2872 PyList_SetItem(l, i, x);
2873 }
2874 return l;
2875#endif
2876}
2877
2878#endif