blob: 4b40197c4e3b321951d0346203d9445023fcfab2 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00002Copyright (c) 2000, BeOpen.com.
3Copyright (c) 1995-2000, Corporation for National Research Initiatives.
4Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
5All rights reserved.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00006
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007See the file "Misc/COPYRIGHT" for information on usage and
8redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009******************************************************************/
10
Guido van Rossum3f5da241990-12-20 15:06:42 +000011/* Execute compiled code */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000012
Guido van Rossum681d79a1995-07-18 14:51:37 +000013/* XXX TO DO:
14 XXX how to pass arguments to call_trace?
Guido van Rossum681d79a1995-07-18 14:51:37 +000015 XXX speed up searching for keywords by using a dictionary
Guido van Rossum681d79a1995-07-18 14:51:37 +000016 XXX document it!
17 */
18
Guido van Rossumb209a111997-04-29 18:18:01 +000019#include "Python.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000020
Guido van Rossum10dc2e81990-11-18 17:27:39 +000021#include "compile.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000022#include "frameobject.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000023#include "eval.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000024#include "opcode.h"
25
Jack Jansencbf630f2000-07-11 21:59:16 +000026#ifdef macintosh
27#include "macglue.h"
28#endif
29
Guido van Rossumc6004111993-11-05 10:22:19 +000030#include <ctype.h>
31
Guido van Rossuma027efa1997-05-05 20:56:21 +000032#ifdef HAVE_LIMITS_H
33#include <limits.h>
34#else
35#define INT_MAX 2147483647
36#endif
37
Guido van Rossum04691fc1992-08-12 15:35:34 +000038/* Turn this on if your compiler chokes on the big switch: */
Guido van Rossum1ae940a1995-01-02 19:04:15 +000039/* #define CASE_TOO_BIG 1 */
Guido van Rossum04691fc1992-08-12 15:35:34 +000040
Guido van Rossum408027e1996-12-30 16:17:54 +000041#ifdef Py_DEBUG
Guido van Rossum96a42c81992-01-12 02:29:51 +000042/* For debugging the interpreter: */
43#define LLTRACE 1 /* Low-level trace feature */
44#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000045#endif
46
Guido van Rossum5b722181993-03-30 17:46:03 +000047
Guido van Rossum374a9221991-04-04 10:40:29 +000048/* Forward declarations */
Guido van Rossum374a9221991-04-04 10:40:29 +000049
Tim Petersdbd9ba62000-07-09 03:09:57 +000050static PyObject *eval_code2(PyCodeObject *,
51 PyObject *, PyObject *,
52 PyObject **, int,
53 PyObject **, int,
54 PyObject **, int,
55 PyObject *);
Guido van Rossum0a066c01992-03-27 17:29:15 +000056#ifdef LLTRACE
Tim Petersdbd9ba62000-07-09 03:09:57 +000057static int prtrace(PyObject *, char *);
Guido van Rossum0a066c01992-03-27 17:29:15 +000058#endif
Tim Petersdbd9ba62000-07-09 03:09:57 +000059static void call_exc_trace(PyObject **, PyObject**, PyFrameObject *);
60static int call_trace(PyObject **, PyObject **,
61 PyFrameObject *, char *, PyObject *);
62static PyObject *call_builtin(PyObject *, PyObject *, PyObject *);
63static PyObject *call_function(PyObject *, PyObject *, PyObject *);
64static PyObject *loop_subscript(PyObject *, PyObject *);
65static PyObject *apply_slice(PyObject *, PyObject *, PyObject *);
66static int assign_slice(PyObject *, PyObject *,
67 PyObject *, PyObject *);
68static PyObject *cmp_outcome(int, PyObject *, PyObject *);
Thomas Wouters52152252000-08-17 22:55:00 +000069static PyObject *import_from(PyObject *, PyObject *);
70static int import_all_from(PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000071static PyObject *build_class(PyObject *, PyObject *, PyObject *);
72static int exec_statement(PyFrameObject *,
73 PyObject *, PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000074static void set_exc_info(PyThreadState *, PyObject *, PyObject *, PyObject *);
75static void reset_exc_info(PyThreadState *);
Guido van Rossum374a9221991-04-04 10:40:29 +000076
77
Guido van Rossum950361c1997-01-24 13:49:28 +000078/* Dynamic execution profile */
79#ifdef DYNAMIC_EXECUTION_PROFILE
80#ifdef DXPAIRS
81static long dxpairs[257][256];
82#define dxp dxpairs[256]
83#else
84static long dxp[256];
85#endif
86#endif
87
88
Guido van Rossume59214e1994-08-30 08:01:59 +000089#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +000090
Guido van Rossum2571cc81999-04-07 16:07:23 +000091#ifndef DONT_HAVE_ERRNO_H
Guido van Rossum1984f1e1992-08-04 12:41:02 +000092#include <errno.h>
Guido van Rossum2571cc81999-04-07 16:07:23 +000093#endif
Guido van Rossum49b56061998-10-01 20:42:43 +000094#include "pythread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000095
Guido van Rossuma027efa1997-05-05 20:56:21 +000096extern int _PyThread_Started; /* Flag for Py_Exit */
97
Guido van Rossum65d5b571998-12-21 19:32:43 +000098static PyThread_type_lock interpreter_lock = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +000099static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000100
101void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000102PyEval_InitThreads(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000103{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000104 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000105 return;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000106 _PyThread_Started = 1;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000107 interpreter_lock = PyThread_allocate_lock();
108 PyThread_acquire_lock(interpreter_lock, 1);
109 main_thread = PyThread_get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000110}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000111
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000112void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000113PyEval_AcquireLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000114{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000115 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000116}
117
118void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000119PyEval_ReleaseLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000120{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000121 PyThread_release_lock(interpreter_lock);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000122}
123
124void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000125PyEval_AcquireThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000126{
127 if (tstate == NULL)
128 Py_FatalError("PyEval_AcquireThread: NULL new thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000129 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000130 if (PyThreadState_Swap(tstate) != NULL)
131 Py_FatalError(
132 "PyEval_AcquireThread: non-NULL old thread state");
133}
134
135void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000136PyEval_ReleaseThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000137{
138 if (tstate == NULL)
139 Py_FatalError("PyEval_ReleaseThread: NULL thread state");
140 if (PyThreadState_Swap(NULL) != tstate)
141 Py_FatalError("PyEval_ReleaseThread: wrong thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000142 PyThread_release_lock(interpreter_lock);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000143}
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000144
145/* This function is called from PyOS_AfterFork to ensure that newly
146 created child processes don't hold locks referring to threads which
147 are not running in the child process. (This could also be done using
148 pthread_atfork mechanism, at least for the pthreads implementation.) */
149
150void
151PyEval_ReInitThreads(void)
152{
153 if (!interpreter_lock)
154 return;
155 /*XXX Can't use PyThread_free_lock here because it does too
156 much error-checking. Doing this cleanly would require
157 adding a new function to each thread_*.h. Instead, just
158 create a new lock and waste a little bit of memory */
159 interpreter_lock = PyThread_allocate_lock();
160 PyThread_acquire_lock(interpreter_lock, 1);
161 main_thread = PyThread_get_thread_ident();
162}
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000163#endif
164
Guido van Rossumff4949e1992-08-05 19:58:53 +0000165/* Functions save_thread and restore_thread are always defined so
166 dynamically loaded modules needn't be compiled separately for use
167 with and without threads: */
168
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000169PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000170PyEval_SaveThread(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000171{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000172 PyThreadState *tstate = PyThreadState_Swap(NULL);
173 if (tstate == NULL)
174 Py_FatalError("PyEval_SaveThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000175#ifdef WITH_THREAD
Guido van Rossumb74eca91997-09-30 22:03:16 +0000176 if (interpreter_lock)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000177 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000178#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000179 return tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000180}
181
182void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000183PyEval_RestoreThread(PyThreadState *tstate)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000184{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000185 if (tstate == NULL)
186 Py_FatalError("PyEval_RestoreThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000187#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000188 if (interpreter_lock) {
Guido van Rossumb74eca91997-09-30 22:03:16 +0000189 int err = errno;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000190 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000191 errno = err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000192 }
193#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000194 PyThreadState_Swap(tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000195}
196
197
Guido van Rossuma9672091994-09-14 13:31:22 +0000198/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
199 signal handlers or Mac I/O completion routines) can schedule calls
200 to a function to be called synchronously.
201 The synchronous function is called with one void* argument.
202 It should return 0 for success or -1 for failure -- failure should
203 be accompanied by an exception.
204
205 If registry succeeds, the registry function returns 0; if it fails
206 (e.g. due to too many pending calls) it returns -1 (without setting
207 an exception condition).
208
209 Note that because registry may occur from within signal handlers,
210 or other asynchronous events, calling malloc() is unsafe!
211
212#ifdef WITH_THREAD
213 Any thread can schedule pending calls, but only the main thread
214 will execute them.
215#endif
216
217 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
218 There are two possible race conditions:
219 (1) nested asynchronous registry calls;
220 (2) registry calls made while pending calls are being processed.
221 While (1) is very unlikely, (2) is a real possibility.
222 The current code is safe against (2), but not against (1).
223 The safety against (2) is derived from the fact that only one
224 thread (the main thread) ever takes things out of the queue.
Guido van Rossuma9672091994-09-14 13:31:22 +0000225
Guido van Rossuma027efa1997-05-05 20:56:21 +0000226 XXX Darn! With the advent of thread state, we should have an array
227 of pending calls per thread in the thread state! Later...
228*/
Guido van Rossum8861b741996-07-30 16:49:37 +0000229
Guido van Rossuma9672091994-09-14 13:31:22 +0000230#define NPENDINGCALLS 32
231static struct {
Thomas Wouters334fb892000-07-25 12:56:38 +0000232 int (*func)(void *);
233 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000234} pendingcalls[NPENDINGCALLS];
235static volatile int pendingfirst = 0;
236static volatile int pendinglast = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000237static volatile int things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000238
239int
Thomas Wouters334fb892000-07-25 12:56:38 +0000240Py_AddPendingCall(int (*func)(void *), void *arg)
Guido van Rossuma9672091994-09-14 13:31:22 +0000241{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000242 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000243 int i, j;
244 /* XXX Begin critical section */
245 /* XXX If you want this to be safe against nested
246 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000247 if (busy)
248 return -1;
249 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000250 i = pendinglast;
251 j = (i + 1) % NPENDINGCALLS;
252 if (j == pendingfirst)
253 return -1; /* Queue full */
254 pendingcalls[i].func = func;
255 pendingcalls[i].arg = arg;
256 pendinglast = j;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000257 things_to_do = 1; /* Signal main loop */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000258 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000259 /* XXX End critical section */
260 return 0;
261}
262
Guido van Rossum180d7b41994-09-29 09:45:57 +0000263int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000264Py_MakePendingCalls(void)
Guido van Rossuma9672091994-09-14 13:31:22 +0000265{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000266 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000267#ifdef WITH_THREAD
Guido van Rossum65d5b571998-12-21 19:32:43 +0000268 if (main_thread && PyThread_get_thread_ident() != main_thread)
Guido van Rossuma9672091994-09-14 13:31:22 +0000269 return 0;
270#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000271 if (busy)
Guido van Rossum180d7b41994-09-29 09:45:57 +0000272 return 0;
273 busy = 1;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000274 things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000275 for (;;) {
276 int i;
Thomas Wouters334fb892000-07-25 12:56:38 +0000277 int (*func)(void *);
278 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000279 i = pendingfirst;
280 if (i == pendinglast)
281 break; /* Queue empty */
282 func = pendingcalls[i].func;
283 arg = pendingcalls[i].arg;
284 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000285 if (func(arg) < 0) {
286 busy = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000287 things_to_do = 1; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000288 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000289 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000290 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000291 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000292 return 0;
293}
294
295
Guido van Rossum374a9221991-04-04 10:40:29 +0000296/* Status code for main loop (reason for stack unwind) */
297
298enum why_code {
299 WHY_NOT, /* No error */
300 WHY_EXCEPTION, /* Exception occurred */
301 WHY_RERAISE, /* Exception re-raised by 'finally' */
302 WHY_RETURN, /* 'return' statement */
303 WHY_BREAK /* 'break' statement */
304};
305
Tim Petersdbd9ba62000-07-09 03:09:57 +0000306static enum why_code do_raise(PyObject *, PyObject *, PyObject *);
307static int unpack_sequence(PyObject *, int, PyObject **);
Guido van Rossum1aa14831997-01-21 05:34:20 +0000308
Guido van Rossum374a9221991-04-04 10:40:29 +0000309
Guido van Rossumb209a111997-04-29 18:18:01 +0000310PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000311PyEval_EvalCode(PyCodeObject *co, PyObject *globals, PyObject *locals)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000312{
313 return eval_code2(co,
314 globals, locals,
Guido van Rossumb209a111997-04-29 18:18:01 +0000315 (PyObject **)NULL, 0,
316 (PyObject **)NULL, 0,
317 (PyObject **)NULL, 0,
318 (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000319}
320
321
322/* Interpreter main loop */
323
Guido van Rossum8861b741996-07-30 16:49:37 +0000324#ifndef MAX_RECURSION_DEPTH
325#define MAX_RECURSION_DEPTH 10000
326#endif
327
Guido van Rossumb209a111997-04-29 18:18:01 +0000328static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000329eval_code2(PyCodeObject *co, PyObject *globals, PyObject *locals,
330 PyObject **args, int argcount, PyObject **kws, int kwcount,
331 PyObject **defs, int defcount, PyObject *owner)
Guido van Rossum374a9221991-04-04 10:40:29 +0000332{
Guido van Rossum950361c1997-01-24 13:49:28 +0000333#ifdef DXPAIRS
334 int lastopcode = 0;
335#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000336 register unsigned char *next_instr;
Moshe Zadkaaa39a7e2000-08-07 06:34:45 +0000337 register int opcode=0; /* Current opcode */
338 register int oparg=0; /* Current opcode argument, if any */
Guido van Rossumb209a111997-04-29 18:18:01 +0000339 register PyObject **stack_pointer;
Guido van Rossum374a9221991-04-04 10:40:29 +0000340 register enum why_code why; /* Reason for block stack unwind */
341 register int err; /* Error status -- nonzero if error */
Guido van Rossumb209a111997-04-29 18:18:01 +0000342 register PyObject *x; /* Result object -- NULL if error */
343 register PyObject *v; /* Temporary objects popped off stack */
344 register PyObject *w;
345 register PyObject *u;
346 register PyObject *t;
Barry Warsaw23c9ec82000-08-21 15:44:01 +0000347 register PyObject *stream = NULL; /* for PRINT opcodes */
Guido van Rossumb209a111997-04-29 18:18:01 +0000348 register PyFrameObject *f; /* Current frame */
Guido van Rossum50cd3481998-11-17 17:02:51 +0000349 register PyObject **fastlocals;
Guido van Rossum014518f1998-11-23 21:09:51 +0000350 PyObject *retval = NULL; /* Return value */
Guido van Rossum885553e1998-12-21 18:33:30 +0000351 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossumd076c731998-10-07 19:42:25 +0000352 unsigned char *first_instr;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000353#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000354 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000355#endif
Guido van Rossum408027e1996-12-30 16:17:54 +0000356#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000357 /* Make it easier to find out where we are with a debugger */
Guido van Rossumb209a111997-04-29 18:18:01 +0000358 char *filename = PyString_AsString(co->co_filename);
Guido van Rossum99bec951992-09-03 20:29:45 +0000359#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000360
361/* Code access macros */
362
363#define GETCONST(i) Getconst(f, i)
364#define GETNAME(i) Getname(f, i)
365#define GETNAMEV(i) Getnamev(f, i)
Guido van Rossumd076c731998-10-07 19:42:25 +0000366#define INSTR_OFFSET() (next_instr - first_instr)
Guido van Rossum374a9221991-04-04 10:40:29 +0000367#define NEXTOP() (*next_instr++)
368#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossumd076c731998-10-07 19:42:25 +0000369#define JUMPTO(x) (next_instr = first_instr + (x))
Guido van Rossum374a9221991-04-04 10:40:29 +0000370#define JUMPBY(x) (next_instr += (x))
371
372/* Stack manipulation macros */
373
374#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
375#define EMPTY() (STACK_LEVEL() == 0)
376#define TOP() (stack_pointer[-1])
377#define BASIC_PUSH(v) (*stack_pointer++ = (v))
378#define BASIC_POP() (*--stack_pointer)
379
Guido van Rossum96a42c81992-01-12 02:29:51 +0000380#ifdef LLTRACE
381#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
382#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000383#else
384#define PUSH(v) BASIC_PUSH(v)
385#define POP() BASIC_POP()
386#endif
387
Guido van Rossum681d79a1995-07-18 14:51:37 +0000388/* Local variable macros */
389
390#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumb209a111997-04-29 18:18:01 +0000391#define SETLOCAL(i, value) do { Py_XDECREF(GETLOCAL(i)); \
Guido van Rossum681d79a1995-07-18 14:51:37 +0000392 GETLOCAL(i) = value; } while (0)
393
Guido van Rossuma027efa1997-05-05 20:56:21 +0000394/* Start of code */
395
Guido van Rossum8861b741996-07-30 16:49:37 +0000396#ifdef USE_STACKCHECK
Guido van Rossuma027efa1997-05-05 20:56:21 +0000397 if (tstate->recursion_depth%10 == 0 && PyOS_CheckStack()) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000398 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
Guido van Rossum8861b741996-07-30 16:49:37 +0000399 return NULL;
400 }
401#endif
402
Guido van Rossum681d79a1995-07-18 14:51:37 +0000403 if (globals == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000404 PyErr_SetString(PyExc_SystemError, "eval_code2: NULL globals");
Guido van Rossum6135a871995-01-09 17:53:26 +0000405 return NULL;
Guido van Rossum5b722181993-03-30 17:46:03 +0000406 }
407
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000408#ifdef LLTRACE
Guido van Rossumb209a111997-04-29 18:18:01 +0000409 lltrace = PyDict_GetItemString(globals, "__lltrace__") != NULL;
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000410#endif
411
Guido van Rossumb209a111997-04-29 18:18:01 +0000412 f = PyFrame_New(
Guido van Rossuma027efa1997-05-05 20:56:21 +0000413 tstate, /*back*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000414 co, /*code*/
415 globals, /*globals*/
Guido van Rossum76836021997-01-20 04:26:20 +0000416 locals); /*locals*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000417 if (f == NULL)
418 return NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000419
Guido van Rossuma027efa1997-05-05 20:56:21 +0000420 tstate->frame = f;
Guido van Rossumdeb0c5e1997-01-27 23:42:36 +0000421 fastlocals = f->f_localsplus;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000422
423 if (co->co_argcount > 0 ||
424 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
425 int i;
426 int n = argcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000427 PyObject *kwdict = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000428 if (co->co_flags & CO_VARKEYWORDS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000429 kwdict = PyDict_New();
Guido van Rossum681d79a1995-07-18 14:51:37 +0000430 if (kwdict == NULL)
431 goto fail;
Guido van Rossum8c5df061997-01-24 04:19:24 +0000432 i = co->co_argcount;
433 if (co->co_flags & CO_VARARGS)
434 i++;
435 SETLOCAL(i, kwdict);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000436 }
437 if (argcount > co->co_argcount) {
438 if (!(co->co_flags & CO_VARARGS)) {
Guido van Rossumdf9db1e1997-11-19 16:05:40 +0000439 PyErr_Format(PyExc_TypeError,
440 "too many arguments; expected %d, got %d",
441 co->co_argcount, argcount);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000442 goto fail;
443 }
444 n = co->co_argcount;
445 }
446 for (i = 0; i < n; i++) {
447 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000448 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000449 SETLOCAL(i, x);
450 }
451 if (co->co_flags & CO_VARARGS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000452 u = PyTuple_New(argcount - n);
Guido van Rossum8c5df061997-01-24 04:19:24 +0000453 if (u == NULL)
454 goto fail;
455 SETLOCAL(co->co_argcount, u);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000456 for (i = n; i < argcount; i++) {
457 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000458 Py_INCREF(x);
459 PyTuple_SET_ITEM(u, i-n, x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000460 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000461 }
462 for (i = 0; i < kwcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000463 PyObject *keyword = kws[2*i];
464 PyObject *value = kws[2*i + 1];
Guido van Rossum681d79a1995-07-18 14:51:37 +0000465 int j;
Guido van Rossum25da5be1999-10-26 00:12:20 +0000466 if (keyword == NULL || !PyString_Check(keyword)) {
467 PyErr_SetString(PyExc_TypeError,
468 "keywords must be strings");
469 goto fail;
470 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000471 /* XXX slow -- speed up using dictionary? */
472 for (j = 0; j < co->co_argcount; j++) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000473 PyObject *nm = PyTuple_GET_ITEM(
474 co->co_varnames, j);
Guido van Rossumb209a111997-04-29 18:18:01 +0000475 if (PyObject_Compare(keyword, nm) == 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000476 break;
477 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000478 /* Check errors from Compare */
479 if (PyErr_Occurred())
480 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000481 if (j >= co->co_argcount) {
482 if (kwdict == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000483 PyErr_Format(PyExc_TypeError,
Guido van Rossuma027efa1997-05-05 20:56:21 +0000484 "unexpected keyword argument: %.400s",
Jeremy Hylton76901512000-03-28 23:49:17 +0000485 PyString_AsString(keyword));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000486 goto fail;
487 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000488 PyDict_SetItem(kwdict, keyword, value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000489 }
490 else {
491 if (GETLOCAL(j) != NULL) {
Jeremy Hylton76901512000-03-28 23:49:17 +0000492 PyErr_Format(PyExc_TypeError,
493 "keyword parameter redefined: %.400s",
494 PyString_AsString(keyword));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000495 goto fail;
496 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000497 Py_INCREF(value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000498 SETLOCAL(j, value);
499 }
500 }
501 if (argcount < co->co_argcount) {
502 int m = co->co_argcount - defcount;
503 for (i = argcount; i < m; i++) {
504 if (GETLOCAL(i) == NULL) {
Guido van Rossumdf9db1e1997-11-19 16:05:40 +0000505 PyErr_Format(PyExc_TypeError,
506 "not enough arguments; expected %d, got %d",
507 m, i);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000508 goto fail;
509 }
510 }
511 if (n > m)
512 i = n - m;
513 else
514 i = 0;
515 for (; i < defcount; i++) {
516 if (GETLOCAL(m+i) == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000517 PyObject *def = defs[i];
518 Py_INCREF(def);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000519 SETLOCAL(m+i, def);
520 }
521 }
522 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000523 }
524 else {
525 if (argcount > 0 || kwcount > 0) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000526 PyErr_SetString(PyExc_TypeError,
527 "no arguments expected");
Guido van Rossum8c5df061997-01-24 04:19:24 +0000528 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000529 }
530 }
531
Guido van Rossuma027efa1997-05-05 20:56:21 +0000532 if (tstate->sys_tracefunc != NULL) {
533 /* tstate->sys_tracefunc, if defined, is a function that
534 will be called on *every* entry to a code block.
Guido van Rossum96a42c81992-01-12 02:29:51 +0000535 Its return value, if not None, is a function that
536 will be called at the start of each executed line
537 of code. (Actually, the function must return
538 itself in order to continue tracing.)
539 The trace functions are called with three arguments:
540 a pointer to the current frame, a string indicating
541 why the function is called, and an argument which
542 depends on the situation. The global trace function
543 (sys.trace) is also called whenever an exception
544 is detected. */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000545 if (call_trace(&tstate->sys_tracefunc,
546 &f->f_trace, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000547 Py_None/*XXX how to compute arguments now?*/)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000548 /* Trace function raised an error */
Guido van Rossum8c5df061997-01-24 04:19:24 +0000549 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000550 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000551 }
552
Guido van Rossuma027efa1997-05-05 20:56:21 +0000553 if (tstate->sys_profilefunc != NULL) {
554 /* Similar for sys_profilefunc, except it needn't return
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000555 itself and isn't called for "line" events */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000556 if (call_trace(&tstate->sys_profilefunc,
557 (PyObject**)0, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000558 Py_None/*XXX*/)) {
Guido van Rossum8c5df061997-01-24 04:19:24 +0000559 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000560 }
561 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000562
Guido van Rossuma027efa1997-05-05 20:56:21 +0000563 if (++tstate->recursion_depth > MAX_RECURSION_DEPTH) {
564 --tstate->recursion_depth;
565 PyErr_SetString(PyExc_RuntimeError,
566 "Maximum recursion depth exceeded");
567 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +0000568 Py_DECREF(f);
Guido van Rossum8861b741996-07-30 16:49:37 +0000569 return NULL;
570 }
571
Guido van Rossumd076c731998-10-07 19:42:25 +0000572 _PyCode_GETCODEPTR(co, &first_instr);
573 next_instr = first_instr;
Guido van Rossum374a9221991-04-04 10:40:29 +0000574 stack_pointer = f->f_valuestack;
575
Guido van Rossum374a9221991-04-04 10:40:29 +0000576 why = WHY_NOT;
577 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000578 x = Py_None; /* Not a reference, just anything non-NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000579
580 for (;;) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000581 /* Do periodic things. Doing this every time through
582 the loop would add too much overhead, so we do it
583 only every Nth instruction. We also do it if
584 ``things_to_do'' is set, i.e. when an asynchronous
585 event needs attention (e.g. a signal handler or
586 async I/O handler); see Py_AddPendingCall() and
587 Py_MakePendingCalls() above. */
Guido van Rossuma9672091994-09-14 13:31:22 +0000588
Guido van Rossuma027efa1997-05-05 20:56:21 +0000589 if (things_to_do || --tstate->ticker < 0) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000590 tstate->ticker = tstate->interp->checkinterval;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000591 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000592 if (Py_MakePendingCalls() < 0) {
593 why = WHY_EXCEPTION;
594 goto on_error;
595 }
596 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000597#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000598 /* If we have true signals, the signal handler
599 will call Py_AddPendingCall() so we don't
600 have to call sigcheck(). On the Mac and
601 DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000602 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000603 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000604 goto on_error;
605 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000606#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000607
Guido van Rossume59214e1994-08-30 08:01:59 +0000608#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000609 if (interpreter_lock) {
610 /* Give another thread a chance */
611
Guido van Rossum25ce5661997-08-02 03:10:38 +0000612 if (PyThreadState_Swap(NULL) != tstate)
613 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000614 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000615
616 /* Other threads may run now */
617
Guido van Rossum65d5b571998-12-21 19:32:43 +0000618 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000619 if (PyThreadState_Swap(tstate) != NULL)
620 Py_FatalError("ceval: orphan tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000621 }
622#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000623 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000624
Guido van Rossum374a9221991-04-04 10:40:29 +0000625 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000626
Guido van Rossum408027e1996-12-30 16:17:54 +0000627#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000628 f->f_lasti = INSTR_OFFSET();
629#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000630
631 opcode = NEXTOP();
632 if (HAS_ARG(opcode))
633 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +0000634 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +0000635#ifdef DYNAMIC_EXECUTION_PROFILE
636#ifdef DXPAIRS
637 dxpairs[lastopcode][opcode]++;
638 lastopcode = opcode;
639#endif
640 dxp[opcode]++;
641#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000642
Guido van Rossum96a42c81992-01-12 02:29:51 +0000643#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000644 /* Instruction tracing */
645
Guido van Rossum96a42c81992-01-12 02:29:51 +0000646 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000647 if (HAS_ARG(opcode)) {
648 printf("%d: %d, %d\n",
649 (int) (INSTR_OFFSET() - 3),
650 opcode, oparg);
651 }
652 else {
653 printf("%d: %d\n",
654 (int) (INSTR_OFFSET() - 1), opcode);
655 }
656 }
657#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000658 /* Main switch on opcode */
659
660 switch (opcode) {
661
662 /* BEWARE!
663 It is essential that any operation that fails sets either
664 x to NULL, err to nonzero, or why to anything but WHY_NOT,
665 and that no operation that succeeds does this! */
666
667 /* case STOP_CODE: this is an error! */
668
669 case POP_TOP:
670 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000671 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000672 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000673
674 case ROT_TWO:
675 v = POP();
676 w = POP();
677 PUSH(v);
678 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000679 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000680
681 case ROT_THREE:
682 v = POP();
683 w = POP();
684 x = POP();
685 PUSH(v);
686 PUSH(x);
687 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000688 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000689
Thomas Wouters434d0822000-08-24 20:11:32 +0000690 case ROT_FOUR:
691 u = POP();
692 v = POP();
693 w = POP();
694 x = POP();
695 PUSH(u);
696 PUSH(x);
697 PUSH(w);
698 PUSH(v);
699 continue;
700
Guido van Rossum374a9221991-04-04 10:40:29 +0000701 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
Thomas Wouters434d0822000-08-24 20:11:32 +0000707 case DUP_TOPX:
708 switch (oparg) {
709 case 5:
710 case 4:
711 case 3:
712 case 2:
713 case 1:
714 x = POP();
715 if (oparg == 1) break;
716 w = POP();
717 if (oparg == 2) break;
718 v = POP();
719 if (oparg == 3) break;
720 u = POP();
721 if (oparg == 4) break;
722 t = POP();
723 break;
724 default:
725 fprintf(stderr, "Invalid argument to DUP_TOPX: %d!\n", oparg);
726 PyErr_SetString(PyExc_SystemError,
727 "invalid argument to DUP_TOPX");
728 x = NULL;
729 }
730 if (x == NULL)
731 break;
732 switch (oparg) {
733 case 5: PUSH(t);
734 Py_INCREF(t); /* Fallthrough */
735 case 4: PUSH(u);
736 Py_INCREF(u); /* Fallthrough */
737 case 3: PUSH(v);
738 Py_INCREF(v); /* Fallthrough */
739 case 2: PUSH(w);
740 Py_INCREF(w); /* Fallthrough */
741 case 1: PUSH(x);
742 Py_INCREF(x); /* Fallthrough */
743 }
744 switch (oparg) {
745 case 5: PUSH(t); /* Fallthrough */
746 case 4: PUSH(u); /* Fallthrough */
747 case 3: PUSH(v); /* Fallthrough */
748 case 2: PUSH(w); /* Fallthrough */
749 case 1: PUSH(x); /* Fallthrough */
750 }
751 continue;
752
Guido van Rossum374a9221991-04-04 10:40:29 +0000753 case UNARY_POSITIVE:
754 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000755 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000756 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000757 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000758 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000759 break;
760
761 case UNARY_NEGATIVE:
762 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000763 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000764 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000765 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000766 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000767 break;
768
769 case UNARY_NOT:
770 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000771 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000772 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000773 if (err == 0) {
774 Py_INCREF(Py_True);
775 PUSH(Py_True);
776 continue;
777 }
778 else if (err > 0) {
779 Py_INCREF(Py_False);
780 PUSH(Py_False);
781 err = 0;
782 continue;
783 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000784 break;
785
786 case UNARY_CONVERT:
787 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000788 x = PyObject_Repr(v);
789 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000790 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000791 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000792 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000793
794 case UNARY_INVERT:
795 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000796 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000797 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000798 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000799 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000800 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000801
Guido van Rossum50564e81996-01-12 01:13:16 +0000802 case BINARY_POWER:
803 w = POP();
804 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000805 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000806 Py_DECREF(v);
807 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000808 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000809 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000810 break;
811
Guido van Rossum374a9221991-04-04 10:40:29 +0000812 case BINARY_MULTIPLY:
813 w = POP();
814 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000815 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000816 Py_DECREF(v);
817 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000818 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000819 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000820 break;
821
822 case BINARY_DIVIDE:
823 w = POP();
824 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000825 x = PyNumber_Divide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000826 Py_DECREF(v);
827 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000828 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000829 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000830 break;
831
832 case BINARY_MODULO:
833 w = POP();
834 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000835 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000836 Py_DECREF(v);
837 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000838 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000839 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000840 break;
841
842 case BINARY_ADD:
843 w = POP();
844 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000845 if (PyInt_Check(v) && PyInt_Check(w)) {
846 /* INLINE: int + int */
847 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000848 a = PyInt_AS_LONG(v);
849 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000850 i = a + b;
851 if ((i^a) < 0 && (i^b) < 0) {
852 PyErr_SetString(PyExc_OverflowError,
853 "integer addition");
854 x = NULL;
855 }
856 else
857 x = PyInt_FromLong(i);
858 }
859 else
860 x = PyNumber_Add(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000861 Py_DECREF(v);
862 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000863 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000864 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000865 break;
866
867 case BINARY_SUBTRACT:
868 w = POP();
869 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000870 if (PyInt_Check(v) && PyInt_Check(w)) {
871 /* INLINE: int - int */
872 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000873 a = PyInt_AS_LONG(v);
874 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000875 i = a - b;
876 if ((i^a) < 0 && (i^~b) < 0) {
877 PyErr_SetString(PyExc_OverflowError,
878 "integer subtraction");
879 x = NULL;
880 }
881 else
882 x = PyInt_FromLong(i);
883 }
884 else
885 x = PyNumber_Subtract(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000886 Py_DECREF(v);
887 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000888 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000889 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000890 break;
891
892 case BINARY_SUBSCR:
893 w = POP();
894 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000895 if (PyList_Check(v) && PyInt_Check(w)) {
896 /* INLINE: list[int] */
897 long i = PyInt_AsLong(w);
898 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +0000899 i += PyList_GET_SIZE(v);
Guido van Rossumc12da691997-07-17 23:12:42 +0000900 if (i < 0 ||
Guido van Rossumfa00e951998-07-08 15:02:37 +0000901 i >= PyList_GET_SIZE(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +0000902 PyErr_SetString(PyExc_IndexError,
903 "list index out of range");
904 x = NULL;
905 }
906 else {
Guido van Rossumfa00e951998-07-08 15:02:37 +0000907 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +0000908 Py_INCREF(x);
909 }
910 }
911 else
912 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000913 Py_DECREF(v);
914 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000915 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000916 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000917 break;
918
Guido van Rossum7928cd71991-10-24 14:59:31 +0000919 case BINARY_LSHIFT:
920 w = POP();
921 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000922 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000923 Py_DECREF(v);
924 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000925 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000926 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000927 break;
928
929 case BINARY_RSHIFT:
930 w = POP();
931 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000932 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000933 Py_DECREF(v);
934 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000935 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000936 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000937 break;
938
939 case BINARY_AND:
940 w = POP();
941 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000942 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000943 Py_DECREF(v);
944 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000945 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000946 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000947 break;
948
949 case BINARY_XOR:
950 w = POP();
951 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000952 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000953 Py_DECREF(v);
954 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000955 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000956 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000957 break;
958
959 case BINARY_OR:
960 w = POP();
961 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000962 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000963 Py_DECREF(v);
964 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000965 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000966 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000967 break;
Thomas Wouters434d0822000-08-24 20:11:32 +0000968
969 case INPLACE_POWER:
970 w = POP();
971 v = POP();
972 x = PyNumber_InPlacePower(v, w, Py_None);
973 Py_DECREF(v);
974 Py_DECREF(w);
975 PUSH(x);
976 if (x != NULL) continue;
977 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000978
Thomas Wouters434d0822000-08-24 20:11:32 +0000979 case INPLACE_MULTIPLY:
980 w = POP();
981 v = POP();
982 x = PyNumber_InPlaceMultiply(v, w);
983 Py_DECREF(v);
984 Py_DECREF(w);
985 PUSH(x);
986 if (x != NULL) continue;
987 break;
988
989 case INPLACE_DIVIDE:
990 w = POP();
991 v = POP();
992 x = PyNumber_InPlaceDivide(v, w);
993 Py_DECREF(v);
994 Py_DECREF(w);
995 PUSH(x);
996 if (x != NULL) continue;
997 break;
998
999 case INPLACE_MODULO:
1000 w = POP();
1001 v = POP();
1002 x = PyNumber_InPlaceRemainder(v, w);
1003 Py_DECREF(v);
1004 Py_DECREF(w);
1005 PUSH(x);
1006 if (x != NULL) continue;
1007 break;
1008
1009 case INPLACE_ADD:
1010 w = POP();
1011 v = POP();
1012 if (PyInt_Check(v) && PyInt_Check(w)) {
1013 /* INLINE: int + int */
1014 register long a, b, i;
1015 a = PyInt_AS_LONG(v);
1016 b = PyInt_AS_LONG(w);
1017 i = a + b;
1018 if ((i^a) < 0 && (i^b) < 0) {
1019 PyErr_SetString(PyExc_OverflowError,
1020 "integer addition");
1021 x = NULL;
1022 }
1023 else
1024 x = PyInt_FromLong(i);
1025 }
1026 else
1027 x = PyNumber_InPlaceAdd(v, w);
1028 Py_DECREF(v);
1029 Py_DECREF(w);
1030 PUSH(x);
1031 if (x != NULL) continue;
1032 break;
1033
1034 case INPLACE_SUBTRACT:
1035 w = POP();
1036 v = POP();
1037 if (PyInt_Check(v) && PyInt_Check(w)) {
1038 /* INLINE: int - int */
1039 register long a, b, i;
1040 a = PyInt_AS_LONG(v);
1041 b = PyInt_AS_LONG(w);
1042 i = a - b;
1043 if ((i^a) < 0 && (i^~b) < 0) {
1044 PyErr_SetString(PyExc_OverflowError,
1045 "integer subtraction");
1046 x = NULL;
1047 }
1048 else
1049 x = PyInt_FromLong(i);
1050 }
1051 else
1052 x = PyNumber_InPlaceSubtract(v, w);
1053 Py_DECREF(v);
1054 Py_DECREF(w);
1055 PUSH(x);
1056 if (x != NULL) continue;
1057 break;
1058
1059 case INPLACE_LSHIFT:
1060 w = POP();
1061 v = POP();
1062 x = PyNumber_InPlaceLshift(v, w);
1063 Py_DECREF(v);
1064 Py_DECREF(w);
1065 PUSH(x);
1066 if (x != NULL) continue;
1067 break;
1068
1069 case INPLACE_RSHIFT:
1070 w = POP();
1071 v = POP();
1072 x = PyNumber_InPlaceRshift(v, w);
1073 Py_DECREF(v);
1074 Py_DECREF(w);
1075 PUSH(x);
1076 if (x != NULL) continue;
1077 break;
1078
1079 case INPLACE_AND:
1080 w = POP();
1081 v = POP();
1082 x = PyNumber_InPlaceAnd(v, w);
1083 Py_DECREF(v);
1084 Py_DECREF(w);
1085 PUSH(x);
1086 if (x != NULL) continue;
1087 break;
1088
1089 case INPLACE_XOR:
1090 w = POP();
1091 v = POP();
1092 x = PyNumber_InPlaceXor(v, w);
1093 Py_DECREF(v);
1094 Py_DECREF(w);
1095 PUSH(x);
1096 if (x != NULL) continue;
1097 break;
1098
1099 case INPLACE_OR:
1100 w = POP();
1101 v = POP();
1102 x = PyNumber_InPlaceOr(v, w);
1103 Py_DECREF(v);
1104 Py_DECREF(w);
1105 PUSH(x);
1106 if (x != NULL) continue;
1107 break;
1108
Guido van Rossum374a9221991-04-04 10:40:29 +00001109 case SLICE+0:
1110 case SLICE+1:
1111 case SLICE+2:
1112 case SLICE+3:
1113 if ((opcode-SLICE) & 2)
1114 w = POP();
1115 else
1116 w = NULL;
1117 if ((opcode-SLICE) & 1)
1118 v = POP();
1119 else
1120 v = NULL;
1121 u = POP();
1122 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001123 Py_DECREF(u);
1124 Py_XDECREF(v);
1125 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001126 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001127 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001128 break;
1129
1130 case STORE_SLICE+0:
1131 case STORE_SLICE+1:
1132 case STORE_SLICE+2:
1133 case STORE_SLICE+3:
1134 if ((opcode-STORE_SLICE) & 2)
1135 w = POP();
1136 else
1137 w = NULL;
1138 if ((opcode-STORE_SLICE) & 1)
1139 v = POP();
1140 else
1141 v = NULL;
1142 u = POP();
1143 t = POP();
1144 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +00001145 Py_DECREF(t);
1146 Py_DECREF(u);
1147 Py_XDECREF(v);
1148 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001149 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001150 break;
1151
1152 case DELETE_SLICE+0:
1153 case DELETE_SLICE+1:
1154 case DELETE_SLICE+2:
1155 case DELETE_SLICE+3:
1156 if ((opcode-DELETE_SLICE) & 2)
1157 w = POP();
1158 else
1159 w = NULL;
1160 if ((opcode-DELETE_SLICE) & 1)
1161 v = POP();
1162 else
1163 v = NULL;
1164 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001165 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +00001166 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00001167 Py_DECREF(u);
1168 Py_XDECREF(v);
1169 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001170 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001171 break;
1172
1173 case STORE_SUBSCR:
1174 w = POP();
1175 v = POP();
1176 u = POP();
1177 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +00001178 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001179 Py_DECREF(u);
1180 Py_DECREF(v);
1181 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001182 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001183 break;
1184
1185 case DELETE_SUBSCR:
1186 w = POP();
1187 v = POP();
1188 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001189 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001190 Py_DECREF(v);
1191 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001192 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001193 break;
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001194
Guido van Rossum374a9221991-04-04 10:40:29 +00001195 case PRINT_EXPR:
1196 v = POP();
Guido van Rossumaa06b0e1997-12-26 22:15:57 +00001197 /* Print value except if None */
1198 /* After printing, also assign to '_' */
1199 /* Before, set '_' to None to avoid recursion */
Guido van Rossumb209a111997-04-29 18:18:01 +00001200 if (v != Py_None &&
Guido van Rossuma027efa1997-05-05 20:56:21 +00001201 (err = PyDict_SetItemString(
Guido van Rossumaa06b0e1997-12-26 22:15:57 +00001202 f->f_builtins, "_", Py_None)) == 0) {
Guido van Rossumbe270261997-05-22 22:26:18 +00001203 err = Py_FlushLine();
Guido van Rossumc12da691997-07-17 23:12:42 +00001204 if (err == 0) {
Guido van Rossumbe270261997-05-22 22:26:18 +00001205 x = PySys_GetObject("stdout");
Guido van Rossum8f183201997-12-31 05:53:15 +00001206 if (x == NULL) {
1207 PyErr_SetString(
1208 PyExc_RuntimeError,
1209 "lost sys.stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00001210 err = -1;
Guido van Rossum8f183201997-12-31 05:53:15 +00001211 }
Guido van Rossumbe270261997-05-22 22:26:18 +00001212 }
1213 if (err == 0)
1214 err = PyFile_WriteObject(v, x, 0);
1215 if (err == 0) {
1216 PyFile_SoftSpace(x, 1);
1217 err = Py_FlushLine();
1218 }
Guido van Rossumaa06b0e1997-12-26 22:15:57 +00001219 if (err == 0) {
1220 err = PyDict_SetItemString(
1221 f->f_builtins, "_", v);
1222 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001223 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001224 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001225 break;
1226
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001227 case PRINT_ITEM_TO:
1228 w = stream = POP();
1229 /* fall through to PRINT_ITEM */
1230
Guido van Rossum374a9221991-04-04 10:40:29 +00001231 case PRINT_ITEM:
1232 v = POP();
Barry Warsaw093abe02000-08-29 04:56:13 +00001233 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001234 w = PySys_GetObject("stdout");
1235 if (w == NULL) {
1236 PyErr_SetString(PyExc_RuntimeError,
1237 "lost sys.stdout");
1238 err = -1;
1239 }
Guido van Rossum8f183201997-12-31 05:53:15 +00001240 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001241 if (w != NULL && PyFile_SoftSpace(w, 1))
Guido van Rossumbe270261997-05-22 22:26:18 +00001242 err = PyFile_WriteString(" ", w);
1243 if (err == 0)
1244 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Guido van Rossumb209a111997-04-29 18:18:01 +00001245 if (err == 0 && PyString_Check(v)) {
Guido van Rossumc6004111993-11-05 10:22:19 +00001246 /* XXX move into writeobject() ? */
Guido van Rossumb209a111997-04-29 18:18:01 +00001247 char *s = PyString_AsString(v);
1248 int len = PyString_Size(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +00001249 if (len > 0 &&
1250 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +00001251 s[len-1] != ' ')
Guido van Rossumb209a111997-04-29 18:18:01 +00001252 PyFile_SoftSpace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001253 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001254 Py_DECREF(v);
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001255 Py_XDECREF(stream);
1256 stream = NULL;
1257 if (err == 0)
1258 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001259 break;
1260
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001261 case PRINT_NEWLINE_TO:
1262 w = stream = POP();
1263 /* fall through to PRINT_NEWLINE */
1264
Guido van Rossum374a9221991-04-04 10:40:29 +00001265 case PRINT_NEWLINE:
Barry Warsaw093abe02000-08-29 04:56:13 +00001266 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001267 w = PySys_GetObject("stdout");
1268 if (w == NULL)
1269 PyErr_SetString(PyExc_RuntimeError,
1270 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001271 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001272 if (w != NULL) {
1273 err = PyFile_WriteString("\n", w);
1274 if (err == 0)
1275 PyFile_SoftSpace(w, 0);
1276 }
1277 Py_XDECREF(stream);
1278 stream = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +00001279 break;
1280
Thomas Wouters434d0822000-08-24 20:11:32 +00001281
1282#ifdef CASE_TOO_BIG
1283 default: switch (opcode) {
1284#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001285 case BREAK_LOOP:
1286 why = WHY_BREAK;
1287 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001288
Guido van Rossumf10570b1995-07-07 22:53:21 +00001289 case RAISE_VARARGS:
1290 u = v = w = NULL;
1291 switch (oparg) {
1292 case 3:
1293 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001294 /* Fallthrough */
1295 case 2:
1296 v = POP(); /* value */
1297 /* Fallthrough */
1298 case 1:
1299 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001300 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001301 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001302 break;
1303 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001304 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001305 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001306 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001307 break;
1308 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001309 break;
1310
1311 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001312 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001313 PyErr_SetString(PyExc_SystemError,
1314 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001315 break;
1316 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001317 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001318 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001319 break;
1320
1321 case RETURN_VALUE:
1322 retval = POP();
1323 why = WHY_RETURN;
1324 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001325
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001326 case EXEC_STMT:
1327 w = POP();
1328 v = POP();
1329 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001330 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001331 Py_DECREF(u);
1332 Py_DECREF(v);
1333 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001334 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001335
Guido van Rossum374a9221991-04-04 10:40:29 +00001336 case POP_BLOCK:
1337 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001338 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001339 while (STACK_LEVEL() > b->b_level) {
1340 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001341 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001342 }
1343 }
1344 break;
1345
1346 case END_FINALLY:
1347 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001348 if (PyInt_Check(v)) {
1349 why = (enum why_code) PyInt_AsLong(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001350 if (why == WHY_RETURN)
1351 retval = POP();
1352 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001353 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001354 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001355 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001356 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001357 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001358 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001359 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001360 else if (v != Py_None) {
1361 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001362 "'finally' pops bad exception");
1363 why = WHY_EXCEPTION;
1364 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001365 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001366 break;
1367
1368 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001369 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001370 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001371 w = POP();
1372 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001373 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001374 Py_DECREF(u);
1375 Py_DECREF(v);
1376 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001377 break;
1378
1379 case STORE_NAME:
1380 w = GETNAMEV(oparg);
1381 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001382 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001383 PyErr_SetString(PyExc_SystemError,
1384 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001385 break;
1386 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001387 err = PyDict_SetItem(x, w, v);
1388 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001389 break;
1390
1391 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001392 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001393 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001394 PyErr_SetString(PyExc_SystemError,
1395 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001396 break;
1397 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001398 if ((err = PyDict_DelItem(x, w)) != 0)
1399 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001400 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001401
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001402 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001403 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001404 if (PyTuple_Check(v)) {
1405 if (PyTuple_Size(v) != oparg) {
1406 PyErr_SetString(PyExc_ValueError,
1407 "unpack tuple of wrong size");
1408 why = WHY_EXCEPTION;
1409 }
1410 else {
1411 for (; --oparg >= 0; ) {
1412 w = PyTuple_GET_ITEM(v, oparg);
1413 Py_INCREF(w);
1414 PUSH(w);
1415 }
1416 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001417 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001418 else if (PyList_Check(v)) {
1419 if (PyList_Size(v) != oparg) {
1420 PyErr_SetString(PyExc_ValueError,
1421 "unpack list of wrong size");
1422 why = WHY_EXCEPTION;
1423 }
1424 else {
1425 for (; --oparg >= 0; ) {
1426 w = PyList_GET_ITEM(v, oparg);
1427 Py_INCREF(w);
1428 PUSH(w);
1429 }
1430 }
1431 }
1432 else if (PySequence_Check(v)) {
1433 if (unpack_sequence(v, oparg,
1434 stack_pointer + oparg))
1435 stack_pointer += oparg;
1436 else
1437 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001438 }
1439 else {
Barry Warsawe42b18f1997-08-25 22:13:04 +00001440 PyErr_SetString(PyExc_TypeError,
1441 "unpack non-sequence");
1442 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001443 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001444 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001445 break;
1446
1447 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001448 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001449 v = POP();
1450 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001451 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1452 Py_DECREF(v);
1453 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001454 break;
1455
1456 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001457 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001458 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001459 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1460 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001461 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001462 break;
1463
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001464 case STORE_GLOBAL:
1465 w = GETNAMEV(oparg);
1466 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001467 err = PyDict_SetItem(f->f_globals, w, v);
1468 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001469 break;
1470
1471 case DELETE_GLOBAL:
1472 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001473 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
1474 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001475 break;
1476
Guido van Rossum374a9221991-04-04 10:40:29 +00001477 case LOAD_CONST:
1478 x = GETCONST(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001479 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001480 PUSH(x);
1481 break;
1482
1483 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001484 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001485 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001486 PyErr_SetString(PyExc_SystemError,
1487 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001488 break;
1489 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001490 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001491 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001492 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001493 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001494 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001495 if (x == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001496 PyErr_SetObject(
1497 PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001498 break;
1499 }
1500 }
1501 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001502 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001503 PUSH(x);
1504 break;
1505
1506 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001507 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001508 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001509 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001510 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001511 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001512 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001513 break;
1514 }
1515 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001516 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001517 PUSH(x);
1518 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001519
Guido van Rossum9bfef441993-03-29 10:43:31 +00001520 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001521 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001522 if (x == NULL) {
Guido van Rossum87460821999-06-22 14:47:32 +00001523 PyErr_SetObject(PyExc_UnboundLocalError,
Guido van Rossumb209a111997-04-29 18:18:01 +00001524 PyTuple_GetItem(co->co_varnames,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001525 oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001526 break;
1527 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001528 Py_INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001529 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001530 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001531 break;
1532
1533 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001534 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001535 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001536 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001537
1538 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001539 x = GETLOCAL(oparg);
1540 if (x == NULL) {
Guido van Rossum87460821999-06-22 14:47:32 +00001541 PyErr_SetObject(PyExc_UnboundLocalError,
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001542 PyTuple_GetItem(co->co_varnames,
1543 oparg));
1544 break;
1545 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001546 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001547 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001548
1549 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001550 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001551 if (x != NULL) {
1552 for (; --oparg >= 0;) {
1553 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001554 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001555 }
1556 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001557 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001558 }
1559 break;
1560
1561 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001562 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001563 if (x != NULL) {
1564 for (; --oparg >= 0;) {
1565 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001566 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001567 }
1568 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001569 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001570 }
1571 break;
1572
1573 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001574 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001575 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001576 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001577 break;
1578
1579 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001580 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001581 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001582 x = PyObject_GetAttr(v, w);
1583 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001584 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001585 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001586 break;
1587
1588 case COMPARE_OP:
1589 w = POP();
1590 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +00001591 if (PyInt_Check(v) && PyInt_Check(w)) {
1592 /* INLINE: cmp(int, int) */
1593 register long a, b;
1594 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001595 a = PyInt_AS_LONG(v);
1596 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001597 switch (oparg) {
1598 case LT: res = a < b; break;
1599 case LE: res = a <= b; break;
1600 case EQ: res = a == b; break;
1601 case NE: res = a != b; break;
1602 case GT: res = a > b; break;
1603 case GE: res = a >= b; break;
1604 case IS: res = v == w; break;
1605 case IS_NOT: res = v != w; break;
1606 default: goto slow_compare;
1607 }
1608 x = res ? Py_True : Py_False;
1609 Py_INCREF(x);
1610 }
1611 else {
1612 slow_compare:
1613 x = cmp_outcome(oparg, v, w);
1614 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001615 Py_DECREF(v);
1616 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001617 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001618 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001619 break;
1620
1621 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001622 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001623 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001624 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001625 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001626 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001627 break;
1628 }
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00001629 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001630 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001631 w,
1632 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001633 f->f_locals == NULL ?
1634 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001635 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001636 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001637 if (w == NULL) {
1638 x = NULL;
1639 break;
1640 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001641 x = PyEval_CallObject(x, w);
1642 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001643 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001644 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001645 break;
1646
Thomas Wouters52152252000-08-17 22:55:00 +00001647 case IMPORT_STAR:
1648 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001649 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001650 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001651 PyErr_SetString(PyExc_SystemError,
1652 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001653 break;
1654 }
Thomas Wouters52152252000-08-17 22:55:00 +00001655 err = import_all_from(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001656 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00001657 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001658 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001659 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001660
Thomas Wouters52152252000-08-17 22:55:00 +00001661 case IMPORT_FROM:
1662 w = GETNAMEV(oparg);
1663 v = TOP();
1664 x = import_from(v, w);
1665 PUSH(x);
1666 if (x != NULL) continue;
1667 break;
1668
Guido van Rossum374a9221991-04-04 10:40:29 +00001669 case JUMP_FORWARD:
1670 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001671 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001672
1673 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001674 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001675 if (err > 0)
1676 err = 0;
1677 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001678 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001679 else
1680 break;
1681 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001682
1683 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001684 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001685 if (err > 0) {
1686 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001687 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001688 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001689 else if (err == 0)
1690 ;
1691 else
1692 break;
1693 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001694
1695 case JUMP_ABSOLUTE:
1696 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001697 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001698
1699 case FOR_LOOP:
1700 /* for v in s: ...
1701 On entry: stack contains s, i.
1702 On exit: stack contains s, i+1, s[i];
1703 but if loop exhausted:
1704 s, i are popped, and we jump */
1705 w = POP(); /* Loop index */
1706 v = POP(); /* Sequence object */
1707 u = loop_subscript(v, w);
1708 if (u != NULL) {
1709 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001710 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001711 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001712 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001713 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001714 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001715 }
1716 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001717 Py_DECREF(v);
1718 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001719 /* A NULL can mean "s exhausted"
1720 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001721 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001722 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001723 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001724 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001725 continue;
1726 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001727 }
1728 break;
1729
1730 case SETUP_LOOP:
1731 case SETUP_EXCEPT:
1732 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001733 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Guido van Rossum374a9221991-04-04 10:40:29 +00001734 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001735 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001736
1737 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001738#ifdef LLTRACE
1739 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001740 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001741#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001742 f->f_lineno = oparg;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001743 if (f->f_trace == NULL)
1744 continue;
1745 /* Trace each line of code reached */
1746 f->f_lasti = INSTR_OFFSET();
1747 err = call_trace(&f->f_trace, &f->f_trace,
Guido van Rossumb209a111997-04-29 18:18:01 +00001748 f, "line", Py_None);
Guido van Rossum374a9221991-04-04 10:40:29 +00001749 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001750
1751 case CALL_FUNCTION:
Jeremy Hylton76901512000-03-28 23:49:17 +00001752 case CALL_FUNCTION_VAR:
1753 case CALL_FUNCTION_KW:
1754 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00001755 {
Jeremy Hylton76901512000-03-28 23:49:17 +00001756 int na = oparg & 0xff;
1757 int nk = (oparg>>8) & 0xff;
1758 int flags = (opcode - CALL_FUNCTION) & 3;
1759 int n = na + 2*nk + (flags & 1) + ((flags >> 1) & 1);
1760 PyObject **pfunc = stack_pointer - n - 1;
1761 PyObject *func = *pfunc;
1762 PyObject *self = NULL;
1763 PyObject *class = NULL;
1764 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
1765 if (PyMethod_Check(func)) {
1766 self = PyMethod_Self(func);
1767 class = PyMethod_Class(func);
1768 func = PyMethod_Function(func);
1769 Py_INCREF(func);
1770 if (self != NULL) {
1771 Py_INCREF(self);
1772 Py_DECREF(*pfunc);
1773 *pfunc = self;
1774 na++;
1775 n++;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001776 }
1777 else {
Jeremy Hylton76901512000-03-28 23:49:17 +00001778 /* Unbound methods must be called with an
1779 instance of the class (or a derived
1780 class) as first argument */
1781 if (na > 0 && (self = stack_pointer[-n]) != NULL
1782 && PyInstance_Check(self)
1783 && PyClass_IsSubclass((PyObject *)
1784 (((PyInstanceObject *)self)->in_class),
1785 class))
1786 /* Handy-dandy */ ;
1787 else {
1788 PyErr_SetString(PyExc_TypeError,
1789 "unbound method must be called with class instance 1st argument");
1790 x = NULL;
1791 break;
1792 }
1793 }
1794 }
1795 else
1796 Py_INCREF(func);
1797 if (PyFunction_Check(func) && flags == 0) {
1798 PyObject *co = PyFunction_GetCode(func);
1799 PyObject *globals = PyFunction_GetGlobals(func);
1800 PyObject *argdefs = PyFunction_GetDefaults(func);
1801 PyObject **d;
1802 int nd;
1803 if (argdefs != NULL) {
1804 d = &PyTuple_GET_ITEM(argdefs, 0);
1805 nd = ((PyTupleObject *)argdefs)->ob_size;
1806 }
1807 else {
1808 d = NULL;
1809 nd = 0;
1810 }
1811 x = eval_code2((PyCodeObject *)co, globals,
1812 (PyObject *)NULL, stack_pointer-n, na,
1813 stack_pointer-2*nk, nk, d, nd,
1814 class);
1815 }
1816 else {
1817 int nstar = 0;
Jeremy Hylton387b1012000-03-31 01:22:54 +00001818 PyObject *callargs;
Jeremy Hylton76901512000-03-28 23:49:17 +00001819 PyObject *stararg = 0;
1820 PyObject *kwdict = NULL;
1821 if (flags & 2) {
1822 kwdict = POP();
1823 if (!PyDict_Check(kwdict)) {
1824 PyErr_SetString(PyExc_TypeError,
1825 "** argument must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00001826 goto extcall_fail;
Jeremy Hylton76901512000-03-28 23:49:17 +00001827 }
1828 }
1829 if (flags & 1) {
1830 stararg = POP();
1831 if (!PySequence_Check(stararg)) {
1832 PyErr_SetString(PyExc_TypeError,
1833 "* argument must be a sequence");
Guido van Rossum25826c92000-04-21 21:17:39 +00001834 goto extcall_fail;
Jeremy Hylton76901512000-03-28 23:49:17 +00001835 }
Jeremy Hylton074c3e62000-03-30 23:55:31 +00001836 /* Convert abstract sequence to concrete tuple */
1837 if (!PyTuple_Check(stararg)) {
1838 PyObject *t = NULL;
1839 t = PySequence_Tuple(stararg);
1840 if (t == NULL) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001841 goto extcall_fail;
Jeremy Hylton074c3e62000-03-30 23:55:31 +00001842 }
1843 Py_DECREF(stararg);
1844 stararg = t;
1845 }
1846 nstar = PyTuple_GET_SIZE(stararg);
Barry Warsaw4961ef72000-03-29 18:30:03 +00001847 if (nstar < 0) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001848 goto extcall_fail;
Barry Warsaw4961ef72000-03-29 18:30:03 +00001849 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001850 }
1851 if (nk > 0) {
1852 if (kwdict == NULL) {
1853 kwdict = PyDict_New();
1854 if (kwdict == NULL) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001855 goto extcall_fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001856 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001857 }
Jeremy Hylton074c3e62000-03-30 23:55:31 +00001858 else {
1859 PyObject *d = PyDict_Copy(kwdict);
1860 if (d == NULL) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001861 goto extcall_fail;
Jeremy Hylton074c3e62000-03-30 23:55:31 +00001862 }
1863 Py_DECREF(kwdict);
1864 kwdict = d;
1865 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001866 err = 0;
1867 while (--nk >= 0) {
1868 PyObject *value = POP();
1869 PyObject *key = POP();
1870 if (PyDict_GetItem(kwdict, key) != NULL) {
1871 err = 1;
1872 PyErr_Format(PyExc_TypeError,
1873 "keyword parameter redefined: %.400s",
1874 PyString_AsString(key));
Jeremy Hylton387b1012000-03-31 01:22:54 +00001875 Py_DECREF(key);
1876 Py_DECREF(value);
Guido van Rossum25826c92000-04-21 21:17:39 +00001877 goto extcall_fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001878 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001879 err = PyDict_SetItem(kwdict, key, value);
1880 Py_DECREF(key);
1881 Py_DECREF(value);
1882 if (err)
1883 break;
1884 }
1885 if (err) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001886 extcall_fail:
1887 Py_XDECREF(kwdict);
1888 Py_XDECREF(stararg);
1889 Py_DECREF(func);
1890 x=NULL;
Jeremy Hylton76901512000-03-28 23:49:17 +00001891 break;
1892 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001893 }
Jeremy Hylton387b1012000-03-31 01:22:54 +00001894 callargs = PyTuple_New(na + nstar);
1895 if (callargs == NULL) {
Jeremy Hylton76901512000-03-28 23:49:17 +00001896 x = NULL;
1897 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001898 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001899 if (stararg) {
Jeremy Hylton76901512000-03-28 23:49:17 +00001900 int i;
Jeremy Hylton76901512000-03-28 23:49:17 +00001901 for (i = 0; i < nstar; i++) {
1902 PyObject *a = PyTuple_GET_ITEM(stararg, i);
1903 Py_INCREF(a);
Jeremy Hylton387b1012000-03-31 01:22:54 +00001904 PyTuple_SET_ITEM(callargs, na + i, a);
Jeremy Hylton76901512000-03-28 23:49:17 +00001905 }
1906 Py_DECREF(stararg);
1907 }
1908 while (--na >= 0) {
1909 w = POP();
Jeremy Hylton387b1012000-03-31 01:22:54 +00001910 PyTuple_SET_ITEM(callargs, na, w);
Jeremy Hylton76901512000-03-28 23:49:17 +00001911 }
Jeremy Hylton387b1012000-03-31 01:22:54 +00001912 x = PyEval_CallObjectWithKeywords(func,
1913 callargs,
1914 kwdict);
1915 Py_DECREF(callargs);
Jeremy Hylton76901512000-03-28 23:49:17 +00001916 Py_XDECREF(kwdict);
1917 }
1918 Py_DECREF(func);
1919 while (stack_pointer > pfunc) {
1920 w = POP();
1921 Py_DECREF(w);
1922 }
1923 PUSH(x);
1924 if (x != NULL) continue;
1925 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001926 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001927
Guido van Rossum681d79a1995-07-18 14:51:37 +00001928 case MAKE_FUNCTION:
1929 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00001930 x = PyFunction_New(v, f->f_globals);
1931 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001932 /* XXX Maybe this should be a separate opcode? */
1933 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001934 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001935 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001936 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001937 x = NULL;
1938 break;
1939 }
1940 while (--oparg >= 0) {
1941 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001942 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001943 }
1944 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001945 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001946 }
1947 PUSH(x);
1948 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001949
1950 case BUILD_SLICE:
1951 if (oparg == 3)
1952 w = POP();
1953 else
1954 w = NULL;
1955 v = POP();
1956 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00001957 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001958 Py_DECREF(u);
1959 Py_DECREF(v);
1960 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00001961 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001962 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00001963 break;
1964
Fred Drakeef8ace32000-08-24 00:32:09 +00001965 case EXTENDED_ARG:
1966 opcode = NEXTOP();
1967 oparg = oparg<<16 | NEXTARG();
1968 goto dispatch_opcode;
1969 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001970
Guido van Rossum374a9221991-04-04 10:40:29 +00001971 default:
1972 fprintf(stderr,
1973 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001974 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00001975 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00001976 why = WHY_EXCEPTION;
1977 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001978
1979#ifdef CASE_TOO_BIG
1980 }
1981#endif
1982
Guido van Rossum374a9221991-04-04 10:40:29 +00001983 } /* switch */
1984
1985 on_error:
1986
1987 /* Quickly continue if no error occurred */
1988
1989 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001990 if (err == 0 && x != NULL) {
1991#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00001992 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00001993 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00001994 fprintf(stderr,
1995 "XXX undetected error\n");
1996 else
1997#endif
1998 continue; /* Normal, fast path */
1999 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002000 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00002001 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00002002 err = 0;
2003 }
2004
Guido van Rossum374a9221991-04-04 10:40:29 +00002005 /* Double-check exception status */
2006
2007 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002008 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002009 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002010 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00002011 why = WHY_EXCEPTION;
2012 }
2013 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002014#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00002015 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002016 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002017 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002018 fprintf(stderr,
2019 "XXX undetected error (why=%d)\n",
2020 why);
2021 why = WHY_EXCEPTION;
2022 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002023 }
2024#endif
2025
2026 /* Log traceback info if this is a real exception */
2027
2028 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002029 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00002030 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00002031 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00002032 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002033
Guido van Rossume59214e1994-08-30 08:01:59 +00002034 if (f->f_trace)
2035 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002036 if (tstate->sys_profilefunc)
2037 call_exc_trace(&tstate->sys_profilefunc,
2038 (PyObject**)0, f);
Guido van Rossum014518f1998-11-23 21:09:51 +00002039 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002040
2041 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
2042
2043 if (why == WHY_RERAISE)
2044 why = WHY_EXCEPTION;
2045
2046 /* Unwind stacks if a (pseudo) exception occurred */
2047
2048 while (why != WHY_NOT && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002049 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00002050 while (STACK_LEVEL() > b->b_level) {
2051 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002052 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002053 }
2054 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2055 why = WHY_NOT;
2056 JUMPTO(b->b_handler);
2057 break;
2058 }
2059 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00002060 (b->b_type == SETUP_EXCEPT &&
2061 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002062 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002063 PyObject *exc, *val, *tb;
2064 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002065 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002066 val = Py_None;
2067 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00002068 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002069 /* Make the raw exception data
2070 available to the handler,
2071 so a program can emulate the
2072 Python main loop. Don't do
2073 this for 'finally'. */
2074 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00002075 PyErr_NormalizeException(
2076 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002077 set_exc_info(tstate,
2078 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002079 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002080 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002081 PUSH(val);
2082 PUSH(exc);
2083 }
2084 else {
2085 if (why == WHY_RETURN)
2086 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00002087 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00002088 PUSH(v);
2089 }
2090 why = WHY_NOT;
2091 JUMPTO(b->b_handler);
2092 break;
2093 }
2094 } /* unwind stack */
2095
2096 /* End the loop if we still have an error (or return) */
2097
2098 if (why != WHY_NOT)
2099 break;
2100
2101 } /* main loop */
2102
2103 /* Pop remaining stack entries */
2104
2105 while (!EMPTY()) {
2106 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002107 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002108 }
2109
Guido van Rossum96a42c81992-01-12 02:29:51 +00002110 if (why != WHY_RETURN)
2111 retval = NULL;
2112
Guido van Rossume59214e1994-08-30 08:01:59 +00002113 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002114 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00002115 if (call_trace(&f->f_trace, &f->f_trace, f,
2116 "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002117 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002118 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002119 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002120 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002121 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002122 }
2123
Guido van Rossuma027efa1997-05-05 20:56:21 +00002124 if (tstate->sys_profilefunc && why == WHY_RETURN) {
2125 if (call_trace(&tstate->sys_profilefunc, (PyObject**)0,
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002126 f, "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002127 Py_XDECREF(retval);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002128 retval = NULL;
2129 why = WHY_EXCEPTION;
2130 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002131 }
Guido van Rossuma4240131997-01-21 21:18:36 +00002132
Guido van Rossuma027efa1997-05-05 20:56:21 +00002133 reset_exc_info(tstate);
2134
2135 --tstate->recursion_depth;
Guido van Rossum8c5df061997-01-24 04:19:24 +00002136
2137 fail: /* Jump here from prelude on failure */
Guido van Rossum96a42c81992-01-12 02:29:51 +00002138
Guido van Rossum374a9221991-04-04 10:40:29 +00002139 /* Restore previous frame and release the current one */
Guido van Rossum681d79a1995-07-18 14:51:37 +00002140
Guido van Rossuma027efa1997-05-05 20:56:21 +00002141 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +00002142 Py_DECREF(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00002143
Guido van Rossum96a42c81992-01-12 02:29:51 +00002144 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00002145}
2146
Guido van Rossuma027efa1997-05-05 20:56:21 +00002147static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002148set_exc_info(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002149{
2150 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002151 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00002152
Guido van Rossuma027efa1997-05-05 20:56:21 +00002153 frame = tstate->frame;
2154 if (frame->f_exc_type == NULL) {
2155 /* This frame didn't catch an exception before */
2156 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002157 if (tstate->exc_type == NULL) {
2158 Py_INCREF(Py_None);
2159 tstate->exc_type = Py_None;
2160 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002161 tmp_type = frame->f_exc_type;
2162 tmp_value = frame->f_exc_value;
2163 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002164 Py_XINCREF(tstate->exc_type);
2165 Py_XINCREF(tstate->exc_value);
2166 Py_XINCREF(tstate->exc_traceback);
2167 frame->f_exc_type = tstate->exc_type;
2168 frame->f_exc_value = tstate->exc_value;
2169 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002170 Py_XDECREF(tmp_type);
2171 Py_XDECREF(tmp_value);
2172 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002173 }
2174 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002175 tmp_type = tstate->exc_type;
2176 tmp_value = tstate->exc_value;
2177 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002178 Py_XINCREF(type);
2179 Py_XINCREF(value);
2180 Py_XINCREF(tb);
2181 tstate->exc_type = type;
2182 tstate->exc_value = value;
2183 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002184 Py_XDECREF(tmp_type);
2185 Py_XDECREF(tmp_value);
2186 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002187 /* For b/w compatibility */
2188 PySys_SetObject("exc_type", type);
2189 PySys_SetObject("exc_value", value);
2190 PySys_SetObject("exc_traceback", tb);
2191}
2192
2193static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002194reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002195{
2196 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002197 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002198 frame = tstate->frame;
2199 if (frame->f_exc_type != NULL) {
2200 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002201 tmp_type = tstate->exc_type;
2202 tmp_value = tstate->exc_value;
2203 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002204 Py_XINCREF(frame->f_exc_type);
2205 Py_XINCREF(frame->f_exc_value);
2206 Py_XINCREF(frame->f_exc_traceback);
2207 tstate->exc_type = frame->f_exc_type;
2208 tstate->exc_value = frame->f_exc_value;
2209 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002210 Py_XDECREF(tmp_type);
2211 Py_XDECREF(tmp_value);
2212 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002213 /* For b/w compatibility */
2214 PySys_SetObject("exc_type", frame->f_exc_type);
2215 PySys_SetObject("exc_value", frame->f_exc_value);
2216 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
2217 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002218 tmp_type = frame->f_exc_type;
2219 tmp_value = frame->f_exc_value;
2220 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002221 frame->f_exc_type = NULL;
2222 frame->f_exc_value = NULL;
2223 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002224 Py_XDECREF(tmp_type);
2225 Py_XDECREF(tmp_value);
2226 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002227}
2228
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002229/* Logic for the raise statement (too complicated for inlining).
2230 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00002231static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002232do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002233{
Guido van Rossumd295f121998-04-09 21:39:57 +00002234 if (type == NULL) {
2235 /* Reraise */
2236 PyThreadState *tstate = PyThreadState_Get();
2237 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
2238 value = tstate->exc_value;
2239 tb = tstate->exc_traceback;
2240 Py_XINCREF(type);
2241 Py_XINCREF(value);
2242 Py_XINCREF(tb);
2243 }
2244
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002245 /* We support the following forms of raise:
2246 raise <class>, <classinstance>
2247 raise <class>, <argument tuple>
2248 raise <class>, None
2249 raise <class>, <argument>
2250 raise <classinstance>, None
2251 raise <string>, <object>
2252 raise <string>, None
2253
2254 An omitted second argument is the same as None.
2255
2256 In addition, raise <tuple>, <anything> is the same as
2257 raising the tuple's first item (and it better have one!);
2258 this rule is applied recursively.
2259
2260 Finally, an optional third argument can be supplied, which
2261 gives the traceback to be substituted (useful when
2262 re-raising an exception after examining it). */
2263
2264 /* First, check the traceback argument, replacing None with
2265 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002266 if (tb == Py_None) {
2267 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002268 tb = NULL;
2269 }
2270 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002271 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002272 "raise 3rd arg must be traceback or None");
2273 goto raise_error;
2274 }
2275
2276 /* Next, replace a missing value with None */
2277 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002278 value = Py_None;
2279 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002280 }
2281
2282 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002283 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2284 PyObject *tmp = type;
2285 type = PyTuple_GET_ITEM(type, 0);
2286 Py_INCREF(type);
2287 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002288 }
2289
Barry Warsaw4249f541997-08-22 21:26:19 +00002290 if (PyString_Check(type))
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002291 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002292
2293 else if (PyClass_Check(type))
2294 PyErr_NormalizeException(&type, &value, &tb);
2295
Guido van Rossumb209a111997-04-29 18:18:01 +00002296 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002297 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002298 if (value != Py_None) {
2299 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002300 "instance exception may not have a separate value");
2301 goto raise_error;
2302 }
2303 else {
2304 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002305 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002306 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002307 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2308 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002309 }
2310 }
2311 else {
2312 /* Not something you can raise. You get an exception
2313 anyway, just not what you specified :-) */
Guido van Rossumb209a111997-04-29 18:18:01 +00002314 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002315 "exceptions must be strings, classes, or instances");
2316 goto raise_error;
2317 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002318 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002319 if (tb == NULL)
2320 return WHY_EXCEPTION;
2321 else
2322 return WHY_RERAISE;
2323 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002324 Py_XDECREF(value);
2325 Py_XDECREF(type);
2326 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002327 return WHY_EXCEPTION;
2328}
2329
Barry Warsawe42b18f1997-08-25 22:13:04 +00002330static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002331unpack_sequence(PyObject *v, int argcnt, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00002332{
2333 int i;
2334 PyObject *w;
2335
2336 for (i = 0; i < argcnt; i++) {
2337 if (! (w = PySequence_GetItem(v, i))) {
2338 if (PyErr_ExceptionMatches(PyExc_IndexError))
2339 PyErr_SetString(PyExc_ValueError,
2340 "unpack sequence of wrong size");
2341 goto finally;
2342 }
2343 *--sp = w;
2344 }
2345 /* we better get an IndexError now */
2346 if (PySequence_GetItem(v, i) == NULL) {
2347 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
2348 PyErr_Clear();
2349 return 1;
2350 }
2351 /* some other exception occurred. fall through to finally */
2352 }
2353 else
2354 PyErr_SetString(PyExc_ValueError,
2355 "unpack sequence of wrong size");
2356 /* fall through */
2357finally:
Barry Warsaw91010551997-08-25 22:30:51 +00002358 for (; i > 0; i--, sp++)
2359 Py_DECREF(*sp);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002360
2361 return 0;
2362}
2363
2364
Guido van Rossum96a42c81992-01-12 02:29:51 +00002365#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002366static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002367prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002368{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002369 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002370 if (PyObject_Print(v, stdout, 0) != 0)
2371 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002372 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00002373 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002374}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002375#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002376
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002377static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002378call_exc_trace(PyObject **p_trace, PyObject **p_newtrace, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002379{
Guido van Rossumb209a111997-04-29 18:18:01 +00002380 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002381 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002382 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002383 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002384 value = Py_None;
2385 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002386 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002387 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002388 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002389 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002390 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002391 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002392 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002393 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002394 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002395 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002396 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002397 Py_XDECREF(type);
2398 Py_XDECREF(value);
2399 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002400 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002401}
2402
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002403/* PyObject **p_trace: in/out; may not be NULL;
2404 may not point to NULL variable initially
2405 PyObject **p_newtrace: in/out; may be NULL;
2406 may point to NULL variable;
2407 may be same variable as p_newtrace */
2408
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002409static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002410call_trace(PyObject **p_trace, PyObject **p_newtrace, PyFrameObject *f,
2411 char *msg, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002412{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002413 PyThreadState *tstate = f->f_tstate;
Guido van Rossumb209a111997-04-29 18:18:01 +00002414 PyObject *args, *what;
2415 PyObject *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002416
Guido van Rossuma027efa1997-05-05 20:56:21 +00002417 if (tstate->tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002418 /* Don't do recursive traces */
2419 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002420 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002421 *p_newtrace = NULL;
2422 }
2423 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002424 }
2425
Guido van Rossumb209a111997-04-29 18:18:01 +00002426 args = PyTuple_New(3);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002427 if (args == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002428 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002429 what = PyString_FromString(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002430 if (what == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002431 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002432 Py_INCREF(f);
2433 PyTuple_SET_ITEM(args, 0, (PyObject *)f);
2434 PyTuple_SET_ITEM(args, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002435 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002436 arg = Py_None;
2437 Py_INCREF(arg);
2438 PyTuple_SET_ITEM(args, 2, arg);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002439 tstate->tracing++;
Guido van Rossumb209a111997-04-29 18:18:01 +00002440 PyFrame_FastToLocals(f);
2441 res = PyEval_CallObject(*p_trace, args); /* May clear *p_trace! */
2442 PyFrame_LocalsToFast(f, 1);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002443 tstate->tracing--;
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002444 cleanup:
Guido van Rossumb209a111997-04-29 18:18:01 +00002445 Py_XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002446 if (res == NULL) {
2447 /* The trace proc raised an exception */
Guido van Rossumb209a111997-04-29 18:18:01 +00002448 PyTraceBack_Here(f);
2449 Py_XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002450 *p_trace = NULL;
2451 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002452 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002453 *p_newtrace = NULL;
2454 }
Barry Warsawf6202631999-09-08 16:26:33 +00002455 /* to be extra double plus sure we don't get recursive
2456 * calls inf either tracefunc or profilefunc gets an
2457 * exception, zap the global variables.
2458 */
2459 Py_XDECREF(tstate->sys_tracefunc);
2460 tstate->sys_tracefunc = NULL;
2461 Py_XDECREF(tstate->sys_profilefunc);
2462 tstate->sys_profilefunc = NULL;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002463 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002464 }
2465 else {
2466 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002467 Py_XDECREF(*p_newtrace);
2468 if (res == Py_None)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002469 *p_newtrace = NULL;
2470 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002471 Py_INCREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002472 *p_newtrace = res;
2473 }
2474 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002475 Py_DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002476 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002477 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002478}
2479
Guido van Rossumb209a111997-04-29 18:18:01 +00002480PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002481PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002482{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002483 PyThreadState *tstate = PyThreadState_Get();
2484 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002485 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002486 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002487 else
2488 return current_frame->f_builtins;
2489}
2490
Guido van Rossumb209a111997-04-29 18:18:01 +00002491PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002492PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00002493{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002494 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002495 if (current_frame == NULL)
2496 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002497 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002498 return current_frame->f_locals;
2499}
2500
Guido van Rossumb209a111997-04-29 18:18:01 +00002501PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002502PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002503{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002504 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002505 if (current_frame == NULL)
2506 return NULL;
2507 else
2508 return current_frame->f_globals;
2509}
2510
Guido van Rossumb209a111997-04-29 18:18:01 +00002511PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002512PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00002513{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002514 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002515 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002516}
2517
Guido van Rossum6135a871995-01-09 17:53:26 +00002518int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002519PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002520{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002521 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002522 return current_frame == NULL ? 0 : current_frame->f_restricted;
2523}
2524
Guido van Rossumbe270261997-05-22 22:26:18 +00002525int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002526Py_FlushLine(void)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002527{
Guido van Rossumb209a111997-04-29 18:18:01 +00002528 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002529 if (f == NULL)
2530 return 0;
2531 if (!PyFile_SoftSpace(f, 0))
2532 return 0;
2533 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002534}
2535
Guido van Rossum3f5da241990-12-20 15:06:42 +00002536
Guido van Rossum681d79a1995-07-18 14:51:37 +00002537/* External interface to call any callable object.
2538 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002539
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002540#undef PyEval_CallObject
2541/* for backward compatibility: export this interface */
2542
Guido van Rossumb209a111997-04-29 18:18:01 +00002543PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002544PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002545{
Guido van Rossumb209a111997-04-29 18:18:01 +00002546 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002547}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002548#define PyEval_CallObject(func,arg) \
2549 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00002550
Guido van Rossumb209a111997-04-29 18:18:01 +00002551PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002552PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002553{
2554 ternaryfunc call;
Guido van Rossumb209a111997-04-29 18:18:01 +00002555 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002556
2557 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002558 arg = PyTuple_New(0);
2559 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002560 PyErr_SetString(PyExc_TypeError,
2561 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002562 return NULL;
2563 }
2564 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002565 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002566
Guido van Rossumb209a111997-04-29 18:18:01 +00002567 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002568 PyErr_SetString(PyExc_TypeError,
2569 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00002570 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00002571 return NULL;
2572 }
2573
Guido van Rossum150b2df1996-12-05 23:17:11 +00002574 if ((call = func->ob_type->tp_call) != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002575 result = (*call)(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002576 else if (PyMethod_Check(func) || PyFunction_Check(func))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002577 result = call_function(func, arg, kw);
2578 else
2579 result = call_builtin(func, arg, kw);
2580
Guido van Rossumb209a111997-04-29 18:18:01 +00002581 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002582
Guido van Rossumb209a111997-04-29 18:18:01 +00002583 if (result == NULL && !PyErr_Occurred())
2584 PyErr_SetString(PyExc_SystemError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002585 "NULL result without error in call_object");
Guido van Rossume59214e1994-08-30 08:01:59 +00002586
2587 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002588}
2589
Guido van Rossumb209a111997-04-29 18:18:01 +00002590static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002591call_builtin(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002592{
Guido van Rossumb209a111997-04-29 18:18:01 +00002593 if (PyCFunction_Check(func)) {
2594 PyCFunction meth = PyCFunction_GetFunction(func);
2595 PyObject *self = PyCFunction_GetSelf(func);
2596 int flags = PyCFunction_GetFlags(func);
Guido van Rossumff8b4941995-07-26 18:16:42 +00002597 if (!(flags & METH_VARARGS)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002598 int size = PyTuple_Size(arg);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002599 if (size == 1)
Guido van Rossumb209a111997-04-29 18:18:01 +00002600 arg = PyTuple_GET_ITEM(arg, 0);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002601 else if (size == 0)
2602 arg = NULL;
2603 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002604 if (flags & METH_KEYWORDS)
2605 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002606 if (kw != NULL && PyDict_Size(kw) != 0) {
2607 PyErr_SetString(PyExc_TypeError,
Guido van Rossumff8b4941995-07-26 18:16:42 +00002608 "this function takes no keyword arguments");
2609 return NULL;
2610 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002611 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002612 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002613 if (PyClass_Check(func)) {
2614 return PyInstance_New(func, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002615 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002616 if (PyInstance_Check(func)) {
2617 PyObject *res, *call = PyObject_GetAttrString(func,"__call__");
Guido van Rossume59214e1994-08-30 08:01:59 +00002618 if (call == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002619 PyErr_Clear();
2620 PyErr_SetString(PyExc_AttributeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002621 "no __call__ method defined");
Guido van Rossume59214e1994-08-30 08:01:59 +00002622 return NULL;
2623 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002624 res = PyEval_CallObjectWithKeywords(call, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002625 Py_DECREF(call);
Guido van Rossume59214e1994-08-30 08:01:59 +00002626 return res;
2627 }
Guido van Rossumba98a421999-11-15 19:29:33 +00002628 PyErr_Format(PyExc_TypeError, "call of non-function (type %.400s)",
Guido van Rossum2d1ad391998-08-25 18:16:54 +00002629 func->ob_type->tp_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002630 return NULL;
2631}
2632
Guido van Rossumb209a111997-04-29 18:18:01 +00002633static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002634call_function(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002635{
Guido van Rossumb209a111997-04-29 18:18:01 +00002636 PyObject *class = NULL; /* == owner */
2637 PyObject *argdefs;
2638 PyObject **d, **k;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002639 int nk, nd;
Guido van Rossumb209a111997-04-29 18:18:01 +00002640 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002641
Guido van Rossumb209a111997-04-29 18:18:01 +00002642 if (kw != NULL && !PyDict_Check(kw)) {
2643 PyErr_BadInternalCall();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002644 return NULL;
2645 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002646
Guido van Rossumb209a111997-04-29 18:18:01 +00002647 if (PyMethod_Check(func)) {
2648 PyObject *self = PyMethod_Self(func);
2649 class = PyMethod_Class(func);
2650 func = PyMethod_Function(func);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002651 if (self == NULL) {
2652 /* Unbound methods must be called with an instance of
2653 the class (or a derived class) as first argument */
Guido van Rossumb209a111997-04-29 18:18:01 +00002654 if (PyTuple_Size(arg) >= 1) {
2655 self = PyTuple_GET_ITEM(arg, 0);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002656 if (self != NULL &&
Guido van Rossumb209a111997-04-29 18:18:01 +00002657 PyInstance_Check(self) &&
2658 PyClass_IsSubclass((PyObject *)
2659 (((PyInstanceObject *)self)->in_class),
Guido van Rossumb3f72581993-05-21 19:56:10 +00002660 class))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002661 /* Handy-dandy */ ;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002662 else
2663 self = NULL;
2664 }
2665 if (self == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002666 PyErr_SetString(PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002667 "unbound method must be called with class instance 1st argument");
Guido van Rossumb3f72581993-05-21 19:56:10 +00002668 return NULL;
2669 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002670 Py_INCREF(arg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002671 }
2672 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002673 int argcount = PyTuple_Size(arg);
2674 PyObject *newarg = PyTuple_New(argcount + 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002675 int i;
Guido van Rossum81daa321993-05-20 14:24:46 +00002676 if (newarg == NULL)
2677 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002678 Py_INCREF(self);
2679 PyTuple_SET_ITEM(newarg, 0, self);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002680 for (i = 0; i < argcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002681 PyObject *v = PyTuple_GET_ITEM(arg, i);
2682 Py_XINCREF(v);
2683 PyTuple_SET_ITEM(newarg, i+1, v);
Guido van Rossum81daa321993-05-20 14:24:46 +00002684 }
2685 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002686 }
Guido van Rossum7859f871998-07-08 14:58:16 +00002687 if (!PyFunction_Check(func)) {
2688 result = PyEval_CallObjectWithKeywords(func, arg, kw);
2689 Py_DECREF(arg);
2690 return result;
2691 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002692 }
2693 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002694 if (!PyFunction_Check(func)) {
Guido van Rossum2d1ad391998-08-25 18:16:54 +00002695 PyErr_Format(PyExc_TypeError,
Guido van Rossum5db862d2000-04-10 12:46:51 +00002696 "call of non-function (type %.200s)",
Guido van Rossum2d1ad391998-08-25 18:16:54 +00002697 func->ob_type->tp_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002698 return NULL;
2699 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002700 Py_INCREF(arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002701 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002702
2703 argdefs = PyFunction_GetDefaults(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00002704 if (argdefs != NULL && PyTuple_Check(argdefs)) {
2705 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
2706 nd = PyTuple_Size(argdefs);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002707 }
2708 else {
2709 d = NULL;
2710 nd = 0;
2711 }
2712
2713 if (kw != NULL) {
2714 int pos, i;
Guido van Rossumb209a111997-04-29 18:18:01 +00002715 nk = PyDict_Size(kw);
2716 k = PyMem_NEW(PyObject *, 2*nk);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002717 if (k == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002718 PyErr_NoMemory();
2719 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002720 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00002721 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002722 pos = i = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00002723 while (PyDict_Next(kw, &pos, &k[i], &k[i+1]))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002724 i += 2;
2725 nk = i/2;
2726 /* XXX This is broken if the caller deletes dict items! */
2727 }
2728 else {
2729 k = NULL;
2730 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00002731 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002732
Guido van Rossum681d79a1995-07-18 14:51:37 +00002733 result = eval_code2(
Guido van Rossumb209a111997-04-29 18:18:01 +00002734 (PyCodeObject *)PyFunction_GetCode(func),
2735 PyFunction_GetGlobals(func), (PyObject *)NULL,
2736 &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg),
Guido van Rossum681d79a1995-07-18 14:51:37 +00002737 k, nk,
2738 d, nd,
2739 class);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002740
Guido van Rossumb209a111997-04-29 18:18:01 +00002741 Py_DECREF(arg);
Guido van Rossumb18618d2000-05-03 23:44:39 +00002742 if (k != NULL)
2743 PyMem_DEL(k);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002744
Guido van Rossum681d79a1995-07-18 14:51:37 +00002745 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002746}
2747
Guido van Rossum3b9c6671996-07-30 18:40:29 +00002748#define SLICE_ERROR_MSG \
2749 "standard sequence type does not support step size other than one"
2750
Guido van Rossumb209a111997-04-29 18:18:01 +00002751static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002752loop_subscript(PyObject *v, PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002753{
Guido van Rossumb209a111997-04-29 18:18:01 +00002754 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00002755 int i;
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00002756 if (sq == NULL || sq->sq_item == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002757 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002758 return NULL;
2759 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002760 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00002761 v = (*sq->sq_item)(v, i);
2762 if (v)
2763 return v;
Barry Warsaw4249f541997-08-22 21:26:19 +00002764 if (PyErr_ExceptionMatches(PyExc_IndexError))
Guido van Rossumb209a111997-04-29 18:18:01 +00002765 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00002766 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002767}
2768
Guido van Rossum20c6add2000-05-08 14:06:50 +00002769/* Extract a slice index from a PyInt or PyLong, the index is bound to
2770 the range [-INT_MAX+1, INTMAX]. Returns 0 and an exception if there is
2771 and error. Returns 1 on success.*/
2772
2773int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002774_PyEval_SliceIndex(PyObject *v, int *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002775{
2776 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002777 long x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00002778 if (PyInt_Check(v)) {
2779 x = PyInt_AsLong(v);
2780 } else if (PyLong_Check(v)) {
2781 x = PyLong_AsLong(v);
2782 if (x==-1 && PyErr_Occurred()) {
2783 PyObject *long_zero;
2784
2785 if (!PyErr_ExceptionMatches( PyExc_OverflowError ) ) {
2786 /* It's not an overflow error, so just
2787 signal an error */
Guido van Rossum20c6add2000-05-08 14:06:50 +00002788 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00002789 }
2790
2791 /* It's an overflow error, so we need to
2792 check the sign of the long integer,
2793 set the value to INT_MAX or 0, and clear
2794 the error. */
2795
2796 /* Create a long integer with a value of 0 */
2797 long_zero = PyLong_FromLong( 0L );
Guido van Rossum20c6add2000-05-08 14:06:50 +00002798 if (long_zero == NULL) return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00002799
2800 /* Check sign */
2801 if (PyObject_Compare(long_zero, v) < 0)
2802 x = INT_MAX;
2803 else
2804 x = 0;
2805
2806 /* Free the long integer we created, and clear the
2807 OverflowError */
2808 Py_DECREF(long_zero);
2809 PyErr_Clear();
2810 }
2811 } else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002812 PyErr_SetString(PyExc_TypeError,
2813 "slice index must be int");
Guido van Rossum20c6add2000-05-08 14:06:50 +00002814 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002815 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00002816 /* Truncate -- very long indices are truncated anyway */
2817 if (x > INT_MAX)
2818 x = INT_MAX;
2819 else if (x < -INT_MAX)
2820 x = 0;
2821 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002822 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00002823 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002824}
2825
Guido van Rossumb209a111997-04-29 18:18:01 +00002826static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002827apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002828{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002829 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00002830 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002831 return NULL;
Guido van Rossum20c6add2000-05-08 14:06:50 +00002832 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum04691fc1992-08-12 15:35:34 +00002833 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002834 return PySequence_GetSlice(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002835}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002836
2837static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002838assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002839{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002840 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00002841 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum3f5da241990-12-20 15:06:42 +00002842 return -1;
Guido van Rossum20c6add2000-05-08 14:06:50 +00002843 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum3f5da241990-12-20 15:06:42 +00002844 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002845 if (x == NULL)
2846 return PySequence_DelSlice(u, ilow, ihigh);
2847 else
2848 return PySequence_SetSlice(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002849}
2850
Guido van Rossumb209a111997-04-29 18:18:01 +00002851static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002852cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002853{
2854 register int cmp;
2855 register int res = 0;
2856 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002857 case IS:
2858 case IS_NOT:
2859 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002860 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002861 res = !res;
2862 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002863 case IN:
2864 case NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00002865 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002866 if (res < 0)
2867 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002868 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002869 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002870 break;
2871 case EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00002872 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002873 break;
2874 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00002875 cmp = PyObject_Compare(v, w);
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002876 if (cmp && PyErr_Occurred())
2877 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002878 switch (op) {
2879 case LT: res = cmp < 0; break;
2880 case LE: res = cmp <= 0; break;
2881 case EQ: res = cmp == 0; break;
2882 case NE: res = cmp != 0; break;
2883 case GT: res = cmp > 0; break;
2884 case GE: res = cmp >= 0; break;
2885 /* XXX no default? (res is initialized to 0 though) */
2886 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002887 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002888 v = res ? Py_True : Py_False;
2889 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002890 return v;
2891}
2892
Thomas Wouters52152252000-08-17 22:55:00 +00002893static PyObject *
2894import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00002895{
Guido van Rossumb209a111997-04-29 18:18:01 +00002896 PyObject *w, *x;
2897 if (!PyModule_Check(v)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002898 PyErr_SetString(PyExc_TypeError,
2899 "import-from requires module object");
Thomas Wouters52152252000-08-17 22:55:00 +00002900 return NULL;
2901 }
2902 w = PyModule_GetDict(v); /* TDB: can this not fail ? */
2903 x = PyDict_GetItem(w, name);
2904 if (x == NULL) {
2905 PyErr_Format(PyExc_ImportError,
2906 "cannot import name %.230s",
2907 PyString_AsString(name));
2908 } else
2909 Py_INCREF(x);
2910 return x;
2911}
2912
2913static int
2914import_all_from(PyObject *locals, PyObject *v)
2915{
2916 int pos = 0, err;
2917 PyObject *name, *value;
2918 PyObject *w;
2919
2920 if (!PyModule_Check(v)) {
2921 PyErr_SetString(PyExc_TypeError,
2922 "import-from requires module object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002923 return -1;
2924 }
Thomas Wouters52152252000-08-17 22:55:00 +00002925 w = PyModule_GetDict(v); /* TBD: can this not fail ? */
2926
2927 while (PyDict_Next(w, &pos, &name, &value)) {
2928 if (!PyString_Check(name) ||
2929 PyString_AsString(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002930 continue;
Thomas Wouters52152252000-08-17 22:55:00 +00002931 Py_INCREF(value);
2932 err = PyDict_SetItem(locals, name, value);
2933 Py_DECREF(value);
2934 if (err != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002935 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002936 }
Thomas Wouters52152252000-08-17 22:55:00 +00002937 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002938}
2939
Guido van Rossumb209a111997-04-29 18:18:01 +00002940static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002941build_class(PyObject *methods, PyObject *bases, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00002942{
Guido van Rossumcd649651997-08-22 16:56:16 +00002943 int i, n;
Guido van Rossumb209a111997-04-29 18:18:01 +00002944 if (!PyTuple_Check(bases)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002945 PyErr_SetString(PyExc_SystemError,
2946 "build_class with non-tuple bases");
Guido van Rossum25831651993-05-19 14:50:45 +00002947 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002948 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002949 if (!PyDict_Check(methods)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002950 PyErr_SetString(PyExc_SystemError,
2951 "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002952 return NULL;
2953 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002954 if (!PyString_Check(name)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002955 PyErr_SetString(PyExc_SystemError,
Guido van Rossum7a5b7962000-03-31 13:52:29 +00002956 "build_class with non-string name");
Guido van Rossum25831651993-05-19 14:50:45 +00002957 return NULL;
2958 }
Guido van Rossumcd649651997-08-22 16:56:16 +00002959 n = PyTuple_Size(bases);
2960 for (i = 0; i < n; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002961 PyObject *base = PyTuple_GET_ITEM(bases, i);
2962 if (!PyClass_Check(base)) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002963 /* Call the base's *type*, if it is callable.
2964 This code is a hook for Donald Beaudry's
2965 and Jim Fulton's type extensions. In
Thomas Wouters7e474022000-07-16 12:04:32 +00002966 unextended Python it will never be triggered
Guido van Rossum55b9ab51997-07-31 03:54:02 +00002967 since its types are not callable.
2968 Ditto: call the bases's *class*, if it has
2969 one. This makes the same thing possible
2970 without writing C code. A true meta-object
2971 protocol! */
2972 PyObject *basetype = (PyObject *)base->ob_type;
2973 PyObject *callable = NULL;
2974 if (PyCallable_Check(basetype))
2975 callable = basetype;
2976 else
2977 callable = PyObject_GetAttrString(
2978 base, "__class__");
2979 if (callable) {
2980 PyObject *args;
2981 PyObject *newclass = NULL;
2982 args = Py_BuildValue(
2983 "(OOO)", name, bases, methods);
2984 if (args != NULL) {
2985 newclass = PyEval_CallObject(
2986 callable, args);
2987 Py_DECREF(args);
2988 }
Guido van Rossum730806d1998-04-10 22:27:42 +00002989 if (callable != basetype) {
Guido van Rossum55b9ab51997-07-31 03:54:02 +00002990 Py_DECREF(callable);
Guido van Rossum730806d1998-04-10 22:27:42 +00002991 }
Guido van Rossum55b9ab51997-07-31 03:54:02 +00002992 return newclass;
Guido van Rossum150b2df1996-12-05 23:17:11 +00002993 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002994 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +00002995 "base is not a class object");
2996 return NULL;
2997 }
2998 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002999 return PyClass_New(bases, methods, name);
Guido van Rossum25831651993-05-19 14:50:45 +00003000}
3001
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003002static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003003exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
3004 PyObject *locals)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003005{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003006 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003007 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003008 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003009
Guido van Rossumb209a111997-04-29 18:18:01 +00003010 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
3011 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003012 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00003013 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003014 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00003015 locals = PyTuple_GetItem(prog, 2);
3016 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003017 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003018 if (globals == Py_None) {
3019 globals = PyEval_GetGlobals();
3020 if (locals == Py_None) {
3021 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003022 plain = 1;
3023 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003024 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003025 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003026 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00003027 if (!PyString_Check(prog) &&
3028 !PyCode_Check(prog) &&
3029 !PyFile_Check(prog)) {
3030 PyErr_SetString(PyExc_TypeError,
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003031 "exec 1st arg must be string, code or file object");
3032 return -1;
3033 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003034 if (!PyDict_Check(globals) || !PyDict_Check(locals)) {
3035 PyErr_SetString(PyExc_TypeError,
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003036 "exec 2nd/3rd args must be dict or None");
3037 return -1;
3038 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003039 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00003040 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00003041 if (PyCode_Check(prog)) {
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003042 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003043 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003044 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003045 FILE *fp = PyFile_AsFile(prog);
3046 char *name = PyString_AsString(PyFile_Name(prog));
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003047 v = PyRun_File(fp, name, Py_file_input, globals, locals);
3048 }
3049 else {
3050 char *s = PyString_AsString(prog);
Guido van Rossum582acec2000-06-28 22:07:35 +00003051 if (strlen(s) != (size_t)PyString_Size(prog)) {
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003052 PyErr_SetString(PyExc_ValueError,
3053 "embedded '\\0' in exec string");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003054 return -1;
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003055 }
3056 v = PyRun_String(s, Py_file_input, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003057 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003058 if (plain)
3059 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003060 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003061 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00003062 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003063 return 0;
3064}
Guido van Rossum24c13741995-02-14 09:42:43 +00003065
Guido van Rossum950361c1997-01-24 13:49:28 +00003066
3067#ifdef DYNAMIC_EXECUTION_PROFILE
3068
3069PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003070getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00003071{
3072 int i;
3073 PyObject *l = PyList_New(256);
3074 if (l == NULL) return NULL;
3075 for (i = 0; i < 256; i++) {
3076 PyObject *x = PyInt_FromLong(a[i]);
3077 if (x == NULL) {
3078 Py_DECREF(l);
3079 return NULL;
3080 }
3081 PyList_SetItem(l, i, x);
3082 }
3083 for (i = 0; i < 256; i++)
3084 a[i] = 0;
3085 return l;
3086}
3087
3088PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003089_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00003090{
3091#ifndef DXPAIRS
3092 return getarray(dxp);
3093#else
3094 int i;
3095 PyObject *l = PyList_New(257);
3096 if (l == NULL) return NULL;
3097 for (i = 0; i < 257; i++) {
3098 PyObject *x = getarray(dxpairs[i]);
3099 if (x == NULL) {
3100 Py_DECREF(l);
3101 return NULL;
3102 }
3103 PyList_SetItem(l, i, x);
3104 }
3105 return l;
3106#endif
3107}
3108
3109#endif