blob: 73e7ea9bca9ecc088680458024e3ac5942e875a8 [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 *);
Guido van Rossum0368b722007-05-11 16:50:42 +0000480static int unpack_iterable(PyObject *, int, 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 Rossumd8faa362007-04-27 19:54:29 +0000660#define EXT_POP(STACK_POINTER) (lltrace && prtrace((STACK_POINTER)[-1], "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 }
Guido van Rossum0368b722007-05-11 16:50:42 +00001659 } else if (unpack_iterable(v, oparg, -1,
Guido van Rossumd8faa362007-04-27 19:54:29 +00001660 stack_pointer + oparg)) {
Tim Petersd6d010b2001-06-21 02:49:55 +00001661 stack_pointer += oparg;
Guido van Rossumd8faa362007-04-27 19:54:29 +00001662 } else {
1663 /* unpack_iterable() raised an exception */
Barry Warsawe42b18f1997-08-25 22:13:04 +00001664 why = WHY_EXCEPTION;
Tim Peters8b13b3e2001-09-30 05:58:42 +00001665 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001666 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001667 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001668
Guido van Rossum0368b722007-05-11 16:50:42 +00001669 case UNPACK_EX:
1670 {
1671 int totalargs = 1 + (oparg & 0xFF) + (oparg >> 8);
1672 v = POP();
1673
1674 if (unpack_iterable(v, oparg & 0xFF, oparg >> 8,
1675 stack_pointer + totalargs)) {
1676 stack_pointer += totalargs;
1677 } else {
1678 why = WHY_EXCEPTION;
1679 }
1680 Py_DECREF(v);
1681 break;
1682 }
1683
Guido van Rossum374a9221991-04-04 10:40:29 +00001684 case STORE_ATTR:
Skip Montanaro496e6582002-08-06 17:47:40 +00001685 w = GETITEM(names, oparg);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001686 v = TOP();
1687 u = SECOND();
1688 STACKADJ(-2);
Guido van Rossumb209a111997-04-29 18:18:01 +00001689 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1690 Py_DECREF(v);
1691 Py_DECREF(u);
Raymond Hettinger7eddd782004-04-07 14:38:08 +00001692 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001693 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001694
Guido van Rossum374a9221991-04-04 10:40:29 +00001695 case DELETE_ATTR:
Skip Montanaro496e6582002-08-06 17:47:40 +00001696 w = GETITEM(names, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001697 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001698 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1699 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001700 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001701 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001702
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001703 case STORE_GLOBAL:
Skip Montanaro496e6582002-08-06 17:47:40 +00001704 w = GETITEM(names, oparg);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001705 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001706 err = PyDict_SetItem(f->f_globals, w, v);
1707 Py_DECREF(v);
Raymond Hettinger7eddd782004-04-07 14:38:08 +00001708 if (err == 0) continue;
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001709 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001710
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001711 case DELETE_GLOBAL:
Skip Montanaro496e6582002-08-06 17:47:40 +00001712 w = GETITEM(names, oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001713 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001714 format_exc_check_arg(
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001715 PyExc_NameError, GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001716 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001717
Guido van Rossum374a9221991-04-04 10:40:29 +00001718 case LOAD_NAME:
Skip Montanaro496e6582002-08-06 17:47:40 +00001719 w = GETITEM(names, oparg);
Raymond Hettinger214b1c32004-07-02 06:41:07 +00001720 if ((v = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001721 PyErr_Format(PyExc_SystemError,
1722 "no locals when loading %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001723 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001724 break;
1725 }
Michael W. Hudsona3711f72004-08-02 14:50:43 +00001726 if (PyDict_CheckExact(v)) {
Raymond Hettinger214b1c32004-07-02 06:41:07 +00001727 x = PyDict_GetItem(v, w);
Michael W. Hudsona3711f72004-08-02 14:50:43 +00001728 Py_XINCREF(x);
1729 }
Raymond Hettinger214b1c32004-07-02 06:41:07 +00001730 else {
1731 x = PyObject_GetItem(v, w);
1732 if (x == NULL && PyErr_Occurred()) {
1733 if (!PyErr_ExceptionMatches(PyExc_KeyError))
1734 break;
1735 PyErr_Clear();
1736 }
1737 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001738 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001739 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001740 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001741 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001742 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001743 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001744 PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001745 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001746 break;
1747 }
1748 }
Michael W. Hudsona3711f72004-08-02 14:50:43 +00001749 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001750 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001751 PUSH(x);
Raymond Hettinger467a6982004-04-07 11:39:21 +00001752 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001753
Guido van Rossum374a9221991-04-04 10:40:29 +00001754 case LOAD_GLOBAL:
Skip Montanaro496e6582002-08-06 17:47:40 +00001755 w = GETITEM(names, oparg);
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001756 if (PyString_CheckExact(w)) {
Guido van Rossumd8dbf842002-08-19 21:17:53 +00001757 /* Inline the PyDict_GetItem() calls.
1758 WARNING: this is an extreme speed hack.
1759 Do not try this at home. */
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001760 long hash = ((PyStringObject *)w)->ob_shash;
1761 if (hash != -1) {
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001762 PyDictObject *d;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001763 PyDictEntry *e;
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001764 d = (PyDictObject *)(f->f_globals);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001765 e = d->ma_lookup(d, w, hash);
1766 if (e == NULL) {
1767 x = NULL;
1768 break;
1769 }
1770 x = e->me_value;
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001771 if (x != NULL) {
1772 Py_INCREF(x);
1773 PUSH(x);
1774 continue;
1775 }
1776 d = (PyDictObject *)(f->f_builtins);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001777 e = d->ma_lookup(d, w, hash);
1778 if (e == NULL) {
1779 x = NULL;
1780 break;
1781 }
1782 x = e->me_value;
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001783 if (x != NULL) {
1784 Py_INCREF(x);
1785 PUSH(x);
1786 continue;
1787 }
1788 goto load_global_error;
1789 }
1790 }
1791 /* This is the un-inlined version of the code above */
Guido van Rossumb209a111997-04-29 18:18:01 +00001792 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001793 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001794 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001795 if (x == NULL) {
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001796 load_global_error:
Paul Prescode68140d2000-08-30 20:25:01 +00001797 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001798 PyExc_NameError,
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001799 GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001800 break;
1801 }
1802 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001803 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001804 PUSH(x);
Raymond Hettinger7eddd782004-04-07 14:38:08 +00001805 continue;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001806
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001807 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001808 x = GETLOCAL(oparg);
Raymond Hettinger467a6982004-04-07 11:39:21 +00001809 if (x != NULL) {
1810 SETLOCAL(oparg, NULL);
1811 continue;
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001812 }
Raymond Hettinger467a6982004-04-07 11:39:21 +00001813 format_exc_check_arg(
1814 PyExc_UnboundLocalError,
1815 UNBOUNDLOCAL_ERROR_MSG,
1816 PyTuple_GetItem(co->co_varnames, oparg)
1817 );
1818 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001819
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001820 case LOAD_CLOSURE:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001821 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001822 Py_INCREF(x);
1823 PUSH(x);
Raymond Hettinger7eddd782004-04-07 14:38:08 +00001824 if (x != NULL) continue;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001825 break;
1826
1827 case LOAD_DEREF:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001828 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001829 w = PyCell_Get(x);
Raymond Hettinger467a6982004-04-07 11:39:21 +00001830 if (w != NULL) {
1831 PUSH(w);
1832 continue;
Jeremy Hylton2524d692001-02-05 17:23:16 +00001833 }
Raymond Hettinger467a6982004-04-07 11:39:21 +00001834 err = -1;
1835 /* Don't stomp existing exception */
1836 if (PyErr_Occurred())
1837 break;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001838 if (oparg < PyTuple_GET_SIZE(co->co_cellvars)) {
1839 v = PyTuple_GET_ITEM(co->co_cellvars,
Raymond Hettinger467a6982004-04-07 11:39:21 +00001840 oparg);
1841 format_exc_check_arg(
1842 PyExc_UnboundLocalError,
1843 UNBOUNDLOCAL_ERROR_MSG,
1844 v);
1845 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00001846 v = PyTuple_GET_ITEM(
Raymond Hettinger467a6982004-04-07 11:39:21 +00001847 co->co_freevars,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001848 oparg - PyTuple_GET_SIZE(co->co_cellvars));
Raymond Hettinger467a6982004-04-07 11:39:21 +00001849 format_exc_check_arg(
1850 PyExc_NameError,
1851 UNBOUNDFREE_ERROR_MSG,
1852 v);
1853 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001854 break;
1855
1856 case STORE_DEREF:
1857 w = POP();
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001858 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001859 PyCell_Set(x, w);
Jeremy Hylton30c9f392001-03-13 01:58:22 +00001860 Py_DECREF(w);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001861 continue;
1862
Guido van Rossum374a9221991-04-04 10:40:29 +00001863 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001864 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001865 if (x != NULL) {
Raymond Hettinger5bed4562004-04-10 23:34:17 +00001866 for (; --oparg >= 0;) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001867 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001868 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001869 }
1870 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001871 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001872 }
1873 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001874
Guido van Rossum374a9221991-04-04 10:40:29 +00001875 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001876 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001877 if (x != NULL) {
Raymond Hettinger5bed4562004-04-10 23:34:17 +00001878 for (; --oparg >= 0;) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001879 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001880 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001881 }
1882 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001883 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001884 }
1885 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001886
Guido van Rossum86e58e22006-08-28 15:27:34 +00001887 case BUILD_SET:
1888 x = PySet_New(NULL);
1889 if (x != NULL) {
1890 for (; --oparg >= 0;) {
1891 w = POP();
1892 if (err == 0)
1893 err = PySet_Add(x, w);
1894 Py_DECREF(w);
1895 }
1896 if (err != 0) {
1897 Py_DECREF(x);
1898 break;
1899 }
1900 PUSH(x);
1901 continue;
1902 }
1903 break;
1904
Guido van Rossum374a9221991-04-04 10:40:29 +00001905 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001906 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001907 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001908 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001909 break;
Thomas Wouters00e41de2007-02-23 19:56:57 +00001910
1911 case MAKE_BYTES:
1912 w = POP();
1913 if (PyString_Check(w))
1914 x = PyBytes_FromStringAndSize(
1915 PyString_AS_STRING(w),
1916 PyString_GET_SIZE(w));
1917 else
1918 x = NULL;
1919 Py_DECREF(w);
1920 PUSH(x);
1921 if (x != NULL) continue;
1922 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001923
Guido van Rossum374a9221991-04-04 10:40:29 +00001924 case LOAD_ATTR:
Skip Montanaro496e6582002-08-06 17:47:40 +00001925 w = GETITEM(names, oparg);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001926 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001927 x = PyObject_GetAttr(v, w);
1928 Py_DECREF(v);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001929 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001930 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001931 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001932
Guido van Rossum374a9221991-04-04 10:40:29 +00001933 case COMPARE_OP:
1934 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001935 v = TOP();
Raymond Hettinger4bad9ba2003-01-19 05:08:13 +00001936 if (PyInt_CheckExact(w) && PyInt_CheckExact(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001937 /* INLINE: cmp(int, int) */
1938 register long a, b;
1939 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001940 a = PyInt_AS_LONG(v);
1941 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001942 switch (oparg) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00001943 case PyCmp_LT: res = a < b; break;
1944 case PyCmp_LE: res = a <= b; break;
1945 case PyCmp_EQ: res = a == b; break;
1946 case PyCmp_NE: res = a != b; break;
1947 case PyCmp_GT: res = a > b; break;
1948 case PyCmp_GE: res = a >= b; break;
1949 case PyCmp_IS: res = v == w; break;
1950 case PyCmp_IS_NOT: res = v != w; break;
Guido van Rossumc12da691997-07-17 23:12:42 +00001951 default: goto slow_compare;
1952 }
1953 x = res ? Py_True : Py_False;
1954 Py_INCREF(x);
1955 }
1956 else {
1957 slow_compare:
1958 x = cmp_outcome(oparg, v, w);
1959 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001960 Py_DECREF(v);
1961 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001962 SET_TOP(x);
Raymond Hettingerf606f872003-03-16 03:11:04 +00001963 if (x == NULL) break;
1964 PREDICT(JUMP_IF_FALSE);
1965 PREDICT(JUMP_IF_TRUE);
1966 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001967
Guido van Rossum374a9221991-04-04 10:40:29 +00001968 case IMPORT_NAME:
Skip Montanaro496e6582002-08-06 17:47:40 +00001969 w = GETITEM(names, oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001970 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001971 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001972 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001973 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001974 break;
1975 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00001976 v = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001977 u = TOP();
Thomas Woutersf7f438b2006-02-28 16:09:29 +00001978 if (PyInt_AsLong(u) != -1 || PyErr_Occurred())
1979 w = PyTuple_Pack(5,
1980 w,
1981 f->f_globals,
1982 f->f_locals == NULL ?
1983 Py_None : f->f_locals,
1984 v,
1985 u);
1986 else
1987 w = PyTuple_Pack(4,
1988 w,
1989 f->f_globals,
1990 f->f_locals == NULL ?
1991 Py_None : f->f_locals,
1992 v);
1993 Py_DECREF(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001994 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001995 if (w == NULL) {
Raymond Hettinger663004b2003-01-09 15:24:30 +00001996 u = POP();
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001997 x = NULL;
1998 break;
1999 }
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002000 READ_TIMESTAMP(intr0);
Guido van Rossumb209a111997-04-29 18:18:01 +00002001 x = PyEval_CallObject(x, w);
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002002 READ_TIMESTAMP(intr1);
Guido van Rossumb209a111997-04-29 18:18:01 +00002003 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00002004 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002005 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00002006 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00002007
Thomas Wouters52152252000-08-17 22:55:00 +00002008 case IMPORT_STAR:
2009 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002010 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002011 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002012 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00002013 "no locals found during 'import *'");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002014 break;
2015 }
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002016 READ_TIMESTAMP(intr0);
Thomas Wouters52152252000-08-17 22:55:00 +00002017 err = import_all_from(x, v);
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002018 READ_TIMESTAMP(intr1);
Guido van Rossumb209a111997-04-29 18:18:01 +00002019 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00002020 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002021 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00002022 break;
Guido van Rossum25831651993-05-19 14:50:45 +00002023
Thomas Wouters52152252000-08-17 22:55:00 +00002024 case IMPORT_FROM:
Skip Montanaro496e6582002-08-06 17:47:40 +00002025 w = GETITEM(names, oparg);
Thomas Wouters52152252000-08-17 22:55:00 +00002026 v = TOP();
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002027 READ_TIMESTAMP(intr0);
Thomas Wouters52152252000-08-17 22:55:00 +00002028 x = import_from(v, w);
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002029 READ_TIMESTAMP(intr1);
Thomas Wouters52152252000-08-17 22:55:00 +00002030 PUSH(x);
2031 if (x != NULL) continue;
2032 break;
2033
Guido van Rossum374a9221991-04-04 10:40:29 +00002034 case JUMP_FORWARD:
2035 JUMPBY(oparg);
Neil Schemenauerc4b570f2003-06-01 19:21:12 +00002036 goto fast_next_opcode;
Guido van Rossumac7be682001-01-17 15:42:30 +00002037
Raymond Hettingerf606f872003-03-16 03:11:04 +00002038 PREDICTED_WITH_ARG(JUMP_IF_FALSE);
Guido van Rossum374a9221991-04-04 10:40:29 +00002039 case JUMP_IF_FALSE:
Raymond Hettinger21012b82003-02-26 18:11:50 +00002040 w = TOP();
Raymond Hettingerf606f872003-03-16 03:11:04 +00002041 if (w == Py_True) {
2042 PREDICT(POP_TOP);
Neil Schemenauerc4b570f2003-06-01 19:21:12 +00002043 goto fast_next_opcode;
Raymond Hettingerf606f872003-03-16 03:11:04 +00002044 }
Raymond Hettinger21012b82003-02-26 18:11:50 +00002045 if (w == Py_False) {
2046 JUMPBY(oparg);
Neil Schemenauerc4b570f2003-06-01 19:21:12 +00002047 goto fast_next_opcode;
Raymond Hettinger21012b82003-02-26 18:11:50 +00002048 }
2049 err = PyObject_IsTrue(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002050 if (err > 0)
2051 err = 0;
2052 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00002053 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002054 else
2055 break;
2056 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00002057
Raymond Hettingerf606f872003-03-16 03:11:04 +00002058 PREDICTED_WITH_ARG(JUMP_IF_TRUE);
Guido van Rossum374a9221991-04-04 10:40:29 +00002059 case JUMP_IF_TRUE:
Raymond Hettinger21012b82003-02-26 18:11:50 +00002060 w = TOP();
Raymond Hettingerf606f872003-03-16 03:11:04 +00002061 if (w == Py_False) {
2062 PREDICT(POP_TOP);
Neil Schemenauerc4b570f2003-06-01 19:21:12 +00002063 goto fast_next_opcode;
Raymond Hettingerf606f872003-03-16 03:11:04 +00002064 }
Raymond Hettinger21012b82003-02-26 18:11:50 +00002065 if (w == Py_True) {
2066 JUMPBY(oparg);
Neil Schemenauerc4b570f2003-06-01 19:21:12 +00002067 goto fast_next_opcode;
Raymond Hettinger21012b82003-02-26 18:11:50 +00002068 }
2069 err = PyObject_IsTrue(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002070 if (err > 0) {
2071 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00002072 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002073 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002074 else if (err == 0)
2075 ;
2076 else
2077 break;
2078 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00002079
Raymond Hettingerfba1cfc2004-03-12 16:33:17 +00002080 PREDICTED_WITH_ARG(JUMP_ABSOLUTE);
Guido van Rossum374a9221991-04-04 10:40:29 +00002081 case JUMP_ABSOLUTE:
2082 JUMPTO(oparg);
Neil Schemenauerca2a2f12003-05-30 23:59:44 +00002083 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00002084
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002085 case GET_ITER:
2086 /* before: [obj]; after [getiter(obj)] */
Raymond Hettinger663004b2003-01-09 15:24:30 +00002087 v = TOP();
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002088 x = PyObject_GetIter(v);
2089 Py_DECREF(v);
2090 if (x != NULL) {
Raymond Hettinger663004b2003-01-09 15:24:30 +00002091 SET_TOP(x);
Raymond Hettinger7dc52212003-03-16 20:14:44 +00002092 PREDICT(FOR_ITER);
Guido van Rossum213c7a62001-04-23 14:08:49 +00002093 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002094 }
Raymond Hettinger8bb90a52003-01-14 12:43:10 +00002095 STACKADJ(-1);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002096 break;
2097
Raymond Hettinger7dc52212003-03-16 20:14:44 +00002098 PREDICTED_WITH_ARG(FOR_ITER);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002099 case FOR_ITER:
2100 /* before: [iter]; after: [iter, iter()] *or* [] */
2101 v = TOP();
Raymond Hettingerdb0de9e2004-03-12 08:41:36 +00002102 x = (*v->ob_type->tp_iternext)(v);
Guido van Rossum213c7a62001-04-23 14:08:49 +00002103 if (x != NULL) {
2104 PUSH(x);
Raymond Hettinger7dc52212003-03-16 20:14:44 +00002105 PREDICT(STORE_FAST);
2106 PREDICT(UNPACK_SEQUENCE);
Guido van Rossum213c7a62001-04-23 14:08:49 +00002107 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002108 }
Raymond Hettingerdb0de9e2004-03-12 08:41:36 +00002109 if (PyErr_Occurred()) {
2110 if (!PyErr_ExceptionMatches(PyExc_StopIteration))
2111 break;
2112 PyErr_Clear();
Guido van Rossum213c7a62001-04-23 14:08:49 +00002113 }
Raymond Hettingerdb0de9e2004-03-12 08:41:36 +00002114 /* iterator ended normally */
2115 x = v = POP();
2116 Py_DECREF(v);
2117 JUMPBY(oparg);
2118 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002119
Raymond Hettinger2d783e92004-03-12 09:12:22 +00002120 case BREAK_LOOP:
2121 why = WHY_BREAK;
2122 goto fast_block_end;
2123
2124 case CONTINUE_LOOP:
2125 retval = PyInt_FromLong(oparg);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002126 if (!retval) {
2127 x = NULL;
2128 break;
2129 }
Raymond Hettinger2d783e92004-03-12 09:12:22 +00002130 why = WHY_CONTINUE;
2131 goto fast_block_end;
2132
Guido van Rossum374a9221991-04-04 10:40:29 +00002133 case SETUP_LOOP:
2134 case SETUP_EXCEPT:
2135 case SETUP_FINALLY:
Thomas Wouters9fe394c2007-02-05 01:24:16 +00002136 /* NOTE: If you add any new block-setup opcodes that are
2137 not try/except/finally handlers, you may need to
2138 update the PyGen_NeedsFinalizing() function. */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002139
Guido van Rossumb209a111997-04-29 18:18:01 +00002140 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002141 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002142 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00002143
Guido van Rossumc2e20742006-02-27 22:32:47 +00002144 case WITH_CLEANUP:
2145 {
2146 /* TOP is the context.__exit__ bound method.
2147 Below that are 1-3 values indicating how/why
2148 we entered the finally clause:
2149 - SECOND = None
Guido van Rossumf6694362006-03-10 02:28:35 +00002150 - (SECOND, THIRD) = (WHY_{RETURN,CONTINUE}), retval
Guido van Rossumc2e20742006-02-27 22:32:47 +00002151 - SECOND = WHY_*; no retval below it
2152 - (SECOND, THIRD, FOURTH) = exc_info()
2153 In the last case, we must call
2154 TOP(SECOND, THIRD, FOURTH)
2155 otherwise we must call
2156 TOP(None, None, None)
Guido van Rossum1a5e21e2006-02-28 21:57:43 +00002157
2158 In addition, if the stack represents an exception,
Guido van Rossumf6694362006-03-10 02:28:35 +00002159 *and* the function call returns a 'true' value, we
2160 "zap" this information, to prevent END_FINALLY from
2161 re-raising the exception. (But non-local gotos
2162 should still be resumed.)
Guido van Rossumc2e20742006-02-27 22:32:47 +00002163 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002164
Guido van Rossumc2e20742006-02-27 22:32:47 +00002165 x = TOP();
2166 u = SECOND();
2167 if (PyInt_Check(u) || u == Py_None) {
2168 u = v = w = Py_None;
2169 }
2170 else {
2171 v = THIRD();
2172 w = FOURTH();
2173 }
Guido van Rossumf6694362006-03-10 02:28:35 +00002174 /* XXX Not the fastest way to call it... */
2175 x = PyObject_CallFunctionObjArgs(x, u, v, w, NULL);
2176 if (x == NULL)
2177 break; /* Go to error exit */
2178 if (u != Py_None && PyObject_IsTrue(x)) {
2179 /* There was an exception and a true return */
2180 Py_DECREF(x);
2181 x = TOP(); /* Again */
2182 STACKADJ(-3);
2183 Py_INCREF(Py_None);
2184 SET_TOP(Py_None);
2185 Py_DECREF(x);
2186 Py_DECREF(u);
2187 Py_DECREF(v);
2188 Py_DECREF(w);
2189 } else {
2190 /* Let END_FINALLY do its thing */
2191 Py_DECREF(x);
2192 x = POP();
2193 Py_DECREF(x);
2194 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00002195 break;
2196 }
2197
Guido van Rossumf10570b1995-07-07 22:53:21 +00002198 case CALL_FUNCTION:
Armin Rigo8817fcd2004-06-17 10:22:40 +00002199 {
2200 PyObject **sp;
Jeremy Hylton985eba52003-02-05 23:13:00 +00002201 PCALL(PCALL_ALL);
Armin Rigo8817fcd2004-06-17 10:22:40 +00002202 sp = stack_pointer;
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00002203#ifdef WITH_TSC
Armin Rigo8817fcd2004-06-17 10:22:40 +00002204 x = call_function(&sp, oparg, &intr0, &intr1);
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00002205#else
Armin Rigo8817fcd2004-06-17 10:22:40 +00002206 x = call_function(&sp, oparg);
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00002207#endif
Armin Rigo8817fcd2004-06-17 10:22:40 +00002208 stack_pointer = sp;
Jeremy Hyltone8c04322002-08-16 17:47:26 +00002209 PUSH(x);
2210 if (x != NULL)
2211 continue;
2212 break;
Armin Rigo8817fcd2004-06-17 10:22:40 +00002213 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002214
Jeremy Hylton76901512000-03-28 23:49:17 +00002215 case CALL_FUNCTION_VAR:
2216 case CALL_FUNCTION_KW:
2217 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00002218 {
Jeremy Hylton76901512000-03-28 23:49:17 +00002219 int na = oparg & 0xff;
2220 int nk = (oparg>>8) & 0xff;
2221 int flags = (opcode - CALL_FUNCTION) & 3;
Jeremy Hylton52820442001-01-03 23:52:36 +00002222 int n = na + 2 * nk;
Armin Rigo8817fcd2004-06-17 10:22:40 +00002223 PyObject **pfunc, *func, **sp;
Jeremy Hylton985eba52003-02-05 23:13:00 +00002224 PCALL(PCALL_ALL);
Jeremy Hylton52820442001-01-03 23:52:36 +00002225 if (flags & CALL_FLAG_VAR)
2226 n++;
2227 if (flags & CALL_FLAG_KW)
2228 n++;
2229 pfunc = stack_pointer - n - 1;
2230 func = *pfunc;
Jeremy Hylton52820442001-01-03 23:52:36 +00002231
Guido van Rossumac7be682001-01-17 15:42:30 +00002232 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00002233 && PyMethod_GET_SELF(func) != NULL) {
2234 PyObject *self = PyMethod_GET_SELF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002235 Py_INCREF(self);
Jeremy Hylton52820442001-01-03 23:52:36 +00002236 func = PyMethod_GET_FUNCTION(func);
2237 Py_INCREF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002238 Py_DECREF(*pfunc);
2239 *pfunc = self;
2240 na++;
2241 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00002242 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00002243 Py_INCREF(func);
Armin Rigo8817fcd2004-06-17 10:22:40 +00002244 sp = stack_pointer;
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002245 READ_TIMESTAMP(intr0);
Armin Rigo8817fcd2004-06-17 10:22:40 +00002246 x = ext_do_call(func, &sp, flags, na, nk);
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002247 READ_TIMESTAMP(intr1);
Armin Rigo8817fcd2004-06-17 10:22:40 +00002248 stack_pointer = sp;
Jeremy Hylton76901512000-03-28 23:49:17 +00002249 Py_DECREF(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00002250
Jeremy Hylton76901512000-03-28 23:49:17 +00002251 while (stack_pointer > pfunc) {
Jeremy Hylton52820442001-01-03 23:52:36 +00002252 w = POP();
2253 Py_DECREF(w);
Jeremy Hylton76901512000-03-28 23:49:17 +00002254 }
2255 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00002256 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00002257 continue;
Jeremy Hylton76901512000-03-28 23:49:17 +00002258 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002259 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002260
Guido van Rossum0240b922007-02-26 21:23:50 +00002261 case MAKE_CLOSURE:
Guido van Rossum681d79a1995-07-18 14:51:37 +00002262 case MAKE_FUNCTION:
Guido van Rossum4f72a782006-10-27 23:31:49 +00002263 {
2264 int posdefaults = oparg & 0xff;
2265 int kwdefaults = (oparg>>8) & 0xff;
Neal Norwitzc1505362006-12-28 06:47:50 +00002266 int num_annotations = (oparg >> 16) & 0x7fff;
Guido van Rossum4f72a782006-10-27 23:31:49 +00002267
Guido van Rossum681d79a1995-07-18 14:51:37 +00002268 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00002269 x = PyFunction_New(v, f->f_globals);
2270 Py_DECREF(v);
Guido van Rossum0240b922007-02-26 21:23:50 +00002271
2272 if (x != NULL && opcode == MAKE_CLOSURE) {
2273 v = POP();
2274 err = PyFunction_SetClosure(x, v);
2275 Py_DECREF(v);
2276 }
Neal Norwitzc1505362006-12-28 06:47:50 +00002277
2278 if (x != NULL && num_annotations > 0) {
2279 Py_ssize_t name_ix;
2280 u = POP(); /* names of args with annotations */
2281 v = PyDict_New();
2282 if (v == NULL) {
2283 Py_DECREF(x);
2284 x = NULL;
2285 break;
2286 }
2287 name_ix = PyTuple_Size(u);
2288 assert(num_annotations == name_ix+1);
2289 while (name_ix > 0) {
2290 --name_ix;
2291 t = PyTuple_GET_ITEM(u, name_ix);
2292 w = POP();
2293 /* XXX(nnorwitz): check for errors */
2294 PyDict_SetItem(v, t, w);
2295 Py_DECREF(w);
2296 }
2297
2298 err = PyFunction_SetAnnotations(x, v);
2299 Py_DECREF(v);
2300 Py_DECREF(u);
2301 }
2302
Guido van Rossum681d79a1995-07-18 14:51:37 +00002303 /* XXX Maybe this should be a separate opcode? */
Guido van Rossum4f72a782006-10-27 23:31:49 +00002304 if (x != NULL && posdefaults > 0) {
2305 v = PyTuple_New(posdefaults);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002306 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002307 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002308 x = NULL;
2309 break;
2310 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00002311 while (--posdefaults >= 0) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002312 w = POP();
Guido van Rossum4f72a782006-10-27 23:31:49 +00002313 PyTuple_SET_ITEM(v, posdefaults, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002314 }
2315 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00002316 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002317 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00002318 if (x != NULL && kwdefaults > 0) {
2319 v = PyDict_New();
2320 if (v == NULL) {
2321 Py_DECREF(x);
2322 x = NULL;
2323 break;
2324 }
2325 while (--kwdefaults >= 0) {
2326 w = POP(); /* default value */
2327 u = POP(); /* kw only arg name */
Neal Norwitzc1505362006-12-28 06:47:50 +00002328 /* XXX(nnorwitz): check for errors */
Guido van Rossum4f72a782006-10-27 23:31:49 +00002329 PyDict_SetItem(v, u, w);
Georg Brandl94ab0002007-02-26 13:58:18 +00002330 Py_DECREF(w);
2331 Py_DECREF(u);
Guido van Rossum4f72a782006-10-27 23:31:49 +00002332 }
2333 err = PyFunction_SetKwDefaults(x, v);
2334 Py_DECREF(v);
2335 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002336 PUSH(x);
2337 break;
Guido van Rossum4f72a782006-10-27 23:31:49 +00002338 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002339
2340 case BUILD_SLICE:
2341 if (oparg == 3)
2342 w = POP();
2343 else
2344 w = NULL;
2345 v = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00002346 u = TOP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00002347 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00002348 Py_DECREF(u);
2349 Py_DECREF(v);
2350 Py_XDECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00002351 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002352 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00002353 break;
2354
Fred Drakeef8ace32000-08-24 00:32:09 +00002355 case EXTENDED_ARG:
2356 opcode = NEXTOP();
Raymond Hettinger5bed4562004-04-10 23:34:17 +00002357 oparg = oparg<<16 | NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +00002358 goto dispatch_opcode;
Guido van Rossum8861b741996-07-30 16:49:37 +00002359
Guido van Rossum374a9221991-04-04 10:40:29 +00002360 default:
2361 fprintf(stderr,
2362 "XXX lineno: %d, opcode: %d\n",
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002363 PyCode_Addr2Line(f->f_code, f->f_lasti),
2364 opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00002365 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00002366 why = WHY_EXCEPTION;
2367 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002368
2369#ifdef CASE_TOO_BIG
2370 }
2371#endif
2372
Guido van Rossum374a9221991-04-04 10:40:29 +00002373 } /* switch */
2374
2375 on_error:
Guido van Rossumac7be682001-01-17 15:42:30 +00002376
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002377 READ_TIMESTAMP(inst1);
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00002378
Guido van Rossum374a9221991-04-04 10:40:29 +00002379 /* Quickly continue if no error occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002380
Guido van Rossum374a9221991-04-04 10:40:29 +00002381 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002382 if (err == 0 && x != NULL) {
2383#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002384 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002385 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002386 fprintf(stderr,
2387 "XXX undetected error\n");
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00002388 else {
2389#endif
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002390 READ_TIMESTAMP(loop1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002391 continue; /* Normal, fast path */
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00002392#ifdef CHECKEXC
2393 }
2394#endif
Guido van Rossum681d79a1995-07-18 14:51:37 +00002395 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002396 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00002397 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00002398 err = 0;
2399 }
2400
Guido van Rossum374a9221991-04-04 10:40:29 +00002401 /* Double-check exception status */
Guido van Rossumac7be682001-01-17 15:42:30 +00002402
Raymond Hettingerc8aa08b2004-04-11 14:59:33 +00002403 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002404 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002405 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002406 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00002407 why = WHY_EXCEPTION;
2408 }
2409 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002410#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00002411 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002412 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002413 if (PyErr_Occurred()) {
Jeremy Hylton904ed862003-11-05 17:29:35 +00002414 char buf[1024];
2415 sprintf(buf, "Stack unwind with exception "
2416 "set and why=%d", why);
2417 Py_FatalError(buf);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002418 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002419 }
2420#endif
2421
2422 /* Log traceback info if this is a real exception */
Guido van Rossumac7be682001-01-17 15:42:30 +00002423
Guido van Rossum374a9221991-04-04 10:40:29 +00002424 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002425 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002426
Fred Drake8f51f542001-10-04 14:48:42 +00002427 if (tstate->c_tracefunc != NULL)
2428 call_exc_trace(tstate->c_tracefunc,
2429 tstate->c_traceobj, f);
Guido van Rossum014518f1998-11-23 21:09:51 +00002430 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002431
Guido van Rossum374a9221991-04-04 10:40:29 +00002432 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
Guido van Rossumac7be682001-01-17 15:42:30 +00002433
Guido van Rossum374a9221991-04-04 10:40:29 +00002434 if (why == WHY_RERAISE)
2435 why = WHY_EXCEPTION;
2436
2437 /* Unwind stacks if a (pseudo) exception occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002438
Raymond Hettinger1dd83092004-02-06 18:32:33 +00002439fast_block_end:
Tim Peters8a5c3c72004-04-05 19:36:21 +00002440 while (why != WHY_NOT && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002441 PyTryBlock *b = PyFrame_BlockPop(f);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002442
Tim Peters8a5c3c72004-04-05 19:36:21 +00002443 assert(why != WHY_YIELD);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002444 if (b->b_type == SETUP_LOOP && why == WHY_CONTINUE) {
2445 /* For a continue inside a try block,
2446 don't pop the block for the loop. */
Thomas Wouters1ee64222001-09-24 19:32:01 +00002447 PyFrame_BlockSetup(f, b->b_type, b->b_handler,
2448 b->b_level);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002449 why = WHY_NOT;
2450 JUMPTO(PyInt_AS_LONG(retval));
2451 Py_DECREF(retval);
2452 break;
2453 }
2454
Guido van Rossum374a9221991-04-04 10:40:29 +00002455 while (STACK_LEVEL() > b->b_level) {
2456 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002457 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002458 }
2459 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2460 why = WHY_NOT;
2461 JUMPTO(b->b_handler);
2462 break;
2463 }
2464 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00002465 (b->b_type == SETUP_EXCEPT &&
2466 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002467 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002468 PyObject *exc, *val, *tb;
2469 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002470 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002471 val = Py_None;
2472 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00002473 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002474 /* Make the raw exception data
2475 available to the handler,
2476 so a program can emulate the
2477 Python main loop. Don't do
2478 this for 'finally'. */
2479 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00002480 PyErr_NormalizeException(
2481 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002482 set_exc_info(tstate,
2483 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002484 }
Jeremy Hyltonc6314892001-09-26 19:24:45 +00002485 if (tb == NULL) {
2486 Py_INCREF(Py_None);
2487 PUSH(Py_None);
2488 } else
2489 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002490 PUSH(val);
2491 PUSH(exc);
2492 }
2493 else {
Raymond Hettinger06032cb2004-04-06 09:37:35 +00002494 if (why & (WHY_RETURN | WHY_CONTINUE))
Guido van Rossum374a9221991-04-04 10:40:29 +00002495 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00002496 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00002497 PUSH(v);
2498 }
2499 why = WHY_NOT;
2500 JUMPTO(b->b_handler);
2501 break;
2502 }
2503 } /* unwind stack */
2504
2505 /* End the loop if we still have an error (or return) */
Guido van Rossumac7be682001-01-17 15:42:30 +00002506
Guido van Rossum374a9221991-04-04 10:40:29 +00002507 if (why != WHY_NOT)
2508 break;
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002509 READ_TIMESTAMP(loop1);
Guido van Rossumac7be682001-01-17 15:42:30 +00002510
Guido van Rossum374a9221991-04-04 10:40:29 +00002511 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00002512
Tim Peters8a5c3c72004-04-05 19:36:21 +00002513 assert(why != WHY_YIELD);
2514 /* Pop remaining stack entries. */
2515 while (!EMPTY()) {
2516 v = POP();
2517 Py_XDECREF(v);
Guido van Rossum35974fb2001-12-06 21:28:18 +00002518 }
2519
Tim Peters8a5c3c72004-04-05 19:36:21 +00002520 if (why != WHY_RETURN)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002521 retval = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002522
Raymond Hettinger1dd83092004-02-06 18:32:33 +00002523fast_yield:
Fred Drake9e3ad782001-07-03 23:39:52 +00002524 if (tstate->use_tracing) {
Barry Warsawe2eca0b2005-08-15 18:14:19 +00002525 if (tstate->c_tracefunc) {
2526 if (why == WHY_RETURN || why == WHY_YIELD) {
2527 if (call_trace(tstate->c_tracefunc,
2528 tstate->c_traceobj, f,
2529 PyTrace_RETURN, retval)) {
2530 Py_XDECREF(retval);
2531 retval = NULL;
2532 why = WHY_EXCEPTION;
2533 }
2534 }
2535 else if (why == WHY_EXCEPTION) {
2536 call_trace_protected(tstate->c_tracefunc,
2537 tstate->c_traceobj, f,
Armin Rigo1c2d7e52005-09-20 18:34:01 +00002538 PyTrace_RETURN, NULL);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002539 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002540 }
Fred Drake8f51f542001-10-04 14:48:42 +00002541 if (tstate->c_profilefunc) {
Fred Drake4ec5d562001-10-04 19:26:43 +00002542 if (why == WHY_EXCEPTION)
2543 call_trace_protected(tstate->c_profilefunc,
2544 tstate->c_profileobj, f,
Armin Rigo1c2d7e52005-09-20 18:34:01 +00002545 PyTrace_RETURN, NULL);
Fred Drake4ec5d562001-10-04 19:26:43 +00002546 else if (call_trace(tstate->c_profilefunc,
2547 tstate->c_profileobj, f,
2548 PyTrace_RETURN, retval)) {
Fred Drake9e3ad782001-07-03 23:39:52 +00002549 Py_XDECREF(retval);
2550 retval = NULL;
2551 why = WHY_EXCEPTION;
2552 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002553 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002554 }
Guido van Rossuma4240131997-01-21 21:18:36 +00002555
Thomas Wouters477c8d52006-05-27 19:21:47 +00002556 if (tstate->frame->f_exc_type != NULL)
2557 reset_exc_info(tstate);
2558 else {
2559 assert(tstate->frame->f_exc_value == NULL);
2560 assert(tstate->frame->f_exc_traceback == NULL);
2561 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00002562
Tim Peters5ca576e2001-06-18 22:08:13 +00002563 /* pop frame */
Armin Rigo2b3eb402003-10-28 12:05:48 +00002564 exit_eval_frame:
2565 Py_LeaveRecursiveCall();
Guido van Rossuma027efa1997-05-05 20:56:21 +00002566 tstate->frame = f->f_back;
Guido van Rossumac7be682001-01-17 15:42:30 +00002567
Guido van Rossum96a42c81992-01-12 02:29:51 +00002568 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00002569}
2570
Guido van Rossumc2e20742006-02-27 22:32:47 +00002571/* This is gonna seem *real weird*, but if you put some other code between
Martin v. Löwis8d97e332004-06-27 15:43:12 +00002572 PyEval_EvalFrame() and PyEval_EvalCodeEx() you will need to adjust
Guido van Rossumc2e20742006-02-27 22:32:47 +00002573 the test in the if statements in Misc/gdbinit (pystack and pystackv). */
Skip Montanaro786ea6b2004-03-01 15:44:05 +00002574
Tim Peters6d6c1a32001-08-02 04:15:00 +00002575PyObject *
2576PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals,
Tim Peters5ca576e2001-06-18 22:08:13 +00002577 PyObject **args, int argcount, PyObject **kws, int kwcount,
Guido van Rossum4f72a782006-10-27 23:31:49 +00002578 PyObject **defs, int defcount, PyObject *kwdefs, PyObject *closure)
Tim Peters5ca576e2001-06-18 22:08:13 +00002579{
2580 register PyFrameObject *f;
2581 register PyObject *retval = NULL;
2582 register PyObject **fastlocals, **freevars;
2583 PyThreadState *tstate = PyThreadState_GET();
2584 PyObject *x, *u;
2585
2586 if (globals == NULL) {
Tim Peters8a5c3c72004-04-05 19:36:21 +00002587 PyErr_SetString(PyExc_SystemError,
Jeremy Hylton910d7d42001-08-12 21:52:24 +00002588 "PyEval_EvalCodeEx: NULL globals");
Tim Peters5ca576e2001-06-18 22:08:13 +00002589 return NULL;
2590 }
2591
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002592 assert(tstate != NULL);
Jeremy Hylton985eba52003-02-05 23:13:00 +00002593 assert(globals != NULL);
2594 f = PyFrame_New(tstate, co, globals, locals);
Tim Peters5ca576e2001-06-18 22:08:13 +00002595 if (f == NULL)
2596 return NULL;
2597
2598 fastlocals = f->f_localsplus;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002599 freevars = f->f_localsplus + co->co_nlocals;
Tim Peters5ca576e2001-06-18 22:08:13 +00002600
2601 if (co->co_argcount > 0 ||
Guido van Rossum4f72a782006-10-27 23:31:49 +00002602 co->co_kwonlyargcount > 0 ||
Tim Peters5ca576e2001-06-18 22:08:13 +00002603 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
2604 int i;
2605 int n = argcount;
2606 PyObject *kwdict = NULL;
2607 if (co->co_flags & CO_VARKEYWORDS) {
2608 kwdict = PyDict_New();
2609 if (kwdict == NULL)
2610 goto fail;
Guido van Rossum4f72a782006-10-27 23:31:49 +00002611 i = co->co_argcount + co->co_kwonlyargcount;
Tim Peters5ca576e2001-06-18 22:08:13 +00002612 if (co->co_flags & CO_VARARGS)
2613 i++;
2614 SETLOCAL(i, kwdict);
2615 }
2616 if (argcount > co->co_argcount) {
2617 if (!(co->co_flags & CO_VARARGS)) {
2618 PyErr_Format(PyExc_TypeError,
2619 "%.200s() takes %s %d "
Guido van Rossum4f72a782006-10-27 23:31:49 +00002620 "%spositional argument%s (%d given)",
Tim Peters5ca576e2001-06-18 22:08:13 +00002621 PyString_AsString(co->co_name),
2622 defcount ? "at most" : "exactly",
2623 co->co_argcount,
2624 kwcount ? "non-keyword " : "",
2625 co->co_argcount == 1 ? "" : "s",
2626 argcount);
2627 goto fail;
2628 }
2629 n = co->co_argcount;
2630 }
2631 for (i = 0; i < n; i++) {
2632 x = args[i];
2633 Py_INCREF(x);
2634 SETLOCAL(i, x);
2635 }
2636 if (co->co_flags & CO_VARARGS) {
2637 u = PyTuple_New(argcount - n);
2638 if (u == NULL)
2639 goto fail;
Guido van Rossum4f72a782006-10-27 23:31:49 +00002640 SETLOCAL(co->co_argcount + co->co_kwonlyargcount, u);
Tim Peters5ca576e2001-06-18 22:08:13 +00002641 for (i = n; i < argcount; i++) {
2642 x = args[i];
2643 Py_INCREF(x);
2644 PyTuple_SET_ITEM(u, i-n, x);
2645 }
2646 }
2647 for (i = 0; i < kwcount; i++) {
2648 PyObject *keyword = kws[2*i];
2649 PyObject *value = kws[2*i + 1];
2650 int j;
Guido van Rossum572dbf82007-04-27 23:53:51 +00002651 if (keyword == NULL || !(PyString_Check(keyword) || PyUnicode_Check(keyword))) {
Tim Peters5ca576e2001-06-18 22:08:13 +00002652 PyErr_Format(PyExc_TypeError,
2653 "%.200s() keywords must be strings",
2654 PyString_AsString(co->co_name));
2655 goto fail;
2656 }
2657 /* XXX slow -- speed up using dictionary? */
Guido van Rossum4f72a782006-10-27 23:31:49 +00002658 for (j = 0;
2659 j < co->co_argcount + co->co_kwonlyargcount;
2660 j++) {
Tim Peters5ca576e2001-06-18 22:08:13 +00002661 PyObject *nm = PyTuple_GET_ITEM(
2662 co->co_varnames, j);
2663 int cmp = PyObject_RichCompareBool(
2664 keyword, nm, Py_EQ);
2665 if (cmp > 0)
2666 break;
2667 else if (cmp < 0)
2668 goto fail;
2669 }
2670 /* Check errors from Compare */
2671 if (PyErr_Occurred())
2672 goto fail;
Guido van Rossum4f72a782006-10-27 23:31:49 +00002673 if (j >= co->co_argcount + co->co_kwonlyargcount) {
Tim Peters5ca576e2001-06-18 22:08:13 +00002674 if (kwdict == NULL) {
2675 PyErr_Format(PyExc_TypeError,
2676 "%.200s() got an unexpected "
2677 "keyword argument '%.400s'",
2678 PyString_AsString(co->co_name),
2679 PyString_AsString(keyword));
2680 goto fail;
2681 }
2682 PyDict_SetItem(kwdict, keyword, value);
2683 }
2684 else {
2685 if (GETLOCAL(j) != NULL) {
2686 PyErr_Format(PyExc_TypeError,
2687 "%.200s() got multiple "
2688 "values for keyword "
2689 "argument '%.400s'",
2690 PyString_AsString(co->co_name),
2691 PyString_AsString(keyword));
2692 goto fail;
2693 }
2694 Py_INCREF(value);
2695 SETLOCAL(j, value);
2696 }
2697 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00002698 if (co->co_kwonlyargcount > 0) {
2699 for (i = co->co_argcount;
2700 i < co->co_argcount + co->co_kwonlyargcount;
2701 i++) {
Guido van Rossum29602e42006-11-22 04:45:33 +00002702 PyObject *name, *def;
Guido van Rossum4f72a782006-10-27 23:31:49 +00002703 if (GETLOCAL(i) != NULL)
2704 continue;
Guido van Rossum29602e42006-11-22 04:45:33 +00002705 name = PyTuple_GET_ITEM(co->co_varnames, i);
2706 def = NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00002707 if (kwdefs != NULL)
2708 def = PyDict_GetItem(kwdefs, name);
2709 if (def != NULL) {
2710 Py_INCREF(def);
2711 SETLOCAL(i, def);
2712 continue;
2713 }
2714 PyErr_Format(PyExc_TypeError,
2715 "%.200s() needs "
Brett Cannone33a6112007-01-29 23:43:38 +00002716 "keyword-only argument %s",
Guido van Rossum4f72a782006-10-27 23:31:49 +00002717 PyString_AsString(co->co_name),
2718 PyString_AsString(name));
2719 goto fail;
2720 }
2721 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002722 if (argcount < co->co_argcount) {
2723 int m = co->co_argcount - defcount;
2724 for (i = argcount; i < m; i++) {
2725 if (GETLOCAL(i) == NULL) {
2726 PyErr_Format(PyExc_TypeError,
2727 "%.200s() takes %s %d "
Guido van Rossum4f72a782006-10-27 23:31:49 +00002728 "%spositional argument%s "
2729 "(%d given)",
Tim Peters5ca576e2001-06-18 22:08:13 +00002730 PyString_AsString(co->co_name),
2731 ((co->co_flags & CO_VARARGS) ||
2732 defcount) ? "at least"
2733 : "exactly",
2734 m, kwcount ? "non-keyword " : "",
2735 m == 1 ? "" : "s", i);
2736 goto fail;
2737 }
2738 }
2739 if (n > m)
2740 i = n - m;
2741 else
2742 i = 0;
2743 for (; i < defcount; i++) {
2744 if (GETLOCAL(m+i) == NULL) {
2745 PyObject *def = defs[i];
2746 Py_INCREF(def);
2747 SETLOCAL(m+i, def);
2748 }
2749 }
2750 }
2751 }
2752 else {
2753 if (argcount > 0 || kwcount > 0) {
2754 PyErr_Format(PyExc_TypeError,
2755 "%.200s() takes no arguments (%d given)",
2756 PyString_AsString(co->co_name),
2757 argcount + kwcount);
2758 goto fail;
2759 }
2760 }
2761 /* Allocate and initialize storage for cell vars, and copy free
2762 vars into frame. This isn't too efficient right now. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002763 if (PyTuple_GET_SIZE(co->co_cellvars)) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002764 int i, j, nargs, found;
Tim Peters5ca576e2001-06-18 22:08:13 +00002765 char *cellname, *argname;
2766 PyObject *c;
2767
2768 nargs = co->co_argcount;
2769 if (co->co_flags & CO_VARARGS)
2770 nargs++;
2771 if (co->co_flags & CO_VARKEYWORDS)
2772 nargs++;
2773
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002774 /* Initialize each cell var, taking into account
2775 cell vars that are initialized from arguments.
2776
2777 Should arrange for the compiler to put cellvars
2778 that are arguments at the beginning of the cellvars
2779 list so that we can march over it more efficiently?
2780 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002781 for (i = 0; i < PyTuple_GET_SIZE(co->co_cellvars); ++i) {
Tim Peters5ca576e2001-06-18 22:08:13 +00002782 cellname = PyString_AS_STRING(
2783 PyTuple_GET_ITEM(co->co_cellvars, i));
2784 found = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002785 for (j = 0; j < nargs; j++) {
Tim Peters5ca576e2001-06-18 22:08:13 +00002786 argname = PyString_AS_STRING(
2787 PyTuple_GET_ITEM(co->co_varnames, j));
2788 if (strcmp(cellname, argname) == 0) {
2789 c = PyCell_New(GETLOCAL(j));
2790 if (c == NULL)
2791 goto fail;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002792 GETLOCAL(co->co_nlocals + i) = c;
Tim Peters5ca576e2001-06-18 22:08:13 +00002793 found = 1;
2794 break;
2795 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002796 }
2797 if (found == 0) {
2798 c = PyCell_New(NULL);
2799 if (c == NULL)
2800 goto fail;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002801 SETLOCAL(co->co_nlocals + i, c);
Tim Peters5ca576e2001-06-18 22:08:13 +00002802 }
2803 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002804 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002805 if (PyTuple_GET_SIZE(co->co_freevars)) {
Tim Peters5ca576e2001-06-18 22:08:13 +00002806 int i;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002807 for (i = 0; i < PyTuple_GET_SIZE(co->co_freevars); ++i) {
Tim Peters5ca576e2001-06-18 22:08:13 +00002808 PyObject *o = PyTuple_GET_ITEM(closure, i);
2809 Py_INCREF(o);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002810 freevars[PyTuple_GET_SIZE(co->co_cellvars) + i] = o;
Tim Peters5ca576e2001-06-18 22:08:13 +00002811 }
2812 }
2813
Tim Peters5ca576e2001-06-18 22:08:13 +00002814 if (co->co_flags & CO_GENERATOR) {
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002815 /* Don't need to keep the reference to f_back, it will be set
2816 * when the generator is resumed. */
Tim Peters5ba58662001-07-16 02:29:45 +00002817 Py_XDECREF(f->f_back);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002818 f->f_back = NULL;
2819
Jeremy Hylton985eba52003-02-05 23:13:00 +00002820 PCALL(PCALL_GENERATOR);
2821
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002822 /* Create a new generator that owns the ready to run frame
2823 * and return that as the value. */
Martin v. Löwise440e472004-06-01 15:22:42 +00002824 return PyGen_New(f);
Tim Peters5ca576e2001-06-18 22:08:13 +00002825 }
2826
Phillip J. Eby0d6615f2005-08-02 00:46:46 +00002827 retval = PyEval_EvalFrameEx(f,0);
Tim Peters5ca576e2001-06-18 22:08:13 +00002828
2829 fail: /* Jump here from prelude on failure */
2830
Tim Petersb13680b2001-11-27 23:29:29 +00002831 /* decref'ing the frame can cause __del__ methods to get invoked,
2832 which can call back into Python. While we're done with the
2833 current Python frame (f), the associated C stack is still in use,
2834 so recursion_depth must be boosted for the duration.
2835 */
2836 assert(tstate != NULL);
2837 ++tstate->recursion_depth;
Tim Peters5ca576e2001-06-18 22:08:13 +00002838 Py_DECREF(f);
Tim Petersb13680b2001-11-27 23:29:29 +00002839 --tstate->recursion_depth;
Tim Peters5ca576e2001-06-18 22:08:13 +00002840 return retval;
2841}
2842
2843
Guido van Rossumc9fbb722003-03-01 03:36:33 +00002844/* Implementation notes for set_exc_info() and reset_exc_info():
2845
2846- Below, 'exc_ZZZ' stands for 'exc_type', 'exc_value' and
2847 'exc_traceback'. These always travel together.
2848
2849- tstate->curexc_ZZZ is the "hot" exception that is set by
2850 PyErr_SetString(), cleared by PyErr_Clear(), and so on.
2851
2852- Once an exception is caught by an except clause, it is transferred
2853 from tstate->curexc_ZZZ to tstate->exc_ZZZ, from which sys.exc_info()
2854 can pick it up. This is the primary task of set_exc_info().
Thomas Wouters477c8d52006-05-27 19:21:47 +00002855 XXX That can't be right: set_exc_info() doesn't look at tstate->curexc_ZZZ.
Guido van Rossumc9fbb722003-03-01 03:36:33 +00002856
2857- Now let me explain the complicated dance with frame->f_exc_ZZZ.
2858
2859 Long ago, when none of this existed, there were just a few globals:
2860 one set corresponding to the "hot" exception, and one set
2861 corresponding to sys.exc_ZZZ. (Actually, the latter weren't C
2862 globals; they were simply stored as sys.exc_ZZZ. For backwards
2863 compatibility, they still are!) The problem was that in code like
2864 this:
2865
2866 try:
2867 "something that may fail"
2868 except "some exception":
2869 "do something else first"
2870 "print the exception from sys.exc_ZZZ."
2871
2872 if "do something else first" invoked something that raised and caught
2873 an exception, sys.exc_ZZZ were overwritten. That was a frequent
2874 cause of subtle bugs. I fixed this by changing the semantics as
2875 follows:
2876
2877 - Within one frame, sys.exc_ZZZ will hold the last exception caught
2878 *in that frame*.
2879
2880 - But initially, and as long as no exception is caught in a given
2881 frame, sys.exc_ZZZ will hold the last exception caught in the
2882 previous frame (or the frame before that, etc.).
2883
2884 The first bullet fixed the bug in the above example. The second
2885 bullet was for backwards compatibility: it was (and is) common to
2886 have a function that is called when an exception is caught, and to
2887 have that function access the caught exception via sys.exc_ZZZ.
2888 (Example: traceback.print_exc()).
2889
2890 At the same time I fixed the problem that sys.exc_ZZZ weren't
2891 thread-safe, by introducing sys.exc_info() which gets it from tstate;
2892 but that's really a separate improvement.
2893
2894 The reset_exc_info() function in ceval.c restores the tstate->exc_ZZZ
2895 variables to what they were before the current frame was called. The
2896 set_exc_info() function saves them on the frame so that
2897 reset_exc_info() can restore them. The invariant is that
2898 frame->f_exc_ZZZ is NULL iff the current frame never caught an
2899 exception (where "catching" an exception applies only to successful
2900 except clauses); and if the current frame ever caught an exception,
2901 frame->f_exc_ZZZ is the exception that was stored in tstate->exc_ZZZ
2902 at the start of the current frame.
2903
2904*/
2905
Guido van Rossuma027efa1997-05-05 20:56:21 +00002906static void
Guido van Rossumac7be682001-01-17 15:42:30 +00002907set_exc_info(PyThreadState *tstate,
2908 PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002909{
Thomas Wouters477c8d52006-05-27 19:21:47 +00002910 PyFrameObject *frame = tstate->frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002911 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00002912
Thomas Wouters477c8d52006-05-27 19:21:47 +00002913 assert(type != NULL);
2914 assert(frame != NULL);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002915 if (frame->f_exc_type == NULL) {
Thomas Wouters477c8d52006-05-27 19:21:47 +00002916 assert(frame->f_exc_value == NULL);
2917 assert(frame->f_exc_traceback == NULL);
2918 /* This frame didn't catch an exception before. */
2919 /* Save previous exception of this thread in this frame. */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002920 if (tstate->exc_type == NULL) {
Thomas Wouters477c8d52006-05-27 19:21:47 +00002921 /* XXX Why is this set to Py_None? */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002922 Py_INCREF(Py_None);
2923 tstate->exc_type = Py_None;
2924 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002925 Py_INCREF(tstate->exc_type);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002926 Py_XINCREF(tstate->exc_value);
2927 Py_XINCREF(tstate->exc_traceback);
2928 frame->f_exc_type = tstate->exc_type;
2929 frame->f_exc_value = tstate->exc_value;
2930 frame->f_exc_traceback = tstate->exc_traceback;
2931 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002932 /* Set new exception for this thread. */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002933 tmp_type = tstate->exc_type;
2934 tmp_value = tstate->exc_value;
2935 tmp_tb = tstate->exc_traceback;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002936 Py_INCREF(type);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002937 Py_XINCREF(value);
2938 Py_XINCREF(tb);
2939 tstate->exc_type = type;
2940 tstate->exc_value = value;
2941 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002942 Py_XDECREF(tmp_type);
2943 Py_XDECREF(tmp_value);
2944 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002945 /* For b/w compatibility */
2946 PySys_SetObject("exc_type", type);
2947 PySys_SetObject("exc_value", value);
2948 PySys_SetObject("exc_traceback", tb);
2949}
2950
2951static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002952reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002953{
2954 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002955 PyObject *tmp_type, *tmp_value, *tmp_tb;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002956
2957 /* It's a precondition that the thread state's frame caught an
2958 * exception -- verify in a debug build.
2959 */
2960 assert(tstate != NULL);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002961 frame = tstate->frame;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002962 assert(frame != NULL);
2963 assert(frame->f_exc_type != NULL);
2964
2965 /* Copy the frame's exception info back to the thread state. */
2966 tmp_type = tstate->exc_type;
2967 tmp_value = tstate->exc_value;
2968 tmp_tb = tstate->exc_traceback;
2969 Py_INCREF(frame->f_exc_type);
2970 Py_XINCREF(frame->f_exc_value);
2971 Py_XINCREF(frame->f_exc_traceback);
2972 tstate->exc_type = frame->f_exc_type;
2973 tstate->exc_value = frame->f_exc_value;
2974 tstate->exc_traceback = frame->f_exc_traceback;
2975 Py_XDECREF(tmp_type);
2976 Py_XDECREF(tmp_value);
2977 Py_XDECREF(tmp_tb);
2978
2979 /* For b/w compatibility */
2980 PySys_SetObject("exc_type", frame->f_exc_type);
2981 PySys_SetObject("exc_value", frame->f_exc_value);
2982 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
2983
2984 /* Clear the frame's exception info. */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002985 tmp_type = frame->f_exc_type;
2986 tmp_value = frame->f_exc_value;
2987 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002988 frame->f_exc_type = NULL;
2989 frame->f_exc_value = NULL;
2990 frame->f_exc_traceback = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002991 Py_DECREF(tmp_type);
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002992 Py_XDECREF(tmp_value);
2993 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002994}
2995
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002996/* Logic for the raise statement (too complicated for inlining).
2997 This *consumes* a reference count to each of its arguments. */
Raymond Hettinger7c958652004-04-06 10:11:10 +00002998static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002999do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003000{
Guido van Rossumd295f121998-04-09 21:39:57 +00003001 if (type == NULL) {
3002 /* Reraise */
Nicholas Bastine5662ae2004-03-24 22:22:12 +00003003 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossumd295f121998-04-09 21:39:57 +00003004 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
3005 value = tstate->exc_value;
3006 tb = tstate->exc_traceback;
3007 Py_XINCREF(type);
3008 Py_XINCREF(value);
3009 Py_XINCREF(tb);
3010 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003011
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003012 /* We support the following forms of raise:
3013 raise <class>, <classinstance>
3014 raise <class>, <argument tuple>
3015 raise <class>, None
3016 raise <class>, <argument>
3017 raise <classinstance>, None
3018 raise <string>, <object>
3019 raise <string>, None
3020
3021 An omitted second argument is the same as None.
3022
3023 In addition, raise <tuple>, <anything> is the same as
3024 raising the tuple's first item (and it better have one!);
3025 this rule is applied recursively.
3026
3027 Finally, an optional third argument can be supplied, which
3028 gives the traceback to be substituted (useful when
3029 re-raising an exception after examining it). */
3030
3031 /* First, check the traceback argument, replacing None with
3032 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00003033 if (tb == Py_None) {
3034 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003035 tb = NULL;
3036 }
3037 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003038 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003039 "raise: arg 3 must be a traceback or None");
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003040 goto raise_error;
3041 }
3042
3043 /* Next, replace a missing value with None */
3044 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003045 value = Py_None;
3046 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003047 }
3048
3049 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00003050 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
3051 PyObject *tmp = type;
3052 type = PyTuple_GET_ITEM(type, 0);
3053 Py_INCREF(type);
3054 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003055 }
3056
Guido van Rossum45aecf42006-03-15 04:58:47 +00003057 if (PyExceptionClass_Check(type))
Barry Warsaw4249f541997-08-22 21:26:19 +00003058 PyErr_NormalizeException(&type, &value, &tb);
3059
Brett Cannonbf364092006-03-01 04:25:17 +00003060 else if (PyExceptionInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003061 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00003062 if (value != Py_None) {
3063 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003064 "instance exception may not have a separate value");
3065 goto raise_error;
3066 }
3067 else {
3068 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00003069 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003070 value = type;
Brett Cannonbf364092006-03-01 04:25:17 +00003071 type = PyExceptionInstance_Class(type);
Guido van Rossumb209a111997-04-29 18:18:01 +00003072 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003073 }
3074 }
3075 else {
3076 /* Not something you can raise. You get an exception
3077 anyway, just not what you specified :-) */
Guido van Rossum45aecf42006-03-15 04:58:47 +00003078 PyErr_SetString(PyExc_TypeError,
3079 "exceptions must derive from BaseException");
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003080 goto raise_error;
3081 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003082 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003083 if (tb == NULL)
3084 return WHY_EXCEPTION;
3085 else
3086 return WHY_RERAISE;
3087 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00003088 Py_XDECREF(value);
3089 Py_XDECREF(type);
3090 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003091 return WHY_EXCEPTION;
3092}
3093
Tim Petersd6d010b2001-06-21 02:49:55 +00003094/* Iterate v argcnt times and store the results on the stack (via decreasing
Guido van Rossum0368b722007-05-11 16:50:42 +00003095 sp). Return 1 for success, 0 if error.
3096
3097 If argcntafter == -1, do a simple unpack. If it is >= 0, do an unpack
3098 with a variable target.
3099*/
Tim Petersd6d010b2001-06-21 02:49:55 +00003100
Barry Warsawe42b18f1997-08-25 22:13:04 +00003101static int
Guido van Rossum0368b722007-05-11 16:50:42 +00003102unpack_iterable(PyObject *v, int argcnt, int argcntafter, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00003103{
Guido van Rossum0368b722007-05-11 16:50:42 +00003104 int i = 0, j = 0;
3105 Py_ssize_t ll = 0;
Tim Petersd6d010b2001-06-21 02:49:55 +00003106 PyObject *it; /* iter(v) */
Barry Warsawe42b18f1997-08-25 22:13:04 +00003107 PyObject *w;
Guido van Rossum0368b722007-05-11 16:50:42 +00003108 PyObject *l = NULL; /* variable list */
Guido van Rossumac7be682001-01-17 15:42:30 +00003109
Tim Petersd6d010b2001-06-21 02:49:55 +00003110 assert(v != NULL);
3111
3112 it = PyObject_GetIter(v);
3113 if (it == NULL)
3114 goto Error;
3115
3116 for (; i < argcnt; i++) {
3117 w = PyIter_Next(it);
3118 if (w == NULL) {
3119 /* Iterator done, via error or exhaustion. */
3120 if (!PyErr_Occurred()) {
3121 PyErr_Format(PyExc_ValueError,
3122 "need more than %d value%s to unpack",
3123 i, i == 1 ? "" : "s");
3124 }
3125 goto Error;
Barry Warsawe42b18f1997-08-25 22:13:04 +00003126 }
3127 *--sp = w;
3128 }
Tim Petersd6d010b2001-06-21 02:49:55 +00003129
Guido van Rossum0368b722007-05-11 16:50:42 +00003130 if (argcntafter == -1) {
3131 /* We better have exhausted the iterator now. */
3132 w = PyIter_Next(it);
3133 if (w == NULL) {
3134 if (PyErr_Occurred())
3135 goto Error;
3136 Py_DECREF(it);
3137 return 1;
3138 }
3139 Py_DECREF(w);
3140 PyErr_SetString(PyExc_ValueError, "too many values to unpack");
3141 goto Error;
Barry Warsawe42b18f1997-08-25 22:13:04 +00003142 }
Guido van Rossum0368b722007-05-11 16:50:42 +00003143
3144 l = PySequence_List(it);
3145 if (l == NULL)
3146 goto Error;
3147 *--sp = l;
3148 i++;
3149
3150 ll = PyList_GET_SIZE(l);
3151 if (ll < argcntafter) {
3152 PyErr_Format(PyExc_ValueError, "need more than %zd values to unpack",
3153 argcnt + ll);
3154 goto Error;
3155 }
3156
3157 /* Pop the "after-variable" args off the list. */
3158 for (j = argcntafter; j > 0; j--, i++) {
3159 *--sp = PyList_GET_ITEM(l, ll - j);
3160 }
3161 /* Resize the list. */
3162 ((PyListObject *)l)->ob_size = ll - argcntafter;
3163 Py_DECREF(it);
3164 return 1;
3165
Tim Petersd6d010b2001-06-21 02:49:55 +00003166Error:
Barry Warsaw91010551997-08-25 22:30:51 +00003167 for (; i > 0; i--, sp++)
3168 Py_DECREF(*sp);
Tim Petersd6d010b2001-06-21 02:49:55 +00003169 Py_XDECREF(it);
Barry Warsawe42b18f1997-08-25 22:13:04 +00003170 return 0;
3171}
3172
3173
Guido van Rossum96a42c81992-01-12 02:29:51 +00003174#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00003175static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003176prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003177{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003178 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00003179 if (PyObject_Print(v, stdout, 0) != 0)
3180 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00003181 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00003182 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003183}
Guido van Rossum3f5da241990-12-20 15:06:42 +00003184#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003185
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00003186static void
Fred Drake5755ce62001-06-27 19:19:46 +00003187call_exc_trace(Py_tracefunc func, PyObject *self, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00003188{
Guido van Rossumb209a111997-04-29 18:18:01 +00003189 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00003190 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00003191 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00003192 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003193 value = Py_None;
3194 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00003195 }
Raymond Hettinger8ae46892003-10-12 19:09:37 +00003196 arg = PyTuple_Pack(3, type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003197 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003198 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003199 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00003200 }
Fred Drake5755ce62001-06-27 19:19:46 +00003201 err = call_trace(func, self, f, PyTrace_EXCEPTION, arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00003202 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003203 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00003204 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003205 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00003206 Py_XDECREF(type);
3207 Py_XDECREF(value);
3208 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003209 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00003210}
3211
Fred Drake4ec5d562001-10-04 19:26:43 +00003212static void
3213call_trace_protected(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
Armin Rigo1c2d7e52005-09-20 18:34:01 +00003214 int what, PyObject *arg)
Fred Drake4ec5d562001-10-04 19:26:43 +00003215{
3216 PyObject *type, *value, *traceback;
3217 int err;
3218 PyErr_Fetch(&type, &value, &traceback);
Armin Rigo1c2d7e52005-09-20 18:34:01 +00003219 err = call_trace(func, obj, frame, what, arg);
Fred Drake4ec5d562001-10-04 19:26:43 +00003220 if (err == 0)
3221 PyErr_Restore(type, value, traceback);
3222 else {
3223 Py_XDECREF(type);
3224 Py_XDECREF(value);
3225 Py_XDECREF(traceback);
3226 }
3227}
3228
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00003229static int
Fred Drake5755ce62001-06-27 19:19:46 +00003230call_trace(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
3231 int what, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00003232{
Fred Drake5755ce62001-06-27 19:19:46 +00003233 register PyThreadState *tstate = frame->f_tstate;
3234 int result;
3235 if (tstate->tracing)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00003236 return 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +00003237 tstate->tracing++;
Fred Drake9e3ad782001-07-03 23:39:52 +00003238 tstate->use_tracing = 0;
Fred Drake5755ce62001-06-27 19:19:46 +00003239 result = func(obj, frame, what, arg);
Fred Drake9e3ad782001-07-03 23:39:52 +00003240 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
3241 || (tstate->c_profilefunc != NULL));
Guido van Rossuma027efa1997-05-05 20:56:21 +00003242 tstate->tracing--;
Fred Drake5755ce62001-06-27 19:19:46 +00003243 return result;
Guido van Rossum96a42c81992-01-12 02:29:51 +00003244}
3245
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00003246PyObject *
3247_PyEval_CallTracing(PyObject *func, PyObject *args)
3248{
3249 PyFrameObject *frame = PyEval_GetFrame();
3250 PyThreadState *tstate = frame->f_tstate;
3251 int save_tracing = tstate->tracing;
3252 int save_use_tracing = tstate->use_tracing;
3253 PyObject *result;
3254
3255 tstate->tracing = 0;
3256 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
3257 || (tstate->c_profilefunc != NULL));
3258 result = PyObject_Call(func, args, NULL);
3259 tstate->tracing = save_tracing;
3260 tstate->use_tracing = save_use_tracing;
3261 return result;
3262}
3263
Michael W. Hudson006c7522002-11-08 13:08:46 +00003264static int
Tim Peters8a5c3c72004-04-05 19:36:21 +00003265maybe_call_line_trace(Py_tracefunc func, PyObject *obj,
Armin Rigobf57a142004-03-22 19:24:58 +00003266 PyFrameObject *frame, int *instr_lb, int *instr_ub,
3267 int *instr_prev)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003268{
Michael W. Hudson006c7522002-11-08 13:08:46 +00003269 int result = 0;
3270
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003271 /* If the last instruction executed isn't in the current
3272 instruction window, reset the window. If the last
3273 instruction happens to fall at the start of a line or if it
3274 represents a jump backwards, call the trace function.
3275 */
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00003276 if ((frame->f_lasti < *instr_lb || frame->f_lasti >= *instr_ub)) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003277 int line;
3278 PyAddrPair bounds;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003279
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003280 line = PyCode_CheckLineNumber(frame->f_code, frame->f_lasti,
3281 &bounds);
3282 if (line >= 0) {
Michael W. Hudson02ff6a92002-09-11 15:36:32 +00003283 frame->f_lineno = line;
Tim Peters8a5c3c72004-04-05 19:36:21 +00003284 result = call_trace(func, obj, frame,
Michael W. Hudson006c7522002-11-08 13:08:46 +00003285 PyTrace_LINE, Py_None);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003286 }
3287 *instr_lb = bounds.ap_lower;
3288 *instr_ub = bounds.ap_upper;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003289 }
Armin Rigobf57a142004-03-22 19:24:58 +00003290 else if (frame->f_lasti <= *instr_prev) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003291 result = call_trace(func, obj, frame, PyTrace_LINE, Py_None);
Armin Rigobf57a142004-03-22 19:24:58 +00003292 }
3293 *instr_prev = frame->f_lasti;
Michael W. Hudson006c7522002-11-08 13:08:46 +00003294 return result;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003295}
3296
Fred Drake5755ce62001-06-27 19:19:46 +00003297void
3298PyEval_SetProfile(Py_tracefunc func, PyObject *arg)
Fred Draked0838392001-06-16 21:02:31 +00003299{
Nicholas Bastine5662ae2004-03-24 22:22:12 +00003300 PyThreadState *tstate = PyThreadState_GET();
Fred Drake5755ce62001-06-27 19:19:46 +00003301 PyObject *temp = tstate->c_profileobj;
3302 Py_XINCREF(arg);
3303 tstate->c_profilefunc = NULL;
3304 tstate->c_profileobj = NULL;
Brett Cannon55fa66d2005-06-25 07:07:35 +00003305 /* Must make sure that tracing is not ignored if 'temp' is freed */
Fred Drake9e3ad782001-07-03 23:39:52 +00003306 tstate->use_tracing = tstate->c_tracefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00003307 Py_XDECREF(temp);
3308 tstate->c_profilefunc = func;
3309 tstate->c_profileobj = arg;
Brett Cannon55fa66d2005-06-25 07:07:35 +00003310 /* Flag that tracing or profiling is turned on */
Fred Drake9e3ad782001-07-03 23:39:52 +00003311 tstate->use_tracing = (func != NULL) || (tstate->c_tracefunc != NULL);
Fred Drake5755ce62001-06-27 19:19:46 +00003312}
3313
3314void
3315PyEval_SetTrace(Py_tracefunc func, PyObject *arg)
3316{
Nicholas Bastine5662ae2004-03-24 22:22:12 +00003317 PyThreadState *tstate = PyThreadState_GET();
Fred Drake5755ce62001-06-27 19:19:46 +00003318 PyObject *temp = tstate->c_traceobj;
3319 Py_XINCREF(arg);
3320 tstate->c_tracefunc = NULL;
3321 tstate->c_traceobj = NULL;
Brett Cannon55fa66d2005-06-25 07:07:35 +00003322 /* Must make sure that profiling is not ignored if 'temp' is freed */
Fred Drake9e3ad782001-07-03 23:39:52 +00003323 tstate->use_tracing = tstate->c_profilefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00003324 Py_XDECREF(temp);
3325 tstate->c_tracefunc = func;
3326 tstate->c_traceobj = arg;
Brett Cannon55fa66d2005-06-25 07:07:35 +00003327 /* Flag that tracing or profiling is turned on */
Fred Drake9e3ad782001-07-03 23:39:52 +00003328 tstate->use_tracing = ((func != NULL)
3329 || (tstate->c_profilefunc != NULL));
Fred Draked0838392001-06-16 21:02:31 +00003330}
3331
Guido van Rossumb209a111997-04-29 18:18:01 +00003332PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003333PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00003334{
Guido van Rossum6297a7a2003-02-19 15:53:17 +00003335 PyFrameObject *current_frame = PyEval_GetFrame();
Guido van Rossum6135a871995-01-09 17:53:26 +00003336 if (current_frame == NULL)
Nicholas Bastine5662ae2004-03-24 22:22:12 +00003337 return PyThreadState_GET()->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00003338 else
3339 return current_frame->f_builtins;
3340}
3341
Guido van Rossumb209a111997-04-29 18:18:01 +00003342PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003343PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00003344{
Guido van Rossum6297a7a2003-02-19 15:53:17 +00003345 PyFrameObject *current_frame = PyEval_GetFrame();
Guido van Rossum5b722181993-03-30 17:46:03 +00003346 if (current_frame == NULL)
3347 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00003348 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00003349 return current_frame->f_locals;
3350}
3351
Guido van Rossumb209a111997-04-29 18:18:01 +00003352PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003353PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003354{
Guido van Rossum6297a7a2003-02-19 15:53:17 +00003355 PyFrameObject *current_frame = PyEval_GetFrame();
Guido van Rossum3f5da241990-12-20 15:06:42 +00003356 if (current_frame == NULL)
3357 return NULL;
3358 else
3359 return current_frame->f_globals;
3360}
3361
Guido van Rossum6297a7a2003-02-19 15:53:17 +00003362PyFrameObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003363PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00003364{
Nicholas Bastine5662ae2004-03-24 22:22:12 +00003365 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossum6297a7a2003-02-19 15:53:17 +00003366 return _PyThreadState_GetFrame(tstate);
Guido van Rossume59214e1994-08-30 08:01:59 +00003367}
3368
Guido van Rossum6135a871995-01-09 17:53:26 +00003369int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003370PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00003371{
Guido van Rossum6297a7a2003-02-19 15:53:17 +00003372 PyFrameObject *current_frame = PyEval_GetFrame();
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003373 return current_frame == NULL ? 0 : PyFrame_IsRestricted(current_frame);
Guido van Rossum6135a871995-01-09 17:53:26 +00003374}
3375
Guido van Rossumbe270261997-05-22 22:26:18 +00003376int
Tim Peters5ba58662001-07-16 02:29:45 +00003377PyEval_MergeCompilerFlags(PyCompilerFlags *cf)
Jeremy Hylton061d1062001-03-22 02:32:48 +00003378{
Guido van Rossum6297a7a2003-02-19 15:53:17 +00003379 PyFrameObject *current_frame = PyEval_GetFrame();
Just van Rossum3aaf42c2003-02-10 08:21:10 +00003380 int result = cf->cf_flags != 0;
Tim Peters5ba58662001-07-16 02:29:45 +00003381
3382 if (current_frame != NULL) {
3383 const int codeflags = current_frame->f_code->co_flags;
Tim Peterse2c18e92001-08-17 20:47:47 +00003384 const int compilerflags = codeflags & PyCF_MASK;
3385 if (compilerflags) {
Tim Peters5ba58662001-07-16 02:29:45 +00003386 result = 1;
Tim Peterse2c18e92001-08-17 20:47:47 +00003387 cf->cf_flags |= compilerflags;
Tim Peters5ba58662001-07-16 02:29:45 +00003388 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00003389#if 0 /* future keyword */
Martin v. Löwis7198a522002-01-01 19:59:11 +00003390 if (codeflags & CO_GENERATOR_ALLOWED) {
3391 result = 1;
3392 cf->cf_flags |= CO_GENERATOR_ALLOWED;
3393 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00003394#endif
Tim Peters5ba58662001-07-16 02:29:45 +00003395 }
3396 return result;
Jeremy Hylton061d1062001-03-22 02:32:48 +00003397}
3398
Guido van Rossum3f5da241990-12-20 15:06:42 +00003399
Guido van Rossum681d79a1995-07-18 14:51:37 +00003400/* External interface to call any callable object.
3401 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00003402
Guido van Rossumd7ed6831997-08-30 15:02:50 +00003403#undef PyEval_CallObject
3404/* for backward compatibility: export this interface */
3405
Guido van Rossumb209a111997-04-29 18:18:01 +00003406PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003407PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00003408{
Guido van Rossumb209a111997-04-29 18:18:01 +00003409 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003410}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00003411#define PyEval_CallObject(func,arg) \
3412 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00003413
Guido van Rossumb209a111997-04-29 18:18:01 +00003414PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003415PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003416{
Jeremy Hylton52820442001-01-03 23:52:36 +00003417 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003418
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00003419 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003420 arg = PyTuple_New(0);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00003421 if (arg == NULL)
3422 return NULL;
3423 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003424 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003425 PyErr_SetString(PyExc_TypeError,
3426 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00003427 return NULL;
3428 }
3429 else
Guido van Rossumb209a111997-04-29 18:18:01 +00003430 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003431
Guido van Rossumb209a111997-04-29 18:18:01 +00003432 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003433 PyErr_SetString(PyExc_TypeError,
3434 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00003435 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00003436 return NULL;
3437 }
3438
Tim Peters6d6c1a32001-08-02 04:15:00 +00003439 result = PyObject_Call(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00003440 Py_DECREF(arg);
Jeremy Hylton52820442001-01-03 23:52:36 +00003441 return result;
3442}
3443
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00003444const char *
Tim Peters6d6c1a32001-08-02 04:15:00 +00003445PyEval_GetFuncName(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00003446{
3447 if (PyMethod_Check(func))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003448 return PyEval_GetFuncName(PyMethod_GET_FUNCTION(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00003449 else if (PyFunction_Check(func))
3450 return PyString_AsString(((PyFunctionObject*)func)->func_name);
3451 else if (PyCFunction_Check(func))
3452 return ((PyCFunctionObject*)func)->m_ml->ml_name;
Guido van Rossum50e9fb92006-08-17 05:42:55 +00003453 else
Jeremy Hylton512a2372001-04-11 13:52:29 +00003454 return func->ob_type->tp_name;
Jeremy Hylton512a2372001-04-11 13:52:29 +00003455}
3456
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00003457const char *
Tim Peters6d6c1a32001-08-02 04:15:00 +00003458PyEval_GetFuncDesc(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00003459{
3460 if (PyMethod_Check(func))
3461 return "()";
3462 else if (PyFunction_Check(func))
3463 return "()";
3464 else if (PyCFunction_Check(func))
3465 return "()";
Guido van Rossum50e9fb92006-08-17 05:42:55 +00003466 else
Jeremy Hylton512a2372001-04-11 13:52:29 +00003467 return " object";
Jeremy Hylton512a2372001-04-11 13:52:29 +00003468}
3469
Neal Norwitzaddfe0c2002-11-10 14:33:26 +00003470static void
Jeremy Hylton192690e2002-08-16 18:36:11 +00003471err_args(PyObject *func, int flags, int nargs)
3472{
3473 if (flags & METH_NOARGS)
Tim Peters8a5c3c72004-04-05 19:36:21 +00003474 PyErr_Format(PyExc_TypeError,
Guido van Rossum86c659a2002-08-23 14:11:35 +00003475 "%.200s() takes no arguments (%d given)",
Tim Peters8a5c3c72004-04-05 19:36:21 +00003476 ((PyCFunctionObject *)func)->m_ml->ml_name,
Jeremy Hylton192690e2002-08-16 18:36:11 +00003477 nargs);
3478 else
Tim Peters8a5c3c72004-04-05 19:36:21 +00003479 PyErr_Format(PyExc_TypeError,
Guido van Rossum86c659a2002-08-23 14:11:35 +00003480 "%.200s() takes exactly one argument (%d given)",
Tim Peters8a5c3c72004-04-05 19:36:21 +00003481 ((PyCFunctionObject *)func)->m_ml->ml_name,
Jeremy Hylton192690e2002-08-16 18:36:11 +00003482 nargs);
3483}
3484
Armin Rigo1c2d7e52005-09-20 18:34:01 +00003485#define C_TRACE(x, call) \
Nicholas Bastind858a772004-06-25 23:31:06 +00003486if (tstate->use_tracing && tstate->c_profilefunc) { \
3487 if (call_trace(tstate->c_profilefunc, \
3488 tstate->c_profileobj, \
3489 tstate->frame, PyTrace_C_CALL, \
Armin Rigo1c2d7e52005-09-20 18:34:01 +00003490 func)) { \
3491 x = NULL; \
3492 } \
3493 else { \
3494 x = call; \
3495 if (tstate->c_profilefunc != NULL) { \
3496 if (x == NULL) { \
3497 call_trace_protected(tstate->c_profilefunc, \
3498 tstate->c_profileobj, \
3499 tstate->frame, PyTrace_C_EXCEPTION, \
3500 func); \
3501 /* XXX should pass (type, value, tb) */ \
3502 } else { \
3503 if (call_trace(tstate->c_profilefunc, \
3504 tstate->c_profileobj, \
3505 tstate->frame, PyTrace_C_RETURN, \
3506 func)) { \
3507 Py_DECREF(x); \
3508 x = NULL; \
3509 } \
3510 } \
Nicholas Bastinc69ebe82004-03-24 21:57:10 +00003511 } \
Nicholas Bastind858a772004-06-25 23:31:06 +00003512 } \
3513} else { \
Armin Rigo1c2d7e52005-09-20 18:34:01 +00003514 x = call; \
Nicholas Bastinc69ebe82004-03-24 21:57:10 +00003515 }
3516
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003517static PyObject *
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00003518call_function(PyObject ***pp_stack, int oparg
3519#ifdef WITH_TSC
3520 , uint64* pintr0, uint64* pintr1
3521#endif
3522 )
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003523{
3524 int na = oparg & 0xff;
3525 int nk = (oparg>>8) & 0xff;
3526 int n = na + 2 * nk;
3527 PyObject **pfunc = (*pp_stack) - n - 1;
3528 PyObject *func = *pfunc;
3529 PyObject *x, *w;
3530
Jeremy Hylton985eba52003-02-05 23:13:00 +00003531 /* Always dispatch PyCFunction first, because these are
3532 presumed to be the most frequent callable object.
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003533 */
3534 if (PyCFunction_Check(func) && nk == 0) {
3535 int flags = PyCFunction_GET_FLAGS(func);
Nicholas Bastind858a772004-06-25 23:31:06 +00003536 PyThreadState *tstate = PyThreadState_GET();
Raymond Hettingera7f56bc2004-06-26 04:34:33 +00003537
3538 PCALL(PCALL_CFUNCTION);
Jeremy Hylton192690e2002-08-16 18:36:11 +00003539 if (flags & (METH_NOARGS | METH_O)) {
3540 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
3541 PyObject *self = PyCFunction_GET_SELF(func);
Nicholas Bastinc69ebe82004-03-24 21:57:10 +00003542 if (flags & METH_NOARGS && na == 0) {
Armin Rigo1c2d7e52005-09-20 18:34:01 +00003543 C_TRACE(x, (*meth)(self,NULL));
Nicholas Bastinc69ebe82004-03-24 21:57:10 +00003544 }
Jeremy Hylton192690e2002-08-16 18:36:11 +00003545 else if (flags & METH_O && na == 1) {
3546 PyObject *arg = EXT_POP(*pp_stack);
Armin Rigo1c2d7e52005-09-20 18:34:01 +00003547 C_TRACE(x, (*meth)(self,arg));
Jeremy Hylton192690e2002-08-16 18:36:11 +00003548 Py_DECREF(arg);
3549 }
3550 else {
3551 err_args(func, flags, na);
3552 x = NULL;
3553 }
3554 }
3555 else {
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003556 PyObject *callargs;
3557 callargs = load_args(pp_stack, na);
Michael W. Hudson75eabd22005-01-18 15:56:11 +00003558 READ_TIMESTAMP(*pintr0);
Armin Rigo1c2d7e52005-09-20 18:34:01 +00003559 C_TRACE(x, PyCFunction_Call(func,callargs,NULL));
Michael W. Hudson75eabd22005-01-18 15:56:11 +00003560 READ_TIMESTAMP(*pintr1);
Tim Peters8a5c3c72004-04-05 19:36:21 +00003561 Py_XDECREF(callargs);
3562 }
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003563 } else {
3564 if (PyMethod_Check(func) && PyMethod_GET_SELF(func) != NULL) {
3565 /* optimize access to bound methods */
3566 PyObject *self = PyMethod_GET_SELF(func);
Jeremy Hylton985eba52003-02-05 23:13:00 +00003567 PCALL(PCALL_METHOD);
3568 PCALL(PCALL_BOUND_METHOD);
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003569 Py_INCREF(self);
3570 func = PyMethod_GET_FUNCTION(func);
3571 Py_INCREF(func);
3572 Py_DECREF(*pfunc);
3573 *pfunc = self;
3574 na++;
3575 n++;
3576 } else
3577 Py_INCREF(func);
Michael W. Hudson75eabd22005-01-18 15:56:11 +00003578 READ_TIMESTAMP(*pintr0);
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003579 if (PyFunction_Check(func))
3580 x = fast_function(func, pp_stack, n, na, nk);
Tim Peters8a5c3c72004-04-05 19:36:21 +00003581 else
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003582 x = do_call(func, pp_stack, na, nk);
Michael W. Hudson75eabd22005-01-18 15:56:11 +00003583 READ_TIMESTAMP(*pintr1);
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003584 Py_DECREF(func);
3585 }
Tim Peters8a5c3c72004-04-05 19:36:21 +00003586
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003587 /* Clear the stack of the function object. Also removes
3588 the arguments in case they weren't consumed already
3589 (fast_function() and err_args() leave them on the stack).
Thomas Wouters7f597322006-03-01 05:32:33 +00003590 */
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003591 while ((*pp_stack) > pfunc) {
3592 w = EXT_POP(*pp_stack);
3593 Py_DECREF(w);
Jeremy Hylton985eba52003-02-05 23:13:00 +00003594 PCALL(PCALL_POP);
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003595 }
3596 return x;
3597}
3598
Jeremy Hylton192690e2002-08-16 18:36:11 +00003599/* The fast_function() function optimize calls for which no argument
Jeremy Hylton52820442001-01-03 23:52:36 +00003600 tuple is necessary; the objects are passed directly from the stack.
Jeremy Hylton985eba52003-02-05 23:13:00 +00003601 For the simplest case -- a function that takes only positional
3602 arguments and is called with only positional arguments -- it
3603 inlines the most primitive frame setup code from
3604 PyEval_EvalCodeEx(), which vastly reduces the checks that must be
3605 done before evaluating the frame.
Jeremy Hylton52820442001-01-03 23:52:36 +00003606*/
3607
3608static PyObject *
Guido van Rossumac7be682001-01-17 15:42:30 +00003609fast_function(PyObject *func, PyObject ***pp_stack, int n, int na, int nk)
Jeremy Hylton52820442001-01-03 23:52:36 +00003610{
Jeremy Hylton985eba52003-02-05 23:13:00 +00003611 PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003612 PyObject *globals = PyFunction_GET_GLOBALS(func);
3613 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
Guido van Rossum4f72a782006-10-27 23:31:49 +00003614 PyObject *kwdefs = PyFunction_GET_KW_DEFAULTS(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003615 PyObject **d = NULL;
3616 int nd = 0;
3617
Jeremy Hylton985eba52003-02-05 23:13:00 +00003618 PCALL(PCALL_FUNCTION);
3619 PCALL(PCALL_FAST_FUNCTION);
Guido van Rossum4f72a782006-10-27 23:31:49 +00003620 if (argdefs == NULL && co->co_argcount == n &&
3621 co->co_kwonlyargcount == 0 && nk==0 &&
Jeremy Hylton985eba52003-02-05 23:13:00 +00003622 co->co_flags == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE)) {
3623 PyFrameObject *f;
3624 PyObject *retval = NULL;
3625 PyThreadState *tstate = PyThreadState_GET();
3626 PyObject **fastlocals, **stack;
3627 int i;
3628
3629 PCALL(PCALL_FASTER_FUNCTION);
3630 assert(globals != NULL);
3631 /* XXX Perhaps we should create a specialized
3632 PyFrame_New() that doesn't take locals, but does
3633 take builtins without sanity checking them.
3634 */
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00003635 assert(tstate != NULL);
Jeremy Hylton985eba52003-02-05 23:13:00 +00003636 f = PyFrame_New(tstate, co, globals, NULL);
3637 if (f == NULL)
3638 return NULL;
3639
3640 fastlocals = f->f_localsplus;
3641 stack = (*pp_stack) - n;
3642
3643 for (i = 0; i < n; i++) {
3644 Py_INCREF(*stack);
3645 fastlocals[i] = *stack++;
3646 }
Phillip J. Eby0d6615f2005-08-02 00:46:46 +00003647 retval = PyEval_EvalFrameEx(f,0);
Jeremy Hylton985eba52003-02-05 23:13:00 +00003648 ++tstate->recursion_depth;
3649 Py_DECREF(f);
3650 --tstate->recursion_depth;
3651 return retval;
3652 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003653 if (argdefs != NULL) {
3654 d = &PyTuple_GET_ITEM(argdefs, 0);
3655 nd = ((PyTupleObject *)argdefs)->ob_size;
3656 }
Jeremy Hylton985eba52003-02-05 23:13:00 +00003657 return PyEval_EvalCodeEx(co, globals,
3658 (PyObject *)NULL, (*pp_stack)-n, na,
Guido van Rossum4f72a782006-10-27 23:31:49 +00003659 (*pp_stack)-2*nk, nk, d, nd, kwdefs,
Jeremy Hylton985eba52003-02-05 23:13:00 +00003660 PyFunction_GET_CLOSURE(func));
Jeremy Hylton52820442001-01-03 23:52:36 +00003661}
3662
3663static PyObject *
Ka-Ping Yee20579702001-01-15 22:14:16 +00003664update_keyword_args(PyObject *orig_kwdict, int nk, PyObject ***pp_stack,
3665 PyObject *func)
Jeremy Hylton52820442001-01-03 23:52:36 +00003666{
3667 PyObject *kwdict = NULL;
3668 if (orig_kwdict == NULL)
3669 kwdict = PyDict_New();
3670 else {
3671 kwdict = PyDict_Copy(orig_kwdict);
3672 Py_DECREF(orig_kwdict);
3673 }
3674 if (kwdict == NULL)
3675 return NULL;
Raymond Hettinger5bed4562004-04-10 23:34:17 +00003676 while (--nk >= 0) {
Jeremy Hylton52820442001-01-03 23:52:36 +00003677 int err;
3678 PyObject *value = EXT_POP(*pp_stack);
3679 PyObject *key = EXT_POP(*pp_stack);
3680 if (PyDict_GetItem(kwdict, key) != NULL) {
Guido van Rossumac7be682001-01-17 15:42:30 +00003681 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +00003682 "%.200s%s got multiple values "
Jeremy Hylton512a2372001-04-11 13:52:29 +00003683 "for keyword argument '%.200s'",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003684 PyEval_GetFuncName(func),
3685 PyEval_GetFuncDesc(func),
Jeremy Hylton512a2372001-04-11 13:52:29 +00003686 PyString_AsString(key));
Jeremy Hylton52820442001-01-03 23:52:36 +00003687 Py_DECREF(key);
3688 Py_DECREF(value);
3689 Py_DECREF(kwdict);
3690 return NULL;
3691 }
3692 err = PyDict_SetItem(kwdict, key, value);
3693 Py_DECREF(key);
3694 Py_DECREF(value);
3695 if (err) {
3696 Py_DECREF(kwdict);
3697 return NULL;
3698 }
3699 }
3700 return kwdict;
3701}
3702
3703static PyObject *
3704update_star_args(int nstack, int nstar, PyObject *stararg,
3705 PyObject ***pp_stack)
3706{
3707 PyObject *callargs, *w;
3708
3709 callargs = PyTuple_New(nstack + nstar);
3710 if (callargs == NULL) {
3711 return NULL;
3712 }
3713 if (nstar) {
3714 int i;
3715 for (i = 0; i < nstar; i++) {
3716 PyObject *a = PyTuple_GET_ITEM(stararg, i);
3717 Py_INCREF(a);
3718 PyTuple_SET_ITEM(callargs, nstack + i, a);
3719 }
3720 }
Raymond Hettinger5bed4562004-04-10 23:34:17 +00003721 while (--nstack >= 0) {
Jeremy Hylton52820442001-01-03 23:52:36 +00003722 w = EXT_POP(*pp_stack);
3723 PyTuple_SET_ITEM(callargs, nstack, w);
3724 }
3725 return callargs;
3726}
3727
3728static PyObject *
3729load_args(PyObject ***pp_stack, int na)
3730{
3731 PyObject *args = PyTuple_New(na);
3732 PyObject *w;
3733
3734 if (args == NULL)
3735 return NULL;
Raymond Hettinger5bed4562004-04-10 23:34:17 +00003736 while (--na >= 0) {
Jeremy Hylton52820442001-01-03 23:52:36 +00003737 w = EXT_POP(*pp_stack);
3738 PyTuple_SET_ITEM(args, na, w);
3739 }
3740 return args;
3741}
3742
3743static PyObject *
3744do_call(PyObject *func, PyObject ***pp_stack, int na, int nk)
3745{
3746 PyObject *callargs = NULL;
3747 PyObject *kwdict = NULL;
3748 PyObject *result = NULL;
3749
3750 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003751 kwdict = update_keyword_args(NULL, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003752 if (kwdict == NULL)
3753 goto call_fail;
3754 }
3755 callargs = load_args(pp_stack, na);
3756 if (callargs == NULL)
3757 goto call_fail;
Jeremy Hylton985eba52003-02-05 23:13:00 +00003758#ifdef CALL_PROFILE
3759 /* At this point, we have to look at the type of func to
3760 update the call stats properly. Do it here so as to avoid
3761 exposing the call stats machinery outside ceval.c
3762 */
3763 if (PyFunction_Check(func))
3764 PCALL(PCALL_FUNCTION);
3765 else if (PyMethod_Check(func))
3766 PCALL(PCALL_METHOD);
3767 else if (PyType_Check(func))
3768 PCALL(PCALL_TYPE);
3769 else
3770 PCALL(PCALL_OTHER);
3771#endif
Tim Peters6d6c1a32001-08-02 04:15:00 +00003772 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00003773 call_fail:
3774 Py_XDECREF(callargs);
3775 Py_XDECREF(kwdict);
3776 return result;
3777}
3778
3779static PyObject *
3780ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)
3781{
3782 int nstar = 0;
3783 PyObject *callargs = NULL;
3784 PyObject *stararg = NULL;
3785 PyObject *kwdict = NULL;
3786 PyObject *result = NULL;
3787
3788 if (flags & CALL_FLAG_KW) {
3789 kwdict = EXT_POP(*pp_stack);
3790 if (!(kwdict && PyDict_Check(kwdict))) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003791 PyErr_Format(PyExc_TypeError,
Jeremy Hylton512a2372001-04-11 13:52:29 +00003792 "%s%s argument after ** "
3793 "must be a dictionary",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003794 PyEval_GetFuncName(func),
3795 PyEval_GetFuncDesc(func));
Jeremy Hylton52820442001-01-03 23:52:36 +00003796 goto ext_call_fail;
3797 }
3798 }
3799 if (flags & CALL_FLAG_VAR) {
3800 stararg = EXT_POP(*pp_stack);
3801 if (!PyTuple_Check(stararg)) {
3802 PyObject *t = NULL;
3803 t = PySequence_Tuple(stararg);
3804 if (t == NULL) {
Jeremy Hylton512a2372001-04-11 13:52:29 +00003805 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
3806 PyErr_Format(PyExc_TypeError,
3807 "%s%s argument after * "
3808 "must be a sequence",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003809 PyEval_GetFuncName(func),
3810 PyEval_GetFuncDesc(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00003811 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003812 goto ext_call_fail;
3813 }
3814 Py_DECREF(stararg);
3815 stararg = t;
3816 }
3817 nstar = PyTuple_GET_SIZE(stararg);
3818 }
3819 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003820 kwdict = update_keyword_args(kwdict, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003821 if (kwdict == NULL)
3822 goto ext_call_fail;
3823 }
3824 callargs = update_star_args(na, nstar, stararg, pp_stack);
3825 if (callargs == NULL)
3826 goto ext_call_fail;
Jeremy Hylton985eba52003-02-05 23:13:00 +00003827#ifdef CALL_PROFILE
3828 /* At this point, we have to look at the type of func to
3829 update the call stats properly. Do it here so as to avoid
3830 exposing the call stats machinery outside ceval.c
3831 */
3832 if (PyFunction_Check(func))
3833 PCALL(PCALL_FUNCTION);
3834 else if (PyMethod_Check(func))
3835 PCALL(PCALL_METHOD);
3836 else if (PyType_Check(func))
3837 PCALL(PCALL_TYPE);
3838 else
3839 PCALL(PCALL_OTHER);
3840#endif
Tim Peters6d6c1a32001-08-02 04:15:00 +00003841 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00003842 ext_call_fail:
3843 Py_XDECREF(callargs);
3844 Py_XDECREF(kwdict);
3845 Py_XDECREF(stararg);
3846 return result;
3847}
3848
Guido van Rossum38fff8c2006-03-07 18:50:55 +00003849/* Extract a slice index from a PyInt or PyLong or an object with the
3850 nb_index slot defined, and store in *pi.
3851 Silently reduce values larger than PY_SSIZE_T_MAX to PY_SSIZE_T_MAX,
3852 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 +00003853 Return 0 on error, 1 on success.
Tim Peterscb479e72001-12-16 19:11:44 +00003854*/
Tim Petersb5196382001-12-16 19:44:20 +00003855/* Note: If v is NULL, return success without storing into *pi. This
3856 is because_PyEval_SliceIndex() is called by apply_slice(), which can be
3857 called by the SLICE opcode with v and/or w equal to NULL.
Tim Peterscb479e72001-12-16 19:11:44 +00003858*/
Guido van Rossum20c6add2000-05-08 14:06:50 +00003859int
Martin v. Löwis18e16552006-02-15 17:27:45 +00003860_PyEval_SliceIndex(PyObject *v, Py_ssize_t *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003861{
Tim Petersb5196382001-12-16 19:44:20 +00003862 if (v != NULL) {
Martin v. Löwisdde99d22006-02-17 15:57:41 +00003863 Py_ssize_t x;
Guido van Rossumddefaf32007-01-14 03:31:43 +00003864 if (PyInt_CheckExact(v)) {
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00003865 /* XXX(nnorwitz): I think PyInt_AS_LONG is correct,
3866 however, it looks like it should be AsSsize_t.
3867 There should be a comment here explaining why.
3868 */
3869 x = PyInt_AS_LONG(v);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003870 }
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00003871 else if (PyIndex_Check(v)) {
3872 x = PyNumber_AsSsize_t(v, NULL);
Guido van Rossum38fff8c2006-03-07 18:50:55 +00003873 if (x == -1 && PyErr_Occurred())
3874 return 0;
3875 }
3876 else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003877 PyErr_SetString(PyExc_TypeError,
Guido van Rossum38fff8c2006-03-07 18:50:55 +00003878 "slice indices must be integers or "
3879 "None or have an __index__ method");
Guido van Rossum20c6add2000-05-08 14:06:50 +00003880 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003881 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00003882 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003883 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00003884 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003885}
3886
Guido van Rossum38fff8c2006-03-07 18:50:55 +00003887#undef ISINDEX
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00003888#define ISINDEX(x) ((x) == NULL || \
3889 PyInt_Check(x) || PyLong_Check(x) || PyIndex_Check(x))
Guido van Rossum50d756e2001-08-18 17:43:36 +00003890
Guido van Rossumb209a111997-04-29 18:18:01 +00003891static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003892apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003893{
Guido van Rossum50d756e2001-08-18 17:43:36 +00003894 PyTypeObject *tp = u->ob_type;
3895 PySequenceMethods *sq = tp->tp_as_sequence;
3896
Guido van Rossum38fff8c2006-03-07 18:50:55 +00003897 if (sq && sq->sq_slice && ISINDEX(v) && ISINDEX(w)) {
Martin v. Löwisdde99d22006-02-17 15:57:41 +00003898 Py_ssize_t ilow = 0, ihigh = PY_SSIZE_T_MAX;
Guido van Rossum50d756e2001-08-18 17:43:36 +00003899 if (!_PyEval_SliceIndex(v, &ilow))
3900 return NULL;
3901 if (!_PyEval_SliceIndex(w, &ihigh))
3902 return NULL;
3903 return PySequence_GetSlice(u, ilow, ihigh);
3904 }
3905 else {
3906 PyObject *slice = PySlice_New(v, w, NULL);
Guido van Rossum354797c2001-12-03 19:45:06 +00003907 if (slice != NULL) {
3908 PyObject *res = PyObject_GetItem(u, slice);
3909 Py_DECREF(slice);
3910 return res;
3911 }
Guido van Rossum50d756e2001-08-18 17:43:36 +00003912 else
3913 return NULL;
3914 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003915}
Guido van Rossum3f5da241990-12-20 15:06:42 +00003916
3917static int
Guido van Rossumac7be682001-01-17 15:42:30 +00003918assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x)
3919 /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003920{
Guido van Rossum50d756e2001-08-18 17:43:36 +00003921 PyTypeObject *tp = u->ob_type;
3922 PySequenceMethods *sq = tp->tp_as_sequence;
3923
Guido van Rossumd8faa362007-04-27 19:54:29 +00003924 if (sq && sq->sq_ass_slice && ISINDEX(v) && ISINDEX(w)) {
Martin v. Löwisdde99d22006-02-17 15:57:41 +00003925 Py_ssize_t ilow = 0, ihigh = PY_SSIZE_T_MAX;
Guido van Rossum50d756e2001-08-18 17:43:36 +00003926 if (!_PyEval_SliceIndex(v, &ilow))
3927 return -1;
3928 if (!_PyEval_SliceIndex(w, &ihigh))
3929 return -1;
3930 if (x == NULL)
3931 return PySequence_DelSlice(u, ilow, ihigh);
3932 else
3933 return PySequence_SetSlice(u, ilow, ihigh, x);
3934 }
3935 else {
3936 PyObject *slice = PySlice_New(v, w, NULL);
3937 if (slice != NULL) {
Guido van Rossum354797c2001-12-03 19:45:06 +00003938 int res;
Guido van Rossum50d756e2001-08-18 17:43:36 +00003939 if (x != NULL)
Guido van Rossum354797c2001-12-03 19:45:06 +00003940 res = PyObject_SetItem(u, slice, x);
Guido van Rossum50d756e2001-08-18 17:43:36 +00003941 else
Guido van Rossum354797c2001-12-03 19:45:06 +00003942 res = PyObject_DelItem(u, slice);
3943 Py_DECREF(slice);
3944 return res;
Guido van Rossum50d756e2001-08-18 17:43:36 +00003945 }
3946 else
3947 return -1;
3948 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003949}
3950
Brett Cannon39590462007-02-26 22:01:14 +00003951#define CANNOT_CATCH_MSG "catching classes that do not inherit from"\
3952 "BaseException is not allowed"
Brett Cannonf74225d2007-02-26 21:10:16 +00003953
Guido van Rossumb209a111997-04-29 18:18:01 +00003954static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003955cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003956{
Guido van Rossumac7be682001-01-17 15:42:30 +00003957 int res = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003958 switch (op) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00003959 case PyCmp_IS:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003960 res = (v == w);
Raymond Hettinger4bad9ba2003-01-19 05:08:13 +00003961 break;
3962 case PyCmp_IS_NOT:
3963 res = (v != w);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003964 break;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003965 case PyCmp_IN:
Raymond Hettinger4bad9ba2003-01-19 05:08:13 +00003966 res = PySequence_Contains(w, v);
3967 if (res < 0)
3968 return NULL;
3969 break;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003970 case PyCmp_NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003971 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003972 if (res < 0)
3973 return NULL;
Raymond Hettinger4bad9ba2003-01-19 05:08:13 +00003974 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003975 break;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003976 case PyCmp_EXC_MATCH:
Thomas Wouters9fe394c2007-02-05 01:24:16 +00003977 if (PyTuple_Check(w)) {
3978 Py_ssize_t i, length;
3979 length = PyTuple_Size(w);
3980 for (i = 0; i < length; i += 1) {
3981 PyObject *exc = PyTuple_GET_ITEM(w, i);
Brett Cannon39590462007-02-26 22:01:14 +00003982 if (!PyExceptionClass_Check(exc)) {
3983 PyErr_SetString(PyExc_TypeError,
3984 CANNOT_CATCH_MSG);
Brett Cannonf74225d2007-02-26 21:10:16 +00003985 return NULL;
Thomas Wouters9fe394c2007-02-05 01:24:16 +00003986 }
3987 }
3988 }
3989 else {
Brett Cannon39590462007-02-26 22:01:14 +00003990 if (!PyExceptionClass_Check(w)) {
3991 PyErr_SetString(PyExc_TypeError,
3992 CANNOT_CATCH_MSG);
Brett Cannonf74225d2007-02-26 21:10:16 +00003993 return NULL;
Thomas Wouters9fe394c2007-02-05 01:24:16 +00003994 }
3995 }
Barry Warsaw4249f541997-08-22 21:26:19 +00003996 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003997 break;
3998 default:
Guido van Rossumac7be682001-01-17 15:42:30 +00003999 return PyObject_RichCompare(v, w, op);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004000 }
Guido van Rossumb209a111997-04-29 18:18:01 +00004001 v = res ? Py_True : Py_False;
4002 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004003 return v;
4004}
4005
Thomas Wouters52152252000-08-17 22:55:00 +00004006static PyObject *
4007import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00004008{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00004009 PyObject *x;
4010
4011 x = PyObject_GetAttr(v, name);
4012 if (x == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
Thomas Wouters52152252000-08-17 22:55:00 +00004013 PyErr_Format(PyExc_ImportError,
4014 "cannot import name %.230s",
4015 PyString_AsString(name));
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00004016 }
Thomas Wouters52152252000-08-17 22:55:00 +00004017 return x;
4018}
Guido van Rossumac7be682001-01-17 15:42:30 +00004019
Thomas Wouters52152252000-08-17 22:55:00 +00004020static int
4021import_all_from(PyObject *locals, PyObject *v)
4022{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00004023 PyObject *all = PyObject_GetAttrString(v, "__all__");
4024 PyObject *dict, *name, *value;
4025 int skip_leading_underscores = 0;
4026 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00004027
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00004028 if (all == NULL) {
4029 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
4030 return -1; /* Unexpected error */
4031 PyErr_Clear();
4032 dict = PyObject_GetAttrString(v, "__dict__");
4033 if (dict == NULL) {
4034 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
4035 return -1;
4036 PyErr_SetString(PyExc_ImportError,
4037 "from-import-* object has no __dict__ and no __all__");
Guido van Rossum3f5da241990-12-20 15:06:42 +00004038 return -1;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00004039 }
4040 all = PyMapping_Keys(dict);
4041 Py_DECREF(dict);
4042 if (all == NULL)
4043 return -1;
4044 skip_leading_underscores = 1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00004045 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00004046
4047 for (pos = 0, err = 0; ; pos++) {
4048 name = PySequence_GetItem(all, pos);
4049 if (name == NULL) {
4050 if (!PyErr_ExceptionMatches(PyExc_IndexError))
4051 err = -1;
4052 else
4053 PyErr_Clear();
4054 break;
4055 }
4056 if (skip_leading_underscores &&
4057 PyString_Check(name) &&
4058 PyString_AS_STRING(name)[0] == '_')
4059 {
4060 Py_DECREF(name);
4061 continue;
4062 }
4063 value = PyObject_GetAttr(v, name);
4064 if (value == NULL)
4065 err = -1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00004066 else if (PyDict_CheckExact(locals))
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00004067 err = PyDict_SetItem(locals, name, value);
Thomas Wouters89f507f2006-12-13 04:49:30 +00004068 else
4069 err = PyObject_SetItem(locals, name, value);
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00004070 Py_DECREF(name);
4071 Py_XDECREF(value);
4072 if (err != 0)
4073 break;
4074 }
4075 Py_DECREF(all);
4076 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00004077}
4078
Guido van Rossumac7be682001-01-17 15:42:30 +00004079static void
Paul Prescode68140d2000-08-30 20:25:01 +00004080format_exc_check_arg(PyObject *exc, char *format_str, PyObject *obj)
4081{
4082 char *obj_str;
4083
4084 if (!obj)
4085 return;
4086
4087 obj_str = PyString_AsString(obj);
4088 if (!obj_str)
4089 return;
4090
4091 PyErr_Format(exc, format_str, obj_str);
4092}
Guido van Rossum950361c1997-01-24 13:49:28 +00004093
Raymond Hettinger52a21b82004-08-06 18:43:09 +00004094static PyObject *
4095string_concatenate(PyObject *v, PyObject *w,
4096 PyFrameObject *f, unsigned char *next_instr)
4097{
4098 /* This function implements 'variable += expr' when both arguments
4099 are strings. */
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004100 Py_ssize_t v_len = PyString_GET_SIZE(v);
4101 Py_ssize_t w_len = PyString_GET_SIZE(w);
4102 Py_ssize_t new_len = v_len + w_len;
4103 if (new_len < 0) {
4104 PyErr_SetString(PyExc_OverflowError,
4105 "strings are too large to concat");
4106 return NULL;
4107 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00004108
Raymond Hettinger52a21b82004-08-06 18:43:09 +00004109 if (v->ob_refcnt == 2) {
4110 /* In the common case, there are 2 references to the value
4111 * stored in 'variable' when the += is performed: one on the
4112 * value stack (in 'v') and one still stored in the 'variable'.
4113 * We try to delete the variable now to reduce the refcnt to 1.
4114 */
4115 switch (*next_instr) {
4116 case STORE_FAST:
4117 {
4118 int oparg = PEEKARG();
4119 PyObject **fastlocals = f->f_localsplus;
4120 if (GETLOCAL(oparg) == v)
4121 SETLOCAL(oparg, NULL);
4122 break;
4123 }
4124 case STORE_DEREF:
4125 {
Thomas Wouters477c8d52006-05-27 19:21:47 +00004126 PyObject **freevars = f->f_localsplus + f->f_code->co_nlocals;
Raymond Hettinger52a21b82004-08-06 18:43:09 +00004127 PyObject *c = freevars[PEEKARG()];
4128 if (PyCell_GET(c) == v)
4129 PyCell_Set(c, NULL);
4130 break;
4131 }
4132 case STORE_NAME:
4133 {
4134 PyObject *names = f->f_code->co_names;
4135 PyObject *name = GETITEM(names, PEEKARG());
4136 PyObject *locals = f->f_locals;
4137 if (PyDict_CheckExact(locals) &&
4138 PyDict_GetItem(locals, name) == v) {
4139 if (PyDict_DelItem(locals, name) != 0) {
4140 PyErr_Clear();
4141 }
4142 }
4143 break;
4144 }
4145 }
4146 }
4147
Armin Rigo618fbf52004-08-07 20:58:32 +00004148 if (v->ob_refcnt == 1 && !PyString_CHECK_INTERNED(v)) {
Raymond Hettinger52a21b82004-08-06 18:43:09 +00004149 /* Now we own the last reference to 'v', so we can resize it
4150 * in-place.
4151 */
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004152 if (_PyString_Resize(&v, new_len) != 0) {
Raymond Hettinger52a21b82004-08-06 18:43:09 +00004153 /* XXX if _PyString_Resize() fails, 'v' has been
4154 * deallocated so it cannot be put back into 'variable'.
4155 * The MemoryError is raised when there is no value in
4156 * 'variable', which might (very remotely) be a cause
4157 * of incompatibilities.
4158 */
4159 return NULL;
4160 }
4161 /* copy 'w' into the newly allocated area of 'v' */
4162 memcpy(PyString_AS_STRING(v) + v_len,
4163 PyString_AS_STRING(w), w_len);
4164 return v;
4165 }
4166 else {
4167 /* When in-place resizing is not an option. */
4168 PyString_Concat(&v, w);
4169 return v;
4170 }
4171}
4172
Guido van Rossum950361c1997-01-24 13:49:28 +00004173#ifdef DYNAMIC_EXECUTION_PROFILE
4174
Skip Montanarof118cb12001-10-15 20:51:38 +00004175static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004176getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00004177{
4178 int i;
4179 PyObject *l = PyList_New(256);
4180 if (l == NULL) return NULL;
4181 for (i = 0; i < 256; i++) {
4182 PyObject *x = PyInt_FromLong(a[i]);
4183 if (x == NULL) {
4184 Py_DECREF(l);
4185 return NULL;
4186 }
4187 PyList_SetItem(l, i, x);
4188 }
4189 for (i = 0; i < 256; i++)
4190 a[i] = 0;
4191 return l;
4192}
4193
4194PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004195_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00004196{
4197#ifndef DXPAIRS
4198 return getarray(dxp);
4199#else
4200 int i;
4201 PyObject *l = PyList_New(257);
4202 if (l == NULL) return NULL;
4203 for (i = 0; i < 257; i++) {
4204 PyObject *x = getarray(dxpairs[i]);
4205 if (x == NULL) {
4206 Py_DECREF(l);
4207 return NULL;
4208 }
4209 PyList_SetItem(l, i, x);
4210 }
4211 return l;
4212#endif
4213}
4214
4215#endif