blob: 2648add5584e2a30b9cfcf67b522092539d3e0ed [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 *);
74static PyObject *find_from_args(PyFrameObject *, int);
75static void set_exc_info(PyThreadState *, PyObject *, PyObject *, PyObject *);
76static void reset_exc_info(PyThreadState *);
Guido van Rossum374a9221991-04-04 10:40:29 +000077
78
Guido van Rossum950361c1997-01-24 13:49:28 +000079/* Dynamic execution profile */
80#ifdef DYNAMIC_EXECUTION_PROFILE
81#ifdef DXPAIRS
82static long dxpairs[257][256];
83#define dxp dxpairs[256]
84#else
85static long dxp[256];
86#endif
87#endif
88
89
Guido van Rossume59214e1994-08-30 08:01:59 +000090#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +000091
Guido van Rossum2571cc81999-04-07 16:07:23 +000092#ifndef DONT_HAVE_ERRNO_H
Guido van Rossum1984f1e1992-08-04 12:41:02 +000093#include <errno.h>
Guido van Rossum2571cc81999-04-07 16:07:23 +000094#endif
Guido van Rossum49b56061998-10-01 20:42:43 +000095#include "pythread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000096
Guido van Rossuma027efa1997-05-05 20:56:21 +000097extern int _PyThread_Started; /* Flag for Py_Exit */
98
Guido van Rossum65d5b571998-12-21 19:32:43 +000099static PyThread_type_lock interpreter_lock = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000100static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000101
102void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000103PyEval_InitThreads(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000104{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000105 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000106 return;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000107 _PyThread_Started = 1;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000108 interpreter_lock = PyThread_allocate_lock();
109 PyThread_acquire_lock(interpreter_lock, 1);
110 main_thread = PyThread_get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000111}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000112
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000113void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000114PyEval_AcquireLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000115{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000116 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000117}
118
119void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000120PyEval_ReleaseLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000121{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000122 PyThread_release_lock(interpreter_lock);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000123}
124
125void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000126PyEval_AcquireThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000127{
128 if (tstate == NULL)
129 Py_FatalError("PyEval_AcquireThread: NULL new thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000130 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000131 if (PyThreadState_Swap(tstate) != NULL)
132 Py_FatalError(
133 "PyEval_AcquireThread: non-NULL old thread state");
134}
135
136void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000137PyEval_ReleaseThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000138{
139 if (tstate == NULL)
140 Py_FatalError("PyEval_ReleaseThread: NULL thread state");
141 if (PyThreadState_Swap(NULL) != tstate)
142 Py_FatalError("PyEval_ReleaseThread: wrong thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000143 PyThread_release_lock(interpreter_lock);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000144}
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000145
146/* This function is called from PyOS_AfterFork to ensure that newly
147 created child processes don't hold locks referring to threads which
148 are not running in the child process. (This could also be done using
149 pthread_atfork mechanism, at least for the pthreads implementation.) */
150
151void
152PyEval_ReInitThreads(void)
153{
154 if (!interpreter_lock)
155 return;
156 /*XXX Can't use PyThread_free_lock here because it does too
157 much error-checking. Doing this cleanly would require
158 adding a new function to each thread_*.h. Instead, just
159 create a new lock and waste a little bit of memory */
160 interpreter_lock = PyThread_allocate_lock();
161 PyThread_acquire_lock(interpreter_lock, 1);
162 main_thread = PyThread_get_thread_ident();
163}
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000164#endif
165
Guido van Rossumff4949e1992-08-05 19:58:53 +0000166/* Functions save_thread and restore_thread are always defined so
167 dynamically loaded modules needn't be compiled separately for use
168 with and without threads: */
169
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000170PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000171PyEval_SaveThread(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000172{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000173 PyThreadState *tstate = PyThreadState_Swap(NULL);
174 if (tstate == NULL)
175 Py_FatalError("PyEval_SaveThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000176#ifdef WITH_THREAD
Guido van Rossumb74eca91997-09-30 22:03:16 +0000177 if (interpreter_lock)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000178 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000179#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000180 return tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000181}
182
183void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000184PyEval_RestoreThread(PyThreadState *tstate)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000185{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000186 if (tstate == NULL)
187 Py_FatalError("PyEval_RestoreThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000188#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000189 if (interpreter_lock) {
Guido van Rossumb74eca91997-09-30 22:03:16 +0000190 int err = errno;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000191 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000192 errno = err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000193 }
194#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000195 PyThreadState_Swap(tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000196}
197
198
Guido van Rossuma9672091994-09-14 13:31:22 +0000199/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
200 signal handlers or Mac I/O completion routines) can schedule calls
201 to a function to be called synchronously.
202 The synchronous function is called with one void* argument.
203 It should return 0 for success or -1 for failure -- failure should
204 be accompanied by an exception.
205
206 If registry succeeds, the registry function returns 0; if it fails
207 (e.g. due to too many pending calls) it returns -1 (without setting
208 an exception condition).
209
210 Note that because registry may occur from within signal handlers,
211 or other asynchronous events, calling malloc() is unsafe!
212
213#ifdef WITH_THREAD
214 Any thread can schedule pending calls, but only the main thread
215 will execute them.
216#endif
217
218 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
219 There are two possible race conditions:
220 (1) nested asynchronous registry calls;
221 (2) registry calls made while pending calls are being processed.
222 While (1) is very unlikely, (2) is a real possibility.
223 The current code is safe against (2), but not against (1).
224 The safety against (2) is derived from the fact that only one
225 thread (the main thread) ever takes things out of the queue.
Guido van Rossuma9672091994-09-14 13:31:22 +0000226
Guido van Rossuma027efa1997-05-05 20:56:21 +0000227 XXX Darn! With the advent of thread state, we should have an array
228 of pending calls per thread in the thread state! Later...
229*/
Guido van Rossum8861b741996-07-30 16:49:37 +0000230
Guido van Rossuma9672091994-09-14 13:31:22 +0000231#define NPENDINGCALLS 32
232static struct {
Thomas Wouters334fb892000-07-25 12:56:38 +0000233 int (*func)(void *);
234 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000235} pendingcalls[NPENDINGCALLS];
236static volatile int pendingfirst = 0;
237static volatile int pendinglast = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000238static volatile int things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000239
240int
Thomas Wouters334fb892000-07-25 12:56:38 +0000241Py_AddPendingCall(int (*func)(void *), void *arg)
Guido van Rossuma9672091994-09-14 13:31:22 +0000242{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000243 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000244 int i, j;
245 /* XXX Begin critical section */
246 /* XXX If you want this to be safe against nested
247 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000248 if (busy)
249 return -1;
250 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000251 i = pendinglast;
252 j = (i + 1) % NPENDINGCALLS;
253 if (j == pendingfirst)
254 return -1; /* Queue full */
255 pendingcalls[i].func = func;
256 pendingcalls[i].arg = arg;
257 pendinglast = j;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000258 things_to_do = 1; /* Signal main loop */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000259 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000260 /* XXX End critical section */
261 return 0;
262}
263
Guido van Rossum180d7b41994-09-29 09:45:57 +0000264int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000265Py_MakePendingCalls(void)
Guido van Rossuma9672091994-09-14 13:31:22 +0000266{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000267 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000268#ifdef WITH_THREAD
Guido van Rossum65d5b571998-12-21 19:32:43 +0000269 if (main_thread && PyThread_get_thread_ident() != main_thread)
Guido van Rossuma9672091994-09-14 13:31:22 +0000270 return 0;
271#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000272 if (busy)
Guido van Rossum180d7b41994-09-29 09:45:57 +0000273 return 0;
274 busy = 1;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000275 things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000276 for (;;) {
277 int i;
Thomas Wouters334fb892000-07-25 12:56:38 +0000278 int (*func)(void *);
279 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000280 i = pendingfirst;
281 if (i == pendinglast)
282 break; /* Queue empty */
283 func = pendingcalls[i].func;
284 arg = pendingcalls[i].arg;
285 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000286 if (func(arg) < 0) {
287 busy = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000288 things_to_do = 1; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000289 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000290 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000291 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000292 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000293 return 0;
294}
295
296
Guido van Rossum374a9221991-04-04 10:40:29 +0000297/* Status code for main loop (reason for stack unwind) */
298
299enum why_code {
300 WHY_NOT, /* No error */
301 WHY_EXCEPTION, /* Exception occurred */
302 WHY_RERAISE, /* Exception re-raised by 'finally' */
303 WHY_RETURN, /* 'return' statement */
304 WHY_BREAK /* 'break' statement */
305};
306
Tim Petersdbd9ba62000-07-09 03:09:57 +0000307static enum why_code do_raise(PyObject *, PyObject *, PyObject *);
308static int unpack_sequence(PyObject *, int, PyObject **);
Guido van Rossum1aa14831997-01-21 05:34:20 +0000309
Guido van Rossum374a9221991-04-04 10:40:29 +0000310
Guido van Rossumb209a111997-04-29 18:18:01 +0000311PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000312PyEval_EvalCode(PyCodeObject *co, PyObject *globals, PyObject *locals)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000313{
314 return eval_code2(co,
315 globals, locals,
Guido van Rossumb209a111997-04-29 18:18:01 +0000316 (PyObject **)NULL, 0,
317 (PyObject **)NULL, 0,
318 (PyObject **)NULL, 0,
319 (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000320}
321
322
323/* Interpreter main loop */
324
Guido van Rossum8861b741996-07-30 16:49:37 +0000325#ifndef MAX_RECURSION_DEPTH
326#define MAX_RECURSION_DEPTH 10000
327#endif
328
Guido van Rossumb209a111997-04-29 18:18:01 +0000329static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000330eval_code2(PyCodeObject *co, PyObject *globals, PyObject *locals,
331 PyObject **args, int argcount, PyObject **kws, int kwcount,
332 PyObject **defs, int defcount, PyObject *owner)
Guido van Rossum374a9221991-04-04 10:40:29 +0000333{
Guido van Rossum950361c1997-01-24 13:49:28 +0000334#ifdef DXPAIRS
335 int lastopcode = 0;
336#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000337 register unsigned char *next_instr;
Moshe Zadkaaa39a7e2000-08-07 06:34:45 +0000338 register int opcode=0; /* Current opcode */
339 register int oparg=0; /* Current opcode argument, if any */
Guido van Rossumb209a111997-04-29 18:18:01 +0000340 register PyObject **stack_pointer;
Guido van Rossum374a9221991-04-04 10:40:29 +0000341 register enum why_code why; /* Reason for block stack unwind */
342 register int err; /* Error status -- nonzero if error */
Guido van Rossumb209a111997-04-29 18:18:01 +0000343 register PyObject *x; /* Result object -- NULL if error */
344 register PyObject *v; /* Temporary objects popped off stack */
345 register PyObject *w;
346 register PyObject *u;
347 register PyObject *t;
Barry Warsaw23c9ec82000-08-21 15:44:01 +0000348 register PyObject *stream = NULL; /* for PRINT opcodes */
Guido van Rossumb209a111997-04-29 18:18:01 +0000349 register PyFrameObject *f; /* Current frame */
Guido van Rossum50cd3481998-11-17 17:02:51 +0000350 register PyObject **fastlocals;
Guido van Rossum014518f1998-11-23 21:09:51 +0000351 PyObject *retval = NULL; /* Return value */
Guido van Rossum885553e1998-12-21 18:33:30 +0000352 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossumd076c731998-10-07 19:42:25 +0000353 unsigned char *first_instr;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000354#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000355 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000356#endif
Guido van Rossum408027e1996-12-30 16:17:54 +0000357#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000358 /* Make it easier to find out where we are with a debugger */
Guido van Rossumb209a111997-04-29 18:18:01 +0000359 char *filename = PyString_AsString(co->co_filename);
Guido van Rossum99bec951992-09-03 20:29:45 +0000360#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000361
362/* Code access macros */
363
364#define GETCONST(i) Getconst(f, i)
365#define GETNAME(i) Getname(f, i)
366#define GETNAMEV(i) Getnamev(f, i)
Guido van Rossumd076c731998-10-07 19:42:25 +0000367#define INSTR_OFFSET() (next_instr - first_instr)
Guido van Rossum374a9221991-04-04 10:40:29 +0000368#define NEXTOP() (*next_instr++)
369#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossumd076c731998-10-07 19:42:25 +0000370#define JUMPTO(x) (next_instr = first_instr + (x))
Guido van Rossum374a9221991-04-04 10:40:29 +0000371#define JUMPBY(x) (next_instr += (x))
372
373/* Stack manipulation macros */
374
375#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
376#define EMPTY() (STACK_LEVEL() == 0)
377#define TOP() (stack_pointer[-1])
378#define BASIC_PUSH(v) (*stack_pointer++ = (v))
379#define BASIC_POP() (*--stack_pointer)
380
Guido van Rossum96a42c81992-01-12 02:29:51 +0000381#ifdef LLTRACE
382#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
383#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000384#else
385#define PUSH(v) BASIC_PUSH(v)
386#define POP() BASIC_POP()
387#endif
388
Guido van Rossum681d79a1995-07-18 14:51:37 +0000389/* Local variable macros */
390
391#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumb209a111997-04-29 18:18:01 +0000392#define SETLOCAL(i, value) do { Py_XDECREF(GETLOCAL(i)); \
Guido van Rossum681d79a1995-07-18 14:51:37 +0000393 GETLOCAL(i) = value; } while (0)
394
Guido van Rossuma027efa1997-05-05 20:56:21 +0000395/* Start of code */
396
Guido van Rossum8861b741996-07-30 16:49:37 +0000397#ifdef USE_STACKCHECK
Guido van Rossuma027efa1997-05-05 20:56:21 +0000398 if (tstate->recursion_depth%10 == 0 && PyOS_CheckStack()) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000399 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
Guido van Rossum8861b741996-07-30 16:49:37 +0000400 return NULL;
401 }
402#endif
403
Guido van Rossum681d79a1995-07-18 14:51:37 +0000404 if (globals == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000405 PyErr_SetString(PyExc_SystemError, "eval_code2: NULL globals");
Guido van Rossum6135a871995-01-09 17:53:26 +0000406 return NULL;
Guido van Rossum5b722181993-03-30 17:46:03 +0000407 }
408
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000409#ifdef LLTRACE
Guido van Rossumb209a111997-04-29 18:18:01 +0000410 lltrace = PyDict_GetItemString(globals, "__lltrace__") != NULL;
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000411#endif
412
Guido van Rossumb209a111997-04-29 18:18:01 +0000413 f = PyFrame_New(
Guido van Rossuma027efa1997-05-05 20:56:21 +0000414 tstate, /*back*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000415 co, /*code*/
416 globals, /*globals*/
Guido van Rossum76836021997-01-20 04:26:20 +0000417 locals); /*locals*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000418 if (f == NULL)
419 return NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000420
Guido van Rossuma027efa1997-05-05 20:56:21 +0000421 tstate->frame = f;
Guido van Rossumdeb0c5e1997-01-27 23:42:36 +0000422 fastlocals = f->f_localsplus;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000423
424 if (co->co_argcount > 0 ||
425 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
426 int i;
427 int n = argcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000428 PyObject *kwdict = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000429 if (co->co_flags & CO_VARKEYWORDS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000430 kwdict = PyDict_New();
Guido van Rossum681d79a1995-07-18 14:51:37 +0000431 if (kwdict == NULL)
432 goto fail;
Guido van Rossum8c5df061997-01-24 04:19:24 +0000433 i = co->co_argcount;
434 if (co->co_flags & CO_VARARGS)
435 i++;
436 SETLOCAL(i, kwdict);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000437 }
438 if (argcount > co->co_argcount) {
439 if (!(co->co_flags & CO_VARARGS)) {
Guido van Rossumdf9db1e1997-11-19 16:05:40 +0000440 PyErr_Format(PyExc_TypeError,
441 "too many arguments; expected %d, got %d",
442 co->co_argcount, argcount);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000443 goto fail;
444 }
445 n = co->co_argcount;
446 }
447 for (i = 0; i < n; i++) {
448 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000449 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000450 SETLOCAL(i, x);
451 }
452 if (co->co_flags & CO_VARARGS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000453 u = PyTuple_New(argcount - n);
Guido van Rossum8c5df061997-01-24 04:19:24 +0000454 if (u == NULL)
455 goto fail;
456 SETLOCAL(co->co_argcount, u);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000457 for (i = n; i < argcount; i++) {
458 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000459 Py_INCREF(x);
460 PyTuple_SET_ITEM(u, i-n, x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000461 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000462 }
463 for (i = 0; i < kwcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000464 PyObject *keyword = kws[2*i];
465 PyObject *value = kws[2*i + 1];
Guido van Rossum681d79a1995-07-18 14:51:37 +0000466 int j;
Guido van Rossum25da5be1999-10-26 00:12:20 +0000467 if (keyword == NULL || !PyString_Check(keyword)) {
468 PyErr_SetString(PyExc_TypeError,
469 "keywords must be strings");
470 goto fail;
471 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000472 /* XXX slow -- speed up using dictionary? */
473 for (j = 0; j < co->co_argcount; j++) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000474 PyObject *nm = PyTuple_GET_ITEM(
475 co->co_varnames, j);
Guido van Rossumb209a111997-04-29 18:18:01 +0000476 if (PyObject_Compare(keyword, nm) == 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000477 break;
478 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000479 /* Check errors from Compare */
480 if (PyErr_Occurred())
481 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000482 if (j >= co->co_argcount) {
483 if (kwdict == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000484 PyErr_Format(PyExc_TypeError,
Guido van Rossuma027efa1997-05-05 20:56:21 +0000485 "unexpected keyword argument: %.400s",
Jeremy Hylton76901512000-03-28 23:49:17 +0000486 PyString_AsString(keyword));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000487 goto fail;
488 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000489 PyDict_SetItem(kwdict, keyword, value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000490 }
491 else {
492 if (GETLOCAL(j) != NULL) {
Jeremy Hylton76901512000-03-28 23:49:17 +0000493 PyErr_Format(PyExc_TypeError,
494 "keyword parameter redefined: %.400s",
495 PyString_AsString(keyword));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000496 goto fail;
497 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000498 Py_INCREF(value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000499 SETLOCAL(j, value);
500 }
501 }
502 if (argcount < co->co_argcount) {
503 int m = co->co_argcount - defcount;
504 for (i = argcount; i < m; i++) {
505 if (GETLOCAL(i) == NULL) {
Guido van Rossumdf9db1e1997-11-19 16:05:40 +0000506 PyErr_Format(PyExc_TypeError,
507 "not enough arguments; expected %d, got %d",
508 m, i);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000509 goto fail;
510 }
511 }
512 if (n > m)
513 i = n - m;
514 else
515 i = 0;
516 for (; i < defcount; i++) {
517 if (GETLOCAL(m+i) == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000518 PyObject *def = defs[i];
519 Py_INCREF(def);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000520 SETLOCAL(m+i, def);
521 }
522 }
523 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000524 }
525 else {
526 if (argcount > 0 || kwcount > 0) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000527 PyErr_SetString(PyExc_TypeError,
528 "no arguments expected");
Guido van Rossum8c5df061997-01-24 04:19:24 +0000529 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000530 }
531 }
532
Guido van Rossuma027efa1997-05-05 20:56:21 +0000533 if (tstate->sys_tracefunc != NULL) {
534 /* tstate->sys_tracefunc, if defined, is a function that
535 will be called on *every* entry to a code block.
Guido van Rossum96a42c81992-01-12 02:29:51 +0000536 Its return value, if not None, is a function that
537 will be called at the start of each executed line
538 of code. (Actually, the function must return
539 itself in order to continue tracing.)
540 The trace functions are called with three arguments:
541 a pointer to the current frame, a string indicating
542 why the function is called, and an argument which
543 depends on the situation. The global trace function
544 (sys.trace) is also called whenever an exception
545 is detected. */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000546 if (call_trace(&tstate->sys_tracefunc,
547 &f->f_trace, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000548 Py_None/*XXX how to compute arguments now?*/)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000549 /* Trace function raised an error */
Guido van Rossum8c5df061997-01-24 04:19:24 +0000550 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000551 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000552 }
553
Guido van Rossuma027efa1997-05-05 20:56:21 +0000554 if (tstate->sys_profilefunc != NULL) {
555 /* Similar for sys_profilefunc, except it needn't return
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000556 itself and isn't called for "line" events */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000557 if (call_trace(&tstate->sys_profilefunc,
558 (PyObject**)0, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000559 Py_None/*XXX*/)) {
Guido van Rossum8c5df061997-01-24 04:19:24 +0000560 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000561 }
562 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000563
Guido van Rossuma027efa1997-05-05 20:56:21 +0000564 if (++tstate->recursion_depth > MAX_RECURSION_DEPTH) {
565 --tstate->recursion_depth;
566 PyErr_SetString(PyExc_RuntimeError,
567 "Maximum recursion depth exceeded");
568 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +0000569 Py_DECREF(f);
Guido van Rossum8861b741996-07-30 16:49:37 +0000570 return NULL;
571 }
572
Guido van Rossumd076c731998-10-07 19:42:25 +0000573 _PyCode_GETCODEPTR(co, &first_instr);
574 next_instr = first_instr;
Guido van Rossum374a9221991-04-04 10:40:29 +0000575 stack_pointer = f->f_valuestack;
576
Guido van Rossum374a9221991-04-04 10:40:29 +0000577 why = WHY_NOT;
578 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000579 x = Py_None; /* Not a reference, just anything non-NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000580
581 for (;;) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000582 /* Do periodic things. Doing this every time through
583 the loop would add too much overhead, so we do it
584 only every Nth instruction. We also do it if
585 ``things_to_do'' is set, i.e. when an asynchronous
586 event needs attention (e.g. a signal handler or
587 async I/O handler); see Py_AddPendingCall() and
588 Py_MakePendingCalls() above. */
Guido van Rossuma9672091994-09-14 13:31:22 +0000589
Guido van Rossuma027efa1997-05-05 20:56:21 +0000590 if (things_to_do || --tstate->ticker < 0) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000591 tstate->ticker = tstate->interp->checkinterval;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000592 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000593 if (Py_MakePendingCalls() < 0) {
594 why = WHY_EXCEPTION;
595 goto on_error;
596 }
597 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000598#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000599 /* If we have true signals, the signal handler
600 will call Py_AddPendingCall() so we don't
601 have to call sigcheck(). On the Mac and
602 DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000603 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000604 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000605 goto on_error;
606 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000607#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000608
Guido van Rossume59214e1994-08-30 08:01:59 +0000609#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000610 if (interpreter_lock) {
611 /* Give another thread a chance */
612
Guido van Rossum25ce5661997-08-02 03:10:38 +0000613 if (PyThreadState_Swap(NULL) != tstate)
614 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000615 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000616
617 /* Other threads may run now */
618
Guido van Rossum65d5b571998-12-21 19:32:43 +0000619 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000620 if (PyThreadState_Swap(tstate) != NULL)
621 Py_FatalError("ceval: orphan tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000622 }
623#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000624 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000625
Guido van Rossum374a9221991-04-04 10:40:29 +0000626 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000627
Guido van Rossum408027e1996-12-30 16:17:54 +0000628#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000629 f->f_lasti = INSTR_OFFSET();
630#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000631
632 opcode = NEXTOP();
633 if (HAS_ARG(opcode))
634 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +0000635 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +0000636#ifdef DYNAMIC_EXECUTION_PROFILE
637#ifdef DXPAIRS
638 dxpairs[lastopcode][opcode]++;
639 lastopcode = opcode;
640#endif
641 dxp[opcode]++;
642#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000643
Guido van Rossum96a42c81992-01-12 02:29:51 +0000644#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000645 /* Instruction tracing */
646
Guido van Rossum96a42c81992-01-12 02:29:51 +0000647 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000648 if (HAS_ARG(opcode)) {
649 printf("%d: %d, %d\n",
650 (int) (INSTR_OFFSET() - 3),
651 opcode, oparg);
652 }
653 else {
654 printf("%d: %d\n",
655 (int) (INSTR_OFFSET() - 1), opcode);
656 }
657 }
658#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000659 /* Main switch on opcode */
660
661 switch (opcode) {
662
663 /* BEWARE!
664 It is essential that any operation that fails sets either
665 x to NULL, err to nonzero, or why to anything but WHY_NOT,
666 and that no operation that succeeds does this! */
667
668 /* case STOP_CODE: this is an error! */
669
670 case POP_TOP:
671 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000672 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000673 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000674
675 case ROT_TWO:
676 v = POP();
677 w = POP();
678 PUSH(v);
679 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000680 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000681
682 case ROT_THREE:
683 v = POP();
684 w = POP();
685 x = POP();
686 PUSH(v);
687 PUSH(x);
688 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000689 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000690
Thomas Wouters434d0822000-08-24 20:11:32 +0000691 case ROT_FOUR:
692 u = POP();
693 v = POP();
694 w = POP();
695 x = POP();
696 PUSH(u);
697 PUSH(x);
698 PUSH(w);
699 PUSH(v);
700 continue;
701
Guido van Rossum374a9221991-04-04 10:40:29 +0000702 case DUP_TOP:
703 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000704 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000705 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000706 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000707
Thomas Wouters434d0822000-08-24 20:11:32 +0000708 case DUP_TOPX:
709 switch (oparg) {
710 case 5:
711 case 4:
712 case 3:
713 case 2:
714 case 1:
715 x = POP();
716 if (oparg == 1) break;
717 w = POP();
718 if (oparg == 2) break;
719 v = POP();
720 if (oparg == 3) break;
721 u = POP();
722 if (oparg == 4) break;
723 t = POP();
724 break;
725 default:
726 fprintf(stderr, "Invalid argument to DUP_TOPX: %d!\n", oparg);
727 PyErr_SetString(PyExc_SystemError,
728 "invalid argument to DUP_TOPX");
729 x = NULL;
730 }
731 if (x == NULL)
732 break;
733 switch (oparg) {
734 case 5: PUSH(t);
735 Py_INCREF(t); /* Fallthrough */
736 case 4: PUSH(u);
737 Py_INCREF(u); /* Fallthrough */
738 case 3: PUSH(v);
739 Py_INCREF(v); /* Fallthrough */
740 case 2: PUSH(w);
741 Py_INCREF(w); /* Fallthrough */
742 case 1: PUSH(x);
743 Py_INCREF(x); /* Fallthrough */
744 }
745 switch (oparg) {
746 case 5: PUSH(t); /* Fallthrough */
747 case 4: PUSH(u); /* Fallthrough */
748 case 3: PUSH(v); /* Fallthrough */
749 case 2: PUSH(w); /* Fallthrough */
750 case 1: PUSH(x); /* Fallthrough */
751 }
752 continue;
753
Guido van Rossum374a9221991-04-04 10:40:29 +0000754 case UNARY_POSITIVE:
755 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000756 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000757 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000758 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000759 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000760 break;
761
762 case UNARY_NEGATIVE:
763 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000764 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000765 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000766 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000767 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000768 break;
769
770 case UNARY_NOT:
771 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000772 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000773 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000774 if (err == 0) {
775 Py_INCREF(Py_True);
776 PUSH(Py_True);
777 continue;
778 }
779 else if (err > 0) {
780 Py_INCREF(Py_False);
781 PUSH(Py_False);
782 err = 0;
783 continue;
784 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000785 break;
786
787 case UNARY_CONVERT:
788 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000789 x = PyObject_Repr(v);
790 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000791 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000792 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000793 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000794
795 case UNARY_INVERT:
796 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000797 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000798 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000799 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000800 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000801 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000802
Guido van Rossum50564e81996-01-12 01:13:16 +0000803 case BINARY_POWER:
804 w = POP();
805 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000806 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000807 Py_DECREF(v);
808 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000809 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000810 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000811 break;
812
Guido van Rossum374a9221991-04-04 10:40:29 +0000813 case BINARY_MULTIPLY:
814 w = POP();
815 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000816 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000817 Py_DECREF(v);
818 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000819 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000820 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000821 break;
822
823 case BINARY_DIVIDE:
824 w = POP();
825 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000826 x = PyNumber_Divide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000827 Py_DECREF(v);
828 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000829 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000830 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000831 break;
832
833 case BINARY_MODULO:
834 w = POP();
835 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000836 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000837 Py_DECREF(v);
838 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000839 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000840 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000841 break;
842
843 case BINARY_ADD:
844 w = POP();
845 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000846 if (PyInt_Check(v) && PyInt_Check(w)) {
847 /* INLINE: int + int */
848 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000849 a = PyInt_AS_LONG(v);
850 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000851 i = a + b;
852 if ((i^a) < 0 && (i^b) < 0) {
853 PyErr_SetString(PyExc_OverflowError,
854 "integer addition");
855 x = NULL;
856 }
857 else
858 x = PyInt_FromLong(i);
859 }
860 else
861 x = PyNumber_Add(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000862 Py_DECREF(v);
863 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000864 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000865 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000866 break;
867
868 case BINARY_SUBTRACT:
869 w = POP();
870 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000871 if (PyInt_Check(v) && PyInt_Check(w)) {
872 /* INLINE: int - int */
873 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000874 a = PyInt_AS_LONG(v);
875 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000876 i = a - b;
877 if ((i^a) < 0 && (i^~b) < 0) {
878 PyErr_SetString(PyExc_OverflowError,
879 "integer subtraction");
880 x = NULL;
881 }
882 else
883 x = PyInt_FromLong(i);
884 }
885 else
886 x = PyNumber_Subtract(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000887 Py_DECREF(v);
888 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000889 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000890 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000891 break;
892
893 case BINARY_SUBSCR:
894 w = POP();
895 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000896 if (PyList_Check(v) && PyInt_Check(w)) {
897 /* INLINE: list[int] */
898 long i = PyInt_AsLong(w);
899 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +0000900 i += PyList_GET_SIZE(v);
Guido van Rossumc12da691997-07-17 23:12:42 +0000901 if (i < 0 ||
Guido van Rossumfa00e951998-07-08 15:02:37 +0000902 i >= PyList_GET_SIZE(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +0000903 PyErr_SetString(PyExc_IndexError,
904 "list index out of range");
905 x = NULL;
906 }
907 else {
Guido van Rossumfa00e951998-07-08 15:02:37 +0000908 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +0000909 Py_INCREF(x);
910 }
911 }
912 else
913 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000914 Py_DECREF(v);
915 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000916 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000917 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000918 break;
919
Guido van Rossum7928cd71991-10-24 14:59:31 +0000920 case BINARY_LSHIFT:
921 w = POP();
922 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000923 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000924 Py_DECREF(v);
925 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000926 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000927 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000928 break;
929
930 case BINARY_RSHIFT:
931 w = POP();
932 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000933 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000934 Py_DECREF(v);
935 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000936 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000937 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000938 break;
939
940 case BINARY_AND:
941 w = POP();
942 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000943 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000944 Py_DECREF(v);
945 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000946 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000947 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000948 break;
949
950 case BINARY_XOR:
951 w = POP();
952 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000953 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000954 Py_DECREF(v);
955 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000956 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000957 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000958 break;
959
960 case BINARY_OR:
961 w = POP();
962 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000963 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000964 Py_DECREF(v);
965 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000966 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000967 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000968 break;
Thomas Wouters434d0822000-08-24 20:11:32 +0000969
970 case INPLACE_POWER:
971 w = POP();
972 v = POP();
973 x = PyNumber_InPlacePower(v, w, Py_None);
974 Py_DECREF(v);
975 Py_DECREF(w);
976 PUSH(x);
977 if (x != NULL) continue;
978 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000979
Thomas Wouters434d0822000-08-24 20:11:32 +0000980 case INPLACE_MULTIPLY:
981 w = POP();
982 v = POP();
983 x = PyNumber_InPlaceMultiply(v, w);
984 Py_DECREF(v);
985 Py_DECREF(w);
986 PUSH(x);
987 if (x != NULL) continue;
988 break;
989
990 case INPLACE_DIVIDE:
991 w = POP();
992 v = POP();
993 x = PyNumber_InPlaceDivide(v, w);
994 Py_DECREF(v);
995 Py_DECREF(w);
996 PUSH(x);
997 if (x != NULL) continue;
998 break;
999
1000 case INPLACE_MODULO:
1001 w = POP();
1002 v = POP();
1003 x = PyNumber_InPlaceRemainder(v, w);
1004 Py_DECREF(v);
1005 Py_DECREF(w);
1006 PUSH(x);
1007 if (x != NULL) continue;
1008 break;
1009
1010 case INPLACE_ADD:
1011 w = POP();
1012 v = POP();
1013 if (PyInt_Check(v) && PyInt_Check(w)) {
1014 /* INLINE: int + int */
1015 register long a, b, i;
1016 a = PyInt_AS_LONG(v);
1017 b = PyInt_AS_LONG(w);
1018 i = a + b;
1019 if ((i^a) < 0 && (i^b) < 0) {
1020 PyErr_SetString(PyExc_OverflowError,
1021 "integer addition");
1022 x = NULL;
1023 }
1024 else
1025 x = PyInt_FromLong(i);
1026 }
1027 else
1028 x = PyNumber_InPlaceAdd(v, w);
1029 Py_DECREF(v);
1030 Py_DECREF(w);
1031 PUSH(x);
1032 if (x != NULL) continue;
1033 break;
1034
1035 case INPLACE_SUBTRACT:
1036 w = POP();
1037 v = POP();
1038 if (PyInt_Check(v) && PyInt_Check(w)) {
1039 /* INLINE: int - int */
1040 register long a, b, i;
1041 a = PyInt_AS_LONG(v);
1042 b = PyInt_AS_LONG(w);
1043 i = a - b;
1044 if ((i^a) < 0 && (i^~b) < 0) {
1045 PyErr_SetString(PyExc_OverflowError,
1046 "integer subtraction");
1047 x = NULL;
1048 }
1049 else
1050 x = PyInt_FromLong(i);
1051 }
1052 else
1053 x = PyNumber_InPlaceSubtract(v, w);
1054 Py_DECREF(v);
1055 Py_DECREF(w);
1056 PUSH(x);
1057 if (x != NULL) continue;
1058 break;
1059
1060 case INPLACE_LSHIFT:
1061 w = POP();
1062 v = POP();
1063 x = PyNumber_InPlaceLshift(v, w);
1064 Py_DECREF(v);
1065 Py_DECREF(w);
1066 PUSH(x);
1067 if (x != NULL) continue;
1068 break;
1069
1070 case INPLACE_RSHIFT:
1071 w = POP();
1072 v = POP();
1073 x = PyNumber_InPlaceRshift(v, w);
1074 Py_DECREF(v);
1075 Py_DECREF(w);
1076 PUSH(x);
1077 if (x != NULL) continue;
1078 break;
1079
1080 case INPLACE_AND:
1081 w = POP();
1082 v = POP();
1083 x = PyNumber_InPlaceAnd(v, w);
1084 Py_DECREF(v);
1085 Py_DECREF(w);
1086 PUSH(x);
1087 if (x != NULL) continue;
1088 break;
1089
1090 case INPLACE_XOR:
1091 w = POP();
1092 v = POP();
1093 x = PyNumber_InPlaceXor(v, w);
1094 Py_DECREF(v);
1095 Py_DECREF(w);
1096 PUSH(x);
1097 if (x != NULL) continue;
1098 break;
1099
1100 case INPLACE_OR:
1101 w = POP();
1102 v = POP();
1103 x = PyNumber_InPlaceOr(v, w);
1104 Py_DECREF(v);
1105 Py_DECREF(w);
1106 PUSH(x);
1107 if (x != NULL) continue;
1108 break;
1109
Guido van Rossum374a9221991-04-04 10:40:29 +00001110 case SLICE+0:
1111 case SLICE+1:
1112 case SLICE+2:
1113 case SLICE+3:
1114 if ((opcode-SLICE) & 2)
1115 w = POP();
1116 else
1117 w = NULL;
1118 if ((opcode-SLICE) & 1)
1119 v = POP();
1120 else
1121 v = NULL;
1122 u = POP();
1123 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001124 Py_DECREF(u);
1125 Py_XDECREF(v);
1126 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001127 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001128 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001129 break;
1130
1131 case STORE_SLICE+0:
1132 case STORE_SLICE+1:
1133 case STORE_SLICE+2:
1134 case STORE_SLICE+3:
1135 if ((opcode-STORE_SLICE) & 2)
1136 w = POP();
1137 else
1138 w = NULL;
1139 if ((opcode-STORE_SLICE) & 1)
1140 v = POP();
1141 else
1142 v = NULL;
1143 u = POP();
1144 t = POP();
1145 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +00001146 Py_DECREF(t);
1147 Py_DECREF(u);
1148 Py_XDECREF(v);
1149 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001150 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001151 break;
1152
1153 case DELETE_SLICE+0:
1154 case DELETE_SLICE+1:
1155 case DELETE_SLICE+2:
1156 case DELETE_SLICE+3:
1157 if ((opcode-DELETE_SLICE) & 2)
1158 w = POP();
1159 else
1160 w = NULL;
1161 if ((opcode-DELETE_SLICE) & 1)
1162 v = POP();
1163 else
1164 v = NULL;
1165 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001166 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +00001167 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00001168 Py_DECREF(u);
1169 Py_XDECREF(v);
1170 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001171 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001172 break;
1173
1174 case STORE_SUBSCR:
1175 w = POP();
1176 v = POP();
1177 u = POP();
1178 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +00001179 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001180 Py_DECREF(u);
1181 Py_DECREF(v);
1182 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001183 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001184 break;
1185
1186 case DELETE_SUBSCR:
1187 w = POP();
1188 v = POP();
1189 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001190 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001191 Py_DECREF(v);
1192 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001193 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001194 break;
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001195
Guido van Rossum374a9221991-04-04 10:40:29 +00001196 case PRINT_EXPR:
1197 v = POP();
Guido van Rossumaa06b0e1997-12-26 22:15:57 +00001198 /* Print value except if None */
1199 /* After printing, also assign to '_' */
1200 /* Before, set '_' to None to avoid recursion */
Guido van Rossumb209a111997-04-29 18:18:01 +00001201 if (v != Py_None &&
Guido van Rossuma027efa1997-05-05 20:56:21 +00001202 (err = PyDict_SetItemString(
Guido van Rossumaa06b0e1997-12-26 22:15:57 +00001203 f->f_builtins, "_", Py_None)) == 0) {
Guido van Rossumbe270261997-05-22 22:26:18 +00001204 err = Py_FlushLine();
Guido van Rossumc12da691997-07-17 23:12:42 +00001205 if (err == 0) {
Guido van Rossumbe270261997-05-22 22:26:18 +00001206 x = PySys_GetObject("stdout");
Guido van Rossum8f183201997-12-31 05:53:15 +00001207 if (x == NULL) {
1208 PyErr_SetString(
1209 PyExc_RuntimeError,
1210 "lost sys.stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00001211 err = -1;
Guido van Rossum8f183201997-12-31 05:53:15 +00001212 }
Guido van Rossumbe270261997-05-22 22:26:18 +00001213 }
1214 if (err == 0)
1215 err = PyFile_WriteObject(v, x, 0);
1216 if (err == 0) {
1217 PyFile_SoftSpace(x, 1);
1218 err = Py_FlushLine();
1219 }
Guido van Rossumaa06b0e1997-12-26 22:15:57 +00001220 if (err == 0) {
1221 err = PyDict_SetItemString(
1222 f->f_builtins, "_", v);
1223 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001224 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001225 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001226 break;
1227
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001228 case PRINT_ITEM_TO:
1229 w = stream = POP();
1230 /* fall through to PRINT_ITEM */
1231
Guido van Rossum374a9221991-04-04 10:40:29 +00001232 case PRINT_ITEM:
1233 v = POP();
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001234 if (stream == NULL) {
1235 w = PySys_GetObject("stdout");
1236 if (w == NULL) {
1237 PyErr_SetString(PyExc_RuntimeError,
1238 "lost sys.stdout");
1239 err = -1;
1240 }
Guido van Rossum8f183201997-12-31 05:53:15 +00001241 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001242 if (w != NULL && PyFile_SoftSpace(w, 1))
Guido van Rossumbe270261997-05-22 22:26:18 +00001243 err = PyFile_WriteString(" ", w);
1244 if (err == 0)
1245 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Guido van Rossumb209a111997-04-29 18:18:01 +00001246 if (err == 0 && PyString_Check(v)) {
Guido van Rossumc6004111993-11-05 10:22:19 +00001247 /* XXX move into writeobject() ? */
Guido van Rossumb209a111997-04-29 18:18:01 +00001248 char *s = PyString_AsString(v);
1249 int len = PyString_Size(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +00001250 if (len > 0 &&
1251 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +00001252 s[len-1] != ' ')
Guido van Rossumb209a111997-04-29 18:18:01 +00001253 PyFile_SoftSpace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001254 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001255 Py_DECREF(v);
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001256 Py_XDECREF(stream);
1257 stream = NULL;
1258 if (err == 0)
1259 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001260 break;
1261
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001262 case PRINT_NEWLINE_TO:
1263 w = stream = POP();
1264 /* fall through to PRINT_NEWLINE */
1265
Guido van Rossum374a9221991-04-04 10:40:29 +00001266 case PRINT_NEWLINE:
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001267 if (stream == NULL) {
1268 w = PySys_GetObject("stdout");
1269 if (w == NULL)
1270 PyErr_SetString(PyExc_RuntimeError,
1271 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001272 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001273 if (w != NULL) {
1274 err = PyFile_WriteString("\n", w);
1275 if (err == 0)
1276 PyFile_SoftSpace(w, 0);
1277 }
1278 Py_XDECREF(stream);
1279 stream = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +00001280 break;
1281
Thomas Wouters434d0822000-08-24 20:11:32 +00001282
1283#ifdef CASE_TOO_BIG
1284 default: switch (opcode) {
1285#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001286 case BREAK_LOOP:
1287 why = WHY_BREAK;
1288 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001289
Guido van Rossumf10570b1995-07-07 22:53:21 +00001290 case RAISE_VARARGS:
1291 u = v = w = NULL;
1292 switch (oparg) {
1293 case 3:
1294 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001295 /* Fallthrough */
1296 case 2:
1297 v = POP(); /* value */
1298 /* Fallthrough */
1299 case 1:
1300 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001301 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001302 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001303 break;
1304 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001305 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001306 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001307 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001308 break;
1309 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001310 break;
1311
1312 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001313 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001314 PyErr_SetString(PyExc_SystemError,
1315 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001316 break;
1317 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001318 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001319 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001320 break;
1321
1322 case RETURN_VALUE:
1323 retval = POP();
1324 why = WHY_RETURN;
1325 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001326
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001327 case EXEC_STMT:
1328 w = POP();
1329 v = POP();
1330 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001331 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001332 Py_DECREF(u);
1333 Py_DECREF(v);
1334 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001335 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001336
Guido van Rossum374a9221991-04-04 10:40:29 +00001337 case POP_BLOCK:
1338 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001339 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001340 while (STACK_LEVEL() > b->b_level) {
1341 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001342 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001343 }
1344 }
1345 break;
1346
1347 case END_FINALLY:
1348 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001349 if (PyInt_Check(v)) {
1350 why = (enum why_code) PyInt_AsLong(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001351 if (why == WHY_RETURN)
1352 retval = POP();
1353 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001354 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001355 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001356 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001357 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001358 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001359 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001360 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001361 else if (v != Py_None) {
1362 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001363 "'finally' pops bad exception");
1364 why = WHY_EXCEPTION;
1365 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001366 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001367 break;
1368
1369 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001370 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001371 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001372 w = POP();
1373 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001374 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001375 Py_DECREF(u);
1376 Py_DECREF(v);
1377 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001378 break;
1379
1380 case STORE_NAME:
1381 w = GETNAMEV(oparg);
1382 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001383 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001384 PyErr_SetString(PyExc_SystemError,
1385 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001386 break;
1387 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001388 err = PyDict_SetItem(x, w, v);
1389 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001390 break;
1391
1392 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001393 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001394 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001395 PyErr_SetString(PyExc_SystemError,
1396 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001397 break;
1398 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001399 if ((err = PyDict_DelItem(x, w)) != 0)
1400 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001401 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001402
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001403 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001404 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001405 if (PyTuple_Check(v)) {
1406 if (PyTuple_Size(v) != oparg) {
1407 PyErr_SetString(PyExc_ValueError,
1408 "unpack tuple of wrong size");
1409 why = WHY_EXCEPTION;
1410 }
1411 else {
1412 for (; --oparg >= 0; ) {
1413 w = PyTuple_GET_ITEM(v, oparg);
1414 Py_INCREF(w);
1415 PUSH(w);
1416 }
1417 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001418 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001419 else if (PyList_Check(v)) {
1420 if (PyList_Size(v) != oparg) {
1421 PyErr_SetString(PyExc_ValueError,
1422 "unpack list of wrong size");
1423 why = WHY_EXCEPTION;
1424 }
1425 else {
1426 for (; --oparg >= 0; ) {
1427 w = PyList_GET_ITEM(v, oparg);
1428 Py_INCREF(w);
1429 PUSH(w);
1430 }
1431 }
1432 }
1433 else if (PySequence_Check(v)) {
1434 if (unpack_sequence(v, oparg,
1435 stack_pointer + oparg))
1436 stack_pointer += oparg;
1437 else
1438 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001439 }
1440 else {
Barry Warsawe42b18f1997-08-25 22:13:04 +00001441 PyErr_SetString(PyExc_TypeError,
1442 "unpack non-sequence");
1443 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001444 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001445 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001446 break;
1447
1448 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001449 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001450 v = POP();
1451 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001452 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1453 Py_DECREF(v);
1454 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001455 break;
1456
1457 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001458 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001459 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001460 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1461 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001462 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001463 break;
1464
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001465 case STORE_GLOBAL:
1466 w = GETNAMEV(oparg);
1467 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001468 err = PyDict_SetItem(f->f_globals, w, v);
1469 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001470 break;
1471
1472 case DELETE_GLOBAL:
1473 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001474 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
1475 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001476 break;
1477
Guido van Rossum374a9221991-04-04 10:40:29 +00001478 case LOAD_CONST:
1479 x = GETCONST(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001480 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001481 PUSH(x);
1482 break;
1483
1484 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001485 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001486 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001487 PyErr_SetString(PyExc_SystemError,
1488 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001489 break;
1490 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001491 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001492 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001493 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001494 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001495 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001496 if (x == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001497 PyErr_SetObject(
1498 PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001499 break;
1500 }
1501 }
1502 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001503 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001504 PUSH(x);
1505 break;
1506
1507 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001508 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001509 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001510 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001511 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001512 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001513 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001514 break;
1515 }
1516 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001517 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001518 PUSH(x);
1519 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001520
Guido van Rossum9bfef441993-03-29 10:43:31 +00001521 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001522 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001523 if (x == NULL) {
Guido van Rossum87460821999-06-22 14:47:32 +00001524 PyErr_SetObject(PyExc_UnboundLocalError,
Guido van Rossumb209a111997-04-29 18:18:01 +00001525 PyTuple_GetItem(co->co_varnames,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001526 oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001527 break;
1528 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001529 Py_INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001530 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001531 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001532 break;
1533
1534 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001535 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001536 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001537 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001538
1539 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001540 x = GETLOCAL(oparg);
1541 if (x == NULL) {
Guido van Rossum87460821999-06-22 14:47:32 +00001542 PyErr_SetObject(PyExc_UnboundLocalError,
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001543 PyTuple_GetItem(co->co_varnames,
1544 oparg));
1545 break;
1546 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001547 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001548 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001549
1550 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001551 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001552 if (x != NULL) {
1553 for (; --oparg >= 0;) {
1554 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001555 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001556 }
1557 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001558 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001559 }
1560 break;
1561
1562 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001563 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001564 if (x != NULL) {
1565 for (; --oparg >= 0;) {
1566 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001567 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001568 }
1569 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001570 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001571 }
1572 break;
1573
1574 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001575 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001576 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001577 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001578 break;
1579
1580 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001581 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001582 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001583 x = PyObject_GetAttr(v, w);
1584 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001585 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001586 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001587 break;
1588
1589 case COMPARE_OP:
1590 w = POP();
1591 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +00001592 if (PyInt_Check(v) && PyInt_Check(w)) {
1593 /* INLINE: cmp(int, int) */
1594 register long a, b;
1595 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001596 a = PyInt_AS_LONG(v);
1597 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001598 switch (oparg) {
1599 case LT: res = a < b; break;
1600 case LE: res = a <= b; break;
1601 case EQ: res = a == b; break;
1602 case NE: res = a != b; break;
1603 case GT: res = a > b; break;
1604 case GE: res = a >= b; break;
1605 case IS: res = v == w; break;
1606 case IS_NOT: res = v != w; break;
1607 default: goto slow_compare;
1608 }
1609 x = res ? Py_True : Py_False;
1610 Py_INCREF(x);
1611 }
1612 else {
1613 slow_compare:
1614 x = cmp_outcome(oparg, v, w);
1615 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001616 Py_DECREF(v);
1617 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001618 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001619 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001620 break;
1621
1622 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001623 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001624 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001625 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001626 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001627 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001628 break;
1629 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001630 u = find_from_args(f, INSTR_OFFSET());
1631 if (u == NULL) {
1632 x = u;
1633 break;
Guido van Rossum24c13741995-02-14 09:42:43 +00001634 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001635 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001636 w,
1637 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001638 f->f_locals == NULL ?
1639 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001640 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001641 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001642 if (w == NULL) {
1643 x = NULL;
1644 break;
1645 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001646 x = PyEval_CallObject(x, w);
1647 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001648 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001649 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001650 break;
1651
Thomas Wouters52152252000-08-17 22:55:00 +00001652 case IMPORT_STAR:
1653 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001654 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001655 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001656 PyErr_SetString(PyExc_SystemError,
1657 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001658 break;
1659 }
Thomas Wouters52152252000-08-17 22:55:00 +00001660 err = import_all_from(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001661 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00001662 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001663 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001664 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001665
Thomas Wouters52152252000-08-17 22:55:00 +00001666 case IMPORT_FROM:
1667 w = GETNAMEV(oparg);
1668 v = TOP();
1669 x = import_from(v, w);
1670 PUSH(x);
1671 if (x != NULL) continue;
1672 break;
1673
Guido van Rossum374a9221991-04-04 10:40:29 +00001674 case JUMP_FORWARD:
1675 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001676 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001677
1678 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001679 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001680 if (err > 0)
1681 err = 0;
1682 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001683 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001684 else
1685 break;
1686 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001687
1688 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001689 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001690 if (err > 0) {
1691 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001692 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001693 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001694 else if (err == 0)
1695 ;
1696 else
1697 break;
1698 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001699
1700 case JUMP_ABSOLUTE:
1701 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001702 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001703
1704 case FOR_LOOP:
1705 /* for v in s: ...
1706 On entry: stack contains s, i.
1707 On exit: stack contains s, i+1, s[i];
1708 but if loop exhausted:
1709 s, i are popped, and we jump */
1710 w = POP(); /* Loop index */
1711 v = POP(); /* Sequence object */
1712 u = loop_subscript(v, w);
1713 if (u != NULL) {
1714 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001715 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001716 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001717 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001718 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001719 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001720 }
1721 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001722 Py_DECREF(v);
1723 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001724 /* A NULL can mean "s exhausted"
1725 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001726 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001727 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001728 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001729 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001730 continue;
1731 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001732 }
1733 break;
1734
1735 case SETUP_LOOP:
1736 case SETUP_EXCEPT:
1737 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001738 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Guido van Rossum374a9221991-04-04 10:40:29 +00001739 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001740 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001741
1742 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001743#ifdef LLTRACE
1744 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001745 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001746#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001747 f->f_lineno = oparg;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001748 if (f->f_trace == NULL)
1749 continue;
1750 /* Trace each line of code reached */
1751 f->f_lasti = INSTR_OFFSET();
1752 err = call_trace(&f->f_trace, &f->f_trace,
Guido van Rossumb209a111997-04-29 18:18:01 +00001753 f, "line", Py_None);
Guido van Rossum374a9221991-04-04 10:40:29 +00001754 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001755
1756 case CALL_FUNCTION:
Jeremy Hylton76901512000-03-28 23:49:17 +00001757 case CALL_FUNCTION_VAR:
1758 case CALL_FUNCTION_KW:
1759 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00001760 {
Jeremy Hylton76901512000-03-28 23:49:17 +00001761 int na = oparg & 0xff;
1762 int nk = (oparg>>8) & 0xff;
1763 int flags = (opcode - CALL_FUNCTION) & 3;
1764 int n = na + 2*nk + (flags & 1) + ((flags >> 1) & 1);
1765 PyObject **pfunc = stack_pointer - n - 1;
1766 PyObject *func = *pfunc;
1767 PyObject *self = NULL;
1768 PyObject *class = NULL;
1769 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
1770 if (PyMethod_Check(func)) {
1771 self = PyMethod_Self(func);
1772 class = PyMethod_Class(func);
1773 func = PyMethod_Function(func);
1774 Py_INCREF(func);
1775 if (self != NULL) {
1776 Py_INCREF(self);
1777 Py_DECREF(*pfunc);
1778 *pfunc = self;
1779 na++;
1780 n++;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001781 }
1782 else {
Jeremy Hylton76901512000-03-28 23:49:17 +00001783 /* Unbound methods must be called with an
1784 instance of the class (or a derived
1785 class) as first argument */
1786 if (na > 0 && (self = stack_pointer[-n]) != NULL
1787 && PyInstance_Check(self)
1788 && PyClass_IsSubclass((PyObject *)
1789 (((PyInstanceObject *)self)->in_class),
1790 class))
1791 /* Handy-dandy */ ;
1792 else {
1793 PyErr_SetString(PyExc_TypeError,
1794 "unbound method must be called with class instance 1st argument");
1795 x = NULL;
1796 break;
1797 }
1798 }
1799 }
1800 else
1801 Py_INCREF(func);
1802 if (PyFunction_Check(func) && flags == 0) {
1803 PyObject *co = PyFunction_GetCode(func);
1804 PyObject *globals = PyFunction_GetGlobals(func);
1805 PyObject *argdefs = PyFunction_GetDefaults(func);
1806 PyObject **d;
1807 int nd;
1808 if (argdefs != NULL) {
1809 d = &PyTuple_GET_ITEM(argdefs, 0);
1810 nd = ((PyTupleObject *)argdefs)->ob_size;
1811 }
1812 else {
1813 d = NULL;
1814 nd = 0;
1815 }
1816 x = eval_code2((PyCodeObject *)co, globals,
1817 (PyObject *)NULL, stack_pointer-n, na,
1818 stack_pointer-2*nk, nk, d, nd,
1819 class);
1820 }
1821 else {
1822 int nstar = 0;
Jeremy Hylton387b1012000-03-31 01:22:54 +00001823 PyObject *callargs;
Jeremy Hylton76901512000-03-28 23:49:17 +00001824 PyObject *stararg = 0;
1825 PyObject *kwdict = NULL;
1826 if (flags & 2) {
1827 kwdict = POP();
1828 if (!PyDict_Check(kwdict)) {
1829 PyErr_SetString(PyExc_TypeError,
1830 "** argument must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00001831 goto extcall_fail;
Jeremy Hylton76901512000-03-28 23:49:17 +00001832 }
1833 }
1834 if (flags & 1) {
1835 stararg = POP();
1836 if (!PySequence_Check(stararg)) {
1837 PyErr_SetString(PyExc_TypeError,
1838 "* argument must be a sequence");
Guido van Rossum25826c92000-04-21 21:17:39 +00001839 goto extcall_fail;
Jeremy Hylton76901512000-03-28 23:49:17 +00001840 }
Jeremy Hylton074c3e62000-03-30 23:55:31 +00001841 /* Convert abstract sequence to concrete tuple */
1842 if (!PyTuple_Check(stararg)) {
1843 PyObject *t = NULL;
1844 t = PySequence_Tuple(stararg);
1845 if (t == NULL) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001846 goto extcall_fail;
Jeremy Hylton074c3e62000-03-30 23:55:31 +00001847 }
1848 Py_DECREF(stararg);
1849 stararg = t;
1850 }
1851 nstar = PyTuple_GET_SIZE(stararg);
Barry Warsaw4961ef72000-03-29 18:30:03 +00001852 if (nstar < 0) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001853 goto extcall_fail;
Barry Warsaw4961ef72000-03-29 18:30:03 +00001854 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001855 }
1856 if (nk > 0) {
1857 if (kwdict == NULL) {
1858 kwdict = PyDict_New();
1859 if (kwdict == NULL) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001860 goto extcall_fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001861 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001862 }
Jeremy Hylton074c3e62000-03-30 23:55:31 +00001863 else {
1864 PyObject *d = PyDict_Copy(kwdict);
1865 if (d == NULL) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001866 goto extcall_fail;
Jeremy Hylton074c3e62000-03-30 23:55:31 +00001867 }
1868 Py_DECREF(kwdict);
1869 kwdict = d;
1870 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001871 err = 0;
1872 while (--nk >= 0) {
1873 PyObject *value = POP();
1874 PyObject *key = POP();
1875 if (PyDict_GetItem(kwdict, key) != NULL) {
1876 err = 1;
1877 PyErr_Format(PyExc_TypeError,
1878 "keyword parameter redefined: %.400s",
1879 PyString_AsString(key));
Jeremy Hylton387b1012000-03-31 01:22:54 +00001880 Py_DECREF(key);
1881 Py_DECREF(value);
Guido van Rossum25826c92000-04-21 21:17:39 +00001882 goto extcall_fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001883 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001884 err = PyDict_SetItem(kwdict, key, value);
1885 Py_DECREF(key);
1886 Py_DECREF(value);
1887 if (err)
1888 break;
1889 }
1890 if (err) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001891 extcall_fail:
1892 Py_XDECREF(kwdict);
1893 Py_XDECREF(stararg);
1894 Py_DECREF(func);
1895 x=NULL;
Jeremy Hylton76901512000-03-28 23:49:17 +00001896 break;
1897 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001898 }
Jeremy Hylton387b1012000-03-31 01:22:54 +00001899 callargs = PyTuple_New(na + nstar);
1900 if (callargs == NULL) {
Jeremy Hylton76901512000-03-28 23:49:17 +00001901 x = NULL;
1902 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001903 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001904 if (stararg) {
Jeremy Hylton76901512000-03-28 23:49:17 +00001905 int i;
Jeremy Hylton76901512000-03-28 23:49:17 +00001906 for (i = 0; i < nstar; i++) {
1907 PyObject *a = PyTuple_GET_ITEM(stararg, i);
1908 Py_INCREF(a);
Jeremy Hylton387b1012000-03-31 01:22:54 +00001909 PyTuple_SET_ITEM(callargs, na + i, a);
Jeremy Hylton76901512000-03-28 23:49:17 +00001910 }
1911 Py_DECREF(stararg);
1912 }
1913 while (--na >= 0) {
1914 w = POP();
Jeremy Hylton387b1012000-03-31 01:22:54 +00001915 PyTuple_SET_ITEM(callargs, na, w);
Jeremy Hylton76901512000-03-28 23:49:17 +00001916 }
Jeremy Hylton387b1012000-03-31 01:22:54 +00001917 x = PyEval_CallObjectWithKeywords(func,
1918 callargs,
1919 kwdict);
1920 Py_DECREF(callargs);
Jeremy Hylton76901512000-03-28 23:49:17 +00001921 Py_XDECREF(kwdict);
1922 }
1923 Py_DECREF(func);
1924 while (stack_pointer > pfunc) {
1925 w = POP();
1926 Py_DECREF(w);
1927 }
1928 PUSH(x);
1929 if (x != NULL) continue;
1930 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001931 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001932
Guido van Rossum681d79a1995-07-18 14:51:37 +00001933 case MAKE_FUNCTION:
1934 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00001935 x = PyFunction_New(v, f->f_globals);
1936 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001937 /* XXX Maybe this should be a separate opcode? */
1938 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001939 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001940 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001941 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001942 x = NULL;
1943 break;
1944 }
1945 while (--oparg >= 0) {
1946 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001947 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001948 }
1949 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001950 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001951 }
1952 PUSH(x);
1953 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001954
1955 case BUILD_SLICE:
1956 if (oparg == 3)
1957 w = POP();
1958 else
1959 w = NULL;
1960 v = POP();
1961 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00001962 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001963 Py_DECREF(u);
1964 Py_DECREF(v);
1965 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00001966 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001967 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00001968 break;
1969
Fred Drakeef8ace32000-08-24 00:32:09 +00001970 case EXTENDED_ARG:
1971 opcode = NEXTOP();
1972 oparg = oparg<<16 | NEXTARG();
1973 goto dispatch_opcode;
1974 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001975
Guido van Rossum374a9221991-04-04 10:40:29 +00001976 default:
1977 fprintf(stderr,
1978 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001979 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00001980 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00001981 why = WHY_EXCEPTION;
1982 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001983
1984#ifdef CASE_TOO_BIG
1985 }
1986#endif
1987
Guido van Rossum374a9221991-04-04 10:40:29 +00001988 } /* switch */
1989
1990 on_error:
1991
1992 /* Quickly continue if no error occurred */
1993
1994 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001995 if (err == 0 && x != NULL) {
1996#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00001997 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00001998 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00001999 fprintf(stderr,
2000 "XXX undetected error\n");
2001 else
2002#endif
2003 continue; /* Normal, fast path */
2004 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002005 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00002006 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00002007 err = 0;
2008 }
2009
Guido van Rossum374a9221991-04-04 10:40:29 +00002010 /* Double-check exception status */
2011
2012 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002013 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002014 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002015 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00002016 why = WHY_EXCEPTION;
2017 }
2018 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002019#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00002020 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002021 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002022 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002023 fprintf(stderr,
2024 "XXX undetected error (why=%d)\n",
2025 why);
2026 why = WHY_EXCEPTION;
2027 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002028 }
2029#endif
2030
2031 /* Log traceback info if this is a real exception */
2032
2033 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002034 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00002035 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00002036 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00002037 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002038
Guido van Rossume59214e1994-08-30 08:01:59 +00002039 if (f->f_trace)
2040 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002041 if (tstate->sys_profilefunc)
2042 call_exc_trace(&tstate->sys_profilefunc,
2043 (PyObject**)0, f);
Guido van Rossum014518f1998-11-23 21:09:51 +00002044 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002045
2046 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
2047
2048 if (why == WHY_RERAISE)
2049 why = WHY_EXCEPTION;
2050
2051 /* Unwind stacks if a (pseudo) exception occurred */
2052
2053 while (why != WHY_NOT && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002054 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00002055 while (STACK_LEVEL() > b->b_level) {
2056 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002057 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002058 }
2059 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2060 why = WHY_NOT;
2061 JUMPTO(b->b_handler);
2062 break;
2063 }
2064 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00002065 (b->b_type == SETUP_EXCEPT &&
2066 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002067 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002068 PyObject *exc, *val, *tb;
2069 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002070 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002071 val = Py_None;
2072 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00002073 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002074 /* Make the raw exception data
2075 available to the handler,
2076 so a program can emulate the
2077 Python main loop. Don't do
2078 this for 'finally'. */
2079 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00002080 PyErr_NormalizeException(
2081 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002082 set_exc_info(tstate,
2083 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002084 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002085 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002086 PUSH(val);
2087 PUSH(exc);
2088 }
2089 else {
2090 if (why == WHY_RETURN)
2091 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00002092 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00002093 PUSH(v);
2094 }
2095 why = WHY_NOT;
2096 JUMPTO(b->b_handler);
2097 break;
2098 }
2099 } /* unwind stack */
2100
2101 /* End the loop if we still have an error (or return) */
2102
2103 if (why != WHY_NOT)
2104 break;
2105
2106 } /* main loop */
2107
2108 /* Pop remaining stack entries */
2109
2110 while (!EMPTY()) {
2111 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002112 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002113 }
2114
Guido van Rossum96a42c81992-01-12 02:29:51 +00002115 if (why != WHY_RETURN)
2116 retval = NULL;
2117
Guido van Rossume59214e1994-08-30 08:01:59 +00002118 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002119 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00002120 if (call_trace(&f->f_trace, &f->f_trace, f,
2121 "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002122 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002123 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002124 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002125 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002126 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002127 }
2128
Guido van Rossuma027efa1997-05-05 20:56:21 +00002129 if (tstate->sys_profilefunc && why == WHY_RETURN) {
2130 if (call_trace(&tstate->sys_profilefunc, (PyObject**)0,
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002131 f, "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002132 Py_XDECREF(retval);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002133 retval = NULL;
2134 why = WHY_EXCEPTION;
2135 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002136 }
Guido van Rossuma4240131997-01-21 21:18:36 +00002137
Guido van Rossuma027efa1997-05-05 20:56:21 +00002138 reset_exc_info(tstate);
2139
2140 --tstate->recursion_depth;
Guido van Rossum8c5df061997-01-24 04:19:24 +00002141
2142 fail: /* Jump here from prelude on failure */
Guido van Rossum96a42c81992-01-12 02:29:51 +00002143
Guido van Rossum374a9221991-04-04 10:40:29 +00002144 /* Restore previous frame and release the current one */
Guido van Rossum681d79a1995-07-18 14:51:37 +00002145
Guido van Rossuma027efa1997-05-05 20:56:21 +00002146 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +00002147 Py_DECREF(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00002148
Guido van Rossum96a42c81992-01-12 02:29:51 +00002149 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00002150}
2151
Guido van Rossuma027efa1997-05-05 20:56:21 +00002152static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002153set_exc_info(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002154{
2155 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002156 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00002157
Guido van Rossuma027efa1997-05-05 20:56:21 +00002158 frame = tstate->frame;
2159 if (frame->f_exc_type == NULL) {
2160 /* This frame didn't catch an exception before */
2161 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002162 if (tstate->exc_type == NULL) {
2163 Py_INCREF(Py_None);
2164 tstate->exc_type = Py_None;
2165 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002166 tmp_type = frame->f_exc_type;
2167 tmp_value = frame->f_exc_value;
2168 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002169 Py_XINCREF(tstate->exc_type);
2170 Py_XINCREF(tstate->exc_value);
2171 Py_XINCREF(tstate->exc_traceback);
2172 frame->f_exc_type = tstate->exc_type;
2173 frame->f_exc_value = tstate->exc_value;
2174 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002175 Py_XDECREF(tmp_type);
2176 Py_XDECREF(tmp_value);
2177 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002178 }
2179 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002180 tmp_type = tstate->exc_type;
2181 tmp_value = tstate->exc_value;
2182 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002183 Py_XINCREF(type);
2184 Py_XINCREF(value);
2185 Py_XINCREF(tb);
2186 tstate->exc_type = type;
2187 tstate->exc_value = value;
2188 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002189 Py_XDECREF(tmp_type);
2190 Py_XDECREF(tmp_value);
2191 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002192 /* For b/w compatibility */
2193 PySys_SetObject("exc_type", type);
2194 PySys_SetObject("exc_value", value);
2195 PySys_SetObject("exc_traceback", tb);
2196}
2197
2198static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002199reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002200{
2201 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002202 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002203 frame = tstate->frame;
2204 if (frame->f_exc_type != NULL) {
2205 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002206 tmp_type = tstate->exc_type;
2207 tmp_value = tstate->exc_value;
2208 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002209 Py_XINCREF(frame->f_exc_type);
2210 Py_XINCREF(frame->f_exc_value);
2211 Py_XINCREF(frame->f_exc_traceback);
2212 tstate->exc_type = frame->f_exc_type;
2213 tstate->exc_value = frame->f_exc_value;
2214 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002215 Py_XDECREF(tmp_type);
2216 Py_XDECREF(tmp_value);
2217 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002218 /* For b/w compatibility */
2219 PySys_SetObject("exc_type", frame->f_exc_type);
2220 PySys_SetObject("exc_value", frame->f_exc_value);
2221 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
2222 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002223 tmp_type = frame->f_exc_type;
2224 tmp_value = frame->f_exc_value;
2225 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002226 frame->f_exc_type = NULL;
2227 frame->f_exc_value = NULL;
2228 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002229 Py_XDECREF(tmp_type);
2230 Py_XDECREF(tmp_value);
2231 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002232}
2233
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002234/* Logic for the raise statement (too complicated for inlining).
2235 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00002236static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002237do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002238{
Guido van Rossumd295f121998-04-09 21:39:57 +00002239 if (type == NULL) {
2240 /* Reraise */
2241 PyThreadState *tstate = PyThreadState_Get();
2242 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
2243 value = tstate->exc_value;
2244 tb = tstate->exc_traceback;
2245 Py_XINCREF(type);
2246 Py_XINCREF(value);
2247 Py_XINCREF(tb);
2248 }
2249
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002250 /* We support the following forms of raise:
2251 raise <class>, <classinstance>
2252 raise <class>, <argument tuple>
2253 raise <class>, None
2254 raise <class>, <argument>
2255 raise <classinstance>, None
2256 raise <string>, <object>
2257 raise <string>, None
2258
2259 An omitted second argument is the same as None.
2260
2261 In addition, raise <tuple>, <anything> is the same as
2262 raising the tuple's first item (and it better have one!);
2263 this rule is applied recursively.
2264
2265 Finally, an optional third argument can be supplied, which
2266 gives the traceback to be substituted (useful when
2267 re-raising an exception after examining it). */
2268
2269 /* First, check the traceback argument, replacing None with
2270 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002271 if (tb == Py_None) {
2272 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002273 tb = NULL;
2274 }
2275 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002276 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002277 "raise 3rd arg must be traceback or None");
2278 goto raise_error;
2279 }
2280
2281 /* Next, replace a missing value with None */
2282 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002283 value = Py_None;
2284 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002285 }
2286
2287 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002288 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2289 PyObject *tmp = type;
2290 type = PyTuple_GET_ITEM(type, 0);
2291 Py_INCREF(type);
2292 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002293 }
2294
Barry Warsaw4249f541997-08-22 21:26:19 +00002295 if (PyString_Check(type))
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002296 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002297
2298 else if (PyClass_Check(type))
2299 PyErr_NormalizeException(&type, &value, &tb);
2300
Guido van Rossumb209a111997-04-29 18:18:01 +00002301 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002302 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002303 if (value != Py_None) {
2304 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002305 "instance exception may not have a separate value");
2306 goto raise_error;
2307 }
2308 else {
2309 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002310 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002311 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002312 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2313 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002314 }
2315 }
2316 else {
2317 /* Not something you can raise. You get an exception
2318 anyway, just not what you specified :-) */
Guido van Rossumb209a111997-04-29 18:18:01 +00002319 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002320 "exceptions must be strings, classes, or instances");
2321 goto raise_error;
2322 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002323 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002324 if (tb == NULL)
2325 return WHY_EXCEPTION;
2326 else
2327 return WHY_RERAISE;
2328 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002329 Py_XDECREF(value);
2330 Py_XDECREF(type);
2331 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002332 return WHY_EXCEPTION;
2333}
2334
Barry Warsawe42b18f1997-08-25 22:13:04 +00002335static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002336unpack_sequence(PyObject *v, int argcnt, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00002337{
2338 int i;
2339 PyObject *w;
2340
2341 for (i = 0; i < argcnt; i++) {
2342 if (! (w = PySequence_GetItem(v, i))) {
2343 if (PyErr_ExceptionMatches(PyExc_IndexError))
2344 PyErr_SetString(PyExc_ValueError,
2345 "unpack sequence of wrong size");
2346 goto finally;
2347 }
2348 *--sp = w;
2349 }
2350 /* we better get an IndexError now */
2351 if (PySequence_GetItem(v, i) == NULL) {
2352 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
2353 PyErr_Clear();
2354 return 1;
2355 }
2356 /* some other exception occurred. fall through to finally */
2357 }
2358 else
2359 PyErr_SetString(PyExc_ValueError,
2360 "unpack sequence of wrong size");
2361 /* fall through */
2362finally:
Barry Warsaw91010551997-08-25 22:30:51 +00002363 for (; i > 0; i--, sp++)
2364 Py_DECREF(*sp);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002365
2366 return 0;
2367}
2368
2369
Guido van Rossum96a42c81992-01-12 02:29:51 +00002370#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002371static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002372prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002373{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002374 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002375 if (PyObject_Print(v, stdout, 0) != 0)
2376 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002377 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00002378 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002379}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002380#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002381
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002382static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002383call_exc_trace(PyObject **p_trace, PyObject **p_newtrace, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002384{
Guido van Rossumb209a111997-04-29 18:18:01 +00002385 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002386 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002387 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002388 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002389 value = Py_None;
2390 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002391 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002392 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002393 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002394 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002395 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002396 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002397 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002398 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002399 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002400 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002401 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002402 Py_XDECREF(type);
2403 Py_XDECREF(value);
2404 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002405 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002406}
2407
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002408/* PyObject **p_trace: in/out; may not be NULL;
2409 may not point to NULL variable initially
2410 PyObject **p_newtrace: in/out; may be NULL;
2411 may point to NULL variable;
2412 may be same variable as p_newtrace */
2413
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002414static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002415call_trace(PyObject **p_trace, PyObject **p_newtrace, PyFrameObject *f,
2416 char *msg, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002417{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002418 PyThreadState *tstate = f->f_tstate;
Guido van Rossumb209a111997-04-29 18:18:01 +00002419 PyObject *args, *what;
2420 PyObject *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002421
Guido van Rossuma027efa1997-05-05 20:56:21 +00002422 if (tstate->tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002423 /* Don't do recursive traces */
2424 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002425 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002426 *p_newtrace = NULL;
2427 }
2428 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002429 }
2430
Guido van Rossumb209a111997-04-29 18:18:01 +00002431 args = PyTuple_New(3);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002432 if (args == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002433 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002434 what = PyString_FromString(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002435 if (what == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002436 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002437 Py_INCREF(f);
2438 PyTuple_SET_ITEM(args, 0, (PyObject *)f);
2439 PyTuple_SET_ITEM(args, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002440 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002441 arg = Py_None;
2442 Py_INCREF(arg);
2443 PyTuple_SET_ITEM(args, 2, arg);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002444 tstate->tracing++;
Guido van Rossumb209a111997-04-29 18:18:01 +00002445 PyFrame_FastToLocals(f);
2446 res = PyEval_CallObject(*p_trace, args); /* May clear *p_trace! */
2447 PyFrame_LocalsToFast(f, 1);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002448 tstate->tracing--;
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002449 cleanup:
Guido van Rossumb209a111997-04-29 18:18:01 +00002450 Py_XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002451 if (res == NULL) {
2452 /* The trace proc raised an exception */
Guido van Rossumb209a111997-04-29 18:18:01 +00002453 PyTraceBack_Here(f);
2454 Py_XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002455 *p_trace = NULL;
2456 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002457 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002458 *p_newtrace = NULL;
2459 }
Barry Warsawf6202631999-09-08 16:26:33 +00002460 /* to be extra double plus sure we don't get recursive
2461 * calls inf either tracefunc or profilefunc gets an
2462 * exception, zap the global variables.
2463 */
2464 Py_XDECREF(tstate->sys_tracefunc);
2465 tstate->sys_tracefunc = NULL;
2466 Py_XDECREF(tstate->sys_profilefunc);
2467 tstate->sys_profilefunc = NULL;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002468 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002469 }
2470 else {
2471 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002472 Py_XDECREF(*p_newtrace);
2473 if (res == Py_None)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002474 *p_newtrace = NULL;
2475 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002476 Py_INCREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002477 *p_newtrace = res;
2478 }
2479 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002480 Py_DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002481 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002482 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002483}
2484
Guido van Rossumb209a111997-04-29 18:18:01 +00002485PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002486PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002487{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002488 PyThreadState *tstate = PyThreadState_Get();
2489 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002490 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002491 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002492 else
2493 return current_frame->f_builtins;
2494}
2495
Guido van Rossumb209a111997-04-29 18:18:01 +00002496PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002497PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00002498{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002499 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002500 if (current_frame == NULL)
2501 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002502 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002503 return current_frame->f_locals;
2504}
2505
Guido van Rossumb209a111997-04-29 18:18:01 +00002506PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002507PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002508{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002509 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002510 if (current_frame == NULL)
2511 return NULL;
2512 else
2513 return current_frame->f_globals;
2514}
2515
Guido van Rossumb209a111997-04-29 18:18:01 +00002516PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002517PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00002518{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002519 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002520 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002521}
2522
Guido van Rossum6135a871995-01-09 17:53:26 +00002523int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002524PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002525{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002526 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002527 return current_frame == NULL ? 0 : current_frame->f_restricted;
2528}
2529
Guido van Rossumbe270261997-05-22 22:26:18 +00002530int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002531Py_FlushLine(void)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002532{
Guido van Rossumb209a111997-04-29 18:18:01 +00002533 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002534 if (f == NULL)
2535 return 0;
2536 if (!PyFile_SoftSpace(f, 0))
2537 return 0;
2538 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002539}
2540
Guido van Rossum3f5da241990-12-20 15:06:42 +00002541
Guido van Rossum681d79a1995-07-18 14:51:37 +00002542/* External interface to call any callable object.
2543 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002544
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002545#undef PyEval_CallObject
2546/* for backward compatibility: export this interface */
2547
Guido van Rossumb209a111997-04-29 18:18:01 +00002548PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002549PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002550{
Guido van Rossumb209a111997-04-29 18:18:01 +00002551 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002552}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002553#define PyEval_CallObject(func,arg) \
2554 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00002555
Guido van Rossumb209a111997-04-29 18:18:01 +00002556PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002557PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002558{
2559 ternaryfunc call;
Guido van Rossumb209a111997-04-29 18:18:01 +00002560 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002561
2562 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002563 arg = PyTuple_New(0);
2564 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002565 PyErr_SetString(PyExc_TypeError,
2566 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002567 return NULL;
2568 }
2569 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002570 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002571
Guido van Rossumb209a111997-04-29 18:18:01 +00002572 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002573 PyErr_SetString(PyExc_TypeError,
2574 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00002575 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00002576 return NULL;
2577 }
2578
Guido van Rossum150b2df1996-12-05 23:17:11 +00002579 if ((call = func->ob_type->tp_call) != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002580 result = (*call)(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002581 else if (PyMethod_Check(func) || PyFunction_Check(func))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002582 result = call_function(func, arg, kw);
2583 else
2584 result = call_builtin(func, arg, kw);
2585
Guido van Rossumb209a111997-04-29 18:18:01 +00002586 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002587
Guido van Rossumb209a111997-04-29 18:18:01 +00002588 if (result == NULL && !PyErr_Occurred())
2589 PyErr_SetString(PyExc_SystemError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002590 "NULL result without error in call_object");
Guido van Rossume59214e1994-08-30 08:01:59 +00002591
2592 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002593}
2594
Guido van Rossumb209a111997-04-29 18:18:01 +00002595static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002596call_builtin(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002597{
Guido van Rossumb209a111997-04-29 18:18:01 +00002598 if (PyCFunction_Check(func)) {
2599 PyCFunction meth = PyCFunction_GetFunction(func);
2600 PyObject *self = PyCFunction_GetSelf(func);
2601 int flags = PyCFunction_GetFlags(func);
Guido van Rossumff8b4941995-07-26 18:16:42 +00002602 if (!(flags & METH_VARARGS)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002603 int size = PyTuple_Size(arg);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002604 if (size == 1)
Guido van Rossumb209a111997-04-29 18:18:01 +00002605 arg = PyTuple_GET_ITEM(arg, 0);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002606 else if (size == 0)
2607 arg = NULL;
2608 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002609 if (flags & METH_KEYWORDS)
2610 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002611 if (kw != NULL && PyDict_Size(kw) != 0) {
2612 PyErr_SetString(PyExc_TypeError,
Guido van Rossumff8b4941995-07-26 18:16:42 +00002613 "this function takes no keyword arguments");
2614 return NULL;
2615 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002616 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002617 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002618 if (PyClass_Check(func)) {
2619 return PyInstance_New(func, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002620 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002621 if (PyInstance_Check(func)) {
2622 PyObject *res, *call = PyObject_GetAttrString(func,"__call__");
Guido van Rossume59214e1994-08-30 08:01:59 +00002623 if (call == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002624 PyErr_Clear();
2625 PyErr_SetString(PyExc_AttributeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002626 "no __call__ method defined");
Guido van Rossume59214e1994-08-30 08:01:59 +00002627 return NULL;
2628 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002629 res = PyEval_CallObjectWithKeywords(call, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002630 Py_DECREF(call);
Guido van Rossume59214e1994-08-30 08:01:59 +00002631 return res;
2632 }
Guido van Rossumba98a421999-11-15 19:29:33 +00002633 PyErr_Format(PyExc_TypeError, "call of non-function (type %.400s)",
Guido van Rossum2d1ad391998-08-25 18:16:54 +00002634 func->ob_type->tp_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002635 return NULL;
2636}
2637
Guido van Rossumb209a111997-04-29 18:18:01 +00002638static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002639call_function(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002640{
Guido van Rossumb209a111997-04-29 18:18:01 +00002641 PyObject *class = NULL; /* == owner */
2642 PyObject *argdefs;
2643 PyObject **d, **k;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002644 int nk, nd;
Guido van Rossumb209a111997-04-29 18:18:01 +00002645 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002646
Guido van Rossumb209a111997-04-29 18:18:01 +00002647 if (kw != NULL && !PyDict_Check(kw)) {
2648 PyErr_BadInternalCall();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002649 return NULL;
2650 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002651
Guido van Rossumb209a111997-04-29 18:18:01 +00002652 if (PyMethod_Check(func)) {
2653 PyObject *self = PyMethod_Self(func);
2654 class = PyMethod_Class(func);
2655 func = PyMethod_Function(func);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002656 if (self == NULL) {
2657 /* Unbound methods must be called with an instance of
2658 the class (or a derived class) as first argument */
Guido van Rossumb209a111997-04-29 18:18:01 +00002659 if (PyTuple_Size(arg) >= 1) {
2660 self = PyTuple_GET_ITEM(arg, 0);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002661 if (self != NULL &&
Guido van Rossumb209a111997-04-29 18:18:01 +00002662 PyInstance_Check(self) &&
2663 PyClass_IsSubclass((PyObject *)
2664 (((PyInstanceObject *)self)->in_class),
Guido van Rossumb3f72581993-05-21 19:56:10 +00002665 class))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002666 /* Handy-dandy */ ;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002667 else
2668 self = NULL;
2669 }
2670 if (self == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002671 PyErr_SetString(PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002672 "unbound method must be called with class instance 1st argument");
Guido van Rossumb3f72581993-05-21 19:56:10 +00002673 return NULL;
2674 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002675 Py_INCREF(arg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002676 }
2677 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002678 int argcount = PyTuple_Size(arg);
2679 PyObject *newarg = PyTuple_New(argcount + 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002680 int i;
Guido van Rossum81daa321993-05-20 14:24:46 +00002681 if (newarg == NULL)
2682 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002683 Py_INCREF(self);
2684 PyTuple_SET_ITEM(newarg, 0, self);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002685 for (i = 0; i < argcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002686 PyObject *v = PyTuple_GET_ITEM(arg, i);
2687 Py_XINCREF(v);
2688 PyTuple_SET_ITEM(newarg, i+1, v);
Guido van Rossum81daa321993-05-20 14:24:46 +00002689 }
2690 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002691 }
Guido van Rossum7859f871998-07-08 14:58:16 +00002692 if (!PyFunction_Check(func)) {
2693 result = PyEval_CallObjectWithKeywords(func, arg, kw);
2694 Py_DECREF(arg);
2695 return result;
2696 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002697 }
2698 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002699 if (!PyFunction_Check(func)) {
Guido van Rossum2d1ad391998-08-25 18:16:54 +00002700 PyErr_Format(PyExc_TypeError,
Guido van Rossum5db862d2000-04-10 12:46:51 +00002701 "call of non-function (type %.200s)",
Guido van Rossum2d1ad391998-08-25 18:16:54 +00002702 func->ob_type->tp_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002703 return NULL;
2704 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002705 Py_INCREF(arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002706 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002707
2708 argdefs = PyFunction_GetDefaults(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00002709 if (argdefs != NULL && PyTuple_Check(argdefs)) {
2710 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
2711 nd = PyTuple_Size(argdefs);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002712 }
2713 else {
2714 d = NULL;
2715 nd = 0;
2716 }
2717
2718 if (kw != NULL) {
2719 int pos, i;
Guido van Rossumb209a111997-04-29 18:18:01 +00002720 nk = PyDict_Size(kw);
2721 k = PyMem_NEW(PyObject *, 2*nk);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002722 if (k == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002723 PyErr_NoMemory();
2724 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002725 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00002726 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002727 pos = i = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00002728 while (PyDict_Next(kw, &pos, &k[i], &k[i+1]))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002729 i += 2;
2730 nk = i/2;
2731 /* XXX This is broken if the caller deletes dict items! */
2732 }
2733 else {
2734 k = NULL;
2735 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00002736 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002737
Guido van Rossum681d79a1995-07-18 14:51:37 +00002738 result = eval_code2(
Guido van Rossumb209a111997-04-29 18:18:01 +00002739 (PyCodeObject *)PyFunction_GetCode(func),
2740 PyFunction_GetGlobals(func), (PyObject *)NULL,
2741 &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg),
Guido van Rossum681d79a1995-07-18 14:51:37 +00002742 k, nk,
2743 d, nd,
2744 class);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002745
Guido van Rossumb209a111997-04-29 18:18:01 +00002746 Py_DECREF(arg);
Guido van Rossumb18618d2000-05-03 23:44:39 +00002747 if (k != NULL)
2748 PyMem_DEL(k);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002749
Guido van Rossum681d79a1995-07-18 14:51:37 +00002750 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002751}
2752
Guido van Rossum3b9c6671996-07-30 18:40:29 +00002753#define SLICE_ERROR_MSG \
2754 "standard sequence type does not support step size other than one"
2755
Guido van Rossumb209a111997-04-29 18:18:01 +00002756static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002757loop_subscript(PyObject *v, PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002758{
Guido van Rossumb209a111997-04-29 18:18:01 +00002759 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00002760 int i;
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00002761 if (sq == NULL || sq->sq_item == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002762 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002763 return NULL;
2764 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002765 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00002766 v = (*sq->sq_item)(v, i);
2767 if (v)
2768 return v;
Barry Warsaw4249f541997-08-22 21:26:19 +00002769 if (PyErr_ExceptionMatches(PyExc_IndexError))
Guido van Rossumb209a111997-04-29 18:18:01 +00002770 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00002771 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002772}
2773
Guido van Rossum20c6add2000-05-08 14:06:50 +00002774/* Extract a slice index from a PyInt or PyLong, the index is bound to
2775 the range [-INT_MAX+1, INTMAX]. Returns 0 and an exception if there is
2776 and error. Returns 1 on success.*/
2777
2778int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002779_PyEval_SliceIndex(PyObject *v, int *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002780{
2781 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002782 long x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00002783 if (PyInt_Check(v)) {
2784 x = PyInt_AsLong(v);
2785 } else if (PyLong_Check(v)) {
2786 x = PyLong_AsLong(v);
2787 if (x==-1 && PyErr_Occurred()) {
2788 PyObject *long_zero;
2789
2790 if (!PyErr_ExceptionMatches( PyExc_OverflowError ) ) {
2791 /* It's not an overflow error, so just
2792 signal an error */
Guido van Rossum20c6add2000-05-08 14:06:50 +00002793 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00002794 }
2795
2796 /* It's an overflow error, so we need to
2797 check the sign of the long integer,
2798 set the value to INT_MAX or 0, and clear
2799 the error. */
2800
2801 /* Create a long integer with a value of 0 */
2802 long_zero = PyLong_FromLong( 0L );
Guido van Rossum20c6add2000-05-08 14:06:50 +00002803 if (long_zero == NULL) return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00002804
2805 /* Check sign */
2806 if (PyObject_Compare(long_zero, v) < 0)
2807 x = INT_MAX;
2808 else
2809 x = 0;
2810
2811 /* Free the long integer we created, and clear the
2812 OverflowError */
2813 Py_DECREF(long_zero);
2814 PyErr_Clear();
2815 }
2816 } else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002817 PyErr_SetString(PyExc_TypeError,
2818 "slice index must be int");
Guido van Rossum20c6add2000-05-08 14:06:50 +00002819 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002820 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00002821 /* Truncate -- very long indices are truncated anyway */
2822 if (x > INT_MAX)
2823 x = INT_MAX;
2824 else if (x < -INT_MAX)
2825 x = 0;
2826 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002827 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00002828 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002829}
2830
Guido van Rossumb209a111997-04-29 18:18:01 +00002831static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002832apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002833{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002834 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00002835 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002836 return NULL;
Guido van Rossum20c6add2000-05-08 14:06:50 +00002837 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum04691fc1992-08-12 15:35:34 +00002838 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002839 return PySequence_GetSlice(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002840}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002841
2842static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002843assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002844{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002845 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00002846 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum3f5da241990-12-20 15:06:42 +00002847 return -1;
Guido van Rossum20c6add2000-05-08 14:06:50 +00002848 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum3f5da241990-12-20 15:06:42 +00002849 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002850 if (x == NULL)
2851 return PySequence_DelSlice(u, ilow, ihigh);
2852 else
2853 return PySequence_SetSlice(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002854}
2855
Guido van Rossumb209a111997-04-29 18:18:01 +00002856static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002857cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002858{
2859 register int cmp;
2860 register int res = 0;
2861 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002862 case IS:
2863 case IS_NOT:
2864 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002865 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002866 res = !res;
2867 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002868 case IN:
2869 case NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00002870 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002871 if (res < 0)
2872 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002873 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002874 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002875 break;
2876 case EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00002877 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002878 break;
2879 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00002880 cmp = PyObject_Compare(v, w);
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002881 if (cmp && PyErr_Occurred())
2882 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002883 switch (op) {
2884 case LT: res = cmp < 0; break;
2885 case LE: res = cmp <= 0; break;
2886 case EQ: res = cmp == 0; break;
2887 case NE: res = cmp != 0; break;
2888 case GT: res = cmp > 0; break;
2889 case GE: res = cmp >= 0; break;
2890 /* XXX no default? (res is initialized to 0 though) */
2891 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002892 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002893 v = res ? Py_True : Py_False;
2894 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002895 return v;
2896}
2897
Thomas Wouters52152252000-08-17 22:55:00 +00002898static PyObject *
2899import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00002900{
Guido van Rossumb209a111997-04-29 18:18:01 +00002901 PyObject *w, *x;
2902 if (!PyModule_Check(v)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002903 PyErr_SetString(PyExc_TypeError,
2904 "import-from requires module object");
Thomas Wouters52152252000-08-17 22:55:00 +00002905 return NULL;
2906 }
2907 w = PyModule_GetDict(v); /* TDB: can this not fail ? */
2908 x = PyDict_GetItem(w, name);
2909 if (x == NULL) {
2910 PyErr_Format(PyExc_ImportError,
2911 "cannot import name %.230s",
2912 PyString_AsString(name));
2913 } else
2914 Py_INCREF(x);
2915 return x;
2916}
2917
2918static int
2919import_all_from(PyObject *locals, PyObject *v)
2920{
2921 int pos = 0, err;
2922 PyObject *name, *value;
2923 PyObject *w;
2924
2925 if (!PyModule_Check(v)) {
2926 PyErr_SetString(PyExc_TypeError,
2927 "import-from requires module object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002928 return -1;
2929 }
Thomas Wouters52152252000-08-17 22:55:00 +00002930 w = PyModule_GetDict(v); /* TBD: can this not fail ? */
2931
2932 while (PyDict_Next(w, &pos, &name, &value)) {
2933 if (!PyString_Check(name) ||
2934 PyString_AsString(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002935 continue;
Thomas Wouters52152252000-08-17 22:55:00 +00002936 Py_INCREF(value);
2937 err = PyDict_SetItem(locals, name, value);
2938 Py_DECREF(value);
2939 if (err != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002940 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002941 }
Thomas Wouters52152252000-08-17 22:55:00 +00002942 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002943}
2944
Guido van Rossumb209a111997-04-29 18:18:01 +00002945static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002946build_class(PyObject *methods, PyObject *bases, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00002947{
Guido van Rossumcd649651997-08-22 16:56:16 +00002948 int i, n;
Guido van Rossumb209a111997-04-29 18:18:01 +00002949 if (!PyTuple_Check(bases)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002950 PyErr_SetString(PyExc_SystemError,
2951 "build_class with non-tuple bases");
Guido van Rossum25831651993-05-19 14:50:45 +00002952 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002953 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002954 if (!PyDict_Check(methods)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002955 PyErr_SetString(PyExc_SystemError,
2956 "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002957 return NULL;
2958 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002959 if (!PyString_Check(name)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002960 PyErr_SetString(PyExc_SystemError,
Guido van Rossum7a5b7962000-03-31 13:52:29 +00002961 "build_class with non-string name");
Guido van Rossum25831651993-05-19 14:50:45 +00002962 return NULL;
2963 }
Guido van Rossumcd649651997-08-22 16:56:16 +00002964 n = PyTuple_Size(bases);
2965 for (i = 0; i < n; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002966 PyObject *base = PyTuple_GET_ITEM(bases, i);
2967 if (!PyClass_Check(base)) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002968 /* Call the base's *type*, if it is callable.
2969 This code is a hook for Donald Beaudry's
2970 and Jim Fulton's type extensions. In
Thomas Wouters7e474022000-07-16 12:04:32 +00002971 unextended Python it will never be triggered
Guido van Rossum55b9ab51997-07-31 03:54:02 +00002972 since its types are not callable.
2973 Ditto: call the bases's *class*, if it has
2974 one. This makes the same thing possible
2975 without writing C code. A true meta-object
2976 protocol! */
2977 PyObject *basetype = (PyObject *)base->ob_type;
2978 PyObject *callable = NULL;
2979 if (PyCallable_Check(basetype))
2980 callable = basetype;
2981 else
2982 callable = PyObject_GetAttrString(
2983 base, "__class__");
2984 if (callable) {
2985 PyObject *args;
2986 PyObject *newclass = NULL;
2987 args = Py_BuildValue(
2988 "(OOO)", name, bases, methods);
2989 if (args != NULL) {
2990 newclass = PyEval_CallObject(
2991 callable, args);
2992 Py_DECREF(args);
2993 }
Guido van Rossum730806d1998-04-10 22:27:42 +00002994 if (callable != basetype) {
Guido van Rossum55b9ab51997-07-31 03:54:02 +00002995 Py_DECREF(callable);
Guido van Rossum730806d1998-04-10 22:27:42 +00002996 }
Guido van Rossum55b9ab51997-07-31 03:54:02 +00002997 return newclass;
Guido van Rossum150b2df1996-12-05 23:17:11 +00002998 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002999 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +00003000 "base is not a class object");
3001 return NULL;
3002 }
3003 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003004 return PyClass_New(bases, methods, name);
Guido van Rossum25831651993-05-19 14:50:45 +00003005}
3006
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003007static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003008exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
3009 PyObject *locals)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003010{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003011 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003012 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003013 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003014
Guido van Rossumb209a111997-04-29 18:18:01 +00003015 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
3016 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003017 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00003018 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003019 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00003020 locals = PyTuple_GetItem(prog, 2);
3021 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003022 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003023 if (globals == Py_None) {
3024 globals = PyEval_GetGlobals();
3025 if (locals == Py_None) {
3026 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003027 plain = 1;
3028 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003029 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003030 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003031 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00003032 if (!PyString_Check(prog) &&
3033 !PyCode_Check(prog) &&
3034 !PyFile_Check(prog)) {
3035 PyErr_SetString(PyExc_TypeError,
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003036 "exec 1st arg must be string, code or file object");
3037 return -1;
3038 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003039 if (!PyDict_Check(globals) || !PyDict_Check(locals)) {
3040 PyErr_SetString(PyExc_TypeError,
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003041 "exec 2nd/3rd args must be dict or None");
3042 return -1;
3043 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003044 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00003045 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00003046 if (PyCode_Check(prog)) {
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003047 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003048 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003049 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003050 FILE *fp = PyFile_AsFile(prog);
3051 char *name = PyString_AsString(PyFile_Name(prog));
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003052 v = PyRun_File(fp, name, Py_file_input, globals, locals);
3053 }
3054 else {
3055 char *s = PyString_AsString(prog);
Guido van Rossum582acec2000-06-28 22:07:35 +00003056 if (strlen(s) != (size_t)PyString_Size(prog)) {
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003057 PyErr_SetString(PyExc_ValueError,
3058 "embedded '\\0' in exec string");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003059 return -1;
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003060 }
3061 v = PyRun_String(s, Py_file_input, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003062 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003063 if (plain)
3064 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003065 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003066 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00003067 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003068 return 0;
3069}
Guido van Rossum24c13741995-02-14 09:42:43 +00003070
Guido van Rossum1aa14831997-01-21 05:34:20 +00003071/* Hack for ni.py */
Guido van Rossumb209a111997-04-29 18:18:01 +00003072static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003073find_from_args(PyFrameObject *f, int nexti)
Guido van Rossum24c13741995-02-14 09:42:43 +00003074{
3075 int opcode;
3076 int oparg;
Guido van Rossumb209a111997-04-29 18:18:01 +00003077 PyObject *list, *name;
Guido van Rossum24c13741995-02-14 09:42:43 +00003078 unsigned char *next_instr;
3079
Guido van Rossumd076c731998-10-07 19:42:25 +00003080 _PyCode_GETCODEPTR(f->f_code, &next_instr);
3081 next_instr += nexti;
3082
Guido van Rossum24c13741995-02-14 09:42:43 +00003083 opcode = (*next_instr++);
Thomas Wouters52152252000-08-17 22:55:00 +00003084 if (opcode != IMPORT_FROM && opcode != IMPORT_STAR) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003085 Py_INCREF(Py_None);
3086 return Py_None;
Guido van Rossum24c13741995-02-14 09:42:43 +00003087 }
3088
Guido van Rossumb209a111997-04-29 18:18:01 +00003089 list = PyList_New(0);
Guido van Rossum24c13741995-02-14 09:42:43 +00003090 if (list == NULL)
3091 return NULL;
Thomas Wouters52152252000-08-17 22:55:00 +00003092
3093 if (opcode == IMPORT_STAR) {
3094 name = PyString_FromString("*");
3095 if (!name)
Guido van Rossumb209a111997-04-29 18:18:01 +00003096 Py_DECREF(list);
Thomas Wouters52152252000-08-17 22:55:00 +00003097 else {
Fred Drake04e654a2000-08-18 19:53:25 +00003098 if (PyList_Append(list, name) < 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00003099 Py_DECREF(list);
Fred Drake04e654a2000-08-18 19:53:25 +00003100 }
Thomas Wouters52152252000-08-17 22:55:00 +00003101 Py_DECREF(name);
Guido van Rossum24c13741995-02-14 09:42:43 +00003102 }
Thomas Wouters52152252000-08-17 22:55:00 +00003103 } else {
3104 do {
3105 oparg = (next_instr[1]<<8) + next_instr[0];
Thomas Wouters04005152000-08-20 14:01:53 +00003106 /* Jump over our own argument, the next instruction
3107 (which is a STORE), and its argument.*/
3108 next_instr += 5;
Thomas Wouters52152252000-08-17 22:55:00 +00003109 name = Getnamev(f, oparg);
3110 if (PyList_Append(list, name) < 0) {
3111 Py_DECREF(list);
3112 break;
3113 }
3114 opcode = (*next_instr++);
3115 } while (opcode == IMPORT_FROM);
3116 }
Guido van Rossum24c13741995-02-14 09:42:43 +00003117 return list;
3118}
Guido van Rossum950361c1997-01-24 13:49:28 +00003119
3120
3121#ifdef DYNAMIC_EXECUTION_PROFILE
3122
3123PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003124getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00003125{
3126 int i;
3127 PyObject *l = PyList_New(256);
3128 if (l == NULL) return NULL;
3129 for (i = 0; i < 256; i++) {
3130 PyObject *x = PyInt_FromLong(a[i]);
3131 if (x == NULL) {
3132 Py_DECREF(l);
3133 return NULL;
3134 }
3135 PyList_SetItem(l, i, x);
3136 }
3137 for (i = 0; i < 256; i++)
3138 a[i] = 0;
3139 return l;
3140}
3141
3142PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003143_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00003144{
3145#ifndef DXPAIRS
3146 return getarray(dxp);
3147#else
3148 int i;
3149 PyObject *l = PyList_New(257);
3150 if (l == NULL) return NULL;
3151 for (i = 0; i < 257; i++) {
3152 PyObject *x = getarray(dxpairs[i]);
3153 if (x == NULL) {
3154 Py_DECREF(l);
3155 return NULL;
3156 }
3157 PyList_SetItem(l, i, x);
3158 }
3159 return l;
3160#endif
3161}
3162
3163#endif