blob: 73a0624f202d30119182b159b8a7a34511b2892a [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 * cmp_outcome(int, PyObject *, PyObject *);
115static PyObject * import_from(PyObject *, PyObject *);
Thomas Wouters52152252000-08-17 22:55:00 +0000116static int import_all_from(PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000117static void set_exc_info(PyThreadState *, PyObject *, PyObject *, PyObject *);
118static void reset_exc_info(PyThreadState *);
Neal Norwitzda059e32007-08-26 05:33:45 +0000119static void format_exc_check_arg(PyObject *, const char *, PyObject *);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000120static PyObject * string_concatenate(PyObject *, PyObject *,
Raymond Hettinger52a21b82004-08-06 18:43:09 +0000121 PyFrameObject *, unsigned char *);
Guido van Rossum374a9221991-04-04 10:40:29 +0000122
Paul Prescode68140d2000-08-30 20:25:01 +0000123#define NAME_ERROR_MSG \
Fred Drake661ea262000-10-24 19:57:45 +0000124 "name '%.200s' is not defined"
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000125#define GLOBAL_NAME_ERROR_MSG \
126 "global name '%.200s' is not defined"
Paul Prescode68140d2000-08-30 20:25:01 +0000127#define UNBOUNDLOCAL_ERROR_MSG \
Fred Drake661ea262000-10-24 19:57:45 +0000128 "local variable '%.200s' referenced before assignment"
Jeremy Hyltonc76770c2001-04-13 16:51:46 +0000129#define UNBOUNDFREE_ERROR_MSG \
130 "free variable '%.200s' referenced before assignment" \
131 " in enclosing scope"
Guido van Rossum374a9221991-04-04 10:40:29 +0000132
Guido van Rossum950361c1997-01-24 13:49:28 +0000133/* Dynamic execution profile */
134#ifdef DYNAMIC_EXECUTION_PROFILE
135#ifdef DXPAIRS
136static long dxpairs[257][256];
137#define dxp dxpairs[256]
138#else
139static long dxp[256];
140#endif
141#endif
142
Jeremy Hylton985eba52003-02-05 23:13:00 +0000143/* Function call profile */
144#ifdef CALL_PROFILE
145#define PCALL_NUM 11
146static int pcall[PCALL_NUM];
147
148#define PCALL_ALL 0
149#define PCALL_FUNCTION 1
150#define PCALL_FAST_FUNCTION 2
151#define PCALL_FASTER_FUNCTION 3
152#define PCALL_METHOD 4
153#define PCALL_BOUND_METHOD 5
154#define PCALL_CFUNCTION 6
155#define PCALL_TYPE 7
156#define PCALL_GENERATOR 8
157#define PCALL_OTHER 9
158#define PCALL_POP 10
159
160/* Notes about the statistics
161
162 PCALL_FAST stats
163
164 FAST_FUNCTION means no argument tuple needs to be created.
165 FASTER_FUNCTION means that the fast-path frame setup code is used.
166
167 If there is a method call where the call can be optimized by changing
168 the argument tuple and calling the function directly, it gets recorded
169 twice.
170
171 As a result, the relationship among the statistics appears to be
172 PCALL_ALL == PCALL_FUNCTION + PCALL_METHOD - PCALL_BOUND_METHOD +
173 PCALL_CFUNCTION + PCALL_TYPE + PCALL_GENERATOR + PCALL_OTHER
174 PCALL_FUNCTION > PCALL_FAST_FUNCTION > PCALL_FASTER_FUNCTION
175 PCALL_METHOD > PCALL_BOUND_METHOD
176*/
177
178#define PCALL(POS) pcall[POS]++
179
180PyObject *
181PyEval_GetCallStats(PyObject *self)
182{
Thomas Wouters89f507f2006-12-13 04:49:30 +0000183 return Py_BuildValue("iiiiiiiiiii",
Jeremy Hylton985eba52003-02-05 23:13:00 +0000184 pcall[0], pcall[1], pcall[2], pcall[3],
185 pcall[4], pcall[5], pcall[6], pcall[7],
Thomas Wouters89f507f2006-12-13 04:49:30 +0000186 pcall[8], pcall[9], pcall[10]);
Jeremy Hylton985eba52003-02-05 23:13:00 +0000187}
188#else
189#define PCALL(O)
190
191PyObject *
192PyEval_GetCallStats(PyObject *self)
193{
194 Py_INCREF(Py_None);
195 return Py_None;
196}
197#endif
198
Tim Peters5ca576e2001-06-18 22:08:13 +0000199
Guido van Rossume59214e1994-08-30 08:01:59 +0000200#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000201
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000202#ifdef HAVE_ERRNO_H
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000203#include <errno.h>
Guido van Rossum2571cc81999-04-07 16:07:23 +0000204#endif
Guido van Rossum49b56061998-10-01 20:42:43 +0000205#include "pythread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000206
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000207static PyThread_type_lock interpreter_lock = 0; /* This is the GIL */
Guido van Rossuma9672091994-09-14 13:31:22 +0000208static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000209
Tim Peters7f468f22004-10-11 02:40:51 +0000210int
211PyEval_ThreadsInitialized(void)
212{
213 return interpreter_lock != 0;
214}
215
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000216void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000217PyEval_InitThreads(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000218{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000219 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000220 return;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000221 interpreter_lock = PyThread_allocate_lock();
222 PyThread_acquire_lock(interpreter_lock, 1);
223 main_thread = PyThread_get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000224}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000225
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000226void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000227PyEval_AcquireLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000228{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000229 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000230}
231
232void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000233PyEval_ReleaseLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000234{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000235 PyThread_release_lock(interpreter_lock);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000236}
237
238void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000239PyEval_AcquireThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000240{
241 if (tstate == NULL)
242 Py_FatalError("PyEval_AcquireThread: NULL new thread state");
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000243 /* Check someone has called PyEval_InitThreads() to create the lock */
244 assert(interpreter_lock);
Guido van Rossum65d5b571998-12-21 19:32:43 +0000245 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000246 if (PyThreadState_Swap(tstate) != NULL)
247 Py_FatalError(
248 "PyEval_AcquireThread: non-NULL old thread state");
249}
250
251void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000252PyEval_ReleaseThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000253{
254 if (tstate == NULL)
255 Py_FatalError("PyEval_ReleaseThread: NULL thread state");
256 if (PyThreadState_Swap(NULL) != tstate)
257 Py_FatalError("PyEval_ReleaseThread: wrong thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000258 PyThread_release_lock(interpreter_lock);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000259}
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000260
261/* This function is called from PyOS_AfterFork to ensure that newly
262 created child processes don't hold locks referring to threads which
263 are not running in the child process. (This could also be done using
264 pthread_atfork mechanism, at least for the pthreads implementation.) */
265
266void
267PyEval_ReInitThreads(void)
268{
269 if (!interpreter_lock)
270 return;
271 /*XXX Can't use PyThread_free_lock here because it does too
272 much error-checking. Doing this cleanly would require
273 adding a new function to each thread_*.h. Instead, just
274 create a new lock and waste a little bit of memory */
275 interpreter_lock = PyThread_allocate_lock();
276 PyThread_acquire_lock(interpreter_lock, 1);
277 main_thread = PyThread_get_thread_ident();
278}
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000279#endif
280
Guido van Rossumff4949e1992-08-05 19:58:53 +0000281/* Functions save_thread and restore_thread are always defined so
282 dynamically loaded modules needn't be compiled separately for use
283 with and without threads: */
284
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000285PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000286PyEval_SaveThread(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000287{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000288 PyThreadState *tstate = PyThreadState_Swap(NULL);
289 if (tstate == NULL)
290 Py_FatalError("PyEval_SaveThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000291#ifdef WITH_THREAD
Guido van Rossumb74eca91997-09-30 22:03:16 +0000292 if (interpreter_lock)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000293 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000294#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000295 return tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000296}
297
298void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000299PyEval_RestoreThread(PyThreadState *tstate)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000300{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000301 if (tstate == NULL)
302 Py_FatalError("PyEval_RestoreThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000303#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000304 if (interpreter_lock) {
Guido van Rossumb74eca91997-09-30 22:03:16 +0000305 int err = errno;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000306 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000307 errno = err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000308 }
309#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000310 PyThreadState_Swap(tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000311}
312
313
Guido van Rossuma9672091994-09-14 13:31:22 +0000314/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
315 signal handlers or Mac I/O completion routines) can schedule calls
316 to a function to be called synchronously.
317 The synchronous function is called with one void* argument.
318 It should return 0 for success or -1 for failure -- failure should
319 be accompanied by an exception.
320
321 If registry succeeds, the registry function returns 0; if it fails
322 (e.g. due to too many pending calls) it returns -1 (without setting
323 an exception condition).
324
325 Note that because registry may occur from within signal handlers,
326 or other asynchronous events, calling malloc() is unsafe!
327
328#ifdef WITH_THREAD
329 Any thread can schedule pending calls, but only the main thread
330 will execute them.
331#endif
332
333 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
334 There are two possible race conditions:
335 (1) nested asynchronous registry calls;
336 (2) registry calls made while pending calls are being processed.
337 While (1) is very unlikely, (2) is a real possibility.
338 The current code is safe against (2), but not against (1).
339 The safety against (2) is derived from the fact that only one
340 thread (the main thread) ever takes things out of the queue.
Guido van Rossuma9672091994-09-14 13:31:22 +0000341
Guido van Rossuma027efa1997-05-05 20:56:21 +0000342 XXX Darn! With the advent of thread state, we should have an array
343 of pending calls per thread in the thread state! Later...
344*/
Guido van Rossum8861b741996-07-30 16:49:37 +0000345
Guido van Rossuma9672091994-09-14 13:31:22 +0000346#define NPENDINGCALLS 32
347static struct {
Thomas Wouters334fb892000-07-25 12:56:38 +0000348 int (*func)(void *);
349 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000350} pendingcalls[NPENDINGCALLS];
351static volatile int pendingfirst = 0;
352static volatile int pendinglast = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000353static volatile int things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000354
355int
Thomas Wouters334fb892000-07-25 12:56:38 +0000356Py_AddPendingCall(int (*func)(void *), void *arg)
Guido van Rossuma9672091994-09-14 13:31:22 +0000357{
Michael W. Hudson30ea2f22004-07-07 17:44:12 +0000358 static volatile int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000359 int i, j;
360 /* XXX Begin critical section */
361 /* XXX If you want this to be safe against nested
362 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000363 if (busy)
364 return -1;
365 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000366 i = pendinglast;
367 j = (i + 1) % NPENDINGCALLS;
Guido van Rossum04e70322002-07-17 16:57:13 +0000368 if (j == pendingfirst) {
369 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000370 return -1; /* Queue full */
Guido van Rossum04e70322002-07-17 16:57:13 +0000371 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000372 pendingcalls[i].func = func;
373 pendingcalls[i].arg = arg;
374 pendinglast = j;
Skip Montanarod581d772002-09-03 20:10:45 +0000375
376 _Py_Ticker = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000377 things_to_do = 1; /* Signal main loop */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000378 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000379 /* XXX End critical section */
380 return 0;
381}
382
Guido van Rossum180d7b41994-09-29 09:45:57 +0000383int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000384Py_MakePendingCalls(void)
Guido van Rossuma9672091994-09-14 13:31:22 +0000385{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000386 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000387#ifdef WITH_THREAD
Guido van Rossum65d5b571998-12-21 19:32:43 +0000388 if (main_thread && PyThread_get_thread_ident() != main_thread)
Guido van Rossuma9672091994-09-14 13:31:22 +0000389 return 0;
390#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000391 if (busy)
Guido van Rossum180d7b41994-09-29 09:45:57 +0000392 return 0;
393 busy = 1;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000394 things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000395 for (;;) {
396 int i;
Thomas Wouters334fb892000-07-25 12:56:38 +0000397 int (*func)(void *);
398 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000399 i = pendingfirst;
400 if (i == pendinglast)
401 break; /* Queue empty */
402 func = pendingcalls[i].func;
403 arg = pendingcalls[i].arg;
404 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000405 if (func(arg) < 0) {
406 busy = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000407 things_to_do = 1; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000408 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000409 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000410 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000411 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000412 return 0;
413}
414
415
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000416/* The interpreter's recursion limit */
417
Hye-Shik Changb6fa2812005-04-04 15:49:02 +0000418#ifndef Py_DEFAULT_RECURSION_LIMIT
419#define Py_DEFAULT_RECURSION_LIMIT 1000
420#endif
421static int recursion_limit = Py_DEFAULT_RECURSION_LIMIT;
422int _Py_CheckRecursionLimit = Py_DEFAULT_RECURSION_LIMIT;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000423
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000424int
425Py_GetRecursionLimit(void)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000426{
427 return recursion_limit;
428}
429
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000430void
431Py_SetRecursionLimit(int new_limit)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000432{
433 recursion_limit = new_limit;
Thomas Woutersce272b62007-09-19 21:19:28 +0000434 _Py_CheckRecursionLimit = recursion_limit;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000435}
436
Armin Rigo2b3eb402003-10-28 12:05:48 +0000437/* the macro Py_EnterRecursiveCall() only calls _Py_CheckRecursiveCall()
438 if the recursion_depth reaches _Py_CheckRecursionLimit.
439 If USE_STACKCHECK, the macro decrements _Py_CheckRecursionLimit
440 to guarantee that _Py_CheckRecursiveCall() is regularly called.
441 Without USE_STACKCHECK, there is no need for this. */
442int
443_Py_CheckRecursiveCall(char *where)
444{
445 PyThreadState *tstate = PyThreadState_GET();
446
447#ifdef USE_STACKCHECK
448 if (PyOS_CheckStack()) {
449 --tstate->recursion_depth;
450 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
451 return -1;
452 }
453#endif
Martin v. Löwis5b222132007-06-10 09:51:05 +0000454 if (tstate->recursion_critical)
455 /* Somebody asked that we don't check for recursion. */
456 return 0;
457 if (tstate->overflowed) {
458 if (tstate->recursion_depth > recursion_limit + 50) {
459 /* Overflowing while handling an overflow. Give up. */
460 Py_FatalError("Cannot recover from stack overflow.");
461 }
462 return 0;
463 }
Armin Rigo2b3eb402003-10-28 12:05:48 +0000464 if (tstate->recursion_depth > recursion_limit) {
465 --tstate->recursion_depth;
Martin v. Löwis5b222132007-06-10 09:51:05 +0000466 tstate->overflowed = 1;
Armin Rigo2b3eb402003-10-28 12:05:48 +0000467 PyErr_Format(PyExc_RuntimeError,
468 "maximum recursion depth exceeded%s",
469 where);
470 return -1;
471 }
Thomas Woutersce272b62007-09-19 21:19:28 +0000472 _Py_CheckRecursionLimit = recursion_limit;
Armin Rigo2b3eb402003-10-28 12:05:48 +0000473 return 0;
474}
475
Guido van Rossum374a9221991-04-04 10:40:29 +0000476/* Status code for main loop (reason for stack unwind) */
Raymond Hettinger7c958652004-04-06 10:11:10 +0000477enum why_code {
478 WHY_NOT = 0x0001, /* No error */
479 WHY_EXCEPTION = 0x0002, /* Exception occurred */
480 WHY_RERAISE = 0x0004, /* Exception re-raised by 'finally' */
481 WHY_RETURN = 0x0008, /* 'return' statement */
482 WHY_BREAK = 0x0010, /* 'break' statement */
483 WHY_CONTINUE = 0x0020, /* 'continue' statement */
484 WHY_YIELD = 0x0040 /* 'yield' operator */
485};
Guido van Rossum374a9221991-04-04 10:40:29 +0000486
Collin Winter828f04a2007-08-31 00:04:24 +0000487static enum why_code do_raise(PyObject *, PyObject *);
Guido van Rossum0368b722007-05-11 16:50:42 +0000488static int unpack_iterable(PyObject *, int, int, PyObject **);
Guido van Rossum1aa14831997-01-21 05:34:20 +0000489
Skip Montanarod581d772002-09-03 20:10:45 +0000490/* for manipulating the thread switch and periodic "stuff" - used to be
491 per thread, now just a pair o' globals */
Skip Montanaro99dba272002-09-03 20:19:06 +0000492int _Py_CheckInterval = 100;
493volatile int _Py_Ticker = 100;
Guido van Rossum374a9221991-04-04 10:40:29 +0000494
Guido van Rossumb209a111997-04-29 18:18:01 +0000495PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000496PyEval_EvalCode(PyCodeObject *co, PyObject *globals, PyObject *locals)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000497{
Tim Peters6d6c1a32001-08-02 04:15:00 +0000498 return PyEval_EvalCodeEx(co,
Guido van Rossum681d79a1995-07-18 14:51:37 +0000499 globals, locals,
Guido van Rossumb209a111997-04-29 18:18:01 +0000500 (PyObject **)NULL, 0,
501 (PyObject **)NULL, 0,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000502 (PyObject **)NULL, 0,
Guido van Rossum4f72a782006-10-27 23:31:49 +0000503 NULL, NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000504}
505
506
507/* Interpreter main loop */
508
Martin v. Löwis8d97e332004-06-27 15:43:12 +0000509PyObject *
Phillip J. Eby0d6615f2005-08-02 00:46:46 +0000510PyEval_EvalFrame(PyFrameObject *f) {
511 /* This is for backward compatibility with extension modules that
512 used this API; core interpreter code should call PyEval_EvalFrameEx() */
513 return PyEval_EvalFrameEx(f, 0);
514}
515
516PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000517PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
Guido van Rossum374a9221991-04-04 10:40:29 +0000518{
Guido van Rossum950361c1997-01-24 13:49:28 +0000519#ifdef DXPAIRS
520 int lastopcode = 0;
521#endif
Armin Rigo8817fcd2004-06-17 10:22:40 +0000522 register PyObject **stack_pointer; /* Next free slot in value stack */
Guido van Rossum374a9221991-04-04 10:40:29 +0000523 register unsigned char *next_instr;
Armin Rigo8817fcd2004-06-17 10:22:40 +0000524 register int opcode; /* Current opcode */
525 register int oparg; /* Current opcode argument, if any */
Raymond Hettinger7c958652004-04-06 10:11:10 +0000526 register enum why_code why; /* Reason for block stack unwind */
Guido van Rossum374a9221991-04-04 10:40:29 +0000527 register int err; /* Error status -- nonzero if error */
Guido van Rossumb209a111997-04-29 18:18:01 +0000528 register PyObject *x; /* Result object -- NULL if error */
529 register PyObject *v; /* Temporary objects popped off stack */
530 register PyObject *w;
531 register PyObject *u;
532 register PyObject *t;
Jeremy Hylton2b724da2001-01-29 22:51:52 +0000533 register PyObject **fastlocals, **freevars;
Guido van Rossum014518f1998-11-23 21:09:51 +0000534 PyObject *retval = NULL; /* Return value */
Guido van Rossum885553e1998-12-21 18:33:30 +0000535 PyThreadState *tstate = PyThreadState_GET();
Tim Peters5ca576e2001-06-18 22:08:13 +0000536 PyCodeObject *co;
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000537
Tim Peters8a5c3c72004-04-05 19:36:21 +0000538 /* when tracing we set things up so that
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000539
540 not (instr_lb <= current_bytecode_offset < instr_ub)
541
Tim Peters8a5c3c72004-04-05 19:36:21 +0000542 is true when the line being executed has changed. The
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000543 initial values are such as to make this false the first
544 time it is tested. */
Armin Rigobf57a142004-03-22 19:24:58 +0000545 int instr_ub = -1, instr_lb = 0, instr_prev = -1;
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000546
Guido van Rossumd076c731998-10-07 19:42:25 +0000547 unsigned char *first_instr;
Skip Montanaro04d80f82002-08-04 21:03:35 +0000548 PyObject *names;
549 PyObject *consts;
Neal Norwitz5f5153e2005-10-21 04:28:38 +0000550#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000551 /* Make it easier to find out where we are with a debugger */
Tim Peters5ca576e2001-06-18 22:08:13 +0000552 char *filename;
Guido van Rossum99bec951992-09-03 20:29:45 +0000553#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000554
Neal Norwitza81d2202002-07-14 00:27:26 +0000555/* Tuple access macros */
556
557#ifndef Py_DEBUG
558#define GETITEM(v, i) PyTuple_GET_ITEM((PyTupleObject *)(v), (i))
559#else
560#define GETITEM(v, i) PyTuple_GetItem((v), (i))
561#endif
562
Martin v. Löwisf30d60e2004-06-08 08:17:44 +0000563#ifdef WITH_TSC
564/* Use Pentium timestamp counter to mark certain events:
565 inst0 -- beginning of switch statement for opcode dispatch
566 inst1 -- end of switch statement (may be skipped)
567 loop0 -- the top of the mainloop
Thomas Wouters477c8d52006-05-27 19:21:47 +0000568 loop1 -- place where control returns again to top of mainloop
Martin v. Löwisf30d60e2004-06-08 08:17:44 +0000569 (may be skipped)
570 intr1 -- beginning of long interruption
571 intr2 -- end of long interruption
572
573 Many opcodes call out to helper C functions. In some cases, the
574 time in those functions should be counted towards the time for the
575 opcode, but not in all cases. For example, a CALL_FUNCTION opcode
576 calls another Python function; there's no point in charge all the
577 bytecode executed by the called function to the caller.
578
579 It's hard to make a useful judgement statically. In the presence
580 of operator overloading, it's impossible to tell if a call will
581 execute new Python code or not.
582
583 It's a case-by-case judgement. I'll use intr1 for the following
584 cases:
585
Martin v. Löwisf30d60e2004-06-08 08:17:44 +0000586 IMPORT_STAR
587 IMPORT_FROM
588 CALL_FUNCTION (and friends)
589
590 */
591 uint64 inst0, inst1, loop0, loop1, intr0 = 0, intr1 = 0;
592 int ticked = 0;
593
Michael W. Hudson75eabd22005-01-18 15:56:11 +0000594 READ_TIMESTAMP(inst0);
595 READ_TIMESTAMP(inst1);
596 READ_TIMESTAMP(loop0);
597 READ_TIMESTAMP(loop1);
Michael W. Hudson800ba232004-08-12 18:19:17 +0000598
599 /* shut up the compiler */
600 opcode = 0;
Martin v. Löwisf30d60e2004-06-08 08:17:44 +0000601#endif
602
Guido van Rossum374a9221991-04-04 10:40:29 +0000603/* Code access macros */
604
Martin v. Löwis18e16552006-02-15 17:27:45 +0000605#define INSTR_OFFSET() ((int)(next_instr - first_instr))
Guido van Rossum374a9221991-04-04 10:40:29 +0000606#define NEXTOP() (*next_instr++)
Raymond Hettinger5bed4562004-04-10 23:34:17 +0000607#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Raymond Hettinger52a21b82004-08-06 18:43:09 +0000608#define PEEKARG() ((next_instr[2]<<8) + next_instr[1])
Guido van Rossumd076c731998-10-07 19:42:25 +0000609#define JUMPTO(x) (next_instr = first_instr + (x))
Guido van Rossum374a9221991-04-04 10:40:29 +0000610#define JUMPBY(x) (next_instr += (x))
611
Raymond Hettingerf606f872003-03-16 03:11:04 +0000612/* OpCode prediction macros
613 Some opcodes tend to come in pairs thus making it possible to predict
614 the second code when the first is run. For example, COMPARE_OP is often
615 followed by JUMP_IF_FALSE or JUMP_IF_TRUE. And, those opcodes are often
616 followed by a POP_TOP.
617
618 Verifying the prediction costs a single high-speed test of register
Raymond Hettingerac2072922003-03-16 15:41:11 +0000619 variable against a constant. If the pairing was good, then the
Raymond Hettingerf606f872003-03-16 03:11:04 +0000620 processor has a high likelihood of making its own successful branch
621 prediction which results in a nearly zero overhead transition to the
622 next opcode.
623
624 A successful prediction saves a trip through the eval-loop including
625 its two unpredictable branches, the HASARG test and the switch-case.
Raymond Hettingera7216982004-02-08 19:59:27 +0000626
Tim Peters8a5c3c72004-04-05 19:36:21 +0000627 If collecting opcode statistics, turn off prediction so that
628 statistics are accurately maintained (the predictions bypass
Raymond Hettingera7216982004-02-08 19:59:27 +0000629 the opcode frequency counter updates).
Raymond Hettingerf606f872003-03-16 03:11:04 +0000630*/
631
Raymond Hettingera7216982004-02-08 19:59:27 +0000632#ifdef DYNAMIC_EXECUTION_PROFILE
633#define PREDICT(op) if (0) goto PRED_##op
634#else
Raymond Hettingerac2072922003-03-16 15:41:11 +0000635#define PREDICT(op) if (*next_instr == op) goto PRED_##op
Raymond Hettingera7216982004-02-08 19:59:27 +0000636#endif
637
Raymond Hettingerf606f872003-03-16 03:11:04 +0000638#define PREDICTED(op) PRED_##op: next_instr++
Raymond Hettinger52a21b82004-08-06 18:43:09 +0000639#define PREDICTED_WITH_ARG(op) PRED_##op: oparg = PEEKARG(); next_instr += 3
Raymond Hettingerf606f872003-03-16 03:11:04 +0000640
Guido van Rossum374a9221991-04-04 10:40:29 +0000641/* Stack manipulation macros */
642
Martin v. Löwis18e16552006-02-15 17:27:45 +0000643/* The stack can grow at most MAXINT deep, as co_nlocals and
644 co_stacksize are ints. */
645#define STACK_LEVEL() ((int)(stack_pointer - f->f_valuestack))
Guido van Rossum374a9221991-04-04 10:40:29 +0000646#define EMPTY() (STACK_LEVEL() == 0)
647#define TOP() (stack_pointer[-1])
Raymond Hettinger663004b2003-01-09 15:24:30 +0000648#define SECOND() (stack_pointer[-2])
649#define THIRD() (stack_pointer[-3])
650#define FOURTH() (stack_pointer[-4])
Raymond Hettinger663004b2003-01-09 15:24:30 +0000651#define SET_TOP(v) (stack_pointer[-1] = (v))
652#define SET_SECOND(v) (stack_pointer[-2] = (v))
653#define SET_THIRD(v) (stack_pointer[-3] = (v))
654#define SET_FOURTH(v) (stack_pointer[-4] = (v))
Raymond Hettinger663004b2003-01-09 15:24:30 +0000655#define BASIC_STACKADJ(n) (stack_pointer += n)
Guido van Rossum374a9221991-04-04 10:40:29 +0000656#define BASIC_PUSH(v) (*stack_pointer++ = (v))
657#define BASIC_POP() (*--stack_pointer)
658
Guido van Rossum96a42c81992-01-12 02:29:51 +0000659#ifdef LLTRACE
Jeremy Hylton14368152001-10-17 13:29:30 +0000660#define PUSH(v) { (void)(BASIC_PUSH(v), \
661 lltrace && prtrace(TOP(), "push")); \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000662 assert(STACK_LEVEL() <= co->co_stacksize); }
Fred Drakede26cfc2001-10-13 06:11:28 +0000663#define POP() ((void)(lltrace && prtrace(TOP(), "pop")), BASIC_POP())
Raymond Hettinger663004b2003-01-09 15:24:30 +0000664#define STACKADJ(n) { (void)(BASIC_STACKADJ(n), \
665 lltrace && prtrace(TOP(), "stackadj")); \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000666 assert(STACK_LEVEL() <= co->co_stacksize); }
Guido van Rossumd8faa362007-04-27 19:54:29 +0000667#define EXT_POP(STACK_POINTER) (lltrace && prtrace((STACK_POINTER)[-1], "ext_pop"), *--(STACK_POINTER))
Guido van Rossum374a9221991-04-04 10:40:29 +0000668#else
669#define PUSH(v) BASIC_PUSH(v)
670#define POP() BASIC_POP()
Raymond Hettinger663004b2003-01-09 15:24:30 +0000671#define STACKADJ(n) BASIC_STACKADJ(n)
Guido van Rossumc2e20742006-02-27 22:32:47 +0000672#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
Guido van Rossum374a9221991-04-04 10:40:29 +0000673#endif
674
Guido van Rossum681d79a1995-07-18 14:51:37 +0000675/* Local variable macros */
676
677#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumcfbf1a32002-03-28 20:17:52 +0000678
679/* The SETLOCAL() macro must not DECREF the local variable in-place and
680 then store the new value; it must copy the old value to a temporary
681 value, then store the new value, and then DECREF the temporary value.
682 This is because it is possible that during the DECREF the frame is
683 accessed by other code (e.g. a __del__ method or gc.collect()) and the
684 variable would be pointing to already-freed memory. */
685#define SETLOCAL(i, value) do { PyObject *tmp = GETLOCAL(i); \
686 GETLOCAL(i) = value; \
687 Py_XDECREF(tmp); } while (0)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000688
Guido van Rossuma027efa1997-05-05 20:56:21 +0000689/* Start of code */
690
Tim Peters5ca576e2001-06-18 22:08:13 +0000691 if (f == NULL)
692 return NULL;
693
Armin Rigo1d313ab2003-10-25 14:33:09 +0000694 /* push frame */
Armin Rigo2b3eb402003-10-28 12:05:48 +0000695 if (Py_EnterRecursiveCall(""))
Armin Rigo1d313ab2003-10-25 14:33:09 +0000696 return NULL;
Guido van Rossum8861b741996-07-30 16:49:37 +0000697
Tim Peters5ca576e2001-06-18 22:08:13 +0000698 tstate->frame = f;
Tim Peters5ca576e2001-06-18 22:08:13 +0000699
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000700 if (tstate->use_tracing) {
701 if (tstate->c_tracefunc != NULL) {
702 /* tstate->c_tracefunc, if defined, is a
703 function that will be called on *every* entry
704 to a code block. Its return value, if not
705 None, is a function that will be called at
706 the start of each executed line of code.
707 (Actually, the function must return itself
708 in order to continue tracing.) The trace
709 functions are called with three arguments:
710 a pointer to the current frame, a string
711 indicating why the function is called, and
712 an argument which depends on the situation.
713 The global trace function is also called
714 whenever an exception is detected. */
715 if (call_trace(tstate->c_tracefunc, tstate->c_traceobj,
716 f, PyTrace_CALL, Py_None)) {
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000717 /* Trace function raised an error */
Armin Rigo2b3eb402003-10-28 12:05:48 +0000718 goto exit_eval_frame;
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000719 }
720 }
721 if (tstate->c_profilefunc != NULL) {
722 /* Similar for c_profilefunc, except it needn't
723 return itself and isn't called for "line" events */
724 if (call_trace(tstate->c_profilefunc,
725 tstate->c_profileobj,
726 f, PyTrace_CALL, Py_None)) {
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000727 /* Profile function raised an error */
Armin Rigo2b3eb402003-10-28 12:05:48 +0000728 goto exit_eval_frame;
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000729 }
730 }
731 }
732
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000733 co = f->f_code;
734 names = co->co_names;
735 consts = co->co_consts;
736 fastlocals = f->f_localsplus;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000737 freevars = f->f_localsplus + co->co_nlocals;
Brett Cannonc9371d42005-06-25 08:23:41 +0000738 first_instr = (unsigned char*) PyString_AS_STRING(co->co_code);
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000739 /* An explanation is in order for the next line.
740
741 f->f_lasti now refers to the index of the last instruction
742 executed. You might think this was obvious from the name, but
743 this wasn't always true before 2.3! PyFrame_New now sets
744 f->f_lasti to -1 (i.e. the index *before* the first instruction)
745 and YIELD_VALUE doesn't fiddle with f_lasti any more. So this
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000746 does work. Promise.
747
748 When the PREDICT() macros are enabled, some opcode pairs follow in
749 direct succession without updating f->f_lasti. A successful
750 prediction effectively links the two codes together as if they
751 were a single new opcode; accordingly,f->f_lasti will point to
752 the first code in the pair (for instance, GET_ITER followed by
753 FOR_ITER is effectively a single opcode and f->f_lasti will point
754 at to the beginning of the combined pair.)
755 */
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000756 next_instr = first_instr + f->f_lasti + 1;
757 stack_pointer = f->f_stacktop;
758 assert(stack_pointer != NULL);
759 f->f_stacktop = NULL; /* remains NULL unless yield suspends frame */
760
Tim Peters5ca576e2001-06-18 22:08:13 +0000761#ifdef LLTRACE
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000762 lltrace = PyDict_GetItemString(f->f_globals, "__lltrace__") != NULL;
Tim Peters5ca576e2001-06-18 22:08:13 +0000763#endif
Neal Norwitz5f5153e2005-10-21 04:28:38 +0000764#if defined(Py_DEBUG) || defined(LLTRACE)
Tim Peters5ca576e2001-06-18 22:08:13 +0000765 filename = PyString_AsString(co->co_filename);
766#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000767
Guido van Rossum374a9221991-04-04 10:40:29 +0000768 why = WHY_NOT;
769 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000770 x = Py_None; /* Not a reference, just anything non-NULL */
Fred Drake48fba732000-10-11 13:54:07 +0000771 w = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +0000772
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000773 if (throwflag) { /* support for generator.throw() */
Phillip J. Eby0d6615f2005-08-02 00:46:46 +0000774 why = WHY_EXCEPTION;
775 goto on_error;
776 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000777
Guido van Rossum374a9221991-04-04 10:40:29 +0000778 for (;;) {
Martin v. Löwisf30d60e2004-06-08 08:17:44 +0000779#ifdef WITH_TSC
780 if (inst1 == 0) {
781 /* Almost surely, the opcode executed a break
782 or a continue, preventing inst1 from being set
783 on the way out of the loop.
784 */
Michael W. Hudson75eabd22005-01-18 15:56:11 +0000785 READ_TIMESTAMP(inst1);
Martin v. Löwisf30d60e2004-06-08 08:17:44 +0000786 loop1 = inst1;
787 }
788 dump_tsc(opcode, ticked, inst0, inst1, loop0, loop1,
789 intr0, intr1);
790 ticked = 0;
791 inst1 = 0;
792 intr0 = 0;
793 intr1 = 0;
Michael W. Hudson75eabd22005-01-18 15:56:11 +0000794 READ_TIMESTAMP(loop0);
Martin v. Löwisf30d60e2004-06-08 08:17:44 +0000795#endif
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000796 assert(stack_pointer >= f->f_valuestack); /* else underflow */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000797 assert(STACK_LEVEL() <= co->co_stacksize); /* else overflow */
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000798
Guido van Rossuma027efa1997-05-05 20:56:21 +0000799 /* Do periodic things. Doing this every time through
800 the loop would add too much overhead, so we do it
801 only every Nth instruction. We also do it if
802 ``things_to_do'' is set, i.e. when an asynchronous
803 event needs attention (e.g. a signal handler or
804 async I/O handler); see Py_AddPendingCall() and
805 Py_MakePendingCalls() above. */
Guido van Rossumac7be682001-01-17 15:42:30 +0000806
Skip Montanarod581d772002-09-03 20:10:45 +0000807 if (--_Py_Ticker < 0) {
Thomas Woutersce272b62007-09-19 21:19:28 +0000808 if (*next_instr == SETUP_FINALLY) {
809 /* Make the last opcode before
810 a try: finally: block uninterruptable. */
811 goto fast_next_opcode;
812 }
Skip Montanarod581d772002-09-03 20:10:45 +0000813 _Py_Ticker = _Py_CheckInterval;
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000814 tstate->tick_counter++;
Martin v. Löwisf30d60e2004-06-08 08:17:44 +0000815#ifdef WITH_TSC
816 ticked = 1;
817#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000818 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000819 if (Py_MakePendingCalls() < 0) {
820 why = WHY_EXCEPTION;
821 goto on_error;
822 }
Kurt B. Kaiser4c79a832004-11-23 18:06:08 +0000823 if (things_to_do)
824 /* MakePendingCalls() didn't succeed.
825 Force early re-execution of this
826 "periodic" code, possibly after
827 a thread switch */
828 _Py_Ticker = 0;
Guido van Rossum8861b741996-07-30 16:49:37 +0000829 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000830#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000831 if (interpreter_lock) {
832 /* Give another thread a chance */
833
Guido van Rossum25ce5661997-08-02 03:10:38 +0000834 if (PyThreadState_Swap(NULL) != tstate)
835 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000836 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000837
838 /* Other threads may run now */
839
Guido van Rossum65d5b571998-12-21 19:32:43 +0000840 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000841 if (PyThreadState_Swap(tstate) != NULL)
842 Py_FatalError("ceval: orphan tstate");
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000843
844 /* Check for thread interrupts */
845
846 if (tstate->async_exc != NULL) {
847 x = tstate->async_exc;
848 tstate->async_exc = NULL;
849 PyErr_SetNone(x);
850 Py_DECREF(x);
851 why = WHY_EXCEPTION;
852 goto on_error;
853 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000854 }
855#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000856 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000857
Neil Schemenauer63543862002-02-17 19:10:14 +0000858 fast_next_opcode:
Guido van Rossum99bec951992-09-03 20:29:45 +0000859 f->f_lasti = INSTR_OFFSET();
Guido van Rossumac7be682001-01-17 15:42:30 +0000860
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000861 /* line-by-line tracing support */
862
863 if (tstate->c_tracefunc != NULL && !tstate->tracing) {
864 /* see maybe_call_line_trace
865 for expository comments */
866 f->f_stacktop = stack_pointer;
Tim Peters8a5c3c72004-04-05 19:36:21 +0000867
Michael W. Hudson58ee2af2003-04-29 16:18:47 +0000868 err = maybe_call_line_trace(tstate->c_tracefunc,
869 tstate->c_traceobj,
Armin Rigobf57a142004-03-22 19:24:58 +0000870 f, &instr_lb, &instr_ub,
871 &instr_prev);
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000872 /* Reload possibly changed frame fields */
873 JUMPTO(f->f_lasti);
Michael W. Hudson58ee2af2003-04-29 16:18:47 +0000874 if (f->f_stacktop != NULL) {
875 stack_pointer = f->f_stacktop;
876 f->f_stacktop = NULL;
877 }
878 if (err) {
879 /* trace function raised an exception */
880 goto on_error;
881 }
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000882 }
883
884 /* Extract opcode and argument */
885
Guido van Rossum374a9221991-04-04 10:40:29 +0000886 opcode = NEXTOP();
Armin Rigo8817fcd2004-06-17 10:22:40 +0000887 oparg = 0; /* allows oparg to be stored in a register because
888 it doesn't have to be remembered across a full loop */
Raymond Hettinger5bed4562004-04-10 23:34:17 +0000889 if (HAS_ARG(opcode))
890 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +0000891 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +0000892#ifdef DYNAMIC_EXECUTION_PROFILE
893#ifdef DXPAIRS
894 dxpairs[lastopcode][opcode]++;
895 lastopcode = opcode;
896#endif
897 dxp[opcode]++;
898#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000899
Guido van Rossum96a42c81992-01-12 02:29:51 +0000900#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000901 /* Instruction tracing */
Guido van Rossumac7be682001-01-17 15:42:30 +0000902
Guido van Rossum96a42c81992-01-12 02:29:51 +0000903 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000904 if (HAS_ARG(opcode)) {
905 printf("%d: %d, %d\n",
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000906 f->f_lasti, opcode, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +0000907 }
908 else {
909 printf("%d: %d\n",
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000910 f->f_lasti, opcode);
Guido van Rossum374a9221991-04-04 10:40:29 +0000911 }
912 }
913#endif
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000914
Guido van Rossum374a9221991-04-04 10:40:29 +0000915 /* Main switch on opcode */
Michael W. Hudson75eabd22005-01-18 15:56:11 +0000916 READ_TIMESTAMP(inst0);
Jeremy Hylton52820442001-01-03 23:52:36 +0000917
Guido van Rossum374a9221991-04-04 10:40:29 +0000918 switch (opcode) {
Guido van Rossumac7be682001-01-17 15:42:30 +0000919
Guido van Rossum374a9221991-04-04 10:40:29 +0000920 /* BEWARE!
921 It is essential that any operation that fails sets either
922 x to NULL, err to nonzero, or why to anything but WHY_NOT,
923 and that no operation that succeeds does this! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000924
Guido van Rossum374a9221991-04-04 10:40:29 +0000925 /* case STOP_CODE: this is an error! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000926
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000927 case NOP:
928 goto fast_next_opcode;
929
Neil Schemenauer63543862002-02-17 19:10:14 +0000930 case LOAD_FAST:
931 x = GETLOCAL(oparg);
932 if (x != NULL) {
933 Py_INCREF(x);
934 PUSH(x);
935 goto fast_next_opcode;
936 }
937 format_exc_check_arg(PyExc_UnboundLocalError,
938 UNBOUNDLOCAL_ERROR_MSG,
939 PyTuple_GetItem(co->co_varnames, oparg));
940 break;
941
942 case LOAD_CONST:
Skip Montanaro04d80f82002-08-04 21:03:35 +0000943 x = GETITEM(consts, oparg);
Neil Schemenauer63543862002-02-17 19:10:14 +0000944 Py_INCREF(x);
945 PUSH(x);
946 goto fast_next_opcode;
947
Raymond Hettinger7dc52212003-03-16 20:14:44 +0000948 PREDICTED_WITH_ARG(STORE_FAST);
Neil Schemenauer63543862002-02-17 19:10:14 +0000949 case STORE_FAST:
950 v = POP();
951 SETLOCAL(oparg, v);
952 goto fast_next_opcode;
953
Raymond Hettingerf606f872003-03-16 03:11:04 +0000954 PREDICTED(POP_TOP);
Guido van Rossum374a9221991-04-04 10:40:29 +0000955 case POP_TOP:
956 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000957 Py_DECREF(v);
Neil Schemenauer63543862002-02-17 19:10:14 +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_TWO:
Raymond Hettinger663004b2003-01-09 15:24:30 +0000961 v = TOP();
962 w = SECOND();
963 SET_TOP(w);
964 SET_SECOND(v);
Raymond Hettinger080cb322003-03-14 01:37:42 +0000965 goto fast_next_opcode;
Guido van Rossumac7be682001-01-17 15:42:30 +0000966
Guido van Rossum374a9221991-04-04 10:40:29 +0000967 case ROT_THREE:
Raymond Hettinger663004b2003-01-09 15:24:30 +0000968 v = TOP();
969 w = SECOND();
970 x = THIRD();
971 SET_TOP(w);
972 SET_SECOND(x);
973 SET_THIRD(v);
Raymond Hettinger080cb322003-03-14 01:37:42 +0000974 goto fast_next_opcode;
Guido van Rossumac7be682001-01-17 15:42:30 +0000975
Thomas Wouters434d0822000-08-24 20:11:32 +0000976 case ROT_FOUR:
Raymond Hettinger663004b2003-01-09 15:24:30 +0000977 u = TOP();
978 v = SECOND();
979 w = THIRD();
980 x = FOURTH();
981 SET_TOP(v);
982 SET_SECOND(w);
983 SET_THIRD(x);
984 SET_FOURTH(u);
Raymond Hettinger080cb322003-03-14 01:37:42 +0000985 goto fast_next_opcode;
Guido van Rossumac7be682001-01-17 15:42:30 +0000986
Guido van Rossum374a9221991-04-04 10:40:29 +0000987 case DUP_TOP:
988 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000989 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000990 PUSH(v);
Raymond Hettinger080cb322003-03-14 01:37:42 +0000991 goto fast_next_opcode;
Guido van Rossumac7be682001-01-17 15:42:30 +0000992
Thomas Wouters434d0822000-08-24 20:11:32 +0000993 case DUP_TOPX:
Raymond Hettinger4bad9ba2003-01-19 05:08:13 +0000994 if (oparg == 2) {
Raymond Hettinger663004b2003-01-09 15:24:30 +0000995 x = TOP();
Tim Peters35ba6892000-10-11 07:04:49 +0000996 Py_INCREF(x);
Raymond Hettinger663004b2003-01-09 15:24:30 +0000997 w = SECOND();
Tim Peters35ba6892000-10-11 07:04:49 +0000998 Py_INCREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +0000999 STACKADJ(2);
1000 SET_TOP(x);
1001 SET_SECOND(w);
Raymond Hettingerf606f872003-03-16 03:11:04 +00001002 goto fast_next_opcode;
Raymond Hettinger4bad9ba2003-01-19 05:08:13 +00001003 } else if (oparg == 3) {
Raymond Hettinger663004b2003-01-09 15:24:30 +00001004 x = TOP();
Tim Peters35ba6892000-10-11 07:04:49 +00001005 Py_INCREF(x);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001006 w = SECOND();
Tim Peters35ba6892000-10-11 07:04:49 +00001007 Py_INCREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001008 v = THIRD();
Tim Peters35ba6892000-10-11 07:04:49 +00001009 Py_INCREF(v);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001010 STACKADJ(3);
1011 SET_TOP(x);
1012 SET_SECOND(w);
1013 SET_THIRD(v);
Raymond Hettingerf606f872003-03-16 03:11:04 +00001014 goto fast_next_opcode;
Thomas Wouters434d0822000-08-24 20:11:32 +00001015 }
Raymond Hettinger4bad9ba2003-01-19 05:08:13 +00001016 Py_FatalError("invalid argument to DUP_TOPX"
1017 " (bytecode corruption?)");
Tim Peters35ba6892000-10-11 07:04:49 +00001018 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00001019
Guido van Rossum374a9221991-04-04 10:40:29 +00001020 case UNARY_POSITIVE:
Raymond Hettinger663004b2003-01-09 15:24:30 +00001021 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001022 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001023 Py_DECREF(v);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001024 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001025 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001026 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001027
Guido van Rossum374a9221991-04-04 10:40:29 +00001028 case UNARY_NEGATIVE:
Raymond Hettinger663004b2003-01-09 15:24:30 +00001029 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001030 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001031 Py_DECREF(v);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001032 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001033 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001034 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001035
Guido van Rossum374a9221991-04-04 10:40:29 +00001036 case UNARY_NOT:
Raymond Hettinger663004b2003-01-09 15:24:30 +00001037 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001038 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001039 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +00001040 if (err == 0) {
1041 Py_INCREF(Py_True);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001042 SET_TOP(Py_True);
Guido van Rossumfc490731997-05-06 15:06:49 +00001043 continue;
1044 }
1045 else if (err > 0) {
1046 Py_INCREF(Py_False);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001047 SET_TOP(Py_False);
Guido van Rossumfc490731997-05-06 15:06:49 +00001048 err = 0;
1049 continue;
1050 }
Raymond Hettinger8bb90a52003-01-14 12:43:10 +00001051 STACKADJ(-1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001052 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001053
Guido van Rossum7928cd71991-10-24 14:59:31 +00001054 case UNARY_INVERT:
Raymond Hettinger663004b2003-01-09 15:24:30 +00001055 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001056 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001057 Py_DECREF(v);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001058 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001059 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001060 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001061
Guido van Rossum50564e81996-01-12 01:13:16 +00001062 case BINARY_POWER:
1063 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001064 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001065 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +00001066 Py_DECREF(v);
1067 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001068 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001069 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +00001070 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001071
Guido van Rossum374a9221991-04-04 10:40:29 +00001072 case BINARY_MULTIPLY:
1073 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001074 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001075 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001076 Py_DECREF(v);
1077 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001078 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001079 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001080 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001081
Tim Peters3caca232001-12-06 06:23:26 +00001082 case BINARY_TRUE_DIVIDE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001083 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001084 v = TOP();
Tim Peters3caca232001-12-06 06:23:26 +00001085 x = PyNumber_TrueDivide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001086 Py_DECREF(v);
1087 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001088 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001089 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001090 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001091
Guido van Rossum4668b002001-08-08 05:00:18 +00001092 case BINARY_FLOOR_DIVIDE:
1093 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001094 v = TOP();
Guido van Rossum4668b002001-08-08 05:00:18 +00001095 x = PyNumber_FloorDivide(v, w);
1096 Py_DECREF(v);
1097 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001098 SET_TOP(x);
Guido van Rossum4668b002001-08-08 05:00:18 +00001099 if (x != NULL) continue;
1100 break;
1101
Guido van Rossum374a9221991-04-04 10:40:29 +00001102 case BINARY_MODULO:
1103 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001104 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001105 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001106 Py_DECREF(v);
1107 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001108 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001109 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001110 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001111
Guido van Rossum374a9221991-04-04 10:40:29 +00001112 case BINARY_ADD:
1113 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001114 v = TOP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001115 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001116 /* INLINE: int + int */
1117 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001118 a = PyInt_AS_LONG(v);
1119 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001120 i = a + b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001121 if ((i^a) < 0 && (i^b) < 0)
1122 goto slow_add;
1123 x = PyInt_FromLong(i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001124 }
Raymond Hettinger52a21b82004-08-06 18:43:09 +00001125 else if (PyString_CheckExact(v) &&
1126 PyString_CheckExact(w)) {
1127 x = string_concatenate(v, w, f, next_instr);
1128 /* string_concatenate consumed the ref to v */
1129 goto skip_decref_vx;
1130 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001131 else {
1132 slow_add:
Guido van Rossumc12da691997-07-17 23:12:42 +00001133 x = PyNumber_Add(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001134 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001135 Py_DECREF(v);
Raymond Hettinger52a21b82004-08-06 18:43:09 +00001136 skip_decref_vx:
Guido van Rossumb209a111997-04-29 18:18:01 +00001137 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001138 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001139 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001140 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001141
Guido van Rossum374a9221991-04-04 10:40:29 +00001142 case BINARY_SUBTRACT:
1143 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001144 v = TOP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001145 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001146 /* INLINE: int - int */
1147 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001148 a = PyInt_AS_LONG(v);
1149 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001150 i = a - b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001151 if ((i^a) < 0 && (i^~b) < 0)
1152 goto slow_sub;
1153 x = PyInt_FromLong(i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001154 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001155 else {
1156 slow_sub:
Guido van Rossumc12da691997-07-17 23:12:42 +00001157 x = PyNumber_Subtract(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001158 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001159 Py_DECREF(v);
1160 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001161 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001162 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001163 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001164
Guido van Rossum374a9221991-04-04 10:40:29 +00001165 case BINARY_SUBSCR:
1166 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001167 v = TOP();
Tim Petersb1c46982001-10-05 20:41:38 +00001168 if (PyList_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001169 /* INLINE: list[int] */
Neal Norwitz814e9382006-03-02 07:54:28 +00001170 Py_ssize_t i = PyInt_AsSsize_t(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001171 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +00001172 i += PyList_GET_SIZE(v);
Raymond Hettinger467a6982004-04-07 11:39:21 +00001173 if (i >= 0 && i < PyList_GET_SIZE(v)) {
Guido van Rossumfa00e951998-07-08 15:02:37 +00001174 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001175 Py_INCREF(x);
1176 }
Raymond Hettinger467a6982004-04-07 11:39:21 +00001177 else
1178 goto slow_get;
Guido van Rossumc12da691997-07-17 23:12:42 +00001179 }
1180 else
Raymond Hettinger467a6982004-04-07 11:39:21 +00001181 slow_get:
Guido van Rossumc12da691997-07-17 23:12:42 +00001182 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001183 Py_DECREF(v);
1184 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001185 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001186 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001187 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001188
Guido van Rossum7928cd71991-10-24 14:59:31 +00001189 case BINARY_LSHIFT:
1190 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001191 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001192 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001193 Py_DECREF(v);
1194 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001195 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001196 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001197 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001198
Guido van Rossum7928cd71991-10-24 14:59:31 +00001199 case BINARY_RSHIFT:
1200 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001201 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001202 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001203 Py_DECREF(v);
1204 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001205 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001206 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001207 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001208
Guido van Rossum7928cd71991-10-24 14:59:31 +00001209 case BINARY_AND:
1210 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001211 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001212 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001213 Py_DECREF(v);
1214 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001215 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001216 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001217 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001218
Guido van Rossum7928cd71991-10-24 14:59:31 +00001219 case BINARY_XOR:
1220 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001221 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001222 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001223 Py_DECREF(v);
1224 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001225 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001226 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001227 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001228
Guido van Rossum7928cd71991-10-24 14:59:31 +00001229 case BINARY_OR:
1230 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001231 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001232 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001233 Py_DECREF(v);
1234 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001235 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001236 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001237 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00001238
Raymond Hettingerdd80f762004-03-07 07:31:06 +00001239 case LIST_APPEND:
1240 w = POP();
1241 v = POP();
1242 err = PyList_Append(v, w);
1243 Py_DECREF(v);
1244 Py_DECREF(w);
Raymond Hettingerfba1cfc2004-03-12 16:33:17 +00001245 if (err == 0) {
1246 PREDICT(JUMP_ABSOLUTE);
1247 continue;
1248 }
Raymond Hettingerdd80f762004-03-07 07:31:06 +00001249 break;
1250
Nick Coghlan650f0d02007-04-15 12:05:43 +00001251 case SET_ADD:
1252 w = POP();
1253 v = POP();
1254 err = PySet_Add(v, w);
1255 Py_DECREF(v);
1256 Py_DECREF(w);
1257 if (err == 0) {
1258 PREDICT(JUMP_ABSOLUTE);
1259 continue;
1260 }
1261 break;
1262
Thomas Wouters434d0822000-08-24 20:11:32 +00001263 case INPLACE_POWER:
1264 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001265 v = TOP();
Thomas Wouters434d0822000-08-24 20:11:32 +00001266 x = PyNumber_InPlacePower(v, w, Py_None);
1267 Py_DECREF(v);
1268 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001269 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001270 if (x != NULL) continue;
1271 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001272
Thomas Wouters434d0822000-08-24 20:11:32 +00001273 case INPLACE_MULTIPLY:
1274 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001275 v = TOP();
Thomas Wouters434d0822000-08-24 20:11:32 +00001276 x = PyNumber_InPlaceMultiply(v, w);
1277 Py_DECREF(v);
1278 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001279 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001280 if (x != NULL) continue;
1281 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001282
Tim Peters54b11912001-12-25 18:49:11 +00001283 case INPLACE_TRUE_DIVIDE:
Thomas Wouters434d0822000-08-24 20:11:32 +00001284 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001285 v = TOP();
Tim Peters54b11912001-12-25 18:49:11 +00001286 x = PyNumber_InPlaceTrueDivide(v, w);
Thomas Wouters434d0822000-08-24 20:11:32 +00001287 Py_DECREF(v);
1288 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001289 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001290 if (x != NULL) continue;
1291 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001292
Guido van Rossum4668b002001-08-08 05:00:18 +00001293 case INPLACE_FLOOR_DIVIDE:
1294 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001295 v = TOP();
Guido van Rossum4668b002001-08-08 05:00:18 +00001296 x = PyNumber_InPlaceFloorDivide(v, w);
1297 Py_DECREF(v);
1298 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001299 SET_TOP(x);
Guido van Rossum4668b002001-08-08 05:00:18 +00001300 if (x != NULL) continue;
1301 break;
1302
Thomas Wouters434d0822000-08-24 20:11:32 +00001303 case INPLACE_MODULO:
1304 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001305 v = TOP();
Thomas Wouters434d0822000-08-24 20:11:32 +00001306 x = PyNumber_InPlaceRemainder(v, w);
1307 Py_DECREF(v);
1308 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001309 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001310 if (x != NULL) continue;
1311 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001312
Thomas Wouters434d0822000-08-24 20:11:32 +00001313 case INPLACE_ADD:
1314 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001315 v = TOP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001316 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Thomas Wouters434d0822000-08-24 20:11:32 +00001317 /* INLINE: int + int */
1318 register long a, b, i;
1319 a = PyInt_AS_LONG(v);
1320 b = PyInt_AS_LONG(w);
1321 i = a + b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001322 if ((i^a) < 0 && (i^b) < 0)
1323 goto slow_iadd;
1324 x = PyInt_FromLong(i);
Thomas Wouters434d0822000-08-24 20:11:32 +00001325 }
Raymond Hettinger52a21b82004-08-06 18:43:09 +00001326 else if (PyString_CheckExact(v) &&
1327 PyString_CheckExact(w)) {
1328 x = string_concatenate(v, w, f, next_instr);
1329 /* string_concatenate consumed the ref to v */
1330 goto skip_decref_v;
1331 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001332 else {
1333 slow_iadd:
Thomas Wouters434d0822000-08-24 20:11:32 +00001334 x = PyNumber_InPlaceAdd(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001335 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001336 Py_DECREF(v);
Raymond Hettinger52a21b82004-08-06 18:43:09 +00001337 skip_decref_v:
Thomas Wouters434d0822000-08-24 20:11:32 +00001338 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001339 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001340 if (x != NULL) continue;
1341 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001342
Thomas Wouters434d0822000-08-24 20:11:32 +00001343 case INPLACE_SUBTRACT:
1344 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001345 v = TOP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001346 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Thomas Wouters434d0822000-08-24 20:11:32 +00001347 /* INLINE: int - int */
1348 register long a, b, i;
1349 a = PyInt_AS_LONG(v);
1350 b = PyInt_AS_LONG(w);
1351 i = a - b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001352 if ((i^a) < 0 && (i^~b) < 0)
1353 goto slow_isub;
1354 x = PyInt_FromLong(i);
Thomas Wouters434d0822000-08-24 20:11:32 +00001355 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001356 else {
1357 slow_isub:
Thomas Wouters434d0822000-08-24 20:11:32 +00001358 x = PyNumber_InPlaceSubtract(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001359 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001360 Py_DECREF(v);
1361 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001362 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001363 if (x != NULL) continue;
1364 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001365
Thomas Wouters434d0822000-08-24 20:11:32 +00001366 case INPLACE_LSHIFT:
1367 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001368 v = TOP();
Thomas Wouters434d0822000-08-24 20:11:32 +00001369 x = PyNumber_InPlaceLshift(v, w);
1370 Py_DECREF(v);
1371 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001372 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001373 if (x != NULL) continue;
1374 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001375
Thomas Wouters434d0822000-08-24 20:11:32 +00001376 case INPLACE_RSHIFT:
1377 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001378 v = TOP();
Thomas Wouters434d0822000-08-24 20:11:32 +00001379 x = PyNumber_InPlaceRshift(v, w);
1380 Py_DECREF(v);
1381 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001382 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001383 if (x != NULL) continue;
1384 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001385
Thomas Wouters434d0822000-08-24 20:11:32 +00001386 case INPLACE_AND:
1387 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001388 v = TOP();
Thomas Wouters434d0822000-08-24 20:11:32 +00001389 x = PyNumber_InPlaceAnd(v, w);
1390 Py_DECREF(v);
1391 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001392 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001393 if (x != NULL) continue;
1394 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001395
Thomas Wouters434d0822000-08-24 20:11:32 +00001396 case INPLACE_XOR:
1397 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001398 v = TOP();
Thomas Wouters434d0822000-08-24 20:11:32 +00001399 x = PyNumber_InPlaceXor(v, w);
1400 Py_DECREF(v);
1401 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001402 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001403 if (x != NULL) continue;
1404 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001405
Thomas Wouters434d0822000-08-24 20:11:32 +00001406 case INPLACE_OR:
1407 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001408 v = TOP();
Thomas Wouters434d0822000-08-24 20:11:32 +00001409 x = PyNumber_InPlaceOr(v, w);
1410 Py_DECREF(v);
1411 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001412 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001413 if (x != NULL) continue;
1414 break;
1415
Guido van Rossum374a9221991-04-04 10:40:29 +00001416 case STORE_SUBSCR:
Raymond Hettinger663004b2003-01-09 15:24:30 +00001417 w = TOP();
1418 v = SECOND();
1419 u = THIRD();
1420 STACKADJ(-3);
Guido van Rossum374a9221991-04-04 10:40:29 +00001421 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +00001422 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001423 Py_DECREF(u);
1424 Py_DECREF(v);
1425 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001426 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001427 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001428
Guido van Rossum374a9221991-04-04 10:40:29 +00001429 case DELETE_SUBSCR:
Raymond Hettinger663004b2003-01-09 15:24:30 +00001430 w = TOP();
1431 v = SECOND();
1432 STACKADJ(-2);
Guido van Rossum374a9221991-04-04 10:40:29 +00001433 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001434 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001435 Py_DECREF(v);
1436 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001437 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001438 break;
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001439
Guido van Rossum374a9221991-04-04 10:40:29 +00001440 case PRINT_EXPR:
1441 v = POP();
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001442 w = PySys_GetObject("displayhook");
1443 if (w == NULL) {
1444 PyErr_SetString(PyExc_RuntimeError,
1445 "lost sys.displayhook");
1446 err = -1;
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001447 x = NULL;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001448 }
1449 if (err == 0) {
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001450 x = PyTuple_Pack(1, v);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001451 if (x == NULL)
1452 err = -1;
1453 }
1454 if (err == 0) {
1455 w = PyEval_CallObject(w, x);
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001456 Py_XDECREF(w);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001457 if (w == NULL)
1458 err = -1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001459 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001460 Py_DECREF(v);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001461 Py_XDECREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001462 break;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001463
Thomas Wouters434d0822000-08-24 20:11:32 +00001464#ifdef CASE_TOO_BIG
1465 default: switch (opcode) {
1466#endif
Guido van Rossumf10570b1995-07-07 22:53:21 +00001467 case RAISE_VARARGS:
Collin Winter828f04a2007-08-31 00:04:24 +00001468 v = w = NULL;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001469 switch (oparg) {
Thomas Wouters7ce29ca2007-09-19 21:56:32 +00001470 case 2:
1471 v = POP(); /* cause */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001472 case 1:
1473 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001474 case 0: /* Fallthrough */
Collin Winter828f04a2007-08-31 00:04:24 +00001475 why = do_raise(w, v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001476 break;
1477 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001478 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001479 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001480 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001481 break;
1482 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001483 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001484
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001485 case STORE_LOCALS:
1486 x = POP();
1487 v = f->f_locals;
1488 Py_XDECREF(v);
1489 f->f_locals = x;
1490 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001491
Guido van Rossum374a9221991-04-04 10:40:29 +00001492 case RETURN_VALUE:
1493 retval = POP();
1494 why = WHY_RETURN;
Raymond Hettinger1dd83092004-02-06 18:32:33 +00001495 goto fast_block_end;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001496
Tim Peters5ca576e2001-06-18 22:08:13 +00001497 case YIELD_VALUE:
1498 retval = POP();
Tim Peters8c963692001-06-23 05:26:56 +00001499 f->f_stacktop = stack_pointer;
Tim Peters5ca576e2001-06-18 22:08:13 +00001500 why = WHY_YIELD;
Raymond Hettinger1dd83092004-02-06 18:32:33 +00001501 goto fast_yield;
Tim Peters5ca576e2001-06-18 22:08:13 +00001502
Guido van Rossum374a9221991-04-04 10:40:29 +00001503 case POP_BLOCK:
1504 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001505 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001506 while (STACK_LEVEL() > b->b_level) {
1507 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001508 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001509 }
1510 }
Raymond Hettinger7eddd782004-04-07 14:38:08 +00001511 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001512
Guido van Rossum374a9221991-04-04 10:40:29 +00001513 case END_FINALLY:
1514 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001515 if (PyInt_Check(v)) {
Raymond Hettinger7c958652004-04-06 10:11:10 +00001516 why = (enum why_code) PyInt_AS_LONG(v);
Tim Peters8a5c3c72004-04-05 19:36:21 +00001517 assert(why != WHY_YIELD);
Raymond Hettingerc8aa08b2004-04-11 14:59:33 +00001518 if (why == WHY_RETURN ||
1519 why == WHY_CONTINUE)
Guido van Rossum374a9221991-04-04 10:40:29 +00001520 retval = POP();
1521 }
Brett Cannonf74225d2007-02-26 21:10:16 +00001522 else if (PyExceptionClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001523 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001524 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001525 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001526 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001527 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001528 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001529 else if (v != Py_None) {
1530 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001531 "'finally' pops bad exception");
1532 why = WHY_EXCEPTION;
1533 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001534 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001535 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001536
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001537 case LOAD_BUILD_CLASS:
1538 x = PyDict_GetItemString(f->f_builtins,
1539 "__build_class__");
1540 if (x == NULL) {
1541 PyErr_SetString(PyExc_ImportError,
1542 "__build_class__ not found");
1543 break;
1544 }
1545 Py_INCREF(x);
1546 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001547 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001548
Guido van Rossum374a9221991-04-04 10:40:29 +00001549 case STORE_NAME:
Skip Montanaro496e6582002-08-06 17:47:40 +00001550 w = GETITEM(names, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001551 v = POP();
Raymond Hettinger467a6982004-04-07 11:39:21 +00001552 if ((x = f->f_locals) != NULL) {
Raymond Hettinger66bd2332004-08-02 08:30:07 +00001553 if (PyDict_CheckExact(x))
Raymond Hettinger214b1c32004-07-02 06:41:07 +00001554 err = PyDict_SetItem(x, w, v);
1555 else
1556 err = PyObject_SetItem(x, w, v);
Raymond Hettinger467a6982004-04-07 11:39:21 +00001557 Py_DECREF(v);
Raymond Hettinger7eddd782004-04-07 14:38:08 +00001558 if (err == 0) continue;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001559 break;
1560 }
Raymond Hettinger467a6982004-04-07 11:39:21 +00001561 PyErr_Format(PyExc_SystemError,
1562 "no locals found when storing %s",
1563 PyObject_REPR(w));
Guido van Rossum374a9221991-04-04 10:40:29 +00001564 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001565
Guido van Rossum374a9221991-04-04 10:40:29 +00001566 case DELETE_NAME:
Skip Montanaro496e6582002-08-06 17:47:40 +00001567 w = GETITEM(names, oparg);
Raymond Hettinger467a6982004-04-07 11:39:21 +00001568 if ((x = f->f_locals) != NULL) {
Raymond Hettinger214b1c32004-07-02 06:41:07 +00001569 if ((err = PyObject_DelItem(x, w)) != 0)
Raymond Hettinger467a6982004-04-07 11:39:21 +00001570 format_exc_check_arg(PyExc_NameError,
1571 NAME_ERROR_MSG ,w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001572 break;
1573 }
Raymond Hettinger467a6982004-04-07 11:39:21 +00001574 PyErr_Format(PyExc_SystemError,
1575 "no locals when deleting %s",
1576 PyObject_REPR(w));
Guido van Rossum374a9221991-04-04 10:40:29 +00001577 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001578
Raymond Hettinger7dc52212003-03-16 20:14:44 +00001579 PREDICTED_WITH_ARG(UNPACK_SEQUENCE);
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001580 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001581 v = POP();
Raymond Hettingerf114a3a2004-03-08 23:25:30 +00001582 if (PyTuple_CheckExact(v) && PyTuple_GET_SIZE(v) == oparg) {
1583 PyObject **items = ((PyTupleObject *)v)->ob_item;
1584 while (oparg--) {
1585 w = items[oparg];
1586 Py_INCREF(w);
1587 PUSH(w);
Barry Warsawe42b18f1997-08-25 22:13:04 +00001588 }
Raymond Hettinger7eddd782004-04-07 14:38:08 +00001589 Py_DECREF(v);
1590 continue;
Raymond Hettingerf114a3a2004-03-08 23:25:30 +00001591 } else if (PyList_CheckExact(v) && PyList_GET_SIZE(v) == oparg) {
1592 PyObject **items = ((PyListObject *)v)->ob_item;
1593 while (oparg--) {
1594 w = items[oparg];
1595 Py_INCREF(w);
1596 PUSH(w);
Barry Warsawe42b18f1997-08-25 22:13:04 +00001597 }
Guido van Rossum0368b722007-05-11 16:50:42 +00001598 } else if (unpack_iterable(v, oparg, -1,
Guido van Rossumd8faa362007-04-27 19:54:29 +00001599 stack_pointer + oparg)) {
Tim Petersd6d010b2001-06-21 02:49:55 +00001600 stack_pointer += oparg;
Guido van Rossumd8faa362007-04-27 19:54:29 +00001601 } else {
1602 /* unpack_iterable() raised an exception */
Barry Warsawe42b18f1997-08-25 22:13:04 +00001603 why = WHY_EXCEPTION;
Tim Peters8b13b3e2001-09-30 05:58:42 +00001604 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001605 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001606 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001607
Guido van Rossum0368b722007-05-11 16:50:42 +00001608 case UNPACK_EX:
1609 {
1610 int totalargs = 1 + (oparg & 0xFF) + (oparg >> 8);
1611 v = POP();
1612
1613 if (unpack_iterable(v, oparg & 0xFF, oparg >> 8,
1614 stack_pointer + totalargs)) {
1615 stack_pointer += totalargs;
1616 } else {
1617 why = WHY_EXCEPTION;
1618 }
1619 Py_DECREF(v);
1620 break;
1621 }
1622
Guido van Rossum374a9221991-04-04 10:40:29 +00001623 case STORE_ATTR:
Skip Montanaro496e6582002-08-06 17:47:40 +00001624 w = GETITEM(names, oparg);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001625 v = TOP();
1626 u = SECOND();
1627 STACKADJ(-2);
Guido van Rossumb209a111997-04-29 18:18:01 +00001628 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1629 Py_DECREF(v);
1630 Py_DECREF(u);
Raymond Hettinger7eddd782004-04-07 14:38:08 +00001631 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001632 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001633
Guido van Rossum374a9221991-04-04 10:40:29 +00001634 case DELETE_ATTR:
Skip Montanaro496e6582002-08-06 17:47:40 +00001635 w = GETITEM(names, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001636 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001637 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1638 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001639 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001640 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001641
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001642 case STORE_GLOBAL:
Skip Montanaro496e6582002-08-06 17:47:40 +00001643 w = GETITEM(names, oparg);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001644 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001645 err = PyDict_SetItem(f->f_globals, w, v);
1646 Py_DECREF(v);
Raymond Hettinger7eddd782004-04-07 14:38:08 +00001647 if (err == 0) continue;
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001648 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001649
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001650 case DELETE_GLOBAL:
Skip Montanaro496e6582002-08-06 17:47:40 +00001651 w = GETITEM(names, oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001652 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001653 format_exc_check_arg(
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001654 PyExc_NameError, GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001655 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001656
Guido van Rossum374a9221991-04-04 10:40:29 +00001657 case LOAD_NAME:
Skip Montanaro496e6582002-08-06 17:47:40 +00001658 w = GETITEM(names, oparg);
Raymond Hettinger214b1c32004-07-02 06:41:07 +00001659 if ((v = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001660 PyErr_Format(PyExc_SystemError,
1661 "no locals when loading %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001662 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001663 break;
1664 }
Michael W. Hudsona3711f72004-08-02 14:50:43 +00001665 if (PyDict_CheckExact(v)) {
Raymond Hettinger214b1c32004-07-02 06:41:07 +00001666 x = PyDict_GetItem(v, w);
Michael W. Hudsona3711f72004-08-02 14:50:43 +00001667 Py_XINCREF(x);
1668 }
Raymond Hettinger214b1c32004-07-02 06:41:07 +00001669 else {
1670 x = PyObject_GetItem(v, w);
1671 if (x == NULL && PyErr_Occurred()) {
1672 if (!PyErr_ExceptionMatches(PyExc_KeyError))
1673 break;
1674 PyErr_Clear();
1675 }
1676 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001677 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001678 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001679 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001680 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001681 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001682 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001683 PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001684 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001685 break;
1686 }
1687 }
Michael W. Hudsona3711f72004-08-02 14:50:43 +00001688 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001689 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001690 PUSH(x);
Raymond Hettinger467a6982004-04-07 11:39:21 +00001691 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001692
Guido van Rossum374a9221991-04-04 10:40:29 +00001693 case LOAD_GLOBAL:
Skip Montanaro496e6582002-08-06 17:47:40 +00001694 w = GETITEM(names, oparg);
Neal Norwitzda059e32007-08-26 05:33:45 +00001695 if (PyUnicode_CheckExact(w)) {
Guido van Rossumd8dbf842002-08-19 21:17:53 +00001696 /* Inline the PyDict_GetItem() calls.
1697 WARNING: this is an extreme speed hack.
1698 Do not try this at home. */
Neal Norwitzda059e32007-08-26 05:33:45 +00001699 long hash = ((PyUnicodeObject *)w)->hash;
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001700 if (hash != -1) {
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001701 PyDictObject *d;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001702 PyDictEntry *e;
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001703 d = (PyDictObject *)(f->f_globals);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001704 e = d->ma_lookup(d, w, hash);
1705 if (e == NULL) {
1706 x = NULL;
1707 break;
1708 }
1709 x = e->me_value;
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001710 if (x != NULL) {
1711 Py_INCREF(x);
1712 PUSH(x);
1713 continue;
1714 }
1715 d = (PyDictObject *)(f->f_builtins);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001716 e = d->ma_lookup(d, w, hash);
1717 if (e == NULL) {
1718 x = NULL;
1719 break;
1720 }
1721 x = e->me_value;
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001722 if (x != NULL) {
1723 Py_INCREF(x);
1724 PUSH(x);
1725 continue;
1726 }
1727 goto load_global_error;
1728 }
1729 }
1730 /* This is the un-inlined version of the code above */
Guido van Rossumb209a111997-04-29 18:18:01 +00001731 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001732 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001733 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001734 if (x == NULL) {
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001735 load_global_error:
Paul Prescode68140d2000-08-30 20:25:01 +00001736 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001737 PyExc_NameError,
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001738 GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001739 break;
1740 }
1741 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001742 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001743 PUSH(x);
Raymond Hettinger7eddd782004-04-07 14:38:08 +00001744 continue;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001745
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001746 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001747 x = GETLOCAL(oparg);
Raymond Hettinger467a6982004-04-07 11:39:21 +00001748 if (x != NULL) {
1749 SETLOCAL(oparg, NULL);
1750 continue;
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001751 }
Raymond Hettinger467a6982004-04-07 11:39:21 +00001752 format_exc_check_arg(
1753 PyExc_UnboundLocalError,
1754 UNBOUNDLOCAL_ERROR_MSG,
1755 PyTuple_GetItem(co->co_varnames, oparg)
1756 );
1757 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001758
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001759 case LOAD_CLOSURE:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001760 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001761 Py_INCREF(x);
1762 PUSH(x);
Raymond Hettinger7eddd782004-04-07 14:38:08 +00001763 if (x != NULL) continue;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001764 break;
1765
1766 case LOAD_DEREF:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001767 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001768 w = PyCell_Get(x);
Raymond Hettinger467a6982004-04-07 11:39:21 +00001769 if (w != NULL) {
1770 PUSH(w);
1771 continue;
Jeremy Hylton2524d692001-02-05 17:23:16 +00001772 }
Raymond Hettinger467a6982004-04-07 11:39:21 +00001773 err = -1;
1774 /* Don't stomp existing exception */
1775 if (PyErr_Occurred())
1776 break;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001777 if (oparg < PyTuple_GET_SIZE(co->co_cellvars)) {
1778 v = PyTuple_GET_ITEM(co->co_cellvars,
Raymond Hettinger467a6982004-04-07 11:39:21 +00001779 oparg);
1780 format_exc_check_arg(
1781 PyExc_UnboundLocalError,
1782 UNBOUNDLOCAL_ERROR_MSG,
1783 v);
1784 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00001785 v = PyTuple_GET_ITEM(
Raymond Hettinger467a6982004-04-07 11:39:21 +00001786 co->co_freevars,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001787 oparg - PyTuple_GET_SIZE(co->co_cellvars));
Raymond Hettinger467a6982004-04-07 11:39:21 +00001788 format_exc_check_arg(
1789 PyExc_NameError,
1790 UNBOUNDFREE_ERROR_MSG,
1791 v);
1792 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001793 break;
1794
1795 case STORE_DEREF:
1796 w = POP();
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001797 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001798 PyCell_Set(x, w);
Jeremy Hylton30c9f392001-03-13 01:58:22 +00001799 Py_DECREF(w);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001800 continue;
1801
Guido van Rossum374a9221991-04-04 10:40:29 +00001802 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001803 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001804 if (x != NULL) {
Raymond Hettinger5bed4562004-04-10 23:34:17 +00001805 for (; --oparg >= 0;) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001806 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001807 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001808 }
1809 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001810 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001811 }
1812 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001813
Guido van Rossum374a9221991-04-04 10:40:29 +00001814 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001815 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001816 if (x != NULL) {
Raymond Hettinger5bed4562004-04-10 23:34:17 +00001817 for (; --oparg >= 0;) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001818 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001819 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001820 }
1821 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001822 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001823 }
1824 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001825
Guido van Rossum86e58e22006-08-28 15:27:34 +00001826 case BUILD_SET:
1827 x = PySet_New(NULL);
1828 if (x != NULL) {
1829 for (; --oparg >= 0;) {
1830 w = POP();
1831 if (err == 0)
1832 err = PySet_Add(x, w);
1833 Py_DECREF(w);
1834 }
1835 if (err != 0) {
1836 Py_DECREF(x);
1837 break;
1838 }
1839 PUSH(x);
1840 continue;
1841 }
1842 break;
1843
Guido van Rossum374a9221991-04-04 10:40:29 +00001844 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001845 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001846 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001847 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001848 break;
Thomas Wouters00e41de2007-02-23 19:56:57 +00001849
1850 case MAKE_BYTES:
1851 w = POP();
1852 if (PyString_Check(w))
1853 x = PyBytes_FromStringAndSize(
1854 PyString_AS_STRING(w),
1855 PyString_GET_SIZE(w));
1856 else
1857 x = NULL;
1858 Py_DECREF(w);
1859 PUSH(x);
1860 if (x != NULL) continue;
1861 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001862
Guido van Rossum374a9221991-04-04 10:40:29 +00001863 case LOAD_ATTR:
Skip Montanaro496e6582002-08-06 17:47:40 +00001864 w = GETITEM(names, oparg);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001865 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001866 x = PyObject_GetAttr(v, w);
1867 Py_DECREF(v);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001868 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001869 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001870 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001871
Guido van Rossum374a9221991-04-04 10:40:29 +00001872 case COMPARE_OP:
1873 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001874 v = TOP();
Raymond Hettinger4bad9ba2003-01-19 05:08:13 +00001875 if (PyInt_CheckExact(w) && PyInt_CheckExact(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001876 /* INLINE: cmp(int, int) */
1877 register long a, b;
1878 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001879 a = PyInt_AS_LONG(v);
1880 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001881 switch (oparg) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00001882 case PyCmp_LT: res = a < b; break;
1883 case PyCmp_LE: res = a <= b; break;
1884 case PyCmp_EQ: res = a == b; break;
1885 case PyCmp_NE: res = a != b; break;
1886 case PyCmp_GT: res = a > b; break;
1887 case PyCmp_GE: res = a >= b; break;
1888 case PyCmp_IS: res = v == w; break;
1889 case PyCmp_IS_NOT: res = v != w; break;
Guido van Rossumc12da691997-07-17 23:12:42 +00001890 default: goto slow_compare;
1891 }
1892 x = res ? Py_True : Py_False;
1893 Py_INCREF(x);
1894 }
1895 else {
1896 slow_compare:
1897 x = cmp_outcome(oparg, v, w);
1898 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001899 Py_DECREF(v);
1900 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001901 SET_TOP(x);
Raymond Hettingerf606f872003-03-16 03:11:04 +00001902 if (x == NULL) break;
1903 PREDICT(JUMP_IF_FALSE);
1904 PREDICT(JUMP_IF_TRUE);
1905 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001906
Guido van Rossum374a9221991-04-04 10:40:29 +00001907 case IMPORT_NAME:
Skip Montanaro496e6582002-08-06 17:47:40 +00001908 w = GETITEM(names, oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001909 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001910 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001911 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001912 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001913 break;
1914 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00001915 v = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001916 u = TOP();
Thomas Woutersf7f438b2006-02-28 16:09:29 +00001917 if (PyInt_AsLong(u) != -1 || PyErr_Occurred())
1918 w = PyTuple_Pack(5,
1919 w,
1920 f->f_globals,
1921 f->f_locals == NULL ?
1922 Py_None : f->f_locals,
1923 v,
1924 u);
1925 else
1926 w = PyTuple_Pack(4,
1927 w,
1928 f->f_globals,
1929 f->f_locals == NULL ?
1930 Py_None : f->f_locals,
1931 v);
1932 Py_DECREF(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001933 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001934 if (w == NULL) {
Raymond Hettinger663004b2003-01-09 15:24:30 +00001935 u = POP();
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001936 x = NULL;
1937 break;
1938 }
Michael W. Hudson75eabd22005-01-18 15:56:11 +00001939 READ_TIMESTAMP(intr0);
Guido van Rossumb209a111997-04-29 18:18:01 +00001940 x = PyEval_CallObject(x, w);
Michael W. Hudson75eabd22005-01-18 15:56:11 +00001941 READ_TIMESTAMP(intr1);
Guido van Rossumb209a111997-04-29 18:18:01 +00001942 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001943 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001944 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001945 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001946
Thomas Wouters52152252000-08-17 22:55:00 +00001947 case IMPORT_STAR:
1948 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001949 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001950 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001951 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001952 "no locals found during 'import *'");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001953 break;
1954 }
Michael W. Hudson75eabd22005-01-18 15:56:11 +00001955 READ_TIMESTAMP(intr0);
Thomas Wouters52152252000-08-17 22:55:00 +00001956 err = import_all_from(x, v);
Michael W. Hudson75eabd22005-01-18 15:56:11 +00001957 READ_TIMESTAMP(intr1);
Guido van Rossumb209a111997-04-29 18:18:01 +00001958 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00001959 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001960 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001961 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001962
Thomas Wouters52152252000-08-17 22:55:00 +00001963 case IMPORT_FROM:
Skip Montanaro496e6582002-08-06 17:47:40 +00001964 w = GETITEM(names, oparg);
Thomas Wouters52152252000-08-17 22:55:00 +00001965 v = TOP();
Michael W. Hudson75eabd22005-01-18 15:56:11 +00001966 READ_TIMESTAMP(intr0);
Thomas Wouters52152252000-08-17 22:55:00 +00001967 x = import_from(v, w);
Michael W. Hudson75eabd22005-01-18 15:56:11 +00001968 READ_TIMESTAMP(intr1);
Thomas Wouters52152252000-08-17 22:55:00 +00001969 PUSH(x);
1970 if (x != NULL) continue;
1971 break;
1972
Guido van Rossum374a9221991-04-04 10:40:29 +00001973 case JUMP_FORWARD:
1974 JUMPBY(oparg);
Neil Schemenauerc4b570f2003-06-01 19:21:12 +00001975 goto fast_next_opcode;
Guido van Rossumac7be682001-01-17 15:42:30 +00001976
Raymond Hettingerf606f872003-03-16 03:11:04 +00001977 PREDICTED_WITH_ARG(JUMP_IF_FALSE);
Guido van Rossum374a9221991-04-04 10:40:29 +00001978 case JUMP_IF_FALSE:
Raymond Hettinger21012b82003-02-26 18:11:50 +00001979 w = TOP();
Raymond Hettingerf606f872003-03-16 03:11:04 +00001980 if (w == Py_True) {
1981 PREDICT(POP_TOP);
Neil Schemenauerc4b570f2003-06-01 19:21:12 +00001982 goto fast_next_opcode;
Raymond Hettingerf606f872003-03-16 03:11:04 +00001983 }
Raymond Hettinger21012b82003-02-26 18:11:50 +00001984 if (w == Py_False) {
1985 JUMPBY(oparg);
Neil Schemenauerc4b570f2003-06-01 19:21:12 +00001986 goto fast_next_opcode;
Raymond Hettinger21012b82003-02-26 18:11:50 +00001987 }
1988 err = PyObject_IsTrue(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001989 if (err > 0)
1990 err = 0;
1991 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001992 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001993 else
1994 break;
1995 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001996
Raymond Hettingerf606f872003-03-16 03:11:04 +00001997 PREDICTED_WITH_ARG(JUMP_IF_TRUE);
Guido van Rossum374a9221991-04-04 10:40:29 +00001998 case JUMP_IF_TRUE:
Raymond Hettinger21012b82003-02-26 18:11:50 +00001999 w = TOP();
Raymond Hettingerf606f872003-03-16 03:11:04 +00002000 if (w == Py_False) {
2001 PREDICT(POP_TOP);
Neil Schemenauerc4b570f2003-06-01 19:21:12 +00002002 goto fast_next_opcode;
Raymond Hettingerf606f872003-03-16 03:11:04 +00002003 }
Raymond Hettinger21012b82003-02-26 18:11:50 +00002004 if (w == Py_True) {
2005 JUMPBY(oparg);
Neil Schemenauerc4b570f2003-06-01 19:21:12 +00002006 goto fast_next_opcode;
Raymond Hettinger21012b82003-02-26 18:11:50 +00002007 }
2008 err = PyObject_IsTrue(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002009 if (err > 0) {
2010 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00002011 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002012 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002013 else if (err == 0)
2014 ;
2015 else
2016 break;
2017 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00002018
Raymond Hettingerfba1cfc2004-03-12 16:33:17 +00002019 PREDICTED_WITH_ARG(JUMP_ABSOLUTE);
Guido van Rossum374a9221991-04-04 10:40:29 +00002020 case JUMP_ABSOLUTE:
2021 JUMPTO(oparg);
Neil Schemenauerca2a2f12003-05-30 23:59:44 +00002022 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00002023
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002024 case GET_ITER:
2025 /* before: [obj]; after [getiter(obj)] */
Raymond Hettinger663004b2003-01-09 15:24:30 +00002026 v = TOP();
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002027 x = PyObject_GetIter(v);
2028 Py_DECREF(v);
2029 if (x != NULL) {
Raymond Hettinger663004b2003-01-09 15:24:30 +00002030 SET_TOP(x);
Raymond Hettinger7dc52212003-03-16 20:14:44 +00002031 PREDICT(FOR_ITER);
Guido van Rossum213c7a62001-04-23 14:08:49 +00002032 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002033 }
Raymond Hettinger8bb90a52003-01-14 12:43:10 +00002034 STACKADJ(-1);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002035 break;
2036
Raymond Hettinger7dc52212003-03-16 20:14:44 +00002037 PREDICTED_WITH_ARG(FOR_ITER);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002038 case FOR_ITER:
2039 /* before: [iter]; after: [iter, iter()] *or* [] */
2040 v = TOP();
Raymond Hettingerdb0de9e2004-03-12 08:41:36 +00002041 x = (*v->ob_type->tp_iternext)(v);
Guido van Rossum213c7a62001-04-23 14:08:49 +00002042 if (x != NULL) {
2043 PUSH(x);
Raymond Hettinger7dc52212003-03-16 20:14:44 +00002044 PREDICT(STORE_FAST);
2045 PREDICT(UNPACK_SEQUENCE);
Guido van Rossum213c7a62001-04-23 14:08:49 +00002046 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002047 }
Raymond Hettingerdb0de9e2004-03-12 08:41:36 +00002048 if (PyErr_Occurred()) {
2049 if (!PyErr_ExceptionMatches(PyExc_StopIteration))
2050 break;
2051 PyErr_Clear();
Guido van Rossum213c7a62001-04-23 14:08:49 +00002052 }
Raymond Hettingerdb0de9e2004-03-12 08:41:36 +00002053 /* iterator ended normally */
2054 x = v = POP();
2055 Py_DECREF(v);
2056 JUMPBY(oparg);
2057 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002058
Raymond Hettinger2d783e92004-03-12 09:12:22 +00002059 case BREAK_LOOP:
2060 why = WHY_BREAK;
2061 goto fast_block_end;
2062
2063 case CONTINUE_LOOP:
2064 retval = PyInt_FromLong(oparg);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002065 if (!retval) {
2066 x = NULL;
2067 break;
2068 }
Raymond Hettinger2d783e92004-03-12 09:12:22 +00002069 why = WHY_CONTINUE;
2070 goto fast_block_end;
2071
Guido van Rossum374a9221991-04-04 10:40:29 +00002072 case SETUP_LOOP:
2073 case SETUP_EXCEPT:
2074 case SETUP_FINALLY:
Thomas Wouters9fe394c2007-02-05 01:24:16 +00002075 /* NOTE: If you add any new block-setup opcodes that are
2076 not try/except/finally handlers, you may need to
2077 update the PyGen_NeedsFinalizing() function. */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002078
Guido van Rossumb209a111997-04-29 18:18:01 +00002079 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002080 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002081 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00002082
Guido van Rossumc2e20742006-02-27 22:32:47 +00002083 case WITH_CLEANUP:
2084 {
2085 /* TOP is the context.__exit__ bound method.
2086 Below that are 1-3 values indicating how/why
2087 we entered the finally clause:
2088 - SECOND = None
Guido van Rossumf6694362006-03-10 02:28:35 +00002089 - (SECOND, THIRD) = (WHY_{RETURN,CONTINUE}), retval
Guido van Rossumc2e20742006-02-27 22:32:47 +00002090 - SECOND = WHY_*; no retval below it
2091 - (SECOND, THIRD, FOURTH) = exc_info()
2092 In the last case, we must call
2093 TOP(SECOND, THIRD, FOURTH)
2094 otherwise we must call
2095 TOP(None, None, None)
Guido van Rossum1a5e21e2006-02-28 21:57:43 +00002096
2097 In addition, if the stack represents an exception,
Guido van Rossumf6694362006-03-10 02:28:35 +00002098 *and* the function call returns a 'true' value, we
2099 "zap" this information, to prevent END_FINALLY from
2100 re-raising the exception. (But non-local gotos
2101 should still be resumed.)
Guido van Rossumc2e20742006-02-27 22:32:47 +00002102 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002103
Guido van Rossumc2e20742006-02-27 22:32:47 +00002104 x = TOP();
2105 u = SECOND();
2106 if (PyInt_Check(u) || u == Py_None) {
2107 u = v = w = Py_None;
2108 }
2109 else {
2110 v = THIRD();
2111 w = FOURTH();
2112 }
Guido van Rossumf6694362006-03-10 02:28:35 +00002113 /* XXX Not the fastest way to call it... */
2114 x = PyObject_CallFunctionObjArgs(x, u, v, w, NULL);
2115 if (x == NULL)
2116 break; /* Go to error exit */
2117 if (u != Py_None && PyObject_IsTrue(x)) {
2118 /* There was an exception and a true return */
2119 Py_DECREF(x);
2120 x = TOP(); /* Again */
2121 STACKADJ(-3);
2122 Py_INCREF(Py_None);
2123 SET_TOP(Py_None);
2124 Py_DECREF(x);
2125 Py_DECREF(u);
2126 Py_DECREF(v);
2127 Py_DECREF(w);
2128 } else {
2129 /* Let END_FINALLY do its thing */
2130 Py_DECREF(x);
2131 x = POP();
2132 Py_DECREF(x);
2133 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00002134 break;
2135 }
2136
Guido van Rossumf10570b1995-07-07 22:53:21 +00002137 case CALL_FUNCTION:
Armin Rigo8817fcd2004-06-17 10:22:40 +00002138 {
2139 PyObject **sp;
Jeremy Hylton985eba52003-02-05 23:13:00 +00002140 PCALL(PCALL_ALL);
Armin Rigo8817fcd2004-06-17 10:22:40 +00002141 sp = stack_pointer;
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00002142#ifdef WITH_TSC
Armin Rigo8817fcd2004-06-17 10:22:40 +00002143 x = call_function(&sp, oparg, &intr0, &intr1);
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00002144#else
Armin Rigo8817fcd2004-06-17 10:22:40 +00002145 x = call_function(&sp, oparg);
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00002146#endif
Armin Rigo8817fcd2004-06-17 10:22:40 +00002147 stack_pointer = sp;
Jeremy Hyltone8c04322002-08-16 17:47:26 +00002148 PUSH(x);
2149 if (x != NULL)
2150 continue;
2151 break;
Armin Rigo8817fcd2004-06-17 10:22:40 +00002152 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002153
Jeremy Hylton76901512000-03-28 23:49:17 +00002154 case CALL_FUNCTION_VAR:
2155 case CALL_FUNCTION_KW:
2156 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00002157 {
Jeremy Hylton76901512000-03-28 23:49:17 +00002158 int na = oparg & 0xff;
2159 int nk = (oparg>>8) & 0xff;
2160 int flags = (opcode - CALL_FUNCTION) & 3;
Jeremy Hylton52820442001-01-03 23:52:36 +00002161 int n = na + 2 * nk;
Armin Rigo8817fcd2004-06-17 10:22:40 +00002162 PyObject **pfunc, *func, **sp;
Jeremy Hylton985eba52003-02-05 23:13:00 +00002163 PCALL(PCALL_ALL);
Jeremy Hylton52820442001-01-03 23:52:36 +00002164 if (flags & CALL_FLAG_VAR)
2165 n++;
2166 if (flags & CALL_FLAG_KW)
2167 n++;
2168 pfunc = stack_pointer - n - 1;
2169 func = *pfunc;
Jeremy Hylton52820442001-01-03 23:52:36 +00002170
Guido van Rossumac7be682001-01-17 15:42:30 +00002171 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00002172 && PyMethod_GET_SELF(func) != NULL) {
2173 PyObject *self = PyMethod_GET_SELF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002174 Py_INCREF(self);
Jeremy Hylton52820442001-01-03 23:52:36 +00002175 func = PyMethod_GET_FUNCTION(func);
2176 Py_INCREF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002177 Py_DECREF(*pfunc);
2178 *pfunc = self;
2179 na++;
2180 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00002181 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00002182 Py_INCREF(func);
Armin Rigo8817fcd2004-06-17 10:22:40 +00002183 sp = stack_pointer;
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002184 READ_TIMESTAMP(intr0);
Armin Rigo8817fcd2004-06-17 10:22:40 +00002185 x = ext_do_call(func, &sp, flags, na, nk);
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002186 READ_TIMESTAMP(intr1);
Armin Rigo8817fcd2004-06-17 10:22:40 +00002187 stack_pointer = sp;
Jeremy Hylton76901512000-03-28 23:49:17 +00002188 Py_DECREF(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00002189
Jeremy Hylton76901512000-03-28 23:49:17 +00002190 while (stack_pointer > pfunc) {
Jeremy Hylton52820442001-01-03 23:52:36 +00002191 w = POP();
2192 Py_DECREF(w);
Jeremy Hylton76901512000-03-28 23:49:17 +00002193 }
2194 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00002195 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00002196 continue;
Jeremy Hylton76901512000-03-28 23:49:17 +00002197 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002198 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002199
Guido van Rossum0240b922007-02-26 21:23:50 +00002200 case MAKE_CLOSURE:
Guido van Rossum681d79a1995-07-18 14:51:37 +00002201 case MAKE_FUNCTION:
Guido van Rossum4f72a782006-10-27 23:31:49 +00002202 {
2203 int posdefaults = oparg & 0xff;
2204 int kwdefaults = (oparg>>8) & 0xff;
Neal Norwitzc1505362006-12-28 06:47:50 +00002205 int num_annotations = (oparg >> 16) & 0x7fff;
Guido van Rossum4f72a782006-10-27 23:31:49 +00002206
Guido van Rossum681d79a1995-07-18 14:51:37 +00002207 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00002208 x = PyFunction_New(v, f->f_globals);
2209 Py_DECREF(v);
Guido van Rossum0240b922007-02-26 21:23:50 +00002210
2211 if (x != NULL && opcode == MAKE_CLOSURE) {
2212 v = POP();
2213 err = PyFunction_SetClosure(x, v);
2214 Py_DECREF(v);
2215 }
Neal Norwitzc1505362006-12-28 06:47:50 +00002216
2217 if (x != NULL && num_annotations > 0) {
2218 Py_ssize_t name_ix;
2219 u = POP(); /* names of args with annotations */
2220 v = PyDict_New();
2221 if (v == NULL) {
2222 Py_DECREF(x);
2223 x = NULL;
2224 break;
2225 }
2226 name_ix = PyTuple_Size(u);
2227 assert(num_annotations == name_ix+1);
2228 while (name_ix > 0) {
2229 --name_ix;
2230 t = PyTuple_GET_ITEM(u, name_ix);
2231 w = POP();
2232 /* XXX(nnorwitz): check for errors */
2233 PyDict_SetItem(v, t, w);
2234 Py_DECREF(w);
2235 }
2236
2237 err = PyFunction_SetAnnotations(x, v);
2238 Py_DECREF(v);
2239 Py_DECREF(u);
2240 }
2241
Guido van Rossum681d79a1995-07-18 14:51:37 +00002242 /* XXX Maybe this should be a separate opcode? */
Guido van Rossum4f72a782006-10-27 23:31:49 +00002243 if (x != NULL && posdefaults > 0) {
2244 v = PyTuple_New(posdefaults);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002245 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002246 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002247 x = NULL;
2248 break;
2249 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00002250 while (--posdefaults >= 0) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002251 w = POP();
Guido van Rossum4f72a782006-10-27 23:31:49 +00002252 PyTuple_SET_ITEM(v, posdefaults, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002253 }
2254 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00002255 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002256 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00002257 if (x != NULL && kwdefaults > 0) {
2258 v = PyDict_New();
2259 if (v == NULL) {
2260 Py_DECREF(x);
2261 x = NULL;
2262 break;
2263 }
2264 while (--kwdefaults >= 0) {
2265 w = POP(); /* default value */
2266 u = POP(); /* kw only arg name */
Neal Norwitzc1505362006-12-28 06:47:50 +00002267 /* XXX(nnorwitz): check for errors */
Guido van Rossum4f72a782006-10-27 23:31:49 +00002268 PyDict_SetItem(v, u, w);
Georg Brandl94ab0002007-02-26 13:58:18 +00002269 Py_DECREF(w);
2270 Py_DECREF(u);
Guido van Rossum4f72a782006-10-27 23:31:49 +00002271 }
2272 err = PyFunction_SetKwDefaults(x, v);
2273 Py_DECREF(v);
2274 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002275 PUSH(x);
2276 break;
Guido van Rossum4f72a782006-10-27 23:31:49 +00002277 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002278
2279 case BUILD_SLICE:
2280 if (oparg == 3)
2281 w = POP();
2282 else
2283 w = NULL;
2284 v = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00002285 u = TOP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00002286 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00002287 Py_DECREF(u);
2288 Py_DECREF(v);
2289 Py_XDECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00002290 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002291 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00002292 break;
2293
Fred Drakeef8ace32000-08-24 00:32:09 +00002294 case EXTENDED_ARG:
2295 opcode = NEXTOP();
Raymond Hettinger5bed4562004-04-10 23:34:17 +00002296 oparg = oparg<<16 | NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +00002297 goto dispatch_opcode;
Guido van Rossum8861b741996-07-30 16:49:37 +00002298
Guido van Rossum374a9221991-04-04 10:40:29 +00002299 default:
2300 fprintf(stderr,
2301 "XXX lineno: %d, opcode: %d\n",
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002302 PyCode_Addr2Line(f->f_code, f->f_lasti),
2303 opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00002304 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00002305 why = WHY_EXCEPTION;
2306 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002307
2308#ifdef CASE_TOO_BIG
2309 }
2310#endif
2311
Guido van Rossum374a9221991-04-04 10:40:29 +00002312 } /* switch */
2313
2314 on_error:
Guido van Rossumac7be682001-01-17 15:42:30 +00002315
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002316 READ_TIMESTAMP(inst1);
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00002317
Guido van Rossum374a9221991-04-04 10:40:29 +00002318 /* Quickly continue if no error occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002319
Guido van Rossum374a9221991-04-04 10:40:29 +00002320 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002321 if (err == 0 && x != NULL) {
2322#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002323 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002324 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002325 fprintf(stderr,
2326 "XXX undetected error\n");
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00002327 else {
2328#endif
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002329 READ_TIMESTAMP(loop1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002330 continue; /* Normal, fast path */
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00002331#ifdef CHECKEXC
2332 }
2333#endif
Guido van Rossum681d79a1995-07-18 14:51:37 +00002334 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002335 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00002336 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00002337 err = 0;
2338 }
2339
Guido van Rossum374a9221991-04-04 10:40:29 +00002340 /* Double-check exception status */
Guido van Rossumac7be682001-01-17 15:42:30 +00002341
Raymond Hettingerc8aa08b2004-04-11 14:59:33 +00002342 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002343 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002344 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002345 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00002346 why = WHY_EXCEPTION;
2347 }
2348 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002349#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00002350 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002351 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002352 if (PyErr_Occurred()) {
Jeremy Hylton904ed862003-11-05 17:29:35 +00002353 char buf[1024];
2354 sprintf(buf, "Stack unwind with exception "
2355 "set and why=%d", why);
2356 Py_FatalError(buf);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002357 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002358 }
2359#endif
2360
2361 /* Log traceback info if this is a real exception */
Guido van Rossumac7be682001-01-17 15:42:30 +00002362
Guido van Rossum374a9221991-04-04 10:40:29 +00002363 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002364 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002365
Fred Drake8f51f542001-10-04 14:48:42 +00002366 if (tstate->c_tracefunc != NULL)
2367 call_exc_trace(tstate->c_tracefunc,
2368 tstate->c_traceobj, f);
Guido van Rossum014518f1998-11-23 21:09:51 +00002369 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002370
Guido van Rossum374a9221991-04-04 10:40:29 +00002371 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
Guido van Rossumac7be682001-01-17 15:42:30 +00002372
Guido van Rossum374a9221991-04-04 10:40:29 +00002373 if (why == WHY_RERAISE)
2374 why = WHY_EXCEPTION;
2375
2376 /* Unwind stacks if a (pseudo) exception occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002377
Raymond Hettinger1dd83092004-02-06 18:32:33 +00002378fast_block_end:
Tim Peters8a5c3c72004-04-05 19:36:21 +00002379 while (why != WHY_NOT && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002380 PyTryBlock *b = PyFrame_BlockPop(f);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002381
Tim Peters8a5c3c72004-04-05 19:36:21 +00002382 assert(why != WHY_YIELD);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002383 if (b->b_type == SETUP_LOOP && why == WHY_CONTINUE) {
2384 /* For a continue inside a try block,
2385 don't pop the block for the loop. */
Thomas Wouters1ee64222001-09-24 19:32:01 +00002386 PyFrame_BlockSetup(f, b->b_type, b->b_handler,
2387 b->b_level);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002388 why = WHY_NOT;
2389 JUMPTO(PyInt_AS_LONG(retval));
2390 Py_DECREF(retval);
2391 break;
2392 }
2393
Guido van Rossum374a9221991-04-04 10:40:29 +00002394 while (STACK_LEVEL() > b->b_level) {
2395 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002396 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002397 }
2398 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2399 why = WHY_NOT;
2400 JUMPTO(b->b_handler);
2401 break;
2402 }
2403 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00002404 (b->b_type == SETUP_EXCEPT &&
2405 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002406 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002407 PyObject *exc, *val, *tb;
2408 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002409 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002410 val = Py_None;
2411 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00002412 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002413 /* Make the raw exception data
2414 available to the handler,
2415 so a program can emulate the
2416 Python main loop. Don't do
2417 this for 'finally'. */
2418 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00002419 PyErr_NormalizeException(
2420 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002421 set_exc_info(tstate,
2422 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002423 }
Jeremy Hyltonc6314892001-09-26 19:24:45 +00002424 if (tb == NULL) {
2425 Py_INCREF(Py_None);
2426 PUSH(Py_None);
2427 } else
2428 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002429 PUSH(val);
2430 PUSH(exc);
2431 }
2432 else {
Raymond Hettinger06032cb2004-04-06 09:37:35 +00002433 if (why & (WHY_RETURN | WHY_CONTINUE))
Guido van Rossum374a9221991-04-04 10:40:29 +00002434 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00002435 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00002436 PUSH(v);
2437 }
2438 why = WHY_NOT;
2439 JUMPTO(b->b_handler);
2440 break;
2441 }
2442 } /* unwind stack */
2443
2444 /* End the loop if we still have an error (or return) */
Guido van Rossumac7be682001-01-17 15:42:30 +00002445
Guido van Rossum374a9221991-04-04 10:40:29 +00002446 if (why != WHY_NOT)
2447 break;
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002448 READ_TIMESTAMP(loop1);
Guido van Rossumac7be682001-01-17 15:42:30 +00002449
Guido van Rossum374a9221991-04-04 10:40:29 +00002450 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00002451
Tim Peters8a5c3c72004-04-05 19:36:21 +00002452 assert(why != WHY_YIELD);
2453 /* Pop remaining stack entries. */
2454 while (!EMPTY()) {
2455 v = POP();
2456 Py_XDECREF(v);
Guido van Rossum35974fb2001-12-06 21:28:18 +00002457 }
2458
Tim Peters8a5c3c72004-04-05 19:36:21 +00002459 if (why != WHY_RETURN)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002460 retval = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002461
Raymond Hettinger1dd83092004-02-06 18:32:33 +00002462fast_yield:
Fred Drake9e3ad782001-07-03 23:39:52 +00002463 if (tstate->use_tracing) {
Barry Warsawe2eca0b2005-08-15 18:14:19 +00002464 if (tstate->c_tracefunc) {
2465 if (why == WHY_RETURN || why == WHY_YIELD) {
2466 if (call_trace(tstate->c_tracefunc,
2467 tstate->c_traceobj, f,
2468 PyTrace_RETURN, retval)) {
2469 Py_XDECREF(retval);
2470 retval = NULL;
2471 why = WHY_EXCEPTION;
2472 }
2473 }
2474 else if (why == WHY_EXCEPTION) {
2475 call_trace_protected(tstate->c_tracefunc,
2476 tstate->c_traceobj, f,
Armin Rigo1c2d7e52005-09-20 18:34:01 +00002477 PyTrace_RETURN, NULL);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002478 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002479 }
Fred Drake8f51f542001-10-04 14:48:42 +00002480 if (tstate->c_profilefunc) {
Fred Drake4ec5d562001-10-04 19:26:43 +00002481 if (why == WHY_EXCEPTION)
2482 call_trace_protected(tstate->c_profilefunc,
2483 tstate->c_profileobj, f,
Armin Rigo1c2d7e52005-09-20 18:34:01 +00002484 PyTrace_RETURN, NULL);
Fred Drake4ec5d562001-10-04 19:26:43 +00002485 else if (call_trace(tstate->c_profilefunc,
2486 tstate->c_profileobj, f,
2487 PyTrace_RETURN, retval)) {
Fred Drake9e3ad782001-07-03 23:39:52 +00002488 Py_XDECREF(retval);
2489 retval = NULL;
2490 why = WHY_EXCEPTION;
2491 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002492 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002493 }
Guido van Rossuma4240131997-01-21 21:18:36 +00002494
Thomas Wouters477c8d52006-05-27 19:21:47 +00002495 if (tstate->frame->f_exc_type != NULL)
2496 reset_exc_info(tstate);
2497 else {
2498 assert(tstate->frame->f_exc_value == NULL);
2499 assert(tstate->frame->f_exc_traceback == NULL);
2500 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00002501
Tim Peters5ca576e2001-06-18 22:08:13 +00002502 /* pop frame */
Thomas Woutersce272b62007-09-19 21:19:28 +00002503exit_eval_frame:
Armin Rigo2b3eb402003-10-28 12:05:48 +00002504 Py_LeaveRecursiveCall();
Guido van Rossuma027efa1997-05-05 20:56:21 +00002505 tstate->frame = f->f_back;
Guido van Rossumac7be682001-01-17 15:42:30 +00002506
Guido van Rossum96a42c81992-01-12 02:29:51 +00002507 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00002508}
2509
Guido van Rossumc2e20742006-02-27 22:32:47 +00002510/* This is gonna seem *real weird*, but if you put some other code between
Martin v. Löwis8d97e332004-06-27 15:43:12 +00002511 PyEval_EvalFrame() and PyEval_EvalCodeEx() you will need to adjust
Guido van Rossumc2e20742006-02-27 22:32:47 +00002512 the test in the if statements in Misc/gdbinit (pystack and pystackv). */
Skip Montanaro786ea6b2004-03-01 15:44:05 +00002513
Tim Peters6d6c1a32001-08-02 04:15:00 +00002514PyObject *
2515PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals,
Tim Peters5ca576e2001-06-18 22:08:13 +00002516 PyObject **args, int argcount, PyObject **kws, int kwcount,
Guido van Rossum4f72a782006-10-27 23:31:49 +00002517 PyObject **defs, int defcount, PyObject *kwdefs, PyObject *closure)
Tim Peters5ca576e2001-06-18 22:08:13 +00002518{
2519 register PyFrameObject *f;
2520 register PyObject *retval = NULL;
2521 register PyObject **fastlocals, **freevars;
2522 PyThreadState *tstate = PyThreadState_GET();
2523 PyObject *x, *u;
2524
2525 if (globals == NULL) {
Tim Peters8a5c3c72004-04-05 19:36:21 +00002526 PyErr_SetString(PyExc_SystemError,
Jeremy Hylton910d7d42001-08-12 21:52:24 +00002527 "PyEval_EvalCodeEx: NULL globals");
Tim Peters5ca576e2001-06-18 22:08:13 +00002528 return NULL;
2529 }
2530
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002531 assert(tstate != NULL);
Jeremy Hylton985eba52003-02-05 23:13:00 +00002532 assert(globals != NULL);
2533 f = PyFrame_New(tstate, co, globals, locals);
Tim Peters5ca576e2001-06-18 22:08:13 +00002534 if (f == NULL)
2535 return NULL;
2536
2537 fastlocals = f->f_localsplus;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002538 freevars = f->f_localsplus + co->co_nlocals;
Tim Peters5ca576e2001-06-18 22:08:13 +00002539
2540 if (co->co_argcount > 0 ||
Guido van Rossum4f72a782006-10-27 23:31:49 +00002541 co->co_kwonlyargcount > 0 ||
Tim Peters5ca576e2001-06-18 22:08:13 +00002542 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
2543 int i;
2544 int n = argcount;
2545 PyObject *kwdict = NULL;
2546 if (co->co_flags & CO_VARKEYWORDS) {
2547 kwdict = PyDict_New();
2548 if (kwdict == NULL)
2549 goto fail;
Guido van Rossum4f72a782006-10-27 23:31:49 +00002550 i = co->co_argcount + co->co_kwonlyargcount;
Tim Peters5ca576e2001-06-18 22:08:13 +00002551 if (co->co_flags & CO_VARARGS)
2552 i++;
2553 SETLOCAL(i, kwdict);
2554 }
2555 if (argcount > co->co_argcount) {
2556 if (!(co->co_flags & CO_VARARGS)) {
2557 PyErr_Format(PyExc_TypeError,
Walter Dörwald573c08c2007-05-25 15:46:59 +00002558 "%S() takes %s %d "
Guido van Rossum4f72a782006-10-27 23:31:49 +00002559 "%spositional argument%s (%d given)",
Walter Dörwald573c08c2007-05-25 15:46:59 +00002560 co->co_name,
Tim Peters5ca576e2001-06-18 22:08:13 +00002561 defcount ? "at most" : "exactly",
2562 co->co_argcount,
2563 kwcount ? "non-keyword " : "",
2564 co->co_argcount == 1 ? "" : "s",
2565 argcount);
2566 goto fail;
2567 }
2568 n = co->co_argcount;
2569 }
2570 for (i = 0; i < n; i++) {
2571 x = args[i];
2572 Py_INCREF(x);
2573 SETLOCAL(i, x);
2574 }
2575 if (co->co_flags & CO_VARARGS) {
2576 u = PyTuple_New(argcount - n);
2577 if (u == NULL)
2578 goto fail;
Guido van Rossum4f72a782006-10-27 23:31:49 +00002579 SETLOCAL(co->co_argcount + co->co_kwonlyargcount, u);
Tim Peters5ca576e2001-06-18 22:08:13 +00002580 for (i = n; i < argcount; i++) {
2581 x = args[i];
2582 Py_INCREF(x);
2583 PyTuple_SET_ITEM(u, i-n, x);
2584 }
2585 }
2586 for (i = 0; i < kwcount; i++) {
2587 PyObject *keyword = kws[2*i];
2588 PyObject *value = kws[2*i + 1];
2589 int j;
Neal Norwitzda059e32007-08-26 05:33:45 +00002590 if (keyword == NULL || !PyUnicode_Check(keyword)) {
Tim Peters5ca576e2001-06-18 22:08:13 +00002591 PyErr_Format(PyExc_TypeError,
Walter Dörwald573c08c2007-05-25 15:46:59 +00002592 "%S() keywords must be strings",
2593 co->co_name);
Tim Peters5ca576e2001-06-18 22:08:13 +00002594 goto fail;
2595 }
2596 /* XXX slow -- speed up using dictionary? */
Guido van Rossum4f72a782006-10-27 23:31:49 +00002597 for (j = 0;
2598 j < co->co_argcount + co->co_kwonlyargcount;
2599 j++) {
Tim Peters5ca576e2001-06-18 22:08:13 +00002600 PyObject *nm = PyTuple_GET_ITEM(
2601 co->co_varnames, j);
2602 int cmp = PyObject_RichCompareBool(
2603 keyword, nm, Py_EQ);
2604 if (cmp > 0)
2605 break;
2606 else if (cmp < 0)
2607 goto fail;
2608 }
2609 /* Check errors from Compare */
2610 if (PyErr_Occurred())
2611 goto fail;
Guido van Rossum4f72a782006-10-27 23:31:49 +00002612 if (j >= co->co_argcount + co->co_kwonlyargcount) {
Tim Peters5ca576e2001-06-18 22:08:13 +00002613 if (kwdict == NULL) {
2614 PyErr_Format(PyExc_TypeError,
Walter Dörwald573c08c2007-05-25 15:46:59 +00002615 "%S() got an unexpected "
2616 "keyword argument '%S'",
2617 co->co_name,
2618 keyword);
Tim Peters5ca576e2001-06-18 22:08:13 +00002619 goto fail;
2620 }
2621 PyDict_SetItem(kwdict, keyword, value);
2622 }
2623 else {
2624 if (GETLOCAL(j) != NULL) {
2625 PyErr_Format(PyExc_TypeError,
Walter Dörwald573c08c2007-05-25 15:46:59 +00002626 "%S() got multiple "
Tim Peters5ca576e2001-06-18 22:08:13 +00002627 "values for keyword "
Walter Dörwald573c08c2007-05-25 15:46:59 +00002628 "argument '%S'",
2629 co->co_name,
2630 keyword);
Tim Peters5ca576e2001-06-18 22:08:13 +00002631 goto fail;
2632 }
2633 Py_INCREF(value);
2634 SETLOCAL(j, value);
2635 }
2636 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00002637 if (co->co_kwonlyargcount > 0) {
2638 for (i = co->co_argcount;
2639 i < co->co_argcount + co->co_kwonlyargcount;
2640 i++) {
Guido van Rossum29602e42006-11-22 04:45:33 +00002641 PyObject *name, *def;
Guido van Rossum4f72a782006-10-27 23:31:49 +00002642 if (GETLOCAL(i) != NULL)
2643 continue;
Guido van Rossum29602e42006-11-22 04:45:33 +00002644 name = PyTuple_GET_ITEM(co->co_varnames, i);
2645 def = NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00002646 if (kwdefs != NULL)
2647 def = PyDict_GetItem(kwdefs, name);
2648 if (def != NULL) {
2649 Py_INCREF(def);
2650 SETLOCAL(i, def);
2651 continue;
2652 }
2653 PyErr_Format(PyExc_TypeError,
Walter Dörwald573c08c2007-05-25 15:46:59 +00002654 "%S() needs keyword-only argument %S",
2655 co->co_name, name);
Guido van Rossum4f72a782006-10-27 23:31:49 +00002656 goto fail;
2657 }
2658 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002659 if (argcount < co->co_argcount) {
2660 int m = co->co_argcount - defcount;
2661 for (i = argcount; i < m; i++) {
2662 if (GETLOCAL(i) == NULL) {
2663 PyErr_Format(PyExc_TypeError,
Walter Dörwald573c08c2007-05-25 15:46:59 +00002664 "%S() takes %s %d "
Guido van Rossum4f72a782006-10-27 23:31:49 +00002665 "%spositional argument%s "
2666 "(%d given)",
Walter Dörwald573c08c2007-05-25 15:46:59 +00002667 co->co_name,
Tim Peters5ca576e2001-06-18 22:08:13 +00002668 ((co->co_flags & CO_VARARGS) ||
2669 defcount) ? "at least"
2670 : "exactly",
2671 m, kwcount ? "non-keyword " : "",
2672 m == 1 ? "" : "s", i);
2673 goto fail;
2674 }
2675 }
2676 if (n > m)
2677 i = n - m;
2678 else
2679 i = 0;
2680 for (; i < defcount; i++) {
2681 if (GETLOCAL(m+i) == NULL) {
2682 PyObject *def = defs[i];
2683 Py_INCREF(def);
2684 SETLOCAL(m+i, def);
2685 }
2686 }
2687 }
2688 }
2689 else {
2690 if (argcount > 0 || kwcount > 0) {
2691 PyErr_Format(PyExc_TypeError,
Walter Dörwald573c08c2007-05-25 15:46:59 +00002692 "%S() takes no arguments (%d given)",
2693 co->co_name,
Tim Peters5ca576e2001-06-18 22:08:13 +00002694 argcount + kwcount);
2695 goto fail;
2696 }
2697 }
2698 /* Allocate and initialize storage for cell vars, and copy free
2699 vars into frame. This isn't too efficient right now. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002700 if (PyTuple_GET_SIZE(co->co_cellvars)) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002701 int i, j, nargs, found;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002702 Py_UNICODE *cellname, *argname;
Tim Peters5ca576e2001-06-18 22:08:13 +00002703 PyObject *c;
2704
2705 nargs = co->co_argcount;
2706 if (co->co_flags & CO_VARARGS)
2707 nargs++;
2708 if (co->co_flags & CO_VARKEYWORDS)
2709 nargs++;
2710
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002711 /* Initialize each cell var, taking into account
2712 cell vars that are initialized from arguments.
2713
2714 Should arrange for the compiler to put cellvars
2715 that are arguments at the beginning of the cellvars
2716 list so that we can march over it more efficiently?
2717 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002718 for (i = 0; i < PyTuple_GET_SIZE(co->co_cellvars); ++i) {
Martin v. Löwis5b222132007-06-10 09:51:05 +00002719 cellname = PyUnicode_AS_UNICODE(
Tim Peters5ca576e2001-06-18 22:08:13 +00002720 PyTuple_GET_ITEM(co->co_cellvars, i));
2721 found = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002722 for (j = 0; j < nargs; j++) {
Martin v. Löwis5b222132007-06-10 09:51:05 +00002723 argname = PyUnicode_AS_UNICODE(
Tim Peters5ca576e2001-06-18 22:08:13 +00002724 PyTuple_GET_ITEM(co->co_varnames, j));
Martin v. Löwis5b222132007-06-10 09:51:05 +00002725 if (Py_UNICODE_strcmp(cellname, argname) == 0) {
Tim Peters5ca576e2001-06-18 22:08:13 +00002726 c = PyCell_New(GETLOCAL(j));
2727 if (c == NULL)
2728 goto fail;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002729 GETLOCAL(co->co_nlocals + i) = c;
Tim Peters5ca576e2001-06-18 22:08:13 +00002730 found = 1;
2731 break;
2732 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002733 }
2734 if (found == 0) {
2735 c = PyCell_New(NULL);
2736 if (c == NULL)
2737 goto fail;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002738 SETLOCAL(co->co_nlocals + i, c);
Tim Peters5ca576e2001-06-18 22:08:13 +00002739 }
2740 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002741 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002742 if (PyTuple_GET_SIZE(co->co_freevars)) {
Tim Peters5ca576e2001-06-18 22:08:13 +00002743 int i;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002744 for (i = 0; i < PyTuple_GET_SIZE(co->co_freevars); ++i) {
Tim Peters5ca576e2001-06-18 22:08:13 +00002745 PyObject *o = PyTuple_GET_ITEM(closure, i);
2746 Py_INCREF(o);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002747 freevars[PyTuple_GET_SIZE(co->co_cellvars) + i] = o;
Tim Peters5ca576e2001-06-18 22:08:13 +00002748 }
2749 }
2750
Tim Peters5ca576e2001-06-18 22:08:13 +00002751 if (co->co_flags & CO_GENERATOR) {
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002752 /* Don't need to keep the reference to f_back, it will be set
2753 * when the generator is resumed. */
Tim Peters5ba58662001-07-16 02:29:45 +00002754 Py_XDECREF(f->f_back);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002755 f->f_back = NULL;
2756
Jeremy Hylton985eba52003-02-05 23:13:00 +00002757 PCALL(PCALL_GENERATOR);
2758
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002759 /* Create a new generator that owns the ready to run frame
2760 * and return that as the value. */
Martin v. Löwise440e472004-06-01 15:22:42 +00002761 return PyGen_New(f);
Tim Peters5ca576e2001-06-18 22:08:13 +00002762 }
2763
Thomas Woutersce272b62007-09-19 21:19:28 +00002764 retval = PyEval_EvalFrameEx(f,0);
Tim Peters5ca576e2001-06-18 22:08:13 +00002765
Thomas Woutersce272b62007-09-19 21:19:28 +00002766fail: /* Jump here from prelude on failure */
Tim Peters5ca576e2001-06-18 22:08:13 +00002767
Tim Petersb13680b2001-11-27 23:29:29 +00002768 /* decref'ing the frame can cause __del__ methods to get invoked,
2769 which can call back into Python. While we're done with the
2770 current Python frame (f), the associated C stack is still in use,
2771 so recursion_depth must be boosted for the duration.
2772 */
2773 assert(tstate != NULL);
2774 ++tstate->recursion_depth;
Thomas Woutersce272b62007-09-19 21:19:28 +00002775 Py_DECREF(f);
Tim Petersb13680b2001-11-27 23:29:29 +00002776 --tstate->recursion_depth;
Tim Peters5ca576e2001-06-18 22:08:13 +00002777 return retval;
2778}
2779
2780
Guido van Rossumc9fbb722003-03-01 03:36:33 +00002781/* Implementation notes for set_exc_info() and reset_exc_info():
2782
2783- Below, 'exc_ZZZ' stands for 'exc_type', 'exc_value' and
2784 'exc_traceback'. These always travel together.
2785
2786- tstate->curexc_ZZZ is the "hot" exception that is set by
2787 PyErr_SetString(), cleared by PyErr_Clear(), and so on.
2788
2789- Once an exception is caught by an except clause, it is transferred
2790 from tstate->curexc_ZZZ to tstate->exc_ZZZ, from which sys.exc_info()
2791 can pick it up. This is the primary task of set_exc_info().
Thomas Wouters477c8d52006-05-27 19:21:47 +00002792 XXX That can't be right: set_exc_info() doesn't look at tstate->curexc_ZZZ.
Guido van Rossumc9fbb722003-03-01 03:36:33 +00002793
2794- Now let me explain the complicated dance with frame->f_exc_ZZZ.
2795
2796 Long ago, when none of this existed, there were just a few globals:
2797 one set corresponding to the "hot" exception, and one set
2798 corresponding to sys.exc_ZZZ. (Actually, the latter weren't C
2799 globals; they were simply stored as sys.exc_ZZZ. For backwards
2800 compatibility, they still are!) The problem was that in code like
2801 this:
2802
2803 try:
2804 "something that may fail"
2805 except "some exception":
2806 "do something else first"
2807 "print the exception from sys.exc_ZZZ."
2808
2809 if "do something else first" invoked something that raised and caught
2810 an exception, sys.exc_ZZZ were overwritten. That was a frequent
2811 cause of subtle bugs. I fixed this by changing the semantics as
2812 follows:
2813
2814 - Within one frame, sys.exc_ZZZ will hold the last exception caught
2815 *in that frame*.
2816
2817 - But initially, and as long as no exception is caught in a given
2818 frame, sys.exc_ZZZ will hold the last exception caught in the
2819 previous frame (or the frame before that, etc.).
2820
2821 The first bullet fixed the bug in the above example. The second
2822 bullet was for backwards compatibility: it was (and is) common to
2823 have a function that is called when an exception is caught, and to
2824 have that function access the caught exception via sys.exc_ZZZ.
2825 (Example: traceback.print_exc()).
2826
2827 At the same time I fixed the problem that sys.exc_ZZZ weren't
2828 thread-safe, by introducing sys.exc_info() which gets it from tstate;
2829 but that's really a separate improvement.
2830
2831 The reset_exc_info() function in ceval.c restores the tstate->exc_ZZZ
2832 variables to what they were before the current frame was called. The
2833 set_exc_info() function saves them on the frame so that
2834 reset_exc_info() can restore them. The invariant is that
2835 frame->f_exc_ZZZ is NULL iff the current frame never caught an
2836 exception (where "catching" an exception applies only to successful
2837 except clauses); and if the current frame ever caught an exception,
2838 frame->f_exc_ZZZ is the exception that was stored in tstate->exc_ZZZ
2839 at the start of the current frame.
2840
2841*/
2842
Guido van Rossuma027efa1997-05-05 20:56:21 +00002843static void
Guido van Rossumac7be682001-01-17 15:42:30 +00002844set_exc_info(PyThreadState *tstate,
2845 PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002846{
Thomas Wouters477c8d52006-05-27 19:21:47 +00002847 PyFrameObject *frame = tstate->frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002848 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00002849
Thomas Wouters477c8d52006-05-27 19:21:47 +00002850 assert(type != NULL);
2851 assert(frame != NULL);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002852 if (frame->f_exc_type == NULL) {
Thomas Wouters477c8d52006-05-27 19:21:47 +00002853 assert(frame->f_exc_value == NULL);
2854 assert(frame->f_exc_traceback == NULL);
2855 /* This frame didn't catch an exception before. */
2856 /* Save previous exception of this thread in this frame. */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002857 if (tstate->exc_type == NULL) {
Thomas Wouters477c8d52006-05-27 19:21:47 +00002858 /* XXX Why is this set to Py_None? */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002859 Py_INCREF(Py_None);
2860 tstate->exc_type = Py_None;
2861 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002862 Py_INCREF(tstate->exc_type);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002863 Py_XINCREF(tstate->exc_value);
2864 Py_XINCREF(tstate->exc_traceback);
2865 frame->f_exc_type = tstate->exc_type;
2866 frame->f_exc_value = tstate->exc_value;
2867 frame->f_exc_traceback = tstate->exc_traceback;
2868 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002869 /* Set new exception for this thread. */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002870 tmp_type = tstate->exc_type;
2871 tmp_value = tstate->exc_value;
2872 tmp_tb = tstate->exc_traceback;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002873 Py_INCREF(type);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002874 Py_XINCREF(value);
2875 Py_XINCREF(tb);
2876 tstate->exc_type = type;
2877 tstate->exc_value = value;
2878 tstate->exc_traceback = tb;
Thomas Wouters7ce29ca2007-09-19 21:56:32 +00002879 PyException_SetTraceback(value, tb);
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002880 Py_XDECREF(tmp_type);
2881 Py_XDECREF(tmp_value);
2882 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002883}
2884
2885static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002886reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002887{
2888 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002889 PyObject *tmp_type, *tmp_value, *tmp_tb;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002890
2891 /* It's a precondition that the thread state's frame caught an
2892 * exception -- verify in a debug build.
2893 */
2894 assert(tstate != NULL);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002895 frame = tstate->frame;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002896 assert(frame != NULL);
2897 assert(frame->f_exc_type != NULL);
2898
2899 /* Copy the frame's exception info back to the thread state. */
2900 tmp_type = tstate->exc_type;
2901 tmp_value = tstate->exc_value;
2902 tmp_tb = tstate->exc_traceback;
2903 Py_INCREF(frame->f_exc_type);
2904 Py_XINCREF(frame->f_exc_value);
2905 Py_XINCREF(frame->f_exc_traceback);
2906 tstate->exc_type = frame->f_exc_type;
2907 tstate->exc_value = frame->f_exc_value;
2908 tstate->exc_traceback = frame->f_exc_traceback;
2909 Py_XDECREF(tmp_type);
2910 Py_XDECREF(tmp_value);
2911 Py_XDECREF(tmp_tb);
2912
Thomas Wouters477c8d52006-05-27 19:21:47 +00002913 /* Clear the frame's exception info. */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002914 tmp_type = frame->f_exc_type;
2915 tmp_value = frame->f_exc_value;
2916 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002917 frame->f_exc_type = NULL;
2918 frame->f_exc_value = NULL;
2919 frame->f_exc_traceback = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002920 Py_DECREF(tmp_type);
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002921 Py_XDECREF(tmp_value);
2922 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002923}
2924
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002925/* Logic for the raise statement (too complicated for inlining).
2926 This *consumes* a reference count to each of its arguments. */
Raymond Hettinger7c958652004-04-06 10:11:10 +00002927static enum why_code
Collin Winter828f04a2007-08-31 00:04:24 +00002928do_raise(PyObject *exc, PyObject *cause)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002929{
Thomas Wouters7ce29ca2007-09-19 21:56:32 +00002930 PyObject *type = NULL, *value = NULL, *tb = NULL;
Collin Winter828f04a2007-08-31 00:04:24 +00002931
2932 if (exc == NULL) {
Guido van Rossumd295f121998-04-09 21:39:57 +00002933 /* Reraise */
Nicholas Bastine5662ae2004-03-24 22:22:12 +00002934 PyThreadState *tstate = PyThreadState_GET();
Collin Winter828f04a2007-08-31 00:04:24 +00002935 type = tstate->exc_type;
Guido van Rossumd295f121998-04-09 21:39:57 +00002936 value = tstate->exc_value;
2937 tb = tstate->exc_traceback;
Thomas Wouters7ce29ca2007-09-19 21:56:32 +00002938 if (type == Py_None) {
2939 PyErr_SetString(PyExc_RuntimeError,
2940 "No active exception to reraise");
2941 return WHY_EXCEPTION;
2942 }
2943 Py_XINCREF(type);
Guido van Rossumd295f121998-04-09 21:39:57 +00002944 Py_XINCREF(value);
2945 Py_XINCREF(tb);
Thomas Wouters7ce29ca2007-09-19 21:56:32 +00002946 PyErr_Restore(type, value, tb);
2947 return WHY_RERAISE;
Guido van Rossumd295f121998-04-09 21:39:57 +00002948 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002949
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002950 /* We support the following forms of raise:
Collin Winter828f04a2007-08-31 00:04:24 +00002951 raise
2952 raise <instance>
2953 raise <type> */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002954
Collin Winter828f04a2007-08-31 00:04:24 +00002955 if (PyExceptionClass_Check(exc)) {
Thomas Wouters7ce29ca2007-09-19 21:56:32 +00002956 type = exc;
2957 value = PyObject_CallObject(exc, NULL);
Collin Winter828f04a2007-08-31 00:04:24 +00002958 if (value == NULL)
Thomas Wouters7ce29ca2007-09-19 21:56:32 +00002959 goto raise_error;
2960 }
Collin Winter828f04a2007-08-31 00:04:24 +00002961 else if (PyExceptionInstance_Check(exc)) {
2962 value = exc;
2963 type = PyExceptionInstance_Class(exc);
Guido van Rossumb209a111997-04-29 18:18:01 +00002964 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002965 }
2966 else {
2967 /* Not something you can raise. You get an exception
2968 anyway, just not what you specified :-) */
Thomas Wouters7ce29ca2007-09-19 21:56:32 +00002969 Py_DECREF(exc);
Guido van Rossum45aecf42006-03-15 04:58:47 +00002970 PyErr_SetString(PyExc_TypeError,
Thomas Wouters7ce29ca2007-09-19 21:56:32 +00002971 "exceptions must derive from BaseException");
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002972 goto raise_error;
2973 }
Collin Winter828f04a2007-08-31 00:04:24 +00002974
Thomas Wouters7ce29ca2007-09-19 21:56:32 +00002975 tb = PyException_GetTraceback(value);
2976 if (cause) {
2977 PyObject *fixed_cause;
2978 if (PyExceptionClass_Check(cause)) {
2979 fixed_cause = PyObject_CallObject(cause, NULL);
2980 if (fixed_cause == NULL)
2981 goto raise_error;
2982 Py_DECREF(cause);
2983 }
2984 else if (PyExceptionInstance_Check(cause)) {
2985 fixed_cause = cause;
2986 }
2987 else {
2988 PyErr_SetString(PyExc_TypeError,
2989 "exception causes must derive from "
2990 "BaseException");
2991 goto raise_error;
2992 }
2993 PyException_SetCause(value, fixed_cause);
2994 }
Collin Winter828f04a2007-08-31 00:04:24 +00002995
Guido van Rossumb209a111997-04-29 18:18:01 +00002996 PyErr_Restore(type, value, tb);
Collin Winter828f04a2007-08-31 00:04:24 +00002997 return WHY_EXCEPTION;
2998
2999raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00003000 Py_XDECREF(value);
3001 Py_XDECREF(type);
3002 Py_XDECREF(tb);
Collin Winter1966f1c2007-09-01 20:26:44 +00003003 Py_XDECREF(cause);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003004 return WHY_EXCEPTION;
3005}
3006
Tim Petersd6d010b2001-06-21 02:49:55 +00003007/* Iterate v argcnt times and store the results on the stack (via decreasing
Guido van Rossum0368b722007-05-11 16:50:42 +00003008 sp). Return 1 for success, 0 if error.
3009
3010 If argcntafter == -1, do a simple unpack. If it is >= 0, do an unpack
3011 with a variable target.
3012*/
Tim Petersd6d010b2001-06-21 02:49:55 +00003013
Barry Warsawe42b18f1997-08-25 22:13:04 +00003014static int
Guido van Rossum0368b722007-05-11 16:50:42 +00003015unpack_iterable(PyObject *v, int argcnt, int argcntafter, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00003016{
Guido van Rossum0368b722007-05-11 16:50:42 +00003017 int i = 0, j = 0;
3018 Py_ssize_t ll = 0;
Tim Petersd6d010b2001-06-21 02:49:55 +00003019 PyObject *it; /* iter(v) */
Barry Warsawe42b18f1997-08-25 22:13:04 +00003020 PyObject *w;
Guido van Rossum0368b722007-05-11 16:50:42 +00003021 PyObject *l = NULL; /* variable list */
Guido van Rossumac7be682001-01-17 15:42:30 +00003022
Tim Petersd6d010b2001-06-21 02:49:55 +00003023 assert(v != NULL);
3024
3025 it = PyObject_GetIter(v);
3026 if (it == NULL)
3027 goto Error;
3028
3029 for (; i < argcnt; i++) {
3030 w = PyIter_Next(it);
3031 if (w == NULL) {
3032 /* Iterator done, via error or exhaustion. */
3033 if (!PyErr_Occurred()) {
3034 PyErr_Format(PyExc_ValueError,
3035 "need more than %d value%s to unpack",
3036 i, i == 1 ? "" : "s");
3037 }
3038 goto Error;
Barry Warsawe42b18f1997-08-25 22:13:04 +00003039 }
3040 *--sp = w;
3041 }
Tim Petersd6d010b2001-06-21 02:49:55 +00003042
Guido van Rossum0368b722007-05-11 16:50:42 +00003043 if (argcntafter == -1) {
3044 /* We better have exhausted the iterator now. */
3045 w = PyIter_Next(it);
3046 if (w == NULL) {
3047 if (PyErr_Occurred())
3048 goto Error;
3049 Py_DECREF(it);
3050 return 1;
3051 }
3052 Py_DECREF(w);
3053 PyErr_SetString(PyExc_ValueError, "too many values to unpack");
3054 goto Error;
Barry Warsawe42b18f1997-08-25 22:13:04 +00003055 }
Guido van Rossum0368b722007-05-11 16:50:42 +00003056
3057 l = PySequence_List(it);
3058 if (l == NULL)
3059 goto Error;
3060 *--sp = l;
3061 i++;
3062
3063 ll = PyList_GET_SIZE(l);
3064 if (ll < argcntafter) {
3065 PyErr_Format(PyExc_ValueError, "need more than %zd values to unpack",
3066 argcnt + ll);
3067 goto Error;
3068 }
3069
3070 /* Pop the "after-variable" args off the list. */
3071 for (j = argcntafter; j > 0; j--, i++) {
3072 *--sp = PyList_GET_ITEM(l, ll - j);
3073 }
3074 /* Resize the list. */
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00003075 Py_Size(l) = ll - argcntafter;
Guido van Rossum0368b722007-05-11 16:50:42 +00003076 Py_DECREF(it);
3077 return 1;
3078
Tim Petersd6d010b2001-06-21 02:49:55 +00003079Error:
Barry Warsaw91010551997-08-25 22:30:51 +00003080 for (; i > 0; i--, sp++)
3081 Py_DECREF(*sp);
Tim Petersd6d010b2001-06-21 02:49:55 +00003082 Py_XDECREF(it);
Barry Warsawe42b18f1997-08-25 22:13:04 +00003083 return 0;
3084}
3085
3086
Guido van Rossum96a42c81992-01-12 02:29:51 +00003087#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00003088static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003089prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003090{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003091 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00003092 if (PyObject_Print(v, stdout, 0) != 0)
3093 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00003094 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00003095 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003096}
Guido van Rossum3f5da241990-12-20 15:06:42 +00003097#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003098
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00003099static void
Fred Drake5755ce62001-06-27 19:19:46 +00003100call_exc_trace(Py_tracefunc func, PyObject *self, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00003101{
Guido van Rossumb209a111997-04-29 18:18:01 +00003102 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00003103 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00003104 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00003105 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003106 value = Py_None;
3107 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00003108 }
Raymond Hettinger8ae46892003-10-12 19:09:37 +00003109 arg = PyTuple_Pack(3, type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003110 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003111 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003112 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00003113 }
Fred Drake5755ce62001-06-27 19:19:46 +00003114 err = call_trace(func, self, f, PyTrace_EXCEPTION, arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00003115 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003116 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00003117 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003118 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00003119 Py_XDECREF(type);
3120 Py_XDECREF(value);
3121 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003122 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00003123}
3124
Fred Drake4ec5d562001-10-04 19:26:43 +00003125static void
3126call_trace_protected(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
Armin Rigo1c2d7e52005-09-20 18:34:01 +00003127 int what, PyObject *arg)
Fred Drake4ec5d562001-10-04 19:26:43 +00003128{
3129 PyObject *type, *value, *traceback;
3130 int err;
3131 PyErr_Fetch(&type, &value, &traceback);
Armin Rigo1c2d7e52005-09-20 18:34:01 +00003132 err = call_trace(func, obj, frame, what, arg);
Fred Drake4ec5d562001-10-04 19:26:43 +00003133 if (err == 0)
3134 PyErr_Restore(type, value, traceback);
3135 else {
3136 Py_XDECREF(type);
3137 Py_XDECREF(value);
3138 Py_XDECREF(traceback);
3139 }
3140}
3141
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00003142static int
Fred Drake5755ce62001-06-27 19:19:46 +00003143call_trace(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
3144 int what, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00003145{
Fred Drake5755ce62001-06-27 19:19:46 +00003146 register PyThreadState *tstate = frame->f_tstate;
3147 int result;
3148 if (tstate->tracing)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00003149 return 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +00003150 tstate->tracing++;
Fred Drake9e3ad782001-07-03 23:39:52 +00003151 tstate->use_tracing = 0;
Fred Drake5755ce62001-06-27 19:19:46 +00003152 result = func(obj, frame, what, arg);
Fred Drake9e3ad782001-07-03 23:39:52 +00003153 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
3154 || (tstate->c_profilefunc != NULL));
Guido van Rossuma027efa1997-05-05 20:56:21 +00003155 tstate->tracing--;
Fred Drake5755ce62001-06-27 19:19:46 +00003156 return result;
Guido van Rossum96a42c81992-01-12 02:29:51 +00003157}
3158
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00003159PyObject *
3160_PyEval_CallTracing(PyObject *func, PyObject *args)
3161{
3162 PyFrameObject *frame = PyEval_GetFrame();
3163 PyThreadState *tstate = frame->f_tstate;
3164 int save_tracing = tstate->tracing;
3165 int save_use_tracing = tstate->use_tracing;
3166 PyObject *result;
3167
3168 tstate->tracing = 0;
3169 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
3170 || (tstate->c_profilefunc != NULL));
3171 result = PyObject_Call(func, args, NULL);
3172 tstate->tracing = save_tracing;
3173 tstate->use_tracing = save_use_tracing;
3174 return result;
3175}
3176
Michael W. Hudson006c7522002-11-08 13:08:46 +00003177static int
Tim Peters8a5c3c72004-04-05 19:36:21 +00003178maybe_call_line_trace(Py_tracefunc func, PyObject *obj,
Armin Rigobf57a142004-03-22 19:24:58 +00003179 PyFrameObject *frame, int *instr_lb, int *instr_ub,
3180 int *instr_prev)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003181{
Michael W. Hudson006c7522002-11-08 13:08:46 +00003182 int result = 0;
3183
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003184 /* If the last instruction executed isn't in the current
3185 instruction window, reset the window. If the last
3186 instruction happens to fall at the start of a line or if it
3187 represents a jump backwards, call the trace function.
3188 */
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00003189 if ((frame->f_lasti < *instr_lb || frame->f_lasti >= *instr_ub)) {
Thomas Woutersce272b62007-09-19 21:19:28 +00003190 int line;
3191 PyAddrPair bounds;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003192
Thomas Woutersce272b62007-09-19 21:19:28 +00003193 line = PyCode_CheckLineNumber(frame->f_code, frame->f_lasti,
3194 &bounds);
3195 if (line >= 0) {
Michael W. Hudson02ff6a92002-09-11 15:36:32 +00003196 frame->f_lineno = line;
Tim Peters8a5c3c72004-04-05 19:36:21 +00003197 result = call_trace(func, obj, frame,
Michael W. Hudson006c7522002-11-08 13:08:46 +00003198 PyTrace_LINE, Py_None);
Thomas Woutersce272b62007-09-19 21:19:28 +00003199 }
3200 *instr_lb = bounds.ap_lower;
3201 *instr_ub = bounds.ap_upper;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003202 }
Armin Rigobf57a142004-03-22 19:24:58 +00003203 else if (frame->f_lasti <= *instr_prev) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003204 result = call_trace(func, obj, frame, PyTrace_LINE, Py_None);
Armin Rigobf57a142004-03-22 19:24:58 +00003205 }
3206 *instr_prev = frame->f_lasti;
Michael W. Hudson006c7522002-11-08 13:08:46 +00003207 return result;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003208}
3209
Fred Drake5755ce62001-06-27 19:19:46 +00003210void
3211PyEval_SetProfile(Py_tracefunc func, PyObject *arg)
Fred Draked0838392001-06-16 21:02:31 +00003212{
Nicholas Bastine5662ae2004-03-24 22:22:12 +00003213 PyThreadState *tstate = PyThreadState_GET();
Fred Drake5755ce62001-06-27 19:19:46 +00003214 PyObject *temp = tstate->c_profileobj;
3215 Py_XINCREF(arg);
3216 tstate->c_profilefunc = NULL;
3217 tstate->c_profileobj = NULL;
Brett Cannon55fa66d2005-06-25 07:07:35 +00003218 /* Must make sure that tracing is not ignored if 'temp' is freed */
Fred Drake9e3ad782001-07-03 23:39:52 +00003219 tstate->use_tracing = tstate->c_tracefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00003220 Py_XDECREF(temp);
3221 tstate->c_profilefunc = func;
3222 tstate->c_profileobj = arg;
Brett Cannon55fa66d2005-06-25 07:07:35 +00003223 /* Flag that tracing or profiling is turned on */
Fred Drake9e3ad782001-07-03 23:39:52 +00003224 tstate->use_tracing = (func != NULL) || (tstate->c_tracefunc != NULL);
Fred Drake5755ce62001-06-27 19:19:46 +00003225}
3226
3227void
3228PyEval_SetTrace(Py_tracefunc func, PyObject *arg)
3229{
Nicholas Bastine5662ae2004-03-24 22:22:12 +00003230 PyThreadState *tstate = PyThreadState_GET();
Fred Drake5755ce62001-06-27 19:19:46 +00003231 PyObject *temp = tstate->c_traceobj;
3232 Py_XINCREF(arg);
3233 tstate->c_tracefunc = NULL;
3234 tstate->c_traceobj = NULL;
Brett Cannon55fa66d2005-06-25 07:07:35 +00003235 /* Must make sure that profiling is not ignored if 'temp' is freed */
Fred Drake9e3ad782001-07-03 23:39:52 +00003236 tstate->use_tracing = tstate->c_profilefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00003237 Py_XDECREF(temp);
3238 tstate->c_tracefunc = func;
3239 tstate->c_traceobj = arg;
Brett Cannon55fa66d2005-06-25 07:07:35 +00003240 /* Flag that tracing or profiling is turned on */
Fred Drake9e3ad782001-07-03 23:39:52 +00003241 tstate->use_tracing = ((func != NULL)
3242 || (tstate->c_profilefunc != NULL));
Fred Draked0838392001-06-16 21:02:31 +00003243}
3244
Guido van Rossumb209a111997-04-29 18:18:01 +00003245PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003246PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00003247{
Guido van Rossum6297a7a2003-02-19 15:53:17 +00003248 PyFrameObject *current_frame = PyEval_GetFrame();
Guido van Rossum6135a871995-01-09 17:53:26 +00003249 if (current_frame == NULL)
Nicholas Bastine5662ae2004-03-24 22:22:12 +00003250 return PyThreadState_GET()->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00003251 else
3252 return current_frame->f_builtins;
3253}
3254
Guido van Rossumb209a111997-04-29 18:18:01 +00003255PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003256PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00003257{
Guido van Rossum6297a7a2003-02-19 15:53:17 +00003258 PyFrameObject *current_frame = PyEval_GetFrame();
Guido van Rossum5b722181993-03-30 17:46:03 +00003259 if (current_frame == NULL)
3260 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00003261 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00003262 return current_frame->f_locals;
3263}
3264
Guido van Rossumb209a111997-04-29 18:18:01 +00003265PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003266PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003267{
Guido van Rossum6297a7a2003-02-19 15:53:17 +00003268 PyFrameObject *current_frame = PyEval_GetFrame();
Guido van Rossum3f5da241990-12-20 15:06:42 +00003269 if (current_frame == NULL)
3270 return NULL;
3271 else
3272 return current_frame->f_globals;
3273}
3274
Guido van Rossum6297a7a2003-02-19 15:53:17 +00003275PyFrameObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003276PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00003277{
Nicholas Bastine5662ae2004-03-24 22:22:12 +00003278 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossum6297a7a2003-02-19 15:53:17 +00003279 return _PyThreadState_GetFrame(tstate);
Guido van Rossume59214e1994-08-30 08:01:59 +00003280}
3281
Guido van Rossum6135a871995-01-09 17:53:26 +00003282int
Tim Peters5ba58662001-07-16 02:29:45 +00003283PyEval_MergeCompilerFlags(PyCompilerFlags *cf)
Jeremy Hylton061d1062001-03-22 02:32:48 +00003284{
Guido van Rossum6297a7a2003-02-19 15:53:17 +00003285 PyFrameObject *current_frame = PyEval_GetFrame();
Just van Rossum3aaf42c2003-02-10 08:21:10 +00003286 int result = cf->cf_flags != 0;
Tim Peters5ba58662001-07-16 02:29:45 +00003287
3288 if (current_frame != NULL) {
3289 const int codeflags = current_frame->f_code->co_flags;
Tim Peterse2c18e92001-08-17 20:47:47 +00003290 const int compilerflags = codeflags & PyCF_MASK;
3291 if (compilerflags) {
Tim Peters5ba58662001-07-16 02:29:45 +00003292 result = 1;
Tim Peterse2c18e92001-08-17 20:47:47 +00003293 cf->cf_flags |= compilerflags;
Tim Peters5ba58662001-07-16 02:29:45 +00003294 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00003295#if 0 /* future keyword */
Martin v. Löwis7198a522002-01-01 19:59:11 +00003296 if (codeflags & CO_GENERATOR_ALLOWED) {
3297 result = 1;
3298 cf->cf_flags |= CO_GENERATOR_ALLOWED;
3299 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00003300#endif
Tim Peters5ba58662001-07-16 02:29:45 +00003301 }
3302 return result;
Jeremy Hylton061d1062001-03-22 02:32:48 +00003303}
3304
Guido van Rossum3f5da241990-12-20 15:06:42 +00003305
Guido van Rossum681d79a1995-07-18 14:51:37 +00003306/* External interface to call any callable object.
3307 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00003308
Guido van Rossumd7ed6831997-08-30 15:02:50 +00003309#undef PyEval_CallObject
3310/* for backward compatibility: export this interface */
3311
Guido van Rossumb209a111997-04-29 18:18:01 +00003312PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003313PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00003314{
Guido van Rossumb209a111997-04-29 18:18:01 +00003315 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003316}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00003317#define PyEval_CallObject(func,arg) \
3318 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00003319
Guido van Rossumb209a111997-04-29 18:18:01 +00003320PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003321PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003322{
Jeremy Hylton52820442001-01-03 23:52:36 +00003323 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003324
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00003325 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003326 arg = PyTuple_New(0);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00003327 if (arg == NULL)
3328 return NULL;
3329 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003330 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003331 PyErr_SetString(PyExc_TypeError,
3332 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00003333 return NULL;
3334 }
3335 else
Guido van Rossumb209a111997-04-29 18:18:01 +00003336 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003337
Guido van Rossumb209a111997-04-29 18:18:01 +00003338 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003339 PyErr_SetString(PyExc_TypeError,
3340 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00003341 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00003342 return NULL;
3343 }
3344
Tim Peters6d6c1a32001-08-02 04:15:00 +00003345 result = PyObject_Call(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00003346 Py_DECREF(arg);
Jeremy Hylton52820442001-01-03 23:52:36 +00003347 return result;
3348}
3349
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00003350const char *
Tim Peters6d6c1a32001-08-02 04:15:00 +00003351PyEval_GetFuncName(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00003352{
3353 if (PyMethod_Check(func))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003354 return PyEval_GetFuncName(PyMethod_GET_FUNCTION(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00003355 else if (PyFunction_Check(func))
Martin v. Löwis5b222132007-06-10 09:51:05 +00003356 return PyUnicode_AsString(((PyFunctionObject*)func)->func_name);
Jeremy Hylton512a2372001-04-11 13:52:29 +00003357 else if (PyCFunction_Check(func))
3358 return ((PyCFunctionObject*)func)->m_ml->ml_name;
Guido van Rossum50e9fb92006-08-17 05:42:55 +00003359 else
Jeremy Hylton512a2372001-04-11 13:52:29 +00003360 return func->ob_type->tp_name;
Jeremy Hylton512a2372001-04-11 13:52:29 +00003361}
3362
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00003363const char *
Tim Peters6d6c1a32001-08-02 04:15:00 +00003364PyEval_GetFuncDesc(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00003365{
3366 if (PyMethod_Check(func))
3367 return "()";
3368 else if (PyFunction_Check(func))
3369 return "()";
3370 else if (PyCFunction_Check(func))
3371 return "()";
Guido van Rossum50e9fb92006-08-17 05:42:55 +00003372 else
Jeremy Hylton512a2372001-04-11 13:52:29 +00003373 return " object";
Jeremy Hylton512a2372001-04-11 13:52:29 +00003374}
3375
Neal Norwitzaddfe0c2002-11-10 14:33:26 +00003376static void
Jeremy Hylton192690e2002-08-16 18:36:11 +00003377err_args(PyObject *func, int flags, int nargs)
3378{
3379 if (flags & METH_NOARGS)
Tim Peters8a5c3c72004-04-05 19:36:21 +00003380 PyErr_Format(PyExc_TypeError,
Guido van Rossum86c659a2002-08-23 14:11:35 +00003381 "%.200s() takes no arguments (%d given)",
Tim Peters8a5c3c72004-04-05 19:36:21 +00003382 ((PyCFunctionObject *)func)->m_ml->ml_name,
Jeremy Hylton192690e2002-08-16 18:36:11 +00003383 nargs);
3384 else
Tim Peters8a5c3c72004-04-05 19:36:21 +00003385 PyErr_Format(PyExc_TypeError,
Guido van Rossum86c659a2002-08-23 14:11:35 +00003386 "%.200s() takes exactly one argument (%d given)",
Tim Peters8a5c3c72004-04-05 19:36:21 +00003387 ((PyCFunctionObject *)func)->m_ml->ml_name,
Jeremy Hylton192690e2002-08-16 18:36:11 +00003388 nargs);
3389}
3390
Armin Rigo1c2d7e52005-09-20 18:34:01 +00003391#define C_TRACE(x, call) \
Nicholas Bastind858a772004-06-25 23:31:06 +00003392if (tstate->use_tracing && tstate->c_profilefunc) { \
3393 if (call_trace(tstate->c_profilefunc, \
3394 tstate->c_profileobj, \
3395 tstate->frame, PyTrace_C_CALL, \
Armin Rigo1c2d7e52005-09-20 18:34:01 +00003396 func)) { \
3397 x = NULL; \
3398 } \
3399 else { \
3400 x = call; \
3401 if (tstate->c_profilefunc != NULL) { \
3402 if (x == NULL) { \
3403 call_trace_protected(tstate->c_profilefunc, \
3404 tstate->c_profileobj, \
3405 tstate->frame, PyTrace_C_EXCEPTION, \
3406 func); \
3407 /* XXX should pass (type, value, tb) */ \
3408 } else { \
3409 if (call_trace(tstate->c_profilefunc, \
3410 tstate->c_profileobj, \
3411 tstate->frame, PyTrace_C_RETURN, \
3412 func)) { \
3413 Py_DECREF(x); \
3414 x = NULL; \
3415 } \
3416 } \
Nicholas Bastinc69ebe82004-03-24 21:57:10 +00003417 } \
Nicholas Bastind858a772004-06-25 23:31:06 +00003418 } \
3419} else { \
Armin Rigo1c2d7e52005-09-20 18:34:01 +00003420 x = call; \
Nicholas Bastinc69ebe82004-03-24 21:57:10 +00003421 }
3422
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003423static PyObject *
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00003424call_function(PyObject ***pp_stack, int oparg
3425#ifdef WITH_TSC
3426 , uint64* pintr0, uint64* pintr1
3427#endif
3428 )
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003429{
3430 int na = oparg & 0xff;
3431 int nk = (oparg>>8) & 0xff;
3432 int n = na + 2 * nk;
3433 PyObject **pfunc = (*pp_stack) - n - 1;
3434 PyObject *func = *pfunc;
3435 PyObject *x, *w;
3436
Jeremy Hylton985eba52003-02-05 23:13:00 +00003437 /* Always dispatch PyCFunction first, because these are
3438 presumed to be the most frequent callable object.
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003439 */
3440 if (PyCFunction_Check(func) && nk == 0) {
3441 int flags = PyCFunction_GET_FLAGS(func);
Nicholas Bastind858a772004-06-25 23:31:06 +00003442 PyThreadState *tstate = PyThreadState_GET();
Raymond Hettingera7f56bc2004-06-26 04:34:33 +00003443
3444 PCALL(PCALL_CFUNCTION);
Jeremy Hylton192690e2002-08-16 18:36:11 +00003445 if (flags & (METH_NOARGS | METH_O)) {
3446 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
3447 PyObject *self = PyCFunction_GET_SELF(func);
Nicholas Bastinc69ebe82004-03-24 21:57:10 +00003448 if (flags & METH_NOARGS && na == 0) {
Armin Rigo1c2d7e52005-09-20 18:34:01 +00003449 C_TRACE(x, (*meth)(self,NULL));
Nicholas Bastinc69ebe82004-03-24 21:57:10 +00003450 }
Jeremy Hylton192690e2002-08-16 18:36:11 +00003451 else if (flags & METH_O && na == 1) {
3452 PyObject *arg = EXT_POP(*pp_stack);
Armin Rigo1c2d7e52005-09-20 18:34:01 +00003453 C_TRACE(x, (*meth)(self,arg));
Jeremy Hylton192690e2002-08-16 18:36:11 +00003454 Py_DECREF(arg);
3455 }
3456 else {
3457 err_args(func, flags, na);
3458 x = NULL;
3459 }
3460 }
3461 else {
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003462 PyObject *callargs;
3463 callargs = load_args(pp_stack, na);
Michael W. Hudson75eabd22005-01-18 15:56:11 +00003464 READ_TIMESTAMP(*pintr0);
Armin Rigo1c2d7e52005-09-20 18:34:01 +00003465 C_TRACE(x, PyCFunction_Call(func,callargs,NULL));
Michael W. Hudson75eabd22005-01-18 15:56:11 +00003466 READ_TIMESTAMP(*pintr1);
Tim Peters8a5c3c72004-04-05 19:36:21 +00003467 Py_XDECREF(callargs);
3468 }
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003469 } else {
3470 if (PyMethod_Check(func) && PyMethod_GET_SELF(func) != NULL) {
3471 /* optimize access to bound methods */
3472 PyObject *self = PyMethod_GET_SELF(func);
Jeremy Hylton985eba52003-02-05 23:13:00 +00003473 PCALL(PCALL_METHOD);
3474 PCALL(PCALL_BOUND_METHOD);
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003475 Py_INCREF(self);
3476 func = PyMethod_GET_FUNCTION(func);
3477 Py_INCREF(func);
3478 Py_DECREF(*pfunc);
3479 *pfunc = self;
3480 na++;
3481 n++;
3482 } else
3483 Py_INCREF(func);
Michael W. Hudson75eabd22005-01-18 15:56:11 +00003484 READ_TIMESTAMP(*pintr0);
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003485 if (PyFunction_Check(func))
3486 x = fast_function(func, pp_stack, n, na, nk);
Tim Peters8a5c3c72004-04-05 19:36:21 +00003487 else
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003488 x = do_call(func, pp_stack, na, nk);
Michael W. Hudson75eabd22005-01-18 15:56:11 +00003489 READ_TIMESTAMP(*pintr1);
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003490 Py_DECREF(func);
3491 }
Tim Peters8a5c3c72004-04-05 19:36:21 +00003492
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003493 /* Clear the stack of the function object. Also removes
3494 the arguments in case they weren't consumed already
3495 (fast_function() and err_args() leave them on the stack).
Thomas Wouters7f597322006-03-01 05:32:33 +00003496 */
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003497 while ((*pp_stack) > pfunc) {
3498 w = EXT_POP(*pp_stack);
3499 Py_DECREF(w);
Jeremy Hylton985eba52003-02-05 23:13:00 +00003500 PCALL(PCALL_POP);
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003501 }
3502 return x;
3503}
3504
Jeremy Hylton192690e2002-08-16 18:36:11 +00003505/* The fast_function() function optimize calls for which no argument
Jeremy Hylton52820442001-01-03 23:52:36 +00003506 tuple is necessary; the objects are passed directly from the stack.
Jeremy Hylton985eba52003-02-05 23:13:00 +00003507 For the simplest case -- a function that takes only positional
3508 arguments and is called with only positional arguments -- it
3509 inlines the most primitive frame setup code from
3510 PyEval_EvalCodeEx(), which vastly reduces the checks that must be
3511 done before evaluating the frame.
Jeremy Hylton52820442001-01-03 23:52:36 +00003512*/
3513
3514static PyObject *
Guido van Rossumac7be682001-01-17 15:42:30 +00003515fast_function(PyObject *func, PyObject ***pp_stack, int n, int na, int nk)
Jeremy Hylton52820442001-01-03 23:52:36 +00003516{
Jeremy Hylton985eba52003-02-05 23:13:00 +00003517 PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003518 PyObject *globals = PyFunction_GET_GLOBALS(func);
3519 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
Guido van Rossum4f72a782006-10-27 23:31:49 +00003520 PyObject *kwdefs = PyFunction_GET_KW_DEFAULTS(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003521 PyObject **d = NULL;
3522 int nd = 0;
3523
Jeremy Hylton985eba52003-02-05 23:13:00 +00003524 PCALL(PCALL_FUNCTION);
3525 PCALL(PCALL_FAST_FUNCTION);
Guido van Rossum4f72a782006-10-27 23:31:49 +00003526 if (argdefs == NULL && co->co_argcount == n &&
3527 co->co_kwonlyargcount == 0 && nk==0 &&
Jeremy Hylton985eba52003-02-05 23:13:00 +00003528 co->co_flags == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE)) {
3529 PyFrameObject *f;
3530 PyObject *retval = NULL;
3531 PyThreadState *tstate = PyThreadState_GET();
3532 PyObject **fastlocals, **stack;
3533 int i;
3534
3535 PCALL(PCALL_FASTER_FUNCTION);
3536 assert(globals != NULL);
3537 /* XXX Perhaps we should create a specialized
3538 PyFrame_New() that doesn't take locals, but does
3539 take builtins without sanity checking them.
3540 */
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00003541 assert(tstate != NULL);
Jeremy Hylton985eba52003-02-05 23:13:00 +00003542 f = PyFrame_New(tstate, co, globals, NULL);
3543 if (f == NULL)
3544 return NULL;
3545
3546 fastlocals = f->f_localsplus;
3547 stack = (*pp_stack) - n;
3548
3549 for (i = 0; i < n; i++) {
3550 Py_INCREF(*stack);
3551 fastlocals[i] = *stack++;
3552 }
Phillip J. Eby0d6615f2005-08-02 00:46:46 +00003553 retval = PyEval_EvalFrameEx(f,0);
Jeremy Hylton985eba52003-02-05 23:13:00 +00003554 ++tstate->recursion_depth;
3555 Py_DECREF(f);
3556 --tstate->recursion_depth;
3557 return retval;
3558 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003559 if (argdefs != NULL) {
3560 d = &PyTuple_GET_ITEM(argdefs, 0);
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00003561 nd = Py_Size(argdefs);
Jeremy Hylton52820442001-01-03 23:52:36 +00003562 }
Jeremy Hylton985eba52003-02-05 23:13:00 +00003563 return PyEval_EvalCodeEx(co, globals,
3564 (PyObject *)NULL, (*pp_stack)-n, na,
Guido van Rossum4f72a782006-10-27 23:31:49 +00003565 (*pp_stack)-2*nk, nk, d, nd, kwdefs,
Jeremy Hylton985eba52003-02-05 23:13:00 +00003566 PyFunction_GET_CLOSURE(func));
Jeremy Hylton52820442001-01-03 23:52:36 +00003567}
3568
3569static PyObject *
Ka-Ping Yee20579702001-01-15 22:14:16 +00003570update_keyword_args(PyObject *orig_kwdict, int nk, PyObject ***pp_stack,
3571 PyObject *func)
Jeremy Hylton52820442001-01-03 23:52:36 +00003572{
3573 PyObject *kwdict = NULL;
3574 if (orig_kwdict == NULL)
3575 kwdict = PyDict_New();
3576 else {
3577 kwdict = PyDict_Copy(orig_kwdict);
3578 Py_DECREF(orig_kwdict);
3579 }
3580 if (kwdict == NULL)
3581 return NULL;
Raymond Hettinger5bed4562004-04-10 23:34:17 +00003582 while (--nk >= 0) {
Jeremy Hylton52820442001-01-03 23:52:36 +00003583 int err;
3584 PyObject *value = EXT_POP(*pp_stack);
3585 PyObject *key = EXT_POP(*pp_stack);
3586 if (PyDict_GetItem(kwdict, key) != NULL) {
Thomas Woutersce272b62007-09-19 21:19:28 +00003587 PyErr_Format(PyExc_TypeError,
3588 "%.200s%s got multiple values "
3589 "for keyword argument '%.200s'",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003590 PyEval_GetFuncName(func),
3591 PyEval_GetFuncDesc(func),
Neal Norwitzda059e32007-08-26 05:33:45 +00003592 PyUnicode_AsString(key));
Jeremy Hylton52820442001-01-03 23:52:36 +00003593 Py_DECREF(key);
3594 Py_DECREF(value);
3595 Py_DECREF(kwdict);
3596 return NULL;
3597 }
3598 err = PyDict_SetItem(kwdict, key, value);
3599 Py_DECREF(key);
3600 Py_DECREF(value);
3601 if (err) {
3602 Py_DECREF(kwdict);
3603 return NULL;
3604 }
3605 }
3606 return kwdict;
3607}
3608
3609static PyObject *
3610update_star_args(int nstack, int nstar, PyObject *stararg,
3611 PyObject ***pp_stack)
3612{
3613 PyObject *callargs, *w;
3614
3615 callargs = PyTuple_New(nstack + nstar);
3616 if (callargs == NULL) {
3617 return NULL;
3618 }
3619 if (nstar) {
3620 int i;
3621 for (i = 0; i < nstar; i++) {
3622 PyObject *a = PyTuple_GET_ITEM(stararg, i);
3623 Py_INCREF(a);
3624 PyTuple_SET_ITEM(callargs, nstack + i, a);
3625 }
3626 }
Raymond Hettinger5bed4562004-04-10 23:34:17 +00003627 while (--nstack >= 0) {
Jeremy Hylton52820442001-01-03 23:52:36 +00003628 w = EXT_POP(*pp_stack);
3629 PyTuple_SET_ITEM(callargs, nstack, w);
3630 }
3631 return callargs;
3632}
3633
3634static PyObject *
3635load_args(PyObject ***pp_stack, int na)
3636{
3637 PyObject *args = PyTuple_New(na);
3638 PyObject *w;
3639
3640 if (args == NULL)
3641 return NULL;
Raymond Hettinger5bed4562004-04-10 23:34:17 +00003642 while (--na >= 0) {
Jeremy Hylton52820442001-01-03 23:52:36 +00003643 w = EXT_POP(*pp_stack);
3644 PyTuple_SET_ITEM(args, na, w);
3645 }
3646 return args;
3647}
3648
3649static PyObject *
3650do_call(PyObject *func, PyObject ***pp_stack, int na, int nk)
3651{
3652 PyObject *callargs = NULL;
3653 PyObject *kwdict = NULL;
3654 PyObject *result = NULL;
3655
3656 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003657 kwdict = update_keyword_args(NULL, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003658 if (kwdict == NULL)
3659 goto call_fail;
3660 }
3661 callargs = load_args(pp_stack, na);
3662 if (callargs == NULL)
3663 goto call_fail;
Jeremy Hylton985eba52003-02-05 23:13:00 +00003664#ifdef CALL_PROFILE
3665 /* At this point, we have to look at the type of func to
3666 update the call stats properly. Do it here so as to avoid
3667 exposing the call stats machinery outside ceval.c
3668 */
3669 if (PyFunction_Check(func))
3670 PCALL(PCALL_FUNCTION);
3671 else if (PyMethod_Check(func))
3672 PCALL(PCALL_METHOD);
3673 else if (PyType_Check(func))
3674 PCALL(PCALL_TYPE);
3675 else
3676 PCALL(PCALL_OTHER);
3677#endif
Tim Peters6d6c1a32001-08-02 04:15:00 +00003678 result = PyObject_Call(func, callargs, kwdict);
Thomas Wouters7ce29ca2007-09-19 21:56:32 +00003679call_fail:
Jeremy Hylton52820442001-01-03 23:52:36 +00003680 Py_XDECREF(callargs);
3681 Py_XDECREF(kwdict);
3682 return result;
3683}
3684
3685static PyObject *
3686ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)
3687{
3688 int nstar = 0;
3689 PyObject *callargs = NULL;
3690 PyObject *stararg = NULL;
3691 PyObject *kwdict = NULL;
3692 PyObject *result = NULL;
3693
3694 if (flags & CALL_FLAG_KW) {
3695 kwdict = EXT_POP(*pp_stack);
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003696 if (!PyDict_Check(kwdict)) {
3697 PyObject *d;
3698 d = PyDict_New();
3699 if (d == NULL)
3700 goto ext_call_fail;
3701 if (PyDict_Update(d, kwdict) != 0) {
3702 Py_DECREF(d);
3703 /* PyDict_Update raises attribute
3704 * error (percolated from an attempt
3705 * to get 'keys' attribute) instead of
3706 * a type error if its second argument
3707 * is not a mapping.
3708 */
3709 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
3710 PyErr_Format(PyExc_TypeError,
3711 "%.200s%.200s argument after ** "
3712 "must be a mapping, not %.200s",
3713 PyEval_GetFuncName(func),
3714 PyEval_GetFuncDesc(func),
3715 kwdict->ob_type->tp_name);
3716 }
3717 goto ext_call_fail;
3718 }
3719 Py_DECREF(kwdict);
3720 kwdict = d;
Jeremy Hylton52820442001-01-03 23:52:36 +00003721 }
3722 }
3723 if (flags & CALL_FLAG_VAR) {
3724 stararg = EXT_POP(*pp_stack);
3725 if (!PyTuple_Check(stararg)) {
3726 PyObject *t = NULL;
3727 t = PySequence_Tuple(stararg);
3728 if (t == NULL) {
Jeremy Hylton512a2372001-04-11 13:52:29 +00003729 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
3730 PyErr_Format(PyExc_TypeError,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003731 "%.200s%.200s argument after * "
3732 "must be a sequence, not %200s",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003733 PyEval_GetFuncName(func),
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003734 PyEval_GetFuncDesc(func),
3735 stararg->ob_type->tp_name);
Jeremy Hylton512a2372001-04-11 13:52:29 +00003736 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003737 goto ext_call_fail;
3738 }
3739 Py_DECREF(stararg);
3740 stararg = t;
3741 }
3742 nstar = PyTuple_GET_SIZE(stararg);
3743 }
3744 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003745 kwdict = update_keyword_args(kwdict, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003746 if (kwdict == NULL)
3747 goto ext_call_fail;
3748 }
3749 callargs = update_star_args(na, nstar, stararg, pp_stack);
3750 if (callargs == NULL)
3751 goto ext_call_fail;
Jeremy Hylton985eba52003-02-05 23:13:00 +00003752#ifdef CALL_PROFILE
3753 /* At this point, we have to look at the type of func to
3754 update the call stats properly. Do it here so as to avoid
3755 exposing the call stats machinery outside ceval.c
3756 */
3757 if (PyFunction_Check(func))
3758 PCALL(PCALL_FUNCTION);
3759 else if (PyMethod_Check(func))
3760 PCALL(PCALL_METHOD);
3761 else if (PyType_Check(func))
3762 PCALL(PCALL_TYPE);
3763 else
3764 PCALL(PCALL_OTHER);
3765#endif
Tim Peters6d6c1a32001-08-02 04:15:00 +00003766 result = PyObject_Call(func, callargs, kwdict);
Thomas Woutersce272b62007-09-19 21:19:28 +00003767ext_call_fail:
Jeremy Hylton52820442001-01-03 23:52:36 +00003768 Py_XDECREF(callargs);
3769 Py_XDECREF(kwdict);
3770 Py_XDECREF(stararg);
3771 return result;
3772}
3773
Guido van Rossum38fff8c2006-03-07 18:50:55 +00003774/* Extract a slice index from a PyInt or PyLong or an object with the
3775 nb_index slot defined, and store in *pi.
3776 Silently reduce values larger than PY_SSIZE_T_MAX to PY_SSIZE_T_MAX,
3777 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 +00003778 Return 0 on error, 1 on success.
Tim Peterscb479e72001-12-16 19:11:44 +00003779*/
Tim Petersb5196382001-12-16 19:44:20 +00003780/* Note: If v is NULL, return success without storing into *pi. This
3781 is because_PyEval_SliceIndex() is called by apply_slice(), which can be
3782 called by the SLICE opcode with v and/or w equal to NULL.
Tim Peterscb479e72001-12-16 19:11:44 +00003783*/
Guido van Rossum20c6add2000-05-08 14:06:50 +00003784int
Martin v. Löwis18e16552006-02-15 17:27:45 +00003785_PyEval_SliceIndex(PyObject *v, Py_ssize_t *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003786{
Tim Petersb5196382001-12-16 19:44:20 +00003787 if (v != NULL) {
Martin v. Löwisdde99d22006-02-17 15:57:41 +00003788 Py_ssize_t x;
Guido van Rossumddefaf32007-01-14 03:31:43 +00003789 if (PyInt_CheckExact(v)) {
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00003790 /* XXX(nnorwitz): I think PyInt_AS_LONG is correct,
3791 however, it looks like it should be AsSsize_t.
3792 There should be a comment here explaining why.
3793 */
3794 x = PyInt_AS_LONG(v);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003795 }
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00003796 else if (PyIndex_Check(v)) {
3797 x = PyNumber_AsSsize_t(v, NULL);
Guido van Rossum38fff8c2006-03-07 18:50:55 +00003798 if (x == -1 && PyErr_Occurred())
3799 return 0;
3800 }
3801 else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003802 PyErr_SetString(PyExc_TypeError,
Guido van Rossum38fff8c2006-03-07 18:50:55 +00003803 "slice indices must be integers or "
3804 "None or have an __index__ method");
Guido van Rossum20c6add2000-05-08 14:06:50 +00003805 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003806 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00003807 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003808 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00003809 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003810}
3811
Guido van Rossum486364b2007-06-30 05:01:58 +00003812#define CANNOT_CATCH_MSG "catching classes that do not inherit from "\
Brett Cannon39590462007-02-26 22:01:14 +00003813 "BaseException is not allowed"
Brett Cannonf74225d2007-02-26 21:10:16 +00003814
Guido van Rossumb209a111997-04-29 18:18:01 +00003815static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003816cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003817{
Guido van Rossumac7be682001-01-17 15:42:30 +00003818 int res = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003819 switch (op) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00003820 case PyCmp_IS:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003821 res = (v == w);
Raymond Hettinger4bad9ba2003-01-19 05:08:13 +00003822 break;
3823 case PyCmp_IS_NOT:
3824 res = (v != w);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003825 break;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003826 case PyCmp_IN:
Raymond Hettinger4bad9ba2003-01-19 05:08:13 +00003827 res = PySequence_Contains(w, v);
3828 if (res < 0)
3829 return NULL;
3830 break;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003831 case PyCmp_NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003832 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003833 if (res < 0)
3834 return NULL;
Raymond Hettinger4bad9ba2003-01-19 05:08:13 +00003835 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003836 break;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003837 case PyCmp_EXC_MATCH:
Thomas Wouters9fe394c2007-02-05 01:24:16 +00003838 if (PyTuple_Check(w)) {
3839 Py_ssize_t i, length;
3840 length = PyTuple_Size(w);
3841 for (i = 0; i < length; i += 1) {
3842 PyObject *exc = PyTuple_GET_ITEM(w, i);
Brett Cannon39590462007-02-26 22:01:14 +00003843 if (!PyExceptionClass_Check(exc)) {
3844 PyErr_SetString(PyExc_TypeError,
3845 CANNOT_CATCH_MSG);
Brett Cannonf74225d2007-02-26 21:10:16 +00003846 return NULL;
Thomas Wouters9fe394c2007-02-05 01:24:16 +00003847 }
3848 }
3849 }
3850 else {
Brett Cannon39590462007-02-26 22:01:14 +00003851 if (!PyExceptionClass_Check(w)) {
3852 PyErr_SetString(PyExc_TypeError,
3853 CANNOT_CATCH_MSG);
Brett Cannonf74225d2007-02-26 21:10:16 +00003854 return NULL;
Thomas Wouters9fe394c2007-02-05 01:24:16 +00003855 }
3856 }
Barry Warsaw4249f541997-08-22 21:26:19 +00003857 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003858 break;
3859 default:
Guido van Rossumac7be682001-01-17 15:42:30 +00003860 return PyObject_RichCompare(v, w, op);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003861 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003862 v = res ? Py_True : Py_False;
3863 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003864 return v;
3865}
3866
Thomas Wouters52152252000-08-17 22:55:00 +00003867static PyObject *
3868import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003869{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003870 PyObject *x;
3871
3872 x = PyObject_GetAttr(v, name);
3873 if (x == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
Walter Dörwald573c08c2007-05-25 15:46:59 +00003874 PyErr_Format(PyExc_ImportError, "cannot import name %S", name);
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003875 }
Thomas Wouters52152252000-08-17 22:55:00 +00003876 return x;
3877}
Guido van Rossumac7be682001-01-17 15:42:30 +00003878
Thomas Wouters52152252000-08-17 22:55:00 +00003879static int
3880import_all_from(PyObject *locals, PyObject *v)
3881{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003882 PyObject *all = PyObject_GetAttrString(v, "__all__");
3883 PyObject *dict, *name, *value;
3884 int skip_leading_underscores = 0;
3885 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00003886
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003887 if (all == NULL) {
3888 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3889 return -1; /* Unexpected error */
3890 PyErr_Clear();
3891 dict = PyObject_GetAttrString(v, "__dict__");
3892 if (dict == NULL) {
3893 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3894 return -1;
3895 PyErr_SetString(PyExc_ImportError,
3896 "from-import-* object has no __dict__ and no __all__");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003897 return -1;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003898 }
3899 all = PyMapping_Keys(dict);
3900 Py_DECREF(dict);
3901 if (all == NULL)
3902 return -1;
3903 skip_leading_underscores = 1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003904 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003905
3906 for (pos = 0, err = 0; ; pos++) {
3907 name = PySequence_GetItem(all, pos);
3908 if (name == NULL) {
3909 if (!PyErr_ExceptionMatches(PyExc_IndexError))
3910 err = -1;
3911 else
3912 PyErr_Clear();
3913 break;
3914 }
3915 if (skip_leading_underscores &&
Martin v. Löwis5b222132007-06-10 09:51:05 +00003916 PyUnicode_Check(name) &&
3917 PyUnicode_AS_UNICODE(name)[0] == '_')
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003918 {
3919 Py_DECREF(name);
3920 continue;
3921 }
3922 value = PyObject_GetAttr(v, name);
3923 if (value == NULL)
3924 err = -1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003925 else if (PyDict_CheckExact(locals))
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003926 err = PyDict_SetItem(locals, name, value);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003927 else
3928 err = PyObject_SetItem(locals, name, value);
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003929 Py_DECREF(name);
3930 Py_XDECREF(value);
3931 if (err != 0)
3932 break;
3933 }
3934 Py_DECREF(all);
3935 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003936}
3937
Guido van Rossumac7be682001-01-17 15:42:30 +00003938static void
Neal Norwitzda059e32007-08-26 05:33:45 +00003939format_exc_check_arg(PyObject *exc, const char *format_str, PyObject *obj)
Paul Prescode68140d2000-08-30 20:25:01 +00003940{
Neal Norwitzda059e32007-08-26 05:33:45 +00003941 const char *obj_str;
Paul Prescode68140d2000-08-30 20:25:01 +00003942
3943 if (!obj)
3944 return;
3945
Neal Norwitzda059e32007-08-26 05:33:45 +00003946 obj_str = PyUnicode_AsString(obj);
Paul Prescode68140d2000-08-30 20:25:01 +00003947 if (!obj_str)
3948 return;
3949
3950 PyErr_Format(exc, format_str, obj_str);
3951}
Guido van Rossum950361c1997-01-24 13:49:28 +00003952
Raymond Hettinger52a21b82004-08-06 18:43:09 +00003953static PyObject *
3954string_concatenate(PyObject *v, PyObject *w,
3955 PyFrameObject *f, unsigned char *next_instr)
3956{
3957 /* This function implements 'variable += expr' when both arguments
3958 are strings. */
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003959 Py_ssize_t v_len = PyString_GET_SIZE(v);
3960 Py_ssize_t w_len = PyString_GET_SIZE(w);
3961 Py_ssize_t new_len = v_len + w_len;
3962 if (new_len < 0) {
3963 PyErr_SetString(PyExc_OverflowError,
3964 "strings are too large to concat");
3965 return NULL;
3966 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003967
Raymond Hettinger52a21b82004-08-06 18:43:09 +00003968 if (v->ob_refcnt == 2) {
3969 /* In the common case, there are 2 references to the value
3970 * stored in 'variable' when the += is performed: one on the
3971 * value stack (in 'v') and one still stored in the 'variable'.
3972 * We try to delete the variable now to reduce the refcnt to 1.
3973 */
3974 switch (*next_instr) {
3975 case STORE_FAST:
3976 {
3977 int oparg = PEEKARG();
3978 PyObject **fastlocals = f->f_localsplus;
3979 if (GETLOCAL(oparg) == v)
3980 SETLOCAL(oparg, NULL);
3981 break;
3982 }
3983 case STORE_DEREF:
3984 {
Thomas Wouters477c8d52006-05-27 19:21:47 +00003985 PyObject **freevars = f->f_localsplus + f->f_code->co_nlocals;
Raymond Hettinger52a21b82004-08-06 18:43:09 +00003986 PyObject *c = freevars[PEEKARG()];
3987 if (PyCell_GET(c) == v)
3988 PyCell_Set(c, NULL);
3989 break;
3990 }
3991 case STORE_NAME:
3992 {
3993 PyObject *names = f->f_code->co_names;
3994 PyObject *name = GETITEM(names, PEEKARG());
3995 PyObject *locals = f->f_locals;
3996 if (PyDict_CheckExact(locals) &&
3997 PyDict_GetItem(locals, name) == v) {
3998 if (PyDict_DelItem(locals, name) != 0) {
3999 PyErr_Clear();
4000 }
4001 }
4002 break;
4003 }
4004 }
4005 }
4006
Armin Rigo618fbf52004-08-07 20:58:32 +00004007 if (v->ob_refcnt == 1 && !PyString_CHECK_INTERNED(v)) {
Raymond Hettinger52a21b82004-08-06 18:43:09 +00004008 /* Now we own the last reference to 'v', so we can resize it
4009 * in-place.
4010 */
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004011 if (_PyString_Resize(&v, new_len) != 0) {
Raymond Hettinger52a21b82004-08-06 18:43:09 +00004012 /* XXX if _PyString_Resize() fails, 'v' has been
4013 * deallocated so it cannot be put back into 'variable'.
4014 * The MemoryError is raised when there is no value in
4015 * 'variable', which might (very remotely) be a cause
4016 * of incompatibilities.
4017 */
4018 return NULL;
4019 }
4020 /* copy 'w' into the newly allocated area of 'v' */
4021 memcpy(PyString_AS_STRING(v) + v_len,
4022 PyString_AS_STRING(w), w_len);
4023 return v;
4024 }
4025 else {
4026 /* When in-place resizing is not an option. */
4027 PyString_Concat(&v, w);
4028 return v;
4029 }
4030}
4031
Guido van Rossum950361c1997-01-24 13:49:28 +00004032#ifdef DYNAMIC_EXECUTION_PROFILE
4033
Skip Montanarof118cb12001-10-15 20:51:38 +00004034static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004035getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00004036{
4037 int i;
4038 PyObject *l = PyList_New(256);
4039 if (l == NULL) return NULL;
4040 for (i = 0; i < 256; i++) {
4041 PyObject *x = PyInt_FromLong(a[i]);
4042 if (x == NULL) {
4043 Py_DECREF(l);
4044 return NULL;
4045 }
4046 PyList_SetItem(l, i, x);
4047 }
4048 for (i = 0; i < 256; i++)
4049 a[i] = 0;
4050 return l;
4051}
4052
4053PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004054_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00004055{
4056#ifndef DXPAIRS
4057 return getarray(dxp);
4058#else
4059 int i;
4060 PyObject *l = PyList_New(257);
4061 if (l == NULL) return NULL;
4062 for (i = 0; i < 257; i++) {
4063 PyObject *x = getarray(dxpairs[i]);
4064 if (x == NULL) {
4065 Py_DECREF(l);
4066 return NULL;
4067 }
4068 PyList_SetItem(l, i, x);
4069 }
4070 return l;
4071#endif
4072}
4073
4074#endif