blob: be804ad3d0a93a525d4835248d309dfbe0376c1b [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;
Armin Rigo2b3eb402003-10-28 12:05:48 +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 }
472 _Py_CheckRecursionLimit = recursion_limit;
473 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
Raymond Hettinger7c958652004-04-06 10:11:10 +0000487static enum why_code do_raise(PyObject *, 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) {
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +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:
1468 u = v = w = NULL;
1469 switch (oparg) {
1470 case 3:
1471 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001472 /* Fallthrough */
1473 case 2:
1474 v = POP(); /* value */
1475 /* Fallthrough */
1476 case 1:
1477 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001478 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001479 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001480 break;
1481 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001482 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001483 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001484 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001485 break;
1486 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001487 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001488
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001489 case STORE_LOCALS:
1490 x = POP();
1491 v = f->f_locals;
1492 Py_XDECREF(v);
1493 f->f_locals = x;
1494 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001495
Guido van Rossum374a9221991-04-04 10:40:29 +00001496 case RETURN_VALUE:
1497 retval = POP();
1498 why = WHY_RETURN;
Raymond Hettinger1dd83092004-02-06 18:32:33 +00001499 goto fast_block_end;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001500
Tim Peters5ca576e2001-06-18 22:08:13 +00001501 case YIELD_VALUE:
1502 retval = POP();
Tim Peters8c963692001-06-23 05:26:56 +00001503 f->f_stacktop = stack_pointer;
Tim Peters5ca576e2001-06-18 22:08:13 +00001504 why = WHY_YIELD;
Raymond Hettinger1dd83092004-02-06 18:32:33 +00001505 goto fast_yield;
Tim Peters5ca576e2001-06-18 22:08:13 +00001506
Guido van Rossum374a9221991-04-04 10:40:29 +00001507 case POP_BLOCK:
1508 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001509 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001510 while (STACK_LEVEL() > b->b_level) {
1511 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001512 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001513 }
1514 }
Raymond Hettinger7eddd782004-04-07 14:38:08 +00001515 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001516
Guido van Rossum374a9221991-04-04 10:40:29 +00001517 case END_FINALLY:
1518 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001519 if (PyInt_Check(v)) {
Raymond Hettinger7c958652004-04-06 10:11:10 +00001520 why = (enum why_code) PyInt_AS_LONG(v);
Tim Peters8a5c3c72004-04-05 19:36:21 +00001521 assert(why != WHY_YIELD);
Raymond Hettingerc8aa08b2004-04-11 14:59:33 +00001522 if (why == WHY_RETURN ||
1523 why == WHY_CONTINUE)
Guido van Rossum374a9221991-04-04 10:40:29 +00001524 retval = POP();
1525 }
Brett Cannonf74225d2007-02-26 21:10:16 +00001526 else if (PyExceptionClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001527 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001528 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001529 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001530 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001531 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001532 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001533 else if (v != Py_None) {
1534 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001535 "'finally' pops bad exception");
1536 why = WHY_EXCEPTION;
1537 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001538 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001539 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001540
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001541 case LOAD_BUILD_CLASS:
1542 x = PyDict_GetItemString(f->f_builtins,
1543 "__build_class__");
1544 if (x == NULL) {
1545 PyErr_SetString(PyExc_ImportError,
1546 "__build_class__ not found");
1547 break;
1548 }
1549 Py_INCREF(x);
1550 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001551 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001552
Guido van Rossum374a9221991-04-04 10:40:29 +00001553 case STORE_NAME:
Skip Montanaro496e6582002-08-06 17:47:40 +00001554 w = GETITEM(names, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001555 v = POP();
Raymond Hettinger467a6982004-04-07 11:39:21 +00001556 if ((x = f->f_locals) != NULL) {
Raymond Hettinger66bd2332004-08-02 08:30:07 +00001557 if (PyDict_CheckExact(x))
Raymond Hettinger214b1c32004-07-02 06:41:07 +00001558 err = PyDict_SetItem(x, w, v);
1559 else
1560 err = PyObject_SetItem(x, w, v);
Raymond Hettinger467a6982004-04-07 11:39:21 +00001561 Py_DECREF(v);
Raymond Hettinger7eddd782004-04-07 14:38:08 +00001562 if (err == 0) continue;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001563 break;
1564 }
Raymond Hettinger467a6982004-04-07 11:39:21 +00001565 PyErr_Format(PyExc_SystemError,
1566 "no locals found when storing %s",
1567 PyObject_REPR(w));
Guido van Rossum374a9221991-04-04 10:40:29 +00001568 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001569
Guido van Rossum374a9221991-04-04 10:40:29 +00001570 case DELETE_NAME:
Skip Montanaro496e6582002-08-06 17:47:40 +00001571 w = GETITEM(names, oparg);
Raymond Hettinger467a6982004-04-07 11:39:21 +00001572 if ((x = f->f_locals) != NULL) {
Raymond Hettinger214b1c32004-07-02 06:41:07 +00001573 if ((err = PyObject_DelItem(x, w)) != 0)
Raymond Hettinger467a6982004-04-07 11:39:21 +00001574 format_exc_check_arg(PyExc_NameError,
1575 NAME_ERROR_MSG ,w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001576 break;
1577 }
Raymond Hettinger467a6982004-04-07 11:39:21 +00001578 PyErr_Format(PyExc_SystemError,
1579 "no locals when deleting %s",
1580 PyObject_REPR(w));
Guido van Rossum374a9221991-04-04 10:40:29 +00001581 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001582
Raymond Hettinger7dc52212003-03-16 20:14:44 +00001583 PREDICTED_WITH_ARG(UNPACK_SEQUENCE);
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001584 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001585 v = POP();
Raymond Hettingerf114a3a2004-03-08 23:25:30 +00001586 if (PyTuple_CheckExact(v) && PyTuple_GET_SIZE(v) == oparg) {
1587 PyObject **items = ((PyTupleObject *)v)->ob_item;
1588 while (oparg--) {
1589 w = items[oparg];
1590 Py_INCREF(w);
1591 PUSH(w);
Barry Warsawe42b18f1997-08-25 22:13:04 +00001592 }
Raymond Hettinger7eddd782004-04-07 14:38:08 +00001593 Py_DECREF(v);
1594 continue;
Raymond Hettingerf114a3a2004-03-08 23:25:30 +00001595 } else if (PyList_CheckExact(v) && PyList_GET_SIZE(v) == oparg) {
1596 PyObject **items = ((PyListObject *)v)->ob_item;
1597 while (oparg--) {
1598 w = items[oparg];
1599 Py_INCREF(w);
1600 PUSH(w);
Barry Warsawe42b18f1997-08-25 22:13:04 +00001601 }
Guido van Rossum0368b722007-05-11 16:50:42 +00001602 } else if (unpack_iterable(v, oparg, -1,
Guido van Rossumd8faa362007-04-27 19:54:29 +00001603 stack_pointer + oparg)) {
Tim Petersd6d010b2001-06-21 02:49:55 +00001604 stack_pointer += oparg;
Guido van Rossumd8faa362007-04-27 19:54:29 +00001605 } else {
1606 /* unpack_iterable() raised an exception */
Barry Warsawe42b18f1997-08-25 22:13:04 +00001607 why = WHY_EXCEPTION;
Tim Peters8b13b3e2001-09-30 05:58:42 +00001608 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001609 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001610 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001611
Guido van Rossum0368b722007-05-11 16:50:42 +00001612 case UNPACK_EX:
1613 {
1614 int totalargs = 1 + (oparg & 0xFF) + (oparg >> 8);
1615 v = POP();
1616
1617 if (unpack_iterable(v, oparg & 0xFF, oparg >> 8,
1618 stack_pointer + totalargs)) {
1619 stack_pointer += totalargs;
1620 } else {
1621 why = WHY_EXCEPTION;
1622 }
1623 Py_DECREF(v);
1624 break;
1625 }
1626
Guido van Rossum374a9221991-04-04 10:40:29 +00001627 case STORE_ATTR:
Skip Montanaro496e6582002-08-06 17:47:40 +00001628 w = GETITEM(names, oparg);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001629 v = TOP();
1630 u = SECOND();
1631 STACKADJ(-2);
Guido van Rossumb209a111997-04-29 18:18:01 +00001632 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1633 Py_DECREF(v);
1634 Py_DECREF(u);
Raymond Hettinger7eddd782004-04-07 14:38:08 +00001635 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001636 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001637
Guido van Rossum374a9221991-04-04 10:40:29 +00001638 case DELETE_ATTR:
Skip Montanaro496e6582002-08-06 17:47:40 +00001639 w = GETITEM(names, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001640 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001641 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1642 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001643 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001644 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001645
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001646 case STORE_GLOBAL:
Skip Montanaro496e6582002-08-06 17:47:40 +00001647 w = GETITEM(names, oparg);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001648 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001649 err = PyDict_SetItem(f->f_globals, w, v);
1650 Py_DECREF(v);
Raymond Hettinger7eddd782004-04-07 14:38:08 +00001651 if (err == 0) continue;
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001652 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001653
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001654 case DELETE_GLOBAL:
Skip Montanaro496e6582002-08-06 17:47:40 +00001655 w = GETITEM(names, oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001656 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001657 format_exc_check_arg(
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001658 PyExc_NameError, GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001659 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001660
Guido van Rossum374a9221991-04-04 10:40:29 +00001661 case LOAD_NAME:
Skip Montanaro496e6582002-08-06 17:47:40 +00001662 w = GETITEM(names, oparg);
Raymond Hettinger214b1c32004-07-02 06:41:07 +00001663 if ((v = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001664 PyErr_Format(PyExc_SystemError,
1665 "no locals when loading %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001666 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001667 break;
1668 }
Michael W. Hudsona3711f72004-08-02 14:50:43 +00001669 if (PyDict_CheckExact(v)) {
Raymond Hettinger214b1c32004-07-02 06:41:07 +00001670 x = PyDict_GetItem(v, w);
Michael W. Hudsona3711f72004-08-02 14:50:43 +00001671 Py_XINCREF(x);
1672 }
Raymond Hettinger214b1c32004-07-02 06:41:07 +00001673 else {
1674 x = PyObject_GetItem(v, w);
1675 if (x == NULL && PyErr_Occurred()) {
1676 if (!PyErr_ExceptionMatches(PyExc_KeyError))
1677 break;
1678 PyErr_Clear();
1679 }
1680 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001681 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001682 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001683 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001684 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001685 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001686 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001687 PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001688 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001689 break;
1690 }
1691 }
Michael W. Hudsona3711f72004-08-02 14:50:43 +00001692 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001693 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001694 PUSH(x);
Raymond Hettinger467a6982004-04-07 11:39:21 +00001695 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001696
Guido van Rossum374a9221991-04-04 10:40:29 +00001697 case LOAD_GLOBAL:
Skip Montanaro496e6582002-08-06 17:47:40 +00001698 w = GETITEM(names, oparg);
Neal Norwitzda059e32007-08-26 05:33:45 +00001699 if (PyUnicode_CheckExact(w)) {
Guido van Rossumd8dbf842002-08-19 21:17:53 +00001700 /* Inline the PyDict_GetItem() calls.
1701 WARNING: this is an extreme speed hack.
1702 Do not try this at home. */
Neal Norwitzda059e32007-08-26 05:33:45 +00001703 long hash = ((PyUnicodeObject *)w)->hash;
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001704 if (hash != -1) {
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001705 PyDictObject *d;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001706 PyDictEntry *e;
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001707 d = (PyDictObject *)(f->f_globals);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001708 e = d->ma_lookup(d, w, hash);
1709 if (e == NULL) {
1710 x = NULL;
1711 break;
1712 }
1713 x = e->me_value;
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001714 if (x != NULL) {
1715 Py_INCREF(x);
1716 PUSH(x);
1717 continue;
1718 }
1719 d = (PyDictObject *)(f->f_builtins);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001720 e = d->ma_lookup(d, w, hash);
1721 if (e == NULL) {
1722 x = NULL;
1723 break;
1724 }
1725 x = e->me_value;
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001726 if (x != NULL) {
1727 Py_INCREF(x);
1728 PUSH(x);
1729 continue;
1730 }
1731 goto load_global_error;
1732 }
1733 }
1734 /* This is the un-inlined version of the code above */
Guido van Rossumb209a111997-04-29 18:18:01 +00001735 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001736 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001737 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001738 if (x == NULL) {
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001739 load_global_error:
Paul Prescode68140d2000-08-30 20:25:01 +00001740 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001741 PyExc_NameError,
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001742 GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001743 break;
1744 }
1745 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001746 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001747 PUSH(x);
Raymond Hettinger7eddd782004-04-07 14:38:08 +00001748 continue;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001749
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001750 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001751 x = GETLOCAL(oparg);
Raymond Hettinger467a6982004-04-07 11:39:21 +00001752 if (x != NULL) {
1753 SETLOCAL(oparg, NULL);
1754 continue;
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001755 }
Raymond Hettinger467a6982004-04-07 11:39:21 +00001756 format_exc_check_arg(
1757 PyExc_UnboundLocalError,
1758 UNBOUNDLOCAL_ERROR_MSG,
1759 PyTuple_GetItem(co->co_varnames, oparg)
1760 );
1761 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001762
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001763 case LOAD_CLOSURE:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001764 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001765 Py_INCREF(x);
1766 PUSH(x);
Raymond Hettinger7eddd782004-04-07 14:38:08 +00001767 if (x != NULL) continue;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001768 break;
1769
1770 case LOAD_DEREF:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001771 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001772 w = PyCell_Get(x);
Raymond Hettinger467a6982004-04-07 11:39:21 +00001773 if (w != NULL) {
1774 PUSH(w);
1775 continue;
Jeremy Hylton2524d692001-02-05 17:23:16 +00001776 }
Raymond Hettinger467a6982004-04-07 11:39:21 +00001777 err = -1;
1778 /* Don't stomp existing exception */
1779 if (PyErr_Occurred())
1780 break;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001781 if (oparg < PyTuple_GET_SIZE(co->co_cellvars)) {
1782 v = PyTuple_GET_ITEM(co->co_cellvars,
Raymond Hettinger467a6982004-04-07 11:39:21 +00001783 oparg);
1784 format_exc_check_arg(
1785 PyExc_UnboundLocalError,
1786 UNBOUNDLOCAL_ERROR_MSG,
1787 v);
1788 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00001789 v = PyTuple_GET_ITEM(
Raymond Hettinger467a6982004-04-07 11:39:21 +00001790 co->co_freevars,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001791 oparg - PyTuple_GET_SIZE(co->co_cellvars));
Raymond Hettinger467a6982004-04-07 11:39:21 +00001792 format_exc_check_arg(
1793 PyExc_NameError,
1794 UNBOUNDFREE_ERROR_MSG,
1795 v);
1796 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001797 break;
1798
1799 case STORE_DEREF:
1800 w = POP();
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001801 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001802 PyCell_Set(x, w);
Jeremy Hylton30c9f392001-03-13 01:58:22 +00001803 Py_DECREF(w);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001804 continue;
1805
Guido van Rossum374a9221991-04-04 10:40:29 +00001806 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001807 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001808 if (x != NULL) {
Raymond Hettinger5bed4562004-04-10 23:34:17 +00001809 for (; --oparg >= 0;) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001810 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001811 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001812 }
1813 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001814 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001815 }
1816 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001817
Guido van Rossum374a9221991-04-04 10:40:29 +00001818 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001819 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001820 if (x != NULL) {
Raymond Hettinger5bed4562004-04-10 23:34:17 +00001821 for (; --oparg >= 0;) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001822 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001823 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001824 }
1825 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001826 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001827 }
1828 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001829
Guido van Rossum86e58e22006-08-28 15:27:34 +00001830 case BUILD_SET:
1831 x = PySet_New(NULL);
1832 if (x != NULL) {
1833 for (; --oparg >= 0;) {
1834 w = POP();
1835 if (err == 0)
1836 err = PySet_Add(x, w);
1837 Py_DECREF(w);
1838 }
1839 if (err != 0) {
1840 Py_DECREF(x);
1841 break;
1842 }
1843 PUSH(x);
1844 continue;
1845 }
1846 break;
1847
Guido van Rossum374a9221991-04-04 10:40:29 +00001848 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001849 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001850 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001851 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001852 break;
Thomas Wouters00e41de2007-02-23 19:56:57 +00001853
1854 case MAKE_BYTES:
1855 w = POP();
1856 if (PyString_Check(w))
1857 x = PyBytes_FromStringAndSize(
1858 PyString_AS_STRING(w),
1859 PyString_GET_SIZE(w));
1860 else
1861 x = NULL;
1862 Py_DECREF(w);
1863 PUSH(x);
1864 if (x != NULL) continue;
1865 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001866
Guido van Rossum374a9221991-04-04 10:40:29 +00001867 case LOAD_ATTR:
Skip Montanaro496e6582002-08-06 17:47:40 +00001868 w = GETITEM(names, oparg);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001869 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001870 x = PyObject_GetAttr(v, w);
1871 Py_DECREF(v);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001872 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001873 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001874 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001875
Guido van Rossum374a9221991-04-04 10:40:29 +00001876 case COMPARE_OP:
1877 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001878 v = TOP();
Raymond Hettinger4bad9ba2003-01-19 05:08:13 +00001879 if (PyInt_CheckExact(w) && PyInt_CheckExact(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001880 /* INLINE: cmp(int, int) */
1881 register long a, b;
1882 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001883 a = PyInt_AS_LONG(v);
1884 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001885 switch (oparg) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00001886 case PyCmp_LT: res = a < b; break;
1887 case PyCmp_LE: res = a <= b; break;
1888 case PyCmp_EQ: res = a == b; break;
1889 case PyCmp_NE: res = a != b; break;
1890 case PyCmp_GT: res = a > b; break;
1891 case PyCmp_GE: res = a >= b; break;
1892 case PyCmp_IS: res = v == w; break;
1893 case PyCmp_IS_NOT: res = v != w; break;
Guido van Rossumc12da691997-07-17 23:12:42 +00001894 default: goto slow_compare;
1895 }
1896 x = res ? Py_True : Py_False;
1897 Py_INCREF(x);
1898 }
1899 else {
1900 slow_compare:
1901 x = cmp_outcome(oparg, v, w);
1902 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001903 Py_DECREF(v);
1904 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001905 SET_TOP(x);
Raymond Hettingerf606f872003-03-16 03:11:04 +00001906 if (x == NULL) break;
1907 PREDICT(JUMP_IF_FALSE);
1908 PREDICT(JUMP_IF_TRUE);
1909 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001910
Guido van Rossum374a9221991-04-04 10:40:29 +00001911 case IMPORT_NAME:
Skip Montanaro496e6582002-08-06 17:47:40 +00001912 w = GETITEM(names, oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001913 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001914 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001915 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001916 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001917 break;
1918 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00001919 v = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001920 u = TOP();
Thomas Woutersf7f438b2006-02-28 16:09:29 +00001921 if (PyInt_AsLong(u) != -1 || PyErr_Occurred())
1922 w = PyTuple_Pack(5,
1923 w,
1924 f->f_globals,
1925 f->f_locals == NULL ?
1926 Py_None : f->f_locals,
1927 v,
1928 u);
1929 else
1930 w = PyTuple_Pack(4,
1931 w,
1932 f->f_globals,
1933 f->f_locals == NULL ?
1934 Py_None : f->f_locals,
1935 v);
1936 Py_DECREF(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001937 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001938 if (w == NULL) {
Raymond Hettinger663004b2003-01-09 15:24:30 +00001939 u = POP();
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001940 x = NULL;
1941 break;
1942 }
Michael W. Hudson75eabd22005-01-18 15:56:11 +00001943 READ_TIMESTAMP(intr0);
Guido van Rossumb209a111997-04-29 18:18:01 +00001944 x = PyEval_CallObject(x, w);
Michael W. Hudson75eabd22005-01-18 15:56:11 +00001945 READ_TIMESTAMP(intr1);
Guido van Rossumb209a111997-04-29 18:18:01 +00001946 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001947 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001948 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001949 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001950
Thomas Wouters52152252000-08-17 22:55:00 +00001951 case IMPORT_STAR:
1952 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001953 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001954 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001955 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001956 "no locals found during 'import *'");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001957 break;
1958 }
Michael W. Hudson75eabd22005-01-18 15:56:11 +00001959 READ_TIMESTAMP(intr0);
Thomas Wouters52152252000-08-17 22:55:00 +00001960 err = import_all_from(x, v);
Michael W. Hudson75eabd22005-01-18 15:56:11 +00001961 READ_TIMESTAMP(intr1);
Guido van Rossumb209a111997-04-29 18:18:01 +00001962 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00001963 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001964 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001965 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001966
Thomas Wouters52152252000-08-17 22:55:00 +00001967 case IMPORT_FROM:
Skip Montanaro496e6582002-08-06 17:47:40 +00001968 w = GETITEM(names, oparg);
Thomas Wouters52152252000-08-17 22:55:00 +00001969 v = TOP();
Michael W. Hudson75eabd22005-01-18 15:56:11 +00001970 READ_TIMESTAMP(intr0);
Thomas Wouters52152252000-08-17 22:55:00 +00001971 x = import_from(v, w);
Michael W. Hudson75eabd22005-01-18 15:56:11 +00001972 READ_TIMESTAMP(intr1);
Thomas Wouters52152252000-08-17 22:55:00 +00001973 PUSH(x);
1974 if (x != NULL) continue;
1975 break;
1976
Guido van Rossum374a9221991-04-04 10:40:29 +00001977 case JUMP_FORWARD:
1978 JUMPBY(oparg);
Neil Schemenauerc4b570f2003-06-01 19:21:12 +00001979 goto fast_next_opcode;
Guido van Rossumac7be682001-01-17 15:42:30 +00001980
Raymond Hettingerf606f872003-03-16 03:11:04 +00001981 PREDICTED_WITH_ARG(JUMP_IF_FALSE);
Guido van Rossum374a9221991-04-04 10:40:29 +00001982 case JUMP_IF_FALSE:
Raymond Hettinger21012b82003-02-26 18:11:50 +00001983 w = TOP();
Raymond Hettingerf606f872003-03-16 03:11:04 +00001984 if (w == Py_True) {
1985 PREDICT(POP_TOP);
Neil Schemenauerc4b570f2003-06-01 19:21:12 +00001986 goto fast_next_opcode;
Raymond Hettingerf606f872003-03-16 03:11:04 +00001987 }
Raymond Hettinger21012b82003-02-26 18:11:50 +00001988 if (w == Py_False) {
1989 JUMPBY(oparg);
Neil Schemenauerc4b570f2003-06-01 19:21:12 +00001990 goto fast_next_opcode;
Raymond Hettinger21012b82003-02-26 18:11:50 +00001991 }
1992 err = PyObject_IsTrue(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001993 if (err > 0)
1994 err = 0;
1995 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001996 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001997 else
1998 break;
1999 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00002000
Raymond Hettingerf606f872003-03-16 03:11:04 +00002001 PREDICTED_WITH_ARG(JUMP_IF_TRUE);
Guido van Rossum374a9221991-04-04 10:40:29 +00002002 case JUMP_IF_TRUE:
Raymond Hettinger21012b82003-02-26 18:11:50 +00002003 w = TOP();
Raymond Hettingerf606f872003-03-16 03:11:04 +00002004 if (w == Py_False) {
2005 PREDICT(POP_TOP);
Neil Schemenauerc4b570f2003-06-01 19:21:12 +00002006 goto fast_next_opcode;
Raymond Hettingerf606f872003-03-16 03:11:04 +00002007 }
Raymond Hettinger21012b82003-02-26 18:11:50 +00002008 if (w == Py_True) {
2009 JUMPBY(oparg);
Neil Schemenauerc4b570f2003-06-01 19:21:12 +00002010 goto fast_next_opcode;
Raymond Hettinger21012b82003-02-26 18:11:50 +00002011 }
2012 err = PyObject_IsTrue(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002013 if (err > 0) {
2014 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00002015 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002016 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002017 else if (err == 0)
2018 ;
2019 else
2020 break;
2021 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00002022
Raymond Hettingerfba1cfc2004-03-12 16:33:17 +00002023 PREDICTED_WITH_ARG(JUMP_ABSOLUTE);
Guido van Rossum374a9221991-04-04 10:40:29 +00002024 case JUMP_ABSOLUTE:
2025 JUMPTO(oparg);
Neil Schemenauerca2a2f12003-05-30 23:59:44 +00002026 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00002027
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002028 case GET_ITER:
2029 /* before: [obj]; after [getiter(obj)] */
Raymond Hettinger663004b2003-01-09 15:24:30 +00002030 v = TOP();
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002031 x = PyObject_GetIter(v);
2032 Py_DECREF(v);
2033 if (x != NULL) {
Raymond Hettinger663004b2003-01-09 15:24:30 +00002034 SET_TOP(x);
Raymond Hettinger7dc52212003-03-16 20:14:44 +00002035 PREDICT(FOR_ITER);
Guido van Rossum213c7a62001-04-23 14:08:49 +00002036 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002037 }
Raymond Hettinger8bb90a52003-01-14 12:43:10 +00002038 STACKADJ(-1);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002039 break;
2040
Raymond Hettinger7dc52212003-03-16 20:14:44 +00002041 PREDICTED_WITH_ARG(FOR_ITER);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002042 case FOR_ITER:
2043 /* before: [iter]; after: [iter, iter()] *or* [] */
2044 v = TOP();
Raymond Hettingerdb0de9e2004-03-12 08:41:36 +00002045 x = (*v->ob_type->tp_iternext)(v);
Guido van Rossum213c7a62001-04-23 14:08:49 +00002046 if (x != NULL) {
2047 PUSH(x);
Raymond Hettinger7dc52212003-03-16 20:14:44 +00002048 PREDICT(STORE_FAST);
2049 PREDICT(UNPACK_SEQUENCE);
Guido van Rossum213c7a62001-04-23 14:08:49 +00002050 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002051 }
Raymond Hettingerdb0de9e2004-03-12 08:41:36 +00002052 if (PyErr_Occurred()) {
2053 if (!PyErr_ExceptionMatches(PyExc_StopIteration))
2054 break;
2055 PyErr_Clear();
Guido van Rossum213c7a62001-04-23 14:08:49 +00002056 }
Raymond Hettingerdb0de9e2004-03-12 08:41:36 +00002057 /* iterator ended normally */
2058 x = v = POP();
2059 Py_DECREF(v);
2060 JUMPBY(oparg);
2061 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002062
Raymond Hettinger2d783e92004-03-12 09:12:22 +00002063 case BREAK_LOOP:
2064 why = WHY_BREAK;
2065 goto fast_block_end;
2066
2067 case CONTINUE_LOOP:
2068 retval = PyInt_FromLong(oparg);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002069 if (!retval) {
2070 x = NULL;
2071 break;
2072 }
Raymond Hettinger2d783e92004-03-12 09:12:22 +00002073 why = WHY_CONTINUE;
2074 goto fast_block_end;
2075
Guido van Rossum374a9221991-04-04 10:40:29 +00002076 case SETUP_LOOP:
2077 case SETUP_EXCEPT:
2078 case SETUP_FINALLY:
Thomas Wouters9fe394c2007-02-05 01:24:16 +00002079 /* NOTE: If you add any new block-setup opcodes that are
2080 not try/except/finally handlers, you may need to
2081 update the PyGen_NeedsFinalizing() function. */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002082
Guido van Rossumb209a111997-04-29 18:18:01 +00002083 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002084 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002085 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00002086
Guido van Rossumc2e20742006-02-27 22:32:47 +00002087 case WITH_CLEANUP:
2088 {
2089 /* TOP is the context.__exit__ bound method.
2090 Below that are 1-3 values indicating how/why
2091 we entered the finally clause:
2092 - SECOND = None
Guido van Rossumf6694362006-03-10 02:28:35 +00002093 - (SECOND, THIRD) = (WHY_{RETURN,CONTINUE}), retval
Guido van Rossumc2e20742006-02-27 22:32:47 +00002094 - SECOND = WHY_*; no retval below it
2095 - (SECOND, THIRD, FOURTH) = exc_info()
2096 In the last case, we must call
2097 TOP(SECOND, THIRD, FOURTH)
2098 otherwise we must call
2099 TOP(None, None, None)
Guido van Rossum1a5e21e2006-02-28 21:57:43 +00002100
2101 In addition, if the stack represents an exception,
Guido van Rossumf6694362006-03-10 02:28:35 +00002102 *and* the function call returns a 'true' value, we
2103 "zap" this information, to prevent END_FINALLY from
2104 re-raising the exception. (But non-local gotos
2105 should still be resumed.)
Guido van Rossumc2e20742006-02-27 22:32:47 +00002106 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002107
Guido van Rossumc2e20742006-02-27 22:32:47 +00002108 x = TOP();
2109 u = SECOND();
2110 if (PyInt_Check(u) || u == Py_None) {
2111 u = v = w = Py_None;
2112 }
2113 else {
2114 v = THIRD();
2115 w = FOURTH();
2116 }
Guido van Rossumf6694362006-03-10 02:28:35 +00002117 /* XXX Not the fastest way to call it... */
2118 x = PyObject_CallFunctionObjArgs(x, u, v, w, NULL);
2119 if (x == NULL)
2120 break; /* Go to error exit */
2121 if (u != Py_None && PyObject_IsTrue(x)) {
2122 /* There was an exception and a true return */
2123 Py_DECREF(x);
2124 x = TOP(); /* Again */
2125 STACKADJ(-3);
2126 Py_INCREF(Py_None);
2127 SET_TOP(Py_None);
2128 Py_DECREF(x);
2129 Py_DECREF(u);
2130 Py_DECREF(v);
2131 Py_DECREF(w);
2132 } else {
2133 /* Let END_FINALLY do its thing */
2134 Py_DECREF(x);
2135 x = POP();
2136 Py_DECREF(x);
2137 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00002138 break;
2139 }
2140
Guido van Rossumf10570b1995-07-07 22:53:21 +00002141 case CALL_FUNCTION:
Armin Rigo8817fcd2004-06-17 10:22:40 +00002142 {
2143 PyObject **sp;
Jeremy Hylton985eba52003-02-05 23:13:00 +00002144 PCALL(PCALL_ALL);
Armin Rigo8817fcd2004-06-17 10:22:40 +00002145 sp = stack_pointer;
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00002146#ifdef WITH_TSC
Armin Rigo8817fcd2004-06-17 10:22:40 +00002147 x = call_function(&sp, oparg, &intr0, &intr1);
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00002148#else
Armin Rigo8817fcd2004-06-17 10:22:40 +00002149 x = call_function(&sp, oparg);
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00002150#endif
Armin Rigo8817fcd2004-06-17 10:22:40 +00002151 stack_pointer = sp;
Jeremy Hyltone8c04322002-08-16 17:47:26 +00002152 PUSH(x);
2153 if (x != NULL)
2154 continue;
2155 break;
Armin Rigo8817fcd2004-06-17 10:22:40 +00002156 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002157
Jeremy Hylton76901512000-03-28 23:49:17 +00002158 case CALL_FUNCTION_VAR:
2159 case CALL_FUNCTION_KW:
2160 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00002161 {
Jeremy Hylton76901512000-03-28 23:49:17 +00002162 int na = oparg & 0xff;
2163 int nk = (oparg>>8) & 0xff;
2164 int flags = (opcode - CALL_FUNCTION) & 3;
Jeremy Hylton52820442001-01-03 23:52:36 +00002165 int n = na + 2 * nk;
Armin Rigo8817fcd2004-06-17 10:22:40 +00002166 PyObject **pfunc, *func, **sp;
Jeremy Hylton985eba52003-02-05 23:13:00 +00002167 PCALL(PCALL_ALL);
Jeremy Hylton52820442001-01-03 23:52:36 +00002168 if (flags & CALL_FLAG_VAR)
2169 n++;
2170 if (flags & CALL_FLAG_KW)
2171 n++;
2172 pfunc = stack_pointer - n - 1;
2173 func = *pfunc;
Jeremy Hylton52820442001-01-03 23:52:36 +00002174
Guido van Rossumac7be682001-01-17 15:42:30 +00002175 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00002176 && PyMethod_GET_SELF(func) != NULL) {
2177 PyObject *self = PyMethod_GET_SELF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002178 Py_INCREF(self);
Jeremy Hylton52820442001-01-03 23:52:36 +00002179 func = PyMethod_GET_FUNCTION(func);
2180 Py_INCREF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002181 Py_DECREF(*pfunc);
2182 *pfunc = self;
2183 na++;
2184 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00002185 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00002186 Py_INCREF(func);
Armin Rigo8817fcd2004-06-17 10:22:40 +00002187 sp = stack_pointer;
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002188 READ_TIMESTAMP(intr0);
Armin Rigo8817fcd2004-06-17 10:22:40 +00002189 x = ext_do_call(func, &sp, flags, na, nk);
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002190 READ_TIMESTAMP(intr1);
Armin Rigo8817fcd2004-06-17 10:22:40 +00002191 stack_pointer = sp;
Jeremy Hylton76901512000-03-28 23:49:17 +00002192 Py_DECREF(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00002193
Jeremy Hylton76901512000-03-28 23:49:17 +00002194 while (stack_pointer > pfunc) {
Jeremy Hylton52820442001-01-03 23:52:36 +00002195 w = POP();
2196 Py_DECREF(w);
Jeremy Hylton76901512000-03-28 23:49:17 +00002197 }
2198 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00002199 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00002200 continue;
Jeremy Hylton76901512000-03-28 23:49:17 +00002201 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002202 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002203
Guido van Rossum0240b922007-02-26 21:23:50 +00002204 case MAKE_CLOSURE:
Guido van Rossum681d79a1995-07-18 14:51:37 +00002205 case MAKE_FUNCTION:
Guido van Rossum4f72a782006-10-27 23:31:49 +00002206 {
2207 int posdefaults = oparg & 0xff;
2208 int kwdefaults = (oparg>>8) & 0xff;
Neal Norwitzc1505362006-12-28 06:47:50 +00002209 int num_annotations = (oparg >> 16) & 0x7fff;
Guido van Rossum4f72a782006-10-27 23:31:49 +00002210
Guido van Rossum681d79a1995-07-18 14:51:37 +00002211 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00002212 x = PyFunction_New(v, f->f_globals);
2213 Py_DECREF(v);
Guido van Rossum0240b922007-02-26 21:23:50 +00002214
2215 if (x != NULL && opcode == MAKE_CLOSURE) {
2216 v = POP();
2217 err = PyFunction_SetClosure(x, v);
2218 Py_DECREF(v);
2219 }
Neal Norwitzc1505362006-12-28 06:47:50 +00002220
2221 if (x != NULL && num_annotations > 0) {
2222 Py_ssize_t name_ix;
2223 u = POP(); /* names of args with annotations */
2224 v = PyDict_New();
2225 if (v == NULL) {
2226 Py_DECREF(x);
2227 x = NULL;
2228 break;
2229 }
2230 name_ix = PyTuple_Size(u);
2231 assert(num_annotations == name_ix+1);
2232 while (name_ix > 0) {
2233 --name_ix;
2234 t = PyTuple_GET_ITEM(u, name_ix);
2235 w = POP();
2236 /* XXX(nnorwitz): check for errors */
2237 PyDict_SetItem(v, t, w);
2238 Py_DECREF(w);
2239 }
2240
2241 err = PyFunction_SetAnnotations(x, v);
2242 Py_DECREF(v);
2243 Py_DECREF(u);
2244 }
2245
Guido van Rossum681d79a1995-07-18 14:51:37 +00002246 /* XXX Maybe this should be a separate opcode? */
Guido van Rossum4f72a782006-10-27 23:31:49 +00002247 if (x != NULL && posdefaults > 0) {
2248 v = PyTuple_New(posdefaults);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002249 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002250 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002251 x = NULL;
2252 break;
2253 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00002254 while (--posdefaults >= 0) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002255 w = POP();
Guido van Rossum4f72a782006-10-27 23:31:49 +00002256 PyTuple_SET_ITEM(v, posdefaults, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002257 }
2258 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00002259 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002260 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00002261 if (x != NULL && kwdefaults > 0) {
2262 v = PyDict_New();
2263 if (v == NULL) {
2264 Py_DECREF(x);
2265 x = NULL;
2266 break;
2267 }
2268 while (--kwdefaults >= 0) {
2269 w = POP(); /* default value */
2270 u = POP(); /* kw only arg name */
Neal Norwitzc1505362006-12-28 06:47:50 +00002271 /* XXX(nnorwitz): check for errors */
Guido van Rossum4f72a782006-10-27 23:31:49 +00002272 PyDict_SetItem(v, u, w);
Georg Brandl94ab0002007-02-26 13:58:18 +00002273 Py_DECREF(w);
2274 Py_DECREF(u);
Guido van Rossum4f72a782006-10-27 23:31:49 +00002275 }
2276 err = PyFunction_SetKwDefaults(x, v);
2277 Py_DECREF(v);
2278 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002279 PUSH(x);
2280 break;
Guido van Rossum4f72a782006-10-27 23:31:49 +00002281 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002282
2283 case BUILD_SLICE:
2284 if (oparg == 3)
2285 w = POP();
2286 else
2287 w = NULL;
2288 v = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00002289 u = TOP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00002290 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00002291 Py_DECREF(u);
2292 Py_DECREF(v);
2293 Py_XDECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00002294 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002295 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00002296 break;
2297
Fred Drakeef8ace32000-08-24 00:32:09 +00002298 case EXTENDED_ARG:
2299 opcode = NEXTOP();
Raymond Hettinger5bed4562004-04-10 23:34:17 +00002300 oparg = oparg<<16 | NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +00002301 goto dispatch_opcode;
Guido van Rossum8861b741996-07-30 16:49:37 +00002302
Guido van Rossum374a9221991-04-04 10:40:29 +00002303 default:
2304 fprintf(stderr,
2305 "XXX lineno: %d, opcode: %d\n",
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002306 PyCode_Addr2Line(f->f_code, f->f_lasti),
2307 opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00002308 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00002309 why = WHY_EXCEPTION;
2310 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002311
2312#ifdef CASE_TOO_BIG
2313 }
2314#endif
2315
Guido van Rossum374a9221991-04-04 10:40:29 +00002316 } /* switch */
2317
2318 on_error:
Guido van Rossumac7be682001-01-17 15:42:30 +00002319
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002320 READ_TIMESTAMP(inst1);
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00002321
Guido van Rossum374a9221991-04-04 10:40:29 +00002322 /* Quickly continue if no error occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002323
Guido van Rossum374a9221991-04-04 10:40:29 +00002324 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002325 if (err == 0 && x != NULL) {
2326#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002327 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002328 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002329 fprintf(stderr,
2330 "XXX undetected error\n");
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00002331 else {
2332#endif
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002333 READ_TIMESTAMP(loop1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002334 continue; /* Normal, fast path */
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00002335#ifdef CHECKEXC
2336 }
2337#endif
Guido van Rossum681d79a1995-07-18 14:51:37 +00002338 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002339 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00002340 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00002341 err = 0;
2342 }
2343
Guido van Rossum374a9221991-04-04 10:40:29 +00002344 /* Double-check exception status */
Guido van Rossumac7be682001-01-17 15:42:30 +00002345
Raymond Hettingerc8aa08b2004-04-11 14:59:33 +00002346 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002347 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002348 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002349 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00002350 why = WHY_EXCEPTION;
2351 }
2352 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002353#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00002354 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002355 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002356 if (PyErr_Occurred()) {
Jeremy Hylton904ed862003-11-05 17:29:35 +00002357 char buf[1024];
2358 sprintf(buf, "Stack unwind with exception "
2359 "set and why=%d", why);
2360 Py_FatalError(buf);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002361 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002362 }
2363#endif
2364
2365 /* Log traceback info if this is a real exception */
Guido van Rossumac7be682001-01-17 15:42:30 +00002366
Guido van Rossum374a9221991-04-04 10:40:29 +00002367 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002368 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002369
Fred Drake8f51f542001-10-04 14:48:42 +00002370 if (tstate->c_tracefunc != NULL)
2371 call_exc_trace(tstate->c_tracefunc,
2372 tstate->c_traceobj, f);
Guido van Rossum014518f1998-11-23 21:09:51 +00002373 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002374
Guido van Rossum374a9221991-04-04 10:40:29 +00002375 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
Guido van Rossumac7be682001-01-17 15:42:30 +00002376
Guido van Rossum374a9221991-04-04 10:40:29 +00002377 if (why == WHY_RERAISE)
2378 why = WHY_EXCEPTION;
2379
2380 /* Unwind stacks if a (pseudo) exception occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002381
Raymond Hettinger1dd83092004-02-06 18:32:33 +00002382fast_block_end:
Tim Peters8a5c3c72004-04-05 19:36:21 +00002383 while (why != WHY_NOT && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002384 PyTryBlock *b = PyFrame_BlockPop(f);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002385
Tim Peters8a5c3c72004-04-05 19:36:21 +00002386 assert(why != WHY_YIELD);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002387 if (b->b_type == SETUP_LOOP && why == WHY_CONTINUE) {
2388 /* For a continue inside a try block,
2389 don't pop the block for the loop. */
Thomas Wouters1ee64222001-09-24 19:32:01 +00002390 PyFrame_BlockSetup(f, b->b_type, b->b_handler,
2391 b->b_level);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002392 why = WHY_NOT;
2393 JUMPTO(PyInt_AS_LONG(retval));
2394 Py_DECREF(retval);
2395 break;
2396 }
2397
Guido van Rossum374a9221991-04-04 10:40:29 +00002398 while (STACK_LEVEL() > b->b_level) {
2399 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002400 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002401 }
2402 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2403 why = WHY_NOT;
2404 JUMPTO(b->b_handler);
2405 break;
2406 }
2407 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00002408 (b->b_type == SETUP_EXCEPT &&
2409 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002410 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002411 PyObject *exc, *val, *tb;
2412 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002413 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002414 val = Py_None;
2415 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00002416 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002417 /* Make the raw exception data
2418 available to the handler,
2419 so a program can emulate the
2420 Python main loop. Don't do
2421 this for 'finally'. */
2422 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00002423 PyErr_NormalizeException(
2424 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002425 set_exc_info(tstate,
2426 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002427 }
Jeremy Hyltonc6314892001-09-26 19:24:45 +00002428 if (tb == NULL) {
2429 Py_INCREF(Py_None);
2430 PUSH(Py_None);
2431 } else
2432 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002433 PUSH(val);
2434 PUSH(exc);
2435 }
2436 else {
Raymond Hettinger06032cb2004-04-06 09:37:35 +00002437 if (why & (WHY_RETURN | WHY_CONTINUE))
Guido van Rossum374a9221991-04-04 10:40:29 +00002438 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00002439 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00002440 PUSH(v);
2441 }
2442 why = WHY_NOT;
2443 JUMPTO(b->b_handler);
2444 break;
2445 }
2446 } /* unwind stack */
2447
2448 /* End the loop if we still have an error (or return) */
Guido van Rossumac7be682001-01-17 15:42:30 +00002449
Guido van Rossum374a9221991-04-04 10:40:29 +00002450 if (why != WHY_NOT)
2451 break;
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002452 READ_TIMESTAMP(loop1);
Guido van Rossumac7be682001-01-17 15:42:30 +00002453
Guido van Rossum374a9221991-04-04 10:40:29 +00002454 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00002455
Tim Peters8a5c3c72004-04-05 19:36:21 +00002456 assert(why != WHY_YIELD);
2457 /* Pop remaining stack entries. */
2458 while (!EMPTY()) {
2459 v = POP();
2460 Py_XDECREF(v);
Guido van Rossum35974fb2001-12-06 21:28:18 +00002461 }
2462
Tim Peters8a5c3c72004-04-05 19:36:21 +00002463 if (why != WHY_RETURN)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002464 retval = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002465
Raymond Hettinger1dd83092004-02-06 18:32:33 +00002466fast_yield:
Fred Drake9e3ad782001-07-03 23:39:52 +00002467 if (tstate->use_tracing) {
Barry Warsawe2eca0b2005-08-15 18:14:19 +00002468 if (tstate->c_tracefunc) {
2469 if (why == WHY_RETURN || why == WHY_YIELD) {
2470 if (call_trace(tstate->c_tracefunc,
2471 tstate->c_traceobj, f,
2472 PyTrace_RETURN, retval)) {
2473 Py_XDECREF(retval);
2474 retval = NULL;
2475 why = WHY_EXCEPTION;
2476 }
2477 }
2478 else if (why == WHY_EXCEPTION) {
2479 call_trace_protected(tstate->c_tracefunc,
2480 tstate->c_traceobj, f,
Armin Rigo1c2d7e52005-09-20 18:34:01 +00002481 PyTrace_RETURN, NULL);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002482 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002483 }
Fred Drake8f51f542001-10-04 14:48:42 +00002484 if (tstate->c_profilefunc) {
Fred Drake4ec5d562001-10-04 19:26:43 +00002485 if (why == WHY_EXCEPTION)
2486 call_trace_protected(tstate->c_profilefunc,
2487 tstate->c_profileobj, f,
Armin Rigo1c2d7e52005-09-20 18:34:01 +00002488 PyTrace_RETURN, NULL);
Fred Drake4ec5d562001-10-04 19:26:43 +00002489 else if (call_trace(tstate->c_profilefunc,
2490 tstate->c_profileobj, f,
2491 PyTrace_RETURN, retval)) {
Fred Drake9e3ad782001-07-03 23:39:52 +00002492 Py_XDECREF(retval);
2493 retval = NULL;
2494 why = WHY_EXCEPTION;
2495 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002496 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002497 }
Guido van Rossuma4240131997-01-21 21:18:36 +00002498
Thomas Wouters477c8d52006-05-27 19:21:47 +00002499 if (tstate->frame->f_exc_type != NULL)
2500 reset_exc_info(tstate);
2501 else {
2502 assert(tstate->frame->f_exc_value == NULL);
2503 assert(tstate->frame->f_exc_traceback == NULL);
2504 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00002505
Tim Peters5ca576e2001-06-18 22:08:13 +00002506 /* pop frame */
Armin Rigo2b3eb402003-10-28 12:05:48 +00002507 exit_eval_frame:
2508 Py_LeaveRecursiveCall();
Guido van Rossuma027efa1997-05-05 20:56:21 +00002509 tstate->frame = f->f_back;
Guido van Rossumac7be682001-01-17 15:42:30 +00002510
Guido van Rossum96a42c81992-01-12 02:29:51 +00002511 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00002512}
2513
Guido van Rossumc2e20742006-02-27 22:32:47 +00002514/* This is gonna seem *real weird*, but if you put some other code between
Martin v. Löwis8d97e332004-06-27 15:43:12 +00002515 PyEval_EvalFrame() and PyEval_EvalCodeEx() you will need to adjust
Guido van Rossumc2e20742006-02-27 22:32:47 +00002516 the test in the if statements in Misc/gdbinit (pystack and pystackv). */
Skip Montanaro786ea6b2004-03-01 15:44:05 +00002517
Tim Peters6d6c1a32001-08-02 04:15:00 +00002518PyObject *
2519PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals,
Tim Peters5ca576e2001-06-18 22:08:13 +00002520 PyObject **args, int argcount, PyObject **kws, int kwcount,
Guido van Rossum4f72a782006-10-27 23:31:49 +00002521 PyObject **defs, int defcount, PyObject *kwdefs, PyObject *closure)
Tim Peters5ca576e2001-06-18 22:08:13 +00002522{
2523 register PyFrameObject *f;
2524 register PyObject *retval = NULL;
2525 register PyObject **fastlocals, **freevars;
2526 PyThreadState *tstate = PyThreadState_GET();
2527 PyObject *x, *u;
2528
2529 if (globals == NULL) {
Tim Peters8a5c3c72004-04-05 19:36:21 +00002530 PyErr_SetString(PyExc_SystemError,
Jeremy Hylton910d7d42001-08-12 21:52:24 +00002531 "PyEval_EvalCodeEx: NULL globals");
Tim Peters5ca576e2001-06-18 22:08:13 +00002532 return NULL;
2533 }
2534
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002535 assert(tstate != NULL);
Jeremy Hylton985eba52003-02-05 23:13:00 +00002536 assert(globals != NULL);
2537 f = PyFrame_New(tstate, co, globals, locals);
Tim Peters5ca576e2001-06-18 22:08:13 +00002538 if (f == NULL)
2539 return NULL;
2540
2541 fastlocals = f->f_localsplus;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002542 freevars = f->f_localsplus + co->co_nlocals;
Tim Peters5ca576e2001-06-18 22:08:13 +00002543
2544 if (co->co_argcount > 0 ||
Guido van Rossum4f72a782006-10-27 23:31:49 +00002545 co->co_kwonlyargcount > 0 ||
Tim Peters5ca576e2001-06-18 22:08:13 +00002546 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
2547 int i;
2548 int n = argcount;
2549 PyObject *kwdict = NULL;
2550 if (co->co_flags & CO_VARKEYWORDS) {
2551 kwdict = PyDict_New();
2552 if (kwdict == NULL)
2553 goto fail;
Guido van Rossum4f72a782006-10-27 23:31:49 +00002554 i = co->co_argcount + co->co_kwonlyargcount;
Tim Peters5ca576e2001-06-18 22:08:13 +00002555 if (co->co_flags & CO_VARARGS)
2556 i++;
2557 SETLOCAL(i, kwdict);
2558 }
2559 if (argcount > co->co_argcount) {
2560 if (!(co->co_flags & CO_VARARGS)) {
2561 PyErr_Format(PyExc_TypeError,
Walter Dörwald573c08c2007-05-25 15:46:59 +00002562 "%S() takes %s %d "
Guido van Rossum4f72a782006-10-27 23:31:49 +00002563 "%spositional argument%s (%d given)",
Walter Dörwald573c08c2007-05-25 15:46:59 +00002564 co->co_name,
Tim Peters5ca576e2001-06-18 22:08:13 +00002565 defcount ? "at most" : "exactly",
2566 co->co_argcount,
2567 kwcount ? "non-keyword " : "",
2568 co->co_argcount == 1 ? "" : "s",
2569 argcount);
2570 goto fail;
2571 }
2572 n = co->co_argcount;
2573 }
2574 for (i = 0; i < n; i++) {
2575 x = args[i];
2576 Py_INCREF(x);
2577 SETLOCAL(i, x);
2578 }
2579 if (co->co_flags & CO_VARARGS) {
2580 u = PyTuple_New(argcount - n);
2581 if (u == NULL)
2582 goto fail;
Guido van Rossum4f72a782006-10-27 23:31:49 +00002583 SETLOCAL(co->co_argcount + co->co_kwonlyargcount, u);
Tim Peters5ca576e2001-06-18 22:08:13 +00002584 for (i = n; i < argcount; i++) {
2585 x = args[i];
2586 Py_INCREF(x);
2587 PyTuple_SET_ITEM(u, i-n, x);
2588 }
2589 }
2590 for (i = 0; i < kwcount; i++) {
2591 PyObject *keyword = kws[2*i];
2592 PyObject *value = kws[2*i + 1];
2593 int j;
Neal Norwitzda059e32007-08-26 05:33:45 +00002594 if (keyword == NULL || !PyUnicode_Check(keyword)) {
Tim Peters5ca576e2001-06-18 22:08:13 +00002595 PyErr_Format(PyExc_TypeError,
Walter Dörwald573c08c2007-05-25 15:46:59 +00002596 "%S() keywords must be strings",
2597 co->co_name);
Tim Peters5ca576e2001-06-18 22:08:13 +00002598 goto fail;
2599 }
2600 /* XXX slow -- speed up using dictionary? */
Guido van Rossum4f72a782006-10-27 23:31:49 +00002601 for (j = 0;
2602 j < co->co_argcount + co->co_kwonlyargcount;
2603 j++) {
Tim Peters5ca576e2001-06-18 22:08:13 +00002604 PyObject *nm = PyTuple_GET_ITEM(
2605 co->co_varnames, j);
2606 int cmp = PyObject_RichCompareBool(
2607 keyword, nm, Py_EQ);
2608 if (cmp > 0)
2609 break;
2610 else if (cmp < 0)
2611 goto fail;
2612 }
2613 /* Check errors from Compare */
2614 if (PyErr_Occurred())
2615 goto fail;
Guido van Rossum4f72a782006-10-27 23:31:49 +00002616 if (j >= co->co_argcount + co->co_kwonlyargcount) {
Tim Peters5ca576e2001-06-18 22:08:13 +00002617 if (kwdict == NULL) {
2618 PyErr_Format(PyExc_TypeError,
Walter Dörwald573c08c2007-05-25 15:46:59 +00002619 "%S() got an unexpected "
2620 "keyword argument '%S'",
2621 co->co_name,
2622 keyword);
Tim Peters5ca576e2001-06-18 22:08:13 +00002623 goto fail;
2624 }
2625 PyDict_SetItem(kwdict, keyword, value);
2626 }
2627 else {
2628 if (GETLOCAL(j) != NULL) {
2629 PyErr_Format(PyExc_TypeError,
Walter Dörwald573c08c2007-05-25 15:46:59 +00002630 "%S() got multiple "
Tim Peters5ca576e2001-06-18 22:08:13 +00002631 "values for keyword "
Walter Dörwald573c08c2007-05-25 15:46:59 +00002632 "argument '%S'",
2633 co->co_name,
2634 keyword);
Tim Peters5ca576e2001-06-18 22:08:13 +00002635 goto fail;
2636 }
2637 Py_INCREF(value);
2638 SETLOCAL(j, value);
2639 }
2640 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00002641 if (co->co_kwonlyargcount > 0) {
2642 for (i = co->co_argcount;
2643 i < co->co_argcount + co->co_kwonlyargcount;
2644 i++) {
Guido van Rossum29602e42006-11-22 04:45:33 +00002645 PyObject *name, *def;
Guido van Rossum4f72a782006-10-27 23:31:49 +00002646 if (GETLOCAL(i) != NULL)
2647 continue;
Guido van Rossum29602e42006-11-22 04:45:33 +00002648 name = PyTuple_GET_ITEM(co->co_varnames, i);
2649 def = NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00002650 if (kwdefs != NULL)
2651 def = PyDict_GetItem(kwdefs, name);
2652 if (def != NULL) {
2653 Py_INCREF(def);
2654 SETLOCAL(i, def);
2655 continue;
2656 }
2657 PyErr_Format(PyExc_TypeError,
Walter Dörwald573c08c2007-05-25 15:46:59 +00002658 "%S() needs keyword-only argument %S",
2659 co->co_name, name);
Guido van Rossum4f72a782006-10-27 23:31:49 +00002660 goto fail;
2661 }
2662 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002663 if (argcount < co->co_argcount) {
2664 int m = co->co_argcount - defcount;
2665 for (i = argcount; i < m; i++) {
2666 if (GETLOCAL(i) == NULL) {
2667 PyErr_Format(PyExc_TypeError,
Walter Dörwald573c08c2007-05-25 15:46:59 +00002668 "%S() takes %s %d "
Guido van Rossum4f72a782006-10-27 23:31:49 +00002669 "%spositional argument%s "
2670 "(%d given)",
Walter Dörwald573c08c2007-05-25 15:46:59 +00002671 co->co_name,
Tim Peters5ca576e2001-06-18 22:08:13 +00002672 ((co->co_flags & CO_VARARGS) ||
2673 defcount) ? "at least"
2674 : "exactly",
2675 m, kwcount ? "non-keyword " : "",
2676 m == 1 ? "" : "s", i);
2677 goto fail;
2678 }
2679 }
2680 if (n > m)
2681 i = n - m;
2682 else
2683 i = 0;
2684 for (; i < defcount; i++) {
2685 if (GETLOCAL(m+i) == NULL) {
2686 PyObject *def = defs[i];
2687 Py_INCREF(def);
2688 SETLOCAL(m+i, def);
2689 }
2690 }
2691 }
2692 }
2693 else {
2694 if (argcount > 0 || kwcount > 0) {
2695 PyErr_Format(PyExc_TypeError,
Walter Dörwald573c08c2007-05-25 15:46:59 +00002696 "%S() takes no arguments (%d given)",
2697 co->co_name,
Tim Peters5ca576e2001-06-18 22:08:13 +00002698 argcount + kwcount);
2699 goto fail;
2700 }
2701 }
2702 /* Allocate and initialize storage for cell vars, and copy free
2703 vars into frame. This isn't too efficient right now. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002704 if (PyTuple_GET_SIZE(co->co_cellvars)) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002705 int i, j, nargs, found;
Martin v. Löwis5b222132007-06-10 09:51:05 +00002706 Py_UNICODE *cellname, *argname;
Tim Peters5ca576e2001-06-18 22:08:13 +00002707 PyObject *c;
2708
2709 nargs = co->co_argcount;
2710 if (co->co_flags & CO_VARARGS)
2711 nargs++;
2712 if (co->co_flags & CO_VARKEYWORDS)
2713 nargs++;
2714
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002715 /* Initialize each cell var, taking into account
2716 cell vars that are initialized from arguments.
2717
2718 Should arrange for the compiler to put cellvars
2719 that are arguments at the beginning of the cellvars
2720 list so that we can march over it more efficiently?
2721 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002722 for (i = 0; i < PyTuple_GET_SIZE(co->co_cellvars); ++i) {
Martin v. Löwis5b222132007-06-10 09:51:05 +00002723 cellname = PyUnicode_AS_UNICODE(
Tim Peters5ca576e2001-06-18 22:08:13 +00002724 PyTuple_GET_ITEM(co->co_cellvars, i));
2725 found = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002726 for (j = 0; j < nargs; j++) {
Martin v. Löwis5b222132007-06-10 09:51:05 +00002727 argname = PyUnicode_AS_UNICODE(
Tim Peters5ca576e2001-06-18 22:08:13 +00002728 PyTuple_GET_ITEM(co->co_varnames, j));
Martin v. Löwis5b222132007-06-10 09:51:05 +00002729 if (Py_UNICODE_strcmp(cellname, argname) == 0) {
Tim Peters5ca576e2001-06-18 22:08:13 +00002730 c = PyCell_New(GETLOCAL(j));
2731 if (c == NULL)
2732 goto fail;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002733 GETLOCAL(co->co_nlocals + i) = c;
Tim Peters5ca576e2001-06-18 22:08:13 +00002734 found = 1;
2735 break;
2736 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002737 }
2738 if (found == 0) {
2739 c = PyCell_New(NULL);
2740 if (c == NULL)
2741 goto fail;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002742 SETLOCAL(co->co_nlocals + i, c);
Tim Peters5ca576e2001-06-18 22:08:13 +00002743 }
2744 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002745 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002746 if (PyTuple_GET_SIZE(co->co_freevars)) {
Tim Peters5ca576e2001-06-18 22:08:13 +00002747 int i;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002748 for (i = 0; i < PyTuple_GET_SIZE(co->co_freevars); ++i) {
Tim Peters5ca576e2001-06-18 22:08:13 +00002749 PyObject *o = PyTuple_GET_ITEM(closure, i);
2750 Py_INCREF(o);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002751 freevars[PyTuple_GET_SIZE(co->co_cellvars) + i] = o;
Tim Peters5ca576e2001-06-18 22:08:13 +00002752 }
2753 }
2754
Tim Peters5ca576e2001-06-18 22:08:13 +00002755 if (co->co_flags & CO_GENERATOR) {
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002756 /* Don't need to keep the reference to f_back, it will be set
2757 * when the generator is resumed. */
Tim Peters5ba58662001-07-16 02:29:45 +00002758 Py_XDECREF(f->f_back);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002759 f->f_back = NULL;
2760
Jeremy Hylton985eba52003-02-05 23:13:00 +00002761 PCALL(PCALL_GENERATOR);
2762
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002763 /* Create a new generator that owns the ready to run frame
2764 * and return that as the value. */
Martin v. Löwise440e472004-06-01 15:22:42 +00002765 return PyGen_New(f);
Tim Peters5ca576e2001-06-18 22:08:13 +00002766 }
2767
Phillip J. Eby0d6615f2005-08-02 00:46:46 +00002768 retval = PyEval_EvalFrameEx(f,0);
Tim Peters5ca576e2001-06-18 22:08:13 +00002769
2770 fail: /* Jump here from prelude on failure */
2771
Tim Petersb13680b2001-11-27 23:29:29 +00002772 /* decref'ing the frame can cause __del__ methods to get invoked,
2773 which can call back into Python. While we're done with the
2774 current Python frame (f), the associated C stack is still in use,
2775 so recursion_depth must be boosted for the duration.
2776 */
2777 assert(tstate != NULL);
2778 ++tstate->recursion_depth;
Tim Peters5ca576e2001-06-18 22:08:13 +00002779 Py_DECREF(f);
Tim Petersb13680b2001-11-27 23:29:29 +00002780 --tstate->recursion_depth;
Tim Peters5ca576e2001-06-18 22:08:13 +00002781 return retval;
2782}
2783
2784
Guido van Rossumc9fbb722003-03-01 03:36:33 +00002785/* Implementation notes for set_exc_info() and reset_exc_info():
2786
2787- Below, 'exc_ZZZ' stands for 'exc_type', 'exc_value' and
2788 'exc_traceback'. These always travel together.
2789
2790- tstate->curexc_ZZZ is the "hot" exception that is set by
2791 PyErr_SetString(), cleared by PyErr_Clear(), and so on.
2792
2793- Once an exception is caught by an except clause, it is transferred
2794 from tstate->curexc_ZZZ to tstate->exc_ZZZ, from which sys.exc_info()
2795 can pick it up. This is the primary task of set_exc_info().
Thomas Wouters477c8d52006-05-27 19:21:47 +00002796 XXX That can't be right: set_exc_info() doesn't look at tstate->curexc_ZZZ.
Guido van Rossumc9fbb722003-03-01 03:36:33 +00002797
2798- Now let me explain the complicated dance with frame->f_exc_ZZZ.
2799
2800 Long ago, when none of this existed, there were just a few globals:
2801 one set corresponding to the "hot" exception, and one set
2802 corresponding to sys.exc_ZZZ. (Actually, the latter weren't C
2803 globals; they were simply stored as sys.exc_ZZZ. For backwards
2804 compatibility, they still are!) The problem was that in code like
2805 this:
2806
2807 try:
2808 "something that may fail"
2809 except "some exception":
2810 "do something else first"
2811 "print the exception from sys.exc_ZZZ."
2812
2813 if "do something else first" invoked something that raised and caught
2814 an exception, sys.exc_ZZZ were overwritten. That was a frequent
2815 cause of subtle bugs. I fixed this by changing the semantics as
2816 follows:
2817
2818 - Within one frame, sys.exc_ZZZ will hold the last exception caught
2819 *in that frame*.
2820
2821 - But initially, and as long as no exception is caught in a given
2822 frame, sys.exc_ZZZ will hold the last exception caught in the
2823 previous frame (or the frame before that, etc.).
2824
2825 The first bullet fixed the bug in the above example. The second
2826 bullet was for backwards compatibility: it was (and is) common to
2827 have a function that is called when an exception is caught, and to
2828 have that function access the caught exception via sys.exc_ZZZ.
2829 (Example: traceback.print_exc()).
2830
2831 At the same time I fixed the problem that sys.exc_ZZZ weren't
2832 thread-safe, by introducing sys.exc_info() which gets it from tstate;
2833 but that's really a separate improvement.
2834
2835 The reset_exc_info() function in ceval.c restores the tstate->exc_ZZZ
2836 variables to what they were before the current frame was called. The
2837 set_exc_info() function saves them on the frame so that
2838 reset_exc_info() can restore them. The invariant is that
2839 frame->f_exc_ZZZ is NULL iff the current frame never caught an
2840 exception (where "catching" an exception applies only to successful
2841 except clauses); and if the current frame ever caught an exception,
2842 frame->f_exc_ZZZ is the exception that was stored in tstate->exc_ZZZ
2843 at the start of the current frame.
2844
2845*/
2846
Guido van Rossuma027efa1997-05-05 20:56:21 +00002847static void
Guido van Rossumac7be682001-01-17 15:42:30 +00002848set_exc_info(PyThreadState *tstate,
2849 PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002850{
Thomas Wouters477c8d52006-05-27 19:21:47 +00002851 PyFrameObject *frame = tstate->frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002852 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00002853
Thomas Wouters477c8d52006-05-27 19:21:47 +00002854 assert(type != NULL);
2855 assert(frame != NULL);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002856 if (frame->f_exc_type == NULL) {
Thomas Wouters477c8d52006-05-27 19:21:47 +00002857 assert(frame->f_exc_value == NULL);
2858 assert(frame->f_exc_traceback == NULL);
2859 /* This frame didn't catch an exception before. */
2860 /* Save previous exception of this thread in this frame. */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002861 if (tstate->exc_type == NULL) {
Thomas Wouters477c8d52006-05-27 19:21:47 +00002862 /* XXX Why is this set to Py_None? */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002863 Py_INCREF(Py_None);
2864 tstate->exc_type = Py_None;
2865 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002866 Py_INCREF(tstate->exc_type);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002867 Py_XINCREF(tstate->exc_value);
2868 Py_XINCREF(tstate->exc_traceback);
2869 frame->f_exc_type = tstate->exc_type;
2870 frame->f_exc_value = tstate->exc_value;
2871 frame->f_exc_traceback = tstate->exc_traceback;
2872 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002873 /* Set new exception for this thread. */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002874 tmp_type = tstate->exc_type;
2875 tmp_value = tstate->exc_value;
2876 tmp_tb = tstate->exc_traceback;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002877 Py_INCREF(type);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002878 Py_XINCREF(value);
2879 Py_XINCREF(tb);
2880 tstate->exc_type = type;
2881 tstate->exc_value = value;
2882 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002883 Py_XDECREF(tmp_type);
2884 Py_XDECREF(tmp_value);
2885 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002886}
2887
2888static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002889reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002890{
2891 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002892 PyObject *tmp_type, *tmp_value, *tmp_tb;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002893
2894 /* It's a precondition that the thread state's frame caught an
2895 * exception -- verify in a debug build.
2896 */
2897 assert(tstate != NULL);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002898 frame = tstate->frame;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002899 assert(frame != NULL);
2900 assert(frame->f_exc_type != NULL);
2901
2902 /* Copy the frame's exception info back to the thread state. */
2903 tmp_type = tstate->exc_type;
2904 tmp_value = tstate->exc_value;
2905 tmp_tb = tstate->exc_traceback;
2906 Py_INCREF(frame->f_exc_type);
2907 Py_XINCREF(frame->f_exc_value);
2908 Py_XINCREF(frame->f_exc_traceback);
2909 tstate->exc_type = frame->f_exc_type;
2910 tstate->exc_value = frame->f_exc_value;
2911 tstate->exc_traceback = frame->f_exc_traceback;
2912 Py_XDECREF(tmp_type);
2913 Py_XDECREF(tmp_value);
2914 Py_XDECREF(tmp_tb);
2915
Thomas Wouters477c8d52006-05-27 19:21:47 +00002916 /* Clear the frame's exception info. */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002917 tmp_type = frame->f_exc_type;
2918 tmp_value = frame->f_exc_value;
2919 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002920 frame->f_exc_type = NULL;
2921 frame->f_exc_value = NULL;
2922 frame->f_exc_traceback = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002923 Py_DECREF(tmp_type);
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002924 Py_XDECREF(tmp_value);
2925 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002926}
2927
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002928/* Logic for the raise statement (too complicated for inlining).
2929 This *consumes* a reference count to each of its arguments. */
Raymond Hettinger7c958652004-04-06 10:11:10 +00002930static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002931do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002932{
Guido van Rossumd295f121998-04-09 21:39:57 +00002933 if (type == NULL) {
2934 /* Reraise */
Nicholas Bastine5662ae2004-03-24 22:22:12 +00002935 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossumd295f121998-04-09 21:39:57 +00002936 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
2937 value = tstate->exc_value;
2938 tb = tstate->exc_traceback;
2939 Py_XINCREF(type);
2940 Py_XINCREF(value);
2941 Py_XINCREF(tb);
2942 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002943
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002944 /* We support the following forms of raise:
2945 raise <class>, <classinstance>
2946 raise <class>, <argument tuple>
2947 raise <class>, None
2948 raise <class>, <argument>
2949 raise <classinstance>, None
2950 raise <string>, <object>
2951 raise <string>, None
2952
2953 An omitted second argument is the same as None.
2954
2955 In addition, raise <tuple>, <anything> is the same as
2956 raising the tuple's first item (and it better have one!);
2957 this rule is applied recursively.
2958
2959 Finally, an optional third argument can be supplied, which
2960 gives the traceback to be substituted (useful when
2961 re-raising an exception after examining it). */
2962
2963 /* First, check the traceback argument, replacing None with
2964 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002965 if (tb == Py_None) {
2966 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002967 tb = NULL;
2968 }
2969 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002970 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00002971 "raise: arg 3 must be a traceback or None");
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002972 goto raise_error;
2973 }
2974
2975 /* Next, replace a missing value with None */
2976 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002977 value = Py_None;
2978 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002979 }
2980
2981 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002982 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2983 PyObject *tmp = type;
2984 type = PyTuple_GET_ITEM(type, 0);
2985 Py_INCREF(type);
2986 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002987 }
2988
Guido van Rossum45aecf42006-03-15 04:58:47 +00002989 if (PyExceptionClass_Check(type))
Barry Warsaw4249f541997-08-22 21:26:19 +00002990 PyErr_NormalizeException(&type, &value, &tb);
2991
Brett Cannonbf364092006-03-01 04:25:17 +00002992 else if (PyExceptionInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002993 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002994 if (value != Py_None) {
2995 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002996 "instance exception may not have a separate value");
2997 goto raise_error;
2998 }
2999 else {
3000 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00003001 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003002 value = type;
Brett Cannonbf364092006-03-01 04:25:17 +00003003 type = PyExceptionInstance_Class(type);
Guido van Rossumb209a111997-04-29 18:18:01 +00003004 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003005 }
3006 }
3007 else {
3008 /* Not something you can raise. You get an exception
3009 anyway, just not what you specified :-) */
Guido van Rossum45aecf42006-03-15 04:58:47 +00003010 PyErr_SetString(PyExc_TypeError,
3011 "exceptions must derive from BaseException");
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003012 goto raise_error;
3013 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003014 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003015 if (tb == NULL)
3016 return WHY_EXCEPTION;
3017 else
3018 return WHY_RERAISE;
3019 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00003020 Py_XDECREF(value);
3021 Py_XDECREF(type);
3022 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003023 return WHY_EXCEPTION;
3024}
3025
Tim Petersd6d010b2001-06-21 02:49:55 +00003026/* Iterate v argcnt times and store the results on the stack (via decreasing
Guido van Rossum0368b722007-05-11 16:50:42 +00003027 sp). Return 1 for success, 0 if error.
3028
3029 If argcntafter == -1, do a simple unpack. If it is >= 0, do an unpack
3030 with a variable target.
3031*/
Tim Petersd6d010b2001-06-21 02:49:55 +00003032
Barry Warsawe42b18f1997-08-25 22:13:04 +00003033static int
Guido van Rossum0368b722007-05-11 16:50:42 +00003034unpack_iterable(PyObject *v, int argcnt, int argcntafter, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00003035{
Guido van Rossum0368b722007-05-11 16:50:42 +00003036 int i = 0, j = 0;
3037 Py_ssize_t ll = 0;
Tim Petersd6d010b2001-06-21 02:49:55 +00003038 PyObject *it; /* iter(v) */
Barry Warsawe42b18f1997-08-25 22:13:04 +00003039 PyObject *w;
Guido van Rossum0368b722007-05-11 16:50:42 +00003040 PyObject *l = NULL; /* variable list */
Guido van Rossumac7be682001-01-17 15:42:30 +00003041
Tim Petersd6d010b2001-06-21 02:49:55 +00003042 assert(v != NULL);
3043
3044 it = PyObject_GetIter(v);
3045 if (it == NULL)
3046 goto Error;
3047
3048 for (; i < argcnt; i++) {
3049 w = PyIter_Next(it);
3050 if (w == NULL) {
3051 /* Iterator done, via error or exhaustion. */
3052 if (!PyErr_Occurred()) {
3053 PyErr_Format(PyExc_ValueError,
3054 "need more than %d value%s to unpack",
3055 i, i == 1 ? "" : "s");
3056 }
3057 goto Error;
Barry Warsawe42b18f1997-08-25 22:13:04 +00003058 }
3059 *--sp = w;
3060 }
Tim Petersd6d010b2001-06-21 02:49:55 +00003061
Guido van Rossum0368b722007-05-11 16:50:42 +00003062 if (argcntafter == -1) {
3063 /* We better have exhausted the iterator now. */
3064 w = PyIter_Next(it);
3065 if (w == NULL) {
3066 if (PyErr_Occurred())
3067 goto Error;
3068 Py_DECREF(it);
3069 return 1;
3070 }
3071 Py_DECREF(w);
3072 PyErr_SetString(PyExc_ValueError, "too many values to unpack");
3073 goto Error;
Barry Warsawe42b18f1997-08-25 22:13:04 +00003074 }
Guido van Rossum0368b722007-05-11 16:50:42 +00003075
3076 l = PySequence_List(it);
3077 if (l == NULL)
3078 goto Error;
3079 *--sp = l;
3080 i++;
3081
3082 ll = PyList_GET_SIZE(l);
3083 if (ll < argcntafter) {
3084 PyErr_Format(PyExc_ValueError, "need more than %zd values to unpack",
3085 argcnt + ll);
3086 goto Error;
3087 }
3088
3089 /* Pop the "after-variable" args off the list. */
3090 for (j = argcntafter; j > 0; j--, i++) {
3091 *--sp = PyList_GET_ITEM(l, ll - j);
3092 }
3093 /* Resize the list. */
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00003094 Py_Size(l) = ll - argcntafter;
Guido van Rossum0368b722007-05-11 16:50:42 +00003095 Py_DECREF(it);
3096 return 1;
3097
Tim Petersd6d010b2001-06-21 02:49:55 +00003098Error:
Barry Warsaw91010551997-08-25 22:30:51 +00003099 for (; i > 0; i--, sp++)
3100 Py_DECREF(*sp);
Tim Petersd6d010b2001-06-21 02:49:55 +00003101 Py_XDECREF(it);
Barry Warsawe42b18f1997-08-25 22:13:04 +00003102 return 0;
3103}
3104
3105
Guido van Rossum96a42c81992-01-12 02:29:51 +00003106#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00003107static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003108prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003109{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003110 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00003111 if (PyObject_Print(v, stdout, 0) != 0)
3112 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00003113 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00003114 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003115}
Guido van Rossum3f5da241990-12-20 15:06:42 +00003116#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003117
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00003118static void
Fred Drake5755ce62001-06-27 19:19:46 +00003119call_exc_trace(Py_tracefunc func, PyObject *self, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00003120{
Guido van Rossumb209a111997-04-29 18:18:01 +00003121 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00003122 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00003123 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00003124 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003125 value = Py_None;
3126 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00003127 }
Raymond Hettinger8ae46892003-10-12 19:09:37 +00003128 arg = PyTuple_Pack(3, type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003129 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003130 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003131 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00003132 }
Fred Drake5755ce62001-06-27 19:19:46 +00003133 err = call_trace(func, self, f, PyTrace_EXCEPTION, arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00003134 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003135 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00003136 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003137 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00003138 Py_XDECREF(type);
3139 Py_XDECREF(value);
3140 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003141 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00003142}
3143
Fred Drake4ec5d562001-10-04 19:26:43 +00003144static void
3145call_trace_protected(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
Armin Rigo1c2d7e52005-09-20 18:34:01 +00003146 int what, PyObject *arg)
Fred Drake4ec5d562001-10-04 19:26:43 +00003147{
3148 PyObject *type, *value, *traceback;
3149 int err;
3150 PyErr_Fetch(&type, &value, &traceback);
Armin Rigo1c2d7e52005-09-20 18:34:01 +00003151 err = call_trace(func, obj, frame, what, arg);
Fred Drake4ec5d562001-10-04 19:26:43 +00003152 if (err == 0)
3153 PyErr_Restore(type, value, traceback);
3154 else {
3155 Py_XDECREF(type);
3156 Py_XDECREF(value);
3157 Py_XDECREF(traceback);
3158 }
3159}
3160
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00003161static int
Fred Drake5755ce62001-06-27 19:19:46 +00003162call_trace(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
3163 int what, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00003164{
Fred Drake5755ce62001-06-27 19:19:46 +00003165 register PyThreadState *tstate = frame->f_tstate;
3166 int result;
3167 if (tstate->tracing)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00003168 return 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +00003169 tstate->tracing++;
Fred Drake9e3ad782001-07-03 23:39:52 +00003170 tstate->use_tracing = 0;
Fred Drake5755ce62001-06-27 19:19:46 +00003171 result = func(obj, frame, what, arg);
Fred Drake9e3ad782001-07-03 23:39:52 +00003172 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
3173 || (tstate->c_profilefunc != NULL));
Guido van Rossuma027efa1997-05-05 20:56:21 +00003174 tstate->tracing--;
Fred Drake5755ce62001-06-27 19:19:46 +00003175 return result;
Guido van Rossum96a42c81992-01-12 02:29:51 +00003176}
3177
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00003178PyObject *
3179_PyEval_CallTracing(PyObject *func, PyObject *args)
3180{
3181 PyFrameObject *frame = PyEval_GetFrame();
3182 PyThreadState *tstate = frame->f_tstate;
3183 int save_tracing = tstate->tracing;
3184 int save_use_tracing = tstate->use_tracing;
3185 PyObject *result;
3186
3187 tstate->tracing = 0;
3188 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
3189 || (tstate->c_profilefunc != NULL));
3190 result = PyObject_Call(func, args, NULL);
3191 tstate->tracing = save_tracing;
3192 tstate->use_tracing = save_use_tracing;
3193 return result;
3194}
3195
Michael W. Hudson006c7522002-11-08 13:08:46 +00003196static int
Tim Peters8a5c3c72004-04-05 19:36:21 +00003197maybe_call_line_trace(Py_tracefunc func, PyObject *obj,
Armin Rigobf57a142004-03-22 19:24:58 +00003198 PyFrameObject *frame, int *instr_lb, int *instr_ub,
3199 int *instr_prev)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003200{
Michael W. Hudson006c7522002-11-08 13:08:46 +00003201 int result = 0;
3202
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003203 /* If the last instruction executed isn't in the current
3204 instruction window, reset the window. If the last
3205 instruction happens to fall at the start of a line or if it
3206 represents a jump backwards, call the trace function.
3207 */
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00003208 if ((frame->f_lasti < *instr_lb || frame->f_lasti >= *instr_ub)) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003209 int line;
3210 PyAddrPair bounds;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003211
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003212 line = PyCode_CheckLineNumber(frame->f_code, frame->f_lasti,
3213 &bounds);
3214 if (line >= 0) {
Michael W. Hudson02ff6a92002-09-11 15:36:32 +00003215 frame->f_lineno = line;
Tim Peters8a5c3c72004-04-05 19:36:21 +00003216 result = call_trace(func, obj, frame,
Michael W. Hudson006c7522002-11-08 13:08:46 +00003217 PyTrace_LINE, Py_None);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003218 }
3219 *instr_lb = bounds.ap_lower;
3220 *instr_ub = bounds.ap_upper;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003221 }
Armin Rigobf57a142004-03-22 19:24:58 +00003222 else if (frame->f_lasti <= *instr_prev) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003223 result = call_trace(func, obj, frame, PyTrace_LINE, Py_None);
Armin Rigobf57a142004-03-22 19:24:58 +00003224 }
3225 *instr_prev = frame->f_lasti;
Michael W. Hudson006c7522002-11-08 13:08:46 +00003226 return result;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003227}
3228
Fred Drake5755ce62001-06-27 19:19:46 +00003229void
3230PyEval_SetProfile(Py_tracefunc func, PyObject *arg)
Fred Draked0838392001-06-16 21:02:31 +00003231{
Nicholas Bastine5662ae2004-03-24 22:22:12 +00003232 PyThreadState *tstate = PyThreadState_GET();
Fred Drake5755ce62001-06-27 19:19:46 +00003233 PyObject *temp = tstate->c_profileobj;
3234 Py_XINCREF(arg);
3235 tstate->c_profilefunc = NULL;
3236 tstate->c_profileobj = NULL;
Brett Cannon55fa66d2005-06-25 07:07:35 +00003237 /* Must make sure that tracing is not ignored if 'temp' is freed */
Fred Drake9e3ad782001-07-03 23:39:52 +00003238 tstate->use_tracing = tstate->c_tracefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00003239 Py_XDECREF(temp);
3240 tstate->c_profilefunc = func;
3241 tstate->c_profileobj = arg;
Brett Cannon55fa66d2005-06-25 07:07:35 +00003242 /* Flag that tracing or profiling is turned on */
Fred Drake9e3ad782001-07-03 23:39:52 +00003243 tstate->use_tracing = (func != NULL) || (tstate->c_tracefunc != NULL);
Fred Drake5755ce62001-06-27 19:19:46 +00003244}
3245
3246void
3247PyEval_SetTrace(Py_tracefunc func, PyObject *arg)
3248{
Nicholas Bastine5662ae2004-03-24 22:22:12 +00003249 PyThreadState *tstate = PyThreadState_GET();
Fred Drake5755ce62001-06-27 19:19:46 +00003250 PyObject *temp = tstate->c_traceobj;
3251 Py_XINCREF(arg);
3252 tstate->c_tracefunc = NULL;
3253 tstate->c_traceobj = NULL;
Brett Cannon55fa66d2005-06-25 07:07:35 +00003254 /* Must make sure that profiling is not ignored if 'temp' is freed */
Fred Drake9e3ad782001-07-03 23:39:52 +00003255 tstate->use_tracing = tstate->c_profilefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00003256 Py_XDECREF(temp);
3257 tstate->c_tracefunc = func;
3258 tstate->c_traceobj = arg;
Brett Cannon55fa66d2005-06-25 07:07:35 +00003259 /* Flag that tracing or profiling is turned on */
Fred Drake9e3ad782001-07-03 23:39:52 +00003260 tstate->use_tracing = ((func != NULL)
3261 || (tstate->c_profilefunc != NULL));
Fred Draked0838392001-06-16 21:02:31 +00003262}
3263
Guido van Rossumb209a111997-04-29 18:18:01 +00003264PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003265PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00003266{
Guido van Rossum6297a7a2003-02-19 15:53:17 +00003267 PyFrameObject *current_frame = PyEval_GetFrame();
Guido van Rossum6135a871995-01-09 17:53:26 +00003268 if (current_frame == NULL)
Nicholas Bastine5662ae2004-03-24 22:22:12 +00003269 return PyThreadState_GET()->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00003270 else
3271 return current_frame->f_builtins;
3272}
3273
Guido van Rossumb209a111997-04-29 18:18:01 +00003274PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003275PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00003276{
Guido van Rossum6297a7a2003-02-19 15:53:17 +00003277 PyFrameObject *current_frame = PyEval_GetFrame();
Guido van Rossum5b722181993-03-30 17:46:03 +00003278 if (current_frame == NULL)
3279 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00003280 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00003281 return current_frame->f_locals;
3282}
3283
Guido van Rossumb209a111997-04-29 18:18:01 +00003284PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003285PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003286{
Guido van Rossum6297a7a2003-02-19 15:53:17 +00003287 PyFrameObject *current_frame = PyEval_GetFrame();
Guido van Rossum3f5da241990-12-20 15:06:42 +00003288 if (current_frame == NULL)
3289 return NULL;
3290 else
3291 return current_frame->f_globals;
3292}
3293
Guido van Rossum6297a7a2003-02-19 15:53:17 +00003294PyFrameObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003295PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00003296{
Nicholas Bastine5662ae2004-03-24 22:22:12 +00003297 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossum6297a7a2003-02-19 15:53:17 +00003298 return _PyThreadState_GetFrame(tstate);
Guido van Rossume59214e1994-08-30 08:01:59 +00003299}
3300
Guido van Rossum6135a871995-01-09 17:53:26 +00003301int
Tim Peters5ba58662001-07-16 02:29:45 +00003302PyEval_MergeCompilerFlags(PyCompilerFlags *cf)
Jeremy Hylton061d1062001-03-22 02:32:48 +00003303{
Guido van Rossum6297a7a2003-02-19 15:53:17 +00003304 PyFrameObject *current_frame = PyEval_GetFrame();
Just van Rossum3aaf42c2003-02-10 08:21:10 +00003305 int result = cf->cf_flags != 0;
Tim Peters5ba58662001-07-16 02:29:45 +00003306
3307 if (current_frame != NULL) {
3308 const int codeflags = current_frame->f_code->co_flags;
Tim Peterse2c18e92001-08-17 20:47:47 +00003309 const int compilerflags = codeflags & PyCF_MASK;
3310 if (compilerflags) {
Tim Peters5ba58662001-07-16 02:29:45 +00003311 result = 1;
Tim Peterse2c18e92001-08-17 20:47:47 +00003312 cf->cf_flags |= compilerflags;
Tim Peters5ba58662001-07-16 02:29:45 +00003313 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00003314#if 0 /* future keyword */
Martin v. Löwis7198a522002-01-01 19:59:11 +00003315 if (codeflags & CO_GENERATOR_ALLOWED) {
3316 result = 1;
3317 cf->cf_flags |= CO_GENERATOR_ALLOWED;
3318 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00003319#endif
Tim Peters5ba58662001-07-16 02:29:45 +00003320 }
3321 return result;
Jeremy Hylton061d1062001-03-22 02:32:48 +00003322}
3323
Guido van Rossum3f5da241990-12-20 15:06:42 +00003324
Guido van Rossum681d79a1995-07-18 14:51:37 +00003325/* External interface to call any callable object.
3326 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00003327
Guido van Rossumd7ed6831997-08-30 15:02:50 +00003328#undef PyEval_CallObject
3329/* for backward compatibility: export this interface */
3330
Guido van Rossumb209a111997-04-29 18:18:01 +00003331PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003332PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00003333{
Guido van Rossumb209a111997-04-29 18:18:01 +00003334 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003335}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00003336#define PyEval_CallObject(func,arg) \
3337 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00003338
Guido van Rossumb209a111997-04-29 18:18:01 +00003339PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003340PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003341{
Jeremy Hylton52820442001-01-03 23:52:36 +00003342 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003343
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00003344 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003345 arg = PyTuple_New(0);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00003346 if (arg == NULL)
3347 return NULL;
3348 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003349 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003350 PyErr_SetString(PyExc_TypeError,
3351 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00003352 return NULL;
3353 }
3354 else
Guido van Rossumb209a111997-04-29 18:18:01 +00003355 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003356
Guido van Rossumb209a111997-04-29 18:18:01 +00003357 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003358 PyErr_SetString(PyExc_TypeError,
3359 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00003360 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00003361 return NULL;
3362 }
3363
Tim Peters6d6c1a32001-08-02 04:15:00 +00003364 result = PyObject_Call(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00003365 Py_DECREF(arg);
Jeremy Hylton52820442001-01-03 23:52:36 +00003366 return result;
3367}
3368
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00003369const char *
Tim Peters6d6c1a32001-08-02 04:15:00 +00003370PyEval_GetFuncName(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00003371{
3372 if (PyMethod_Check(func))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003373 return PyEval_GetFuncName(PyMethod_GET_FUNCTION(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00003374 else if (PyFunction_Check(func))
Martin v. Löwis5b222132007-06-10 09:51:05 +00003375 return PyUnicode_AsString(((PyFunctionObject*)func)->func_name);
Jeremy Hylton512a2372001-04-11 13:52:29 +00003376 else if (PyCFunction_Check(func))
3377 return ((PyCFunctionObject*)func)->m_ml->ml_name;
Guido van Rossum50e9fb92006-08-17 05:42:55 +00003378 else
Jeremy Hylton512a2372001-04-11 13:52:29 +00003379 return func->ob_type->tp_name;
Jeremy Hylton512a2372001-04-11 13:52:29 +00003380}
3381
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00003382const char *
Tim Peters6d6c1a32001-08-02 04:15:00 +00003383PyEval_GetFuncDesc(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00003384{
3385 if (PyMethod_Check(func))
3386 return "()";
3387 else if (PyFunction_Check(func))
3388 return "()";
3389 else if (PyCFunction_Check(func))
3390 return "()";
Guido van Rossum50e9fb92006-08-17 05:42:55 +00003391 else
Jeremy Hylton512a2372001-04-11 13:52:29 +00003392 return " object";
Jeremy Hylton512a2372001-04-11 13:52:29 +00003393}
3394
Neal Norwitzaddfe0c2002-11-10 14:33:26 +00003395static void
Jeremy Hylton192690e2002-08-16 18:36:11 +00003396err_args(PyObject *func, int flags, int nargs)
3397{
3398 if (flags & METH_NOARGS)
Tim Peters8a5c3c72004-04-05 19:36:21 +00003399 PyErr_Format(PyExc_TypeError,
Guido van Rossum86c659a2002-08-23 14:11:35 +00003400 "%.200s() takes no arguments (%d given)",
Tim Peters8a5c3c72004-04-05 19:36:21 +00003401 ((PyCFunctionObject *)func)->m_ml->ml_name,
Jeremy Hylton192690e2002-08-16 18:36:11 +00003402 nargs);
3403 else
Tim Peters8a5c3c72004-04-05 19:36:21 +00003404 PyErr_Format(PyExc_TypeError,
Guido van Rossum86c659a2002-08-23 14:11:35 +00003405 "%.200s() takes exactly one argument (%d given)",
Tim Peters8a5c3c72004-04-05 19:36:21 +00003406 ((PyCFunctionObject *)func)->m_ml->ml_name,
Jeremy Hylton192690e2002-08-16 18:36:11 +00003407 nargs);
3408}
3409
Armin Rigo1c2d7e52005-09-20 18:34:01 +00003410#define C_TRACE(x, call) \
Nicholas Bastind858a772004-06-25 23:31:06 +00003411if (tstate->use_tracing && tstate->c_profilefunc) { \
3412 if (call_trace(tstate->c_profilefunc, \
3413 tstate->c_profileobj, \
3414 tstate->frame, PyTrace_C_CALL, \
Armin Rigo1c2d7e52005-09-20 18:34:01 +00003415 func)) { \
3416 x = NULL; \
3417 } \
3418 else { \
3419 x = call; \
3420 if (tstate->c_profilefunc != NULL) { \
3421 if (x == NULL) { \
3422 call_trace_protected(tstate->c_profilefunc, \
3423 tstate->c_profileobj, \
3424 tstate->frame, PyTrace_C_EXCEPTION, \
3425 func); \
3426 /* XXX should pass (type, value, tb) */ \
3427 } else { \
3428 if (call_trace(tstate->c_profilefunc, \
3429 tstate->c_profileobj, \
3430 tstate->frame, PyTrace_C_RETURN, \
3431 func)) { \
3432 Py_DECREF(x); \
3433 x = NULL; \
3434 } \
3435 } \
Nicholas Bastinc69ebe82004-03-24 21:57:10 +00003436 } \
Nicholas Bastind858a772004-06-25 23:31:06 +00003437 } \
3438} else { \
Armin Rigo1c2d7e52005-09-20 18:34:01 +00003439 x = call; \
Nicholas Bastinc69ebe82004-03-24 21:57:10 +00003440 }
3441
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003442static PyObject *
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00003443call_function(PyObject ***pp_stack, int oparg
3444#ifdef WITH_TSC
3445 , uint64* pintr0, uint64* pintr1
3446#endif
3447 )
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003448{
3449 int na = oparg & 0xff;
3450 int nk = (oparg>>8) & 0xff;
3451 int n = na + 2 * nk;
3452 PyObject **pfunc = (*pp_stack) - n - 1;
3453 PyObject *func = *pfunc;
3454 PyObject *x, *w;
3455
Jeremy Hylton985eba52003-02-05 23:13:00 +00003456 /* Always dispatch PyCFunction first, because these are
3457 presumed to be the most frequent callable object.
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003458 */
3459 if (PyCFunction_Check(func) && nk == 0) {
3460 int flags = PyCFunction_GET_FLAGS(func);
Nicholas Bastind858a772004-06-25 23:31:06 +00003461 PyThreadState *tstate = PyThreadState_GET();
Raymond Hettingera7f56bc2004-06-26 04:34:33 +00003462
3463 PCALL(PCALL_CFUNCTION);
Jeremy Hylton192690e2002-08-16 18:36:11 +00003464 if (flags & (METH_NOARGS | METH_O)) {
3465 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
3466 PyObject *self = PyCFunction_GET_SELF(func);
Nicholas Bastinc69ebe82004-03-24 21:57:10 +00003467 if (flags & METH_NOARGS && na == 0) {
Armin Rigo1c2d7e52005-09-20 18:34:01 +00003468 C_TRACE(x, (*meth)(self,NULL));
Nicholas Bastinc69ebe82004-03-24 21:57:10 +00003469 }
Jeremy Hylton192690e2002-08-16 18:36:11 +00003470 else if (flags & METH_O && na == 1) {
3471 PyObject *arg = EXT_POP(*pp_stack);
Armin Rigo1c2d7e52005-09-20 18:34:01 +00003472 C_TRACE(x, (*meth)(self,arg));
Jeremy Hylton192690e2002-08-16 18:36:11 +00003473 Py_DECREF(arg);
3474 }
3475 else {
3476 err_args(func, flags, na);
3477 x = NULL;
3478 }
3479 }
3480 else {
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003481 PyObject *callargs;
3482 callargs = load_args(pp_stack, na);
Michael W. Hudson75eabd22005-01-18 15:56:11 +00003483 READ_TIMESTAMP(*pintr0);
Armin Rigo1c2d7e52005-09-20 18:34:01 +00003484 C_TRACE(x, PyCFunction_Call(func,callargs,NULL));
Michael W. Hudson75eabd22005-01-18 15:56:11 +00003485 READ_TIMESTAMP(*pintr1);
Tim Peters8a5c3c72004-04-05 19:36:21 +00003486 Py_XDECREF(callargs);
3487 }
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003488 } else {
3489 if (PyMethod_Check(func) && PyMethod_GET_SELF(func) != NULL) {
3490 /* optimize access to bound methods */
3491 PyObject *self = PyMethod_GET_SELF(func);
Jeremy Hylton985eba52003-02-05 23:13:00 +00003492 PCALL(PCALL_METHOD);
3493 PCALL(PCALL_BOUND_METHOD);
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003494 Py_INCREF(self);
3495 func = PyMethod_GET_FUNCTION(func);
3496 Py_INCREF(func);
3497 Py_DECREF(*pfunc);
3498 *pfunc = self;
3499 na++;
3500 n++;
3501 } else
3502 Py_INCREF(func);
Michael W. Hudson75eabd22005-01-18 15:56:11 +00003503 READ_TIMESTAMP(*pintr0);
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003504 if (PyFunction_Check(func))
3505 x = fast_function(func, pp_stack, n, na, nk);
Tim Peters8a5c3c72004-04-05 19:36:21 +00003506 else
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003507 x = do_call(func, pp_stack, na, nk);
Michael W. Hudson75eabd22005-01-18 15:56:11 +00003508 READ_TIMESTAMP(*pintr1);
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003509 Py_DECREF(func);
3510 }
Tim Peters8a5c3c72004-04-05 19:36:21 +00003511
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003512 /* Clear the stack of the function object. Also removes
3513 the arguments in case they weren't consumed already
3514 (fast_function() and err_args() leave them on the stack).
Thomas Wouters7f597322006-03-01 05:32:33 +00003515 */
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003516 while ((*pp_stack) > pfunc) {
3517 w = EXT_POP(*pp_stack);
3518 Py_DECREF(w);
Jeremy Hylton985eba52003-02-05 23:13:00 +00003519 PCALL(PCALL_POP);
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003520 }
3521 return x;
3522}
3523
Jeremy Hylton192690e2002-08-16 18:36:11 +00003524/* The fast_function() function optimize calls for which no argument
Jeremy Hylton52820442001-01-03 23:52:36 +00003525 tuple is necessary; the objects are passed directly from the stack.
Jeremy Hylton985eba52003-02-05 23:13:00 +00003526 For the simplest case -- a function that takes only positional
3527 arguments and is called with only positional arguments -- it
3528 inlines the most primitive frame setup code from
3529 PyEval_EvalCodeEx(), which vastly reduces the checks that must be
3530 done before evaluating the frame.
Jeremy Hylton52820442001-01-03 23:52:36 +00003531*/
3532
3533static PyObject *
Guido van Rossumac7be682001-01-17 15:42:30 +00003534fast_function(PyObject *func, PyObject ***pp_stack, int n, int na, int nk)
Jeremy Hylton52820442001-01-03 23:52:36 +00003535{
Jeremy Hylton985eba52003-02-05 23:13:00 +00003536 PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003537 PyObject *globals = PyFunction_GET_GLOBALS(func);
3538 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
Guido van Rossum4f72a782006-10-27 23:31:49 +00003539 PyObject *kwdefs = PyFunction_GET_KW_DEFAULTS(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003540 PyObject **d = NULL;
3541 int nd = 0;
3542
Jeremy Hylton985eba52003-02-05 23:13:00 +00003543 PCALL(PCALL_FUNCTION);
3544 PCALL(PCALL_FAST_FUNCTION);
Guido van Rossum4f72a782006-10-27 23:31:49 +00003545 if (argdefs == NULL && co->co_argcount == n &&
3546 co->co_kwonlyargcount == 0 && nk==0 &&
Jeremy Hylton985eba52003-02-05 23:13:00 +00003547 co->co_flags == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE)) {
3548 PyFrameObject *f;
3549 PyObject *retval = NULL;
3550 PyThreadState *tstate = PyThreadState_GET();
3551 PyObject **fastlocals, **stack;
3552 int i;
3553
3554 PCALL(PCALL_FASTER_FUNCTION);
3555 assert(globals != NULL);
3556 /* XXX Perhaps we should create a specialized
3557 PyFrame_New() that doesn't take locals, but does
3558 take builtins without sanity checking them.
3559 */
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00003560 assert(tstate != NULL);
Jeremy Hylton985eba52003-02-05 23:13:00 +00003561 f = PyFrame_New(tstate, co, globals, NULL);
3562 if (f == NULL)
3563 return NULL;
3564
3565 fastlocals = f->f_localsplus;
3566 stack = (*pp_stack) - n;
3567
3568 for (i = 0; i < n; i++) {
3569 Py_INCREF(*stack);
3570 fastlocals[i] = *stack++;
3571 }
Phillip J. Eby0d6615f2005-08-02 00:46:46 +00003572 retval = PyEval_EvalFrameEx(f,0);
Jeremy Hylton985eba52003-02-05 23:13:00 +00003573 ++tstate->recursion_depth;
3574 Py_DECREF(f);
3575 --tstate->recursion_depth;
3576 return retval;
3577 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003578 if (argdefs != NULL) {
3579 d = &PyTuple_GET_ITEM(argdefs, 0);
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00003580 nd = Py_Size(argdefs);
Jeremy Hylton52820442001-01-03 23:52:36 +00003581 }
Jeremy Hylton985eba52003-02-05 23:13:00 +00003582 return PyEval_EvalCodeEx(co, globals,
3583 (PyObject *)NULL, (*pp_stack)-n, na,
Guido van Rossum4f72a782006-10-27 23:31:49 +00003584 (*pp_stack)-2*nk, nk, d, nd, kwdefs,
Jeremy Hylton985eba52003-02-05 23:13:00 +00003585 PyFunction_GET_CLOSURE(func));
Jeremy Hylton52820442001-01-03 23:52:36 +00003586}
3587
3588static PyObject *
Ka-Ping Yee20579702001-01-15 22:14:16 +00003589update_keyword_args(PyObject *orig_kwdict, int nk, PyObject ***pp_stack,
3590 PyObject *func)
Jeremy Hylton52820442001-01-03 23:52:36 +00003591{
3592 PyObject *kwdict = NULL;
3593 if (orig_kwdict == NULL)
3594 kwdict = PyDict_New();
3595 else {
3596 kwdict = PyDict_Copy(orig_kwdict);
3597 Py_DECREF(orig_kwdict);
3598 }
3599 if (kwdict == NULL)
3600 return NULL;
Raymond Hettinger5bed4562004-04-10 23:34:17 +00003601 while (--nk >= 0) {
Jeremy Hylton52820442001-01-03 23:52:36 +00003602 int err;
3603 PyObject *value = EXT_POP(*pp_stack);
3604 PyObject *key = EXT_POP(*pp_stack);
3605 if (PyDict_GetItem(kwdict, key) != NULL) {
Guido van Rossumac7be682001-01-17 15:42:30 +00003606 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +00003607 "%.200s%s got multiple values "
Jeremy Hylton512a2372001-04-11 13:52:29 +00003608 "for keyword argument '%.200s'",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003609 PyEval_GetFuncName(func),
3610 PyEval_GetFuncDesc(func),
Neal Norwitzda059e32007-08-26 05:33:45 +00003611 PyUnicode_AsString(key));
Jeremy Hylton52820442001-01-03 23:52:36 +00003612 Py_DECREF(key);
3613 Py_DECREF(value);
3614 Py_DECREF(kwdict);
3615 return NULL;
3616 }
3617 err = PyDict_SetItem(kwdict, key, value);
3618 Py_DECREF(key);
3619 Py_DECREF(value);
3620 if (err) {
3621 Py_DECREF(kwdict);
3622 return NULL;
3623 }
3624 }
3625 return kwdict;
3626}
3627
3628static PyObject *
3629update_star_args(int nstack, int nstar, PyObject *stararg,
3630 PyObject ***pp_stack)
3631{
3632 PyObject *callargs, *w;
3633
3634 callargs = PyTuple_New(nstack + nstar);
3635 if (callargs == NULL) {
3636 return NULL;
3637 }
3638 if (nstar) {
3639 int i;
3640 for (i = 0; i < nstar; i++) {
3641 PyObject *a = PyTuple_GET_ITEM(stararg, i);
3642 Py_INCREF(a);
3643 PyTuple_SET_ITEM(callargs, nstack + i, a);
3644 }
3645 }
Raymond Hettinger5bed4562004-04-10 23:34:17 +00003646 while (--nstack >= 0) {
Jeremy Hylton52820442001-01-03 23:52:36 +00003647 w = EXT_POP(*pp_stack);
3648 PyTuple_SET_ITEM(callargs, nstack, w);
3649 }
3650 return callargs;
3651}
3652
3653static PyObject *
3654load_args(PyObject ***pp_stack, int na)
3655{
3656 PyObject *args = PyTuple_New(na);
3657 PyObject *w;
3658
3659 if (args == NULL)
3660 return NULL;
Raymond Hettinger5bed4562004-04-10 23:34:17 +00003661 while (--na >= 0) {
Jeremy Hylton52820442001-01-03 23:52:36 +00003662 w = EXT_POP(*pp_stack);
3663 PyTuple_SET_ITEM(args, na, w);
3664 }
3665 return args;
3666}
3667
3668static PyObject *
3669do_call(PyObject *func, PyObject ***pp_stack, int na, int nk)
3670{
3671 PyObject *callargs = NULL;
3672 PyObject *kwdict = NULL;
3673 PyObject *result = NULL;
3674
3675 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003676 kwdict = update_keyword_args(NULL, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003677 if (kwdict == NULL)
3678 goto call_fail;
3679 }
3680 callargs = load_args(pp_stack, na);
3681 if (callargs == NULL)
3682 goto call_fail;
Jeremy Hylton985eba52003-02-05 23:13:00 +00003683#ifdef CALL_PROFILE
3684 /* At this point, we have to look at the type of func to
3685 update the call stats properly. Do it here so as to avoid
3686 exposing the call stats machinery outside ceval.c
3687 */
3688 if (PyFunction_Check(func))
3689 PCALL(PCALL_FUNCTION);
3690 else if (PyMethod_Check(func))
3691 PCALL(PCALL_METHOD);
3692 else if (PyType_Check(func))
3693 PCALL(PCALL_TYPE);
3694 else
3695 PCALL(PCALL_OTHER);
3696#endif
Tim Peters6d6c1a32001-08-02 04:15:00 +00003697 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00003698 call_fail:
3699 Py_XDECREF(callargs);
3700 Py_XDECREF(kwdict);
3701 return result;
3702}
3703
3704static PyObject *
3705ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)
3706{
3707 int nstar = 0;
3708 PyObject *callargs = NULL;
3709 PyObject *stararg = NULL;
3710 PyObject *kwdict = NULL;
3711 PyObject *result = NULL;
3712
3713 if (flags & CALL_FLAG_KW) {
3714 kwdict = EXT_POP(*pp_stack);
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003715 if (!PyDict_Check(kwdict)) {
3716 PyObject *d;
3717 d = PyDict_New();
3718 if (d == NULL)
3719 goto ext_call_fail;
3720 if (PyDict_Update(d, kwdict) != 0) {
3721 Py_DECREF(d);
3722 /* PyDict_Update raises attribute
3723 * error (percolated from an attempt
3724 * to get 'keys' attribute) instead of
3725 * a type error if its second argument
3726 * is not a mapping.
3727 */
3728 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
3729 PyErr_Format(PyExc_TypeError,
3730 "%.200s%.200s argument after ** "
3731 "must be a mapping, not %.200s",
3732 PyEval_GetFuncName(func),
3733 PyEval_GetFuncDesc(func),
3734 kwdict->ob_type->tp_name);
3735 }
3736 goto ext_call_fail;
3737 }
3738 Py_DECREF(kwdict);
3739 kwdict = d;
Jeremy Hylton52820442001-01-03 23:52:36 +00003740 }
3741 }
3742 if (flags & CALL_FLAG_VAR) {
3743 stararg = EXT_POP(*pp_stack);
3744 if (!PyTuple_Check(stararg)) {
3745 PyObject *t = NULL;
3746 t = PySequence_Tuple(stararg);
3747 if (t == NULL) {
Jeremy Hylton512a2372001-04-11 13:52:29 +00003748 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
3749 PyErr_Format(PyExc_TypeError,
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003750 "%.200s%.200s argument after * "
3751 "must be a sequence, not %200s",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003752 PyEval_GetFuncName(func),
Guido van Rossumd59da4b2007-05-22 18:11:13 +00003753 PyEval_GetFuncDesc(func),
3754 stararg->ob_type->tp_name);
Jeremy Hylton512a2372001-04-11 13:52:29 +00003755 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003756 goto ext_call_fail;
3757 }
3758 Py_DECREF(stararg);
3759 stararg = t;
3760 }
3761 nstar = PyTuple_GET_SIZE(stararg);
3762 }
3763 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003764 kwdict = update_keyword_args(kwdict, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003765 if (kwdict == NULL)
3766 goto ext_call_fail;
3767 }
3768 callargs = update_star_args(na, nstar, stararg, pp_stack);
3769 if (callargs == NULL)
3770 goto ext_call_fail;
Jeremy Hylton985eba52003-02-05 23:13:00 +00003771#ifdef CALL_PROFILE
3772 /* At this point, we have to look at the type of func to
3773 update the call stats properly. Do it here so as to avoid
3774 exposing the call stats machinery outside ceval.c
3775 */
3776 if (PyFunction_Check(func))
3777 PCALL(PCALL_FUNCTION);
3778 else if (PyMethod_Check(func))
3779 PCALL(PCALL_METHOD);
3780 else if (PyType_Check(func))
3781 PCALL(PCALL_TYPE);
3782 else
3783 PCALL(PCALL_OTHER);
3784#endif
Tim Peters6d6c1a32001-08-02 04:15:00 +00003785 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00003786 ext_call_fail:
3787 Py_XDECREF(callargs);
3788 Py_XDECREF(kwdict);
3789 Py_XDECREF(stararg);
3790 return result;
3791}
3792
Guido van Rossum38fff8c2006-03-07 18:50:55 +00003793/* Extract a slice index from a PyInt or PyLong or an object with the
3794 nb_index slot defined, and store in *pi.
3795 Silently reduce values larger than PY_SSIZE_T_MAX to PY_SSIZE_T_MAX,
3796 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 +00003797 Return 0 on error, 1 on success.
Tim Peterscb479e72001-12-16 19:11:44 +00003798*/
Tim Petersb5196382001-12-16 19:44:20 +00003799/* Note: If v is NULL, return success without storing into *pi. This
3800 is because_PyEval_SliceIndex() is called by apply_slice(), which can be
3801 called by the SLICE opcode with v and/or w equal to NULL.
Tim Peterscb479e72001-12-16 19:11:44 +00003802*/
Guido van Rossum20c6add2000-05-08 14:06:50 +00003803int
Martin v. Löwis18e16552006-02-15 17:27:45 +00003804_PyEval_SliceIndex(PyObject *v, Py_ssize_t *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003805{
Tim Petersb5196382001-12-16 19:44:20 +00003806 if (v != NULL) {
Martin v. Löwisdde99d22006-02-17 15:57:41 +00003807 Py_ssize_t x;
Guido van Rossumddefaf32007-01-14 03:31:43 +00003808 if (PyInt_CheckExact(v)) {
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00003809 /* XXX(nnorwitz): I think PyInt_AS_LONG is correct,
3810 however, it looks like it should be AsSsize_t.
3811 There should be a comment here explaining why.
3812 */
3813 x = PyInt_AS_LONG(v);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003814 }
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00003815 else if (PyIndex_Check(v)) {
3816 x = PyNumber_AsSsize_t(v, NULL);
Guido van Rossum38fff8c2006-03-07 18:50:55 +00003817 if (x == -1 && PyErr_Occurred())
3818 return 0;
3819 }
3820 else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003821 PyErr_SetString(PyExc_TypeError,
Guido van Rossum38fff8c2006-03-07 18:50:55 +00003822 "slice indices must be integers or "
3823 "None or have an __index__ method");
Guido van Rossum20c6add2000-05-08 14:06:50 +00003824 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003825 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00003826 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003827 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00003828 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003829}
3830
Guido van Rossum486364b2007-06-30 05:01:58 +00003831#define CANNOT_CATCH_MSG "catching classes that do not inherit from "\
Brett Cannon39590462007-02-26 22:01:14 +00003832 "BaseException is not allowed"
Brett Cannonf74225d2007-02-26 21:10:16 +00003833
Guido van Rossumb209a111997-04-29 18:18:01 +00003834static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003835cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003836{
Guido van Rossumac7be682001-01-17 15:42:30 +00003837 int res = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003838 switch (op) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00003839 case PyCmp_IS:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003840 res = (v == w);
Raymond Hettinger4bad9ba2003-01-19 05:08:13 +00003841 break;
3842 case PyCmp_IS_NOT:
3843 res = (v != w);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003844 break;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003845 case PyCmp_IN:
Raymond Hettinger4bad9ba2003-01-19 05:08:13 +00003846 res = PySequence_Contains(w, v);
3847 if (res < 0)
3848 return NULL;
3849 break;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003850 case PyCmp_NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003851 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003852 if (res < 0)
3853 return NULL;
Raymond Hettinger4bad9ba2003-01-19 05:08:13 +00003854 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003855 break;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003856 case PyCmp_EXC_MATCH:
Thomas Wouters9fe394c2007-02-05 01:24:16 +00003857 if (PyTuple_Check(w)) {
3858 Py_ssize_t i, length;
3859 length = PyTuple_Size(w);
3860 for (i = 0; i < length; i += 1) {
3861 PyObject *exc = PyTuple_GET_ITEM(w, i);
Brett Cannon39590462007-02-26 22:01:14 +00003862 if (!PyExceptionClass_Check(exc)) {
3863 PyErr_SetString(PyExc_TypeError,
3864 CANNOT_CATCH_MSG);
Brett Cannonf74225d2007-02-26 21:10:16 +00003865 return NULL;
Thomas Wouters9fe394c2007-02-05 01:24:16 +00003866 }
3867 }
3868 }
3869 else {
Brett Cannon39590462007-02-26 22:01:14 +00003870 if (!PyExceptionClass_Check(w)) {
3871 PyErr_SetString(PyExc_TypeError,
3872 CANNOT_CATCH_MSG);
Brett Cannonf74225d2007-02-26 21:10:16 +00003873 return NULL;
Thomas Wouters9fe394c2007-02-05 01:24:16 +00003874 }
3875 }
Barry Warsaw4249f541997-08-22 21:26:19 +00003876 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003877 break;
3878 default:
Guido van Rossumac7be682001-01-17 15:42:30 +00003879 return PyObject_RichCompare(v, w, op);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003880 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003881 v = res ? Py_True : Py_False;
3882 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003883 return v;
3884}
3885
Thomas Wouters52152252000-08-17 22:55:00 +00003886static PyObject *
3887import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003888{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003889 PyObject *x;
3890
3891 x = PyObject_GetAttr(v, name);
3892 if (x == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
Walter Dörwald573c08c2007-05-25 15:46:59 +00003893 PyErr_Format(PyExc_ImportError, "cannot import name %S", name);
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003894 }
Thomas Wouters52152252000-08-17 22:55:00 +00003895 return x;
3896}
Guido van Rossumac7be682001-01-17 15:42:30 +00003897
Thomas Wouters52152252000-08-17 22:55:00 +00003898static int
3899import_all_from(PyObject *locals, PyObject *v)
3900{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003901 PyObject *all = PyObject_GetAttrString(v, "__all__");
3902 PyObject *dict, *name, *value;
3903 int skip_leading_underscores = 0;
3904 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00003905
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003906 if (all == NULL) {
3907 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3908 return -1; /* Unexpected error */
3909 PyErr_Clear();
3910 dict = PyObject_GetAttrString(v, "__dict__");
3911 if (dict == NULL) {
3912 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3913 return -1;
3914 PyErr_SetString(PyExc_ImportError,
3915 "from-import-* object has no __dict__ and no __all__");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003916 return -1;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003917 }
3918 all = PyMapping_Keys(dict);
3919 Py_DECREF(dict);
3920 if (all == NULL)
3921 return -1;
3922 skip_leading_underscores = 1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003923 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003924
3925 for (pos = 0, err = 0; ; pos++) {
3926 name = PySequence_GetItem(all, pos);
3927 if (name == NULL) {
3928 if (!PyErr_ExceptionMatches(PyExc_IndexError))
3929 err = -1;
3930 else
3931 PyErr_Clear();
3932 break;
3933 }
3934 if (skip_leading_underscores &&
Martin v. Löwis5b222132007-06-10 09:51:05 +00003935 PyUnicode_Check(name) &&
3936 PyUnicode_AS_UNICODE(name)[0] == '_')
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003937 {
3938 Py_DECREF(name);
3939 continue;
3940 }
3941 value = PyObject_GetAttr(v, name);
3942 if (value == NULL)
3943 err = -1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003944 else if (PyDict_CheckExact(locals))
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003945 err = PyDict_SetItem(locals, name, value);
Thomas Wouters89f507f2006-12-13 04:49:30 +00003946 else
3947 err = PyObject_SetItem(locals, name, value);
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003948 Py_DECREF(name);
3949 Py_XDECREF(value);
3950 if (err != 0)
3951 break;
3952 }
3953 Py_DECREF(all);
3954 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003955}
3956
Guido van Rossumac7be682001-01-17 15:42:30 +00003957static void
Neal Norwitzda059e32007-08-26 05:33:45 +00003958format_exc_check_arg(PyObject *exc, const char *format_str, PyObject *obj)
Paul Prescode68140d2000-08-30 20:25:01 +00003959{
Neal Norwitzda059e32007-08-26 05:33:45 +00003960 const char *obj_str;
Paul Prescode68140d2000-08-30 20:25:01 +00003961
3962 if (!obj)
3963 return;
3964
Neal Norwitzda059e32007-08-26 05:33:45 +00003965 obj_str = PyUnicode_AsString(obj);
Paul Prescode68140d2000-08-30 20:25:01 +00003966 if (!obj_str)
3967 return;
3968
3969 PyErr_Format(exc, format_str, obj_str);
3970}
Guido van Rossum950361c1997-01-24 13:49:28 +00003971
Raymond Hettinger52a21b82004-08-06 18:43:09 +00003972static PyObject *
3973string_concatenate(PyObject *v, PyObject *w,
3974 PyFrameObject *f, unsigned char *next_instr)
3975{
3976 /* This function implements 'variable += expr' when both arguments
3977 are strings. */
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003978 Py_ssize_t v_len = PyString_GET_SIZE(v);
3979 Py_ssize_t w_len = PyString_GET_SIZE(w);
3980 Py_ssize_t new_len = v_len + w_len;
3981 if (new_len < 0) {
3982 PyErr_SetString(PyExc_OverflowError,
3983 "strings are too large to concat");
3984 return NULL;
3985 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003986
Raymond Hettinger52a21b82004-08-06 18:43:09 +00003987 if (v->ob_refcnt == 2) {
3988 /* In the common case, there are 2 references to the value
3989 * stored in 'variable' when the += is performed: one on the
3990 * value stack (in 'v') and one still stored in the 'variable'.
3991 * We try to delete the variable now to reduce the refcnt to 1.
3992 */
3993 switch (*next_instr) {
3994 case STORE_FAST:
3995 {
3996 int oparg = PEEKARG();
3997 PyObject **fastlocals = f->f_localsplus;
3998 if (GETLOCAL(oparg) == v)
3999 SETLOCAL(oparg, NULL);
4000 break;
4001 }
4002 case STORE_DEREF:
4003 {
Thomas Wouters477c8d52006-05-27 19:21:47 +00004004 PyObject **freevars = f->f_localsplus + f->f_code->co_nlocals;
Raymond Hettinger52a21b82004-08-06 18:43:09 +00004005 PyObject *c = freevars[PEEKARG()];
4006 if (PyCell_GET(c) == v)
4007 PyCell_Set(c, NULL);
4008 break;
4009 }
4010 case STORE_NAME:
4011 {
4012 PyObject *names = f->f_code->co_names;
4013 PyObject *name = GETITEM(names, PEEKARG());
4014 PyObject *locals = f->f_locals;
4015 if (PyDict_CheckExact(locals) &&
4016 PyDict_GetItem(locals, name) == v) {
4017 if (PyDict_DelItem(locals, name) != 0) {
4018 PyErr_Clear();
4019 }
4020 }
4021 break;
4022 }
4023 }
4024 }
4025
Armin Rigo618fbf52004-08-07 20:58:32 +00004026 if (v->ob_refcnt == 1 && !PyString_CHECK_INTERNED(v)) {
Raymond Hettinger52a21b82004-08-06 18:43:09 +00004027 /* Now we own the last reference to 'v', so we can resize it
4028 * in-place.
4029 */
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004030 if (_PyString_Resize(&v, new_len) != 0) {
Raymond Hettinger52a21b82004-08-06 18:43:09 +00004031 /* XXX if _PyString_Resize() fails, 'v' has been
4032 * deallocated so it cannot be put back into 'variable'.
4033 * The MemoryError is raised when there is no value in
4034 * 'variable', which might (very remotely) be a cause
4035 * of incompatibilities.
4036 */
4037 return NULL;
4038 }
4039 /* copy 'w' into the newly allocated area of 'v' */
4040 memcpy(PyString_AS_STRING(v) + v_len,
4041 PyString_AS_STRING(w), w_len);
4042 return v;
4043 }
4044 else {
4045 /* When in-place resizing is not an option. */
4046 PyString_Concat(&v, w);
4047 return v;
4048 }
4049}
4050
Guido van Rossum950361c1997-01-24 13:49:28 +00004051#ifdef DYNAMIC_EXECUTION_PROFILE
4052
Skip Montanarof118cb12001-10-15 20:51:38 +00004053static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004054getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00004055{
4056 int i;
4057 PyObject *l = PyList_New(256);
4058 if (l == NULL) return NULL;
4059 for (i = 0; i < 256; i++) {
4060 PyObject *x = PyInt_FromLong(a[i]);
4061 if (x == NULL) {
4062 Py_DECREF(l);
4063 return NULL;
4064 }
4065 PyList_SetItem(l, i, x);
4066 }
4067 for (i = 0; i < 256; i++)
4068 a[i] = 0;
4069 return l;
4070}
4071
4072PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004073_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00004074{
4075#ifndef DXPAIRS
4076 return getarray(dxp);
4077#else
4078 int i;
4079 PyObject *l = PyList_New(257);
4080 if (l == NULL) return NULL;
4081 for (i = 0; i < 257; i++) {
4082 PyObject *x = getarray(dxpairs[i]);
4083 if (x == NULL) {
4084 Py_DECREF(l);
4085 return NULL;
4086 }
4087 PyList_SetItem(l, i, x);
4088 }
4089 return l;
4090#endif
4091}
4092
4093#endif