blob: b399b638ea6ed853eb43da65c5ce044f4a9d9503 [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 *);
Paul Prescode68140d2000-08-30 20:25:01 +000076static void format_exc_check_arg(PyObject *, char *, PyObject *);
Guido van Rossum374a9221991-04-04 10:40:29 +000077
Paul Prescode68140d2000-08-30 20:25:01 +000078#define NAME_ERROR_MSG \
79 "There is no variable named '%s'"
80#define UNBOUNDLOCAL_ERROR_MSG \
81 "Local variable '%.200s' referenced before assignment"
Guido van Rossum374a9221991-04-04 10:40:29 +000082
Guido van Rossum950361c1997-01-24 13:49:28 +000083/* Dynamic execution profile */
84#ifdef DYNAMIC_EXECUTION_PROFILE
85#ifdef DXPAIRS
86static long dxpairs[257][256];
87#define dxp dxpairs[256]
88#else
89static long dxp[256];
90#endif
91#endif
92
93
Guido van Rossume59214e1994-08-30 08:01:59 +000094#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +000095
Guido van Rossum2571cc81999-04-07 16:07:23 +000096#ifndef DONT_HAVE_ERRNO_H
Guido van Rossum1984f1e1992-08-04 12:41:02 +000097#include <errno.h>
Guido van Rossum2571cc81999-04-07 16:07:23 +000098#endif
Guido van Rossum49b56061998-10-01 20:42:43 +000099#include "pythread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000100
Guido van Rossuma027efa1997-05-05 20:56:21 +0000101extern int _PyThread_Started; /* Flag for Py_Exit */
102
Guido van Rossum65d5b571998-12-21 19:32:43 +0000103static PyThread_type_lock interpreter_lock = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000104static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000105
106void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000107PyEval_InitThreads(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000108{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000109 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000110 return;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000111 _PyThread_Started = 1;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000112 interpreter_lock = PyThread_allocate_lock();
113 PyThread_acquire_lock(interpreter_lock, 1);
114 main_thread = PyThread_get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000115}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000116
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000117void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000118PyEval_AcquireLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000119{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000120 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000121}
122
123void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000124PyEval_ReleaseLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000125{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000126 PyThread_release_lock(interpreter_lock);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000127}
128
129void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000130PyEval_AcquireThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000131{
132 if (tstate == NULL)
133 Py_FatalError("PyEval_AcquireThread: NULL new thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000134 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000135 if (PyThreadState_Swap(tstate) != NULL)
136 Py_FatalError(
137 "PyEval_AcquireThread: non-NULL old thread state");
138}
139
140void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000141PyEval_ReleaseThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000142{
143 if (tstate == NULL)
144 Py_FatalError("PyEval_ReleaseThread: NULL thread state");
145 if (PyThreadState_Swap(NULL) != tstate)
146 Py_FatalError("PyEval_ReleaseThread: wrong thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000147 PyThread_release_lock(interpreter_lock);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000148}
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000149
150/* This function is called from PyOS_AfterFork to ensure that newly
151 created child processes don't hold locks referring to threads which
152 are not running in the child process. (This could also be done using
153 pthread_atfork mechanism, at least for the pthreads implementation.) */
154
155void
156PyEval_ReInitThreads(void)
157{
158 if (!interpreter_lock)
159 return;
160 /*XXX Can't use PyThread_free_lock here because it does too
161 much error-checking. Doing this cleanly would require
162 adding a new function to each thread_*.h. Instead, just
163 create a new lock and waste a little bit of memory */
164 interpreter_lock = PyThread_allocate_lock();
165 PyThread_acquire_lock(interpreter_lock, 1);
166 main_thread = PyThread_get_thread_ident();
167}
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000168#endif
169
Guido van Rossumff4949e1992-08-05 19:58:53 +0000170/* Functions save_thread and restore_thread are always defined so
171 dynamically loaded modules needn't be compiled separately for use
172 with and without threads: */
173
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000174PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000175PyEval_SaveThread(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000176{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000177 PyThreadState *tstate = PyThreadState_Swap(NULL);
178 if (tstate == NULL)
179 Py_FatalError("PyEval_SaveThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000180#ifdef WITH_THREAD
Guido van Rossumb74eca91997-09-30 22:03:16 +0000181 if (interpreter_lock)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000182 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000183#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000184 return tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000185}
186
187void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000188PyEval_RestoreThread(PyThreadState *tstate)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000189{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000190 if (tstate == NULL)
191 Py_FatalError("PyEval_RestoreThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000192#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000193 if (interpreter_lock) {
Guido van Rossumb74eca91997-09-30 22:03:16 +0000194 int err = errno;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000195 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000196 errno = err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000197 }
198#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000199 PyThreadState_Swap(tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000200}
201
202
Guido van Rossuma9672091994-09-14 13:31:22 +0000203/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
204 signal handlers or Mac I/O completion routines) can schedule calls
205 to a function to be called synchronously.
206 The synchronous function is called with one void* argument.
207 It should return 0 for success or -1 for failure -- failure should
208 be accompanied by an exception.
209
210 If registry succeeds, the registry function returns 0; if it fails
211 (e.g. due to too many pending calls) it returns -1 (without setting
212 an exception condition).
213
214 Note that because registry may occur from within signal handlers,
215 or other asynchronous events, calling malloc() is unsafe!
216
217#ifdef WITH_THREAD
218 Any thread can schedule pending calls, but only the main thread
219 will execute them.
220#endif
221
222 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
223 There are two possible race conditions:
224 (1) nested asynchronous registry calls;
225 (2) registry calls made while pending calls are being processed.
226 While (1) is very unlikely, (2) is a real possibility.
227 The current code is safe against (2), but not against (1).
228 The safety against (2) is derived from the fact that only one
229 thread (the main thread) ever takes things out of the queue.
Guido van Rossuma9672091994-09-14 13:31:22 +0000230
Guido van Rossuma027efa1997-05-05 20:56:21 +0000231 XXX Darn! With the advent of thread state, we should have an array
232 of pending calls per thread in the thread state! Later...
233*/
Guido van Rossum8861b741996-07-30 16:49:37 +0000234
Guido van Rossuma9672091994-09-14 13:31:22 +0000235#define NPENDINGCALLS 32
236static struct {
Thomas Wouters334fb892000-07-25 12:56:38 +0000237 int (*func)(void *);
238 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000239} pendingcalls[NPENDINGCALLS];
240static volatile int pendingfirst = 0;
241static volatile int pendinglast = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000242static volatile int things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000243
244int
Thomas Wouters334fb892000-07-25 12:56:38 +0000245Py_AddPendingCall(int (*func)(void *), void *arg)
Guido van Rossuma9672091994-09-14 13:31:22 +0000246{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000247 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000248 int i, j;
249 /* XXX Begin critical section */
250 /* XXX If you want this to be safe against nested
251 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000252 if (busy)
253 return -1;
254 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000255 i = pendinglast;
256 j = (i + 1) % NPENDINGCALLS;
257 if (j == pendingfirst)
258 return -1; /* Queue full */
259 pendingcalls[i].func = func;
260 pendingcalls[i].arg = arg;
261 pendinglast = j;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000262 things_to_do = 1; /* Signal main loop */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000263 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000264 /* XXX End critical section */
265 return 0;
266}
267
Guido van Rossum180d7b41994-09-29 09:45:57 +0000268int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000269Py_MakePendingCalls(void)
Guido van Rossuma9672091994-09-14 13:31:22 +0000270{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000271 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000272#ifdef WITH_THREAD
Guido van Rossum65d5b571998-12-21 19:32:43 +0000273 if (main_thread && PyThread_get_thread_ident() != main_thread)
Guido van Rossuma9672091994-09-14 13:31:22 +0000274 return 0;
275#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000276 if (busy)
Guido van Rossum180d7b41994-09-29 09:45:57 +0000277 return 0;
278 busy = 1;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000279 things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000280 for (;;) {
281 int i;
Thomas Wouters334fb892000-07-25 12:56:38 +0000282 int (*func)(void *);
283 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000284 i = pendingfirst;
285 if (i == pendinglast)
286 break; /* Queue empty */
287 func = pendingcalls[i].func;
288 arg = pendingcalls[i].arg;
289 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000290 if (func(arg) < 0) {
291 busy = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000292 things_to_do = 1; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000293 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000294 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000295 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000296 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000297 return 0;
298}
299
300
Guido van Rossum374a9221991-04-04 10:40:29 +0000301/* Status code for main loop (reason for stack unwind) */
302
303enum why_code {
304 WHY_NOT, /* No error */
305 WHY_EXCEPTION, /* Exception occurred */
306 WHY_RERAISE, /* Exception re-raised by 'finally' */
307 WHY_RETURN, /* 'return' statement */
308 WHY_BREAK /* 'break' statement */
309};
310
Tim Petersdbd9ba62000-07-09 03:09:57 +0000311static enum why_code do_raise(PyObject *, PyObject *, PyObject *);
312static int unpack_sequence(PyObject *, int, PyObject **);
Guido van Rossum1aa14831997-01-21 05:34:20 +0000313
Guido van Rossum374a9221991-04-04 10:40:29 +0000314
Guido van Rossumb209a111997-04-29 18:18:01 +0000315PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000316PyEval_EvalCode(PyCodeObject *co, PyObject *globals, PyObject *locals)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000317{
318 return eval_code2(co,
319 globals, locals,
Guido van Rossumb209a111997-04-29 18:18:01 +0000320 (PyObject **)NULL, 0,
321 (PyObject **)NULL, 0,
322 (PyObject **)NULL, 0,
323 (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000324}
325
326
327/* Interpreter main loop */
328
Guido van Rossum8861b741996-07-30 16:49:37 +0000329#ifndef MAX_RECURSION_DEPTH
330#define MAX_RECURSION_DEPTH 10000
331#endif
332
Guido van Rossumb209a111997-04-29 18:18:01 +0000333static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000334eval_code2(PyCodeObject *co, PyObject *globals, PyObject *locals,
335 PyObject **args, int argcount, PyObject **kws, int kwcount,
336 PyObject **defs, int defcount, PyObject *owner)
Guido van Rossum374a9221991-04-04 10:40:29 +0000337{
Guido van Rossum950361c1997-01-24 13:49:28 +0000338#ifdef DXPAIRS
339 int lastopcode = 0;
340#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000341 register unsigned char *next_instr;
Moshe Zadkaaa39a7e2000-08-07 06:34:45 +0000342 register int opcode=0; /* Current opcode */
343 register int oparg=0; /* Current opcode argument, if any */
Guido van Rossumb209a111997-04-29 18:18:01 +0000344 register PyObject **stack_pointer;
Guido van Rossum374a9221991-04-04 10:40:29 +0000345 register enum why_code why; /* Reason for block stack unwind */
346 register int err; /* Error status -- nonzero if error */
Guido van Rossumb209a111997-04-29 18:18:01 +0000347 register PyObject *x; /* Result object -- NULL if error */
348 register PyObject *v; /* Temporary objects popped off stack */
349 register PyObject *w;
350 register PyObject *u;
351 register PyObject *t;
Barry Warsaw23c9ec82000-08-21 15:44:01 +0000352 register PyObject *stream = NULL; /* for PRINT opcodes */
Guido van Rossumb209a111997-04-29 18:18:01 +0000353 register PyFrameObject *f; /* Current frame */
Guido van Rossum50cd3481998-11-17 17:02:51 +0000354 register PyObject **fastlocals;
Guido van Rossum014518f1998-11-23 21:09:51 +0000355 PyObject *retval = NULL; /* Return value */
Guido van Rossum885553e1998-12-21 18:33:30 +0000356 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossumd076c731998-10-07 19:42:25 +0000357 unsigned char *first_instr;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000358#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000359 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000360#endif
Guido van Rossum408027e1996-12-30 16:17:54 +0000361#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000362 /* Make it easier to find out where we are with a debugger */
Guido van Rossumb209a111997-04-29 18:18:01 +0000363 char *filename = PyString_AsString(co->co_filename);
Guido van Rossum99bec951992-09-03 20:29:45 +0000364#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000365
366/* Code access macros */
367
368#define GETCONST(i) Getconst(f, i)
369#define GETNAME(i) Getname(f, i)
370#define GETNAMEV(i) Getnamev(f, i)
Guido van Rossumd076c731998-10-07 19:42:25 +0000371#define INSTR_OFFSET() (next_instr - first_instr)
Guido van Rossum374a9221991-04-04 10:40:29 +0000372#define NEXTOP() (*next_instr++)
373#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossumd076c731998-10-07 19:42:25 +0000374#define JUMPTO(x) (next_instr = first_instr + (x))
Guido van Rossum374a9221991-04-04 10:40:29 +0000375#define JUMPBY(x) (next_instr += (x))
376
377/* Stack manipulation macros */
378
379#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
380#define EMPTY() (STACK_LEVEL() == 0)
381#define TOP() (stack_pointer[-1])
382#define BASIC_PUSH(v) (*stack_pointer++ = (v))
383#define BASIC_POP() (*--stack_pointer)
384
Guido van Rossum96a42c81992-01-12 02:29:51 +0000385#ifdef LLTRACE
386#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
387#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000388#else
389#define PUSH(v) BASIC_PUSH(v)
390#define POP() BASIC_POP()
391#endif
392
Guido van Rossum681d79a1995-07-18 14:51:37 +0000393/* Local variable macros */
394
395#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumb209a111997-04-29 18:18:01 +0000396#define SETLOCAL(i, value) do { Py_XDECREF(GETLOCAL(i)); \
Guido van Rossum681d79a1995-07-18 14:51:37 +0000397 GETLOCAL(i) = value; } while (0)
398
Guido van Rossuma027efa1997-05-05 20:56:21 +0000399/* Start of code */
400
Guido van Rossum8861b741996-07-30 16:49:37 +0000401#ifdef USE_STACKCHECK
Guido van Rossuma027efa1997-05-05 20:56:21 +0000402 if (tstate->recursion_depth%10 == 0 && PyOS_CheckStack()) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000403 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
Guido van Rossum8861b741996-07-30 16:49:37 +0000404 return NULL;
405 }
406#endif
407
Guido van Rossum681d79a1995-07-18 14:51:37 +0000408 if (globals == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000409 PyErr_SetString(PyExc_SystemError, "eval_code2: NULL globals");
Guido van Rossum6135a871995-01-09 17:53:26 +0000410 return NULL;
Guido van Rossum5b722181993-03-30 17:46:03 +0000411 }
412
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000413#ifdef LLTRACE
Guido van Rossumb209a111997-04-29 18:18:01 +0000414 lltrace = PyDict_GetItemString(globals, "__lltrace__") != NULL;
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000415#endif
416
Guido van Rossumb209a111997-04-29 18:18:01 +0000417 f = PyFrame_New(
Guido van Rossuma027efa1997-05-05 20:56:21 +0000418 tstate, /*back*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000419 co, /*code*/
420 globals, /*globals*/
Guido van Rossum76836021997-01-20 04:26:20 +0000421 locals); /*locals*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000422 if (f == NULL)
423 return NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000424
Guido van Rossuma027efa1997-05-05 20:56:21 +0000425 tstate->frame = f;
Guido van Rossumdeb0c5e1997-01-27 23:42:36 +0000426 fastlocals = f->f_localsplus;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000427
428 if (co->co_argcount > 0 ||
429 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
430 int i;
431 int n = argcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000432 PyObject *kwdict = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000433 if (co->co_flags & CO_VARKEYWORDS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000434 kwdict = PyDict_New();
Guido van Rossum681d79a1995-07-18 14:51:37 +0000435 if (kwdict == NULL)
436 goto fail;
Guido van Rossum8c5df061997-01-24 04:19:24 +0000437 i = co->co_argcount;
438 if (co->co_flags & CO_VARARGS)
439 i++;
440 SETLOCAL(i, kwdict);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000441 }
442 if (argcount > co->co_argcount) {
443 if (!(co->co_flags & CO_VARARGS)) {
Guido van Rossumdf9db1e1997-11-19 16:05:40 +0000444 PyErr_Format(PyExc_TypeError,
445 "too many arguments; expected %d, got %d",
446 co->co_argcount, argcount);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000447 goto fail;
448 }
449 n = co->co_argcount;
450 }
451 for (i = 0; i < n; i++) {
452 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000453 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000454 SETLOCAL(i, x);
455 }
456 if (co->co_flags & CO_VARARGS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000457 u = PyTuple_New(argcount - n);
Guido van Rossum8c5df061997-01-24 04:19:24 +0000458 if (u == NULL)
459 goto fail;
460 SETLOCAL(co->co_argcount, u);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000461 for (i = n; i < argcount; i++) {
462 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000463 Py_INCREF(x);
464 PyTuple_SET_ITEM(u, i-n, x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000465 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000466 }
467 for (i = 0; i < kwcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000468 PyObject *keyword = kws[2*i];
469 PyObject *value = kws[2*i + 1];
Guido van Rossum681d79a1995-07-18 14:51:37 +0000470 int j;
Guido van Rossum25da5be1999-10-26 00:12:20 +0000471 if (keyword == NULL || !PyString_Check(keyword)) {
472 PyErr_SetString(PyExc_TypeError,
473 "keywords must be strings");
474 goto fail;
475 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000476 /* XXX slow -- speed up using dictionary? */
477 for (j = 0; j < co->co_argcount; j++) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000478 PyObject *nm = PyTuple_GET_ITEM(
479 co->co_varnames, j);
Guido van Rossumb209a111997-04-29 18:18:01 +0000480 if (PyObject_Compare(keyword, nm) == 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000481 break;
482 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000483 /* Check errors from Compare */
484 if (PyErr_Occurred())
485 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000486 if (j >= co->co_argcount) {
487 if (kwdict == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000488 PyErr_Format(PyExc_TypeError,
Guido van Rossuma027efa1997-05-05 20:56:21 +0000489 "unexpected keyword argument: %.400s",
Jeremy Hylton76901512000-03-28 23:49:17 +0000490 PyString_AsString(keyword));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000491 goto fail;
492 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000493 PyDict_SetItem(kwdict, keyword, value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000494 }
495 else {
496 if (GETLOCAL(j) != NULL) {
Jeremy Hylton76901512000-03-28 23:49:17 +0000497 PyErr_Format(PyExc_TypeError,
498 "keyword parameter redefined: %.400s",
499 PyString_AsString(keyword));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000500 goto fail;
501 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000502 Py_INCREF(value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000503 SETLOCAL(j, value);
504 }
505 }
506 if (argcount < co->co_argcount) {
507 int m = co->co_argcount - defcount;
508 for (i = argcount; i < m; i++) {
509 if (GETLOCAL(i) == NULL) {
Guido van Rossumdf9db1e1997-11-19 16:05:40 +0000510 PyErr_Format(PyExc_TypeError,
511 "not enough arguments; expected %d, got %d",
512 m, i);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000513 goto fail;
514 }
515 }
516 if (n > m)
517 i = n - m;
518 else
519 i = 0;
520 for (; i < defcount; i++) {
521 if (GETLOCAL(m+i) == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000522 PyObject *def = defs[i];
523 Py_INCREF(def);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000524 SETLOCAL(m+i, def);
525 }
526 }
527 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000528 }
529 else {
530 if (argcount > 0 || kwcount > 0) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000531 PyErr_SetString(PyExc_TypeError,
532 "no arguments expected");
Guido van Rossum8c5df061997-01-24 04:19:24 +0000533 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000534 }
535 }
536
Guido van Rossuma027efa1997-05-05 20:56:21 +0000537 if (tstate->sys_tracefunc != NULL) {
538 /* tstate->sys_tracefunc, if defined, is a function that
539 will be called on *every* entry to a code block.
Guido van Rossum96a42c81992-01-12 02:29:51 +0000540 Its return value, if not None, is a function that
541 will be called at the start of each executed line
542 of code. (Actually, the function must return
543 itself in order to continue tracing.)
544 The trace functions are called with three arguments:
545 a pointer to the current frame, a string indicating
546 why the function is called, and an argument which
547 depends on the situation. The global trace function
548 (sys.trace) is also called whenever an exception
549 is detected. */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000550 if (call_trace(&tstate->sys_tracefunc,
551 &f->f_trace, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000552 Py_None/*XXX how to compute arguments now?*/)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000553 /* Trace function raised an error */
Guido van Rossum8c5df061997-01-24 04:19:24 +0000554 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000555 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000556 }
557
Guido van Rossuma027efa1997-05-05 20:56:21 +0000558 if (tstate->sys_profilefunc != NULL) {
559 /* Similar for sys_profilefunc, except it needn't return
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000560 itself and isn't called for "line" events */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000561 if (call_trace(&tstate->sys_profilefunc,
562 (PyObject**)0, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000563 Py_None/*XXX*/)) {
Guido van Rossum8c5df061997-01-24 04:19:24 +0000564 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000565 }
566 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000567
Guido van Rossuma027efa1997-05-05 20:56:21 +0000568 if (++tstate->recursion_depth > MAX_RECURSION_DEPTH) {
569 --tstate->recursion_depth;
570 PyErr_SetString(PyExc_RuntimeError,
571 "Maximum recursion depth exceeded");
572 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +0000573 Py_DECREF(f);
Guido van Rossum8861b741996-07-30 16:49:37 +0000574 return NULL;
575 }
576
Guido van Rossumd076c731998-10-07 19:42:25 +0000577 _PyCode_GETCODEPTR(co, &first_instr);
578 next_instr = first_instr;
Guido van Rossum374a9221991-04-04 10:40:29 +0000579 stack_pointer = f->f_valuestack;
580
Guido van Rossum374a9221991-04-04 10:40:29 +0000581 why = WHY_NOT;
582 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000583 x = Py_None; /* Not a reference, just anything non-NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000584
585 for (;;) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000586 /* Do periodic things. Doing this every time through
587 the loop would add too much overhead, so we do it
588 only every Nth instruction. We also do it if
589 ``things_to_do'' is set, i.e. when an asynchronous
590 event needs attention (e.g. a signal handler or
591 async I/O handler); see Py_AddPendingCall() and
592 Py_MakePendingCalls() above. */
Guido van Rossuma9672091994-09-14 13:31:22 +0000593
Guido van Rossuma027efa1997-05-05 20:56:21 +0000594 if (things_to_do || --tstate->ticker < 0) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000595 tstate->ticker = tstate->interp->checkinterval;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000596 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000597 if (Py_MakePendingCalls() < 0) {
598 why = WHY_EXCEPTION;
599 goto on_error;
600 }
601 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000602#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000603 /* If we have true signals, the signal handler
604 will call Py_AddPendingCall() so we don't
605 have to call sigcheck(). On the Mac and
606 DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000607 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000608 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000609 goto on_error;
610 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000611#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000612
Guido van Rossume59214e1994-08-30 08:01:59 +0000613#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000614 if (interpreter_lock) {
615 /* Give another thread a chance */
616
Guido van Rossum25ce5661997-08-02 03:10:38 +0000617 if (PyThreadState_Swap(NULL) != tstate)
618 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000619 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000620
621 /* Other threads may run now */
622
Guido van Rossum65d5b571998-12-21 19:32:43 +0000623 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000624 if (PyThreadState_Swap(tstate) != NULL)
625 Py_FatalError("ceval: orphan tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000626 }
627#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000628 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000629
Guido van Rossum374a9221991-04-04 10:40:29 +0000630 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000631
Guido van Rossum408027e1996-12-30 16:17:54 +0000632#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000633 f->f_lasti = INSTR_OFFSET();
634#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000635
636 opcode = NEXTOP();
637 if (HAS_ARG(opcode))
638 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +0000639 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +0000640#ifdef DYNAMIC_EXECUTION_PROFILE
641#ifdef DXPAIRS
642 dxpairs[lastopcode][opcode]++;
643 lastopcode = opcode;
644#endif
645 dxp[opcode]++;
646#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000647
Guido van Rossum96a42c81992-01-12 02:29:51 +0000648#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000649 /* Instruction tracing */
650
Guido van Rossum96a42c81992-01-12 02:29:51 +0000651 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000652 if (HAS_ARG(opcode)) {
653 printf("%d: %d, %d\n",
654 (int) (INSTR_OFFSET() - 3),
655 opcode, oparg);
656 }
657 else {
658 printf("%d: %d\n",
659 (int) (INSTR_OFFSET() - 1), opcode);
660 }
661 }
662#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000663 /* Main switch on opcode */
664
665 switch (opcode) {
666
667 /* BEWARE!
668 It is essential that any operation that fails sets either
669 x to NULL, err to nonzero, or why to anything but WHY_NOT,
670 and that no operation that succeeds does this! */
671
672 /* case STOP_CODE: this is an error! */
673
674 case POP_TOP:
675 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000676 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000677 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000678
679 case ROT_TWO:
680 v = POP();
681 w = POP();
682 PUSH(v);
683 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000684 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000685
686 case ROT_THREE:
687 v = POP();
688 w = POP();
689 x = POP();
690 PUSH(v);
691 PUSH(x);
692 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000693 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000694
Thomas Wouters434d0822000-08-24 20:11:32 +0000695 case ROT_FOUR:
696 u = POP();
697 v = POP();
698 w = POP();
699 x = POP();
700 PUSH(u);
701 PUSH(x);
702 PUSH(w);
703 PUSH(v);
704 continue;
705
Guido van Rossum374a9221991-04-04 10:40:29 +0000706 case DUP_TOP:
707 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000708 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000709 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000710 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000711
Thomas Wouters434d0822000-08-24 20:11:32 +0000712 case DUP_TOPX:
713 switch (oparg) {
714 case 5:
715 case 4:
716 case 3:
717 case 2:
718 case 1:
719 x = POP();
720 if (oparg == 1) break;
721 w = POP();
722 if (oparg == 2) break;
723 v = POP();
724 if (oparg == 3) break;
725 u = POP();
726 if (oparg == 4) break;
727 t = POP();
728 break;
729 default:
730 fprintf(stderr, "Invalid argument to DUP_TOPX: %d!\n", oparg);
731 PyErr_SetString(PyExc_SystemError,
732 "invalid argument to DUP_TOPX");
733 x = NULL;
734 }
735 if (x == NULL)
736 break;
737 switch (oparg) {
738 case 5: PUSH(t);
739 Py_INCREF(t); /* Fallthrough */
740 case 4: PUSH(u);
741 Py_INCREF(u); /* Fallthrough */
742 case 3: PUSH(v);
743 Py_INCREF(v); /* Fallthrough */
744 case 2: PUSH(w);
745 Py_INCREF(w); /* Fallthrough */
746 case 1: PUSH(x);
747 Py_INCREF(x); /* Fallthrough */
748 }
749 switch (oparg) {
750 case 5: PUSH(t); /* Fallthrough */
751 case 4: PUSH(u); /* Fallthrough */
752 case 3: PUSH(v); /* Fallthrough */
753 case 2: PUSH(w); /* Fallthrough */
754 case 1: PUSH(x); /* Fallthrough */
755 }
756 continue;
757
Guido van Rossum374a9221991-04-04 10:40:29 +0000758 case UNARY_POSITIVE:
759 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000760 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000761 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000762 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000763 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000764 break;
765
766 case UNARY_NEGATIVE:
767 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000768 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000769 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000770 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000771 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000772 break;
773
774 case UNARY_NOT:
775 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000776 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000777 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000778 if (err == 0) {
779 Py_INCREF(Py_True);
780 PUSH(Py_True);
781 continue;
782 }
783 else if (err > 0) {
784 Py_INCREF(Py_False);
785 PUSH(Py_False);
786 err = 0;
787 continue;
788 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000789 break;
790
791 case UNARY_CONVERT:
792 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000793 x = PyObject_Repr(v);
794 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000795 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000796 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000797 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000798
799 case UNARY_INVERT:
800 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000801 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000802 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000803 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000804 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000805 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000806
Guido van Rossum50564e81996-01-12 01:13:16 +0000807 case BINARY_POWER:
808 w = POP();
809 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000810 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000811 Py_DECREF(v);
812 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000813 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000814 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000815 break;
816
Guido van Rossum374a9221991-04-04 10:40:29 +0000817 case BINARY_MULTIPLY:
818 w = POP();
819 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000820 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000821 Py_DECREF(v);
822 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000823 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000824 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000825 break;
826
827 case BINARY_DIVIDE:
828 w = POP();
829 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000830 x = PyNumber_Divide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000831 Py_DECREF(v);
832 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000833 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000834 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000835 break;
836
837 case BINARY_MODULO:
838 w = POP();
839 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000840 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000841 Py_DECREF(v);
842 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000843 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000844 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000845 break;
846
847 case BINARY_ADD:
848 w = POP();
849 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000850 if (PyInt_Check(v) && PyInt_Check(w)) {
851 /* INLINE: int + int */
852 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000853 a = PyInt_AS_LONG(v);
854 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000855 i = a + b;
856 if ((i^a) < 0 && (i^b) < 0) {
857 PyErr_SetString(PyExc_OverflowError,
858 "integer addition");
859 x = NULL;
860 }
861 else
862 x = PyInt_FromLong(i);
863 }
864 else
865 x = PyNumber_Add(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000866 Py_DECREF(v);
867 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000868 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000869 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000870 break;
871
872 case BINARY_SUBTRACT:
873 w = POP();
874 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000875 if (PyInt_Check(v) && PyInt_Check(w)) {
876 /* INLINE: int - int */
877 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000878 a = PyInt_AS_LONG(v);
879 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000880 i = a - b;
881 if ((i^a) < 0 && (i^~b) < 0) {
882 PyErr_SetString(PyExc_OverflowError,
883 "integer subtraction");
884 x = NULL;
885 }
886 else
887 x = PyInt_FromLong(i);
888 }
889 else
890 x = PyNumber_Subtract(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000891 Py_DECREF(v);
892 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000893 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000894 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000895 break;
896
897 case BINARY_SUBSCR:
898 w = POP();
899 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000900 if (PyList_Check(v) && PyInt_Check(w)) {
901 /* INLINE: list[int] */
902 long i = PyInt_AsLong(w);
903 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +0000904 i += PyList_GET_SIZE(v);
Guido van Rossumc12da691997-07-17 23:12:42 +0000905 if (i < 0 ||
Guido van Rossumfa00e951998-07-08 15:02:37 +0000906 i >= PyList_GET_SIZE(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +0000907 PyErr_SetString(PyExc_IndexError,
908 "list index out of range");
909 x = NULL;
910 }
911 else {
Guido van Rossumfa00e951998-07-08 15:02:37 +0000912 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +0000913 Py_INCREF(x);
914 }
915 }
916 else
917 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000918 Py_DECREF(v);
919 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000920 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000921 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000922 break;
923
Guido van Rossum7928cd71991-10-24 14:59:31 +0000924 case BINARY_LSHIFT:
925 w = POP();
926 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000927 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000928 Py_DECREF(v);
929 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000930 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000931 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000932 break;
933
934 case BINARY_RSHIFT:
935 w = POP();
936 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000937 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000938 Py_DECREF(v);
939 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000940 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000941 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000942 break;
943
944 case BINARY_AND:
945 w = POP();
946 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000947 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000948 Py_DECREF(v);
949 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000950 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000951 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000952 break;
953
954 case BINARY_XOR:
955 w = POP();
956 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000957 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000958 Py_DECREF(v);
959 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000960 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000961 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000962 break;
963
964 case BINARY_OR:
965 w = POP();
966 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000967 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000968 Py_DECREF(v);
969 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000970 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000971 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000972 break;
Thomas Wouters434d0822000-08-24 20:11:32 +0000973
974 case INPLACE_POWER:
975 w = POP();
976 v = POP();
977 x = PyNumber_InPlacePower(v, w, Py_None);
978 Py_DECREF(v);
979 Py_DECREF(w);
980 PUSH(x);
981 if (x != NULL) continue;
982 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000983
Thomas Wouters434d0822000-08-24 20:11:32 +0000984 case INPLACE_MULTIPLY:
985 w = POP();
986 v = POP();
987 x = PyNumber_InPlaceMultiply(v, w);
988 Py_DECREF(v);
989 Py_DECREF(w);
990 PUSH(x);
991 if (x != NULL) continue;
992 break;
993
994 case INPLACE_DIVIDE:
995 w = POP();
996 v = POP();
997 x = PyNumber_InPlaceDivide(v, w);
998 Py_DECREF(v);
999 Py_DECREF(w);
1000 PUSH(x);
1001 if (x != NULL) continue;
1002 break;
1003
1004 case INPLACE_MODULO:
1005 w = POP();
1006 v = POP();
1007 x = PyNumber_InPlaceRemainder(v, w);
1008 Py_DECREF(v);
1009 Py_DECREF(w);
1010 PUSH(x);
1011 if (x != NULL) continue;
1012 break;
1013
1014 case INPLACE_ADD:
1015 w = POP();
1016 v = POP();
1017 if (PyInt_Check(v) && PyInt_Check(w)) {
1018 /* INLINE: int + int */
1019 register long a, b, i;
1020 a = PyInt_AS_LONG(v);
1021 b = PyInt_AS_LONG(w);
1022 i = a + b;
1023 if ((i^a) < 0 && (i^b) < 0) {
1024 PyErr_SetString(PyExc_OverflowError,
1025 "integer addition");
1026 x = NULL;
1027 }
1028 else
1029 x = PyInt_FromLong(i);
1030 }
1031 else
1032 x = PyNumber_InPlaceAdd(v, w);
1033 Py_DECREF(v);
1034 Py_DECREF(w);
1035 PUSH(x);
1036 if (x != NULL) continue;
1037 break;
1038
1039 case INPLACE_SUBTRACT:
1040 w = POP();
1041 v = POP();
1042 if (PyInt_Check(v) && PyInt_Check(w)) {
1043 /* INLINE: int - int */
1044 register long a, b, i;
1045 a = PyInt_AS_LONG(v);
1046 b = PyInt_AS_LONG(w);
1047 i = a - b;
1048 if ((i^a) < 0 && (i^~b) < 0) {
1049 PyErr_SetString(PyExc_OverflowError,
1050 "integer subtraction");
1051 x = NULL;
1052 }
1053 else
1054 x = PyInt_FromLong(i);
1055 }
1056 else
1057 x = PyNumber_InPlaceSubtract(v, w);
1058 Py_DECREF(v);
1059 Py_DECREF(w);
1060 PUSH(x);
1061 if (x != NULL) continue;
1062 break;
1063
1064 case INPLACE_LSHIFT:
1065 w = POP();
1066 v = POP();
1067 x = PyNumber_InPlaceLshift(v, w);
1068 Py_DECREF(v);
1069 Py_DECREF(w);
1070 PUSH(x);
1071 if (x != NULL) continue;
1072 break;
1073
1074 case INPLACE_RSHIFT:
1075 w = POP();
1076 v = POP();
1077 x = PyNumber_InPlaceRshift(v, w);
1078 Py_DECREF(v);
1079 Py_DECREF(w);
1080 PUSH(x);
1081 if (x != NULL) continue;
1082 break;
1083
1084 case INPLACE_AND:
1085 w = POP();
1086 v = POP();
1087 x = PyNumber_InPlaceAnd(v, w);
1088 Py_DECREF(v);
1089 Py_DECREF(w);
1090 PUSH(x);
1091 if (x != NULL) continue;
1092 break;
1093
1094 case INPLACE_XOR:
1095 w = POP();
1096 v = POP();
1097 x = PyNumber_InPlaceXor(v, w);
1098 Py_DECREF(v);
1099 Py_DECREF(w);
1100 PUSH(x);
1101 if (x != NULL) continue;
1102 break;
1103
1104 case INPLACE_OR:
1105 w = POP();
1106 v = POP();
1107 x = PyNumber_InPlaceOr(v, w);
1108 Py_DECREF(v);
1109 Py_DECREF(w);
1110 PUSH(x);
1111 if (x != NULL) continue;
1112 break;
1113
Guido van Rossum374a9221991-04-04 10:40:29 +00001114 case SLICE+0:
1115 case SLICE+1:
1116 case SLICE+2:
1117 case SLICE+3:
1118 if ((opcode-SLICE) & 2)
1119 w = POP();
1120 else
1121 w = NULL;
1122 if ((opcode-SLICE) & 1)
1123 v = POP();
1124 else
1125 v = NULL;
1126 u = POP();
1127 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001128 Py_DECREF(u);
1129 Py_XDECREF(v);
1130 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001131 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001132 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001133 break;
1134
1135 case STORE_SLICE+0:
1136 case STORE_SLICE+1:
1137 case STORE_SLICE+2:
1138 case STORE_SLICE+3:
1139 if ((opcode-STORE_SLICE) & 2)
1140 w = POP();
1141 else
1142 w = NULL;
1143 if ((opcode-STORE_SLICE) & 1)
1144 v = POP();
1145 else
1146 v = NULL;
1147 u = POP();
1148 t = POP();
1149 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +00001150 Py_DECREF(t);
1151 Py_DECREF(u);
1152 Py_XDECREF(v);
1153 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001154 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001155 break;
1156
1157 case DELETE_SLICE+0:
1158 case DELETE_SLICE+1:
1159 case DELETE_SLICE+2:
1160 case DELETE_SLICE+3:
1161 if ((opcode-DELETE_SLICE) & 2)
1162 w = POP();
1163 else
1164 w = NULL;
1165 if ((opcode-DELETE_SLICE) & 1)
1166 v = POP();
1167 else
1168 v = NULL;
1169 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001170 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +00001171 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00001172 Py_DECREF(u);
1173 Py_XDECREF(v);
1174 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001175 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001176 break;
1177
1178 case STORE_SUBSCR:
1179 w = POP();
1180 v = POP();
1181 u = POP();
1182 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +00001183 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001184 Py_DECREF(u);
1185 Py_DECREF(v);
1186 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001187 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001188 break;
1189
1190 case DELETE_SUBSCR:
1191 w = POP();
1192 v = POP();
1193 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001194 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001195 Py_DECREF(v);
1196 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001197 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001198 break;
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001199
Guido van Rossum374a9221991-04-04 10:40:29 +00001200 case PRINT_EXPR:
1201 v = POP();
Guido van Rossumaa06b0e1997-12-26 22:15:57 +00001202 /* Print value except if None */
1203 /* After printing, also assign to '_' */
1204 /* Before, set '_' to None to avoid recursion */
Guido van Rossumb209a111997-04-29 18:18:01 +00001205 if (v != Py_None &&
Guido van Rossuma027efa1997-05-05 20:56:21 +00001206 (err = PyDict_SetItemString(
Guido van Rossumaa06b0e1997-12-26 22:15:57 +00001207 f->f_builtins, "_", Py_None)) == 0) {
Guido van Rossumbe270261997-05-22 22:26:18 +00001208 err = Py_FlushLine();
Guido van Rossumc12da691997-07-17 23:12:42 +00001209 if (err == 0) {
Guido van Rossumbe270261997-05-22 22:26:18 +00001210 x = PySys_GetObject("stdout");
Guido van Rossum8f183201997-12-31 05:53:15 +00001211 if (x == NULL) {
1212 PyErr_SetString(
1213 PyExc_RuntimeError,
1214 "lost sys.stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00001215 err = -1;
Guido van Rossum8f183201997-12-31 05:53:15 +00001216 }
Guido van Rossumbe270261997-05-22 22:26:18 +00001217 }
1218 if (err == 0)
1219 err = PyFile_WriteObject(v, x, 0);
1220 if (err == 0) {
1221 PyFile_SoftSpace(x, 1);
1222 err = Py_FlushLine();
1223 }
Guido van Rossumaa06b0e1997-12-26 22:15:57 +00001224 if (err == 0) {
1225 err = PyDict_SetItemString(
1226 f->f_builtins, "_", v);
1227 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001228 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001229 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001230 break;
1231
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001232 case PRINT_ITEM_TO:
1233 w = stream = POP();
1234 /* fall through to PRINT_ITEM */
1235
Guido van Rossum374a9221991-04-04 10:40:29 +00001236 case PRINT_ITEM:
1237 v = POP();
Barry Warsaw093abe02000-08-29 04:56:13 +00001238 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001239 w = PySys_GetObject("stdout");
1240 if (w == NULL) {
1241 PyErr_SetString(PyExc_RuntimeError,
1242 "lost sys.stdout");
1243 err = -1;
1244 }
Guido van Rossum8f183201997-12-31 05:53:15 +00001245 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001246 if (w != NULL && PyFile_SoftSpace(w, 1))
Guido van Rossumbe270261997-05-22 22:26:18 +00001247 err = PyFile_WriteString(" ", w);
1248 if (err == 0)
1249 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Guido van Rossumb209a111997-04-29 18:18:01 +00001250 if (err == 0 && PyString_Check(v)) {
Guido van Rossumc6004111993-11-05 10:22:19 +00001251 /* XXX move into writeobject() ? */
Guido van Rossumb209a111997-04-29 18:18:01 +00001252 char *s = PyString_AsString(v);
1253 int len = PyString_Size(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +00001254 if (len > 0 &&
1255 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +00001256 s[len-1] != ' ')
Guido van Rossumb209a111997-04-29 18:18:01 +00001257 PyFile_SoftSpace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001258 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001259 Py_DECREF(v);
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001260 Py_XDECREF(stream);
1261 stream = NULL;
1262 if (err == 0)
1263 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001264 break;
1265
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001266 case PRINT_NEWLINE_TO:
1267 w = stream = POP();
1268 /* fall through to PRINT_NEWLINE */
1269
Guido van Rossum374a9221991-04-04 10:40:29 +00001270 case PRINT_NEWLINE:
Barry Warsaw093abe02000-08-29 04:56:13 +00001271 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001272 w = PySys_GetObject("stdout");
1273 if (w == NULL)
1274 PyErr_SetString(PyExc_RuntimeError,
1275 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001276 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001277 if (w != NULL) {
1278 err = PyFile_WriteString("\n", w);
1279 if (err == 0)
1280 PyFile_SoftSpace(w, 0);
1281 }
1282 Py_XDECREF(stream);
1283 stream = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +00001284 break;
1285
Thomas Wouters434d0822000-08-24 20:11:32 +00001286
1287#ifdef CASE_TOO_BIG
1288 default: switch (opcode) {
1289#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001290 case BREAK_LOOP:
1291 why = WHY_BREAK;
1292 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001293
Guido van Rossumf10570b1995-07-07 22:53:21 +00001294 case RAISE_VARARGS:
1295 u = v = w = NULL;
1296 switch (oparg) {
1297 case 3:
1298 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001299 /* Fallthrough */
1300 case 2:
1301 v = POP(); /* value */
1302 /* Fallthrough */
1303 case 1:
1304 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001305 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001306 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001307 break;
1308 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001309 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001310 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001311 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001312 break;
1313 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001314 break;
1315
1316 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001317 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001318 PyErr_SetString(PyExc_SystemError,
1319 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001320 break;
1321 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001322 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001323 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001324 break;
1325
1326 case RETURN_VALUE:
1327 retval = POP();
1328 why = WHY_RETURN;
1329 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001330
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001331 case EXEC_STMT:
1332 w = POP();
1333 v = POP();
1334 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001335 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001336 Py_DECREF(u);
1337 Py_DECREF(v);
1338 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001339 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001340
Guido van Rossum374a9221991-04-04 10:40:29 +00001341 case POP_BLOCK:
1342 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001343 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001344 while (STACK_LEVEL() > b->b_level) {
1345 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001346 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001347 }
1348 }
1349 break;
1350
1351 case END_FINALLY:
1352 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001353 if (PyInt_Check(v)) {
1354 why = (enum why_code) PyInt_AsLong(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001355 if (why == WHY_RETURN)
1356 retval = POP();
1357 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001358 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001359 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001360 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001361 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001362 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001363 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001364 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001365 else if (v != Py_None) {
1366 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001367 "'finally' pops bad exception");
1368 why = WHY_EXCEPTION;
1369 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001370 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001371 break;
1372
1373 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001374 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001375 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001376 w = POP();
1377 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001378 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001379 Py_DECREF(u);
1380 Py_DECREF(v);
1381 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001382 break;
1383
1384 case STORE_NAME:
1385 w = GETNAMEV(oparg);
1386 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001387 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001388 PyErr_SetString(PyExc_SystemError,
1389 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001390 break;
1391 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001392 err = PyDict_SetItem(x, w, v);
1393 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001394 break;
1395
1396 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001397 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001398 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001399 PyErr_SetString(PyExc_SystemError,
1400 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001401 break;
1402 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001403 if ((err = PyDict_DelItem(x, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001404 format_exc_check_arg(PyExc_NameError,
1405 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001406 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001407
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001408 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001409 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001410 if (PyTuple_Check(v)) {
1411 if (PyTuple_Size(v) != oparg) {
1412 PyErr_SetString(PyExc_ValueError,
1413 "unpack tuple of wrong size");
1414 why = WHY_EXCEPTION;
1415 }
1416 else {
1417 for (; --oparg >= 0; ) {
1418 w = PyTuple_GET_ITEM(v, oparg);
1419 Py_INCREF(w);
1420 PUSH(w);
1421 }
1422 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001423 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001424 else if (PyList_Check(v)) {
1425 if (PyList_Size(v) != oparg) {
1426 PyErr_SetString(PyExc_ValueError,
1427 "unpack list of wrong size");
1428 why = WHY_EXCEPTION;
1429 }
1430 else {
1431 for (; --oparg >= 0; ) {
1432 w = PyList_GET_ITEM(v, oparg);
1433 Py_INCREF(w);
1434 PUSH(w);
1435 }
1436 }
1437 }
1438 else if (PySequence_Check(v)) {
1439 if (unpack_sequence(v, oparg,
1440 stack_pointer + oparg))
1441 stack_pointer += oparg;
1442 else
1443 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001444 }
1445 else {
Barry Warsawe42b18f1997-08-25 22:13:04 +00001446 PyErr_SetString(PyExc_TypeError,
1447 "unpack non-sequence");
1448 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001449 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001450 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001451 break;
1452
1453 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001454 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001455 v = POP();
1456 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001457 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1458 Py_DECREF(v);
1459 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001460 break;
1461
1462 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001463 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001464 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001465 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1466 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001467 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001468 break;
1469
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001470 case STORE_GLOBAL:
1471 w = GETNAMEV(oparg);
1472 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001473 err = PyDict_SetItem(f->f_globals, w, v);
1474 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001475 break;
1476
1477 case DELETE_GLOBAL:
1478 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001479 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001480 format_exc_check_arg(
1481 PyExc_NameError, NAME_ERROR_MSG ,w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001482 break;
1483
Guido van Rossum374a9221991-04-04 10:40:29 +00001484 case LOAD_CONST:
1485 x = GETCONST(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001486 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001487 PUSH(x);
1488 break;
1489
1490 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001491 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001492 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001493 PyErr_SetString(PyExc_SystemError,
1494 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001495 break;
1496 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001497 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001498 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001499 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001500 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001501 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001502 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001503 format_exc_check_arg(
1504 PyExc_NameError,
1505 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001506 break;
1507 }
1508 }
1509 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001510 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001511 PUSH(x);
1512 break;
1513
1514 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001515 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001516 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001517 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001518 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001519 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001520 format_exc_check_arg(
1521 PyExc_NameError,
1522 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001523 break;
1524 }
1525 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001526 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001527 PUSH(x);
1528 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001529
Guido van Rossum9bfef441993-03-29 10:43:31 +00001530 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001531 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001532 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001533 format_exc_check_arg(
1534 PyExc_UnboundLocalError,
1535 UNBOUNDLOCAL_ERROR_MSG,
1536 PyTuple_GetItem(co->co_varnames, oparg)
1537 );
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001538 break;
1539 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001540 Py_INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001541 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001542 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001543 break;
1544
1545 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001546 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001547 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001548 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001549
1550 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001551 x = GETLOCAL(oparg);
1552 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001553 format_exc_check_arg(
1554 PyExc_UnboundLocalError,
1555 UNBOUNDLOCAL_ERROR_MSG,
1556 PyTuple_GetItem(co->co_varnames, oparg)
1557 );
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001558 break;
1559 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001560 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001561 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001562
1563 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001564 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001565 if (x != NULL) {
1566 for (; --oparg >= 0;) {
1567 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001568 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001569 }
1570 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001571 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001572 }
1573 break;
1574
1575 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001576 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001577 if (x != NULL) {
1578 for (; --oparg >= 0;) {
1579 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001580 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001581 }
1582 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001583 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001584 }
1585 break;
1586
1587 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001588 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001589 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001590 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001591 break;
1592
1593 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001594 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001595 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001596 x = PyObject_GetAttr(v, w);
1597 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001598 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001599 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001600 break;
1601
1602 case COMPARE_OP:
1603 w = POP();
1604 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +00001605 if (PyInt_Check(v) && PyInt_Check(w)) {
1606 /* INLINE: cmp(int, int) */
1607 register long a, b;
1608 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001609 a = PyInt_AS_LONG(v);
1610 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001611 switch (oparg) {
1612 case LT: res = a < b; break;
1613 case LE: res = a <= b; break;
1614 case EQ: res = a == b; break;
1615 case NE: res = a != b; break;
1616 case GT: res = a > b; break;
1617 case GE: res = a >= b; break;
1618 case IS: res = v == w; break;
1619 case IS_NOT: res = v != w; break;
1620 default: goto slow_compare;
1621 }
1622 x = res ? Py_True : Py_False;
1623 Py_INCREF(x);
1624 }
1625 else {
1626 slow_compare:
1627 x = cmp_outcome(oparg, v, w);
1628 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001629 Py_DECREF(v);
1630 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001631 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001632 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001633 break;
1634
1635 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001636 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001637 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001638 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001639 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001640 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001641 break;
1642 }
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00001643 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001644 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001645 w,
1646 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001647 f->f_locals == NULL ?
1648 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001649 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001650 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001651 if (w == NULL) {
1652 x = NULL;
1653 break;
1654 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001655 x = PyEval_CallObject(x, w);
1656 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001657 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001658 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001659 break;
1660
Thomas Wouters52152252000-08-17 22:55:00 +00001661 case IMPORT_STAR:
1662 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001663 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001664 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001665 PyErr_SetString(PyExc_SystemError,
1666 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001667 break;
1668 }
Thomas Wouters52152252000-08-17 22:55:00 +00001669 err = import_all_from(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001670 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00001671 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001672 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001673 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001674
Thomas Wouters52152252000-08-17 22:55:00 +00001675 case IMPORT_FROM:
1676 w = GETNAMEV(oparg);
1677 v = TOP();
1678 x = import_from(v, w);
1679 PUSH(x);
1680 if (x != NULL) continue;
1681 break;
1682
Guido van Rossum374a9221991-04-04 10:40:29 +00001683 case JUMP_FORWARD:
1684 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001685 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001686
1687 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001688 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001689 if (err > 0)
1690 err = 0;
1691 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001692 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001693 else
1694 break;
1695 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001696
1697 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001698 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001699 if (err > 0) {
1700 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001701 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001702 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001703 else if (err == 0)
1704 ;
1705 else
1706 break;
1707 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001708
1709 case JUMP_ABSOLUTE:
1710 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001711 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001712
1713 case FOR_LOOP:
1714 /* for v in s: ...
1715 On entry: stack contains s, i.
1716 On exit: stack contains s, i+1, s[i];
1717 but if loop exhausted:
1718 s, i are popped, and we jump */
1719 w = POP(); /* Loop index */
1720 v = POP(); /* Sequence object */
1721 u = loop_subscript(v, w);
1722 if (u != NULL) {
1723 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001724 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001725 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001726 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001727 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001728 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001729 }
1730 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001731 Py_DECREF(v);
1732 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001733 /* A NULL can mean "s exhausted"
1734 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001735 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001736 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001737 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001738 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001739 continue;
1740 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001741 }
1742 break;
1743
1744 case SETUP_LOOP:
1745 case SETUP_EXCEPT:
1746 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001747 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Guido van Rossum374a9221991-04-04 10:40:29 +00001748 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001749 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001750
1751 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001752#ifdef LLTRACE
1753 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001754 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001755#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001756 f->f_lineno = oparg;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001757 if (f->f_trace == NULL)
1758 continue;
1759 /* Trace each line of code reached */
1760 f->f_lasti = INSTR_OFFSET();
1761 err = call_trace(&f->f_trace, &f->f_trace,
Guido van Rossumb209a111997-04-29 18:18:01 +00001762 f, "line", Py_None);
Guido van Rossum374a9221991-04-04 10:40:29 +00001763 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001764
1765 case CALL_FUNCTION:
Jeremy Hylton76901512000-03-28 23:49:17 +00001766 case CALL_FUNCTION_VAR:
1767 case CALL_FUNCTION_KW:
1768 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00001769 {
Jeremy Hylton76901512000-03-28 23:49:17 +00001770 int na = oparg & 0xff;
1771 int nk = (oparg>>8) & 0xff;
1772 int flags = (opcode - CALL_FUNCTION) & 3;
1773 int n = na + 2*nk + (flags & 1) + ((flags >> 1) & 1);
1774 PyObject **pfunc = stack_pointer - n - 1;
1775 PyObject *func = *pfunc;
1776 PyObject *self = NULL;
1777 PyObject *class = NULL;
1778 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
1779 if (PyMethod_Check(func)) {
1780 self = PyMethod_Self(func);
1781 class = PyMethod_Class(func);
1782 func = PyMethod_Function(func);
1783 Py_INCREF(func);
1784 if (self != NULL) {
1785 Py_INCREF(self);
1786 Py_DECREF(*pfunc);
1787 *pfunc = self;
1788 na++;
1789 n++;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001790 }
1791 else {
Jeremy Hylton76901512000-03-28 23:49:17 +00001792 /* Unbound methods must be called with an
1793 instance of the class (or a derived
1794 class) as first argument */
1795 if (na > 0 && (self = stack_pointer[-n]) != NULL
1796 && PyInstance_Check(self)
1797 && PyClass_IsSubclass((PyObject *)
1798 (((PyInstanceObject *)self)->in_class),
1799 class))
1800 /* Handy-dandy */ ;
1801 else {
1802 PyErr_SetString(PyExc_TypeError,
1803 "unbound method must be called with class instance 1st argument");
1804 x = NULL;
1805 break;
1806 }
1807 }
1808 }
1809 else
1810 Py_INCREF(func);
1811 if (PyFunction_Check(func) && flags == 0) {
1812 PyObject *co = PyFunction_GetCode(func);
1813 PyObject *globals = PyFunction_GetGlobals(func);
1814 PyObject *argdefs = PyFunction_GetDefaults(func);
1815 PyObject **d;
1816 int nd;
1817 if (argdefs != NULL) {
1818 d = &PyTuple_GET_ITEM(argdefs, 0);
1819 nd = ((PyTupleObject *)argdefs)->ob_size;
1820 }
1821 else {
1822 d = NULL;
1823 nd = 0;
1824 }
1825 x = eval_code2((PyCodeObject *)co, globals,
1826 (PyObject *)NULL, stack_pointer-n, na,
1827 stack_pointer-2*nk, nk, d, nd,
1828 class);
1829 }
1830 else {
1831 int nstar = 0;
Jeremy Hylton387b1012000-03-31 01:22:54 +00001832 PyObject *callargs;
Jeremy Hylton76901512000-03-28 23:49:17 +00001833 PyObject *stararg = 0;
1834 PyObject *kwdict = NULL;
1835 if (flags & 2) {
1836 kwdict = POP();
1837 if (!PyDict_Check(kwdict)) {
1838 PyErr_SetString(PyExc_TypeError,
1839 "** argument must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00001840 goto extcall_fail;
Jeremy Hylton76901512000-03-28 23:49:17 +00001841 }
1842 }
1843 if (flags & 1) {
1844 stararg = POP();
1845 if (!PySequence_Check(stararg)) {
1846 PyErr_SetString(PyExc_TypeError,
1847 "* argument must be a sequence");
Guido van Rossum25826c92000-04-21 21:17:39 +00001848 goto extcall_fail;
Jeremy Hylton76901512000-03-28 23:49:17 +00001849 }
Jeremy Hylton074c3e62000-03-30 23:55:31 +00001850 /* Convert abstract sequence to concrete tuple */
1851 if (!PyTuple_Check(stararg)) {
1852 PyObject *t = NULL;
1853 t = PySequence_Tuple(stararg);
1854 if (t == NULL) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001855 goto extcall_fail;
Jeremy Hylton074c3e62000-03-30 23:55:31 +00001856 }
1857 Py_DECREF(stararg);
1858 stararg = t;
1859 }
1860 nstar = PyTuple_GET_SIZE(stararg);
Barry Warsaw4961ef72000-03-29 18:30:03 +00001861 if (nstar < 0) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001862 goto extcall_fail;
Barry Warsaw4961ef72000-03-29 18:30:03 +00001863 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001864 }
1865 if (nk > 0) {
1866 if (kwdict == NULL) {
1867 kwdict = PyDict_New();
1868 if (kwdict == NULL) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001869 goto extcall_fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001870 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001871 }
Jeremy Hylton074c3e62000-03-30 23:55:31 +00001872 else {
1873 PyObject *d = PyDict_Copy(kwdict);
1874 if (d == NULL) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001875 goto extcall_fail;
Jeremy Hylton074c3e62000-03-30 23:55:31 +00001876 }
1877 Py_DECREF(kwdict);
1878 kwdict = d;
1879 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001880 err = 0;
1881 while (--nk >= 0) {
1882 PyObject *value = POP();
1883 PyObject *key = POP();
1884 if (PyDict_GetItem(kwdict, key) != NULL) {
1885 err = 1;
1886 PyErr_Format(PyExc_TypeError,
1887 "keyword parameter redefined: %.400s",
1888 PyString_AsString(key));
Jeremy Hylton387b1012000-03-31 01:22:54 +00001889 Py_DECREF(key);
1890 Py_DECREF(value);
Guido van Rossum25826c92000-04-21 21:17:39 +00001891 goto extcall_fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001892 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001893 err = PyDict_SetItem(kwdict, key, value);
1894 Py_DECREF(key);
1895 Py_DECREF(value);
1896 if (err)
1897 break;
1898 }
1899 if (err) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001900 extcall_fail:
1901 Py_XDECREF(kwdict);
1902 Py_XDECREF(stararg);
1903 Py_DECREF(func);
1904 x=NULL;
Jeremy Hylton76901512000-03-28 23:49:17 +00001905 break;
1906 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001907 }
Jeremy Hylton387b1012000-03-31 01:22:54 +00001908 callargs = PyTuple_New(na + nstar);
1909 if (callargs == NULL) {
Jeremy Hylton76901512000-03-28 23:49:17 +00001910 x = NULL;
1911 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001912 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001913 if (stararg) {
Jeremy Hylton76901512000-03-28 23:49:17 +00001914 int i;
Jeremy Hylton76901512000-03-28 23:49:17 +00001915 for (i = 0; i < nstar; i++) {
1916 PyObject *a = PyTuple_GET_ITEM(stararg, i);
1917 Py_INCREF(a);
Jeremy Hylton387b1012000-03-31 01:22:54 +00001918 PyTuple_SET_ITEM(callargs, na + i, a);
Jeremy Hylton76901512000-03-28 23:49:17 +00001919 }
1920 Py_DECREF(stararg);
1921 }
1922 while (--na >= 0) {
1923 w = POP();
Jeremy Hylton387b1012000-03-31 01:22:54 +00001924 PyTuple_SET_ITEM(callargs, na, w);
Jeremy Hylton76901512000-03-28 23:49:17 +00001925 }
Jeremy Hylton387b1012000-03-31 01:22:54 +00001926 x = PyEval_CallObjectWithKeywords(func,
1927 callargs,
1928 kwdict);
1929 Py_DECREF(callargs);
Jeremy Hylton76901512000-03-28 23:49:17 +00001930 Py_XDECREF(kwdict);
1931 }
1932 Py_DECREF(func);
1933 while (stack_pointer > pfunc) {
1934 w = POP();
1935 Py_DECREF(w);
1936 }
1937 PUSH(x);
1938 if (x != NULL) continue;
1939 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001940 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001941
Guido van Rossum681d79a1995-07-18 14:51:37 +00001942 case MAKE_FUNCTION:
1943 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00001944 x = PyFunction_New(v, f->f_globals);
1945 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001946 /* XXX Maybe this should be a separate opcode? */
1947 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001948 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001949 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001950 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001951 x = NULL;
1952 break;
1953 }
1954 while (--oparg >= 0) {
1955 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001956 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001957 }
1958 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001959 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001960 }
1961 PUSH(x);
1962 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001963
1964 case BUILD_SLICE:
1965 if (oparg == 3)
1966 w = POP();
1967 else
1968 w = NULL;
1969 v = POP();
1970 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00001971 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001972 Py_DECREF(u);
1973 Py_DECREF(v);
1974 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00001975 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001976 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00001977 break;
1978
Fred Drakeef8ace32000-08-24 00:32:09 +00001979 case EXTENDED_ARG:
1980 opcode = NEXTOP();
1981 oparg = oparg<<16 | NEXTARG();
1982 goto dispatch_opcode;
1983 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001984
Guido van Rossum374a9221991-04-04 10:40:29 +00001985 default:
1986 fprintf(stderr,
1987 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001988 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00001989 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00001990 why = WHY_EXCEPTION;
1991 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001992
1993#ifdef CASE_TOO_BIG
1994 }
1995#endif
1996
Guido van Rossum374a9221991-04-04 10:40:29 +00001997 } /* switch */
1998
1999 on_error:
2000
2001 /* Quickly continue if no error occurred */
2002
2003 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002004 if (err == 0 && x != NULL) {
2005#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002006 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002007 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002008 fprintf(stderr,
2009 "XXX undetected error\n");
2010 else
2011#endif
2012 continue; /* Normal, fast path */
2013 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002014 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00002015 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00002016 err = 0;
2017 }
2018
Guido van Rossum374a9221991-04-04 10:40:29 +00002019 /* Double-check exception status */
2020
2021 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002022 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002023 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002024 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00002025 why = WHY_EXCEPTION;
2026 }
2027 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002028#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00002029 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002030 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002031 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002032 fprintf(stderr,
2033 "XXX undetected error (why=%d)\n",
2034 why);
2035 why = WHY_EXCEPTION;
2036 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002037 }
2038#endif
2039
2040 /* Log traceback info if this is a real exception */
2041
2042 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002043 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00002044 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00002045 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00002046 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002047
Guido van Rossume59214e1994-08-30 08:01:59 +00002048 if (f->f_trace)
2049 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002050 if (tstate->sys_profilefunc)
2051 call_exc_trace(&tstate->sys_profilefunc,
2052 (PyObject**)0, f);
Guido van Rossum014518f1998-11-23 21:09:51 +00002053 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002054
2055 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
2056
2057 if (why == WHY_RERAISE)
2058 why = WHY_EXCEPTION;
2059
2060 /* Unwind stacks if a (pseudo) exception occurred */
2061
2062 while (why != WHY_NOT && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002063 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00002064 while (STACK_LEVEL() > b->b_level) {
2065 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002066 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002067 }
2068 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2069 why = WHY_NOT;
2070 JUMPTO(b->b_handler);
2071 break;
2072 }
2073 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00002074 (b->b_type == SETUP_EXCEPT &&
2075 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002076 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002077 PyObject *exc, *val, *tb;
2078 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002079 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002080 val = Py_None;
2081 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00002082 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002083 /* Make the raw exception data
2084 available to the handler,
2085 so a program can emulate the
2086 Python main loop. Don't do
2087 this for 'finally'. */
2088 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00002089 PyErr_NormalizeException(
2090 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002091 set_exc_info(tstate,
2092 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002093 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002094 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002095 PUSH(val);
2096 PUSH(exc);
2097 }
2098 else {
2099 if (why == WHY_RETURN)
2100 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00002101 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00002102 PUSH(v);
2103 }
2104 why = WHY_NOT;
2105 JUMPTO(b->b_handler);
2106 break;
2107 }
2108 } /* unwind stack */
2109
2110 /* End the loop if we still have an error (or return) */
2111
2112 if (why != WHY_NOT)
2113 break;
2114
2115 } /* main loop */
2116
2117 /* Pop remaining stack entries */
2118
2119 while (!EMPTY()) {
2120 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002121 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002122 }
2123
Guido van Rossum96a42c81992-01-12 02:29:51 +00002124 if (why != WHY_RETURN)
2125 retval = NULL;
2126
Guido van Rossume59214e1994-08-30 08:01:59 +00002127 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002128 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00002129 if (call_trace(&f->f_trace, &f->f_trace, f,
2130 "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002131 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002132 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002133 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002134 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002135 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002136 }
2137
Guido van Rossuma027efa1997-05-05 20:56:21 +00002138 if (tstate->sys_profilefunc && why == WHY_RETURN) {
2139 if (call_trace(&tstate->sys_profilefunc, (PyObject**)0,
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002140 f, "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002141 Py_XDECREF(retval);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002142 retval = NULL;
2143 why = WHY_EXCEPTION;
2144 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002145 }
Guido van Rossuma4240131997-01-21 21:18:36 +00002146
Guido van Rossuma027efa1997-05-05 20:56:21 +00002147 reset_exc_info(tstate);
2148
2149 --tstate->recursion_depth;
Guido van Rossum8c5df061997-01-24 04:19:24 +00002150
2151 fail: /* Jump here from prelude on failure */
Guido van Rossum96a42c81992-01-12 02:29:51 +00002152
Guido van Rossum374a9221991-04-04 10:40:29 +00002153 /* Restore previous frame and release the current one */
Guido van Rossum681d79a1995-07-18 14:51:37 +00002154
Guido van Rossuma027efa1997-05-05 20:56:21 +00002155 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +00002156 Py_DECREF(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00002157
Guido van Rossum96a42c81992-01-12 02:29:51 +00002158 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00002159}
2160
Guido van Rossuma027efa1997-05-05 20:56:21 +00002161static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002162set_exc_info(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002163{
2164 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002165 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00002166
Guido van Rossuma027efa1997-05-05 20:56:21 +00002167 frame = tstate->frame;
2168 if (frame->f_exc_type == NULL) {
2169 /* This frame didn't catch an exception before */
2170 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002171 if (tstate->exc_type == NULL) {
2172 Py_INCREF(Py_None);
2173 tstate->exc_type = Py_None;
2174 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002175 tmp_type = frame->f_exc_type;
2176 tmp_value = frame->f_exc_value;
2177 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002178 Py_XINCREF(tstate->exc_type);
2179 Py_XINCREF(tstate->exc_value);
2180 Py_XINCREF(tstate->exc_traceback);
2181 frame->f_exc_type = tstate->exc_type;
2182 frame->f_exc_value = tstate->exc_value;
2183 frame->f_exc_traceback = tstate->exc_traceback;
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 }
2188 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002189 tmp_type = tstate->exc_type;
2190 tmp_value = tstate->exc_value;
2191 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002192 Py_XINCREF(type);
2193 Py_XINCREF(value);
2194 Py_XINCREF(tb);
2195 tstate->exc_type = type;
2196 tstate->exc_value = value;
2197 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002198 Py_XDECREF(tmp_type);
2199 Py_XDECREF(tmp_value);
2200 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002201 /* For b/w compatibility */
2202 PySys_SetObject("exc_type", type);
2203 PySys_SetObject("exc_value", value);
2204 PySys_SetObject("exc_traceback", tb);
2205}
2206
2207static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002208reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002209{
2210 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002211 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002212 frame = tstate->frame;
2213 if (frame->f_exc_type != NULL) {
2214 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002215 tmp_type = tstate->exc_type;
2216 tmp_value = tstate->exc_value;
2217 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002218 Py_XINCREF(frame->f_exc_type);
2219 Py_XINCREF(frame->f_exc_value);
2220 Py_XINCREF(frame->f_exc_traceback);
2221 tstate->exc_type = frame->f_exc_type;
2222 tstate->exc_value = frame->f_exc_value;
2223 tstate->exc_traceback = frame->f_exc_traceback;
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 /* For b/w compatibility */
2228 PySys_SetObject("exc_type", frame->f_exc_type);
2229 PySys_SetObject("exc_value", frame->f_exc_value);
2230 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
2231 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002232 tmp_type = frame->f_exc_type;
2233 tmp_value = frame->f_exc_value;
2234 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002235 frame->f_exc_type = NULL;
2236 frame->f_exc_value = NULL;
2237 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002238 Py_XDECREF(tmp_type);
2239 Py_XDECREF(tmp_value);
2240 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002241}
2242
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002243/* Logic for the raise statement (too complicated for inlining).
2244 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00002245static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002246do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002247{
Guido van Rossumd295f121998-04-09 21:39:57 +00002248 if (type == NULL) {
2249 /* Reraise */
2250 PyThreadState *tstate = PyThreadState_Get();
2251 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
2252 value = tstate->exc_value;
2253 tb = tstate->exc_traceback;
2254 Py_XINCREF(type);
2255 Py_XINCREF(value);
2256 Py_XINCREF(tb);
2257 }
2258
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002259 /* We support the following forms of raise:
2260 raise <class>, <classinstance>
2261 raise <class>, <argument tuple>
2262 raise <class>, None
2263 raise <class>, <argument>
2264 raise <classinstance>, None
2265 raise <string>, <object>
2266 raise <string>, None
2267
2268 An omitted second argument is the same as None.
2269
2270 In addition, raise <tuple>, <anything> is the same as
2271 raising the tuple's first item (and it better have one!);
2272 this rule is applied recursively.
2273
2274 Finally, an optional third argument can be supplied, which
2275 gives the traceback to be substituted (useful when
2276 re-raising an exception after examining it). */
2277
2278 /* First, check the traceback argument, replacing None with
2279 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002280 if (tb == Py_None) {
2281 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002282 tb = NULL;
2283 }
2284 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002285 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002286 "raise 3rd arg must be traceback or None");
2287 goto raise_error;
2288 }
2289
2290 /* Next, replace a missing value with None */
2291 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002292 value = Py_None;
2293 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002294 }
2295
2296 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002297 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2298 PyObject *tmp = type;
2299 type = PyTuple_GET_ITEM(type, 0);
2300 Py_INCREF(type);
2301 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002302 }
2303
Barry Warsaw4249f541997-08-22 21:26:19 +00002304 if (PyString_Check(type))
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002305 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002306
2307 else if (PyClass_Check(type))
2308 PyErr_NormalizeException(&type, &value, &tb);
2309
Guido van Rossumb209a111997-04-29 18:18:01 +00002310 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002311 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002312 if (value != Py_None) {
2313 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002314 "instance exception may not have a separate value");
2315 goto raise_error;
2316 }
2317 else {
2318 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002319 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002320 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002321 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2322 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002323 }
2324 }
2325 else {
2326 /* Not something you can raise. You get an exception
2327 anyway, just not what you specified :-) */
Guido van Rossumb209a111997-04-29 18:18:01 +00002328 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002329 "exceptions must be strings, classes, or instances");
2330 goto raise_error;
2331 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002332 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002333 if (tb == NULL)
2334 return WHY_EXCEPTION;
2335 else
2336 return WHY_RERAISE;
2337 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002338 Py_XDECREF(value);
2339 Py_XDECREF(type);
2340 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002341 return WHY_EXCEPTION;
2342}
2343
Barry Warsawe42b18f1997-08-25 22:13:04 +00002344static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002345unpack_sequence(PyObject *v, int argcnt, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00002346{
2347 int i;
2348 PyObject *w;
2349
2350 for (i = 0; i < argcnt; i++) {
2351 if (! (w = PySequence_GetItem(v, i))) {
2352 if (PyErr_ExceptionMatches(PyExc_IndexError))
2353 PyErr_SetString(PyExc_ValueError,
2354 "unpack sequence of wrong size");
2355 goto finally;
2356 }
2357 *--sp = w;
2358 }
2359 /* we better get an IndexError now */
2360 if (PySequence_GetItem(v, i) == NULL) {
2361 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
2362 PyErr_Clear();
2363 return 1;
2364 }
2365 /* some other exception occurred. fall through to finally */
2366 }
2367 else
2368 PyErr_SetString(PyExc_ValueError,
2369 "unpack sequence of wrong size");
2370 /* fall through */
2371finally:
Barry Warsaw91010551997-08-25 22:30:51 +00002372 for (; i > 0; i--, sp++)
2373 Py_DECREF(*sp);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002374
2375 return 0;
2376}
2377
2378
Guido van Rossum96a42c81992-01-12 02:29:51 +00002379#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002380static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002381prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002382{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002383 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002384 if (PyObject_Print(v, stdout, 0) != 0)
2385 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002386 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00002387 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002388}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002389#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002390
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002391static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002392call_exc_trace(PyObject **p_trace, PyObject **p_newtrace, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002393{
Guido van Rossumb209a111997-04-29 18:18:01 +00002394 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002395 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002396 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002397 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002398 value = Py_None;
2399 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002400 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002401 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002402 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002403 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002404 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002405 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002406 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002407 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002408 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002409 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002410 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002411 Py_XDECREF(type);
2412 Py_XDECREF(value);
2413 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002414 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002415}
2416
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002417/* PyObject **p_trace: in/out; may not be NULL;
2418 may not point to NULL variable initially
2419 PyObject **p_newtrace: in/out; may be NULL;
2420 may point to NULL variable;
2421 may be same variable as p_newtrace */
2422
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002423static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002424call_trace(PyObject **p_trace, PyObject **p_newtrace, PyFrameObject *f,
2425 char *msg, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002426{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002427 PyThreadState *tstate = f->f_tstate;
Guido van Rossumb209a111997-04-29 18:18:01 +00002428 PyObject *args, *what;
2429 PyObject *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002430
Guido van Rossuma027efa1997-05-05 20:56:21 +00002431 if (tstate->tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002432 /* Don't do recursive traces */
2433 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002434 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002435 *p_newtrace = NULL;
2436 }
2437 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002438 }
2439
Guido van Rossumb209a111997-04-29 18:18:01 +00002440 args = PyTuple_New(3);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002441 if (args == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002442 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002443 what = PyString_FromString(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002444 if (what == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002445 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002446 Py_INCREF(f);
2447 PyTuple_SET_ITEM(args, 0, (PyObject *)f);
2448 PyTuple_SET_ITEM(args, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002449 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002450 arg = Py_None;
2451 Py_INCREF(arg);
2452 PyTuple_SET_ITEM(args, 2, arg);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002453 tstate->tracing++;
Guido van Rossumb209a111997-04-29 18:18:01 +00002454 PyFrame_FastToLocals(f);
2455 res = PyEval_CallObject(*p_trace, args); /* May clear *p_trace! */
2456 PyFrame_LocalsToFast(f, 1);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002457 tstate->tracing--;
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002458 cleanup:
Guido van Rossumb209a111997-04-29 18:18:01 +00002459 Py_XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002460 if (res == NULL) {
2461 /* The trace proc raised an exception */
Guido van Rossumb209a111997-04-29 18:18:01 +00002462 PyTraceBack_Here(f);
2463 Py_XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002464 *p_trace = NULL;
2465 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002466 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002467 *p_newtrace = NULL;
2468 }
Barry Warsawf6202631999-09-08 16:26:33 +00002469 /* to be extra double plus sure we don't get recursive
2470 * calls inf either tracefunc or profilefunc gets an
2471 * exception, zap the global variables.
2472 */
2473 Py_XDECREF(tstate->sys_tracefunc);
2474 tstate->sys_tracefunc = NULL;
2475 Py_XDECREF(tstate->sys_profilefunc);
2476 tstate->sys_profilefunc = NULL;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002477 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002478 }
2479 else {
2480 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002481 Py_XDECREF(*p_newtrace);
2482 if (res == Py_None)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002483 *p_newtrace = NULL;
2484 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002485 Py_INCREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002486 *p_newtrace = res;
2487 }
2488 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002489 Py_DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002490 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002491 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002492}
2493
Guido van Rossumb209a111997-04-29 18:18:01 +00002494PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002495PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002496{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002497 PyThreadState *tstate = PyThreadState_Get();
2498 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002499 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002500 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002501 else
2502 return current_frame->f_builtins;
2503}
2504
Guido van Rossumb209a111997-04-29 18:18:01 +00002505PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002506PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00002507{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002508 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002509 if (current_frame == NULL)
2510 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002511 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002512 return current_frame->f_locals;
2513}
2514
Guido van Rossumb209a111997-04-29 18:18:01 +00002515PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002516PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002517{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002518 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002519 if (current_frame == NULL)
2520 return NULL;
2521 else
2522 return current_frame->f_globals;
2523}
2524
Guido van Rossumb209a111997-04-29 18:18:01 +00002525PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002526PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00002527{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002528 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002529 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002530}
2531
Guido van Rossum6135a871995-01-09 17:53:26 +00002532int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002533PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002534{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002535 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002536 return current_frame == NULL ? 0 : current_frame->f_restricted;
2537}
2538
Guido van Rossumbe270261997-05-22 22:26:18 +00002539int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002540Py_FlushLine(void)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002541{
Guido van Rossumb209a111997-04-29 18:18:01 +00002542 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002543 if (f == NULL)
2544 return 0;
2545 if (!PyFile_SoftSpace(f, 0))
2546 return 0;
2547 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002548}
2549
Guido van Rossum3f5da241990-12-20 15:06:42 +00002550
Guido van Rossum681d79a1995-07-18 14:51:37 +00002551/* External interface to call any callable object.
2552 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002553
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002554#undef PyEval_CallObject
2555/* for backward compatibility: export this interface */
2556
Guido van Rossumb209a111997-04-29 18:18:01 +00002557PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002558PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002559{
Guido van Rossumb209a111997-04-29 18:18:01 +00002560 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002561}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002562#define PyEval_CallObject(func,arg) \
2563 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00002564
Guido van Rossumb209a111997-04-29 18:18:01 +00002565PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002566PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002567{
2568 ternaryfunc call;
Guido van Rossumb209a111997-04-29 18:18:01 +00002569 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002570
2571 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002572 arg = PyTuple_New(0);
2573 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002574 PyErr_SetString(PyExc_TypeError,
2575 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002576 return NULL;
2577 }
2578 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002579 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002580
Guido van Rossumb209a111997-04-29 18:18:01 +00002581 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002582 PyErr_SetString(PyExc_TypeError,
2583 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00002584 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00002585 return NULL;
2586 }
2587
Guido van Rossum150b2df1996-12-05 23:17:11 +00002588 if ((call = func->ob_type->tp_call) != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002589 result = (*call)(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002590 else if (PyMethod_Check(func) || PyFunction_Check(func))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002591 result = call_function(func, arg, kw);
2592 else
2593 result = call_builtin(func, arg, kw);
2594
Guido van Rossumb209a111997-04-29 18:18:01 +00002595 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002596
Guido van Rossumb209a111997-04-29 18:18:01 +00002597 if (result == NULL && !PyErr_Occurred())
2598 PyErr_SetString(PyExc_SystemError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002599 "NULL result without error in call_object");
Guido van Rossume59214e1994-08-30 08:01:59 +00002600
2601 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002602}
2603
Guido van Rossumb209a111997-04-29 18:18:01 +00002604static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002605call_builtin(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002606{
Guido van Rossumb209a111997-04-29 18:18:01 +00002607 if (PyCFunction_Check(func)) {
2608 PyCFunction meth = PyCFunction_GetFunction(func);
2609 PyObject *self = PyCFunction_GetSelf(func);
2610 int flags = PyCFunction_GetFlags(func);
Guido van Rossumff8b4941995-07-26 18:16:42 +00002611 if (!(flags & METH_VARARGS)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002612 int size = PyTuple_Size(arg);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002613 if (size == 1)
Guido van Rossumb209a111997-04-29 18:18:01 +00002614 arg = PyTuple_GET_ITEM(arg, 0);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002615 else if (size == 0)
2616 arg = NULL;
2617 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002618 if (flags & METH_KEYWORDS)
2619 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002620 if (kw != NULL && PyDict_Size(kw) != 0) {
2621 PyErr_SetString(PyExc_TypeError,
Guido van Rossumff8b4941995-07-26 18:16:42 +00002622 "this function takes no keyword arguments");
2623 return NULL;
2624 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002625 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002626 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002627 if (PyClass_Check(func)) {
2628 return PyInstance_New(func, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002629 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002630 if (PyInstance_Check(func)) {
2631 PyObject *res, *call = PyObject_GetAttrString(func,"__call__");
Guido van Rossume59214e1994-08-30 08:01:59 +00002632 if (call == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002633 PyErr_Clear();
2634 PyErr_SetString(PyExc_AttributeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002635 "no __call__ method defined");
Guido van Rossume59214e1994-08-30 08:01:59 +00002636 return NULL;
2637 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002638 res = PyEval_CallObjectWithKeywords(call, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002639 Py_DECREF(call);
Guido van Rossume59214e1994-08-30 08:01:59 +00002640 return res;
2641 }
Guido van Rossumba98a421999-11-15 19:29:33 +00002642 PyErr_Format(PyExc_TypeError, "call of non-function (type %.400s)",
Guido van Rossum2d1ad391998-08-25 18:16:54 +00002643 func->ob_type->tp_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002644 return NULL;
2645}
2646
Guido van Rossumb209a111997-04-29 18:18:01 +00002647static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002648call_function(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002649{
Guido van Rossumb209a111997-04-29 18:18:01 +00002650 PyObject *class = NULL; /* == owner */
2651 PyObject *argdefs;
2652 PyObject **d, **k;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002653 int nk, nd;
Guido van Rossumb209a111997-04-29 18:18:01 +00002654 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002655
Guido van Rossumb209a111997-04-29 18:18:01 +00002656 if (kw != NULL && !PyDict_Check(kw)) {
2657 PyErr_BadInternalCall();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002658 return NULL;
2659 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002660
Guido van Rossumb209a111997-04-29 18:18:01 +00002661 if (PyMethod_Check(func)) {
2662 PyObject *self = PyMethod_Self(func);
2663 class = PyMethod_Class(func);
2664 func = PyMethod_Function(func);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002665 if (self == NULL) {
2666 /* Unbound methods must be called with an instance of
2667 the class (or a derived class) as first argument */
Guido van Rossumb209a111997-04-29 18:18:01 +00002668 if (PyTuple_Size(arg) >= 1) {
2669 self = PyTuple_GET_ITEM(arg, 0);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002670 if (self != NULL &&
Guido van Rossumb209a111997-04-29 18:18:01 +00002671 PyInstance_Check(self) &&
2672 PyClass_IsSubclass((PyObject *)
2673 (((PyInstanceObject *)self)->in_class),
Guido van Rossumb3f72581993-05-21 19:56:10 +00002674 class))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002675 /* Handy-dandy */ ;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002676 else
2677 self = NULL;
2678 }
2679 if (self == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002680 PyErr_SetString(PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002681 "unbound method must be called with class instance 1st argument");
Guido van Rossumb3f72581993-05-21 19:56:10 +00002682 return NULL;
2683 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002684 Py_INCREF(arg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002685 }
2686 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002687 int argcount = PyTuple_Size(arg);
2688 PyObject *newarg = PyTuple_New(argcount + 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002689 int i;
Guido van Rossum81daa321993-05-20 14:24:46 +00002690 if (newarg == NULL)
2691 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002692 Py_INCREF(self);
2693 PyTuple_SET_ITEM(newarg, 0, self);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002694 for (i = 0; i < argcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002695 PyObject *v = PyTuple_GET_ITEM(arg, i);
2696 Py_XINCREF(v);
2697 PyTuple_SET_ITEM(newarg, i+1, v);
Guido van Rossum81daa321993-05-20 14:24:46 +00002698 }
2699 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002700 }
Guido van Rossum7859f871998-07-08 14:58:16 +00002701 if (!PyFunction_Check(func)) {
2702 result = PyEval_CallObjectWithKeywords(func, arg, kw);
2703 Py_DECREF(arg);
2704 return result;
2705 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002706 }
2707 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002708 if (!PyFunction_Check(func)) {
Guido van Rossum2d1ad391998-08-25 18:16:54 +00002709 PyErr_Format(PyExc_TypeError,
Guido van Rossum5db862d2000-04-10 12:46:51 +00002710 "call of non-function (type %.200s)",
Guido van Rossum2d1ad391998-08-25 18:16:54 +00002711 func->ob_type->tp_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002712 return NULL;
2713 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002714 Py_INCREF(arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002715 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002716
2717 argdefs = PyFunction_GetDefaults(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00002718 if (argdefs != NULL && PyTuple_Check(argdefs)) {
2719 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
2720 nd = PyTuple_Size(argdefs);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002721 }
2722 else {
2723 d = NULL;
2724 nd = 0;
2725 }
2726
2727 if (kw != NULL) {
2728 int pos, i;
Guido van Rossumb209a111997-04-29 18:18:01 +00002729 nk = PyDict_Size(kw);
2730 k = PyMem_NEW(PyObject *, 2*nk);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002731 if (k == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002732 PyErr_NoMemory();
2733 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002734 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00002735 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002736 pos = i = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00002737 while (PyDict_Next(kw, &pos, &k[i], &k[i+1]))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002738 i += 2;
2739 nk = i/2;
2740 /* XXX This is broken if the caller deletes dict items! */
2741 }
2742 else {
2743 k = NULL;
2744 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00002745 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002746
Guido van Rossum681d79a1995-07-18 14:51:37 +00002747 result = eval_code2(
Guido van Rossumb209a111997-04-29 18:18:01 +00002748 (PyCodeObject *)PyFunction_GetCode(func),
2749 PyFunction_GetGlobals(func), (PyObject *)NULL,
2750 &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg),
Guido van Rossum681d79a1995-07-18 14:51:37 +00002751 k, nk,
2752 d, nd,
2753 class);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002754
Guido van Rossumb209a111997-04-29 18:18:01 +00002755 Py_DECREF(arg);
Guido van Rossumb18618d2000-05-03 23:44:39 +00002756 if (k != NULL)
2757 PyMem_DEL(k);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002758
Guido van Rossum681d79a1995-07-18 14:51:37 +00002759 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002760}
2761
Guido van Rossum3b9c6671996-07-30 18:40:29 +00002762#define SLICE_ERROR_MSG \
2763 "standard sequence type does not support step size other than one"
2764
Guido van Rossumb209a111997-04-29 18:18:01 +00002765static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002766loop_subscript(PyObject *v, PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002767{
Guido van Rossumb209a111997-04-29 18:18:01 +00002768 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00002769 int i;
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00002770 if (sq == NULL || sq->sq_item == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002771 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002772 return NULL;
2773 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002774 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00002775 v = (*sq->sq_item)(v, i);
2776 if (v)
2777 return v;
Barry Warsaw4249f541997-08-22 21:26:19 +00002778 if (PyErr_ExceptionMatches(PyExc_IndexError))
Guido van Rossumb209a111997-04-29 18:18:01 +00002779 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00002780 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002781}
2782
Guido van Rossum20c6add2000-05-08 14:06:50 +00002783/* Extract a slice index from a PyInt or PyLong, the index is bound to
2784 the range [-INT_MAX+1, INTMAX]. Returns 0 and an exception if there is
2785 and error. Returns 1 on success.*/
2786
2787int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002788_PyEval_SliceIndex(PyObject *v, int *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002789{
2790 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002791 long x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00002792 if (PyInt_Check(v)) {
2793 x = PyInt_AsLong(v);
2794 } else if (PyLong_Check(v)) {
2795 x = PyLong_AsLong(v);
2796 if (x==-1 && PyErr_Occurred()) {
2797 PyObject *long_zero;
2798
2799 if (!PyErr_ExceptionMatches( PyExc_OverflowError ) ) {
2800 /* It's not an overflow error, so just
2801 signal an error */
Guido van Rossum20c6add2000-05-08 14:06:50 +00002802 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00002803 }
2804
2805 /* It's an overflow error, so we need to
2806 check the sign of the long integer,
2807 set the value to INT_MAX or 0, and clear
2808 the error. */
2809
2810 /* Create a long integer with a value of 0 */
2811 long_zero = PyLong_FromLong( 0L );
Guido van Rossum20c6add2000-05-08 14:06:50 +00002812 if (long_zero == NULL) return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00002813
2814 /* Check sign */
2815 if (PyObject_Compare(long_zero, v) < 0)
2816 x = INT_MAX;
2817 else
2818 x = 0;
2819
2820 /* Free the long integer we created, and clear the
2821 OverflowError */
2822 Py_DECREF(long_zero);
2823 PyErr_Clear();
2824 }
2825 } else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002826 PyErr_SetString(PyExc_TypeError,
2827 "slice index must be int");
Guido van Rossum20c6add2000-05-08 14:06:50 +00002828 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002829 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00002830 /* Truncate -- very long indices are truncated anyway */
2831 if (x > INT_MAX)
2832 x = INT_MAX;
2833 else if (x < -INT_MAX)
2834 x = 0;
2835 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002836 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00002837 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002838}
2839
Guido van Rossumb209a111997-04-29 18:18:01 +00002840static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002841apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002842{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002843 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00002844 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002845 return NULL;
Guido van Rossum20c6add2000-05-08 14:06:50 +00002846 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum04691fc1992-08-12 15:35:34 +00002847 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002848 return PySequence_GetSlice(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002849}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002850
2851static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002852assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002853{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002854 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00002855 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum3f5da241990-12-20 15:06:42 +00002856 return -1;
Guido van Rossum20c6add2000-05-08 14:06:50 +00002857 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum3f5da241990-12-20 15:06:42 +00002858 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002859 if (x == NULL)
2860 return PySequence_DelSlice(u, ilow, ihigh);
2861 else
2862 return PySequence_SetSlice(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002863}
2864
Guido van Rossumb209a111997-04-29 18:18:01 +00002865static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002866cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002867{
2868 register int cmp;
2869 register int res = 0;
2870 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002871 case IS:
2872 case IS_NOT:
2873 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002874 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002875 res = !res;
2876 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002877 case IN:
2878 case NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00002879 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002880 if (res < 0)
2881 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002882 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002883 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002884 break;
2885 case EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00002886 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002887 break;
2888 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00002889 cmp = PyObject_Compare(v, w);
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002890 if (cmp && PyErr_Occurred())
2891 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002892 switch (op) {
2893 case LT: res = cmp < 0; break;
2894 case LE: res = cmp <= 0; break;
2895 case EQ: res = cmp == 0; break;
2896 case NE: res = cmp != 0; break;
2897 case GT: res = cmp > 0; break;
2898 case GE: res = cmp >= 0; break;
2899 /* XXX no default? (res is initialized to 0 though) */
2900 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002901 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002902 v = res ? Py_True : Py_False;
2903 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002904 return v;
2905}
2906
Thomas Wouters52152252000-08-17 22:55:00 +00002907static PyObject *
2908import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00002909{
Guido van Rossumb209a111997-04-29 18:18:01 +00002910 PyObject *w, *x;
2911 if (!PyModule_Check(v)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002912 PyErr_SetString(PyExc_TypeError,
2913 "import-from requires module object");
Thomas Wouters52152252000-08-17 22:55:00 +00002914 return NULL;
2915 }
2916 w = PyModule_GetDict(v); /* TDB: can this not fail ? */
2917 x = PyDict_GetItem(w, name);
2918 if (x == NULL) {
2919 PyErr_Format(PyExc_ImportError,
2920 "cannot import name %.230s",
2921 PyString_AsString(name));
2922 } else
2923 Py_INCREF(x);
2924 return x;
2925}
2926
2927static int
2928import_all_from(PyObject *locals, PyObject *v)
2929{
2930 int pos = 0, err;
2931 PyObject *name, *value;
2932 PyObject *w;
2933
2934 if (!PyModule_Check(v)) {
2935 PyErr_SetString(PyExc_TypeError,
2936 "import-from requires module object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002937 return -1;
2938 }
Thomas Wouters52152252000-08-17 22:55:00 +00002939 w = PyModule_GetDict(v); /* TBD: can this not fail ? */
2940
2941 while (PyDict_Next(w, &pos, &name, &value)) {
2942 if (!PyString_Check(name) ||
2943 PyString_AsString(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002944 continue;
Thomas Wouters52152252000-08-17 22:55:00 +00002945 Py_INCREF(value);
2946 err = PyDict_SetItem(locals, name, value);
2947 Py_DECREF(value);
2948 if (err != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002949 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002950 }
Thomas Wouters52152252000-08-17 22:55:00 +00002951 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002952}
2953
Guido van Rossumb209a111997-04-29 18:18:01 +00002954static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002955build_class(PyObject *methods, PyObject *bases, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00002956{
Guido van Rossumcd649651997-08-22 16:56:16 +00002957 int i, n;
Guido van Rossumb209a111997-04-29 18:18:01 +00002958 if (!PyTuple_Check(bases)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002959 PyErr_SetString(PyExc_SystemError,
2960 "build_class with non-tuple bases");
Guido van Rossum25831651993-05-19 14:50:45 +00002961 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002962 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002963 if (!PyDict_Check(methods)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002964 PyErr_SetString(PyExc_SystemError,
2965 "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002966 return NULL;
2967 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002968 if (!PyString_Check(name)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002969 PyErr_SetString(PyExc_SystemError,
Guido van Rossum7a5b7962000-03-31 13:52:29 +00002970 "build_class with non-string name");
Guido van Rossum25831651993-05-19 14:50:45 +00002971 return NULL;
2972 }
Guido van Rossumcd649651997-08-22 16:56:16 +00002973 n = PyTuple_Size(bases);
2974 for (i = 0; i < n; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002975 PyObject *base = PyTuple_GET_ITEM(bases, i);
2976 if (!PyClass_Check(base)) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002977 /* Call the base's *type*, if it is callable.
2978 This code is a hook for Donald Beaudry's
2979 and Jim Fulton's type extensions. In
Thomas Wouters7e474022000-07-16 12:04:32 +00002980 unextended Python it will never be triggered
Guido van Rossum55b9ab51997-07-31 03:54:02 +00002981 since its types are not callable.
2982 Ditto: call the bases's *class*, if it has
2983 one. This makes the same thing possible
2984 without writing C code. A true meta-object
2985 protocol! */
2986 PyObject *basetype = (PyObject *)base->ob_type;
2987 PyObject *callable = NULL;
2988 if (PyCallable_Check(basetype))
2989 callable = basetype;
2990 else
2991 callable = PyObject_GetAttrString(
2992 base, "__class__");
2993 if (callable) {
2994 PyObject *args;
2995 PyObject *newclass = NULL;
2996 args = Py_BuildValue(
2997 "(OOO)", name, bases, methods);
2998 if (args != NULL) {
2999 newclass = PyEval_CallObject(
3000 callable, args);
3001 Py_DECREF(args);
3002 }
Guido van Rossum730806d1998-04-10 22:27:42 +00003003 if (callable != basetype) {
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003004 Py_DECREF(callable);
Guido van Rossum730806d1998-04-10 22:27:42 +00003005 }
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003006 return newclass;
Guido van Rossum150b2df1996-12-05 23:17:11 +00003007 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003008 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +00003009 "base is not a class object");
3010 return NULL;
3011 }
3012 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003013 return PyClass_New(bases, methods, name);
Guido van Rossum25831651993-05-19 14:50:45 +00003014}
3015
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003016static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003017exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
3018 PyObject *locals)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003019{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003020 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003021 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003022 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003023
Guido van Rossumb209a111997-04-29 18:18:01 +00003024 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
3025 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003026 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00003027 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003028 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00003029 locals = PyTuple_GetItem(prog, 2);
3030 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003031 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003032 if (globals == Py_None) {
3033 globals = PyEval_GetGlobals();
3034 if (locals == Py_None) {
3035 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003036 plain = 1;
3037 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003038 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003039 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003040 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00003041 if (!PyString_Check(prog) &&
3042 !PyCode_Check(prog) &&
3043 !PyFile_Check(prog)) {
3044 PyErr_SetString(PyExc_TypeError,
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003045 "exec 1st arg must be string, code or file object");
3046 return -1;
3047 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003048 if (!PyDict_Check(globals) || !PyDict_Check(locals)) {
3049 PyErr_SetString(PyExc_TypeError,
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003050 "exec 2nd/3rd args must be dict or None");
3051 return -1;
3052 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003053 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00003054 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00003055 if (PyCode_Check(prog)) {
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003056 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003057 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003058 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003059 FILE *fp = PyFile_AsFile(prog);
3060 char *name = PyString_AsString(PyFile_Name(prog));
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003061 v = PyRun_File(fp, name, Py_file_input, globals, locals);
3062 }
3063 else {
3064 char *s = PyString_AsString(prog);
Guido van Rossum582acec2000-06-28 22:07:35 +00003065 if (strlen(s) != (size_t)PyString_Size(prog)) {
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003066 PyErr_SetString(PyExc_ValueError,
3067 "embedded '\\0' in exec string");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003068 return -1;
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003069 }
3070 v = PyRun_String(s, Py_file_input, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003071 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003072 if (plain)
3073 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003074 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003075 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00003076 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003077 return 0;
3078}
Guido van Rossum24c13741995-02-14 09:42:43 +00003079
Paul Prescode68140d2000-08-30 20:25:01 +00003080static void
3081format_exc_check_arg(PyObject *exc, char *format_str, PyObject *obj)
3082{
3083 char *obj_str;
3084
3085 if (!obj)
3086 return;
3087
3088 obj_str = PyString_AsString(obj);
3089 if (!obj_str)
3090 return;
3091
3092 PyErr_Format(exc, format_str, obj_str);
3093}
Guido van Rossum950361c1997-01-24 13:49:28 +00003094
3095#ifdef DYNAMIC_EXECUTION_PROFILE
3096
3097PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003098getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00003099{
3100 int i;
3101 PyObject *l = PyList_New(256);
3102 if (l == NULL) return NULL;
3103 for (i = 0; i < 256; i++) {
3104 PyObject *x = PyInt_FromLong(a[i]);
3105 if (x == NULL) {
3106 Py_DECREF(l);
3107 return NULL;
3108 }
3109 PyList_SetItem(l, i, x);
3110 }
3111 for (i = 0; i < 256; i++)
3112 a[i] = 0;
3113 return l;
3114}
3115
3116PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003117_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00003118{
3119#ifndef DXPAIRS
3120 return getarray(dxp);
3121#else
3122 int i;
3123 PyObject *l = PyList_New(257);
3124 if (l == NULL) return NULL;
3125 for (i = 0; i < 257; i++) {
3126 PyObject *x = getarray(dxpairs[i]);
3127 if (x == NULL) {
3128 Py_DECREF(l);
3129 return NULL;
3130 }
3131 PyList_SetItem(l, i, x);
3132 }
3133 return l;
3134#endif
3135}
3136
3137#endif