blob: d2cda84f0bf8f7de7319da538a4bd0eb88afa01f [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:
Guido van Rossum681d79a1995-07-18 14:51:37 +00005 XXX speed up searching for keywords by using a dictionary
Guido van Rossum681d79a1995-07-18 14:51:37 +00006 XXX document it!
7 */
8
Thomas Wouters477c8d52006-05-27 19:21:47 +00009/* enable more aggressive intra-module optimizations, where available */
10#define PY_LOCAL_AGGRESSIVE
11
Guido van Rossumb209a111997-04-29 18:18:01 +000012#include "Python.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000013
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000014#include "code.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000015#include "frameobject.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000016#include "eval.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000017#include "opcode.h"
Tim Peters6d6c1a32001-08-02 04:15:00 +000018#include "structmember.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000019
Guido van Rossumc6004111993-11-05 10:22:19 +000020#include <ctype.h>
21
Thomas Wouters477c8d52006-05-27 19:21:47 +000022#ifndef WITH_TSC
Michael W. Hudson75eabd22005-01-18 15:56:11 +000023
24#define READ_TIMESTAMP(var)
25
26#else
Martin v. Löwisf30d60e2004-06-08 08:17:44 +000027
28typedef unsigned long long uint64;
29
Michael W. Hudson800ba232004-08-12 18:19:17 +000030#if defined(__ppc__) /* <- Don't know if this is the correct symbol; this
31 section should work for GCC on any PowerPC platform,
32 irrespective of OS. POWER? Who knows :-) */
33
Michael W. Hudson75eabd22005-01-18 15:56:11 +000034#define READ_TIMESTAMP(var) ppc_getcounter(&var)
Michael W. Hudson800ba232004-08-12 18:19:17 +000035
36static void
37ppc_getcounter(uint64 *v)
38{
39 register unsigned long tbu, tb, tbu2;
40
41 loop:
42 asm volatile ("mftbu %0" : "=r" (tbu) );
43 asm volatile ("mftb %0" : "=r" (tb) );
44 asm volatile ("mftbu %0" : "=r" (tbu2));
45 if (__builtin_expect(tbu != tbu2, 0)) goto loop;
46
Thomas Wouters477c8d52006-05-27 19:21:47 +000047 /* The slightly peculiar way of writing the next lines is
Michael W. Hudson800ba232004-08-12 18:19:17 +000048 compiled better by GCC than any other way I tried. */
49 ((long*)(v))[0] = tbu;
50 ((long*)(v))[1] = tb;
51}
52
Michael W. Hudson75eabd22005-01-18 15:56:11 +000053#else /* this is for linux/x86 (and probably any other GCC/x86 combo) */
Michael W. Hudson800ba232004-08-12 18:19:17 +000054
Michael W. Hudson75eabd22005-01-18 15:56:11 +000055#define READ_TIMESTAMP(val) \
56 __asm__ __volatile__("rdtsc" : "=A" (val))
Michael W. Hudson800ba232004-08-12 18:19:17 +000057
58#endif
59
Thomas Wouters477c8d52006-05-27 19:21:47 +000060void dump_tsc(int opcode, int ticked, uint64 inst0, uint64 inst1,
Martin v. Löwisf30d60e2004-06-08 08:17:44 +000061 uint64 loop0, uint64 loop1, uint64 intr0, uint64 intr1)
62{
63 uint64 intr, inst, loop;
64 PyThreadState *tstate = PyThreadState_Get();
65 if (!tstate->interp->tscdump)
66 return;
67 intr = intr1 - intr0;
68 inst = inst1 - inst0 - intr;
69 loop = loop1 - loop0 - intr;
70 fprintf(stderr, "opcode=%03d t=%d inst=%06lld loop=%06lld\n",
71 opcode, ticked, inst, loop);
72}
Michael W. Hudson800ba232004-08-12 18:19:17 +000073
Martin v. Löwisf30d60e2004-06-08 08:17:44 +000074#endif
75
Guido van Rossum04691fc1992-08-12 15:35:34 +000076/* Turn this on if your compiler chokes on the big switch: */
Guido van Rossum1ae940a1995-01-02 19:04:15 +000077/* #define CASE_TOO_BIG 1 */
Guido van Rossum04691fc1992-08-12 15:35:34 +000078
Guido van Rossum408027e1996-12-30 16:17:54 +000079#ifdef Py_DEBUG
Guido van Rossum96a42c81992-01-12 02:29:51 +000080/* For debugging the interpreter: */
81#define LLTRACE 1 /* Low-level trace feature */
82#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000083#endif
84
Jeremy Hylton52820442001-01-03 23:52:36 +000085typedef PyObject *(*callproc)(PyObject *, PyObject *, PyObject *);
Guido van Rossum5b722181993-03-30 17:46:03 +000086
Guido van Rossum374a9221991-04-04 10:40:29 +000087/* Forward declarations */
Martin v. Löwisf30d60e2004-06-08 08:17:44 +000088#ifdef WITH_TSC
Thomas Wouters477c8d52006-05-27 19:21:47 +000089static PyObject * call_function(PyObject ***, int, uint64*, uint64*);
Martin v. Löwisf30d60e2004-06-08 08:17:44 +000090#else
Thomas Wouters477c8d52006-05-27 19:21:47 +000091static PyObject * call_function(PyObject ***, int);
Martin v. Löwisf30d60e2004-06-08 08:17:44 +000092#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +000093static PyObject * fast_function(PyObject *, PyObject ***, int, int, int);
94static PyObject * do_call(PyObject *, PyObject ***, int, int);
95static PyObject * ext_do_call(PyObject *, PyObject ***, int, int, int);
96static PyObject * update_keyword_args(PyObject *, int, PyObject ***,PyObject *);
97static PyObject * update_star_args(int, int, PyObject *, PyObject ***);
98static PyObject * load_args(PyObject ***, int);
Jeremy Hylton52820442001-01-03 23:52:36 +000099#define CALL_FLAG_VAR 1
100#define CALL_FLAG_KW 2
101
Guido van Rossum0a066c01992-03-27 17:29:15 +0000102#ifdef LLTRACE
Guido van Rossumc2e20742006-02-27 22:32:47 +0000103static int lltrace;
Tim Petersdbd9ba62000-07-09 03:09:57 +0000104static int prtrace(PyObject *, char *);
Guido van Rossum0a066c01992-03-27 17:29:15 +0000105#endif
Fred Drake5755ce62001-06-27 19:19:46 +0000106static int call_trace(Py_tracefunc, PyObject *, PyFrameObject *,
107 int, PyObject *);
Fred Drake4ec5d562001-10-04 19:26:43 +0000108static void call_trace_protected(Py_tracefunc, PyObject *,
Armin Rigo1c2d7e52005-09-20 18:34:01 +0000109 PyFrameObject *, int, PyObject *);
Fred Drake5755ce62001-06-27 19:19:46 +0000110static void call_exc_trace(Py_tracefunc, PyObject *, PyFrameObject *);
Tim Peters8a5c3c72004-04-05 19:36:21 +0000111static int maybe_call_line_trace(Py_tracefunc, PyObject *,
Armin Rigobf57a142004-03-22 19:24:58 +0000112 PyFrameObject *, int *, int *, int *);
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000113
Thomas Wouters477c8d52006-05-27 19:21:47 +0000114static PyObject * apply_slice(PyObject *, PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000115static int assign_slice(PyObject *, PyObject *,
116 PyObject *, PyObject *);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000117static PyObject * cmp_outcome(int, PyObject *, PyObject *);
118static PyObject * import_from(PyObject *, PyObject *);
Thomas Wouters52152252000-08-17 22:55:00 +0000119static int import_all_from(PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000120static void set_exc_info(PyThreadState *, PyObject *, PyObject *, PyObject *);
121static void reset_exc_info(PyThreadState *);
Paul Prescode68140d2000-08-30 20:25:01 +0000122static void format_exc_check_arg(PyObject *, char *, PyObject *);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000123static PyObject * string_concatenate(PyObject *, PyObject *,
Raymond Hettinger52a21b82004-08-06 18:43:09 +0000124 PyFrameObject *, unsigned char *);
Guido van Rossum374a9221991-04-04 10:40:29 +0000125
Paul Prescode68140d2000-08-30 20:25:01 +0000126#define NAME_ERROR_MSG \
Fred Drake661ea262000-10-24 19:57:45 +0000127 "name '%.200s' is not defined"
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000128#define GLOBAL_NAME_ERROR_MSG \
129 "global name '%.200s' is not defined"
Paul Prescode68140d2000-08-30 20:25:01 +0000130#define UNBOUNDLOCAL_ERROR_MSG \
Fred Drake661ea262000-10-24 19:57:45 +0000131 "local variable '%.200s' referenced before assignment"
Jeremy Hyltonc76770c2001-04-13 16:51:46 +0000132#define UNBOUNDFREE_ERROR_MSG \
133 "free variable '%.200s' referenced before assignment" \
134 " in enclosing scope"
Guido van Rossum374a9221991-04-04 10:40:29 +0000135
Guido van Rossum950361c1997-01-24 13:49:28 +0000136/* Dynamic execution profile */
137#ifdef DYNAMIC_EXECUTION_PROFILE
138#ifdef DXPAIRS
139static long dxpairs[257][256];
140#define dxp dxpairs[256]
141#else
142static long dxp[256];
143#endif
144#endif
145
Jeremy Hylton985eba52003-02-05 23:13:00 +0000146/* Function call profile */
147#ifdef CALL_PROFILE
148#define PCALL_NUM 11
149static int pcall[PCALL_NUM];
150
151#define PCALL_ALL 0
152#define PCALL_FUNCTION 1
153#define PCALL_FAST_FUNCTION 2
154#define PCALL_FASTER_FUNCTION 3
155#define PCALL_METHOD 4
156#define PCALL_BOUND_METHOD 5
157#define PCALL_CFUNCTION 6
158#define PCALL_TYPE 7
159#define PCALL_GENERATOR 8
160#define PCALL_OTHER 9
161#define PCALL_POP 10
162
163/* Notes about the statistics
164
165 PCALL_FAST stats
166
167 FAST_FUNCTION means no argument tuple needs to be created.
168 FASTER_FUNCTION means that the fast-path frame setup code is used.
169
170 If there is a method call where the call can be optimized by changing
171 the argument tuple and calling the function directly, it gets recorded
172 twice.
173
174 As a result, the relationship among the statistics appears to be
175 PCALL_ALL == PCALL_FUNCTION + PCALL_METHOD - PCALL_BOUND_METHOD +
176 PCALL_CFUNCTION + PCALL_TYPE + PCALL_GENERATOR + PCALL_OTHER
177 PCALL_FUNCTION > PCALL_FAST_FUNCTION > PCALL_FASTER_FUNCTION
178 PCALL_METHOD > PCALL_BOUND_METHOD
179*/
180
181#define PCALL(POS) pcall[POS]++
182
183PyObject *
184PyEval_GetCallStats(PyObject *self)
185{
Thomas Wouters89f507f2006-12-13 04:49:30 +0000186 return Py_BuildValue("iiiiiiiiiii",
Jeremy Hylton985eba52003-02-05 23:13:00 +0000187 pcall[0], pcall[1], pcall[2], pcall[3],
188 pcall[4], pcall[5], pcall[6], pcall[7],
Thomas Wouters89f507f2006-12-13 04:49:30 +0000189 pcall[8], pcall[9], pcall[10]);
Jeremy Hylton985eba52003-02-05 23:13:00 +0000190}
191#else
192#define PCALL(O)
193
194PyObject *
195PyEval_GetCallStats(PyObject *self)
196{
197 Py_INCREF(Py_None);
198 return Py_None;
199}
200#endif
201
Tim Peters5ca576e2001-06-18 22:08:13 +0000202
Guido van Rossume59214e1994-08-30 08:01:59 +0000203#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000204
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000205#ifdef HAVE_ERRNO_H
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000206#include <errno.h>
Guido van Rossum2571cc81999-04-07 16:07:23 +0000207#endif
Guido van Rossum49b56061998-10-01 20:42:43 +0000208#include "pythread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000209
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000210static PyThread_type_lock interpreter_lock = 0; /* This is the GIL */
Guido van Rossuma9672091994-09-14 13:31:22 +0000211static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000212
Tim Peters7f468f22004-10-11 02:40:51 +0000213int
214PyEval_ThreadsInitialized(void)
215{
216 return interpreter_lock != 0;
217}
218
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000219void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000220PyEval_InitThreads(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000221{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000222 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000223 return;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000224 interpreter_lock = PyThread_allocate_lock();
225 PyThread_acquire_lock(interpreter_lock, 1);
226 main_thread = PyThread_get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000227}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000228
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000229void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000230PyEval_AcquireLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000231{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000232 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000233}
234
235void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000236PyEval_ReleaseLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000237{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000238 PyThread_release_lock(interpreter_lock);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000239}
240
241void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000242PyEval_AcquireThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000243{
244 if (tstate == NULL)
245 Py_FatalError("PyEval_AcquireThread: NULL new thread state");
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000246 /* Check someone has called PyEval_InitThreads() to create the lock */
247 assert(interpreter_lock);
Guido van Rossum65d5b571998-12-21 19:32:43 +0000248 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000249 if (PyThreadState_Swap(tstate) != NULL)
250 Py_FatalError(
251 "PyEval_AcquireThread: non-NULL old thread state");
252}
253
254void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000255PyEval_ReleaseThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000256{
257 if (tstate == NULL)
258 Py_FatalError("PyEval_ReleaseThread: NULL thread state");
259 if (PyThreadState_Swap(NULL) != tstate)
260 Py_FatalError("PyEval_ReleaseThread: wrong thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000261 PyThread_release_lock(interpreter_lock);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000262}
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000263
264/* This function is called from PyOS_AfterFork to ensure that newly
265 created child processes don't hold locks referring to threads which
266 are not running in the child process. (This could also be done using
267 pthread_atfork mechanism, at least for the pthreads implementation.) */
268
269void
270PyEval_ReInitThreads(void)
271{
272 if (!interpreter_lock)
273 return;
274 /*XXX Can't use PyThread_free_lock here because it does too
275 much error-checking. Doing this cleanly would require
276 adding a new function to each thread_*.h. Instead, just
277 create a new lock and waste a little bit of memory */
278 interpreter_lock = PyThread_allocate_lock();
279 PyThread_acquire_lock(interpreter_lock, 1);
280 main_thread = PyThread_get_thread_ident();
281}
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000282#endif
283
Guido van Rossumff4949e1992-08-05 19:58:53 +0000284/* Functions save_thread and restore_thread are always defined so
285 dynamically loaded modules needn't be compiled separately for use
286 with and without threads: */
287
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000288PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000289PyEval_SaveThread(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000290{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000291 PyThreadState *tstate = PyThreadState_Swap(NULL);
292 if (tstate == NULL)
293 Py_FatalError("PyEval_SaveThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000294#ifdef WITH_THREAD
Guido van Rossumb74eca91997-09-30 22:03:16 +0000295 if (interpreter_lock)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000296 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000297#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000298 return tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000299}
300
301void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000302PyEval_RestoreThread(PyThreadState *tstate)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000303{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000304 if (tstate == NULL)
305 Py_FatalError("PyEval_RestoreThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000306#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000307 if (interpreter_lock) {
Guido van Rossumb74eca91997-09-30 22:03:16 +0000308 int err = errno;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000309 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000310 errno = err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000311 }
312#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000313 PyThreadState_Swap(tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000314}
315
316
Guido van Rossuma9672091994-09-14 13:31:22 +0000317/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
318 signal handlers or Mac I/O completion routines) can schedule calls
319 to a function to be called synchronously.
320 The synchronous function is called with one void* argument.
321 It should return 0 for success or -1 for failure -- failure should
322 be accompanied by an exception.
323
324 If registry succeeds, the registry function returns 0; if it fails
325 (e.g. due to too many pending calls) it returns -1 (without setting
326 an exception condition).
327
328 Note that because registry may occur from within signal handlers,
329 or other asynchronous events, calling malloc() is unsafe!
330
331#ifdef WITH_THREAD
332 Any thread can schedule pending calls, but only the main thread
333 will execute them.
334#endif
335
336 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
337 There are two possible race conditions:
338 (1) nested asynchronous registry calls;
339 (2) registry calls made while pending calls are being processed.
340 While (1) is very unlikely, (2) is a real possibility.
341 The current code is safe against (2), but not against (1).
342 The safety against (2) is derived from the fact that only one
343 thread (the main thread) ever takes things out of the queue.
Guido van Rossuma9672091994-09-14 13:31:22 +0000344
Guido van Rossuma027efa1997-05-05 20:56:21 +0000345 XXX Darn! With the advent of thread state, we should have an array
346 of pending calls per thread in the thread state! Later...
347*/
Guido van Rossum8861b741996-07-30 16:49:37 +0000348
Guido van Rossuma9672091994-09-14 13:31:22 +0000349#define NPENDINGCALLS 32
350static struct {
Thomas Wouters334fb892000-07-25 12:56:38 +0000351 int (*func)(void *);
352 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000353} pendingcalls[NPENDINGCALLS];
354static volatile int pendingfirst = 0;
355static volatile int pendinglast = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000356static volatile int things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000357
358int
Thomas Wouters334fb892000-07-25 12:56:38 +0000359Py_AddPendingCall(int (*func)(void *), void *arg)
Guido van Rossuma9672091994-09-14 13:31:22 +0000360{
Michael W. Hudson30ea2f22004-07-07 17:44:12 +0000361 static volatile int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000362 int i, j;
363 /* XXX Begin critical section */
364 /* XXX If you want this to be safe against nested
365 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000366 if (busy)
367 return -1;
368 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000369 i = pendinglast;
370 j = (i + 1) % NPENDINGCALLS;
Guido van Rossum04e70322002-07-17 16:57:13 +0000371 if (j == pendingfirst) {
372 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000373 return -1; /* Queue full */
Guido van Rossum04e70322002-07-17 16:57:13 +0000374 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000375 pendingcalls[i].func = func;
376 pendingcalls[i].arg = arg;
377 pendinglast = j;
Skip Montanarod581d772002-09-03 20:10:45 +0000378
379 _Py_Ticker = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000380 things_to_do = 1; /* Signal main loop */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000381 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000382 /* XXX End critical section */
383 return 0;
384}
385
Guido van Rossum180d7b41994-09-29 09:45:57 +0000386int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000387Py_MakePendingCalls(void)
Guido van Rossuma9672091994-09-14 13:31:22 +0000388{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000389 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000390#ifdef WITH_THREAD
Guido van Rossum65d5b571998-12-21 19:32:43 +0000391 if (main_thread && PyThread_get_thread_ident() != main_thread)
Guido van Rossuma9672091994-09-14 13:31:22 +0000392 return 0;
393#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000394 if (busy)
Guido van Rossum180d7b41994-09-29 09:45:57 +0000395 return 0;
396 busy = 1;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000397 things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000398 for (;;) {
399 int i;
Thomas Wouters334fb892000-07-25 12:56:38 +0000400 int (*func)(void *);
401 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000402 i = pendingfirst;
403 if (i == pendinglast)
404 break; /* Queue empty */
405 func = pendingcalls[i].func;
406 arg = pendingcalls[i].arg;
407 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000408 if (func(arg) < 0) {
409 busy = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000410 things_to_do = 1; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000411 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000412 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000413 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000414 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000415 return 0;
416}
417
418
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000419/* The interpreter's recursion limit */
420
Hye-Shik Changb6fa2812005-04-04 15:49:02 +0000421#ifndef Py_DEFAULT_RECURSION_LIMIT
422#define Py_DEFAULT_RECURSION_LIMIT 1000
423#endif
424static int recursion_limit = Py_DEFAULT_RECURSION_LIMIT;
425int _Py_CheckRecursionLimit = Py_DEFAULT_RECURSION_LIMIT;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000426
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000427int
428Py_GetRecursionLimit(void)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000429{
430 return recursion_limit;
431}
432
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000433void
434Py_SetRecursionLimit(int new_limit)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000435{
436 recursion_limit = new_limit;
Armin Rigo2b3eb402003-10-28 12:05:48 +0000437 _Py_CheckRecursionLimit = recursion_limit;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000438}
439
Armin Rigo2b3eb402003-10-28 12:05:48 +0000440/* the macro Py_EnterRecursiveCall() only calls _Py_CheckRecursiveCall()
441 if the recursion_depth reaches _Py_CheckRecursionLimit.
442 If USE_STACKCHECK, the macro decrements _Py_CheckRecursionLimit
443 to guarantee that _Py_CheckRecursiveCall() is regularly called.
444 Without USE_STACKCHECK, there is no need for this. */
445int
446_Py_CheckRecursiveCall(char *where)
447{
448 PyThreadState *tstate = PyThreadState_GET();
449
450#ifdef USE_STACKCHECK
451 if (PyOS_CheckStack()) {
452 --tstate->recursion_depth;
453 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
454 return -1;
455 }
456#endif
457 if (tstate->recursion_depth > recursion_limit) {
458 --tstate->recursion_depth;
459 PyErr_Format(PyExc_RuntimeError,
460 "maximum recursion depth exceeded%s",
461 where);
462 return -1;
463 }
464 _Py_CheckRecursionLimit = recursion_limit;
465 return 0;
466}
467
Guido van Rossum374a9221991-04-04 10:40:29 +0000468/* Status code for main loop (reason for stack unwind) */
Raymond Hettinger7c958652004-04-06 10:11:10 +0000469enum why_code {
470 WHY_NOT = 0x0001, /* No error */
471 WHY_EXCEPTION = 0x0002, /* Exception occurred */
472 WHY_RERAISE = 0x0004, /* Exception re-raised by 'finally' */
473 WHY_RETURN = 0x0008, /* 'return' statement */
474 WHY_BREAK = 0x0010, /* 'break' statement */
475 WHY_CONTINUE = 0x0020, /* 'continue' statement */
476 WHY_YIELD = 0x0040 /* 'yield' operator */
477};
Guido van Rossum374a9221991-04-04 10:40:29 +0000478
Raymond Hettinger7c958652004-04-06 10:11:10 +0000479static enum why_code do_raise(PyObject *, PyObject *, PyObject *);
Tim Petersd6d010b2001-06-21 02:49:55 +0000480static int unpack_iterable(PyObject *, int, PyObject **);
Guido van Rossum1aa14831997-01-21 05:34:20 +0000481
Skip Montanarod581d772002-09-03 20:10:45 +0000482/* for manipulating the thread switch and periodic "stuff" - used to be
483 per thread, now just a pair o' globals */
Skip Montanaro99dba272002-09-03 20:19:06 +0000484int _Py_CheckInterval = 100;
485volatile int _Py_Ticker = 100;
Guido van Rossum374a9221991-04-04 10:40:29 +0000486
Guido van Rossumb209a111997-04-29 18:18:01 +0000487PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000488PyEval_EvalCode(PyCodeObject *co, PyObject *globals, PyObject *locals)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000489{
Jeremy Hylton985eba52003-02-05 23:13:00 +0000490 /* XXX raise SystemError if globals is NULL */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000491 return PyEval_EvalCodeEx(co,
Guido van Rossum681d79a1995-07-18 14:51:37 +0000492 globals, locals,
Guido van Rossumb209a111997-04-29 18:18:01 +0000493 (PyObject **)NULL, 0,
494 (PyObject **)NULL, 0,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000495 (PyObject **)NULL, 0,
Guido van Rossum4f72a782006-10-27 23:31:49 +0000496 NULL, NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000497}
498
499
500/* Interpreter main loop */
501
Martin v. Löwis8d97e332004-06-27 15:43:12 +0000502PyObject *
Phillip J. Eby0d6615f2005-08-02 00:46:46 +0000503PyEval_EvalFrame(PyFrameObject *f) {
504 /* This is for backward compatibility with extension modules that
505 used this API; core interpreter code should call PyEval_EvalFrameEx() */
506 return PyEval_EvalFrameEx(f, 0);
507}
508
509PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000510PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
Guido van Rossum374a9221991-04-04 10:40:29 +0000511{
Guido van Rossum950361c1997-01-24 13:49:28 +0000512#ifdef DXPAIRS
513 int lastopcode = 0;
514#endif
Armin Rigo8817fcd2004-06-17 10:22:40 +0000515 register PyObject **stack_pointer; /* Next free slot in value stack */
Guido van Rossum374a9221991-04-04 10:40:29 +0000516 register unsigned char *next_instr;
Armin Rigo8817fcd2004-06-17 10:22:40 +0000517 register int opcode; /* Current opcode */
518 register int oparg; /* Current opcode argument, if any */
Raymond Hettinger7c958652004-04-06 10:11:10 +0000519 register enum why_code why; /* Reason for block stack unwind */
Guido van Rossum374a9221991-04-04 10:40:29 +0000520 register int err; /* Error status -- nonzero if error */
Guido van Rossumb209a111997-04-29 18:18:01 +0000521 register PyObject *x; /* Result object -- NULL if error */
522 register PyObject *v; /* Temporary objects popped off stack */
523 register PyObject *w;
524 register PyObject *u;
525 register PyObject *t;
Jeremy Hylton2b724da2001-01-29 22:51:52 +0000526 register PyObject **fastlocals, **freevars;
Guido van Rossum014518f1998-11-23 21:09:51 +0000527 PyObject *retval = NULL; /* Return value */
Guido van Rossum885553e1998-12-21 18:33:30 +0000528 PyThreadState *tstate = PyThreadState_GET();
Tim Peters5ca576e2001-06-18 22:08:13 +0000529 PyCodeObject *co;
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000530
Tim Peters8a5c3c72004-04-05 19:36:21 +0000531 /* when tracing we set things up so that
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000532
533 not (instr_lb <= current_bytecode_offset < instr_ub)
534
Tim Peters8a5c3c72004-04-05 19:36:21 +0000535 is true when the line being executed has changed. The
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000536 initial values are such as to make this false the first
537 time it is tested. */
Armin Rigobf57a142004-03-22 19:24:58 +0000538 int instr_ub = -1, instr_lb = 0, instr_prev = -1;
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000539
Guido van Rossumd076c731998-10-07 19:42:25 +0000540 unsigned char *first_instr;
Skip Montanaro04d80f82002-08-04 21:03:35 +0000541 PyObject *names;
542 PyObject *consts;
Neal Norwitz5f5153e2005-10-21 04:28:38 +0000543#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000544 /* Make it easier to find out where we are with a debugger */
Tim Peters5ca576e2001-06-18 22:08:13 +0000545 char *filename;
Guido van Rossum99bec951992-09-03 20:29:45 +0000546#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000547
Neal Norwitza81d2202002-07-14 00:27:26 +0000548/* Tuple access macros */
549
550#ifndef Py_DEBUG
551#define GETITEM(v, i) PyTuple_GET_ITEM((PyTupleObject *)(v), (i))
552#else
553#define GETITEM(v, i) PyTuple_GetItem((v), (i))
554#endif
555
Martin v. Löwisf30d60e2004-06-08 08:17:44 +0000556#ifdef WITH_TSC
557/* Use Pentium timestamp counter to mark certain events:
558 inst0 -- beginning of switch statement for opcode dispatch
559 inst1 -- end of switch statement (may be skipped)
560 loop0 -- the top of the mainloop
Thomas Wouters477c8d52006-05-27 19:21:47 +0000561 loop1 -- place where control returns again to top of mainloop
Martin v. Löwisf30d60e2004-06-08 08:17:44 +0000562 (may be skipped)
563 intr1 -- beginning of long interruption
564 intr2 -- end of long interruption
565
566 Many opcodes call out to helper C functions. In some cases, the
567 time in those functions should be counted towards the time for the
568 opcode, but not in all cases. For example, a CALL_FUNCTION opcode
569 calls another Python function; there's no point in charge all the
570 bytecode executed by the called function to the caller.
571
572 It's hard to make a useful judgement statically. In the presence
573 of operator overloading, it's impossible to tell if a call will
574 execute new Python code or not.
575
576 It's a case-by-case judgement. I'll use intr1 for the following
577 cases:
578
Martin v. Löwisf30d60e2004-06-08 08:17:44 +0000579 IMPORT_STAR
580 IMPORT_FROM
581 CALL_FUNCTION (and friends)
582
583 */
584 uint64 inst0, inst1, loop0, loop1, intr0 = 0, intr1 = 0;
585 int ticked = 0;
586
Michael W. Hudson75eabd22005-01-18 15:56:11 +0000587 READ_TIMESTAMP(inst0);
588 READ_TIMESTAMP(inst1);
589 READ_TIMESTAMP(loop0);
590 READ_TIMESTAMP(loop1);
Michael W. Hudson800ba232004-08-12 18:19:17 +0000591
592 /* shut up the compiler */
593 opcode = 0;
Martin v. Löwisf30d60e2004-06-08 08:17:44 +0000594#endif
595
Guido van Rossum374a9221991-04-04 10:40:29 +0000596/* Code access macros */
597
Martin v. Löwis18e16552006-02-15 17:27:45 +0000598#define INSTR_OFFSET() ((int)(next_instr - first_instr))
Guido van Rossum374a9221991-04-04 10:40:29 +0000599#define NEXTOP() (*next_instr++)
Raymond Hettinger5bed4562004-04-10 23:34:17 +0000600#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Raymond Hettinger52a21b82004-08-06 18:43:09 +0000601#define PEEKARG() ((next_instr[2]<<8) + next_instr[1])
Guido van Rossumd076c731998-10-07 19:42:25 +0000602#define JUMPTO(x) (next_instr = first_instr + (x))
Guido van Rossum374a9221991-04-04 10:40:29 +0000603#define JUMPBY(x) (next_instr += (x))
604
Raymond Hettingerf606f872003-03-16 03:11:04 +0000605/* OpCode prediction macros
606 Some opcodes tend to come in pairs thus making it possible to predict
607 the second code when the first is run. For example, COMPARE_OP is often
608 followed by JUMP_IF_FALSE or JUMP_IF_TRUE. And, those opcodes are often
609 followed by a POP_TOP.
610
611 Verifying the prediction costs a single high-speed test of register
Raymond Hettingerac2072922003-03-16 15:41:11 +0000612 variable against a constant. If the pairing was good, then the
Raymond Hettingerf606f872003-03-16 03:11:04 +0000613 processor has a high likelihood of making its own successful branch
614 prediction which results in a nearly zero overhead transition to the
615 next opcode.
616
617 A successful prediction saves a trip through the eval-loop including
618 its two unpredictable branches, the HASARG test and the switch-case.
Raymond Hettingera7216982004-02-08 19:59:27 +0000619
Tim Peters8a5c3c72004-04-05 19:36:21 +0000620 If collecting opcode statistics, turn off prediction so that
621 statistics are accurately maintained (the predictions bypass
Raymond Hettingera7216982004-02-08 19:59:27 +0000622 the opcode frequency counter updates).
Raymond Hettingerf606f872003-03-16 03:11:04 +0000623*/
624
Raymond Hettingera7216982004-02-08 19:59:27 +0000625#ifdef DYNAMIC_EXECUTION_PROFILE
626#define PREDICT(op) if (0) goto PRED_##op
627#else
Raymond Hettingerac2072922003-03-16 15:41:11 +0000628#define PREDICT(op) if (*next_instr == op) goto PRED_##op
Raymond Hettingera7216982004-02-08 19:59:27 +0000629#endif
630
Raymond Hettingerf606f872003-03-16 03:11:04 +0000631#define PREDICTED(op) PRED_##op: next_instr++
Raymond Hettinger52a21b82004-08-06 18:43:09 +0000632#define PREDICTED_WITH_ARG(op) PRED_##op: oparg = PEEKARG(); next_instr += 3
Raymond Hettingerf606f872003-03-16 03:11:04 +0000633
Guido van Rossum374a9221991-04-04 10:40:29 +0000634/* Stack manipulation macros */
635
Martin v. Löwis18e16552006-02-15 17:27:45 +0000636/* The stack can grow at most MAXINT deep, as co_nlocals and
637 co_stacksize are ints. */
638#define STACK_LEVEL() ((int)(stack_pointer - f->f_valuestack))
Guido van Rossum374a9221991-04-04 10:40:29 +0000639#define EMPTY() (STACK_LEVEL() == 0)
640#define TOP() (stack_pointer[-1])
Raymond Hettinger663004b2003-01-09 15:24:30 +0000641#define SECOND() (stack_pointer[-2])
642#define THIRD() (stack_pointer[-3])
643#define FOURTH() (stack_pointer[-4])
Raymond Hettinger663004b2003-01-09 15:24:30 +0000644#define SET_TOP(v) (stack_pointer[-1] = (v))
645#define SET_SECOND(v) (stack_pointer[-2] = (v))
646#define SET_THIRD(v) (stack_pointer[-3] = (v))
647#define SET_FOURTH(v) (stack_pointer[-4] = (v))
Raymond Hettinger663004b2003-01-09 15:24:30 +0000648#define BASIC_STACKADJ(n) (stack_pointer += n)
Guido van Rossum374a9221991-04-04 10:40:29 +0000649#define BASIC_PUSH(v) (*stack_pointer++ = (v))
650#define BASIC_POP() (*--stack_pointer)
651
Guido van Rossum96a42c81992-01-12 02:29:51 +0000652#ifdef LLTRACE
Jeremy Hylton14368152001-10-17 13:29:30 +0000653#define PUSH(v) { (void)(BASIC_PUSH(v), \
654 lltrace && prtrace(TOP(), "push")); \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000655 assert(STACK_LEVEL() <= co->co_stacksize); }
Fred Drakede26cfc2001-10-13 06:11:28 +0000656#define POP() ((void)(lltrace && prtrace(TOP(), "pop")), BASIC_POP())
Raymond Hettinger663004b2003-01-09 15:24:30 +0000657#define STACKADJ(n) { (void)(BASIC_STACKADJ(n), \
658 lltrace && prtrace(TOP(), "stackadj")); \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000659 assert(STACK_LEVEL() <= co->co_stacksize); }
Guido van Rossumc2e20742006-02-27 22:32:47 +0000660#define EXT_POP(STACK_POINTER) (lltrace && prtrace(*(STACK_POINTER), "ext_pop"), *--(STACK_POINTER))
Guido van Rossum374a9221991-04-04 10:40:29 +0000661#else
662#define PUSH(v) BASIC_PUSH(v)
663#define POP() BASIC_POP()
Raymond Hettinger663004b2003-01-09 15:24:30 +0000664#define STACKADJ(n) BASIC_STACKADJ(n)
Guido van Rossumc2e20742006-02-27 22:32:47 +0000665#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
Guido van Rossum374a9221991-04-04 10:40:29 +0000666#endif
667
Guido van Rossum681d79a1995-07-18 14:51:37 +0000668/* Local variable macros */
669
670#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumcfbf1a32002-03-28 20:17:52 +0000671
672/* The SETLOCAL() macro must not DECREF the local variable in-place and
673 then store the new value; it must copy the old value to a temporary
674 value, then store the new value, and then DECREF the temporary value.
675 This is because it is possible that during the DECREF the frame is
676 accessed by other code (e.g. a __del__ method or gc.collect()) and the
677 variable would be pointing to already-freed memory. */
678#define SETLOCAL(i, value) do { PyObject *tmp = GETLOCAL(i); \
679 GETLOCAL(i) = value; \
680 Py_XDECREF(tmp); } while (0)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000681
Guido van Rossuma027efa1997-05-05 20:56:21 +0000682/* Start of code */
683
Tim Peters5ca576e2001-06-18 22:08:13 +0000684 if (f == NULL)
685 return NULL;
686
Armin Rigo1d313ab2003-10-25 14:33:09 +0000687 /* push frame */
Armin Rigo2b3eb402003-10-28 12:05:48 +0000688 if (Py_EnterRecursiveCall(""))
Armin Rigo1d313ab2003-10-25 14:33:09 +0000689 return NULL;
Guido van Rossum8861b741996-07-30 16:49:37 +0000690
Tim Peters5ca576e2001-06-18 22:08:13 +0000691 tstate->frame = f;
Tim Peters5ca576e2001-06-18 22:08:13 +0000692
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000693 if (tstate->use_tracing) {
694 if (tstate->c_tracefunc != NULL) {
695 /* tstate->c_tracefunc, if defined, is a
696 function that will be called on *every* entry
697 to a code block. Its return value, if not
698 None, is a function that will be called at
699 the start of each executed line of code.
700 (Actually, the function must return itself
701 in order to continue tracing.) The trace
702 functions are called with three arguments:
703 a pointer to the current frame, a string
704 indicating why the function is called, and
705 an argument which depends on the situation.
706 The global trace function is also called
707 whenever an exception is detected. */
708 if (call_trace(tstate->c_tracefunc, tstate->c_traceobj,
709 f, PyTrace_CALL, Py_None)) {
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000710 /* Trace function raised an error */
Armin Rigo2b3eb402003-10-28 12:05:48 +0000711 goto exit_eval_frame;
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000712 }
713 }
714 if (tstate->c_profilefunc != NULL) {
715 /* Similar for c_profilefunc, except it needn't
716 return itself and isn't called for "line" events */
717 if (call_trace(tstate->c_profilefunc,
718 tstate->c_profileobj,
719 f, PyTrace_CALL, Py_None)) {
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000720 /* Profile function raised an error */
Armin Rigo2b3eb402003-10-28 12:05:48 +0000721 goto exit_eval_frame;
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000722 }
723 }
724 }
725
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000726 co = f->f_code;
727 names = co->co_names;
728 consts = co->co_consts;
729 fastlocals = f->f_localsplus;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000730 freevars = f->f_localsplus + co->co_nlocals;
Brett Cannonc9371d42005-06-25 08:23:41 +0000731 first_instr = (unsigned char*) PyString_AS_STRING(co->co_code);
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000732 /* An explanation is in order for the next line.
733
734 f->f_lasti now refers to the index of the last instruction
735 executed. You might think this was obvious from the name, but
736 this wasn't always true before 2.3! PyFrame_New now sets
737 f->f_lasti to -1 (i.e. the index *before* the first instruction)
738 and YIELD_VALUE doesn't fiddle with f_lasti any more. So this
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000739 does work. Promise.
740
741 When the PREDICT() macros are enabled, some opcode pairs follow in
742 direct succession without updating f->f_lasti. A successful
743 prediction effectively links the two codes together as if they
744 were a single new opcode; accordingly,f->f_lasti will point to
745 the first code in the pair (for instance, GET_ITER followed by
746 FOR_ITER is effectively a single opcode and f->f_lasti will point
747 at to the beginning of the combined pair.)
748 */
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000749 next_instr = first_instr + f->f_lasti + 1;
750 stack_pointer = f->f_stacktop;
751 assert(stack_pointer != NULL);
752 f->f_stacktop = NULL; /* remains NULL unless yield suspends frame */
753
Tim Peters5ca576e2001-06-18 22:08:13 +0000754#ifdef LLTRACE
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000755 lltrace = PyDict_GetItemString(f->f_globals, "__lltrace__") != NULL;
Tim Peters5ca576e2001-06-18 22:08:13 +0000756#endif
Neal Norwitz5f5153e2005-10-21 04:28:38 +0000757#if defined(Py_DEBUG) || defined(LLTRACE)
Tim Peters5ca576e2001-06-18 22:08:13 +0000758 filename = PyString_AsString(co->co_filename);
759#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000760
Guido van Rossum374a9221991-04-04 10:40:29 +0000761 why = WHY_NOT;
762 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000763 x = Py_None; /* Not a reference, just anything non-NULL */
Fred Drake48fba732000-10-11 13:54:07 +0000764 w = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +0000765
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000766 if (throwflag) { /* support for generator.throw() */
Phillip J. Eby0d6615f2005-08-02 00:46:46 +0000767 why = WHY_EXCEPTION;
768 goto on_error;
769 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000770
Guido van Rossum374a9221991-04-04 10:40:29 +0000771 for (;;) {
Martin v. Löwisf30d60e2004-06-08 08:17:44 +0000772#ifdef WITH_TSC
773 if (inst1 == 0) {
774 /* Almost surely, the opcode executed a break
775 or a continue, preventing inst1 from being set
776 on the way out of the loop.
777 */
Michael W. Hudson75eabd22005-01-18 15:56:11 +0000778 READ_TIMESTAMP(inst1);
Martin v. Löwisf30d60e2004-06-08 08:17:44 +0000779 loop1 = inst1;
780 }
781 dump_tsc(opcode, ticked, inst0, inst1, loop0, loop1,
782 intr0, intr1);
783 ticked = 0;
784 inst1 = 0;
785 intr0 = 0;
786 intr1 = 0;
Michael W. Hudson75eabd22005-01-18 15:56:11 +0000787 READ_TIMESTAMP(loop0);
Martin v. Löwisf30d60e2004-06-08 08:17:44 +0000788#endif
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000789 assert(stack_pointer >= f->f_valuestack); /* else underflow */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000790 assert(STACK_LEVEL() <= co->co_stacksize); /* else overflow */
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000791
Guido van Rossuma027efa1997-05-05 20:56:21 +0000792 /* Do periodic things. Doing this every time through
793 the loop would add too much overhead, so we do it
794 only every Nth instruction. We also do it if
795 ``things_to_do'' is set, i.e. when an asynchronous
796 event needs attention (e.g. a signal handler or
797 async I/O handler); see Py_AddPendingCall() and
798 Py_MakePendingCalls() above. */
Guido van Rossumac7be682001-01-17 15:42:30 +0000799
Skip Montanarod581d772002-09-03 20:10:45 +0000800 if (--_Py_Ticker < 0) {
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000801 if (*next_instr == SETUP_FINALLY) {
802 /* Make the last opcode before
803 a try: finally: block uninterruptable. */
804 goto fast_next_opcode;
805 }
Skip Montanarod581d772002-09-03 20:10:45 +0000806 _Py_Ticker = _Py_CheckInterval;
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000807 tstate->tick_counter++;
Martin v. Löwisf30d60e2004-06-08 08:17:44 +0000808#ifdef WITH_TSC
809 ticked = 1;
810#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000811 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000812 if (Py_MakePendingCalls() < 0) {
813 why = WHY_EXCEPTION;
814 goto on_error;
815 }
Kurt B. Kaiser4c79a832004-11-23 18:06:08 +0000816 if (things_to_do)
817 /* MakePendingCalls() didn't succeed.
818 Force early re-execution of this
819 "periodic" code, possibly after
820 a thread switch */
821 _Py_Ticker = 0;
Guido van Rossum8861b741996-07-30 16:49:37 +0000822 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000823#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000824 if (interpreter_lock) {
825 /* Give another thread a chance */
826
Guido van Rossum25ce5661997-08-02 03:10:38 +0000827 if (PyThreadState_Swap(NULL) != tstate)
828 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000829 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000830
831 /* Other threads may run now */
832
Guido van Rossum65d5b571998-12-21 19:32:43 +0000833 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000834 if (PyThreadState_Swap(tstate) != NULL)
835 Py_FatalError("ceval: orphan tstate");
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000836
837 /* Check for thread interrupts */
838
839 if (tstate->async_exc != NULL) {
840 x = tstate->async_exc;
841 tstate->async_exc = NULL;
842 PyErr_SetNone(x);
843 Py_DECREF(x);
844 why = WHY_EXCEPTION;
845 goto on_error;
846 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000847 }
848#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000849 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000850
Neil Schemenauer63543862002-02-17 19:10:14 +0000851 fast_next_opcode:
Guido van Rossum99bec951992-09-03 20:29:45 +0000852 f->f_lasti = INSTR_OFFSET();
Guido van Rossumac7be682001-01-17 15:42:30 +0000853
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000854 /* line-by-line tracing support */
855
856 if (tstate->c_tracefunc != NULL && !tstate->tracing) {
857 /* see maybe_call_line_trace
858 for expository comments */
859 f->f_stacktop = stack_pointer;
Tim Peters8a5c3c72004-04-05 19:36:21 +0000860
Michael W. Hudson58ee2af2003-04-29 16:18:47 +0000861 err = maybe_call_line_trace(tstate->c_tracefunc,
862 tstate->c_traceobj,
Armin Rigobf57a142004-03-22 19:24:58 +0000863 f, &instr_lb, &instr_ub,
864 &instr_prev);
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000865 /* Reload possibly changed frame fields */
866 JUMPTO(f->f_lasti);
Michael W. Hudson58ee2af2003-04-29 16:18:47 +0000867 if (f->f_stacktop != NULL) {
868 stack_pointer = f->f_stacktop;
869 f->f_stacktop = NULL;
870 }
871 if (err) {
872 /* trace function raised an exception */
873 goto on_error;
874 }
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000875 }
876
877 /* Extract opcode and argument */
878
Guido van Rossum374a9221991-04-04 10:40:29 +0000879 opcode = NEXTOP();
Armin Rigo8817fcd2004-06-17 10:22:40 +0000880 oparg = 0; /* allows oparg to be stored in a register because
881 it doesn't have to be remembered across a full loop */
Raymond Hettinger5bed4562004-04-10 23:34:17 +0000882 if (HAS_ARG(opcode))
883 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +0000884 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +0000885#ifdef DYNAMIC_EXECUTION_PROFILE
886#ifdef DXPAIRS
887 dxpairs[lastopcode][opcode]++;
888 lastopcode = opcode;
889#endif
890 dxp[opcode]++;
891#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000892
Guido van Rossum96a42c81992-01-12 02:29:51 +0000893#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000894 /* Instruction tracing */
Guido van Rossumac7be682001-01-17 15:42:30 +0000895
Guido van Rossum96a42c81992-01-12 02:29:51 +0000896 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000897 if (HAS_ARG(opcode)) {
898 printf("%d: %d, %d\n",
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000899 f->f_lasti, opcode, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +0000900 }
901 else {
902 printf("%d: %d\n",
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000903 f->f_lasti, opcode);
Guido van Rossum374a9221991-04-04 10:40:29 +0000904 }
905 }
906#endif
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000907
Guido van Rossum374a9221991-04-04 10:40:29 +0000908 /* Main switch on opcode */
Michael W. Hudson75eabd22005-01-18 15:56:11 +0000909 READ_TIMESTAMP(inst0);
Jeremy Hylton52820442001-01-03 23:52:36 +0000910
Guido van Rossum374a9221991-04-04 10:40:29 +0000911 switch (opcode) {
Guido van Rossumac7be682001-01-17 15:42:30 +0000912
Guido van Rossum374a9221991-04-04 10:40:29 +0000913 /* BEWARE!
914 It is essential that any operation that fails sets either
915 x to NULL, err to nonzero, or why to anything but WHY_NOT,
916 and that no operation that succeeds does this! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000917
Guido van Rossum374a9221991-04-04 10:40:29 +0000918 /* case STOP_CODE: this is an error! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000919
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000920 case NOP:
921 goto fast_next_opcode;
922
Neil Schemenauer63543862002-02-17 19:10:14 +0000923 case LOAD_FAST:
924 x = GETLOCAL(oparg);
925 if (x != NULL) {
926 Py_INCREF(x);
927 PUSH(x);
928 goto fast_next_opcode;
929 }
930 format_exc_check_arg(PyExc_UnboundLocalError,
931 UNBOUNDLOCAL_ERROR_MSG,
932 PyTuple_GetItem(co->co_varnames, oparg));
933 break;
934
935 case LOAD_CONST:
Skip Montanaro04d80f82002-08-04 21:03:35 +0000936 x = GETITEM(consts, oparg);
Neil Schemenauer63543862002-02-17 19:10:14 +0000937 Py_INCREF(x);
938 PUSH(x);
939 goto fast_next_opcode;
940
Raymond Hettinger7dc52212003-03-16 20:14:44 +0000941 PREDICTED_WITH_ARG(STORE_FAST);
Neil Schemenauer63543862002-02-17 19:10:14 +0000942 case STORE_FAST:
943 v = POP();
944 SETLOCAL(oparg, v);
945 goto fast_next_opcode;
946
Raymond Hettingerf606f872003-03-16 03:11:04 +0000947 PREDICTED(POP_TOP);
Guido van Rossum374a9221991-04-04 10:40:29 +0000948 case POP_TOP:
949 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000950 Py_DECREF(v);
Neil Schemenauer63543862002-02-17 19:10:14 +0000951 goto fast_next_opcode;
Guido van Rossumac7be682001-01-17 15:42:30 +0000952
Guido van Rossum374a9221991-04-04 10:40:29 +0000953 case ROT_TWO:
Raymond Hettinger663004b2003-01-09 15:24:30 +0000954 v = TOP();
955 w = SECOND();
956 SET_TOP(w);
957 SET_SECOND(v);
Raymond Hettinger080cb322003-03-14 01:37:42 +0000958 goto fast_next_opcode;
Guido van Rossumac7be682001-01-17 15:42:30 +0000959
Guido van Rossum374a9221991-04-04 10:40:29 +0000960 case ROT_THREE:
Raymond Hettinger663004b2003-01-09 15:24:30 +0000961 v = TOP();
962 w = SECOND();
963 x = THIRD();
964 SET_TOP(w);
965 SET_SECOND(x);
966 SET_THIRD(v);
Raymond Hettinger080cb322003-03-14 01:37:42 +0000967 goto fast_next_opcode;
Guido van Rossumac7be682001-01-17 15:42:30 +0000968
Thomas Wouters434d0822000-08-24 20:11:32 +0000969 case ROT_FOUR:
Raymond Hettinger663004b2003-01-09 15:24:30 +0000970 u = TOP();
971 v = SECOND();
972 w = THIRD();
973 x = FOURTH();
974 SET_TOP(v);
975 SET_SECOND(w);
976 SET_THIRD(x);
977 SET_FOURTH(u);
Raymond Hettinger080cb322003-03-14 01:37:42 +0000978 goto fast_next_opcode;
Guido van Rossumac7be682001-01-17 15:42:30 +0000979
Guido van Rossum374a9221991-04-04 10:40:29 +0000980 case DUP_TOP:
981 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000982 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000983 PUSH(v);
Raymond Hettinger080cb322003-03-14 01:37:42 +0000984 goto fast_next_opcode;
Guido van Rossumac7be682001-01-17 15:42:30 +0000985
Thomas Wouters434d0822000-08-24 20:11:32 +0000986 case DUP_TOPX:
Raymond Hettinger4bad9ba2003-01-19 05:08:13 +0000987 if (oparg == 2) {
Raymond Hettinger663004b2003-01-09 15:24:30 +0000988 x = TOP();
Tim Peters35ba6892000-10-11 07:04:49 +0000989 Py_INCREF(x);
Raymond Hettinger663004b2003-01-09 15:24:30 +0000990 w = SECOND();
Tim Peters35ba6892000-10-11 07:04:49 +0000991 Py_INCREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +0000992 STACKADJ(2);
993 SET_TOP(x);
994 SET_SECOND(w);
Raymond Hettingerf606f872003-03-16 03:11:04 +0000995 goto fast_next_opcode;
Raymond Hettinger4bad9ba2003-01-19 05:08:13 +0000996 } else if (oparg == 3) {
Raymond Hettinger663004b2003-01-09 15:24:30 +0000997 x = TOP();
Tim Peters35ba6892000-10-11 07:04:49 +0000998 Py_INCREF(x);
Raymond Hettinger663004b2003-01-09 15:24:30 +0000999 w = SECOND();
Tim Peters35ba6892000-10-11 07:04:49 +00001000 Py_INCREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001001 v = THIRD();
Tim Peters35ba6892000-10-11 07:04:49 +00001002 Py_INCREF(v);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001003 STACKADJ(3);
1004 SET_TOP(x);
1005 SET_SECOND(w);
1006 SET_THIRD(v);
Raymond Hettingerf606f872003-03-16 03:11:04 +00001007 goto fast_next_opcode;
Thomas Wouters434d0822000-08-24 20:11:32 +00001008 }
Raymond Hettinger4bad9ba2003-01-19 05:08:13 +00001009 Py_FatalError("invalid argument to DUP_TOPX"
1010 " (bytecode corruption?)");
Tim Peters35ba6892000-10-11 07:04:49 +00001011 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00001012
Guido van Rossum374a9221991-04-04 10:40:29 +00001013 case UNARY_POSITIVE:
Raymond Hettinger663004b2003-01-09 15:24:30 +00001014 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001015 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001016 Py_DECREF(v);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001017 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001018 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001019 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001020
Guido van Rossum374a9221991-04-04 10:40:29 +00001021 case UNARY_NEGATIVE:
Raymond Hettinger663004b2003-01-09 15:24:30 +00001022 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001023 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001024 Py_DECREF(v);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001025 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001026 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001027 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001028
Guido van Rossum374a9221991-04-04 10:40:29 +00001029 case UNARY_NOT:
Raymond Hettinger663004b2003-01-09 15:24:30 +00001030 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001031 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001032 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +00001033 if (err == 0) {
1034 Py_INCREF(Py_True);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001035 SET_TOP(Py_True);
Guido van Rossumfc490731997-05-06 15:06:49 +00001036 continue;
1037 }
1038 else if (err > 0) {
1039 Py_INCREF(Py_False);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001040 SET_TOP(Py_False);
Guido van Rossumfc490731997-05-06 15:06:49 +00001041 err = 0;
1042 continue;
1043 }
Raymond Hettinger8bb90a52003-01-14 12:43:10 +00001044 STACKADJ(-1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001045 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001046
Guido van Rossum7928cd71991-10-24 14:59:31 +00001047 case UNARY_INVERT:
Raymond Hettinger663004b2003-01-09 15:24:30 +00001048 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001049 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001050 Py_DECREF(v);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001051 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001052 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001053 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001054
Guido van Rossum50564e81996-01-12 01:13:16 +00001055 case BINARY_POWER:
1056 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001057 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001058 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +00001059 Py_DECREF(v);
1060 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001061 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001062 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +00001063 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001064
Guido van Rossum374a9221991-04-04 10:40:29 +00001065 case BINARY_MULTIPLY:
1066 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001067 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001068 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001069 Py_DECREF(v);
1070 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001071 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001072 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001073 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001074
Tim Peters3caca232001-12-06 06:23:26 +00001075 case BINARY_TRUE_DIVIDE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001076 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001077 v = TOP();
Tim Peters3caca232001-12-06 06:23:26 +00001078 x = PyNumber_TrueDivide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001079 Py_DECREF(v);
1080 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001081 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001082 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001083 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001084
Guido van Rossum4668b002001-08-08 05:00:18 +00001085 case BINARY_FLOOR_DIVIDE:
1086 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001087 v = TOP();
Guido van Rossum4668b002001-08-08 05:00:18 +00001088 x = PyNumber_FloorDivide(v, w);
1089 Py_DECREF(v);
1090 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001091 SET_TOP(x);
Guido van Rossum4668b002001-08-08 05:00:18 +00001092 if (x != NULL) continue;
1093 break;
1094
Guido van Rossum374a9221991-04-04 10:40:29 +00001095 case BINARY_MODULO:
1096 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001097 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001098 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001099 Py_DECREF(v);
1100 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001101 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001102 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001103 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001104
Guido van Rossum374a9221991-04-04 10:40:29 +00001105 case BINARY_ADD:
1106 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001107 v = TOP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001108 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001109 /* INLINE: int + int */
1110 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001111 a = PyInt_AS_LONG(v);
1112 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001113 i = a + b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001114 if ((i^a) < 0 && (i^b) < 0)
1115 goto slow_add;
1116 x = PyInt_FromLong(i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001117 }
Raymond Hettinger52a21b82004-08-06 18:43:09 +00001118 else if (PyString_CheckExact(v) &&
1119 PyString_CheckExact(w)) {
1120 x = string_concatenate(v, w, f, next_instr);
1121 /* string_concatenate consumed the ref to v */
1122 goto skip_decref_vx;
1123 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001124 else {
1125 slow_add:
Guido van Rossumc12da691997-07-17 23:12:42 +00001126 x = PyNumber_Add(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001127 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001128 Py_DECREF(v);
Raymond Hettinger52a21b82004-08-06 18:43:09 +00001129 skip_decref_vx:
Guido van Rossumb209a111997-04-29 18:18:01 +00001130 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001131 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001132 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001133 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001134
Guido van Rossum374a9221991-04-04 10:40:29 +00001135 case BINARY_SUBTRACT:
1136 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001137 v = TOP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001138 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001139 /* INLINE: int - int */
1140 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001141 a = PyInt_AS_LONG(v);
1142 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001143 i = a - b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001144 if ((i^a) < 0 && (i^~b) < 0)
1145 goto slow_sub;
1146 x = PyInt_FromLong(i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001147 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001148 else {
1149 slow_sub:
Guido van Rossumc12da691997-07-17 23:12:42 +00001150 x = PyNumber_Subtract(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001151 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001152 Py_DECREF(v);
1153 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001154 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001155 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001156 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001157
Guido van Rossum374a9221991-04-04 10:40:29 +00001158 case BINARY_SUBSCR:
1159 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001160 v = TOP();
Tim Petersb1c46982001-10-05 20:41:38 +00001161 if (PyList_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001162 /* INLINE: list[int] */
Neal Norwitz814e9382006-03-02 07:54:28 +00001163 Py_ssize_t i = PyInt_AsSsize_t(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001164 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +00001165 i += PyList_GET_SIZE(v);
Raymond Hettinger467a6982004-04-07 11:39:21 +00001166 if (i >= 0 && i < PyList_GET_SIZE(v)) {
Guido van Rossumfa00e951998-07-08 15:02:37 +00001167 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001168 Py_INCREF(x);
1169 }
Raymond Hettinger467a6982004-04-07 11:39:21 +00001170 else
1171 goto slow_get;
Guido van Rossumc12da691997-07-17 23:12:42 +00001172 }
1173 else
Raymond Hettinger467a6982004-04-07 11:39:21 +00001174 slow_get:
Guido van Rossumc12da691997-07-17 23:12:42 +00001175 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001176 Py_DECREF(v);
1177 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001178 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001179 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001180 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001181
Guido van Rossum7928cd71991-10-24 14:59:31 +00001182 case BINARY_LSHIFT:
1183 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001184 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001185 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001186 Py_DECREF(v);
1187 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001188 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001189 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001190 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001191
Guido van Rossum7928cd71991-10-24 14:59:31 +00001192 case BINARY_RSHIFT:
1193 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001194 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001195 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001196 Py_DECREF(v);
1197 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001198 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001199 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001200 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001201
Guido van Rossum7928cd71991-10-24 14:59:31 +00001202 case BINARY_AND:
1203 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001204 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001205 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001206 Py_DECREF(v);
1207 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001208 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001209 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001210 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001211
Guido van Rossum7928cd71991-10-24 14:59:31 +00001212 case BINARY_XOR:
1213 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001214 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001215 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001216 Py_DECREF(v);
1217 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001218 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001219 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001220 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001221
Guido van Rossum7928cd71991-10-24 14:59:31 +00001222 case BINARY_OR:
1223 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001224 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001225 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001226 Py_DECREF(v);
1227 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001228 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001229 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001230 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00001231
Raymond Hettingerdd80f762004-03-07 07:31:06 +00001232 case LIST_APPEND:
1233 w = POP();
1234 v = POP();
1235 err = PyList_Append(v, w);
1236 Py_DECREF(v);
1237 Py_DECREF(w);
Raymond Hettingerfba1cfc2004-03-12 16:33:17 +00001238 if (err == 0) {
1239 PREDICT(JUMP_ABSOLUTE);
1240 continue;
1241 }
Raymond Hettingerdd80f762004-03-07 07:31:06 +00001242 break;
1243
Nick Coghlan650f0d02007-04-15 12:05:43 +00001244 case SET_ADD:
1245 w = POP();
1246 v = POP();
1247 err = PySet_Add(v, w);
1248 Py_DECREF(v);
1249 Py_DECREF(w);
1250 if (err == 0) {
1251 PREDICT(JUMP_ABSOLUTE);
1252 continue;
1253 }
1254 break;
1255
Thomas Wouters434d0822000-08-24 20:11:32 +00001256 case INPLACE_POWER:
1257 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001258 v = TOP();
Thomas Wouters434d0822000-08-24 20:11:32 +00001259 x = PyNumber_InPlacePower(v, w, Py_None);
1260 Py_DECREF(v);
1261 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001262 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001263 if (x != NULL) continue;
1264 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001265
Thomas Wouters434d0822000-08-24 20:11:32 +00001266 case INPLACE_MULTIPLY:
1267 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001268 v = TOP();
Thomas Wouters434d0822000-08-24 20:11:32 +00001269 x = PyNumber_InPlaceMultiply(v, w);
1270 Py_DECREF(v);
1271 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001272 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001273 if (x != NULL) continue;
1274 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001275
Tim Peters54b11912001-12-25 18:49:11 +00001276 case INPLACE_TRUE_DIVIDE:
Thomas Wouters434d0822000-08-24 20:11:32 +00001277 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001278 v = TOP();
Tim Peters54b11912001-12-25 18:49:11 +00001279 x = PyNumber_InPlaceTrueDivide(v, w);
Thomas Wouters434d0822000-08-24 20:11:32 +00001280 Py_DECREF(v);
1281 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001282 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001283 if (x != NULL) continue;
1284 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001285
Guido van Rossum4668b002001-08-08 05:00:18 +00001286 case INPLACE_FLOOR_DIVIDE:
1287 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001288 v = TOP();
Guido van Rossum4668b002001-08-08 05:00:18 +00001289 x = PyNumber_InPlaceFloorDivide(v, w);
1290 Py_DECREF(v);
1291 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001292 SET_TOP(x);
Guido van Rossum4668b002001-08-08 05:00:18 +00001293 if (x != NULL) continue;
1294 break;
1295
Thomas Wouters434d0822000-08-24 20:11:32 +00001296 case INPLACE_MODULO:
1297 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001298 v = TOP();
Thomas Wouters434d0822000-08-24 20:11:32 +00001299 x = PyNumber_InPlaceRemainder(v, w);
1300 Py_DECREF(v);
1301 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001302 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001303 if (x != NULL) continue;
1304 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001305
Thomas Wouters434d0822000-08-24 20:11:32 +00001306 case INPLACE_ADD:
1307 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001308 v = TOP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001309 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Thomas Wouters434d0822000-08-24 20:11:32 +00001310 /* INLINE: int + int */
1311 register long a, b, i;
1312 a = PyInt_AS_LONG(v);
1313 b = PyInt_AS_LONG(w);
1314 i = a + b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001315 if ((i^a) < 0 && (i^b) < 0)
1316 goto slow_iadd;
1317 x = PyInt_FromLong(i);
Thomas Wouters434d0822000-08-24 20:11:32 +00001318 }
Raymond Hettinger52a21b82004-08-06 18:43:09 +00001319 else if (PyString_CheckExact(v) &&
1320 PyString_CheckExact(w)) {
1321 x = string_concatenate(v, w, f, next_instr);
1322 /* string_concatenate consumed the ref to v */
1323 goto skip_decref_v;
1324 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001325 else {
1326 slow_iadd:
Thomas Wouters434d0822000-08-24 20:11:32 +00001327 x = PyNumber_InPlaceAdd(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001328 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001329 Py_DECREF(v);
Raymond Hettinger52a21b82004-08-06 18:43:09 +00001330 skip_decref_v:
Thomas Wouters434d0822000-08-24 20:11:32 +00001331 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001332 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001333 if (x != NULL) continue;
1334 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001335
Thomas Wouters434d0822000-08-24 20:11:32 +00001336 case INPLACE_SUBTRACT:
1337 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001338 v = TOP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001339 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Thomas Wouters434d0822000-08-24 20:11:32 +00001340 /* INLINE: int - int */
1341 register long a, b, i;
1342 a = PyInt_AS_LONG(v);
1343 b = PyInt_AS_LONG(w);
1344 i = a - b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001345 if ((i^a) < 0 && (i^~b) < 0)
1346 goto slow_isub;
1347 x = PyInt_FromLong(i);
Thomas Wouters434d0822000-08-24 20:11:32 +00001348 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001349 else {
1350 slow_isub:
Thomas Wouters434d0822000-08-24 20:11:32 +00001351 x = PyNumber_InPlaceSubtract(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001352 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001353 Py_DECREF(v);
1354 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001355 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001356 if (x != NULL) continue;
1357 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001358
Thomas Wouters434d0822000-08-24 20:11:32 +00001359 case INPLACE_LSHIFT:
1360 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001361 v = TOP();
Thomas Wouters434d0822000-08-24 20:11:32 +00001362 x = PyNumber_InPlaceLshift(v, w);
1363 Py_DECREF(v);
1364 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001365 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001366 if (x != NULL) continue;
1367 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001368
Thomas Wouters434d0822000-08-24 20:11:32 +00001369 case INPLACE_RSHIFT:
1370 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001371 v = TOP();
Thomas Wouters434d0822000-08-24 20:11:32 +00001372 x = PyNumber_InPlaceRshift(v, w);
1373 Py_DECREF(v);
1374 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001375 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001376 if (x != NULL) continue;
1377 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001378
Thomas Wouters434d0822000-08-24 20:11:32 +00001379 case INPLACE_AND:
1380 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001381 v = TOP();
Thomas Wouters434d0822000-08-24 20:11:32 +00001382 x = PyNumber_InPlaceAnd(v, w);
1383 Py_DECREF(v);
1384 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001385 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001386 if (x != NULL) continue;
1387 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001388
Thomas Wouters434d0822000-08-24 20:11:32 +00001389 case INPLACE_XOR:
1390 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001391 v = TOP();
Thomas Wouters434d0822000-08-24 20:11:32 +00001392 x = PyNumber_InPlaceXor(v, w);
1393 Py_DECREF(v);
1394 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001395 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001396 if (x != NULL) continue;
1397 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001398
Thomas Wouters434d0822000-08-24 20:11:32 +00001399 case INPLACE_OR:
1400 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001401 v = TOP();
Thomas Wouters434d0822000-08-24 20:11:32 +00001402 x = PyNumber_InPlaceOr(v, w);
1403 Py_DECREF(v);
1404 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001405 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001406 if (x != NULL) continue;
1407 break;
1408
Guido van Rossum374a9221991-04-04 10:40:29 +00001409 case SLICE+0:
1410 case SLICE+1:
1411 case SLICE+2:
1412 case SLICE+3:
1413 if ((opcode-SLICE) & 2)
1414 w = POP();
1415 else
1416 w = NULL;
1417 if ((opcode-SLICE) & 1)
1418 v = POP();
1419 else
1420 v = NULL;
Raymond Hettinger663004b2003-01-09 15:24:30 +00001421 u = TOP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001422 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001423 Py_DECREF(u);
1424 Py_XDECREF(v);
1425 Py_XDECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001426 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001427 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001428 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001429
Guido van Rossum374a9221991-04-04 10:40:29 +00001430 case STORE_SLICE+0:
1431 case STORE_SLICE+1:
1432 case STORE_SLICE+2:
1433 case STORE_SLICE+3:
1434 if ((opcode-STORE_SLICE) & 2)
1435 w = POP();
1436 else
1437 w = NULL;
1438 if ((opcode-STORE_SLICE) & 1)
1439 v = POP();
1440 else
1441 v = NULL;
1442 u = POP();
1443 t = POP();
1444 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +00001445 Py_DECREF(t);
1446 Py_DECREF(u);
1447 Py_XDECREF(v);
1448 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001449 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001450 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001451
Guido van Rossum374a9221991-04-04 10:40:29 +00001452 case DELETE_SLICE+0:
1453 case DELETE_SLICE+1:
1454 case DELETE_SLICE+2:
1455 case DELETE_SLICE+3:
1456 if ((opcode-DELETE_SLICE) & 2)
1457 w = POP();
1458 else
1459 w = NULL;
1460 if ((opcode-DELETE_SLICE) & 1)
1461 v = POP();
1462 else
1463 v = NULL;
1464 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001465 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +00001466 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00001467 Py_DECREF(u);
1468 Py_XDECREF(v);
1469 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001470 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001471 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001472
Guido van Rossum374a9221991-04-04 10:40:29 +00001473 case STORE_SUBSCR:
Raymond Hettinger663004b2003-01-09 15:24:30 +00001474 w = TOP();
1475 v = SECOND();
1476 u = THIRD();
1477 STACKADJ(-3);
Guido van Rossum374a9221991-04-04 10:40:29 +00001478 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +00001479 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001480 Py_DECREF(u);
1481 Py_DECREF(v);
1482 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001483 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001484 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001485
Guido van Rossum374a9221991-04-04 10:40:29 +00001486 case DELETE_SUBSCR:
Raymond Hettinger663004b2003-01-09 15:24:30 +00001487 w = TOP();
1488 v = SECOND();
1489 STACKADJ(-2);
Guido van Rossum374a9221991-04-04 10:40:29 +00001490 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001491 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001492 Py_DECREF(v);
1493 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001494 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001495 break;
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001496
Guido van Rossum374a9221991-04-04 10:40:29 +00001497 case PRINT_EXPR:
1498 v = POP();
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001499 w = PySys_GetObject("displayhook");
1500 if (w == NULL) {
1501 PyErr_SetString(PyExc_RuntimeError,
1502 "lost sys.displayhook");
1503 err = -1;
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001504 x = NULL;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001505 }
1506 if (err == 0) {
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001507 x = PyTuple_Pack(1, v);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001508 if (x == NULL)
1509 err = -1;
1510 }
1511 if (err == 0) {
1512 w = PyEval_CallObject(w, x);
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001513 Py_XDECREF(w);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001514 if (w == NULL)
1515 err = -1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001516 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001517 Py_DECREF(v);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001518 Py_XDECREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001519 break;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001520
Thomas Wouters434d0822000-08-24 20:11:32 +00001521#ifdef CASE_TOO_BIG
1522 default: switch (opcode) {
1523#endif
Guido van Rossumf10570b1995-07-07 22:53:21 +00001524 case RAISE_VARARGS:
1525 u = v = w = NULL;
1526 switch (oparg) {
1527 case 3:
1528 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001529 /* Fallthrough */
1530 case 2:
1531 v = POP(); /* value */
1532 /* Fallthrough */
1533 case 1:
1534 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001535 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001536 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001537 break;
1538 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001539 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001540 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001541 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001542 break;
1543 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001544 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001545
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001546 case STORE_LOCALS:
1547 x = POP();
1548 v = f->f_locals;
1549 Py_XDECREF(v);
1550 f->f_locals = x;
1551 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001552
Guido van Rossum374a9221991-04-04 10:40:29 +00001553 case RETURN_VALUE:
1554 retval = POP();
1555 why = WHY_RETURN;
Raymond Hettinger1dd83092004-02-06 18:32:33 +00001556 goto fast_block_end;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001557
Tim Peters5ca576e2001-06-18 22:08:13 +00001558 case YIELD_VALUE:
1559 retval = POP();
Tim Peters8c963692001-06-23 05:26:56 +00001560 f->f_stacktop = stack_pointer;
Tim Peters5ca576e2001-06-18 22:08:13 +00001561 why = WHY_YIELD;
Raymond Hettinger1dd83092004-02-06 18:32:33 +00001562 goto fast_yield;
Tim Peters5ca576e2001-06-18 22:08:13 +00001563
Guido van Rossum374a9221991-04-04 10:40:29 +00001564 case POP_BLOCK:
1565 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001566 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001567 while (STACK_LEVEL() > b->b_level) {
1568 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001569 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001570 }
1571 }
Raymond Hettinger7eddd782004-04-07 14:38:08 +00001572 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001573
Guido van Rossum374a9221991-04-04 10:40:29 +00001574 case END_FINALLY:
1575 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001576 if (PyInt_Check(v)) {
Raymond Hettinger7c958652004-04-06 10:11:10 +00001577 why = (enum why_code) PyInt_AS_LONG(v);
Tim Peters8a5c3c72004-04-05 19:36:21 +00001578 assert(why != WHY_YIELD);
Raymond Hettingerc8aa08b2004-04-11 14:59:33 +00001579 if (why == WHY_RETURN ||
1580 why == WHY_CONTINUE)
Guido van Rossum374a9221991-04-04 10:40:29 +00001581 retval = POP();
1582 }
Brett Cannonf74225d2007-02-26 21:10:16 +00001583 else if (PyExceptionClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001584 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001585 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001586 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001587 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001588 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001589 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001590 else if (v != Py_None) {
1591 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001592 "'finally' pops bad exception");
1593 why = WHY_EXCEPTION;
1594 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001595 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001596 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001597
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001598 case LOAD_BUILD_CLASS:
1599 x = PyDict_GetItemString(f->f_builtins,
1600 "__build_class__");
1601 if (x == NULL) {
1602 PyErr_SetString(PyExc_ImportError,
1603 "__build_class__ not found");
1604 break;
1605 }
1606 Py_INCREF(x);
1607 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001608 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001609
Guido van Rossum374a9221991-04-04 10:40:29 +00001610 case STORE_NAME:
Skip Montanaro496e6582002-08-06 17:47:40 +00001611 w = GETITEM(names, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001612 v = POP();
Raymond Hettinger467a6982004-04-07 11:39:21 +00001613 if ((x = f->f_locals) != NULL) {
Raymond Hettinger66bd2332004-08-02 08:30:07 +00001614 if (PyDict_CheckExact(x))
Raymond Hettinger214b1c32004-07-02 06:41:07 +00001615 err = PyDict_SetItem(x, w, v);
1616 else
1617 err = PyObject_SetItem(x, w, v);
Raymond Hettinger467a6982004-04-07 11:39:21 +00001618 Py_DECREF(v);
Raymond Hettinger7eddd782004-04-07 14:38:08 +00001619 if (err == 0) continue;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001620 break;
1621 }
Raymond Hettinger467a6982004-04-07 11:39:21 +00001622 PyErr_Format(PyExc_SystemError,
1623 "no locals found when storing %s",
1624 PyObject_REPR(w));
Guido van Rossum374a9221991-04-04 10:40:29 +00001625 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001626
Guido van Rossum374a9221991-04-04 10:40:29 +00001627 case DELETE_NAME:
Skip Montanaro496e6582002-08-06 17:47:40 +00001628 w = GETITEM(names, oparg);
Raymond Hettinger467a6982004-04-07 11:39:21 +00001629 if ((x = f->f_locals) != NULL) {
Raymond Hettinger214b1c32004-07-02 06:41:07 +00001630 if ((err = PyObject_DelItem(x, w)) != 0)
Raymond Hettinger467a6982004-04-07 11:39:21 +00001631 format_exc_check_arg(PyExc_NameError,
1632 NAME_ERROR_MSG ,w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001633 break;
1634 }
Raymond Hettinger467a6982004-04-07 11:39:21 +00001635 PyErr_Format(PyExc_SystemError,
1636 "no locals when deleting %s",
1637 PyObject_REPR(w));
Guido van Rossum374a9221991-04-04 10:40:29 +00001638 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001639
Raymond Hettinger7dc52212003-03-16 20:14:44 +00001640 PREDICTED_WITH_ARG(UNPACK_SEQUENCE);
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001641 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001642 v = POP();
Raymond Hettingerf114a3a2004-03-08 23:25:30 +00001643 if (PyTuple_CheckExact(v) && PyTuple_GET_SIZE(v) == oparg) {
1644 PyObject **items = ((PyTupleObject *)v)->ob_item;
1645 while (oparg--) {
1646 w = items[oparg];
1647 Py_INCREF(w);
1648 PUSH(w);
Barry Warsawe42b18f1997-08-25 22:13:04 +00001649 }
Raymond Hettinger7eddd782004-04-07 14:38:08 +00001650 Py_DECREF(v);
1651 continue;
Raymond Hettingerf114a3a2004-03-08 23:25:30 +00001652 } else if (PyList_CheckExact(v) && PyList_GET_SIZE(v) == oparg) {
1653 PyObject **items = ((PyListObject *)v)->ob_item;
1654 while (oparg--) {
1655 w = items[oparg];
1656 Py_INCREF(w);
1657 PUSH(w);
Barry Warsawe42b18f1997-08-25 22:13:04 +00001658 }
Raymond Hettingerf114a3a2004-03-08 23:25:30 +00001659 } else if (unpack_iterable(v, oparg,
Tim Petersd6d010b2001-06-21 02:49:55 +00001660 stack_pointer + oparg))
1661 stack_pointer += oparg;
Tim Peters8b13b3e2001-09-30 05:58:42 +00001662 else {
1663 if (PyErr_ExceptionMatches(PyExc_TypeError))
1664 PyErr_SetString(PyExc_TypeError,
1665 "unpack non-sequence");
Barry Warsawe42b18f1997-08-25 22:13:04 +00001666 why = WHY_EXCEPTION;
Tim Peters8b13b3e2001-09-30 05:58:42 +00001667 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001668 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001669 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001670
Guido van Rossum374a9221991-04-04 10:40:29 +00001671 case STORE_ATTR:
Skip Montanaro496e6582002-08-06 17:47:40 +00001672 w = GETITEM(names, oparg);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001673 v = TOP();
1674 u = SECOND();
1675 STACKADJ(-2);
Guido van Rossumb209a111997-04-29 18:18:01 +00001676 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1677 Py_DECREF(v);
1678 Py_DECREF(u);
Raymond Hettinger7eddd782004-04-07 14:38:08 +00001679 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001680 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001681
Guido van Rossum374a9221991-04-04 10:40:29 +00001682 case DELETE_ATTR:
Skip Montanaro496e6582002-08-06 17:47:40 +00001683 w = GETITEM(names, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001684 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001685 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1686 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001687 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001688 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001689
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001690 case STORE_GLOBAL:
Skip Montanaro496e6582002-08-06 17:47:40 +00001691 w = GETITEM(names, oparg);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001692 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001693 err = PyDict_SetItem(f->f_globals, w, v);
1694 Py_DECREF(v);
Raymond Hettinger7eddd782004-04-07 14:38:08 +00001695 if (err == 0) continue;
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001696 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001697
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001698 case DELETE_GLOBAL:
Skip Montanaro496e6582002-08-06 17:47:40 +00001699 w = GETITEM(names, oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001700 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001701 format_exc_check_arg(
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001702 PyExc_NameError, GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001703 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001704
Guido van Rossum374a9221991-04-04 10:40:29 +00001705 case LOAD_NAME:
Skip Montanaro496e6582002-08-06 17:47:40 +00001706 w = GETITEM(names, oparg);
Raymond Hettinger214b1c32004-07-02 06:41:07 +00001707 if ((v = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001708 PyErr_Format(PyExc_SystemError,
1709 "no locals when loading %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001710 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001711 break;
1712 }
Michael W. Hudsona3711f72004-08-02 14:50:43 +00001713 if (PyDict_CheckExact(v)) {
Raymond Hettinger214b1c32004-07-02 06:41:07 +00001714 x = PyDict_GetItem(v, w);
Michael W. Hudsona3711f72004-08-02 14:50:43 +00001715 Py_XINCREF(x);
1716 }
Raymond Hettinger214b1c32004-07-02 06:41:07 +00001717 else {
1718 x = PyObject_GetItem(v, w);
1719 if (x == NULL && PyErr_Occurred()) {
1720 if (!PyErr_ExceptionMatches(PyExc_KeyError))
1721 break;
1722 PyErr_Clear();
1723 }
1724 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001725 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001726 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001727 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001728 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001729 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001730 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001731 PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001732 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001733 break;
1734 }
1735 }
Michael W. Hudsona3711f72004-08-02 14:50:43 +00001736 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001737 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001738 PUSH(x);
Raymond Hettinger467a6982004-04-07 11:39:21 +00001739 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001740
Guido van Rossum374a9221991-04-04 10:40:29 +00001741 case LOAD_GLOBAL:
Skip Montanaro496e6582002-08-06 17:47:40 +00001742 w = GETITEM(names, oparg);
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001743 if (PyString_CheckExact(w)) {
Guido van Rossumd8dbf842002-08-19 21:17:53 +00001744 /* Inline the PyDict_GetItem() calls.
1745 WARNING: this is an extreme speed hack.
1746 Do not try this at home. */
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001747 long hash = ((PyStringObject *)w)->ob_shash;
1748 if (hash != -1) {
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001749 PyDictObject *d;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001750 PyDictEntry *e;
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001751 d = (PyDictObject *)(f->f_globals);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001752 e = d->ma_lookup(d, w, hash);
1753 if (e == NULL) {
1754 x = NULL;
1755 break;
1756 }
1757 x = e->me_value;
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001758 if (x != NULL) {
1759 Py_INCREF(x);
1760 PUSH(x);
1761 continue;
1762 }
1763 d = (PyDictObject *)(f->f_builtins);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001764 e = d->ma_lookup(d, w, hash);
1765 if (e == NULL) {
1766 x = NULL;
1767 break;
1768 }
1769 x = e->me_value;
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001770 if (x != NULL) {
1771 Py_INCREF(x);
1772 PUSH(x);
1773 continue;
1774 }
1775 goto load_global_error;
1776 }
1777 }
1778 /* This is the un-inlined version of the code above */
Guido van Rossumb209a111997-04-29 18:18:01 +00001779 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001780 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001781 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001782 if (x == NULL) {
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001783 load_global_error:
Paul Prescode68140d2000-08-30 20:25:01 +00001784 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001785 PyExc_NameError,
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001786 GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001787 break;
1788 }
1789 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001790 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001791 PUSH(x);
Raymond Hettinger7eddd782004-04-07 14:38:08 +00001792 continue;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001793
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001794 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001795 x = GETLOCAL(oparg);
Raymond Hettinger467a6982004-04-07 11:39:21 +00001796 if (x != NULL) {
1797 SETLOCAL(oparg, NULL);
1798 continue;
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001799 }
Raymond Hettinger467a6982004-04-07 11:39:21 +00001800 format_exc_check_arg(
1801 PyExc_UnboundLocalError,
1802 UNBOUNDLOCAL_ERROR_MSG,
1803 PyTuple_GetItem(co->co_varnames, oparg)
1804 );
1805 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001806
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001807 case LOAD_CLOSURE:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001808 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001809 Py_INCREF(x);
1810 PUSH(x);
Raymond Hettinger7eddd782004-04-07 14:38:08 +00001811 if (x != NULL) continue;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001812 break;
1813
1814 case LOAD_DEREF:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001815 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001816 w = PyCell_Get(x);
Raymond Hettinger467a6982004-04-07 11:39:21 +00001817 if (w != NULL) {
1818 PUSH(w);
1819 continue;
Jeremy Hylton2524d692001-02-05 17:23:16 +00001820 }
Raymond Hettinger467a6982004-04-07 11:39:21 +00001821 err = -1;
1822 /* Don't stomp existing exception */
1823 if (PyErr_Occurred())
1824 break;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001825 if (oparg < PyTuple_GET_SIZE(co->co_cellvars)) {
1826 v = PyTuple_GET_ITEM(co->co_cellvars,
Raymond Hettinger467a6982004-04-07 11:39:21 +00001827 oparg);
1828 format_exc_check_arg(
1829 PyExc_UnboundLocalError,
1830 UNBOUNDLOCAL_ERROR_MSG,
1831 v);
1832 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00001833 v = PyTuple_GET_ITEM(
Raymond Hettinger467a6982004-04-07 11:39:21 +00001834 co->co_freevars,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001835 oparg - PyTuple_GET_SIZE(co->co_cellvars));
Raymond Hettinger467a6982004-04-07 11:39:21 +00001836 format_exc_check_arg(
1837 PyExc_NameError,
1838 UNBOUNDFREE_ERROR_MSG,
1839 v);
1840 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001841 break;
1842
1843 case STORE_DEREF:
1844 w = POP();
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001845 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001846 PyCell_Set(x, w);
Jeremy Hylton30c9f392001-03-13 01:58:22 +00001847 Py_DECREF(w);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001848 continue;
1849
Guido van Rossum374a9221991-04-04 10:40:29 +00001850 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001851 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001852 if (x != NULL) {
Raymond Hettinger5bed4562004-04-10 23:34:17 +00001853 for (; --oparg >= 0;) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001854 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001855 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001856 }
1857 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001858 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001859 }
1860 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001861
Guido van Rossum374a9221991-04-04 10:40:29 +00001862 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001863 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001864 if (x != NULL) {
Raymond Hettinger5bed4562004-04-10 23:34:17 +00001865 for (; --oparg >= 0;) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001866 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001867 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001868 }
1869 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001870 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001871 }
1872 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001873
Guido van Rossum86e58e22006-08-28 15:27:34 +00001874 case BUILD_SET:
1875 x = PySet_New(NULL);
1876 if (x != NULL) {
1877 for (; --oparg >= 0;) {
1878 w = POP();
1879 if (err == 0)
1880 err = PySet_Add(x, w);
1881 Py_DECREF(w);
1882 }
1883 if (err != 0) {
1884 Py_DECREF(x);
1885 break;
1886 }
1887 PUSH(x);
1888 continue;
1889 }
1890 break;
1891
Guido van Rossum374a9221991-04-04 10:40:29 +00001892 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001893 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001894 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001895 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001896 break;
Thomas Wouters00e41de2007-02-23 19:56:57 +00001897
1898 case MAKE_BYTES:
1899 w = POP();
1900 if (PyString_Check(w))
1901 x = PyBytes_FromStringAndSize(
1902 PyString_AS_STRING(w),
1903 PyString_GET_SIZE(w));
1904 else
1905 x = NULL;
1906 Py_DECREF(w);
1907 PUSH(x);
1908 if (x != NULL) continue;
1909 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001910
Guido van Rossum374a9221991-04-04 10:40:29 +00001911 case LOAD_ATTR:
Skip Montanaro496e6582002-08-06 17:47:40 +00001912 w = GETITEM(names, oparg);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001913 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001914 x = PyObject_GetAttr(v, w);
1915 Py_DECREF(v);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001916 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001917 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001918 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001919
Guido van Rossum374a9221991-04-04 10:40:29 +00001920 case COMPARE_OP:
1921 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001922 v = TOP();
Raymond Hettinger4bad9ba2003-01-19 05:08:13 +00001923 if (PyInt_CheckExact(w) && PyInt_CheckExact(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001924 /* INLINE: cmp(int, int) */
1925 register long a, b;
1926 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001927 a = PyInt_AS_LONG(v);
1928 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001929 switch (oparg) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00001930 case PyCmp_LT: res = a < b; break;
1931 case PyCmp_LE: res = a <= b; break;
1932 case PyCmp_EQ: res = a == b; break;
1933 case PyCmp_NE: res = a != b; break;
1934 case PyCmp_GT: res = a > b; break;
1935 case PyCmp_GE: res = a >= b; break;
1936 case PyCmp_IS: res = v == w; break;
1937 case PyCmp_IS_NOT: res = v != w; break;
Guido van Rossumc12da691997-07-17 23:12:42 +00001938 default: goto slow_compare;
1939 }
1940 x = res ? Py_True : Py_False;
1941 Py_INCREF(x);
1942 }
1943 else {
1944 slow_compare:
1945 x = cmp_outcome(oparg, v, w);
1946 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001947 Py_DECREF(v);
1948 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001949 SET_TOP(x);
Raymond Hettingerf606f872003-03-16 03:11:04 +00001950 if (x == NULL) break;
1951 PREDICT(JUMP_IF_FALSE);
1952 PREDICT(JUMP_IF_TRUE);
1953 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001954
Guido van Rossum374a9221991-04-04 10:40:29 +00001955 case IMPORT_NAME:
Skip Montanaro496e6582002-08-06 17:47:40 +00001956 w = GETITEM(names, oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001957 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001958 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001959 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001960 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001961 break;
1962 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00001963 v = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001964 u = TOP();
Thomas Woutersf7f438b2006-02-28 16:09:29 +00001965 if (PyInt_AsLong(u) != -1 || PyErr_Occurred())
1966 w = PyTuple_Pack(5,
1967 w,
1968 f->f_globals,
1969 f->f_locals == NULL ?
1970 Py_None : f->f_locals,
1971 v,
1972 u);
1973 else
1974 w = PyTuple_Pack(4,
1975 w,
1976 f->f_globals,
1977 f->f_locals == NULL ?
1978 Py_None : f->f_locals,
1979 v);
1980 Py_DECREF(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001981 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001982 if (w == NULL) {
Raymond Hettinger663004b2003-01-09 15:24:30 +00001983 u = POP();
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001984 x = NULL;
1985 break;
1986 }
Michael W. Hudson75eabd22005-01-18 15:56:11 +00001987 READ_TIMESTAMP(intr0);
Guido van Rossumb209a111997-04-29 18:18:01 +00001988 x = PyEval_CallObject(x, w);
Michael W. Hudson75eabd22005-01-18 15:56:11 +00001989 READ_TIMESTAMP(intr1);
Guido van Rossumb209a111997-04-29 18:18:01 +00001990 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001991 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001992 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001993 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001994
Thomas Wouters52152252000-08-17 22:55:00 +00001995 case IMPORT_STAR:
1996 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001997 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001998 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001999 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00002000 "no locals found during 'import *'");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002001 break;
2002 }
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002003 READ_TIMESTAMP(intr0);
Thomas Wouters52152252000-08-17 22:55:00 +00002004 err = import_all_from(x, v);
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002005 READ_TIMESTAMP(intr1);
Guido van Rossumb209a111997-04-29 18:18:01 +00002006 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00002007 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002008 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00002009 break;
Guido van Rossum25831651993-05-19 14:50:45 +00002010
Thomas Wouters52152252000-08-17 22:55:00 +00002011 case IMPORT_FROM:
Skip Montanaro496e6582002-08-06 17:47:40 +00002012 w = GETITEM(names, oparg);
Thomas Wouters52152252000-08-17 22:55:00 +00002013 v = TOP();
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002014 READ_TIMESTAMP(intr0);
Thomas Wouters52152252000-08-17 22:55:00 +00002015 x = import_from(v, w);
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002016 READ_TIMESTAMP(intr1);
Thomas Wouters52152252000-08-17 22:55:00 +00002017 PUSH(x);
2018 if (x != NULL) continue;
2019 break;
2020
Guido van Rossum374a9221991-04-04 10:40:29 +00002021 case JUMP_FORWARD:
2022 JUMPBY(oparg);
Neil Schemenauerc4b570f2003-06-01 19:21:12 +00002023 goto fast_next_opcode;
Guido van Rossumac7be682001-01-17 15:42:30 +00002024
Raymond Hettingerf606f872003-03-16 03:11:04 +00002025 PREDICTED_WITH_ARG(JUMP_IF_FALSE);
Guido van Rossum374a9221991-04-04 10:40:29 +00002026 case JUMP_IF_FALSE:
Raymond Hettinger21012b82003-02-26 18:11:50 +00002027 w = TOP();
Raymond Hettingerf606f872003-03-16 03:11:04 +00002028 if (w == Py_True) {
2029 PREDICT(POP_TOP);
Neil Schemenauerc4b570f2003-06-01 19:21:12 +00002030 goto fast_next_opcode;
Raymond Hettingerf606f872003-03-16 03:11:04 +00002031 }
Raymond Hettinger21012b82003-02-26 18:11:50 +00002032 if (w == Py_False) {
2033 JUMPBY(oparg);
Neil Schemenauerc4b570f2003-06-01 19:21:12 +00002034 goto fast_next_opcode;
Raymond Hettinger21012b82003-02-26 18:11:50 +00002035 }
2036 err = PyObject_IsTrue(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002037 if (err > 0)
2038 err = 0;
2039 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00002040 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002041 else
2042 break;
2043 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00002044
Raymond Hettingerf606f872003-03-16 03:11:04 +00002045 PREDICTED_WITH_ARG(JUMP_IF_TRUE);
Guido van Rossum374a9221991-04-04 10:40:29 +00002046 case JUMP_IF_TRUE:
Raymond Hettinger21012b82003-02-26 18:11:50 +00002047 w = TOP();
Raymond Hettingerf606f872003-03-16 03:11:04 +00002048 if (w == Py_False) {
2049 PREDICT(POP_TOP);
Neil Schemenauerc4b570f2003-06-01 19:21:12 +00002050 goto fast_next_opcode;
Raymond Hettingerf606f872003-03-16 03:11:04 +00002051 }
Raymond Hettinger21012b82003-02-26 18:11:50 +00002052 if (w == Py_True) {
2053 JUMPBY(oparg);
Neil Schemenauerc4b570f2003-06-01 19:21:12 +00002054 goto fast_next_opcode;
Raymond Hettinger21012b82003-02-26 18:11:50 +00002055 }
2056 err = PyObject_IsTrue(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002057 if (err > 0) {
2058 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00002059 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002060 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002061 else if (err == 0)
2062 ;
2063 else
2064 break;
2065 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00002066
Raymond Hettingerfba1cfc2004-03-12 16:33:17 +00002067 PREDICTED_WITH_ARG(JUMP_ABSOLUTE);
Guido van Rossum374a9221991-04-04 10:40:29 +00002068 case JUMP_ABSOLUTE:
2069 JUMPTO(oparg);
Neil Schemenauerca2a2f12003-05-30 23:59:44 +00002070 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00002071
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002072 case GET_ITER:
2073 /* before: [obj]; after [getiter(obj)] */
Raymond Hettinger663004b2003-01-09 15:24:30 +00002074 v = TOP();
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002075 x = PyObject_GetIter(v);
2076 Py_DECREF(v);
2077 if (x != NULL) {
Raymond Hettinger663004b2003-01-09 15:24:30 +00002078 SET_TOP(x);
Raymond Hettinger7dc52212003-03-16 20:14:44 +00002079 PREDICT(FOR_ITER);
Guido van Rossum213c7a62001-04-23 14:08:49 +00002080 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002081 }
Raymond Hettinger8bb90a52003-01-14 12:43:10 +00002082 STACKADJ(-1);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002083 break;
2084
Raymond Hettinger7dc52212003-03-16 20:14:44 +00002085 PREDICTED_WITH_ARG(FOR_ITER);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002086 case FOR_ITER:
2087 /* before: [iter]; after: [iter, iter()] *or* [] */
2088 v = TOP();
Raymond Hettingerdb0de9e2004-03-12 08:41:36 +00002089 x = (*v->ob_type->tp_iternext)(v);
Guido van Rossum213c7a62001-04-23 14:08:49 +00002090 if (x != NULL) {
2091 PUSH(x);
Raymond Hettinger7dc52212003-03-16 20:14:44 +00002092 PREDICT(STORE_FAST);
2093 PREDICT(UNPACK_SEQUENCE);
Guido van Rossum213c7a62001-04-23 14:08:49 +00002094 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002095 }
Raymond Hettingerdb0de9e2004-03-12 08:41:36 +00002096 if (PyErr_Occurred()) {
2097 if (!PyErr_ExceptionMatches(PyExc_StopIteration))
2098 break;
2099 PyErr_Clear();
Guido van Rossum213c7a62001-04-23 14:08:49 +00002100 }
Raymond Hettingerdb0de9e2004-03-12 08:41:36 +00002101 /* iterator ended normally */
2102 x = v = POP();
2103 Py_DECREF(v);
2104 JUMPBY(oparg);
2105 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002106
Raymond Hettinger2d783e92004-03-12 09:12:22 +00002107 case BREAK_LOOP:
2108 why = WHY_BREAK;
2109 goto fast_block_end;
2110
2111 case CONTINUE_LOOP:
2112 retval = PyInt_FromLong(oparg);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002113 if (!retval) {
2114 x = NULL;
2115 break;
2116 }
Raymond Hettinger2d783e92004-03-12 09:12:22 +00002117 why = WHY_CONTINUE;
2118 goto fast_block_end;
2119
Guido van Rossum374a9221991-04-04 10:40:29 +00002120 case SETUP_LOOP:
2121 case SETUP_EXCEPT:
2122 case SETUP_FINALLY:
Thomas Wouters9fe394c2007-02-05 01:24:16 +00002123 /* NOTE: If you add any new block-setup opcodes that are
2124 not try/except/finally handlers, you may need to
2125 update the PyGen_NeedsFinalizing() function. */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002126
Guido van Rossumb209a111997-04-29 18:18:01 +00002127 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002128 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002129 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00002130
Guido van Rossumc2e20742006-02-27 22:32:47 +00002131 case WITH_CLEANUP:
2132 {
2133 /* TOP is the context.__exit__ bound method.
2134 Below that are 1-3 values indicating how/why
2135 we entered the finally clause:
2136 - SECOND = None
Guido van Rossumf6694362006-03-10 02:28:35 +00002137 - (SECOND, THIRD) = (WHY_{RETURN,CONTINUE}), retval
Guido van Rossumc2e20742006-02-27 22:32:47 +00002138 - SECOND = WHY_*; no retval below it
2139 - (SECOND, THIRD, FOURTH) = exc_info()
2140 In the last case, we must call
2141 TOP(SECOND, THIRD, FOURTH)
2142 otherwise we must call
2143 TOP(None, None, None)
Guido van Rossum1a5e21e2006-02-28 21:57:43 +00002144
2145 In addition, if the stack represents an exception,
Guido van Rossumf6694362006-03-10 02:28:35 +00002146 *and* the function call returns a 'true' value, we
2147 "zap" this information, to prevent END_FINALLY from
2148 re-raising the exception. (But non-local gotos
2149 should still be resumed.)
Guido van Rossumc2e20742006-02-27 22:32:47 +00002150 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002151
Guido van Rossumc2e20742006-02-27 22:32:47 +00002152 x = TOP();
2153 u = SECOND();
2154 if (PyInt_Check(u) || u == Py_None) {
2155 u = v = w = Py_None;
2156 }
2157 else {
2158 v = THIRD();
2159 w = FOURTH();
2160 }
Guido van Rossumf6694362006-03-10 02:28:35 +00002161 /* XXX Not the fastest way to call it... */
2162 x = PyObject_CallFunctionObjArgs(x, u, v, w, NULL);
2163 if (x == NULL)
2164 break; /* Go to error exit */
2165 if (u != Py_None && PyObject_IsTrue(x)) {
2166 /* There was an exception and a true return */
2167 Py_DECREF(x);
2168 x = TOP(); /* Again */
2169 STACKADJ(-3);
2170 Py_INCREF(Py_None);
2171 SET_TOP(Py_None);
2172 Py_DECREF(x);
2173 Py_DECREF(u);
2174 Py_DECREF(v);
2175 Py_DECREF(w);
2176 } else {
2177 /* Let END_FINALLY do its thing */
2178 Py_DECREF(x);
2179 x = POP();
2180 Py_DECREF(x);
2181 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00002182 break;
2183 }
2184
Guido van Rossumf10570b1995-07-07 22:53:21 +00002185 case CALL_FUNCTION:
Armin Rigo8817fcd2004-06-17 10:22:40 +00002186 {
2187 PyObject **sp;
Jeremy Hylton985eba52003-02-05 23:13:00 +00002188 PCALL(PCALL_ALL);
Armin Rigo8817fcd2004-06-17 10:22:40 +00002189 sp = stack_pointer;
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00002190#ifdef WITH_TSC
Armin Rigo8817fcd2004-06-17 10:22:40 +00002191 x = call_function(&sp, oparg, &intr0, &intr1);
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00002192#else
Armin Rigo8817fcd2004-06-17 10:22:40 +00002193 x = call_function(&sp, oparg);
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00002194#endif
Armin Rigo8817fcd2004-06-17 10:22:40 +00002195 stack_pointer = sp;
Jeremy Hyltone8c04322002-08-16 17:47:26 +00002196 PUSH(x);
2197 if (x != NULL)
2198 continue;
2199 break;
Armin Rigo8817fcd2004-06-17 10:22:40 +00002200 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002201
Jeremy Hylton76901512000-03-28 23:49:17 +00002202 case CALL_FUNCTION_VAR:
2203 case CALL_FUNCTION_KW:
2204 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00002205 {
Jeremy Hylton76901512000-03-28 23:49:17 +00002206 int na = oparg & 0xff;
2207 int nk = (oparg>>8) & 0xff;
2208 int flags = (opcode - CALL_FUNCTION) & 3;
Jeremy Hylton52820442001-01-03 23:52:36 +00002209 int n = na + 2 * nk;
Armin Rigo8817fcd2004-06-17 10:22:40 +00002210 PyObject **pfunc, *func, **sp;
Jeremy Hylton985eba52003-02-05 23:13:00 +00002211 PCALL(PCALL_ALL);
Jeremy Hylton52820442001-01-03 23:52:36 +00002212 if (flags & CALL_FLAG_VAR)
2213 n++;
2214 if (flags & CALL_FLAG_KW)
2215 n++;
2216 pfunc = stack_pointer - n - 1;
2217 func = *pfunc;
Jeremy Hylton52820442001-01-03 23:52:36 +00002218
Guido van Rossumac7be682001-01-17 15:42:30 +00002219 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00002220 && PyMethod_GET_SELF(func) != NULL) {
2221 PyObject *self = PyMethod_GET_SELF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002222 Py_INCREF(self);
Jeremy Hylton52820442001-01-03 23:52:36 +00002223 func = PyMethod_GET_FUNCTION(func);
2224 Py_INCREF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002225 Py_DECREF(*pfunc);
2226 *pfunc = self;
2227 na++;
2228 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00002229 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00002230 Py_INCREF(func);
Armin Rigo8817fcd2004-06-17 10:22:40 +00002231 sp = stack_pointer;
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002232 READ_TIMESTAMP(intr0);
Armin Rigo8817fcd2004-06-17 10:22:40 +00002233 x = ext_do_call(func, &sp, flags, na, nk);
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002234 READ_TIMESTAMP(intr1);
Armin Rigo8817fcd2004-06-17 10:22:40 +00002235 stack_pointer = sp;
Jeremy Hylton76901512000-03-28 23:49:17 +00002236 Py_DECREF(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00002237
Jeremy Hylton76901512000-03-28 23:49:17 +00002238 while (stack_pointer > pfunc) {
Jeremy Hylton52820442001-01-03 23:52:36 +00002239 w = POP();
2240 Py_DECREF(w);
Jeremy Hylton76901512000-03-28 23:49:17 +00002241 }
2242 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00002243 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00002244 continue;
Jeremy Hylton76901512000-03-28 23:49:17 +00002245 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002246 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002247
Guido van Rossum0240b922007-02-26 21:23:50 +00002248 case MAKE_CLOSURE:
Guido van Rossum681d79a1995-07-18 14:51:37 +00002249 case MAKE_FUNCTION:
Guido van Rossum4f72a782006-10-27 23:31:49 +00002250 {
2251 int posdefaults = oparg & 0xff;
2252 int kwdefaults = (oparg>>8) & 0xff;
Neal Norwitzc1505362006-12-28 06:47:50 +00002253 int num_annotations = (oparg >> 16) & 0x7fff;
Guido van Rossum4f72a782006-10-27 23:31:49 +00002254
Guido van Rossum681d79a1995-07-18 14:51:37 +00002255 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00002256 x = PyFunction_New(v, f->f_globals);
2257 Py_DECREF(v);
Guido van Rossum0240b922007-02-26 21:23:50 +00002258
2259 if (x != NULL && opcode == MAKE_CLOSURE) {
2260 v = POP();
2261 err = PyFunction_SetClosure(x, v);
2262 Py_DECREF(v);
2263 }
Neal Norwitzc1505362006-12-28 06:47:50 +00002264
2265 if (x != NULL && num_annotations > 0) {
2266 Py_ssize_t name_ix;
2267 u = POP(); /* names of args with annotations */
2268 v = PyDict_New();
2269 if (v == NULL) {
2270 Py_DECREF(x);
2271 x = NULL;
2272 break;
2273 }
2274 name_ix = PyTuple_Size(u);
2275 assert(num_annotations == name_ix+1);
2276 while (name_ix > 0) {
2277 --name_ix;
2278 t = PyTuple_GET_ITEM(u, name_ix);
2279 w = POP();
2280 /* XXX(nnorwitz): check for errors */
2281 PyDict_SetItem(v, t, w);
2282 Py_DECREF(w);
2283 }
2284
2285 err = PyFunction_SetAnnotations(x, v);
2286 Py_DECREF(v);
2287 Py_DECREF(u);
2288 }
2289
Guido van Rossum681d79a1995-07-18 14:51:37 +00002290 /* XXX Maybe this should be a separate opcode? */
Guido van Rossum4f72a782006-10-27 23:31:49 +00002291 if (x != NULL && posdefaults > 0) {
2292 v = PyTuple_New(posdefaults);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002293 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002294 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002295 x = NULL;
2296 break;
2297 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00002298 while (--posdefaults >= 0) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002299 w = POP();
Guido van Rossum4f72a782006-10-27 23:31:49 +00002300 PyTuple_SET_ITEM(v, posdefaults, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002301 }
2302 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00002303 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002304 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00002305 if (x != NULL && kwdefaults > 0) {
2306 v = PyDict_New();
2307 if (v == NULL) {
2308 Py_DECREF(x);
2309 x = NULL;
2310 break;
2311 }
2312 while (--kwdefaults >= 0) {
2313 w = POP(); /* default value */
2314 u = POP(); /* kw only arg name */
Neal Norwitzc1505362006-12-28 06:47:50 +00002315 /* XXX(nnorwitz): check for errors */
Guido van Rossum4f72a782006-10-27 23:31:49 +00002316 PyDict_SetItem(v, u, w);
Georg Brandl94ab0002007-02-26 13:58:18 +00002317 Py_DECREF(w);
2318 Py_DECREF(u);
Guido van Rossum4f72a782006-10-27 23:31:49 +00002319 }
2320 err = PyFunction_SetKwDefaults(x, v);
2321 Py_DECREF(v);
2322 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002323 PUSH(x);
2324 break;
Guido van Rossum4f72a782006-10-27 23:31:49 +00002325 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002326
2327 case BUILD_SLICE:
2328 if (oparg == 3)
2329 w = POP();
2330 else
2331 w = NULL;
2332 v = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00002333 u = TOP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00002334 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00002335 Py_DECREF(u);
2336 Py_DECREF(v);
2337 Py_XDECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00002338 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002339 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00002340 break;
2341
Fred Drakeef8ace32000-08-24 00:32:09 +00002342 case EXTENDED_ARG:
2343 opcode = NEXTOP();
Raymond Hettinger5bed4562004-04-10 23:34:17 +00002344 oparg = oparg<<16 | NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +00002345 goto dispatch_opcode;
Guido van Rossum8861b741996-07-30 16:49:37 +00002346
Guido van Rossum374a9221991-04-04 10:40:29 +00002347 default:
2348 fprintf(stderr,
2349 "XXX lineno: %d, opcode: %d\n",
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002350 PyCode_Addr2Line(f->f_code, f->f_lasti),
2351 opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00002352 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00002353 why = WHY_EXCEPTION;
2354 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002355
2356#ifdef CASE_TOO_BIG
2357 }
2358#endif
2359
Guido van Rossum374a9221991-04-04 10:40:29 +00002360 } /* switch */
2361
2362 on_error:
Guido van Rossumac7be682001-01-17 15:42:30 +00002363
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002364 READ_TIMESTAMP(inst1);
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00002365
Guido van Rossum374a9221991-04-04 10:40:29 +00002366 /* Quickly continue if no error occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002367
Guido van Rossum374a9221991-04-04 10:40:29 +00002368 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002369 if (err == 0 && x != NULL) {
2370#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002371 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002372 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002373 fprintf(stderr,
2374 "XXX undetected error\n");
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00002375 else {
2376#endif
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002377 READ_TIMESTAMP(loop1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002378 continue; /* Normal, fast path */
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00002379#ifdef CHECKEXC
2380 }
2381#endif
Guido van Rossum681d79a1995-07-18 14:51:37 +00002382 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002383 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00002384 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00002385 err = 0;
2386 }
2387
Guido van Rossum374a9221991-04-04 10:40:29 +00002388 /* Double-check exception status */
Guido van Rossumac7be682001-01-17 15:42:30 +00002389
Raymond Hettingerc8aa08b2004-04-11 14:59:33 +00002390 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002391 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002392 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002393 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00002394 why = WHY_EXCEPTION;
2395 }
2396 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002397#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00002398 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002399 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002400 if (PyErr_Occurred()) {
Jeremy Hylton904ed862003-11-05 17:29:35 +00002401 char buf[1024];
2402 sprintf(buf, "Stack unwind with exception "
2403 "set and why=%d", why);
2404 Py_FatalError(buf);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002405 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002406 }
2407#endif
2408
2409 /* Log traceback info if this is a real exception */
Guido van Rossumac7be682001-01-17 15:42:30 +00002410
Guido van Rossum374a9221991-04-04 10:40:29 +00002411 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002412 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002413
Fred Drake8f51f542001-10-04 14:48:42 +00002414 if (tstate->c_tracefunc != NULL)
2415 call_exc_trace(tstate->c_tracefunc,
2416 tstate->c_traceobj, f);
Guido van Rossum014518f1998-11-23 21:09:51 +00002417 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002418
Guido van Rossum374a9221991-04-04 10:40:29 +00002419 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
Guido van Rossumac7be682001-01-17 15:42:30 +00002420
Guido van Rossum374a9221991-04-04 10:40:29 +00002421 if (why == WHY_RERAISE)
2422 why = WHY_EXCEPTION;
2423
2424 /* Unwind stacks if a (pseudo) exception occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002425
Raymond Hettinger1dd83092004-02-06 18:32:33 +00002426fast_block_end:
Tim Peters8a5c3c72004-04-05 19:36:21 +00002427 while (why != WHY_NOT && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002428 PyTryBlock *b = PyFrame_BlockPop(f);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002429
Tim Peters8a5c3c72004-04-05 19:36:21 +00002430 assert(why != WHY_YIELD);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002431 if (b->b_type == SETUP_LOOP && why == WHY_CONTINUE) {
2432 /* For a continue inside a try block,
2433 don't pop the block for the loop. */
Thomas Wouters1ee64222001-09-24 19:32:01 +00002434 PyFrame_BlockSetup(f, b->b_type, b->b_handler,
2435 b->b_level);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002436 why = WHY_NOT;
2437 JUMPTO(PyInt_AS_LONG(retval));
2438 Py_DECREF(retval);
2439 break;
2440 }
2441
Guido van Rossum374a9221991-04-04 10:40:29 +00002442 while (STACK_LEVEL() > b->b_level) {
2443 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002444 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002445 }
2446 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2447 why = WHY_NOT;
2448 JUMPTO(b->b_handler);
2449 break;
2450 }
2451 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00002452 (b->b_type == SETUP_EXCEPT &&
2453 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002454 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002455 PyObject *exc, *val, *tb;
2456 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002457 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002458 val = Py_None;
2459 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00002460 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002461 /* Make the raw exception data
2462 available to the handler,
2463 so a program can emulate the
2464 Python main loop. Don't do
2465 this for 'finally'. */
2466 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00002467 PyErr_NormalizeException(
2468 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002469 set_exc_info(tstate,
2470 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002471 }
Jeremy Hyltonc6314892001-09-26 19:24:45 +00002472 if (tb == NULL) {
2473 Py_INCREF(Py_None);
2474 PUSH(Py_None);
2475 } else
2476 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002477 PUSH(val);
2478 PUSH(exc);
2479 }
2480 else {
Raymond Hettinger06032cb2004-04-06 09:37:35 +00002481 if (why & (WHY_RETURN | WHY_CONTINUE))
Guido van Rossum374a9221991-04-04 10:40:29 +00002482 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00002483 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00002484 PUSH(v);
2485 }
2486 why = WHY_NOT;
2487 JUMPTO(b->b_handler);
2488 break;
2489 }
2490 } /* unwind stack */
2491
2492 /* End the loop if we still have an error (or return) */
Guido van Rossumac7be682001-01-17 15:42:30 +00002493
Guido van Rossum374a9221991-04-04 10:40:29 +00002494 if (why != WHY_NOT)
2495 break;
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002496 READ_TIMESTAMP(loop1);
Guido van Rossumac7be682001-01-17 15:42:30 +00002497
Guido van Rossum374a9221991-04-04 10:40:29 +00002498 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00002499
Tim Peters8a5c3c72004-04-05 19:36:21 +00002500 assert(why != WHY_YIELD);
2501 /* Pop remaining stack entries. */
2502 while (!EMPTY()) {
2503 v = POP();
2504 Py_XDECREF(v);
Guido van Rossum35974fb2001-12-06 21:28:18 +00002505 }
2506
Tim Peters8a5c3c72004-04-05 19:36:21 +00002507 if (why != WHY_RETURN)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002508 retval = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002509
Raymond Hettinger1dd83092004-02-06 18:32:33 +00002510fast_yield:
Fred Drake9e3ad782001-07-03 23:39:52 +00002511 if (tstate->use_tracing) {
Barry Warsawe2eca0b2005-08-15 18:14:19 +00002512 if (tstate->c_tracefunc) {
2513 if (why == WHY_RETURN || why == WHY_YIELD) {
2514 if (call_trace(tstate->c_tracefunc,
2515 tstate->c_traceobj, f,
2516 PyTrace_RETURN, retval)) {
2517 Py_XDECREF(retval);
2518 retval = NULL;
2519 why = WHY_EXCEPTION;
2520 }
2521 }
2522 else if (why == WHY_EXCEPTION) {
2523 call_trace_protected(tstate->c_tracefunc,
2524 tstate->c_traceobj, f,
Armin Rigo1c2d7e52005-09-20 18:34:01 +00002525 PyTrace_RETURN, NULL);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002526 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002527 }
Fred Drake8f51f542001-10-04 14:48:42 +00002528 if (tstate->c_profilefunc) {
Fred Drake4ec5d562001-10-04 19:26:43 +00002529 if (why == WHY_EXCEPTION)
2530 call_trace_protected(tstate->c_profilefunc,
2531 tstate->c_profileobj, f,
Armin Rigo1c2d7e52005-09-20 18:34:01 +00002532 PyTrace_RETURN, NULL);
Fred Drake4ec5d562001-10-04 19:26:43 +00002533 else if (call_trace(tstate->c_profilefunc,
2534 tstate->c_profileobj, f,
2535 PyTrace_RETURN, retval)) {
Fred Drake9e3ad782001-07-03 23:39:52 +00002536 Py_XDECREF(retval);
2537 retval = NULL;
2538 why = WHY_EXCEPTION;
2539 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002540 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002541 }
Guido van Rossuma4240131997-01-21 21:18:36 +00002542
Thomas Wouters477c8d52006-05-27 19:21:47 +00002543 if (tstate->frame->f_exc_type != NULL)
2544 reset_exc_info(tstate);
2545 else {
2546 assert(tstate->frame->f_exc_value == NULL);
2547 assert(tstate->frame->f_exc_traceback == NULL);
2548 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00002549
Tim Peters5ca576e2001-06-18 22:08:13 +00002550 /* pop frame */
Armin Rigo2b3eb402003-10-28 12:05:48 +00002551 exit_eval_frame:
2552 Py_LeaveRecursiveCall();
Guido van Rossuma027efa1997-05-05 20:56:21 +00002553 tstate->frame = f->f_back;
Guido van Rossumac7be682001-01-17 15:42:30 +00002554
Guido van Rossum96a42c81992-01-12 02:29:51 +00002555 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00002556}
2557
Guido van Rossumc2e20742006-02-27 22:32:47 +00002558/* This is gonna seem *real weird*, but if you put some other code between
Martin v. Löwis8d97e332004-06-27 15:43:12 +00002559 PyEval_EvalFrame() and PyEval_EvalCodeEx() you will need to adjust
Guido van Rossumc2e20742006-02-27 22:32:47 +00002560 the test in the if statements in Misc/gdbinit (pystack and pystackv). */
Skip Montanaro786ea6b2004-03-01 15:44:05 +00002561
Tim Peters6d6c1a32001-08-02 04:15:00 +00002562PyObject *
2563PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals,
Tim Peters5ca576e2001-06-18 22:08:13 +00002564 PyObject **args, int argcount, PyObject **kws, int kwcount,
Guido van Rossum4f72a782006-10-27 23:31:49 +00002565 PyObject **defs, int defcount, PyObject *kwdefs, PyObject *closure)
Tim Peters5ca576e2001-06-18 22:08:13 +00002566{
2567 register PyFrameObject *f;
2568 register PyObject *retval = NULL;
2569 register PyObject **fastlocals, **freevars;
2570 PyThreadState *tstate = PyThreadState_GET();
2571 PyObject *x, *u;
2572
2573 if (globals == NULL) {
Tim Peters8a5c3c72004-04-05 19:36:21 +00002574 PyErr_SetString(PyExc_SystemError,
Jeremy Hylton910d7d42001-08-12 21:52:24 +00002575 "PyEval_EvalCodeEx: NULL globals");
Tim Peters5ca576e2001-06-18 22:08:13 +00002576 return NULL;
2577 }
2578
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002579 assert(tstate != NULL);
Jeremy Hylton985eba52003-02-05 23:13:00 +00002580 assert(globals != NULL);
2581 f = PyFrame_New(tstate, co, globals, locals);
Tim Peters5ca576e2001-06-18 22:08:13 +00002582 if (f == NULL)
2583 return NULL;
2584
2585 fastlocals = f->f_localsplus;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002586 freevars = f->f_localsplus + co->co_nlocals;
Tim Peters5ca576e2001-06-18 22:08:13 +00002587
2588 if (co->co_argcount > 0 ||
Guido van Rossum4f72a782006-10-27 23:31:49 +00002589 co->co_kwonlyargcount > 0 ||
Tim Peters5ca576e2001-06-18 22:08:13 +00002590 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
2591 int i;
2592 int n = argcount;
2593 PyObject *kwdict = NULL;
2594 if (co->co_flags & CO_VARKEYWORDS) {
2595 kwdict = PyDict_New();
2596 if (kwdict == NULL)
2597 goto fail;
Guido van Rossum4f72a782006-10-27 23:31:49 +00002598 i = co->co_argcount + co->co_kwonlyargcount;
Tim Peters5ca576e2001-06-18 22:08:13 +00002599 if (co->co_flags & CO_VARARGS)
2600 i++;
2601 SETLOCAL(i, kwdict);
2602 }
2603 if (argcount > co->co_argcount) {
2604 if (!(co->co_flags & CO_VARARGS)) {
2605 PyErr_Format(PyExc_TypeError,
2606 "%.200s() takes %s %d "
Guido van Rossum4f72a782006-10-27 23:31:49 +00002607 "%spositional argument%s (%d given)",
Tim Peters5ca576e2001-06-18 22:08:13 +00002608 PyString_AsString(co->co_name),
2609 defcount ? "at most" : "exactly",
2610 co->co_argcount,
2611 kwcount ? "non-keyword " : "",
2612 co->co_argcount == 1 ? "" : "s",
2613 argcount);
2614 goto fail;
2615 }
2616 n = co->co_argcount;
2617 }
2618 for (i = 0; i < n; i++) {
2619 x = args[i];
2620 Py_INCREF(x);
2621 SETLOCAL(i, x);
2622 }
2623 if (co->co_flags & CO_VARARGS) {
2624 u = PyTuple_New(argcount - n);
2625 if (u == NULL)
2626 goto fail;
Guido van Rossum4f72a782006-10-27 23:31:49 +00002627 SETLOCAL(co->co_argcount + co->co_kwonlyargcount, u);
Tim Peters5ca576e2001-06-18 22:08:13 +00002628 for (i = n; i < argcount; i++) {
2629 x = args[i];
2630 Py_INCREF(x);
2631 PyTuple_SET_ITEM(u, i-n, x);
2632 }
2633 }
2634 for (i = 0; i < kwcount; i++) {
2635 PyObject *keyword = kws[2*i];
2636 PyObject *value = kws[2*i + 1];
2637 int j;
2638 if (keyword == NULL || !PyString_Check(keyword)) {
2639 PyErr_Format(PyExc_TypeError,
2640 "%.200s() keywords must be strings",
2641 PyString_AsString(co->co_name));
2642 goto fail;
2643 }
2644 /* XXX slow -- speed up using dictionary? */
Guido van Rossum4f72a782006-10-27 23:31:49 +00002645 for (j = 0;
2646 j < co->co_argcount + co->co_kwonlyargcount;
2647 j++) {
Tim Peters5ca576e2001-06-18 22:08:13 +00002648 PyObject *nm = PyTuple_GET_ITEM(
2649 co->co_varnames, j);
2650 int cmp = PyObject_RichCompareBool(
2651 keyword, nm, Py_EQ);
2652 if (cmp > 0)
2653 break;
2654 else if (cmp < 0)
2655 goto fail;
2656 }
2657 /* Check errors from Compare */
2658 if (PyErr_Occurred())
2659 goto fail;
Guido van Rossum4f72a782006-10-27 23:31:49 +00002660 if (j >= co->co_argcount + co->co_kwonlyargcount) {
Tim Peters5ca576e2001-06-18 22:08:13 +00002661 if (kwdict == NULL) {
2662 PyErr_Format(PyExc_TypeError,
2663 "%.200s() got an unexpected "
2664 "keyword argument '%.400s'",
2665 PyString_AsString(co->co_name),
2666 PyString_AsString(keyword));
2667 goto fail;
2668 }
2669 PyDict_SetItem(kwdict, keyword, value);
2670 }
2671 else {
2672 if (GETLOCAL(j) != NULL) {
2673 PyErr_Format(PyExc_TypeError,
2674 "%.200s() got multiple "
2675 "values for keyword "
2676 "argument '%.400s'",
2677 PyString_AsString(co->co_name),
2678 PyString_AsString(keyword));
2679 goto fail;
2680 }
2681 Py_INCREF(value);
2682 SETLOCAL(j, value);
2683 }
2684 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00002685 if (co->co_kwonlyargcount > 0) {
2686 for (i = co->co_argcount;
2687 i < co->co_argcount + co->co_kwonlyargcount;
2688 i++) {
Guido van Rossum29602e42006-11-22 04:45:33 +00002689 PyObject *name, *def;
Guido van Rossum4f72a782006-10-27 23:31:49 +00002690 if (GETLOCAL(i) != NULL)
2691 continue;
Guido van Rossum29602e42006-11-22 04:45:33 +00002692 name = PyTuple_GET_ITEM(co->co_varnames, i);
2693 def = NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00002694 if (kwdefs != NULL)
2695 def = PyDict_GetItem(kwdefs, name);
2696 if (def != NULL) {
2697 Py_INCREF(def);
2698 SETLOCAL(i, def);
2699 continue;
2700 }
2701 PyErr_Format(PyExc_TypeError,
2702 "%.200s() needs "
Brett Cannone33a6112007-01-29 23:43:38 +00002703 "keyword-only argument %s",
Guido van Rossum4f72a782006-10-27 23:31:49 +00002704 PyString_AsString(co->co_name),
2705 PyString_AsString(name));
2706 goto fail;
2707 }
2708 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002709 if (argcount < co->co_argcount) {
2710 int m = co->co_argcount - defcount;
2711 for (i = argcount; i < m; i++) {
2712 if (GETLOCAL(i) == NULL) {
2713 PyErr_Format(PyExc_TypeError,
2714 "%.200s() takes %s %d "
Guido van Rossum4f72a782006-10-27 23:31:49 +00002715 "%spositional argument%s "
2716 "(%d given)",
Tim Peters5ca576e2001-06-18 22:08:13 +00002717 PyString_AsString(co->co_name),
2718 ((co->co_flags & CO_VARARGS) ||
2719 defcount) ? "at least"
2720 : "exactly",
2721 m, kwcount ? "non-keyword " : "",
2722 m == 1 ? "" : "s", i);
2723 goto fail;
2724 }
2725 }
2726 if (n > m)
2727 i = n - m;
2728 else
2729 i = 0;
2730 for (; i < defcount; i++) {
2731 if (GETLOCAL(m+i) == NULL) {
2732 PyObject *def = defs[i];
2733 Py_INCREF(def);
2734 SETLOCAL(m+i, def);
2735 }
2736 }
2737 }
2738 }
2739 else {
2740 if (argcount > 0 || kwcount > 0) {
2741 PyErr_Format(PyExc_TypeError,
2742 "%.200s() takes no arguments (%d given)",
2743 PyString_AsString(co->co_name),
2744 argcount + kwcount);
2745 goto fail;
2746 }
2747 }
2748 /* Allocate and initialize storage for cell vars, and copy free
2749 vars into frame. This isn't too efficient right now. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002750 if (PyTuple_GET_SIZE(co->co_cellvars)) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002751 int i, j, nargs, found;
Tim Peters5ca576e2001-06-18 22:08:13 +00002752 char *cellname, *argname;
2753 PyObject *c;
2754
2755 nargs = co->co_argcount;
2756 if (co->co_flags & CO_VARARGS)
2757 nargs++;
2758 if (co->co_flags & CO_VARKEYWORDS)
2759 nargs++;
2760
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002761 /* Initialize each cell var, taking into account
2762 cell vars that are initialized from arguments.
2763
2764 Should arrange for the compiler to put cellvars
2765 that are arguments at the beginning of the cellvars
2766 list so that we can march over it more efficiently?
2767 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002768 for (i = 0; i < PyTuple_GET_SIZE(co->co_cellvars); ++i) {
Tim Peters5ca576e2001-06-18 22:08:13 +00002769 cellname = PyString_AS_STRING(
2770 PyTuple_GET_ITEM(co->co_cellvars, i));
2771 found = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002772 for (j = 0; j < nargs; j++) {
Tim Peters5ca576e2001-06-18 22:08:13 +00002773 argname = PyString_AS_STRING(
2774 PyTuple_GET_ITEM(co->co_varnames, j));
2775 if (strcmp(cellname, argname) == 0) {
2776 c = PyCell_New(GETLOCAL(j));
2777 if (c == NULL)
2778 goto fail;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002779 GETLOCAL(co->co_nlocals + i) = c;
Tim Peters5ca576e2001-06-18 22:08:13 +00002780 found = 1;
2781 break;
2782 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002783 }
2784 if (found == 0) {
2785 c = PyCell_New(NULL);
2786 if (c == NULL)
2787 goto fail;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002788 SETLOCAL(co->co_nlocals + i, c);
Tim Peters5ca576e2001-06-18 22:08:13 +00002789 }
2790 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002791 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002792 if (PyTuple_GET_SIZE(co->co_freevars)) {
Tim Peters5ca576e2001-06-18 22:08:13 +00002793 int i;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002794 for (i = 0; i < PyTuple_GET_SIZE(co->co_freevars); ++i) {
Tim Peters5ca576e2001-06-18 22:08:13 +00002795 PyObject *o = PyTuple_GET_ITEM(closure, i);
2796 Py_INCREF(o);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002797 freevars[PyTuple_GET_SIZE(co->co_cellvars) + i] = o;
Tim Peters5ca576e2001-06-18 22:08:13 +00002798 }
2799 }
2800
Tim Peters5ca576e2001-06-18 22:08:13 +00002801 if (co->co_flags & CO_GENERATOR) {
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002802 /* Don't need to keep the reference to f_back, it will be set
2803 * when the generator is resumed. */
Tim Peters5ba58662001-07-16 02:29:45 +00002804 Py_XDECREF(f->f_back);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002805 f->f_back = NULL;
2806
Jeremy Hylton985eba52003-02-05 23:13:00 +00002807 PCALL(PCALL_GENERATOR);
2808
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002809 /* Create a new generator that owns the ready to run frame
2810 * and return that as the value. */
Martin v. Löwise440e472004-06-01 15:22:42 +00002811 return PyGen_New(f);
Tim Peters5ca576e2001-06-18 22:08:13 +00002812 }
2813
Phillip J. Eby0d6615f2005-08-02 00:46:46 +00002814 retval = PyEval_EvalFrameEx(f,0);
Tim Peters5ca576e2001-06-18 22:08:13 +00002815
2816 fail: /* Jump here from prelude on failure */
2817
Tim Petersb13680b2001-11-27 23:29:29 +00002818 /* decref'ing the frame can cause __del__ methods to get invoked,
2819 which can call back into Python. While we're done with the
2820 current Python frame (f), the associated C stack is still in use,
2821 so recursion_depth must be boosted for the duration.
2822 */
2823 assert(tstate != NULL);
2824 ++tstate->recursion_depth;
Tim Peters5ca576e2001-06-18 22:08:13 +00002825 Py_DECREF(f);
Tim Petersb13680b2001-11-27 23:29:29 +00002826 --tstate->recursion_depth;
Tim Peters5ca576e2001-06-18 22:08:13 +00002827 return retval;
2828}
2829
2830
Guido van Rossumc9fbb722003-03-01 03:36:33 +00002831/* Implementation notes for set_exc_info() and reset_exc_info():
2832
2833- Below, 'exc_ZZZ' stands for 'exc_type', 'exc_value' and
2834 'exc_traceback'. These always travel together.
2835
2836- tstate->curexc_ZZZ is the "hot" exception that is set by
2837 PyErr_SetString(), cleared by PyErr_Clear(), and so on.
2838
2839- Once an exception is caught by an except clause, it is transferred
2840 from tstate->curexc_ZZZ to tstate->exc_ZZZ, from which sys.exc_info()
2841 can pick it up. This is the primary task of set_exc_info().
Thomas Wouters477c8d52006-05-27 19:21:47 +00002842 XXX That can't be right: set_exc_info() doesn't look at tstate->curexc_ZZZ.
Guido van Rossumc9fbb722003-03-01 03:36:33 +00002843
2844- Now let me explain the complicated dance with frame->f_exc_ZZZ.
2845
2846 Long ago, when none of this existed, there were just a few globals:
2847 one set corresponding to the "hot" exception, and one set
2848 corresponding to sys.exc_ZZZ. (Actually, the latter weren't C
2849 globals; they were simply stored as sys.exc_ZZZ. For backwards
2850 compatibility, they still are!) The problem was that in code like
2851 this:
2852
2853 try:
2854 "something that may fail"
2855 except "some exception":
2856 "do something else first"
2857 "print the exception from sys.exc_ZZZ."
2858
2859 if "do something else first" invoked something that raised and caught
2860 an exception, sys.exc_ZZZ were overwritten. That was a frequent
2861 cause of subtle bugs. I fixed this by changing the semantics as
2862 follows:
2863
2864 - Within one frame, sys.exc_ZZZ will hold the last exception caught
2865 *in that frame*.
2866
2867 - But initially, and as long as no exception is caught in a given
2868 frame, sys.exc_ZZZ will hold the last exception caught in the
2869 previous frame (or the frame before that, etc.).
2870
2871 The first bullet fixed the bug in the above example. The second
2872 bullet was for backwards compatibility: it was (and is) common to
2873 have a function that is called when an exception is caught, and to
2874 have that function access the caught exception via sys.exc_ZZZ.
2875 (Example: traceback.print_exc()).
2876
2877 At the same time I fixed the problem that sys.exc_ZZZ weren't
2878 thread-safe, by introducing sys.exc_info() which gets it from tstate;
2879 but that's really a separate improvement.
2880
2881 The reset_exc_info() function in ceval.c restores the tstate->exc_ZZZ
2882 variables to what they were before the current frame was called. The
2883 set_exc_info() function saves them on the frame so that
2884 reset_exc_info() can restore them. The invariant is that
2885 frame->f_exc_ZZZ is NULL iff the current frame never caught an
2886 exception (where "catching" an exception applies only to successful
2887 except clauses); and if the current frame ever caught an exception,
2888 frame->f_exc_ZZZ is the exception that was stored in tstate->exc_ZZZ
2889 at the start of the current frame.
2890
2891*/
2892
Guido van Rossuma027efa1997-05-05 20:56:21 +00002893static void
Guido van Rossumac7be682001-01-17 15:42:30 +00002894set_exc_info(PyThreadState *tstate,
2895 PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002896{
Thomas Wouters477c8d52006-05-27 19:21:47 +00002897 PyFrameObject *frame = tstate->frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002898 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00002899
Thomas Wouters477c8d52006-05-27 19:21:47 +00002900 assert(type != NULL);
2901 assert(frame != NULL);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002902 if (frame->f_exc_type == NULL) {
Thomas Wouters477c8d52006-05-27 19:21:47 +00002903 assert(frame->f_exc_value == NULL);
2904 assert(frame->f_exc_traceback == NULL);
2905 /* This frame didn't catch an exception before. */
2906 /* Save previous exception of this thread in this frame. */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002907 if (tstate->exc_type == NULL) {
Thomas Wouters477c8d52006-05-27 19:21:47 +00002908 /* XXX Why is this set to Py_None? */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002909 Py_INCREF(Py_None);
2910 tstate->exc_type = Py_None;
2911 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002912 Py_INCREF(tstate->exc_type);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002913 Py_XINCREF(tstate->exc_value);
2914 Py_XINCREF(tstate->exc_traceback);
2915 frame->f_exc_type = tstate->exc_type;
2916 frame->f_exc_value = tstate->exc_value;
2917 frame->f_exc_traceback = tstate->exc_traceback;
2918 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002919 /* Set new exception for this thread. */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002920 tmp_type = tstate->exc_type;
2921 tmp_value = tstate->exc_value;
2922 tmp_tb = tstate->exc_traceback;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002923 Py_INCREF(type);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002924 Py_XINCREF(value);
2925 Py_XINCREF(tb);
2926 tstate->exc_type = type;
2927 tstate->exc_value = value;
2928 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002929 Py_XDECREF(tmp_type);
2930 Py_XDECREF(tmp_value);
2931 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002932 /* For b/w compatibility */
2933 PySys_SetObject("exc_type", type);
2934 PySys_SetObject("exc_value", value);
2935 PySys_SetObject("exc_traceback", tb);
2936}
2937
2938static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002939reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002940{
2941 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002942 PyObject *tmp_type, *tmp_value, *tmp_tb;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002943
2944 /* It's a precondition that the thread state's frame caught an
2945 * exception -- verify in a debug build.
2946 */
2947 assert(tstate != NULL);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002948 frame = tstate->frame;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002949 assert(frame != NULL);
2950 assert(frame->f_exc_type != NULL);
2951
2952 /* Copy the frame's exception info back to the thread state. */
2953 tmp_type = tstate->exc_type;
2954 tmp_value = tstate->exc_value;
2955 tmp_tb = tstate->exc_traceback;
2956 Py_INCREF(frame->f_exc_type);
2957 Py_XINCREF(frame->f_exc_value);
2958 Py_XINCREF(frame->f_exc_traceback);
2959 tstate->exc_type = frame->f_exc_type;
2960 tstate->exc_value = frame->f_exc_value;
2961 tstate->exc_traceback = frame->f_exc_traceback;
2962 Py_XDECREF(tmp_type);
2963 Py_XDECREF(tmp_value);
2964 Py_XDECREF(tmp_tb);
2965
2966 /* For b/w compatibility */
2967 PySys_SetObject("exc_type", frame->f_exc_type);
2968 PySys_SetObject("exc_value", frame->f_exc_value);
2969 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
2970
2971 /* Clear the frame's exception info. */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002972 tmp_type = frame->f_exc_type;
2973 tmp_value = frame->f_exc_value;
2974 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002975 frame->f_exc_type = NULL;
2976 frame->f_exc_value = NULL;
2977 frame->f_exc_traceback = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002978 Py_DECREF(tmp_type);
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002979 Py_XDECREF(tmp_value);
2980 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002981}
2982
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002983/* Logic for the raise statement (too complicated for inlining).
2984 This *consumes* a reference count to each of its arguments. */
Raymond Hettinger7c958652004-04-06 10:11:10 +00002985static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002986do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002987{
Guido van Rossumd295f121998-04-09 21:39:57 +00002988 if (type == NULL) {
2989 /* Reraise */
Nicholas Bastine5662ae2004-03-24 22:22:12 +00002990 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossumd295f121998-04-09 21:39:57 +00002991 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
2992 value = tstate->exc_value;
2993 tb = tstate->exc_traceback;
2994 Py_XINCREF(type);
2995 Py_XINCREF(value);
2996 Py_XINCREF(tb);
2997 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002998
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002999 /* We support the following forms of raise:
3000 raise <class>, <classinstance>
3001 raise <class>, <argument tuple>
3002 raise <class>, None
3003 raise <class>, <argument>
3004 raise <classinstance>, None
3005 raise <string>, <object>
3006 raise <string>, None
3007
3008 An omitted second argument is the same as None.
3009
3010 In addition, raise <tuple>, <anything> is the same as
3011 raising the tuple's first item (and it better have one!);
3012 this rule is applied recursively.
3013
3014 Finally, an optional third argument can be supplied, which
3015 gives the traceback to be substituted (useful when
3016 re-raising an exception after examining it). */
3017
3018 /* First, check the traceback argument, replacing None with
3019 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00003020 if (tb == Py_None) {
3021 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003022 tb = NULL;
3023 }
3024 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003025 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003026 "raise: arg 3 must be a traceback or None");
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003027 goto raise_error;
3028 }
3029
3030 /* Next, replace a missing value with None */
3031 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003032 value = Py_None;
3033 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003034 }
3035
3036 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00003037 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
3038 PyObject *tmp = type;
3039 type = PyTuple_GET_ITEM(type, 0);
3040 Py_INCREF(type);
3041 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003042 }
3043
Guido van Rossum45aecf42006-03-15 04:58:47 +00003044 if (PyExceptionClass_Check(type))
Barry Warsaw4249f541997-08-22 21:26:19 +00003045 PyErr_NormalizeException(&type, &value, &tb);
3046
Brett Cannonbf364092006-03-01 04:25:17 +00003047 else if (PyExceptionInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003048 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00003049 if (value != Py_None) {
3050 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003051 "instance exception may not have a separate value");
3052 goto raise_error;
3053 }
3054 else {
3055 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00003056 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003057 value = type;
Brett Cannonbf364092006-03-01 04:25:17 +00003058 type = PyExceptionInstance_Class(type);
Guido van Rossumb209a111997-04-29 18:18:01 +00003059 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003060 }
3061 }
3062 else {
3063 /* Not something you can raise. You get an exception
3064 anyway, just not what you specified :-) */
Guido van Rossum45aecf42006-03-15 04:58:47 +00003065 PyErr_SetString(PyExc_TypeError,
3066 "exceptions must derive from BaseException");
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003067 goto raise_error;
3068 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003069 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003070 if (tb == NULL)
3071 return WHY_EXCEPTION;
3072 else
3073 return WHY_RERAISE;
3074 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00003075 Py_XDECREF(value);
3076 Py_XDECREF(type);
3077 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003078 return WHY_EXCEPTION;
3079}
3080
Tim Petersd6d010b2001-06-21 02:49:55 +00003081/* Iterate v argcnt times and store the results on the stack (via decreasing
3082 sp). Return 1 for success, 0 if error. */
3083
Barry Warsawe42b18f1997-08-25 22:13:04 +00003084static int
Tim Petersd6d010b2001-06-21 02:49:55 +00003085unpack_iterable(PyObject *v, int argcnt, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00003086{
Tim Petersd6d010b2001-06-21 02:49:55 +00003087 int i = 0;
3088 PyObject *it; /* iter(v) */
Barry Warsawe42b18f1997-08-25 22:13:04 +00003089 PyObject *w;
Guido van Rossumac7be682001-01-17 15:42:30 +00003090
Tim Petersd6d010b2001-06-21 02:49:55 +00003091 assert(v != NULL);
3092
3093 it = PyObject_GetIter(v);
3094 if (it == NULL)
3095 goto Error;
3096
3097 for (; i < argcnt; i++) {
3098 w = PyIter_Next(it);
3099 if (w == NULL) {
3100 /* Iterator done, via error or exhaustion. */
3101 if (!PyErr_Occurred()) {
3102 PyErr_Format(PyExc_ValueError,
3103 "need more than %d value%s to unpack",
3104 i, i == 1 ? "" : "s");
3105 }
3106 goto Error;
Barry Warsawe42b18f1997-08-25 22:13:04 +00003107 }
3108 *--sp = w;
3109 }
Tim Petersd6d010b2001-06-21 02:49:55 +00003110
3111 /* We better have exhausted the iterator now. */
3112 w = PyIter_Next(it);
3113 if (w == NULL) {
3114 if (PyErr_Occurred())
3115 goto Error;
3116 Py_DECREF(it);
3117 return 1;
Barry Warsawe42b18f1997-08-25 22:13:04 +00003118 }
Guido van Rossumbb8f59a2001-12-03 19:33:25 +00003119 Py_DECREF(w);
Tim Petersd6d010b2001-06-21 02:49:55 +00003120 PyErr_SetString(PyExc_ValueError, "too many values to unpack");
Barry Warsawe42b18f1997-08-25 22:13:04 +00003121 /* fall through */
Tim Petersd6d010b2001-06-21 02:49:55 +00003122Error:
Barry Warsaw91010551997-08-25 22:30:51 +00003123 for (; i > 0; i--, sp++)
3124 Py_DECREF(*sp);
Tim Petersd6d010b2001-06-21 02:49:55 +00003125 Py_XDECREF(it);
Barry Warsawe42b18f1997-08-25 22:13:04 +00003126 return 0;
3127}
3128
3129
Guido van Rossum96a42c81992-01-12 02:29:51 +00003130#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00003131static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003132prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003133{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003134 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00003135 if (PyObject_Print(v, stdout, 0) != 0)
3136 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00003137 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00003138 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003139}
Guido van Rossum3f5da241990-12-20 15:06:42 +00003140#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003141
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00003142static void
Fred Drake5755ce62001-06-27 19:19:46 +00003143call_exc_trace(Py_tracefunc func, PyObject *self, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00003144{
Guido van Rossumb209a111997-04-29 18:18:01 +00003145 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00003146 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00003147 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00003148 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003149 value = Py_None;
3150 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00003151 }
Raymond Hettinger8ae46892003-10-12 19:09:37 +00003152 arg = PyTuple_Pack(3, type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003153 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003154 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003155 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00003156 }
Fred Drake5755ce62001-06-27 19:19:46 +00003157 err = call_trace(func, self, f, PyTrace_EXCEPTION, arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00003158 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003159 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00003160 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003161 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00003162 Py_XDECREF(type);
3163 Py_XDECREF(value);
3164 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003165 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00003166}
3167
Fred Drake4ec5d562001-10-04 19:26:43 +00003168static void
3169call_trace_protected(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
Armin Rigo1c2d7e52005-09-20 18:34:01 +00003170 int what, PyObject *arg)
Fred Drake4ec5d562001-10-04 19:26:43 +00003171{
3172 PyObject *type, *value, *traceback;
3173 int err;
3174 PyErr_Fetch(&type, &value, &traceback);
Armin Rigo1c2d7e52005-09-20 18:34:01 +00003175 err = call_trace(func, obj, frame, what, arg);
Fred Drake4ec5d562001-10-04 19:26:43 +00003176 if (err == 0)
3177 PyErr_Restore(type, value, traceback);
3178 else {
3179 Py_XDECREF(type);
3180 Py_XDECREF(value);
3181 Py_XDECREF(traceback);
3182 }
3183}
3184
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00003185static int
Fred Drake5755ce62001-06-27 19:19:46 +00003186call_trace(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
3187 int what, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00003188{
Fred Drake5755ce62001-06-27 19:19:46 +00003189 register PyThreadState *tstate = frame->f_tstate;
3190 int result;
3191 if (tstate->tracing)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00003192 return 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +00003193 tstate->tracing++;
Fred Drake9e3ad782001-07-03 23:39:52 +00003194 tstate->use_tracing = 0;
Fred Drake5755ce62001-06-27 19:19:46 +00003195 result = func(obj, frame, what, arg);
Fred Drake9e3ad782001-07-03 23:39:52 +00003196 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
3197 || (tstate->c_profilefunc != NULL));
Guido van Rossuma027efa1997-05-05 20:56:21 +00003198 tstate->tracing--;
Fred Drake5755ce62001-06-27 19:19:46 +00003199 return result;
Guido van Rossum96a42c81992-01-12 02:29:51 +00003200}
3201
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00003202PyObject *
3203_PyEval_CallTracing(PyObject *func, PyObject *args)
3204{
3205 PyFrameObject *frame = PyEval_GetFrame();
3206 PyThreadState *tstate = frame->f_tstate;
3207 int save_tracing = tstate->tracing;
3208 int save_use_tracing = tstate->use_tracing;
3209 PyObject *result;
3210
3211 tstate->tracing = 0;
3212 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
3213 || (tstate->c_profilefunc != NULL));
3214 result = PyObject_Call(func, args, NULL);
3215 tstate->tracing = save_tracing;
3216 tstate->use_tracing = save_use_tracing;
3217 return result;
3218}
3219
Michael W. Hudson006c7522002-11-08 13:08:46 +00003220static int
Tim Peters8a5c3c72004-04-05 19:36:21 +00003221maybe_call_line_trace(Py_tracefunc func, PyObject *obj,
Armin Rigobf57a142004-03-22 19:24:58 +00003222 PyFrameObject *frame, int *instr_lb, int *instr_ub,
3223 int *instr_prev)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003224{
Michael W. Hudson006c7522002-11-08 13:08:46 +00003225 int result = 0;
3226
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003227 /* If the last instruction executed isn't in the current
3228 instruction window, reset the window. If the last
3229 instruction happens to fall at the start of a line or if it
3230 represents a jump backwards, call the trace function.
3231 */
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00003232 if ((frame->f_lasti < *instr_lb || frame->f_lasti >= *instr_ub)) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003233 int line;
3234 PyAddrPair bounds;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003235
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003236 line = PyCode_CheckLineNumber(frame->f_code, frame->f_lasti,
3237 &bounds);
3238 if (line >= 0) {
Michael W. Hudson02ff6a92002-09-11 15:36:32 +00003239 frame->f_lineno = line;
Tim Peters8a5c3c72004-04-05 19:36:21 +00003240 result = call_trace(func, obj, frame,
Michael W. Hudson006c7522002-11-08 13:08:46 +00003241 PyTrace_LINE, Py_None);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003242 }
3243 *instr_lb = bounds.ap_lower;
3244 *instr_ub = bounds.ap_upper;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003245 }
Armin Rigobf57a142004-03-22 19:24:58 +00003246 else if (frame->f_lasti <= *instr_prev) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003247 result = call_trace(func, obj, frame, PyTrace_LINE, Py_None);
Armin Rigobf57a142004-03-22 19:24:58 +00003248 }
3249 *instr_prev = frame->f_lasti;
Michael W. Hudson006c7522002-11-08 13:08:46 +00003250 return result;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003251}
3252
Fred Drake5755ce62001-06-27 19:19:46 +00003253void
3254PyEval_SetProfile(Py_tracefunc func, PyObject *arg)
Fred Draked0838392001-06-16 21:02:31 +00003255{
Nicholas Bastine5662ae2004-03-24 22:22:12 +00003256 PyThreadState *tstate = PyThreadState_GET();
Fred Drake5755ce62001-06-27 19:19:46 +00003257 PyObject *temp = tstate->c_profileobj;
3258 Py_XINCREF(arg);
3259 tstate->c_profilefunc = NULL;
3260 tstate->c_profileobj = NULL;
Brett Cannon55fa66d2005-06-25 07:07:35 +00003261 /* Must make sure that tracing is not ignored if 'temp' is freed */
Fred Drake9e3ad782001-07-03 23:39:52 +00003262 tstate->use_tracing = tstate->c_tracefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00003263 Py_XDECREF(temp);
3264 tstate->c_profilefunc = func;
3265 tstate->c_profileobj = arg;
Brett Cannon55fa66d2005-06-25 07:07:35 +00003266 /* Flag that tracing or profiling is turned on */
Fred Drake9e3ad782001-07-03 23:39:52 +00003267 tstate->use_tracing = (func != NULL) || (tstate->c_tracefunc != NULL);
Fred Drake5755ce62001-06-27 19:19:46 +00003268}
3269
3270void
3271PyEval_SetTrace(Py_tracefunc func, PyObject *arg)
3272{
Nicholas Bastine5662ae2004-03-24 22:22:12 +00003273 PyThreadState *tstate = PyThreadState_GET();
Fred Drake5755ce62001-06-27 19:19:46 +00003274 PyObject *temp = tstate->c_traceobj;
3275 Py_XINCREF(arg);
3276 tstate->c_tracefunc = NULL;
3277 tstate->c_traceobj = NULL;
Brett Cannon55fa66d2005-06-25 07:07:35 +00003278 /* Must make sure that profiling is not ignored if 'temp' is freed */
Fred Drake9e3ad782001-07-03 23:39:52 +00003279 tstate->use_tracing = tstate->c_profilefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00003280 Py_XDECREF(temp);
3281 tstate->c_tracefunc = func;
3282 tstate->c_traceobj = arg;
Brett Cannon55fa66d2005-06-25 07:07:35 +00003283 /* Flag that tracing or profiling is turned on */
Fred Drake9e3ad782001-07-03 23:39:52 +00003284 tstate->use_tracing = ((func != NULL)
3285 || (tstate->c_profilefunc != NULL));
Fred Draked0838392001-06-16 21:02:31 +00003286}
3287
Guido van Rossumb209a111997-04-29 18:18:01 +00003288PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003289PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00003290{
Guido van Rossum6297a7a2003-02-19 15:53:17 +00003291 PyFrameObject *current_frame = PyEval_GetFrame();
Guido van Rossum6135a871995-01-09 17:53:26 +00003292 if (current_frame == NULL)
Nicholas Bastine5662ae2004-03-24 22:22:12 +00003293 return PyThreadState_GET()->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00003294 else
3295 return current_frame->f_builtins;
3296}
3297
Guido van Rossumb209a111997-04-29 18:18:01 +00003298PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003299PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00003300{
Guido van Rossum6297a7a2003-02-19 15:53:17 +00003301 PyFrameObject *current_frame = PyEval_GetFrame();
Guido van Rossum5b722181993-03-30 17:46:03 +00003302 if (current_frame == NULL)
3303 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00003304 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00003305 return current_frame->f_locals;
3306}
3307
Guido van Rossumb209a111997-04-29 18:18:01 +00003308PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003309PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003310{
Guido van Rossum6297a7a2003-02-19 15:53:17 +00003311 PyFrameObject *current_frame = PyEval_GetFrame();
Guido van Rossum3f5da241990-12-20 15:06:42 +00003312 if (current_frame == NULL)
3313 return NULL;
3314 else
3315 return current_frame->f_globals;
3316}
3317
Guido van Rossum6297a7a2003-02-19 15:53:17 +00003318PyFrameObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003319PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00003320{
Nicholas Bastine5662ae2004-03-24 22:22:12 +00003321 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossum6297a7a2003-02-19 15:53:17 +00003322 return _PyThreadState_GetFrame(tstate);
Guido van Rossume59214e1994-08-30 08:01:59 +00003323}
3324
Guido van Rossum6135a871995-01-09 17:53:26 +00003325int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003326PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00003327{
Guido van Rossum6297a7a2003-02-19 15:53:17 +00003328 PyFrameObject *current_frame = PyEval_GetFrame();
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003329 return current_frame == NULL ? 0 : PyFrame_IsRestricted(current_frame);
Guido van Rossum6135a871995-01-09 17:53:26 +00003330}
3331
Guido van Rossumbe270261997-05-22 22:26:18 +00003332int
Tim Peters5ba58662001-07-16 02:29:45 +00003333PyEval_MergeCompilerFlags(PyCompilerFlags *cf)
Jeremy Hylton061d1062001-03-22 02:32:48 +00003334{
Guido van Rossum6297a7a2003-02-19 15:53:17 +00003335 PyFrameObject *current_frame = PyEval_GetFrame();
Just van Rossum3aaf42c2003-02-10 08:21:10 +00003336 int result = cf->cf_flags != 0;
Tim Peters5ba58662001-07-16 02:29:45 +00003337
3338 if (current_frame != NULL) {
3339 const int codeflags = current_frame->f_code->co_flags;
Tim Peterse2c18e92001-08-17 20:47:47 +00003340 const int compilerflags = codeflags & PyCF_MASK;
3341 if (compilerflags) {
Tim Peters5ba58662001-07-16 02:29:45 +00003342 result = 1;
Tim Peterse2c18e92001-08-17 20:47:47 +00003343 cf->cf_flags |= compilerflags;
Tim Peters5ba58662001-07-16 02:29:45 +00003344 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00003345#if 0 /* future keyword */
Martin v. Löwis7198a522002-01-01 19:59:11 +00003346 if (codeflags & CO_GENERATOR_ALLOWED) {
3347 result = 1;
3348 cf->cf_flags |= CO_GENERATOR_ALLOWED;
3349 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00003350#endif
Tim Peters5ba58662001-07-16 02:29:45 +00003351 }
3352 return result;
Jeremy Hylton061d1062001-03-22 02:32:48 +00003353}
3354
Guido van Rossum3f5da241990-12-20 15:06:42 +00003355
Guido van Rossum681d79a1995-07-18 14:51:37 +00003356/* External interface to call any callable object.
3357 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00003358
Guido van Rossumd7ed6831997-08-30 15:02:50 +00003359#undef PyEval_CallObject
3360/* for backward compatibility: export this interface */
3361
Guido van Rossumb209a111997-04-29 18:18:01 +00003362PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003363PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00003364{
Guido van Rossumb209a111997-04-29 18:18:01 +00003365 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003366}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00003367#define PyEval_CallObject(func,arg) \
3368 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00003369
Guido van Rossumb209a111997-04-29 18:18:01 +00003370PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003371PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003372{
Jeremy Hylton52820442001-01-03 23:52:36 +00003373 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003374
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00003375 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003376 arg = PyTuple_New(0);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00003377 if (arg == NULL)
3378 return NULL;
3379 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003380 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003381 PyErr_SetString(PyExc_TypeError,
3382 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00003383 return NULL;
3384 }
3385 else
Guido van Rossumb209a111997-04-29 18:18:01 +00003386 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003387
Guido van Rossumb209a111997-04-29 18:18:01 +00003388 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003389 PyErr_SetString(PyExc_TypeError,
3390 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00003391 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00003392 return NULL;
3393 }
3394
Tim Peters6d6c1a32001-08-02 04:15:00 +00003395 result = PyObject_Call(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00003396 Py_DECREF(arg);
Jeremy Hylton52820442001-01-03 23:52:36 +00003397 return result;
3398}
3399
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00003400const char *
Tim Peters6d6c1a32001-08-02 04:15:00 +00003401PyEval_GetFuncName(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00003402{
3403 if (PyMethod_Check(func))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003404 return PyEval_GetFuncName(PyMethod_GET_FUNCTION(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00003405 else if (PyFunction_Check(func))
3406 return PyString_AsString(((PyFunctionObject*)func)->func_name);
3407 else if (PyCFunction_Check(func))
3408 return ((PyCFunctionObject*)func)->m_ml->ml_name;
Guido van Rossum50e9fb92006-08-17 05:42:55 +00003409 else
Jeremy Hylton512a2372001-04-11 13:52:29 +00003410 return func->ob_type->tp_name;
Jeremy Hylton512a2372001-04-11 13:52:29 +00003411}
3412
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00003413const char *
Tim Peters6d6c1a32001-08-02 04:15:00 +00003414PyEval_GetFuncDesc(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00003415{
3416 if (PyMethod_Check(func))
3417 return "()";
3418 else if (PyFunction_Check(func))
3419 return "()";
3420 else if (PyCFunction_Check(func))
3421 return "()";
Guido van Rossum50e9fb92006-08-17 05:42:55 +00003422 else
Jeremy Hylton512a2372001-04-11 13:52:29 +00003423 return " object";
Jeremy Hylton512a2372001-04-11 13:52:29 +00003424}
3425
Neal Norwitzaddfe0c2002-11-10 14:33:26 +00003426static void
Jeremy Hylton192690e2002-08-16 18:36:11 +00003427err_args(PyObject *func, int flags, int nargs)
3428{
3429 if (flags & METH_NOARGS)
Tim Peters8a5c3c72004-04-05 19:36:21 +00003430 PyErr_Format(PyExc_TypeError,
Guido van Rossum86c659a2002-08-23 14:11:35 +00003431 "%.200s() takes no arguments (%d given)",
Tim Peters8a5c3c72004-04-05 19:36:21 +00003432 ((PyCFunctionObject *)func)->m_ml->ml_name,
Jeremy Hylton192690e2002-08-16 18:36:11 +00003433 nargs);
3434 else
Tim Peters8a5c3c72004-04-05 19:36:21 +00003435 PyErr_Format(PyExc_TypeError,
Guido van Rossum86c659a2002-08-23 14:11:35 +00003436 "%.200s() takes exactly one argument (%d given)",
Tim Peters8a5c3c72004-04-05 19:36:21 +00003437 ((PyCFunctionObject *)func)->m_ml->ml_name,
Jeremy Hylton192690e2002-08-16 18:36:11 +00003438 nargs);
3439}
3440
Armin Rigo1c2d7e52005-09-20 18:34:01 +00003441#define C_TRACE(x, call) \
Nicholas Bastind858a772004-06-25 23:31:06 +00003442if (tstate->use_tracing && tstate->c_profilefunc) { \
3443 if (call_trace(tstate->c_profilefunc, \
3444 tstate->c_profileobj, \
3445 tstate->frame, PyTrace_C_CALL, \
Armin Rigo1c2d7e52005-09-20 18:34:01 +00003446 func)) { \
3447 x = NULL; \
3448 } \
3449 else { \
3450 x = call; \
3451 if (tstate->c_profilefunc != NULL) { \
3452 if (x == NULL) { \
3453 call_trace_protected(tstate->c_profilefunc, \
3454 tstate->c_profileobj, \
3455 tstate->frame, PyTrace_C_EXCEPTION, \
3456 func); \
3457 /* XXX should pass (type, value, tb) */ \
3458 } else { \
3459 if (call_trace(tstate->c_profilefunc, \
3460 tstate->c_profileobj, \
3461 tstate->frame, PyTrace_C_RETURN, \
3462 func)) { \
3463 Py_DECREF(x); \
3464 x = NULL; \
3465 } \
3466 } \
Nicholas Bastinc69ebe82004-03-24 21:57:10 +00003467 } \
Nicholas Bastind858a772004-06-25 23:31:06 +00003468 } \
3469} else { \
Armin Rigo1c2d7e52005-09-20 18:34:01 +00003470 x = call; \
Nicholas Bastinc69ebe82004-03-24 21:57:10 +00003471 }
3472
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003473static PyObject *
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00003474call_function(PyObject ***pp_stack, int oparg
3475#ifdef WITH_TSC
3476 , uint64* pintr0, uint64* pintr1
3477#endif
3478 )
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003479{
3480 int na = oparg & 0xff;
3481 int nk = (oparg>>8) & 0xff;
3482 int n = na + 2 * nk;
3483 PyObject **pfunc = (*pp_stack) - n - 1;
3484 PyObject *func = *pfunc;
3485 PyObject *x, *w;
3486
Jeremy Hylton985eba52003-02-05 23:13:00 +00003487 /* Always dispatch PyCFunction first, because these are
3488 presumed to be the most frequent callable object.
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003489 */
3490 if (PyCFunction_Check(func) && nk == 0) {
3491 int flags = PyCFunction_GET_FLAGS(func);
Nicholas Bastind858a772004-06-25 23:31:06 +00003492 PyThreadState *tstate = PyThreadState_GET();
Raymond Hettingera7f56bc2004-06-26 04:34:33 +00003493
3494 PCALL(PCALL_CFUNCTION);
Jeremy Hylton192690e2002-08-16 18:36:11 +00003495 if (flags & (METH_NOARGS | METH_O)) {
3496 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
3497 PyObject *self = PyCFunction_GET_SELF(func);
Nicholas Bastinc69ebe82004-03-24 21:57:10 +00003498 if (flags & METH_NOARGS && na == 0) {
Armin Rigo1c2d7e52005-09-20 18:34:01 +00003499 C_TRACE(x, (*meth)(self,NULL));
Nicholas Bastinc69ebe82004-03-24 21:57:10 +00003500 }
Jeremy Hylton192690e2002-08-16 18:36:11 +00003501 else if (flags & METH_O && na == 1) {
3502 PyObject *arg = EXT_POP(*pp_stack);
Armin Rigo1c2d7e52005-09-20 18:34:01 +00003503 C_TRACE(x, (*meth)(self,arg));
Jeremy Hylton192690e2002-08-16 18:36:11 +00003504 Py_DECREF(arg);
3505 }
3506 else {
3507 err_args(func, flags, na);
3508 x = NULL;
3509 }
3510 }
3511 else {
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003512 PyObject *callargs;
3513 callargs = load_args(pp_stack, na);
Michael W. Hudson75eabd22005-01-18 15:56:11 +00003514 READ_TIMESTAMP(*pintr0);
Armin Rigo1c2d7e52005-09-20 18:34:01 +00003515 C_TRACE(x, PyCFunction_Call(func,callargs,NULL));
Michael W. Hudson75eabd22005-01-18 15:56:11 +00003516 READ_TIMESTAMP(*pintr1);
Tim Peters8a5c3c72004-04-05 19:36:21 +00003517 Py_XDECREF(callargs);
3518 }
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003519 } else {
3520 if (PyMethod_Check(func) && PyMethod_GET_SELF(func) != NULL) {
3521 /* optimize access to bound methods */
3522 PyObject *self = PyMethod_GET_SELF(func);
Jeremy Hylton985eba52003-02-05 23:13:00 +00003523 PCALL(PCALL_METHOD);
3524 PCALL(PCALL_BOUND_METHOD);
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003525 Py_INCREF(self);
3526 func = PyMethod_GET_FUNCTION(func);
3527 Py_INCREF(func);
3528 Py_DECREF(*pfunc);
3529 *pfunc = self;
3530 na++;
3531 n++;
3532 } else
3533 Py_INCREF(func);
Michael W. Hudson75eabd22005-01-18 15:56:11 +00003534 READ_TIMESTAMP(*pintr0);
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003535 if (PyFunction_Check(func))
3536 x = fast_function(func, pp_stack, n, na, nk);
Tim Peters8a5c3c72004-04-05 19:36:21 +00003537 else
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003538 x = do_call(func, pp_stack, na, nk);
Michael W. Hudson75eabd22005-01-18 15:56:11 +00003539 READ_TIMESTAMP(*pintr1);
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003540 Py_DECREF(func);
3541 }
Tim Peters8a5c3c72004-04-05 19:36:21 +00003542
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003543 /* Clear the stack of the function object. Also removes
3544 the arguments in case they weren't consumed already
3545 (fast_function() and err_args() leave them on the stack).
Thomas Wouters7f597322006-03-01 05:32:33 +00003546 */
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003547 while ((*pp_stack) > pfunc) {
3548 w = EXT_POP(*pp_stack);
3549 Py_DECREF(w);
Jeremy Hylton985eba52003-02-05 23:13:00 +00003550 PCALL(PCALL_POP);
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003551 }
3552 return x;
3553}
3554
Jeremy Hylton192690e2002-08-16 18:36:11 +00003555/* The fast_function() function optimize calls for which no argument
Jeremy Hylton52820442001-01-03 23:52:36 +00003556 tuple is necessary; the objects are passed directly from the stack.
Jeremy Hylton985eba52003-02-05 23:13:00 +00003557 For the simplest case -- a function that takes only positional
3558 arguments and is called with only positional arguments -- it
3559 inlines the most primitive frame setup code from
3560 PyEval_EvalCodeEx(), which vastly reduces the checks that must be
3561 done before evaluating the frame.
Jeremy Hylton52820442001-01-03 23:52:36 +00003562*/
3563
3564static PyObject *
Guido van Rossumac7be682001-01-17 15:42:30 +00003565fast_function(PyObject *func, PyObject ***pp_stack, int n, int na, int nk)
Jeremy Hylton52820442001-01-03 23:52:36 +00003566{
Jeremy Hylton985eba52003-02-05 23:13:00 +00003567 PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003568 PyObject *globals = PyFunction_GET_GLOBALS(func);
3569 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
Guido van Rossum4f72a782006-10-27 23:31:49 +00003570 PyObject *kwdefs = PyFunction_GET_KW_DEFAULTS(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003571 PyObject **d = NULL;
3572 int nd = 0;
3573
Jeremy Hylton985eba52003-02-05 23:13:00 +00003574 PCALL(PCALL_FUNCTION);
3575 PCALL(PCALL_FAST_FUNCTION);
Guido van Rossum4f72a782006-10-27 23:31:49 +00003576 if (argdefs == NULL && co->co_argcount == n &&
3577 co->co_kwonlyargcount == 0 && nk==0 &&
Jeremy Hylton985eba52003-02-05 23:13:00 +00003578 co->co_flags == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE)) {
3579 PyFrameObject *f;
3580 PyObject *retval = NULL;
3581 PyThreadState *tstate = PyThreadState_GET();
3582 PyObject **fastlocals, **stack;
3583 int i;
3584
3585 PCALL(PCALL_FASTER_FUNCTION);
3586 assert(globals != NULL);
3587 /* XXX Perhaps we should create a specialized
3588 PyFrame_New() that doesn't take locals, but does
3589 take builtins without sanity checking them.
3590 */
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00003591 assert(tstate != NULL);
Jeremy Hylton985eba52003-02-05 23:13:00 +00003592 f = PyFrame_New(tstate, co, globals, NULL);
3593 if (f == NULL)
3594 return NULL;
3595
3596 fastlocals = f->f_localsplus;
3597 stack = (*pp_stack) - n;
3598
3599 for (i = 0; i < n; i++) {
3600 Py_INCREF(*stack);
3601 fastlocals[i] = *stack++;
3602 }
Phillip J. Eby0d6615f2005-08-02 00:46:46 +00003603 retval = PyEval_EvalFrameEx(f,0);
Jeremy Hylton985eba52003-02-05 23:13:00 +00003604 ++tstate->recursion_depth;
3605 Py_DECREF(f);
3606 --tstate->recursion_depth;
3607 return retval;
3608 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003609 if (argdefs != NULL) {
3610 d = &PyTuple_GET_ITEM(argdefs, 0);
3611 nd = ((PyTupleObject *)argdefs)->ob_size;
3612 }
Jeremy Hylton985eba52003-02-05 23:13:00 +00003613 return PyEval_EvalCodeEx(co, globals,
3614 (PyObject *)NULL, (*pp_stack)-n, na,
Guido van Rossum4f72a782006-10-27 23:31:49 +00003615 (*pp_stack)-2*nk, nk, d, nd, kwdefs,
Jeremy Hylton985eba52003-02-05 23:13:00 +00003616 PyFunction_GET_CLOSURE(func));
Jeremy Hylton52820442001-01-03 23:52:36 +00003617}
3618
3619static PyObject *
Ka-Ping Yee20579702001-01-15 22:14:16 +00003620update_keyword_args(PyObject *orig_kwdict, int nk, PyObject ***pp_stack,
3621 PyObject *func)
Jeremy Hylton52820442001-01-03 23:52:36 +00003622{
3623 PyObject *kwdict = NULL;
3624 if (orig_kwdict == NULL)
3625 kwdict = PyDict_New();
3626 else {
3627 kwdict = PyDict_Copy(orig_kwdict);
3628 Py_DECREF(orig_kwdict);
3629 }
3630 if (kwdict == NULL)
3631 return NULL;
Raymond Hettinger5bed4562004-04-10 23:34:17 +00003632 while (--nk >= 0) {
Jeremy Hylton52820442001-01-03 23:52:36 +00003633 int err;
3634 PyObject *value = EXT_POP(*pp_stack);
3635 PyObject *key = EXT_POP(*pp_stack);
3636 if (PyDict_GetItem(kwdict, key) != NULL) {
Guido van Rossumac7be682001-01-17 15:42:30 +00003637 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +00003638 "%.200s%s got multiple values "
Jeremy Hylton512a2372001-04-11 13:52:29 +00003639 "for keyword argument '%.200s'",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003640 PyEval_GetFuncName(func),
3641 PyEval_GetFuncDesc(func),
Jeremy Hylton512a2372001-04-11 13:52:29 +00003642 PyString_AsString(key));
Jeremy Hylton52820442001-01-03 23:52:36 +00003643 Py_DECREF(key);
3644 Py_DECREF(value);
3645 Py_DECREF(kwdict);
3646 return NULL;
3647 }
3648 err = PyDict_SetItem(kwdict, key, value);
3649 Py_DECREF(key);
3650 Py_DECREF(value);
3651 if (err) {
3652 Py_DECREF(kwdict);
3653 return NULL;
3654 }
3655 }
3656 return kwdict;
3657}
3658
3659static PyObject *
3660update_star_args(int nstack, int nstar, PyObject *stararg,
3661 PyObject ***pp_stack)
3662{
3663 PyObject *callargs, *w;
3664
3665 callargs = PyTuple_New(nstack + nstar);
3666 if (callargs == NULL) {
3667 return NULL;
3668 }
3669 if (nstar) {
3670 int i;
3671 for (i = 0; i < nstar; i++) {
3672 PyObject *a = PyTuple_GET_ITEM(stararg, i);
3673 Py_INCREF(a);
3674 PyTuple_SET_ITEM(callargs, nstack + i, a);
3675 }
3676 }
Raymond Hettinger5bed4562004-04-10 23:34:17 +00003677 while (--nstack >= 0) {
Jeremy Hylton52820442001-01-03 23:52:36 +00003678 w = EXT_POP(*pp_stack);
3679 PyTuple_SET_ITEM(callargs, nstack, w);
3680 }
3681 return callargs;
3682}
3683
3684static PyObject *
3685load_args(PyObject ***pp_stack, int na)
3686{
3687 PyObject *args = PyTuple_New(na);
3688 PyObject *w;
3689
3690 if (args == NULL)
3691 return NULL;
Raymond Hettinger5bed4562004-04-10 23:34:17 +00003692 while (--na >= 0) {
Jeremy Hylton52820442001-01-03 23:52:36 +00003693 w = EXT_POP(*pp_stack);
3694 PyTuple_SET_ITEM(args, na, w);
3695 }
3696 return args;
3697}
3698
3699static PyObject *
3700do_call(PyObject *func, PyObject ***pp_stack, int na, int nk)
3701{
3702 PyObject *callargs = NULL;
3703 PyObject *kwdict = NULL;
3704 PyObject *result = NULL;
3705
3706 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003707 kwdict = update_keyword_args(NULL, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003708 if (kwdict == NULL)
3709 goto call_fail;
3710 }
3711 callargs = load_args(pp_stack, na);
3712 if (callargs == NULL)
3713 goto call_fail;
Jeremy Hylton985eba52003-02-05 23:13:00 +00003714#ifdef CALL_PROFILE
3715 /* At this point, we have to look at the type of func to
3716 update the call stats properly. Do it here so as to avoid
3717 exposing the call stats machinery outside ceval.c
3718 */
3719 if (PyFunction_Check(func))
3720 PCALL(PCALL_FUNCTION);
3721 else if (PyMethod_Check(func))
3722 PCALL(PCALL_METHOD);
3723 else if (PyType_Check(func))
3724 PCALL(PCALL_TYPE);
3725 else
3726 PCALL(PCALL_OTHER);
3727#endif
Tim Peters6d6c1a32001-08-02 04:15:00 +00003728 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00003729 call_fail:
3730 Py_XDECREF(callargs);
3731 Py_XDECREF(kwdict);
3732 return result;
3733}
3734
3735static PyObject *
3736ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)
3737{
3738 int nstar = 0;
3739 PyObject *callargs = NULL;
3740 PyObject *stararg = NULL;
3741 PyObject *kwdict = NULL;
3742 PyObject *result = NULL;
3743
3744 if (flags & CALL_FLAG_KW) {
3745 kwdict = EXT_POP(*pp_stack);
3746 if (!(kwdict && PyDict_Check(kwdict))) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003747 PyErr_Format(PyExc_TypeError,
Jeremy Hylton512a2372001-04-11 13:52:29 +00003748 "%s%s argument after ** "
3749 "must be a dictionary",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003750 PyEval_GetFuncName(func),
3751 PyEval_GetFuncDesc(func));
Jeremy Hylton52820442001-01-03 23:52:36 +00003752 goto ext_call_fail;
3753 }
3754 }
3755 if (flags & CALL_FLAG_VAR) {
3756 stararg = EXT_POP(*pp_stack);
3757 if (!PyTuple_Check(stararg)) {
3758 PyObject *t = NULL;
3759 t = PySequence_Tuple(stararg);
3760 if (t == NULL) {
Jeremy Hylton512a2372001-04-11 13:52:29 +00003761 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
3762 PyErr_Format(PyExc_TypeError,
3763 "%s%s argument after * "
3764 "must be a sequence",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003765 PyEval_GetFuncName(func),
3766 PyEval_GetFuncDesc(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00003767 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003768 goto ext_call_fail;
3769 }
3770 Py_DECREF(stararg);
3771 stararg = t;
3772 }
3773 nstar = PyTuple_GET_SIZE(stararg);
3774 }
3775 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003776 kwdict = update_keyword_args(kwdict, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003777 if (kwdict == NULL)
3778 goto ext_call_fail;
3779 }
3780 callargs = update_star_args(na, nstar, stararg, pp_stack);
3781 if (callargs == NULL)
3782 goto ext_call_fail;
Jeremy Hylton985eba52003-02-05 23:13:00 +00003783#ifdef CALL_PROFILE
3784 /* At this point, we have to look at the type of func to
3785 update the call stats properly. Do it here so as to avoid
3786 exposing the call stats machinery outside ceval.c
3787 */
3788 if (PyFunction_Check(func))
3789 PCALL(PCALL_FUNCTION);
3790 else if (PyMethod_Check(func))
3791 PCALL(PCALL_METHOD);
3792 else if (PyType_Check(func))
3793 PCALL(PCALL_TYPE);
3794 else
3795 PCALL(PCALL_OTHER);
3796#endif
Tim Peters6d6c1a32001-08-02 04:15:00 +00003797 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00003798 ext_call_fail:
3799 Py_XDECREF(callargs);
3800 Py_XDECREF(kwdict);
3801 Py_XDECREF(stararg);
3802 return result;
3803}
3804
Guido van Rossum38fff8c2006-03-07 18:50:55 +00003805/* Extract a slice index from a PyInt or PyLong or an object with the
3806 nb_index slot defined, and store in *pi.
3807 Silently reduce values larger than PY_SSIZE_T_MAX to PY_SSIZE_T_MAX,
3808 and silently boost values less than -PY_SSIZE_T_MAX-1 to -PY_SSIZE_T_MAX-1.
Martin v. Löwisdde99d22006-02-17 15:57:41 +00003809 Return 0 on error, 1 on success.
Tim Peterscb479e72001-12-16 19:11:44 +00003810*/
Tim Petersb5196382001-12-16 19:44:20 +00003811/* Note: If v is NULL, return success without storing into *pi. This
3812 is because_PyEval_SliceIndex() is called by apply_slice(), which can be
3813 called by the SLICE opcode with v and/or w equal to NULL.
Tim Peterscb479e72001-12-16 19:11:44 +00003814*/
Guido van Rossum20c6add2000-05-08 14:06:50 +00003815int
Martin v. Löwis18e16552006-02-15 17:27:45 +00003816_PyEval_SliceIndex(PyObject *v, Py_ssize_t *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003817{
Tim Petersb5196382001-12-16 19:44:20 +00003818 if (v != NULL) {
Martin v. Löwisdde99d22006-02-17 15:57:41 +00003819 Py_ssize_t x;
Guido van Rossumddefaf32007-01-14 03:31:43 +00003820 if (PyInt_CheckExact(v)) {
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00003821 /* XXX(nnorwitz): I think PyInt_AS_LONG is correct,
3822 however, it looks like it should be AsSsize_t.
3823 There should be a comment here explaining why.
3824 */
3825 x = PyInt_AS_LONG(v);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003826 }
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00003827 else if (PyIndex_Check(v)) {
3828 x = PyNumber_AsSsize_t(v, NULL);
Guido van Rossum38fff8c2006-03-07 18:50:55 +00003829 if (x == -1 && PyErr_Occurred())
3830 return 0;
3831 }
3832 else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003833 PyErr_SetString(PyExc_TypeError,
Guido van Rossum38fff8c2006-03-07 18:50:55 +00003834 "slice indices must be integers or "
3835 "None or have an __index__ method");
Guido van Rossum20c6add2000-05-08 14:06:50 +00003836 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003837 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00003838 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003839 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00003840 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003841}
3842
Guido van Rossum38fff8c2006-03-07 18:50:55 +00003843#undef ISINDEX
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00003844#define ISINDEX(x) ((x) == NULL || \
3845 PyInt_Check(x) || PyLong_Check(x) || PyIndex_Check(x))
Guido van Rossum50d756e2001-08-18 17:43:36 +00003846
Guido van Rossumb209a111997-04-29 18:18:01 +00003847static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003848apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003849{
Guido van Rossum50d756e2001-08-18 17:43:36 +00003850 PyTypeObject *tp = u->ob_type;
3851 PySequenceMethods *sq = tp->tp_as_sequence;
3852
Guido van Rossum38fff8c2006-03-07 18:50:55 +00003853 if (sq && sq->sq_slice && ISINDEX(v) && ISINDEX(w)) {
Martin v. Löwisdde99d22006-02-17 15:57:41 +00003854 Py_ssize_t ilow = 0, ihigh = PY_SSIZE_T_MAX;
Guido van Rossum50d756e2001-08-18 17:43:36 +00003855 if (!_PyEval_SliceIndex(v, &ilow))
3856 return NULL;
3857 if (!_PyEval_SliceIndex(w, &ihigh))
3858 return NULL;
3859 return PySequence_GetSlice(u, ilow, ihigh);
3860 }
3861 else {
3862 PyObject *slice = PySlice_New(v, w, NULL);
Guido van Rossum354797c2001-12-03 19:45:06 +00003863 if (slice != NULL) {
3864 PyObject *res = PyObject_GetItem(u, slice);
3865 Py_DECREF(slice);
3866 return res;
3867 }
Guido van Rossum50d756e2001-08-18 17:43:36 +00003868 else
3869 return NULL;
3870 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003871}
Guido van Rossum3f5da241990-12-20 15:06:42 +00003872
3873static int
Guido van Rossumac7be682001-01-17 15:42:30 +00003874assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x)
3875 /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003876{
Guido van Rossum50d756e2001-08-18 17:43:36 +00003877 PyTypeObject *tp = u->ob_type;
3878 PySequenceMethods *sq = tp->tp_as_sequence;
3879
Guido van Rossum38fff8c2006-03-07 18:50:55 +00003880 if (sq && sq->sq_slice && ISINDEX(v) && ISINDEX(w)) {
Martin v. Löwisdde99d22006-02-17 15:57:41 +00003881 Py_ssize_t ilow = 0, ihigh = PY_SSIZE_T_MAX;
Guido van Rossum50d756e2001-08-18 17:43:36 +00003882 if (!_PyEval_SliceIndex(v, &ilow))
3883 return -1;
3884 if (!_PyEval_SliceIndex(w, &ihigh))
3885 return -1;
3886 if (x == NULL)
3887 return PySequence_DelSlice(u, ilow, ihigh);
3888 else
3889 return PySequence_SetSlice(u, ilow, ihigh, x);
3890 }
3891 else {
3892 PyObject *slice = PySlice_New(v, w, NULL);
3893 if (slice != NULL) {
Guido van Rossum354797c2001-12-03 19:45:06 +00003894 int res;
Guido van Rossum50d756e2001-08-18 17:43:36 +00003895 if (x != NULL)
Guido van Rossum354797c2001-12-03 19:45:06 +00003896 res = PyObject_SetItem(u, slice, x);
Guido van Rossum50d756e2001-08-18 17:43:36 +00003897 else
Guido van Rossum354797c2001-12-03 19:45:06 +00003898 res = PyObject_DelItem(u, slice);
3899 Py_DECREF(slice);
3900 return res;
Guido van Rossum50d756e2001-08-18 17:43:36 +00003901 }
3902 else
3903 return -1;
3904 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003905}
3906
Brett Cannon39590462007-02-26 22:01:14 +00003907#define CANNOT_CATCH_MSG "catching classes that do not inherit from"\
3908 "BaseException is not allowed"
Brett Cannonf74225d2007-02-26 21:10:16 +00003909
Guido van Rossumb209a111997-04-29 18:18:01 +00003910static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003911cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003912{
Guido van Rossumac7be682001-01-17 15:42:30 +00003913 int res = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003914 switch (op) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00003915 case PyCmp_IS:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003916 res = (v == w);
Raymond Hettinger4bad9ba2003-01-19 05:08:13 +00003917 break;
3918 case PyCmp_IS_NOT:
3919 res = (v != w);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003920 break;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003921 case PyCmp_IN:
Raymond Hettinger4bad9ba2003-01-19 05:08:13 +00003922 res = PySequence_Contains(w, v);
3923 if (res < 0)
3924 return NULL;
3925 break;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003926 case PyCmp_NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003927 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003928 if (res < 0)
3929 return NULL;
Raymond Hettinger4bad9ba2003-01-19 05:08:13 +00003930 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003931 break;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003932 case PyCmp_EXC_MATCH:
Thomas Wouters9fe394c2007-02-05 01:24:16 +00003933 if (PyTuple_Check(w)) {
3934 Py_ssize_t i, length;
3935 length = PyTuple_Size(w);
3936 for (i = 0; i < length; i += 1) {
3937 PyObject *exc = PyTuple_GET_ITEM(w, i);
Brett Cannon39590462007-02-26 22:01:14 +00003938 if (!PyExceptionClass_Check(exc)) {
3939 PyErr_SetString(PyExc_TypeError,
3940 CANNOT_CATCH_MSG);
Brett Cannonf74225d2007-02-26 21:10:16 +00003941 return NULL;
Thomas Wouters9fe394c2007-02-05 01:24:16 +00003942 }
3943 }
3944 }
3945 else {
Brett Cannon39590462007-02-26 22:01:14 +00003946 if (!PyExceptionClass_Check(w)) {
3947 PyErr_SetString(PyExc_TypeError,
3948 CANNOT_CATCH_MSG);
Brett Cannonf74225d2007-02-26 21:10:16 +00003949 return NULL;
Thomas Wouters9fe394c2007-02-05 01:24:16 +00003950 }
3951 }
Barry Warsaw4249f541997-08-22 21:26:19 +00003952 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003953 break;
3954 default:
Guido van Rossumac7be682001-01-17 15:42:30 +00003955 return PyObject_RichCompare(v, w, op);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003956 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003957 v = res ? Py_True : Py_False;
3958 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003959 return v;
3960}
3961
Thomas Wouters52152252000-08-17 22:55:00 +00003962static PyObject *
3963import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003964{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003965 PyObject *x;
3966
3967 x = PyObject_GetAttr(v, name);
3968 if (x == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
Thomas Wouters52152252000-08-17 22:55:00 +00003969 PyErr_Format(PyExc_ImportError,
3970 "cannot import name %.230s",
3971 PyString_AsString(name));
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003972 }
Thomas Wouters52152252000-08-17 22:55:00 +00003973 return x;
3974}
Guido van Rossumac7be682001-01-17 15:42:30 +00003975
Thomas Wouters52152252000-08-17 22:55:00 +00003976static int
3977import_all_from(PyObject *locals, PyObject *v)
3978{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003979 PyObject *all = PyObject_GetAttrString(v, "__all__");
3980 PyObject *dict, *name, *value;
3981 int skip_leading_underscores = 0;
3982 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00003983
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003984 if (all == NULL) {
3985 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3986 return -1; /* Unexpected error */
3987 PyErr_Clear();
3988 dict = PyObject_GetAttrString(v, "__dict__");
3989 if (dict == NULL) {
3990 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3991 return -1;
3992 PyErr_SetString(PyExc_ImportError,
3993 "from-import-* object has no __dict__ and no __all__");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003994 return -1;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003995 }
3996 all = PyMapping_Keys(dict);
3997 Py_DECREF(dict);
3998 if (all == NULL)
3999 return -1;
4000 skip_leading_underscores = 1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00004001 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00004002
4003 for (pos = 0, err = 0; ; pos++) {
4004 name = PySequence_GetItem(all, pos);
4005 if (name == NULL) {
4006 if (!PyErr_ExceptionMatches(PyExc_IndexError))
4007 err = -1;
4008 else
4009 PyErr_Clear();
4010 break;
4011 }
4012 if (skip_leading_underscores &&
4013 PyString_Check(name) &&
4014 PyString_AS_STRING(name)[0] == '_')
4015 {
4016 Py_DECREF(name);
4017 continue;
4018 }
4019 value = PyObject_GetAttr(v, name);
4020 if (value == NULL)
4021 err = -1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00004022 else if (PyDict_CheckExact(locals))
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00004023 err = PyDict_SetItem(locals, name, value);
Thomas Wouters89f507f2006-12-13 04:49:30 +00004024 else
4025 err = PyObject_SetItem(locals, name, value);
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00004026 Py_DECREF(name);
4027 Py_XDECREF(value);
4028 if (err != 0)
4029 break;
4030 }
4031 Py_DECREF(all);
4032 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00004033}
4034
Guido van Rossumac7be682001-01-17 15:42:30 +00004035static void
Paul Prescode68140d2000-08-30 20:25:01 +00004036format_exc_check_arg(PyObject *exc, char *format_str, PyObject *obj)
4037{
4038 char *obj_str;
4039
4040 if (!obj)
4041 return;
4042
4043 obj_str = PyString_AsString(obj);
4044 if (!obj_str)
4045 return;
4046
4047 PyErr_Format(exc, format_str, obj_str);
4048}
Guido van Rossum950361c1997-01-24 13:49:28 +00004049
Raymond Hettinger52a21b82004-08-06 18:43:09 +00004050static PyObject *
4051string_concatenate(PyObject *v, PyObject *w,
4052 PyFrameObject *f, unsigned char *next_instr)
4053{
4054 /* This function implements 'variable += expr' when both arguments
4055 are strings. */
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004056 Py_ssize_t v_len = PyString_GET_SIZE(v);
4057 Py_ssize_t w_len = PyString_GET_SIZE(w);
4058 Py_ssize_t new_len = v_len + w_len;
4059 if (new_len < 0) {
4060 PyErr_SetString(PyExc_OverflowError,
4061 "strings are too large to concat");
4062 return NULL;
4063 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00004064
Raymond Hettinger52a21b82004-08-06 18:43:09 +00004065 if (v->ob_refcnt == 2) {
4066 /* In the common case, there are 2 references to the value
4067 * stored in 'variable' when the += is performed: one on the
4068 * value stack (in 'v') and one still stored in the 'variable'.
4069 * We try to delete the variable now to reduce the refcnt to 1.
4070 */
4071 switch (*next_instr) {
4072 case STORE_FAST:
4073 {
4074 int oparg = PEEKARG();
4075 PyObject **fastlocals = f->f_localsplus;
4076 if (GETLOCAL(oparg) == v)
4077 SETLOCAL(oparg, NULL);
4078 break;
4079 }
4080 case STORE_DEREF:
4081 {
Thomas Wouters477c8d52006-05-27 19:21:47 +00004082 PyObject **freevars = f->f_localsplus + f->f_code->co_nlocals;
Raymond Hettinger52a21b82004-08-06 18:43:09 +00004083 PyObject *c = freevars[PEEKARG()];
4084 if (PyCell_GET(c) == v)
4085 PyCell_Set(c, NULL);
4086 break;
4087 }
4088 case STORE_NAME:
4089 {
4090 PyObject *names = f->f_code->co_names;
4091 PyObject *name = GETITEM(names, PEEKARG());
4092 PyObject *locals = f->f_locals;
4093 if (PyDict_CheckExact(locals) &&
4094 PyDict_GetItem(locals, name) == v) {
4095 if (PyDict_DelItem(locals, name) != 0) {
4096 PyErr_Clear();
4097 }
4098 }
4099 break;
4100 }
4101 }
4102 }
4103
Armin Rigo618fbf52004-08-07 20:58:32 +00004104 if (v->ob_refcnt == 1 && !PyString_CHECK_INTERNED(v)) {
Raymond Hettinger52a21b82004-08-06 18:43:09 +00004105 /* Now we own the last reference to 'v', so we can resize it
4106 * in-place.
4107 */
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004108 if (_PyString_Resize(&v, new_len) != 0) {
Raymond Hettinger52a21b82004-08-06 18:43:09 +00004109 /* XXX if _PyString_Resize() fails, 'v' has been
4110 * deallocated so it cannot be put back into 'variable'.
4111 * The MemoryError is raised when there is no value in
4112 * 'variable', which might (very remotely) be a cause
4113 * of incompatibilities.
4114 */
4115 return NULL;
4116 }
4117 /* copy 'w' into the newly allocated area of 'v' */
4118 memcpy(PyString_AS_STRING(v) + v_len,
4119 PyString_AS_STRING(w), w_len);
4120 return v;
4121 }
4122 else {
4123 /* When in-place resizing is not an option. */
4124 PyString_Concat(&v, w);
4125 return v;
4126 }
4127}
4128
Guido van Rossum950361c1997-01-24 13:49:28 +00004129#ifdef DYNAMIC_EXECUTION_PROFILE
4130
Skip Montanarof118cb12001-10-15 20:51:38 +00004131static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004132getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00004133{
4134 int i;
4135 PyObject *l = PyList_New(256);
4136 if (l == NULL) return NULL;
4137 for (i = 0; i < 256; i++) {
4138 PyObject *x = PyInt_FromLong(a[i]);
4139 if (x == NULL) {
4140 Py_DECREF(l);
4141 return NULL;
4142 }
4143 PyList_SetItem(l, i, x);
4144 }
4145 for (i = 0; i < 256; i++)
4146 a[i] = 0;
4147 return l;
4148}
4149
4150PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004151_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00004152{
4153#ifndef DXPAIRS
4154 return getarray(dxp);
4155#else
4156 int i;
4157 PyObject *l = PyList_New(257);
4158 if (l == NULL) return NULL;
4159 for (i = 0; i < 257; i++) {
4160 PyObject *x = getarray(dxpairs[i]);
4161 if (x == NULL) {
4162 Py_DECREF(l);
4163 return NULL;
4164 }
4165 PyList_SetItem(l, i, x);
4166 }
4167 return l;
4168#endif
4169}
4170
4171#endif