blob: c01e16dba437ca4f8ff2e43791e19bde37586ea1 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum3f5da241990-12-20 15:06:42 +00002/* Execute compiled code */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003
Guido van Rossum681d79a1995-07-18 14:51:37 +00004/* XXX TO DO:
5 XXX how to pass arguments to call_trace?
Guido van Rossum681d79a1995-07-18 14:51:37 +00006 XXX speed up searching for keywords by using a dictionary
Guido van Rossum681d79a1995-07-18 14:51:37 +00007 XXX document it!
8 */
9
Guido van Rossumb209a111997-04-29 18:18:01 +000010#include "Python.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000011
Guido van Rossum10dc2e81990-11-18 17:27:39 +000012#include "compile.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000013#include "frameobject.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000014#include "eval.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000015#include "opcode.h"
16
Jack Jansencbf630f2000-07-11 21:59:16 +000017#ifdef macintosh
18#include "macglue.h"
19#endif
20
Guido van Rossumc6004111993-11-05 10:22:19 +000021#include <ctype.h>
22
Guido van Rossum04691fc1992-08-12 15:35:34 +000023/* Turn this on if your compiler chokes on the big switch: */
Guido van Rossum1ae940a1995-01-02 19:04:15 +000024/* #define CASE_TOO_BIG 1 */
Guido van Rossum04691fc1992-08-12 15:35:34 +000025
Guido van Rossum408027e1996-12-30 16:17:54 +000026#ifdef Py_DEBUG
Guido van Rossum96a42c81992-01-12 02:29:51 +000027/* For debugging the interpreter: */
28#define LLTRACE 1 /* Low-level trace feature */
29#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000030#endif
31
Jeremy Hylton52820442001-01-03 23:52:36 +000032typedef PyObject *(*callproc)(PyObject *, PyObject *, PyObject *);
Guido van Rossum5b722181993-03-30 17:46:03 +000033
Guido van Rossum374a9221991-04-04 10:40:29 +000034/* Forward declarations */
Guido van Rossum374a9221991-04-04 10:40:29 +000035
Tim Petersdbd9ba62000-07-09 03:09:57 +000036static PyObject *eval_code2(PyCodeObject *,
37 PyObject *, PyObject *,
38 PyObject **, int,
39 PyObject **, int,
Jeremy Hylton52820442001-01-03 23:52:36 +000040 PyObject **, int);
41
42static PyObject *call_object(PyObject *, PyObject *, PyObject *);
43static PyObject *call_cfunction(PyObject *, PyObject *, PyObject *);
44static PyObject *call_instance(PyObject *, PyObject *, PyObject *);
45static PyObject *call_method(PyObject *, PyObject *, PyObject *);
46static PyObject *call_eval_code2(PyObject *, PyObject *, PyObject *);
47static PyObject *fast_function(PyObject *, PyObject ***, int, int, int);
48static PyObject *fast_cfunction(PyObject *, PyObject ***, int);
49static PyObject *do_call(PyObject *, PyObject ***, int, int);
50static PyObject *ext_do_call(PyObject *, PyObject ***, int, int, int);
Guido van Rossumac7be682001-01-17 15:42:30 +000051static PyObject *update_keyword_args(PyObject *, int, PyObject ***,PyObject *);
Ka-Ping Yee20579702001-01-15 22:14:16 +000052static PyObject *update_star_args(int, int, PyObject *, PyObject ***);
Jeremy Hylton52820442001-01-03 23:52:36 +000053static PyObject *load_args(PyObject ***, int);
54#define CALL_FLAG_VAR 1
55#define CALL_FLAG_KW 2
56
Guido van Rossum0a066c01992-03-27 17:29:15 +000057#ifdef LLTRACE
Tim Petersdbd9ba62000-07-09 03:09:57 +000058static int prtrace(PyObject *, char *);
Guido van Rossum0a066c01992-03-27 17:29:15 +000059#endif
Tim Petersdbd9ba62000-07-09 03:09:57 +000060static void call_exc_trace(PyObject **, PyObject**, PyFrameObject *);
61static int call_trace(PyObject **, PyObject **,
62 PyFrameObject *, char *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000063static PyObject *loop_subscript(PyObject *, PyObject *);
64static PyObject *apply_slice(PyObject *, PyObject *, PyObject *);
65static int assign_slice(PyObject *, PyObject *,
66 PyObject *, PyObject *);
67static PyObject *cmp_outcome(int, PyObject *, PyObject *);
Thomas Wouters52152252000-08-17 22:55:00 +000068static PyObject *import_from(PyObject *, PyObject *);
69static int import_all_from(PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000070static PyObject *build_class(PyObject *, PyObject *, PyObject *);
71static int exec_statement(PyFrameObject *,
72 PyObject *, PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000073static void set_exc_info(PyThreadState *, PyObject *, PyObject *, PyObject *);
74static void reset_exc_info(PyThreadState *);
Paul Prescode68140d2000-08-30 20:25:01 +000075static void format_exc_check_arg(PyObject *, char *, PyObject *);
Guido van Rossum374a9221991-04-04 10:40:29 +000076
Paul Prescode68140d2000-08-30 20:25:01 +000077#define NAME_ERROR_MSG \
Fred Drake661ea262000-10-24 19:57:45 +000078 "name '%.200s' is not defined"
Paul Prescode68140d2000-08-30 20:25:01 +000079#define UNBOUNDLOCAL_ERROR_MSG \
Fred Drake661ea262000-10-24 19:57:45 +000080 "local variable '%.200s' referenced before assignment"
Guido van Rossum374a9221991-04-04 10:40:29 +000081
Guido van Rossum950361c1997-01-24 13:49:28 +000082/* Dynamic execution profile */
83#ifdef DYNAMIC_EXECUTION_PROFILE
84#ifdef DXPAIRS
85static long dxpairs[257][256];
86#define dxp dxpairs[256]
87#else
88static long dxp[256];
89#endif
90#endif
91
Guido van Rossume59214e1994-08-30 08:01:59 +000092#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +000093
Guido van Rossum2571cc81999-04-07 16:07:23 +000094#ifndef DONT_HAVE_ERRNO_H
Guido van Rossum1984f1e1992-08-04 12:41:02 +000095#include <errno.h>
Guido van Rossum2571cc81999-04-07 16:07:23 +000096#endif
Guido van Rossum49b56061998-10-01 20:42:43 +000097#include "pythread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000098
Guido van Rossuma027efa1997-05-05 20:56:21 +000099extern int _PyThread_Started; /* Flag for Py_Exit */
100
Guido van Rossum65d5b571998-12-21 19:32:43 +0000101static PyThread_type_lock interpreter_lock = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000102static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000103
104void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000105PyEval_InitThreads(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000106{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000107 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000108 return;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000109 _PyThread_Started = 1;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000110 interpreter_lock = PyThread_allocate_lock();
111 PyThread_acquire_lock(interpreter_lock, 1);
112 main_thread = PyThread_get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000113}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000114
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000115void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000116PyEval_AcquireLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000117{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000118 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000119}
120
121void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000122PyEval_ReleaseLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000123{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000124 PyThread_release_lock(interpreter_lock);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000125}
126
127void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000128PyEval_AcquireThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000129{
130 if (tstate == NULL)
131 Py_FatalError("PyEval_AcquireThread: NULL new thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000132 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000133 if (PyThreadState_Swap(tstate) != NULL)
134 Py_FatalError(
135 "PyEval_AcquireThread: non-NULL old thread state");
136}
137
138void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000139PyEval_ReleaseThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000140{
141 if (tstate == NULL)
142 Py_FatalError("PyEval_ReleaseThread: NULL thread state");
143 if (PyThreadState_Swap(NULL) != tstate)
144 Py_FatalError("PyEval_ReleaseThread: wrong thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000145 PyThread_release_lock(interpreter_lock);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000146}
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000147
148/* This function is called from PyOS_AfterFork to ensure that newly
149 created child processes don't hold locks referring to threads which
150 are not running in the child process. (This could also be done using
151 pthread_atfork mechanism, at least for the pthreads implementation.) */
152
153void
154PyEval_ReInitThreads(void)
155{
156 if (!interpreter_lock)
157 return;
158 /*XXX Can't use PyThread_free_lock here because it does too
159 much error-checking. Doing this cleanly would require
160 adding a new function to each thread_*.h. Instead, just
161 create a new lock and waste a little bit of memory */
162 interpreter_lock = PyThread_allocate_lock();
163 PyThread_acquire_lock(interpreter_lock, 1);
164 main_thread = PyThread_get_thread_ident();
165}
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000166#endif
167
Guido van Rossumff4949e1992-08-05 19:58:53 +0000168/* Functions save_thread and restore_thread are always defined so
169 dynamically loaded modules needn't be compiled separately for use
170 with and without threads: */
171
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000172PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000173PyEval_SaveThread(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000174{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000175 PyThreadState *tstate = PyThreadState_Swap(NULL);
176 if (tstate == NULL)
177 Py_FatalError("PyEval_SaveThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000178#ifdef WITH_THREAD
Guido van Rossumb74eca91997-09-30 22:03:16 +0000179 if (interpreter_lock)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000180 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000181#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000182 return tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000183}
184
185void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000186PyEval_RestoreThread(PyThreadState *tstate)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000187{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000188 if (tstate == NULL)
189 Py_FatalError("PyEval_RestoreThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000190#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000191 if (interpreter_lock) {
Guido van Rossumb74eca91997-09-30 22:03:16 +0000192 int err = errno;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000193 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000194 errno = err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000195 }
196#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000197 PyThreadState_Swap(tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000198}
199
200
Guido van Rossuma9672091994-09-14 13:31:22 +0000201/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
202 signal handlers or Mac I/O completion routines) can schedule calls
203 to a function to be called synchronously.
204 The synchronous function is called with one void* argument.
205 It should return 0 for success or -1 for failure -- failure should
206 be accompanied by an exception.
207
208 If registry succeeds, the registry function returns 0; if it fails
209 (e.g. due to too many pending calls) it returns -1 (without setting
210 an exception condition).
211
212 Note that because registry may occur from within signal handlers,
213 or other asynchronous events, calling malloc() is unsafe!
214
215#ifdef WITH_THREAD
216 Any thread can schedule pending calls, but only the main thread
217 will execute them.
218#endif
219
220 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
221 There are two possible race conditions:
222 (1) nested asynchronous registry calls;
223 (2) registry calls made while pending calls are being processed.
224 While (1) is very unlikely, (2) is a real possibility.
225 The current code is safe against (2), but not against (1).
226 The safety against (2) is derived from the fact that only one
227 thread (the main thread) ever takes things out of the queue.
Guido van Rossuma9672091994-09-14 13:31:22 +0000228
Guido van Rossuma027efa1997-05-05 20:56:21 +0000229 XXX Darn! With the advent of thread state, we should have an array
230 of pending calls per thread in the thread state! Later...
231*/
Guido van Rossum8861b741996-07-30 16:49:37 +0000232
Guido van Rossuma9672091994-09-14 13:31:22 +0000233#define NPENDINGCALLS 32
234static struct {
Thomas Wouters334fb892000-07-25 12:56:38 +0000235 int (*func)(void *);
236 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000237} pendingcalls[NPENDINGCALLS];
238static volatile int pendingfirst = 0;
239static volatile int pendinglast = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000240static volatile int things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000241
242int
Thomas Wouters334fb892000-07-25 12:56:38 +0000243Py_AddPendingCall(int (*func)(void *), void *arg)
Guido van Rossuma9672091994-09-14 13:31:22 +0000244{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000245 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000246 int i, j;
247 /* XXX Begin critical section */
248 /* XXX If you want this to be safe against nested
249 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000250 if (busy)
251 return -1;
252 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000253 i = pendinglast;
254 j = (i + 1) % NPENDINGCALLS;
255 if (j == pendingfirst)
256 return -1; /* Queue full */
257 pendingcalls[i].func = func;
258 pendingcalls[i].arg = arg;
259 pendinglast = j;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000260 things_to_do = 1; /* Signal main loop */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000261 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000262 /* XXX End critical section */
263 return 0;
264}
265
Guido van Rossum180d7b41994-09-29 09:45:57 +0000266int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000267Py_MakePendingCalls(void)
Guido van Rossuma9672091994-09-14 13:31:22 +0000268{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000269 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000270#ifdef WITH_THREAD
Guido van Rossum65d5b571998-12-21 19:32:43 +0000271 if (main_thread && PyThread_get_thread_ident() != main_thread)
Guido van Rossuma9672091994-09-14 13:31:22 +0000272 return 0;
273#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000274 if (busy)
Guido van Rossum180d7b41994-09-29 09:45:57 +0000275 return 0;
276 busy = 1;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000277 things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000278 for (;;) {
279 int i;
Thomas Wouters334fb892000-07-25 12:56:38 +0000280 int (*func)(void *);
281 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000282 i = pendingfirst;
283 if (i == pendinglast)
284 break; /* Queue empty */
285 func = pendingcalls[i].func;
286 arg = pendingcalls[i].arg;
287 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000288 if (func(arg) < 0) {
289 busy = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000290 things_to_do = 1; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000291 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000292 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000293 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000294 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000295 return 0;
296}
297
298
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000299/* The interpreter's recursion limit */
300
Guido van Rossum349ff6f2000-09-01 01:52:08 +0000301static int recursion_limit = 1000;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000302
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000303int
304Py_GetRecursionLimit(void)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000305{
306 return recursion_limit;
307}
308
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000309void
310Py_SetRecursionLimit(int new_limit)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000311{
312 recursion_limit = new_limit;
313}
314
Guido van Rossum374a9221991-04-04 10:40:29 +0000315/* Status code for main loop (reason for stack unwind) */
316
317enum why_code {
318 WHY_NOT, /* No error */
319 WHY_EXCEPTION, /* Exception occurred */
320 WHY_RERAISE, /* Exception re-raised by 'finally' */
321 WHY_RETURN, /* 'return' statement */
322 WHY_BREAK /* 'break' statement */
323};
324
Tim Petersdbd9ba62000-07-09 03:09:57 +0000325static enum why_code do_raise(PyObject *, PyObject *, PyObject *);
326static int unpack_sequence(PyObject *, int, PyObject **);
Guido van Rossum1aa14831997-01-21 05:34:20 +0000327
Guido van Rossum374a9221991-04-04 10:40:29 +0000328
Guido van Rossumb209a111997-04-29 18:18:01 +0000329PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000330PyEval_EvalCode(PyCodeObject *co, PyObject *globals, PyObject *locals)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000331{
332 return eval_code2(co,
333 globals, locals,
Guido van Rossumb209a111997-04-29 18:18:01 +0000334 (PyObject **)NULL, 0,
335 (PyObject **)NULL, 0,
Jeremy Hylton52820442001-01-03 23:52:36 +0000336 (PyObject **)NULL, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000337}
338
339
340/* Interpreter main loop */
341
Guido van Rossumb209a111997-04-29 18:18:01 +0000342static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000343eval_code2(PyCodeObject *co, PyObject *globals, PyObject *locals,
344 PyObject **args, int argcount, PyObject **kws, int kwcount,
Jeremy Hylton52820442001-01-03 23:52:36 +0000345 PyObject **defs, int defcount)
Guido van Rossum374a9221991-04-04 10:40:29 +0000346{
Guido van Rossum950361c1997-01-24 13:49:28 +0000347#ifdef DXPAIRS
348 int lastopcode = 0;
349#endif
Jeremy Hylton52820442001-01-03 23:52:36 +0000350 PyObject **stack_pointer;
Guido van Rossum374a9221991-04-04 10:40:29 +0000351 register unsigned char *next_instr;
Moshe Zadkaaa39a7e2000-08-07 06:34:45 +0000352 register int opcode=0; /* Current opcode */
353 register int oparg=0; /* Current opcode argument, if any */
Guido van Rossum374a9221991-04-04 10:40:29 +0000354 register enum why_code why; /* Reason for block stack unwind */
355 register int err; /* Error status -- nonzero if error */
Guido van Rossumb209a111997-04-29 18:18:01 +0000356 register PyObject *x; /* Result object -- NULL if error */
357 register PyObject *v; /* Temporary objects popped off stack */
358 register PyObject *w;
359 register PyObject *u;
360 register PyObject *t;
Barry Warsaw23c9ec82000-08-21 15:44:01 +0000361 register PyObject *stream = NULL; /* for PRINT opcodes */
Guido van Rossumb209a111997-04-29 18:18:01 +0000362 register PyFrameObject *f; /* Current frame */
Guido van Rossum50cd3481998-11-17 17:02:51 +0000363 register PyObject **fastlocals;
Guido van Rossum014518f1998-11-23 21:09:51 +0000364 PyObject *retval = NULL; /* Return value */
Guido van Rossum885553e1998-12-21 18:33:30 +0000365 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossumd076c731998-10-07 19:42:25 +0000366 unsigned char *first_instr;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000367#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000368 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000369#endif
Guido van Rossum408027e1996-12-30 16:17:54 +0000370#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000371 /* Make it easier to find out where we are with a debugger */
Guido van Rossumb209a111997-04-29 18:18:01 +0000372 char *filename = PyString_AsString(co->co_filename);
Guido van Rossum99bec951992-09-03 20:29:45 +0000373#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000374
375/* Code access macros */
376
377#define GETCONST(i) Getconst(f, i)
378#define GETNAME(i) Getname(f, i)
379#define GETNAMEV(i) Getnamev(f, i)
Guido van Rossumd076c731998-10-07 19:42:25 +0000380#define INSTR_OFFSET() (next_instr - first_instr)
Guido van Rossum374a9221991-04-04 10:40:29 +0000381#define NEXTOP() (*next_instr++)
382#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossumd076c731998-10-07 19:42:25 +0000383#define JUMPTO(x) (next_instr = first_instr + (x))
Guido van Rossum374a9221991-04-04 10:40:29 +0000384#define JUMPBY(x) (next_instr += (x))
385
386/* Stack manipulation macros */
387
388#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
389#define EMPTY() (STACK_LEVEL() == 0)
390#define TOP() (stack_pointer[-1])
391#define BASIC_PUSH(v) (*stack_pointer++ = (v))
392#define BASIC_POP() (*--stack_pointer)
393
Guido van Rossum96a42c81992-01-12 02:29:51 +0000394#ifdef LLTRACE
395#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
396#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000397#else
398#define PUSH(v) BASIC_PUSH(v)
399#define POP() BASIC_POP()
400#endif
401
Guido van Rossum681d79a1995-07-18 14:51:37 +0000402/* Local variable macros */
403
404#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumb209a111997-04-29 18:18:01 +0000405#define SETLOCAL(i, value) do { Py_XDECREF(GETLOCAL(i)); \
Guido van Rossum681d79a1995-07-18 14:51:37 +0000406 GETLOCAL(i) = value; } while (0)
407
Guido van Rossuma027efa1997-05-05 20:56:21 +0000408/* Start of code */
409
Guido van Rossum8861b741996-07-30 16:49:37 +0000410#ifdef USE_STACKCHECK
Guido van Rossuma027efa1997-05-05 20:56:21 +0000411 if (tstate->recursion_depth%10 == 0 && PyOS_CheckStack()) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000412 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
Guido van Rossum8861b741996-07-30 16:49:37 +0000413 return NULL;
414 }
415#endif
416
Guido van Rossum681d79a1995-07-18 14:51:37 +0000417 if (globals == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000418 PyErr_SetString(PyExc_SystemError, "eval_code2: NULL globals");
Guido van Rossum6135a871995-01-09 17:53:26 +0000419 return NULL;
Guido van Rossum5b722181993-03-30 17:46:03 +0000420 }
421
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000422#ifdef LLTRACE
Guido van Rossumb209a111997-04-29 18:18:01 +0000423 lltrace = PyDict_GetItemString(globals, "__lltrace__") != NULL;
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000424#endif
425
Guido van Rossumb209a111997-04-29 18:18:01 +0000426 f = PyFrame_New(
Guido van Rossuma027efa1997-05-05 20:56:21 +0000427 tstate, /*back*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000428 co, /*code*/
429 globals, /*globals*/
Guido van Rossum76836021997-01-20 04:26:20 +0000430 locals); /*locals*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000431 if (f == NULL)
432 return NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000433
Guido van Rossuma027efa1997-05-05 20:56:21 +0000434 tstate->frame = f;
Guido van Rossumdeb0c5e1997-01-27 23:42:36 +0000435 fastlocals = f->f_localsplus;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000436
437 if (co->co_argcount > 0 ||
438 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
439 int i;
440 int n = argcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000441 PyObject *kwdict = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000442 if (co->co_flags & CO_VARKEYWORDS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000443 kwdict = PyDict_New();
Guido van Rossum681d79a1995-07-18 14:51:37 +0000444 if (kwdict == NULL)
445 goto fail;
Guido van Rossum8c5df061997-01-24 04:19:24 +0000446 i = co->co_argcount;
447 if (co->co_flags & CO_VARARGS)
448 i++;
449 SETLOCAL(i, kwdict);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000450 }
451 if (argcount > co->co_argcount) {
452 if (!(co->co_flags & CO_VARARGS)) {
Guido van Rossumdf9db1e1997-11-19 16:05:40 +0000453 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +0000454 "%.200s() takes %s %d "
455 "%sargument%s (%d given)",
Fred Drake661ea262000-10-24 19:57:45 +0000456 PyString_AsString(co->co_name),
Ka-Ping Yee20579702001-01-15 22:14:16 +0000457 defcount ? "at most" : "exactly",
458 co->co_argcount,
459 kwcount ? "non-keyword " : "",
460 co->co_argcount == 1 ? "" : "s",
461 argcount);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000462 goto fail;
463 }
464 n = co->co_argcount;
465 }
466 for (i = 0; i < n; i++) {
467 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000468 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000469 SETLOCAL(i, x);
470 }
471 if (co->co_flags & CO_VARARGS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000472 u = PyTuple_New(argcount - n);
Guido van Rossum8c5df061997-01-24 04:19:24 +0000473 if (u == NULL)
474 goto fail;
475 SETLOCAL(co->co_argcount, u);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000476 for (i = n; i < argcount; i++) {
477 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000478 Py_INCREF(x);
479 PyTuple_SET_ITEM(u, i-n, x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000480 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000481 }
482 for (i = 0; i < kwcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000483 PyObject *keyword = kws[2*i];
484 PyObject *value = kws[2*i + 1];
Guido van Rossum681d79a1995-07-18 14:51:37 +0000485 int j;
Guido van Rossum25da5be1999-10-26 00:12:20 +0000486 if (keyword == NULL || !PyString_Check(keyword)) {
Ka-Ping Yee20579702001-01-15 22:14:16 +0000487 PyErr_Format(PyExc_TypeError,
488 "%.200s() keywords must be strings",
489 PyString_AsString(co->co_name));
Guido van Rossum25da5be1999-10-26 00:12:20 +0000490 goto fail;
491 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000492 /* XXX slow -- speed up using dictionary? */
493 for (j = 0; j < co->co_argcount; j++) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000494 PyObject *nm = PyTuple_GET_ITEM(
495 co->co_varnames, j);
Guido van Rossumac7be682001-01-17 15:42:30 +0000496 int cmp = PyObject_RichCompareBool(
497 keyword, nm, Py_EQ);
498 if (cmp > 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000499 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000500 else if (cmp < 0)
501 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000502 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000503 /* Check errors from Compare */
504 if (PyErr_Occurred())
505 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000506 if (j >= co->co_argcount) {
507 if (kwdict == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000508 PyErr_Format(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +0000509 "%.200s() got an unexpected "
510 "keyword argument '%.400s'",
511 PyString_AsString(co->co_name),
Jeremy Hylton76901512000-03-28 23:49:17 +0000512 PyString_AsString(keyword));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000513 goto fail;
514 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000515 PyDict_SetItem(kwdict, keyword, value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000516 }
517 else {
518 if (GETLOCAL(j) != NULL) {
Guido van Rossumac7be682001-01-17 15:42:30 +0000519 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +0000520 "%.200s() got multiple "
521 "values for keyword "
522 "argument '%.400s'",
523 PyString_AsString(co->co_name),
524 PyString_AsString(keyword));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000525 goto fail;
526 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000527 Py_INCREF(value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000528 SETLOCAL(j, value);
529 }
530 }
531 if (argcount < co->co_argcount) {
532 int m = co->co_argcount - defcount;
533 for (i = argcount; i < m; i++) {
534 if (GETLOCAL(i) == NULL) {
Guido van Rossumdf9db1e1997-11-19 16:05:40 +0000535 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +0000536 "%.200s() takes %s %d "
537 "%sargument%s (%d given)",
Fred Drake661ea262000-10-24 19:57:45 +0000538 PyString_AsString(co->co_name),
Ka-Ping Yee20579702001-01-15 22:14:16 +0000539 ((co->co_flags & CO_VARARGS) ||
540 defcount) ? "at least"
541 : "exactly",
542 m, kwcount ? "non-keyword " : "",
543 m == 1 ? "" : "s", i);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000544 goto fail;
545 }
546 }
547 if (n > m)
548 i = n - m;
549 else
550 i = 0;
551 for (; i < defcount; i++) {
552 if (GETLOCAL(m+i) == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000553 PyObject *def = defs[i];
554 Py_INCREF(def);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000555 SETLOCAL(m+i, def);
556 }
557 }
558 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000559 }
560 else {
561 if (argcount > 0 || kwcount > 0) {
Fred Drake661ea262000-10-24 19:57:45 +0000562 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +0000563 "%.200s() takes no arguments (%d given)",
564 PyString_AsString(co->co_name),
565 argcount + kwcount);
Guido van Rossum8c5df061997-01-24 04:19:24 +0000566 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000567 }
568 }
569
Guido van Rossuma027efa1997-05-05 20:56:21 +0000570 if (tstate->sys_tracefunc != NULL) {
571 /* tstate->sys_tracefunc, if defined, is a function that
572 will be called on *every* entry to a code block.
Guido van Rossum96a42c81992-01-12 02:29:51 +0000573 Its return value, if not None, is a function that
574 will be called at the start of each executed line
575 of code. (Actually, the function must return
576 itself in order to continue tracing.)
577 The trace functions are called with three arguments:
578 a pointer to the current frame, a string indicating
579 why the function is called, and an argument which
580 depends on the situation. The global trace function
581 (sys.trace) is also called whenever an exception
582 is detected. */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000583 if (call_trace(&tstate->sys_tracefunc,
584 &f->f_trace, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000585 Py_None/*XXX how to compute arguments now?*/)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000586 /* Trace function raised an error */
Guido van Rossum8c5df061997-01-24 04:19:24 +0000587 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000588 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000589 }
590
Guido van Rossuma027efa1997-05-05 20:56:21 +0000591 if (tstate->sys_profilefunc != NULL) {
592 /* Similar for sys_profilefunc, except it needn't return
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000593 itself and isn't called for "line" events */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000594 if (call_trace(&tstate->sys_profilefunc,
595 (PyObject**)0, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000596 Py_None/*XXX*/)) {
Guido van Rossum8c5df061997-01-24 04:19:24 +0000597 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000598 }
599 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000600
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000601 if (++tstate->recursion_depth > recursion_limit) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000602 --tstate->recursion_depth;
603 PyErr_SetString(PyExc_RuntimeError,
Fred Drake661ea262000-10-24 19:57:45 +0000604 "maximum recursion depth exceeded");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000605 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +0000606 Py_DECREF(f);
Guido van Rossum8861b741996-07-30 16:49:37 +0000607 return NULL;
608 }
609
Guido van Rossumd076c731998-10-07 19:42:25 +0000610 _PyCode_GETCODEPTR(co, &first_instr);
611 next_instr = first_instr;
Guido van Rossum374a9221991-04-04 10:40:29 +0000612 stack_pointer = f->f_valuestack;
Guido van Rossumac7be682001-01-17 15:42:30 +0000613
Guido van Rossum374a9221991-04-04 10:40:29 +0000614 why = WHY_NOT;
615 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000616 x = Py_None; /* Not a reference, just anything non-NULL */
Fred Drake48fba732000-10-11 13:54:07 +0000617 w = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +0000618
Guido van Rossum374a9221991-04-04 10:40:29 +0000619 for (;;) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000620 /* Do periodic things. Doing this every time through
621 the loop would add too much overhead, so we do it
622 only every Nth instruction. We also do it if
623 ``things_to_do'' is set, i.e. when an asynchronous
624 event needs attention (e.g. a signal handler or
625 async I/O handler); see Py_AddPendingCall() and
626 Py_MakePendingCalls() above. */
Guido van Rossumac7be682001-01-17 15:42:30 +0000627
Guido van Rossuma027efa1997-05-05 20:56:21 +0000628 if (things_to_do || --tstate->ticker < 0) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000629 tstate->ticker = tstate->interp->checkinterval;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000630 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000631 if (Py_MakePendingCalls() < 0) {
632 why = WHY_EXCEPTION;
633 goto on_error;
634 }
635 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000636#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000637 /* If we have true signals, the signal handler
638 will call Py_AddPendingCall() so we don't
639 have to call sigcheck(). On the Mac and
640 DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000641 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000642 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000643 goto on_error;
644 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000645#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000646
Guido van Rossume59214e1994-08-30 08:01:59 +0000647#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000648 if (interpreter_lock) {
649 /* Give another thread a chance */
650
Guido van Rossum25ce5661997-08-02 03:10:38 +0000651 if (PyThreadState_Swap(NULL) != tstate)
652 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000653 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000654
655 /* Other threads may run now */
656
Guido van Rossum65d5b571998-12-21 19:32:43 +0000657 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000658 if (PyThreadState_Swap(tstate) != NULL)
659 Py_FatalError("ceval: orphan tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000660 }
661#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000662 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000663
Guido van Rossum374a9221991-04-04 10:40:29 +0000664 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000665
Guido van Rossum408027e1996-12-30 16:17:54 +0000666#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000667 f->f_lasti = INSTR_OFFSET();
668#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000669
Guido van Rossum374a9221991-04-04 10:40:29 +0000670 opcode = NEXTOP();
671 if (HAS_ARG(opcode))
672 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +0000673 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +0000674#ifdef DYNAMIC_EXECUTION_PROFILE
675#ifdef DXPAIRS
676 dxpairs[lastopcode][opcode]++;
677 lastopcode = opcode;
678#endif
679 dxp[opcode]++;
680#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000681
Guido van Rossum96a42c81992-01-12 02:29:51 +0000682#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000683 /* Instruction tracing */
Guido van Rossumac7be682001-01-17 15:42:30 +0000684
Guido van Rossum96a42c81992-01-12 02:29:51 +0000685 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000686 if (HAS_ARG(opcode)) {
687 printf("%d: %d, %d\n",
688 (int) (INSTR_OFFSET() - 3),
689 opcode, oparg);
690 }
691 else {
692 printf("%d: %d\n",
693 (int) (INSTR_OFFSET() - 1), opcode);
694 }
695 }
696#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000697 /* Main switch on opcode */
Jeremy Hylton52820442001-01-03 23:52:36 +0000698
Guido van Rossum374a9221991-04-04 10:40:29 +0000699 switch (opcode) {
Guido van Rossumac7be682001-01-17 15:42:30 +0000700
Guido van Rossum374a9221991-04-04 10:40:29 +0000701 /* BEWARE!
702 It is essential that any operation that fails sets either
703 x to NULL, err to nonzero, or why to anything but WHY_NOT,
704 and that no operation that succeeds does this! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000705
Guido van Rossum374a9221991-04-04 10:40:29 +0000706 /* case STOP_CODE: this is an error! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000707
Guido van Rossum374a9221991-04-04 10:40:29 +0000708 case POP_TOP:
709 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000710 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000711 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000712
Guido van Rossum374a9221991-04-04 10:40:29 +0000713 case ROT_TWO:
714 v = POP();
715 w = POP();
716 PUSH(v);
717 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000718 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000719
Guido van Rossum374a9221991-04-04 10:40:29 +0000720 case ROT_THREE:
721 v = POP();
722 w = POP();
723 x = POP();
724 PUSH(v);
725 PUSH(x);
726 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000727 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000728
Thomas Wouters434d0822000-08-24 20:11:32 +0000729 case ROT_FOUR:
730 u = POP();
731 v = POP();
732 w = POP();
733 x = POP();
734 PUSH(u);
735 PUSH(x);
736 PUSH(w);
737 PUSH(v);
738 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000739
Guido van Rossum374a9221991-04-04 10:40:29 +0000740 case DUP_TOP:
741 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000742 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000743 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000744 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000745
Thomas Wouters434d0822000-08-24 20:11:32 +0000746 case DUP_TOPX:
747 switch (oparg) {
Thomas Wouters434d0822000-08-24 20:11:32 +0000748 case 1:
Tim Peters35ba6892000-10-11 07:04:49 +0000749 x = TOP();
750 Py_INCREF(x);
751 PUSH(x);
752 continue;
753 case 2:
Thomas Wouters434d0822000-08-24 20:11:32 +0000754 x = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000755 Py_INCREF(x);
756 w = TOP();
757 Py_INCREF(w);
758 PUSH(x);
759 PUSH(w);
760 PUSH(x);
761 continue;
762 case 3:
763 x = POP();
764 Py_INCREF(x);
Thomas Wouters434d0822000-08-24 20:11:32 +0000765 w = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000766 Py_INCREF(w);
767 v = TOP();
768 Py_INCREF(v);
769 PUSH(w);
770 PUSH(x);
771 PUSH(v);
772 PUSH(w);
773 PUSH(x);
774 continue;
775 case 4:
776 x = POP();
777 Py_INCREF(x);
778 w = POP();
779 Py_INCREF(w);
Thomas Wouters434d0822000-08-24 20:11:32 +0000780 v = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000781 Py_INCREF(v);
782 u = TOP();
783 Py_INCREF(u);
784 PUSH(v);
785 PUSH(w);
786 PUSH(x);
787 PUSH(u);
788 PUSH(v);
789 PUSH(w);
790 PUSH(x);
791 continue;
792 case 5:
793 x = POP();
794 Py_INCREF(x);
795 w = POP();
796 Py_INCREF(w);
797 v = POP();
798 Py_INCREF(v);
Thomas Wouters434d0822000-08-24 20:11:32 +0000799 u = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000800 Py_INCREF(u);
801 t = TOP();
802 Py_INCREF(t);
803 PUSH(u);
804 PUSH(v);
805 PUSH(w);
806 PUSH(x);
807 PUSH(t);
808 PUSH(u);
809 PUSH(v);
810 PUSH(w);
811 PUSH(x);
812 continue;
Thomas Wouters434d0822000-08-24 20:11:32 +0000813 default:
Thomas Wouters0be483f2000-10-11 23:26:11 +0000814 Py_FatalError("invalid argument to DUP_TOPX"
815 " (bytecode corruption?)");
Thomas Wouters434d0822000-08-24 20:11:32 +0000816 }
Tim Peters35ba6892000-10-11 07:04:49 +0000817 break;
Thomas Wouters434d0822000-08-24 20:11:32 +0000818
Guido van Rossum374a9221991-04-04 10:40:29 +0000819 case UNARY_POSITIVE:
820 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000821 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000822 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000823 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000824 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000825 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000826
Guido van Rossum374a9221991-04-04 10:40:29 +0000827 case UNARY_NEGATIVE:
828 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000829 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000830 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000831 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000832 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000833 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000834
Guido van Rossum374a9221991-04-04 10:40:29 +0000835 case UNARY_NOT:
836 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000837 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000838 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000839 if (err == 0) {
840 Py_INCREF(Py_True);
841 PUSH(Py_True);
842 continue;
843 }
844 else if (err > 0) {
845 Py_INCREF(Py_False);
846 PUSH(Py_False);
847 err = 0;
848 continue;
849 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000850 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000851
Guido van Rossum374a9221991-04-04 10:40:29 +0000852 case UNARY_CONVERT:
853 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000854 x = PyObject_Repr(v);
855 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000856 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000857 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000858 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000859
Guido van Rossum7928cd71991-10-24 14:59:31 +0000860 case UNARY_INVERT:
861 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000862 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000863 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000864 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000865 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000866 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000867
Guido van Rossum50564e81996-01-12 01:13:16 +0000868 case BINARY_POWER:
869 w = POP();
870 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000871 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000872 Py_DECREF(v);
873 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000874 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000875 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000876 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000877
Guido van Rossum374a9221991-04-04 10:40:29 +0000878 case BINARY_MULTIPLY:
879 w = POP();
880 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000881 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000882 Py_DECREF(v);
883 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000884 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000885 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000886 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000887
Guido van Rossum374a9221991-04-04 10:40:29 +0000888 case BINARY_DIVIDE:
889 w = POP();
890 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000891 x = PyNumber_Divide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000892 Py_DECREF(v);
893 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000894 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000895 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000896 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000897
Guido van Rossum374a9221991-04-04 10:40:29 +0000898 case BINARY_MODULO:
899 w = POP();
900 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000901 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000902 Py_DECREF(v);
903 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000904 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000905 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000906 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000907
Guido van Rossum374a9221991-04-04 10:40:29 +0000908 case BINARY_ADD:
909 w = POP();
910 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000911 if (PyInt_Check(v) && PyInt_Check(w)) {
912 /* INLINE: int + int */
913 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000914 a = PyInt_AS_LONG(v);
915 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000916 i = a + b;
917 if ((i^a) < 0 && (i^b) < 0) {
918 PyErr_SetString(PyExc_OverflowError,
919 "integer addition");
920 x = NULL;
921 }
922 else
923 x = PyInt_FromLong(i);
924 }
925 else
926 x = PyNumber_Add(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000927 Py_DECREF(v);
928 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000929 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000930 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000931 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000932
Guido van Rossum374a9221991-04-04 10:40:29 +0000933 case BINARY_SUBTRACT:
934 w = POP();
935 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000936 if (PyInt_Check(v) && PyInt_Check(w)) {
937 /* INLINE: int - int */
938 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000939 a = PyInt_AS_LONG(v);
940 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000941 i = a - b;
942 if ((i^a) < 0 && (i^~b) < 0) {
943 PyErr_SetString(PyExc_OverflowError,
944 "integer subtraction");
945 x = NULL;
946 }
947 else
948 x = PyInt_FromLong(i);
949 }
950 else
951 x = PyNumber_Subtract(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000952 Py_DECREF(v);
953 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000954 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000955 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000956 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000957
Guido van Rossum374a9221991-04-04 10:40:29 +0000958 case BINARY_SUBSCR:
959 w = POP();
960 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000961 if (PyList_Check(v) && PyInt_Check(w)) {
962 /* INLINE: list[int] */
963 long i = PyInt_AsLong(w);
964 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +0000965 i += PyList_GET_SIZE(v);
Guido van Rossumc12da691997-07-17 23:12:42 +0000966 if (i < 0 ||
Guido van Rossumfa00e951998-07-08 15:02:37 +0000967 i >= PyList_GET_SIZE(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +0000968 PyErr_SetString(PyExc_IndexError,
969 "list index out of range");
970 x = NULL;
971 }
972 else {
Guido van Rossumfa00e951998-07-08 15:02:37 +0000973 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +0000974 Py_INCREF(x);
975 }
976 }
977 else
978 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000979 Py_DECREF(v);
980 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000981 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000982 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000983 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000984
Guido van Rossum7928cd71991-10-24 14:59:31 +0000985 case BINARY_LSHIFT:
986 w = POP();
987 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000988 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000989 Py_DECREF(v);
990 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000991 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000992 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000993 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000994
Guido van Rossum7928cd71991-10-24 14:59:31 +0000995 case BINARY_RSHIFT:
996 w = POP();
997 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000998 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000999 Py_DECREF(v);
1000 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001001 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001002 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001003 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001004
Guido van Rossum7928cd71991-10-24 14:59:31 +00001005 case BINARY_AND:
1006 w = POP();
1007 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001008 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001009 Py_DECREF(v);
1010 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001011 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001012 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001013 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001014
Guido van Rossum7928cd71991-10-24 14:59:31 +00001015 case BINARY_XOR:
1016 w = POP();
1017 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001018 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001019 Py_DECREF(v);
1020 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001021 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001022 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001023 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001024
Guido van Rossum7928cd71991-10-24 14:59:31 +00001025 case BINARY_OR:
1026 w = POP();
1027 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001028 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001029 Py_DECREF(v);
1030 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001031 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001032 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001033 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00001034
1035 case INPLACE_POWER:
1036 w = POP();
1037 v = POP();
1038 x = PyNumber_InPlacePower(v, w, Py_None);
1039 Py_DECREF(v);
1040 Py_DECREF(w);
1041 PUSH(x);
1042 if (x != NULL) continue;
1043 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001044
Thomas Wouters434d0822000-08-24 20:11:32 +00001045 case INPLACE_MULTIPLY:
1046 w = POP();
1047 v = POP();
1048 x = PyNumber_InPlaceMultiply(v, w);
1049 Py_DECREF(v);
1050 Py_DECREF(w);
1051 PUSH(x);
1052 if (x != NULL) continue;
1053 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001054
Thomas Wouters434d0822000-08-24 20:11:32 +00001055 case INPLACE_DIVIDE:
1056 w = POP();
1057 v = POP();
1058 x = PyNumber_InPlaceDivide(v, w);
1059 Py_DECREF(v);
1060 Py_DECREF(w);
1061 PUSH(x);
1062 if (x != NULL) continue;
1063 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001064
Thomas Wouters434d0822000-08-24 20:11:32 +00001065 case INPLACE_MODULO:
1066 w = POP();
1067 v = POP();
1068 x = PyNumber_InPlaceRemainder(v, w);
1069 Py_DECREF(v);
1070 Py_DECREF(w);
1071 PUSH(x);
1072 if (x != NULL) continue;
1073 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001074
Thomas Wouters434d0822000-08-24 20:11:32 +00001075 case INPLACE_ADD:
1076 w = POP();
1077 v = POP();
1078 if (PyInt_Check(v) && PyInt_Check(w)) {
1079 /* INLINE: int + int */
1080 register long a, b, i;
1081 a = PyInt_AS_LONG(v);
1082 b = PyInt_AS_LONG(w);
1083 i = a + b;
1084 if ((i^a) < 0 && (i^b) < 0) {
1085 PyErr_SetString(PyExc_OverflowError,
1086 "integer addition");
1087 x = NULL;
1088 }
1089 else
1090 x = PyInt_FromLong(i);
1091 }
1092 else
1093 x = PyNumber_InPlaceAdd(v, w);
1094 Py_DECREF(v);
1095 Py_DECREF(w);
1096 PUSH(x);
1097 if (x != NULL) continue;
1098 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001099
Thomas Wouters434d0822000-08-24 20:11:32 +00001100 case INPLACE_SUBTRACT:
1101 w = POP();
1102 v = POP();
1103 if (PyInt_Check(v) && PyInt_Check(w)) {
1104 /* INLINE: int - int */
1105 register long a, b, i;
1106 a = PyInt_AS_LONG(v);
1107 b = PyInt_AS_LONG(w);
1108 i = a - b;
1109 if ((i^a) < 0 && (i^~b) < 0) {
1110 PyErr_SetString(PyExc_OverflowError,
1111 "integer subtraction");
1112 x = NULL;
1113 }
1114 else
1115 x = PyInt_FromLong(i);
1116 }
1117 else
1118 x = PyNumber_InPlaceSubtract(v, w);
1119 Py_DECREF(v);
1120 Py_DECREF(w);
1121 PUSH(x);
1122 if (x != NULL) continue;
1123 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001124
Thomas Wouters434d0822000-08-24 20:11:32 +00001125 case INPLACE_LSHIFT:
1126 w = POP();
1127 v = POP();
1128 x = PyNumber_InPlaceLshift(v, w);
1129 Py_DECREF(v);
1130 Py_DECREF(w);
1131 PUSH(x);
1132 if (x != NULL) continue;
1133 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001134
Thomas Wouters434d0822000-08-24 20:11:32 +00001135 case INPLACE_RSHIFT:
1136 w = POP();
1137 v = POP();
1138 x = PyNumber_InPlaceRshift(v, w);
1139 Py_DECREF(v);
1140 Py_DECREF(w);
1141 PUSH(x);
1142 if (x != NULL) continue;
1143 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001144
Thomas Wouters434d0822000-08-24 20:11:32 +00001145 case INPLACE_AND:
1146 w = POP();
1147 v = POP();
1148 x = PyNumber_InPlaceAnd(v, w);
1149 Py_DECREF(v);
1150 Py_DECREF(w);
1151 PUSH(x);
1152 if (x != NULL) continue;
1153 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001154
Thomas Wouters434d0822000-08-24 20:11:32 +00001155 case INPLACE_XOR:
1156 w = POP();
1157 v = POP();
1158 x = PyNumber_InPlaceXor(v, w);
1159 Py_DECREF(v);
1160 Py_DECREF(w);
1161 PUSH(x);
1162 if (x != NULL) continue;
1163 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001164
Thomas Wouters434d0822000-08-24 20:11:32 +00001165 case INPLACE_OR:
1166 w = POP();
1167 v = POP();
1168 x = PyNumber_InPlaceOr(v, w);
1169 Py_DECREF(v);
1170 Py_DECREF(w);
1171 PUSH(x);
1172 if (x != NULL) continue;
1173 break;
1174
Guido van Rossum374a9221991-04-04 10:40:29 +00001175 case SLICE+0:
1176 case SLICE+1:
1177 case SLICE+2:
1178 case SLICE+3:
1179 if ((opcode-SLICE) & 2)
1180 w = POP();
1181 else
1182 w = NULL;
1183 if ((opcode-SLICE) & 1)
1184 v = POP();
1185 else
1186 v = NULL;
1187 u = POP();
1188 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001189 Py_DECREF(u);
1190 Py_XDECREF(v);
1191 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001192 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001193 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001194 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001195
Guido van Rossum374a9221991-04-04 10:40:29 +00001196 case STORE_SLICE+0:
1197 case STORE_SLICE+1:
1198 case STORE_SLICE+2:
1199 case STORE_SLICE+3:
1200 if ((opcode-STORE_SLICE) & 2)
1201 w = POP();
1202 else
1203 w = NULL;
1204 if ((opcode-STORE_SLICE) & 1)
1205 v = POP();
1206 else
1207 v = NULL;
1208 u = POP();
1209 t = POP();
1210 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +00001211 Py_DECREF(t);
1212 Py_DECREF(u);
1213 Py_XDECREF(v);
1214 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001215 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001216 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001217
Guido van Rossum374a9221991-04-04 10:40:29 +00001218 case DELETE_SLICE+0:
1219 case DELETE_SLICE+1:
1220 case DELETE_SLICE+2:
1221 case DELETE_SLICE+3:
1222 if ((opcode-DELETE_SLICE) & 2)
1223 w = POP();
1224 else
1225 w = NULL;
1226 if ((opcode-DELETE_SLICE) & 1)
1227 v = POP();
1228 else
1229 v = NULL;
1230 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001231 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +00001232 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00001233 Py_DECREF(u);
1234 Py_XDECREF(v);
1235 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001236 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001237 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001238
Guido van Rossum374a9221991-04-04 10:40:29 +00001239 case STORE_SUBSCR:
1240 w = POP();
1241 v = POP();
1242 u = POP();
1243 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +00001244 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001245 Py_DECREF(u);
1246 Py_DECREF(v);
1247 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001248 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001249 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001250
Guido van Rossum374a9221991-04-04 10:40:29 +00001251 case DELETE_SUBSCR:
1252 w = POP();
1253 v = POP();
1254 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001255 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001256 Py_DECREF(v);
1257 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001258 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001259 break;
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001260
Guido van Rossum374a9221991-04-04 10:40:29 +00001261 case PRINT_EXPR:
1262 v = POP();
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001263 w = PySys_GetObject("displayhook");
1264 if (w == NULL) {
1265 PyErr_SetString(PyExc_RuntimeError,
1266 "lost sys.displayhook");
1267 err = -1;
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001268 x = NULL;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001269 }
1270 if (err == 0) {
1271 x = Py_BuildValue("(O)", v);
1272 if (x == NULL)
1273 err = -1;
1274 }
1275 if (err == 0) {
1276 w = PyEval_CallObject(w, x);
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001277 Py_XDECREF(w);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001278 if (w == NULL)
1279 err = -1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001280 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001281 Py_DECREF(v);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001282 Py_XDECREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001283 break;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001284
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001285 case PRINT_ITEM_TO:
1286 w = stream = POP();
1287 /* fall through to PRINT_ITEM */
1288
Guido van Rossum374a9221991-04-04 10:40:29 +00001289 case PRINT_ITEM:
1290 v = POP();
Barry Warsaw093abe02000-08-29 04:56:13 +00001291 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001292 w = PySys_GetObject("stdout");
1293 if (w == NULL) {
1294 PyErr_SetString(PyExc_RuntimeError,
1295 "lost sys.stdout");
1296 err = -1;
1297 }
Guido van Rossum8f183201997-12-31 05:53:15 +00001298 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001299 if (w != NULL && PyFile_SoftSpace(w, 1))
Guido van Rossumbe270261997-05-22 22:26:18 +00001300 err = PyFile_WriteString(" ", w);
1301 if (err == 0)
1302 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Guido van Rossumb209a111997-04-29 18:18:01 +00001303 if (err == 0 && PyString_Check(v)) {
Guido van Rossumc6004111993-11-05 10:22:19 +00001304 /* XXX move into writeobject() ? */
Guido van Rossumb209a111997-04-29 18:18:01 +00001305 char *s = PyString_AsString(v);
1306 int len = PyString_Size(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +00001307 if (len > 0 &&
1308 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +00001309 s[len-1] != ' ')
Guido van Rossumb209a111997-04-29 18:18:01 +00001310 PyFile_SoftSpace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001311 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001312 Py_DECREF(v);
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001313 Py_XDECREF(stream);
1314 stream = NULL;
1315 if (err == 0)
1316 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001317 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001318
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001319 case PRINT_NEWLINE_TO:
1320 w = stream = POP();
1321 /* fall through to PRINT_NEWLINE */
1322
Guido van Rossum374a9221991-04-04 10:40:29 +00001323 case PRINT_NEWLINE:
Barry Warsaw093abe02000-08-29 04:56:13 +00001324 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001325 w = PySys_GetObject("stdout");
1326 if (w == NULL)
1327 PyErr_SetString(PyExc_RuntimeError,
1328 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001329 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001330 if (w != NULL) {
1331 err = PyFile_WriteString("\n", w);
1332 if (err == 0)
1333 PyFile_SoftSpace(w, 0);
1334 }
1335 Py_XDECREF(stream);
1336 stream = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +00001337 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001338
Thomas Wouters434d0822000-08-24 20:11:32 +00001339
1340#ifdef CASE_TOO_BIG
1341 default: switch (opcode) {
1342#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001343 case BREAK_LOOP:
1344 why = WHY_BREAK;
1345 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001346
Guido van Rossumf10570b1995-07-07 22:53:21 +00001347 case RAISE_VARARGS:
1348 u = v = w = NULL;
1349 switch (oparg) {
1350 case 3:
1351 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001352 /* Fallthrough */
1353 case 2:
1354 v = POP(); /* value */
1355 /* Fallthrough */
1356 case 1:
1357 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001358 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001359 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001360 break;
1361 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001362 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001363 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001364 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001365 break;
1366 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001367 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001368
Guido van Rossum374a9221991-04-04 10:40:29 +00001369 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001370 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001371 PyErr_SetString(PyExc_SystemError,
1372 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001373 break;
1374 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001375 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001376 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001377 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001378
Guido van Rossum374a9221991-04-04 10:40:29 +00001379 case RETURN_VALUE:
1380 retval = POP();
1381 why = WHY_RETURN;
1382 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001383
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001384 case EXEC_STMT:
1385 w = POP();
1386 v = POP();
1387 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001388 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001389 Py_DECREF(u);
1390 Py_DECREF(v);
1391 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001392 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001393
Guido van Rossum374a9221991-04-04 10:40:29 +00001394 case POP_BLOCK:
1395 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001396 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001397 while (STACK_LEVEL() > b->b_level) {
1398 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001399 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001400 }
1401 }
1402 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001403
Guido van Rossum374a9221991-04-04 10:40:29 +00001404 case END_FINALLY:
1405 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001406 if (PyInt_Check(v)) {
1407 why = (enum why_code) PyInt_AsLong(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001408 if (why == WHY_RETURN)
1409 retval = POP();
1410 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001411 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001412 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001413 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001414 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001415 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001416 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001417 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001418 else if (v != Py_None) {
1419 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001420 "'finally' pops bad exception");
1421 why = WHY_EXCEPTION;
1422 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001423 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001424 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001425
Guido van Rossum374a9221991-04-04 10:40:29 +00001426 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001427 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001428 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001429 w = POP();
1430 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001431 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001432 Py_DECREF(u);
1433 Py_DECREF(v);
1434 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001435 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001436
Guido van Rossum374a9221991-04-04 10:40:29 +00001437 case STORE_NAME:
1438 w = GETNAMEV(oparg);
1439 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001440 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001441 PyErr_SetString(PyExc_SystemError,
1442 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001443 break;
1444 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001445 err = PyDict_SetItem(x, w, v);
1446 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001447 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001448
Guido van Rossum374a9221991-04-04 10:40:29 +00001449 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001450 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001451 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001452 PyErr_SetString(PyExc_SystemError,
1453 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001454 break;
1455 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001456 if ((err = PyDict_DelItem(x, w)) != 0)
Guido van Rossumac7be682001-01-17 15:42:30 +00001457 format_exc_check_arg(PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001458 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001459 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001460
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001461 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001462 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001463 if (PyTuple_Check(v)) {
1464 if (PyTuple_Size(v) != oparg) {
1465 PyErr_SetString(PyExc_ValueError,
1466 "unpack tuple of wrong size");
1467 why = WHY_EXCEPTION;
1468 }
1469 else {
1470 for (; --oparg >= 0; ) {
1471 w = PyTuple_GET_ITEM(v, oparg);
1472 Py_INCREF(w);
1473 PUSH(w);
1474 }
1475 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001476 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001477 else if (PyList_Check(v)) {
1478 if (PyList_Size(v) != oparg) {
1479 PyErr_SetString(PyExc_ValueError,
1480 "unpack list of wrong size");
1481 why = WHY_EXCEPTION;
1482 }
1483 else {
1484 for (; --oparg >= 0; ) {
1485 w = PyList_GET_ITEM(v, oparg);
1486 Py_INCREF(w);
1487 PUSH(w);
1488 }
1489 }
1490 }
1491 else if (PySequence_Check(v)) {
1492 if (unpack_sequence(v, oparg,
1493 stack_pointer + oparg))
1494 stack_pointer += oparg;
1495 else
1496 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001497 }
1498 else {
Barry Warsawe42b18f1997-08-25 22:13:04 +00001499 PyErr_SetString(PyExc_TypeError,
1500 "unpack non-sequence");
1501 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001502 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001503 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001504 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001505
Guido van Rossum374a9221991-04-04 10:40:29 +00001506 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001507 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001508 v = POP();
1509 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001510 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1511 Py_DECREF(v);
1512 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001513 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001514
Guido van Rossum374a9221991-04-04 10:40:29 +00001515 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001516 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001517 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001518 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1519 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001520 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001521 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001522
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001523 case STORE_GLOBAL:
1524 w = GETNAMEV(oparg);
1525 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001526 err = PyDict_SetItem(f->f_globals, w, v);
1527 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001528 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001529
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001530 case DELETE_GLOBAL:
1531 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001532 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001533 format_exc_check_arg(
1534 PyExc_NameError, NAME_ERROR_MSG ,w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001535 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001536
Guido van Rossum374a9221991-04-04 10:40:29 +00001537 case LOAD_CONST:
1538 x = GETCONST(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001539 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001540 PUSH(x);
1541 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001542
Guido van Rossum374a9221991-04-04 10:40:29 +00001543 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001544 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001545 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001546 PyErr_SetString(PyExc_SystemError,
1547 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001548 break;
1549 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001550 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001551 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001552 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001553 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001554 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001555 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001556 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001557 PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001558 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001559 break;
1560 }
1561 }
1562 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001563 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001564 PUSH(x);
1565 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001566
Guido van Rossum374a9221991-04-04 10:40:29 +00001567 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001568 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001569 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001570 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001571 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001572 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001573 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001574 PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001575 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001576 break;
1577 }
1578 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001579 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001580 PUSH(x);
1581 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001582
Guido van Rossum9bfef441993-03-29 10:43:31 +00001583 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001584 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001585 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001586 format_exc_check_arg(
1587 PyExc_UnboundLocalError,
1588 UNBOUNDLOCAL_ERROR_MSG,
1589 PyTuple_GetItem(co->co_varnames, oparg)
1590 );
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001591 break;
1592 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001593 Py_INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001594 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001595 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001596 break;
1597
1598 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001599 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001600 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001601 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001602
1603 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001604 x = GETLOCAL(oparg);
1605 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001606 format_exc_check_arg(
1607 PyExc_UnboundLocalError,
1608 UNBOUNDLOCAL_ERROR_MSG,
1609 PyTuple_GetItem(co->co_varnames, oparg)
1610 );
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001611 break;
1612 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001613 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001614 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001615
Guido van Rossum374a9221991-04-04 10:40:29 +00001616 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001617 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001618 if (x != NULL) {
1619 for (; --oparg >= 0;) {
1620 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001621 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001622 }
1623 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001624 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001625 }
1626 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001627
Guido van Rossum374a9221991-04-04 10:40:29 +00001628 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001629 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001630 if (x != NULL) {
1631 for (; --oparg >= 0;) {
1632 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001633 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001634 }
1635 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001636 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001637 }
1638 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001639
Guido van Rossum374a9221991-04-04 10:40:29 +00001640 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001641 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001642 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001643 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001644 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001645
Guido van Rossum374a9221991-04-04 10:40:29 +00001646 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001647 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001648 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001649 x = PyObject_GetAttr(v, w);
1650 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001651 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001652 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001653 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001654
Guido van Rossum374a9221991-04-04 10:40:29 +00001655 case COMPARE_OP:
1656 w = POP();
1657 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +00001658 if (PyInt_Check(v) && PyInt_Check(w)) {
1659 /* INLINE: cmp(int, int) */
1660 register long a, b;
1661 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001662 a = PyInt_AS_LONG(v);
1663 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001664 switch (oparg) {
1665 case LT: res = a < b; break;
1666 case LE: res = a <= b; break;
1667 case EQ: res = a == b; break;
1668 case NE: res = a != b; break;
1669 case GT: res = a > b; break;
1670 case GE: res = a >= b; break;
1671 case IS: res = v == w; break;
1672 case IS_NOT: res = v != w; break;
1673 default: goto slow_compare;
1674 }
1675 x = res ? Py_True : Py_False;
1676 Py_INCREF(x);
1677 }
1678 else {
1679 slow_compare:
1680 x = cmp_outcome(oparg, v, w);
1681 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001682 Py_DECREF(v);
1683 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001684 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001685 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001686 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001687
Guido van Rossum374a9221991-04-04 10:40:29 +00001688 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001689 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001690 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001691 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001692 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001693 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001694 break;
1695 }
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00001696 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001697 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001698 w,
1699 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001700 f->f_locals == NULL ?
1701 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001702 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001703 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001704 if (w == NULL) {
1705 x = NULL;
1706 break;
1707 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001708 x = PyEval_CallObject(x, w);
1709 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001710 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001711 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001712 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001713
Thomas Wouters52152252000-08-17 22:55:00 +00001714 case IMPORT_STAR:
1715 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001716 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001717 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001718 PyErr_SetString(PyExc_SystemError,
1719 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001720 break;
1721 }
Thomas Wouters52152252000-08-17 22:55:00 +00001722 err = import_all_from(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001723 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00001724 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001725 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001726 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001727
Thomas Wouters52152252000-08-17 22:55:00 +00001728 case IMPORT_FROM:
1729 w = GETNAMEV(oparg);
1730 v = TOP();
1731 x = import_from(v, w);
1732 PUSH(x);
1733 if (x != NULL) continue;
1734 break;
1735
Guido van Rossum374a9221991-04-04 10:40:29 +00001736 case JUMP_FORWARD:
1737 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001738 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001739
Guido van Rossum374a9221991-04-04 10:40:29 +00001740 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001741 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001742 if (err > 0)
1743 err = 0;
1744 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001745 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001746 else
1747 break;
1748 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001749
Guido van Rossum374a9221991-04-04 10:40:29 +00001750 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001751 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001752 if (err > 0) {
1753 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001754 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001755 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001756 else if (err == 0)
1757 ;
1758 else
1759 break;
1760 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001761
Guido van Rossum374a9221991-04-04 10:40:29 +00001762 case JUMP_ABSOLUTE:
1763 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001764 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001765
Guido van Rossum374a9221991-04-04 10:40:29 +00001766 case FOR_LOOP:
1767 /* for v in s: ...
1768 On entry: stack contains s, i.
1769 On exit: stack contains s, i+1, s[i];
1770 but if loop exhausted:
1771 s, i are popped, and we jump */
1772 w = POP(); /* Loop index */
1773 v = POP(); /* Sequence object */
1774 u = loop_subscript(v, w);
1775 if (u != NULL) {
1776 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001777 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001778 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001779 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001780 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001781 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001782 }
1783 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001784 Py_DECREF(v);
1785 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001786 /* A NULL can mean "s exhausted"
1787 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001788 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001789 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001790 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001791 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001792 continue;
1793 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001794 }
1795 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001796
Guido van Rossum374a9221991-04-04 10:40:29 +00001797 case SETUP_LOOP:
1798 case SETUP_EXCEPT:
1799 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001800 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Guido van Rossum374a9221991-04-04 10:40:29 +00001801 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001802 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001803
Guido van Rossum374a9221991-04-04 10:40:29 +00001804 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001805#ifdef LLTRACE
1806 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001807 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001808#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001809 f->f_lineno = oparg;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001810 if (f->f_trace == NULL)
1811 continue;
1812 /* Trace each line of code reached */
1813 f->f_lasti = INSTR_OFFSET();
1814 err = call_trace(&f->f_trace, &f->f_trace,
Guido van Rossumb209a111997-04-29 18:18:01 +00001815 f, "line", Py_None);
Guido van Rossum374a9221991-04-04 10:40:29 +00001816 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001817
1818 case CALL_FUNCTION:
Jeremy Hylton52820442001-01-03 23:52:36 +00001819 {
1820 int na = oparg & 0xff;
1821 int nk = (oparg>>8) & 0xff;
1822 int n = na + 2 * nk;
1823 PyObject **pfunc = stack_pointer - n - 1;
1824 PyObject *func = *pfunc;
1825 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
1826
1827 /* Always dispatch PyCFunction first, because
1828 these are presumed to be the most frequent
1829 callable object.
1830 */
1831 if (PyCFunction_Check(func)) {
1832 if (PyCFunction_GET_FLAGS(func) == 0) {
1833 x = fast_cfunction(func,
Guido van Rossumac7be682001-01-17 15:42:30 +00001834 &stack_pointer, na);
Jeremy Hylton52820442001-01-03 23:52:36 +00001835 } else {
1836 x = do_call(func, &stack_pointer,
1837 na, nk);
1838 }
1839 } else {
Guido van Rossumac7be682001-01-17 15:42:30 +00001840 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00001841 && PyMethod_GET_SELF(func) != NULL) {
1842 /* optimize access to bound methods */
1843 PyObject *self = PyMethod_GET_SELF(func);
1844 Py_INCREF(self);
1845 func = PyMethod_GET_FUNCTION(func);
1846 Py_INCREF(func);
1847 Py_DECREF(*pfunc);
1848 *pfunc = self;
1849 na++;
1850 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00001851 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00001852 Py_INCREF(func);
1853 if (PyFunction_Check(func)) {
1854 x = fast_function(func, &stack_pointer,
Guido van Rossumac7be682001-01-17 15:42:30 +00001855 n, na, nk);
Jeremy Hylton52820442001-01-03 23:52:36 +00001856 } else {
1857 x = do_call(func, &stack_pointer,
1858 na, nk);
1859 }
1860 Py_DECREF(func);
1861 }
1862
1863 while (stack_pointer > pfunc) {
1864 w = POP();
1865 Py_DECREF(w);
1866 }
1867 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00001868 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00001869 continue;
1870 break;
1871 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001872
Jeremy Hylton76901512000-03-28 23:49:17 +00001873 case CALL_FUNCTION_VAR:
1874 case CALL_FUNCTION_KW:
1875 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00001876 {
Jeremy Hylton76901512000-03-28 23:49:17 +00001877 int na = oparg & 0xff;
1878 int nk = (oparg>>8) & 0xff;
1879 int flags = (opcode - CALL_FUNCTION) & 3;
Jeremy Hylton52820442001-01-03 23:52:36 +00001880 int n = na + 2 * nk;
1881 PyObject **pfunc, *func;
1882 if (flags & CALL_FLAG_VAR)
1883 n++;
1884 if (flags & CALL_FLAG_KW)
1885 n++;
1886 pfunc = stack_pointer - n - 1;
1887 func = *pfunc;
Jeremy Hylton76901512000-03-28 23:49:17 +00001888 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Jeremy Hylton52820442001-01-03 23:52:36 +00001889
Guido van Rossumac7be682001-01-17 15:42:30 +00001890 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00001891 && PyMethod_GET_SELF(func) != NULL) {
1892 PyObject *self = PyMethod_GET_SELF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00001893 Py_INCREF(self);
Jeremy Hylton52820442001-01-03 23:52:36 +00001894 func = PyMethod_GET_FUNCTION(func);
1895 Py_INCREF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00001896 Py_DECREF(*pfunc);
1897 *pfunc = self;
1898 na++;
1899 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00001900 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00001901 Py_INCREF(func);
1902 x = ext_do_call(func, &stack_pointer, flags, na, nk);
Jeremy Hylton76901512000-03-28 23:49:17 +00001903 Py_DECREF(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00001904
Jeremy Hylton76901512000-03-28 23:49:17 +00001905 while (stack_pointer > pfunc) {
Jeremy Hylton52820442001-01-03 23:52:36 +00001906 w = POP();
1907 Py_DECREF(w);
Jeremy Hylton76901512000-03-28 23:49:17 +00001908 }
1909 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00001910 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00001911 continue;
Jeremy Hylton76901512000-03-28 23:49:17 +00001912 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001913 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001914
Guido van Rossum681d79a1995-07-18 14:51:37 +00001915 case MAKE_FUNCTION:
1916 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00001917 x = PyFunction_New(v, f->f_globals);
1918 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001919 /* XXX Maybe this should be a separate opcode? */
1920 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001921 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001922 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001923 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001924 x = NULL;
1925 break;
1926 }
1927 while (--oparg >= 0) {
1928 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001929 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001930 }
1931 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001932 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001933 }
1934 PUSH(x);
1935 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001936
1937 case BUILD_SLICE:
1938 if (oparg == 3)
1939 w = POP();
1940 else
1941 w = NULL;
1942 v = POP();
1943 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00001944 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001945 Py_DECREF(u);
1946 Py_DECREF(v);
1947 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00001948 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001949 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00001950 break;
1951
Fred Drakeef8ace32000-08-24 00:32:09 +00001952 case EXTENDED_ARG:
1953 opcode = NEXTOP();
1954 oparg = oparg<<16 | NEXTARG();
1955 goto dispatch_opcode;
1956 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001957
Guido van Rossum374a9221991-04-04 10:40:29 +00001958 default:
1959 fprintf(stderr,
1960 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001961 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00001962 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00001963 why = WHY_EXCEPTION;
1964 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001965
1966#ifdef CASE_TOO_BIG
1967 }
1968#endif
1969
Guido van Rossum374a9221991-04-04 10:40:29 +00001970 } /* switch */
1971
1972 on_error:
Guido van Rossumac7be682001-01-17 15:42:30 +00001973
Guido van Rossum374a9221991-04-04 10:40:29 +00001974 /* Quickly continue if no error occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00001975
Guido van Rossum374a9221991-04-04 10:40:29 +00001976 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001977 if (err == 0 && x != NULL) {
1978#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00001979 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00001980 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00001981 fprintf(stderr,
1982 "XXX undetected error\n");
1983 else
1984#endif
1985 continue; /* Normal, fast path */
1986 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001987 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00001988 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00001989 err = 0;
1990 }
1991
Guido van Rossum374a9221991-04-04 10:40:29 +00001992 /* Double-check exception status */
Guido van Rossumac7be682001-01-17 15:42:30 +00001993
Guido van Rossum374a9221991-04-04 10:40:29 +00001994 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001995 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001996 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00001997 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00001998 why = WHY_EXCEPTION;
1999 }
2000 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002001#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00002002 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002003 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002004 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002005 fprintf(stderr,
2006 "XXX undetected error (why=%d)\n",
2007 why);
2008 why = WHY_EXCEPTION;
2009 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002010 }
2011#endif
2012
2013 /* Log traceback info if this is a real exception */
Guido van Rossumac7be682001-01-17 15:42:30 +00002014
Guido van Rossum374a9221991-04-04 10:40:29 +00002015 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002016 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00002017 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00002018 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00002019 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002020
Guido van Rossume59214e1994-08-30 08:01:59 +00002021 if (f->f_trace)
2022 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002023 if (tstate->sys_profilefunc)
2024 call_exc_trace(&tstate->sys_profilefunc,
2025 (PyObject**)0, f);
Guido van Rossum014518f1998-11-23 21:09:51 +00002026 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002027
Guido van Rossum374a9221991-04-04 10:40:29 +00002028 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
Guido van Rossumac7be682001-01-17 15:42:30 +00002029
Guido van Rossum374a9221991-04-04 10:40:29 +00002030 if (why == WHY_RERAISE)
2031 why = WHY_EXCEPTION;
2032
2033 /* Unwind stacks if a (pseudo) exception occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002034
Guido van Rossum374a9221991-04-04 10:40:29 +00002035 while (why != WHY_NOT && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002036 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00002037 while (STACK_LEVEL() > b->b_level) {
2038 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002039 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002040 }
2041 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2042 why = WHY_NOT;
2043 JUMPTO(b->b_handler);
2044 break;
2045 }
2046 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00002047 (b->b_type == SETUP_EXCEPT &&
2048 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002049 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002050 PyObject *exc, *val, *tb;
2051 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002052 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002053 val = Py_None;
2054 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00002055 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002056 /* Make the raw exception data
2057 available to the handler,
2058 so a program can emulate the
2059 Python main loop. Don't do
2060 this for 'finally'. */
2061 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00002062 PyErr_NormalizeException(
2063 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002064 set_exc_info(tstate,
2065 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002066 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002067 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002068 PUSH(val);
2069 PUSH(exc);
2070 }
2071 else {
2072 if (why == WHY_RETURN)
2073 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00002074 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00002075 PUSH(v);
2076 }
2077 why = WHY_NOT;
2078 JUMPTO(b->b_handler);
2079 break;
2080 }
2081 } /* unwind stack */
2082
2083 /* End the loop if we still have an error (or return) */
Guido van Rossumac7be682001-01-17 15:42:30 +00002084
Guido van Rossum374a9221991-04-04 10:40:29 +00002085 if (why != WHY_NOT)
2086 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00002087
Guido van Rossum374a9221991-04-04 10:40:29 +00002088 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00002089
Guido van Rossum374a9221991-04-04 10:40:29 +00002090 /* Pop remaining stack entries */
Guido van Rossumac7be682001-01-17 15:42:30 +00002091
Guido van Rossum374a9221991-04-04 10:40:29 +00002092 while (!EMPTY()) {
2093 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002094 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002095 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002096
Guido van Rossum96a42c81992-01-12 02:29:51 +00002097 if (why != WHY_RETURN)
2098 retval = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002099
Guido van Rossume59214e1994-08-30 08:01:59 +00002100 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002101 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00002102 if (call_trace(&f->f_trace, &f->f_trace, f,
2103 "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002104 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002105 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002106 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002107 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002108 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002109 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002110
Guido van Rossuma027efa1997-05-05 20:56:21 +00002111 if (tstate->sys_profilefunc && why == WHY_RETURN) {
2112 if (call_trace(&tstate->sys_profilefunc, (PyObject**)0,
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002113 f, "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002114 Py_XDECREF(retval);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002115 retval = NULL;
2116 why = WHY_EXCEPTION;
2117 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002118 }
Guido van Rossuma4240131997-01-21 21:18:36 +00002119
Guido van Rossuma027efa1997-05-05 20:56:21 +00002120 reset_exc_info(tstate);
2121
2122 --tstate->recursion_depth;
Guido van Rossum8c5df061997-01-24 04:19:24 +00002123
2124 fail: /* Jump here from prelude on failure */
Guido van Rossumac7be682001-01-17 15:42:30 +00002125
Guido van Rossum374a9221991-04-04 10:40:29 +00002126 /* Restore previous frame and release the current one */
Guido van Rossum681d79a1995-07-18 14:51:37 +00002127
Guido van Rossuma027efa1997-05-05 20:56:21 +00002128 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +00002129 Py_DECREF(f);
Guido van Rossumac7be682001-01-17 15:42:30 +00002130
Guido van Rossum96a42c81992-01-12 02:29:51 +00002131 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00002132}
2133
Guido van Rossuma027efa1997-05-05 20:56:21 +00002134static void
Guido van Rossumac7be682001-01-17 15:42:30 +00002135set_exc_info(PyThreadState *tstate,
2136 PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002137{
2138 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002139 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00002140
Guido van Rossuma027efa1997-05-05 20:56:21 +00002141 frame = tstate->frame;
2142 if (frame->f_exc_type == NULL) {
2143 /* This frame didn't catch an exception before */
2144 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002145 if (tstate->exc_type == NULL) {
2146 Py_INCREF(Py_None);
2147 tstate->exc_type = Py_None;
2148 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002149 tmp_type = frame->f_exc_type;
2150 tmp_value = frame->f_exc_value;
2151 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002152 Py_XINCREF(tstate->exc_type);
2153 Py_XINCREF(tstate->exc_value);
2154 Py_XINCREF(tstate->exc_traceback);
2155 frame->f_exc_type = tstate->exc_type;
2156 frame->f_exc_value = tstate->exc_value;
2157 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002158 Py_XDECREF(tmp_type);
2159 Py_XDECREF(tmp_value);
2160 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002161 }
2162 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002163 tmp_type = tstate->exc_type;
2164 tmp_value = tstate->exc_value;
2165 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002166 Py_XINCREF(type);
2167 Py_XINCREF(value);
2168 Py_XINCREF(tb);
2169 tstate->exc_type = type;
2170 tstate->exc_value = value;
2171 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002172 Py_XDECREF(tmp_type);
2173 Py_XDECREF(tmp_value);
2174 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002175 /* For b/w compatibility */
2176 PySys_SetObject("exc_type", type);
2177 PySys_SetObject("exc_value", value);
2178 PySys_SetObject("exc_traceback", tb);
2179}
2180
2181static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002182reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002183{
2184 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002185 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002186 frame = tstate->frame;
2187 if (frame->f_exc_type != NULL) {
2188 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002189 tmp_type = tstate->exc_type;
2190 tmp_value = tstate->exc_value;
2191 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002192 Py_XINCREF(frame->f_exc_type);
2193 Py_XINCREF(frame->f_exc_value);
2194 Py_XINCREF(frame->f_exc_traceback);
2195 tstate->exc_type = frame->f_exc_type;
2196 tstate->exc_value = frame->f_exc_value;
2197 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002198 Py_XDECREF(tmp_type);
2199 Py_XDECREF(tmp_value);
2200 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002201 /* For b/w compatibility */
2202 PySys_SetObject("exc_type", frame->f_exc_type);
2203 PySys_SetObject("exc_value", frame->f_exc_value);
2204 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
2205 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002206 tmp_type = frame->f_exc_type;
2207 tmp_value = frame->f_exc_value;
2208 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002209 frame->f_exc_type = NULL;
2210 frame->f_exc_value = NULL;
2211 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002212 Py_XDECREF(tmp_type);
2213 Py_XDECREF(tmp_value);
2214 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002215}
2216
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002217/* Logic for the raise statement (too complicated for inlining).
2218 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00002219static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002220do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002221{
Guido van Rossumd295f121998-04-09 21:39:57 +00002222 if (type == NULL) {
2223 /* Reraise */
2224 PyThreadState *tstate = PyThreadState_Get();
2225 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
2226 value = tstate->exc_value;
2227 tb = tstate->exc_traceback;
2228 Py_XINCREF(type);
2229 Py_XINCREF(value);
2230 Py_XINCREF(tb);
2231 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002232
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002233 /* We support the following forms of raise:
2234 raise <class>, <classinstance>
2235 raise <class>, <argument tuple>
2236 raise <class>, None
2237 raise <class>, <argument>
2238 raise <classinstance>, None
2239 raise <string>, <object>
2240 raise <string>, None
2241
2242 An omitted second argument is the same as None.
2243
2244 In addition, raise <tuple>, <anything> is the same as
2245 raising the tuple's first item (and it better have one!);
2246 this rule is applied recursively.
2247
2248 Finally, an optional third argument can be supplied, which
2249 gives the traceback to be substituted (useful when
2250 re-raising an exception after examining it). */
2251
2252 /* First, check the traceback argument, replacing None with
2253 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002254 if (tb == Py_None) {
2255 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002256 tb = NULL;
2257 }
2258 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002259 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00002260 "raise: arg 3 must be a traceback or None");
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002261 goto raise_error;
2262 }
2263
2264 /* Next, replace a missing value with None */
2265 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002266 value = Py_None;
2267 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002268 }
2269
2270 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002271 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2272 PyObject *tmp = type;
2273 type = PyTuple_GET_ITEM(type, 0);
2274 Py_INCREF(type);
2275 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002276 }
2277
Barry Warsaw4249f541997-08-22 21:26:19 +00002278 if (PyString_Check(type))
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002279 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002280
2281 else if (PyClass_Check(type))
2282 PyErr_NormalizeException(&type, &value, &tb);
2283
Guido van Rossumb209a111997-04-29 18:18:01 +00002284 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002285 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002286 if (value != Py_None) {
2287 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002288 "instance exception may not have a separate value");
2289 goto raise_error;
2290 }
2291 else {
2292 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002293 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002294 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002295 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2296 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002297 }
2298 }
2299 else {
2300 /* Not something you can raise. You get an exception
2301 anyway, just not what you specified :-) */
Guido van Rossumb209a111997-04-29 18:18:01 +00002302 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002303 "exceptions must be strings, classes, or instances");
2304 goto raise_error;
2305 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002306 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002307 if (tb == NULL)
2308 return WHY_EXCEPTION;
2309 else
2310 return WHY_RERAISE;
2311 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002312 Py_XDECREF(value);
2313 Py_XDECREF(type);
2314 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002315 return WHY_EXCEPTION;
2316}
2317
Barry Warsawe42b18f1997-08-25 22:13:04 +00002318static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002319unpack_sequence(PyObject *v, int argcnt, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00002320{
2321 int i;
2322 PyObject *w;
Guido van Rossumac7be682001-01-17 15:42:30 +00002323
Barry Warsawe42b18f1997-08-25 22:13:04 +00002324 for (i = 0; i < argcnt; i++) {
2325 if (! (w = PySequence_GetItem(v, i))) {
2326 if (PyErr_ExceptionMatches(PyExc_IndexError))
2327 PyErr_SetString(PyExc_ValueError,
2328 "unpack sequence of wrong size");
2329 goto finally;
2330 }
2331 *--sp = w;
2332 }
2333 /* we better get an IndexError now */
2334 if (PySequence_GetItem(v, i) == NULL) {
2335 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
2336 PyErr_Clear();
2337 return 1;
2338 }
2339 /* some other exception occurred. fall through to finally */
2340 }
2341 else
2342 PyErr_SetString(PyExc_ValueError,
2343 "unpack sequence of wrong size");
2344 /* fall through */
2345finally:
Barry Warsaw91010551997-08-25 22:30:51 +00002346 for (; i > 0; i--, sp++)
2347 Py_DECREF(*sp);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002348
2349 return 0;
2350}
2351
2352
Guido van Rossum96a42c81992-01-12 02:29:51 +00002353#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002354static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002355prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002356{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002357 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002358 if (PyObject_Print(v, stdout, 0) != 0)
2359 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002360 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00002361 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002362}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002363#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002364
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002365static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002366call_exc_trace(PyObject **p_trace, PyObject **p_newtrace, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002367{
Guido van Rossumb209a111997-04-29 18:18:01 +00002368 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002369 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002370 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002371 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002372 value = Py_None;
2373 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002374 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002375 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002376 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002377 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002378 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002379 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002380 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002381 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002382 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002383 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002384 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002385 Py_XDECREF(type);
2386 Py_XDECREF(value);
2387 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002388 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002389}
2390
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002391/* PyObject **p_trace: in/out; may not be NULL;
2392 may not point to NULL variable initially
2393 PyObject **p_newtrace: in/out; may be NULL;
2394 may point to NULL variable;
2395 may be same variable as p_newtrace */
2396
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002397static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002398call_trace(PyObject **p_trace, PyObject **p_newtrace, PyFrameObject *f,
2399 char *msg, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002400{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002401 PyThreadState *tstate = f->f_tstate;
Guido van Rossumb209a111997-04-29 18:18:01 +00002402 PyObject *args, *what;
2403 PyObject *res = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002404
Guido van Rossuma027efa1997-05-05 20:56:21 +00002405 if (tstate->tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002406 /* Don't do recursive traces */
2407 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002408 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002409 *p_newtrace = NULL;
2410 }
2411 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002412 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002413
Guido van Rossumb209a111997-04-29 18:18:01 +00002414 args = PyTuple_New(3);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002415 if (args == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002416 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002417 what = PyString_FromString(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002418 if (what == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002419 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002420 Py_INCREF(f);
2421 PyTuple_SET_ITEM(args, 0, (PyObject *)f);
2422 PyTuple_SET_ITEM(args, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002423 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002424 arg = Py_None;
2425 Py_INCREF(arg);
2426 PyTuple_SET_ITEM(args, 2, arg);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002427 tstate->tracing++;
Guido van Rossumb209a111997-04-29 18:18:01 +00002428 PyFrame_FastToLocals(f);
2429 res = PyEval_CallObject(*p_trace, args); /* May clear *p_trace! */
2430 PyFrame_LocalsToFast(f, 1);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002431 tstate->tracing--;
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002432 cleanup:
Guido van Rossumb209a111997-04-29 18:18:01 +00002433 Py_XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002434 if (res == NULL) {
2435 /* The trace proc raised an exception */
Guido van Rossumb209a111997-04-29 18:18:01 +00002436 PyTraceBack_Here(f);
2437 Py_XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002438 *p_trace = NULL;
2439 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002440 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002441 *p_newtrace = NULL;
2442 }
Barry Warsawf6202631999-09-08 16:26:33 +00002443 /* to be extra double plus sure we don't get recursive
2444 * calls inf either tracefunc or profilefunc gets an
2445 * exception, zap the global variables.
2446 */
2447 Py_XDECREF(tstate->sys_tracefunc);
2448 tstate->sys_tracefunc = NULL;
2449 Py_XDECREF(tstate->sys_profilefunc);
2450 tstate->sys_profilefunc = NULL;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002451 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002452 }
2453 else {
2454 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002455 Py_XDECREF(*p_newtrace);
2456 if (res == Py_None)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002457 *p_newtrace = NULL;
2458 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002459 Py_INCREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002460 *p_newtrace = res;
2461 }
2462 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002463 Py_DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002464 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002465 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002466}
2467
Guido van Rossumb209a111997-04-29 18:18:01 +00002468PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002469PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002470{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002471 PyThreadState *tstate = PyThreadState_Get();
2472 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002473 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002474 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002475 else
2476 return current_frame->f_builtins;
2477}
2478
Guido van Rossumb209a111997-04-29 18:18:01 +00002479PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002480PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00002481{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002482 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002483 if (current_frame == NULL)
2484 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002485 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002486 return current_frame->f_locals;
2487}
2488
Guido van Rossumb209a111997-04-29 18:18:01 +00002489PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002490PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002491{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002492 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002493 if (current_frame == NULL)
2494 return NULL;
2495 else
2496 return current_frame->f_globals;
2497}
2498
Guido van Rossumb209a111997-04-29 18:18:01 +00002499PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002500PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00002501{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002502 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002503 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002504}
2505
Guido van Rossum6135a871995-01-09 17:53:26 +00002506int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002507PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002508{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002509 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002510 return current_frame == NULL ? 0 : current_frame->f_restricted;
2511}
2512
Guido van Rossumbe270261997-05-22 22:26:18 +00002513int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002514Py_FlushLine(void)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002515{
Guido van Rossumb209a111997-04-29 18:18:01 +00002516 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002517 if (f == NULL)
2518 return 0;
2519 if (!PyFile_SoftSpace(f, 0))
2520 return 0;
2521 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002522}
2523
Guido van Rossum3f5da241990-12-20 15:06:42 +00002524
Guido van Rossum681d79a1995-07-18 14:51:37 +00002525/* External interface to call any callable object.
2526 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002527
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002528#undef PyEval_CallObject
2529/* for backward compatibility: export this interface */
2530
Guido van Rossumb209a111997-04-29 18:18:01 +00002531PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002532PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002533{
Guido van Rossumb209a111997-04-29 18:18:01 +00002534 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002535}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002536#define PyEval_CallObject(func,arg) \
2537 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00002538
Guido van Rossumb209a111997-04-29 18:18:01 +00002539PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002540PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002541{
Jeremy Hylton52820442001-01-03 23:52:36 +00002542 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002543
2544 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002545 arg = PyTuple_New(0);
2546 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002547 PyErr_SetString(PyExc_TypeError,
2548 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002549 return NULL;
2550 }
2551 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002552 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002553
Guido van Rossumb209a111997-04-29 18:18:01 +00002554 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002555 PyErr_SetString(PyExc_TypeError,
2556 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00002557 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00002558 return NULL;
2559 }
2560
Jeremy Hylton52820442001-01-03 23:52:36 +00002561 result = call_object(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002562 Py_DECREF(arg);
Jeremy Hylton52820442001-01-03 23:52:36 +00002563 return result;
2564}
2565
2566/* How often is each kind of object called? The answer depends on the
2567 program. An instrumented call_object() was used to run the Python
2568 regression test suite. The results were:
2569 4200000 PyCFunctions
2570 390000 fast_function() calls
2571 94000 other functions
2572 480000 all functions (sum of prev two)
2573 150000 methods
2574 100000 classes
2575
2576 Tests on other bodies of code show that PyCFunctions are still
2577 most common, but not by such a large margin.
2578*/
2579
2580static PyObject *
2581call_object(PyObject *func, PyObject *arg, PyObject *kw)
2582{
2583 ternaryfunc call;
2584 PyObject *result;
2585
2586 if (PyMethod_Check(func))
2587 result = call_method(func, arg, kw);
2588 else if (PyFunction_Check(func))
2589 result = call_eval_code2(func, arg, kw);
2590 else if (PyCFunction_Check(func))
2591 result = call_cfunction(func, arg, kw);
2592 else if (PyClass_Check(func))
2593 result = PyInstance_New(func, arg, kw);
2594 else if (PyInstance_Check(func))
2595 result = call_instance(func, arg, kw);
2596 else if ((call = func->ob_type->tp_call) != NULL)
2597 result = (*call)(func, arg, kw);
2598 else {
2599 PyErr_Format(PyExc_TypeError, "object is not callable: %s",
2600 PyString_AS_STRING(PyObject_Repr(func)));
2601 return NULL;
2602 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002603 if (result == NULL && !PyErr_Occurred())
2604 PyErr_SetString(PyExc_SystemError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002605 "NULL result without error in call_object");
Guido van Rossumac7be682001-01-17 15:42:30 +00002606
Guido van Rossume59214e1994-08-30 08:01:59 +00002607 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002608}
2609
Guido van Rossumb209a111997-04-29 18:18:01 +00002610static PyObject *
Jeremy Hylton52820442001-01-03 23:52:36 +00002611call_cfunction(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002612{
Jeremy Hylton52820442001-01-03 23:52:36 +00002613 PyCFunctionObject* f = (PyCFunctionObject*)func;
2614 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
2615 PyObject *self = PyCFunction_GET_SELF(func);
2616 int flags = PyCFunction_GET_FLAGS(func);
2617
Jeremy Hylton52820442001-01-03 23:52:36 +00002618 if (flags & METH_KEYWORDS) {
Fred Drake1a7aab72001-01-04 22:33:02 +00002619 if (kw == NULL) {
2620 static PyObject *dict = NULL;
2621 if (dict == NULL) {
2622 dict = PyDict_New();
2623 if (dict == NULL)
2624 return NULL;
2625 }
2626 kw = dict;
2627 Py_INCREF(dict);
2628 }
Jeremy Hylton52820442001-01-03 23:52:36 +00002629 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002630 }
Jeremy Hylton52820442001-01-03 23:52:36 +00002631 if (kw != NULL && PyDict_Size(kw) != 0) {
2632 PyErr_Format(PyExc_TypeError,
2633 "%.200s() takes no keyword arguments",
2634 f->m_ml->ml_name);
2635 return NULL;
2636 }
Fred Drake1a7aab72001-01-04 22:33:02 +00002637 if (flags & METH_VARARGS) {
2638 return (*meth)(self, arg);
2639 }
2640 if (!(flags & METH_VARARGS)) {
2641 /* the really old style */
2642 int size = PyTuple_GET_SIZE(arg);
2643 if (size == 1)
2644 arg = PyTuple_GET_ITEM(arg, 0);
2645 else if (size == 0)
2646 arg = NULL;
2647 return (*meth)(self, arg);
2648 }
Jeremy Hylton52820442001-01-03 23:52:36 +00002649 /* should never get here ??? */
2650 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002651 return NULL;
2652}
2653
Guido van Rossumb209a111997-04-29 18:18:01 +00002654static PyObject *
Jeremy Hylton52820442001-01-03 23:52:36 +00002655call_instance(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002656{
Jeremy Hylton52820442001-01-03 23:52:36 +00002657 PyObject *res, *call = PyObject_GetAttrString(func, "__call__");
2658 if (call == NULL) {
2659 PyInstanceObject *inst = (PyInstanceObject*) func;
2660 PyErr_Clear();
2661 PyErr_Format(PyExc_AttributeError,
2662 "%.200s instance has no __call__ method",
2663 PyString_AsString(inst->in_class->cl_name));
Guido van Rossum681d79a1995-07-18 14:51:37 +00002664 return NULL;
2665 }
Jeremy Hylton52820442001-01-03 23:52:36 +00002666 res = call_object(call, arg, kw);
2667 Py_DECREF(call);
2668 return res;
2669}
2670
2671static PyObject *
2672call_method(PyObject *func, PyObject *arg, PyObject *kw)
2673{
2674 PyObject *self = PyMethod_GET_SELF(func);
2675 PyObject *class = PyMethod_GET_CLASS(func);
2676 PyObject *result;
2677
2678 func = PyMethod_GET_FUNCTION(func);
2679 if (self == NULL) {
2680 /* Unbound methods must be called with an instance of
2681 the class (or a derived class) as first argument */
2682 if (PyTuple_Size(arg) >= 1)
2683 self = PyTuple_GET_ITEM(arg, 0);
2684 if (!(self != NULL && PyInstance_Check(self)
2685 && PyClass_IsSubclass((PyObject *)
2686 (((PyInstanceObject *)self)->in_class),
2687 class))) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00002688 PyObject* fn = ((PyFunctionObject*) func)->func_name;
2689 PyErr_Format(PyExc_TypeError,
2690 "unbound method %s%smust be "
2691 "called with instance as first argument",
2692 fn ? PyString_AsString(fn) : "",
2693 fn ? "() " : "");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002694 return NULL;
2695 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002696 Py_INCREF(arg);
Jeremy Hylton52820442001-01-03 23:52:36 +00002697 } else {
2698 int argcount = PyTuple_Size(arg);
2699 PyObject *newarg = PyTuple_New(argcount + 1);
2700 int i;
2701 if (newarg == NULL)
2702 return NULL;
2703 Py_INCREF(self);
2704 PyTuple_SET_ITEM(newarg, 0, self);
2705 for (i = 0; i < argcount; i++) {
2706 PyObject *v = PyTuple_GET_ITEM(arg, i);
2707 Py_XINCREF(v);
2708 PyTuple_SET_ITEM(newarg, i+1, v);
2709 }
2710 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002711 }
Jeremy Hylton52820442001-01-03 23:52:36 +00002712 result = call_object(func, arg, kw);
2713 Py_DECREF(arg);
2714 return result;
2715}
2716
2717static PyObject *
2718call_eval_code2(PyObject *func, PyObject *arg, PyObject *kw)
2719{
2720 PyObject *result;
2721 PyObject *argdefs;
2722 PyObject **d, **k;
2723 int nk, nd;
2724
2725 argdefs = PyFunction_GET_DEFAULTS(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00002726 if (argdefs != NULL && PyTuple_Check(argdefs)) {
2727 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
2728 nd = PyTuple_Size(argdefs);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002729 }
2730 else {
2731 d = NULL;
2732 nd = 0;
2733 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002734
Guido van Rossum681d79a1995-07-18 14:51:37 +00002735 if (kw != NULL) {
2736 int pos, i;
Guido van Rossumb209a111997-04-29 18:18:01 +00002737 nk = PyDict_Size(kw);
2738 k = PyMem_NEW(PyObject *, 2*nk);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002739 if (k == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002740 PyErr_NoMemory();
2741 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002742 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00002743 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002744 pos = i = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00002745 while (PyDict_Next(kw, &pos, &k[i], &k[i+1]))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002746 i += 2;
2747 nk = i/2;
2748 /* XXX This is broken if the caller deletes dict items! */
2749 }
2750 else {
2751 k = NULL;
2752 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00002753 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002754
Guido van Rossum681d79a1995-07-18 14:51:37 +00002755 result = eval_code2(
Jeremy Hylton52820442001-01-03 23:52:36 +00002756 (PyCodeObject *)PyFunction_GET_CODE(func),
2757 PyFunction_GET_GLOBALS(func), (PyObject *)NULL,
Guido van Rossumb209a111997-04-29 18:18:01 +00002758 &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg),
Guido van Rossum681d79a1995-07-18 14:51:37 +00002759 k, nk,
Jeremy Hylton52820442001-01-03 23:52:36 +00002760 d, nd);
Guido van Rossumac7be682001-01-17 15:42:30 +00002761
Guido van Rossumb18618d2000-05-03 23:44:39 +00002762 if (k != NULL)
2763 PyMem_DEL(k);
Guido van Rossumac7be682001-01-17 15:42:30 +00002764
Guido van Rossum681d79a1995-07-18 14:51:37 +00002765 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002766}
2767
Jeremy Hylton52820442001-01-03 23:52:36 +00002768#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
2769
2770/* The two fast_xxx() functions optimize calls for which no argument
2771 tuple is necessary; the objects are passed directly from the stack.
2772 fast_cfunction() is called for METH_OLDARGS functions.
2773 fast_function() is for functions with no special argument handling.
2774*/
2775
2776static PyObject *
2777fast_cfunction(PyObject *func, PyObject ***pp_stack, int na)
2778{
2779 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
2780 PyObject *self = PyCFunction_GET_SELF(func);
2781
2782 if (na == 0)
2783 return (*meth)(self, NULL);
Charles G. Waldmaneec72a72001-01-10 22:11:59 +00002784 else if (na == 1) {
2785 PyObject *arg = EXT_POP(*pp_stack);
Guido van Rossumac7be682001-01-17 15:42:30 +00002786 PyObject *result = (*meth)(self, arg);
Charles G. Waldmaneec72a72001-01-10 22:11:59 +00002787 Py_DECREF(arg);
2788 return result;
2789 } else {
Jeremy Hylton52820442001-01-03 23:52:36 +00002790 PyObject *args = load_args(pp_stack, na);
2791 PyObject *result = (*meth)(self, args);
2792 Py_DECREF(args);
2793 return result;
2794 }
2795}
2796
2797static PyObject *
Guido van Rossumac7be682001-01-17 15:42:30 +00002798fast_function(PyObject *func, PyObject ***pp_stack, int n, int na, int nk)
Jeremy Hylton52820442001-01-03 23:52:36 +00002799{
2800 PyObject *co = PyFunction_GET_CODE(func);
2801 PyObject *globals = PyFunction_GET_GLOBALS(func);
2802 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
2803 PyObject **d = NULL;
2804 int nd = 0;
2805
2806 if (argdefs != NULL) {
2807 d = &PyTuple_GET_ITEM(argdefs, 0);
2808 nd = ((PyTupleObject *)argdefs)->ob_size;
2809 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002810 return eval_code2((PyCodeObject *)co, globals,
Jeremy Hylton52820442001-01-03 23:52:36 +00002811 (PyObject *)NULL, (*pp_stack)-n, na,
2812 (*pp_stack)-2*nk, nk, d, nd);
2813}
2814
2815static PyObject *
Ka-Ping Yee20579702001-01-15 22:14:16 +00002816update_keyword_args(PyObject *orig_kwdict, int nk, PyObject ***pp_stack,
2817 PyObject *func)
Jeremy Hylton52820442001-01-03 23:52:36 +00002818{
2819 PyObject *kwdict = NULL;
2820 if (orig_kwdict == NULL)
2821 kwdict = PyDict_New();
2822 else {
2823 kwdict = PyDict_Copy(orig_kwdict);
2824 Py_DECREF(orig_kwdict);
2825 }
2826 if (kwdict == NULL)
2827 return NULL;
2828 while (--nk >= 0) {
2829 int err;
2830 PyObject *value = EXT_POP(*pp_stack);
2831 PyObject *key = EXT_POP(*pp_stack);
2832 if (PyDict_GetItem(kwdict, key) != NULL) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00002833 PyObject* fn = ((PyFunctionObject*) func)->func_name;
Guido van Rossumac7be682001-01-17 15:42:30 +00002834 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +00002835 "%.200s%s got multiple values "
2836 "for keyword argument '%.400s'",
2837 fn ? PyString_AsString(fn) : "function",
2838 fn ? "()" : "", PyString_AsString(key));
Jeremy Hylton52820442001-01-03 23:52:36 +00002839 Py_DECREF(key);
2840 Py_DECREF(value);
2841 Py_DECREF(kwdict);
2842 return NULL;
2843 }
2844 err = PyDict_SetItem(kwdict, key, value);
2845 Py_DECREF(key);
2846 Py_DECREF(value);
2847 if (err) {
2848 Py_DECREF(kwdict);
2849 return NULL;
2850 }
2851 }
2852 return kwdict;
2853}
2854
2855static PyObject *
2856update_star_args(int nstack, int nstar, PyObject *stararg,
2857 PyObject ***pp_stack)
2858{
2859 PyObject *callargs, *w;
2860
2861 callargs = PyTuple_New(nstack + nstar);
2862 if (callargs == NULL) {
2863 return NULL;
2864 }
2865 if (nstar) {
2866 int i;
2867 for (i = 0; i < nstar; i++) {
2868 PyObject *a = PyTuple_GET_ITEM(stararg, i);
2869 Py_INCREF(a);
2870 PyTuple_SET_ITEM(callargs, nstack + i, a);
2871 }
2872 }
2873 while (--nstack >= 0) {
2874 w = EXT_POP(*pp_stack);
2875 PyTuple_SET_ITEM(callargs, nstack, w);
2876 }
2877 return callargs;
2878}
2879
2880static PyObject *
2881load_args(PyObject ***pp_stack, int na)
2882{
2883 PyObject *args = PyTuple_New(na);
2884 PyObject *w;
2885
2886 if (args == NULL)
2887 return NULL;
2888 while (--na >= 0) {
2889 w = EXT_POP(*pp_stack);
2890 PyTuple_SET_ITEM(args, na, w);
2891 }
2892 return args;
2893}
2894
2895static PyObject *
2896do_call(PyObject *func, PyObject ***pp_stack, int na, int nk)
2897{
2898 PyObject *callargs = NULL;
2899 PyObject *kwdict = NULL;
2900 PyObject *result = NULL;
2901
2902 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00002903 kwdict = update_keyword_args(NULL, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00002904 if (kwdict == NULL)
2905 goto call_fail;
2906 }
2907 callargs = load_args(pp_stack, na);
2908 if (callargs == NULL)
2909 goto call_fail;
2910 result = call_object(func, callargs, kwdict);
2911 call_fail:
2912 Py_XDECREF(callargs);
2913 Py_XDECREF(kwdict);
2914 return result;
2915}
2916
2917static PyObject *
2918ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)
2919{
2920 int nstar = 0;
2921 PyObject *callargs = NULL;
2922 PyObject *stararg = NULL;
2923 PyObject *kwdict = NULL;
2924 PyObject *result = NULL;
2925
2926 if (flags & CALL_FLAG_KW) {
2927 kwdict = EXT_POP(*pp_stack);
2928 if (!(kwdict && PyDict_Check(kwdict))) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00002929 PyObject* fn = ((PyFunctionObject*) func)->func_name;
2930 PyErr_Format(PyExc_TypeError,
2931 "%s%s argument after ** must be a dictionary",
2932 fn ? PyString_AsString(fn) : "function",
2933 fn ? "()" : "");
Jeremy Hylton52820442001-01-03 23:52:36 +00002934 goto ext_call_fail;
2935 }
2936 }
2937 if (flags & CALL_FLAG_VAR) {
2938 stararg = EXT_POP(*pp_stack);
2939 if (!PyTuple_Check(stararg)) {
2940 PyObject *t = NULL;
2941 t = PySequence_Tuple(stararg);
2942 if (t == NULL) {
2943 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00002944 PyObject* fn =
2945 ((PyFunctionObject*) func)->func_name;
2946 PyErr_Format(PyExc_TypeError,
2947 "%s%s argument after * must be a sequence",
2948 fn ? PyString_AsString(fn) : "function",
2949 fn ? "()" : "");
Jeremy Hylton52820442001-01-03 23:52:36 +00002950 }
2951 goto ext_call_fail;
2952 }
2953 Py_DECREF(stararg);
2954 stararg = t;
2955 }
2956 nstar = PyTuple_GET_SIZE(stararg);
2957 }
2958 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00002959 kwdict = update_keyword_args(kwdict, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00002960 if (kwdict == NULL)
2961 goto ext_call_fail;
2962 }
2963 callargs = update_star_args(na, nstar, stararg, pp_stack);
2964 if (callargs == NULL)
2965 goto ext_call_fail;
2966 result = call_object(func, callargs, kwdict);
2967 ext_call_fail:
2968 Py_XDECREF(callargs);
2969 Py_XDECREF(kwdict);
2970 Py_XDECREF(stararg);
2971 return result;
2972}
2973
Guido van Rossum3b9c6671996-07-30 18:40:29 +00002974#define SLICE_ERROR_MSG \
2975 "standard sequence type does not support step size other than one"
2976
Guido van Rossumb209a111997-04-29 18:18:01 +00002977static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002978loop_subscript(PyObject *v, PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002979{
Guido van Rossumb209a111997-04-29 18:18:01 +00002980 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00002981 int i;
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00002982 if (sq == NULL || sq->sq_item == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002983 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002984 return NULL;
2985 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002986 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00002987 v = (*sq->sq_item)(v, i);
2988 if (v)
2989 return v;
Barry Warsaw4249f541997-08-22 21:26:19 +00002990 if (PyErr_ExceptionMatches(PyExc_IndexError))
Guido van Rossumb209a111997-04-29 18:18:01 +00002991 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00002992 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002993}
2994
Guido van Rossum20c6add2000-05-08 14:06:50 +00002995/* Extract a slice index from a PyInt or PyLong, the index is bound to
2996 the range [-INT_MAX+1, INTMAX]. Returns 0 and an exception if there is
2997 and error. Returns 1 on success.*/
2998
2999int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003000_PyEval_SliceIndex(PyObject *v, int *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003001{
3002 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003003 long x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003004 if (PyInt_Check(v)) {
3005 x = PyInt_AsLong(v);
3006 } else if (PyLong_Check(v)) {
3007 x = PyLong_AsLong(v);
3008 if (x==-1 && PyErr_Occurred()) {
3009 PyObject *long_zero;
Guido van Rossumac7be682001-01-17 15:42:30 +00003010 int cmp;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003011
Guido van Rossumac7be682001-01-17 15:42:30 +00003012 if (!PyErr_ExceptionMatches(
3013 PyExc_OverflowError)) {
3014 /* It's not an overflow error, so just
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003015 signal an error */
Guido van Rossum20c6add2000-05-08 14:06:50 +00003016 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003017 }
3018
Guido van Rossumac7be682001-01-17 15:42:30 +00003019 /* Clear the OverflowError */
3020 PyErr_Clear();
3021
3022 /* It's an overflow error, so we need to
3023 check the sign of the long integer,
3024 set the value to INT_MAX or 0, and clear
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003025 the error. */
3026
3027 /* Create a long integer with a value of 0 */
Guido van Rossumac7be682001-01-17 15:42:30 +00003028 long_zero = PyLong_FromLong(0L);
Guido van Rossum20c6add2000-05-08 14:06:50 +00003029 if (long_zero == NULL) return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003030
3031 /* Check sign */
Guido van Rossumac7be682001-01-17 15:42:30 +00003032 cmp = PyObject_RichCompareBool(v, long_zero,
3033 Py_GT);
3034 Py_DECREF(long_zero);
3035 if (cmp < 0)
3036 return 0;
3037 else if (cmp > 0)
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003038 x = INT_MAX;
3039 else
3040 x = 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003041 }
3042 } else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003043 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003044 "slice indices must be integers");
Guido van Rossum20c6add2000-05-08 14:06:50 +00003045 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003046 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00003047 /* Truncate -- very long indices are truncated anyway */
3048 if (x > INT_MAX)
3049 x = INT_MAX;
3050 else if (x < -INT_MAX)
3051 x = 0;
3052 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003053 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00003054 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003055}
3056
Guido van Rossumb209a111997-04-29 18:18:01 +00003057static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003058apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003059{
Guido van Rossuma027efa1997-05-05 20:56:21 +00003060 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003061 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003062 return NULL;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003063 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum04691fc1992-08-12 15:35:34 +00003064 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00003065 return PySequence_GetSlice(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003066}
Guido van Rossum3f5da241990-12-20 15:06:42 +00003067
3068static int
Guido van Rossumac7be682001-01-17 15:42:30 +00003069assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x)
3070 /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003071{
Guido van Rossuma027efa1997-05-05 20:56:21 +00003072 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003073 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum3f5da241990-12-20 15:06:42 +00003074 return -1;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003075 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum3f5da241990-12-20 15:06:42 +00003076 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00003077 if (x == NULL)
3078 return PySequence_DelSlice(u, ilow, ihigh);
3079 else
3080 return PySequence_SetSlice(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003081}
3082
Guido van Rossumb209a111997-04-29 18:18:01 +00003083static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003084cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003085{
Guido van Rossumac7be682001-01-17 15:42:30 +00003086 int res = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003087 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00003088 case IS:
3089 case IS_NOT:
3090 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00003091 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003092 res = !res;
3093 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003094 case IN:
3095 case NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003096 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003097 if (res < 0)
3098 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00003099 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003100 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003101 break;
3102 case EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00003103 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003104 break;
3105 default:
Guido van Rossumac7be682001-01-17 15:42:30 +00003106 return PyObject_RichCompare(v, w, op);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003107 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003108 v = res ? Py_True : Py_False;
3109 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003110 return v;
3111}
3112
Thomas Wouters52152252000-08-17 22:55:00 +00003113static PyObject *
3114import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003115{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003116 PyObject *x;
3117
3118 x = PyObject_GetAttr(v, name);
3119 if (x == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
Thomas Wouters52152252000-08-17 22:55:00 +00003120 PyErr_Format(PyExc_ImportError,
3121 "cannot import name %.230s",
3122 PyString_AsString(name));
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003123 }
Thomas Wouters52152252000-08-17 22:55:00 +00003124 return x;
3125}
Guido van Rossumac7be682001-01-17 15:42:30 +00003126
Thomas Wouters52152252000-08-17 22:55:00 +00003127static int
3128import_all_from(PyObject *locals, PyObject *v)
3129{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003130 PyObject *all = PyObject_GetAttrString(v, "__all__");
3131 PyObject *dict, *name, *value;
3132 int skip_leading_underscores = 0;
3133 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00003134
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003135 if (all == NULL) {
3136 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3137 return -1; /* Unexpected error */
3138 PyErr_Clear();
3139 dict = PyObject_GetAttrString(v, "__dict__");
3140 if (dict == NULL) {
3141 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3142 return -1;
3143 PyErr_SetString(PyExc_ImportError,
3144 "from-import-* object has no __dict__ and no __all__");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003145 return -1;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003146 }
3147 all = PyMapping_Keys(dict);
3148 Py_DECREF(dict);
3149 if (all == NULL)
3150 return -1;
3151 skip_leading_underscores = 1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003152 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003153
3154 for (pos = 0, err = 0; ; pos++) {
3155 name = PySequence_GetItem(all, pos);
3156 if (name == NULL) {
3157 if (!PyErr_ExceptionMatches(PyExc_IndexError))
3158 err = -1;
3159 else
3160 PyErr_Clear();
3161 break;
3162 }
3163 if (skip_leading_underscores &&
3164 PyString_Check(name) &&
3165 PyString_AS_STRING(name)[0] == '_')
3166 {
3167 Py_DECREF(name);
3168 continue;
3169 }
3170 value = PyObject_GetAttr(v, name);
3171 if (value == NULL)
3172 err = -1;
3173 else
3174 err = PyDict_SetItem(locals, name, value);
3175 Py_DECREF(name);
3176 Py_XDECREF(value);
3177 if (err != 0)
3178 break;
3179 }
3180 Py_DECREF(all);
3181 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003182}
3183
Guido van Rossumb209a111997-04-29 18:18:01 +00003184static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003185build_class(PyObject *methods, PyObject *bases, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003186{
Guido van Rossumcd649651997-08-22 16:56:16 +00003187 int i, n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003188 if (!PyTuple_Check(bases)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003189 PyErr_SetString(PyExc_SystemError,
3190 "build_class with non-tuple bases");
Guido van Rossum25831651993-05-19 14:50:45 +00003191 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003192 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003193 if (!PyDict_Check(methods)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003194 PyErr_SetString(PyExc_SystemError,
3195 "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00003196 return NULL;
3197 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003198 if (!PyString_Check(name)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003199 PyErr_SetString(PyExc_SystemError,
Guido van Rossum7a5b7962000-03-31 13:52:29 +00003200 "build_class with non-string name");
Guido van Rossum25831651993-05-19 14:50:45 +00003201 return NULL;
3202 }
Guido van Rossumcd649651997-08-22 16:56:16 +00003203 n = PyTuple_Size(bases);
3204 for (i = 0; i < n; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003205 PyObject *base = PyTuple_GET_ITEM(bases, i);
3206 if (!PyClass_Check(base)) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00003207 /* Call the base's *type*, if it is callable.
3208 This code is a hook for Donald Beaudry's
3209 and Jim Fulton's type extensions. In
Thomas Wouters7e474022000-07-16 12:04:32 +00003210 unextended Python it will never be triggered
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003211 since its types are not callable.
3212 Ditto: call the bases's *class*, if it has
3213 one. This makes the same thing possible
3214 without writing C code. A true meta-object
3215 protocol! */
3216 PyObject *basetype = (PyObject *)base->ob_type;
3217 PyObject *callable = NULL;
3218 if (PyCallable_Check(basetype))
3219 callable = basetype;
3220 else
3221 callable = PyObject_GetAttrString(
3222 base, "__class__");
3223 if (callable) {
3224 PyObject *args;
3225 PyObject *newclass = NULL;
3226 args = Py_BuildValue(
3227 "(OOO)", name, bases, methods);
3228 if (args != NULL) {
3229 newclass = PyEval_CallObject(
3230 callable, args);
3231 Py_DECREF(args);
3232 }
Guido van Rossum730806d1998-04-10 22:27:42 +00003233 if (callable != basetype) {
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003234 Py_DECREF(callable);
Guido van Rossum730806d1998-04-10 22:27:42 +00003235 }
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003236 return newclass;
Guido van Rossum150b2df1996-12-05 23:17:11 +00003237 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003238 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +00003239 "base is not a class object");
3240 return NULL;
3241 }
3242 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003243 return PyClass_New(bases, methods, name);
Guido van Rossum25831651993-05-19 14:50:45 +00003244}
3245
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003246static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003247exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
3248 PyObject *locals)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003249{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003250 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003251 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003252 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003253
Guido van Rossumb209a111997-04-29 18:18:01 +00003254 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
3255 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003256 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00003257 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003258 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00003259 locals = PyTuple_GetItem(prog, 2);
3260 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003261 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003262 if (globals == Py_None) {
3263 globals = PyEval_GetGlobals();
3264 if (locals == Py_None) {
3265 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003266 plain = 1;
3267 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003268 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003269 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003270 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00003271 if (!PyString_Check(prog) &&
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003272 !PyUnicode_Check(prog) &&
Guido van Rossumb209a111997-04-29 18:18:01 +00003273 !PyCode_Check(prog) &&
3274 !PyFile_Check(prog)) {
3275 PyErr_SetString(PyExc_TypeError,
Guido van Rossumac7be682001-01-17 15:42:30 +00003276 "exec: arg 1 must be a string, file, or code object");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003277 return -1;
3278 }
Fred Drake661ea262000-10-24 19:57:45 +00003279 if (!PyDict_Check(globals)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003280 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003281 "exec: arg 2 must be a dictionary or None");
3282 return -1;
3283 }
3284 if (!PyDict_Check(locals)) {
3285 PyErr_SetString(PyExc_TypeError,
3286 "exec: arg 3 must be a dictionary or None");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003287 return -1;
3288 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003289 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00003290 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00003291 if (PyCode_Check(prog)) {
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003292 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003293 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003294 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003295 FILE *fp = PyFile_AsFile(prog);
3296 char *name = PyString_AsString(PyFile_Name(prog));
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003297 v = PyRun_File(fp, name, Py_file_input, globals, locals);
3298 }
3299 else {
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003300 char *str;
3301 if (PyString_AsStringAndSize(prog, &str, NULL))
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003302 return -1;
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003303 v = PyRun_String(str, Py_file_input, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003304 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003305 if (plain)
3306 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003307 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003308 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00003309 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003310 return 0;
3311}
Guido van Rossum24c13741995-02-14 09:42:43 +00003312
Guido van Rossumac7be682001-01-17 15:42:30 +00003313static void
Paul Prescode68140d2000-08-30 20:25:01 +00003314format_exc_check_arg(PyObject *exc, char *format_str, PyObject *obj)
3315{
3316 char *obj_str;
3317
3318 if (!obj)
3319 return;
3320
3321 obj_str = PyString_AsString(obj);
3322 if (!obj_str)
3323 return;
3324
3325 PyErr_Format(exc, format_str, obj_str);
3326}
Guido van Rossum950361c1997-01-24 13:49:28 +00003327
3328#ifdef DYNAMIC_EXECUTION_PROFILE
3329
3330PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003331getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00003332{
3333 int i;
3334 PyObject *l = PyList_New(256);
3335 if (l == NULL) return NULL;
3336 for (i = 0; i < 256; i++) {
3337 PyObject *x = PyInt_FromLong(a[i]);
3338 if (x == NULL) {
3339 Py_DECREF(l);
3340 return NULL;
3341 }
3342 PyList_SetItem(l, i, x);
3343 }
3344 for (i = 0; i < 256; i++)
3345 a[i] = 0;
3346 return l;
3347}
3348
3349PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003350_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00003351{
3352#ifndef DXPAIRS
3353 return getarray(dxp);
3354#else
3355 int i;
3356 PyObject *l = PyList_New(257);
3357 if (l == NULL) return NULL;
3358 for (i = 0; i < 257; i++) {
3359 PyObject *x = getarray(dxpairs[i]);
3360 if (x == NULL) {
3361 Py_DECREF(l);
3362 return NULL;
3363 }
3364 PyList_SetItem(l, i, x);
3365 }
3366 return l;
3367#endif
3368}
3369
3370#endif