blob: 3bb2178bd84d02d719ebed4115acc9fd91edee32 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum3f5da241990-12-20 15:06:42 +00002/* Execute compiled code */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003
Guido van Rossum681d79a1995-07-18 14:51:37 +00004/* XXX TO DO:
Guido van Rossum681d79a1995-07-18 14:51:37 +00005 XXX speed up searching for keywords by using a dictionary
Guido van Rossum681d79a1995-07-18 14:51:37 +00006 XXX document it!
7 */
8
Thomas Wouters477c8d52006-05-27 19:21:47 +00009/* enable more aggressive intra-module optimizations, where available */
10#define PY_LOCAL_AGGRESSIVE
11
Guido van Rossumb209a111997-04-29 18:18:01 +000012#include "Python.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000013
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000014#include "code.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000015#include "frameobject.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000016#include "eval.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000017#include "opcode.h"
Tim Peters6d6c1a32001-08-02 04:15:00 +000018#include "structmember.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000019
Guido van Rossumc6004111993-11-05 10:22:19 +000020#include <ctype.h>
21
Thomas Wouters477c8d52006-05-27 19:21:47 +000022#ifndef WITH_TSC
Michael W. Hudson75eabd22005-01-18 15:56:11 +000023
24#define READ_TIMESTAMP(var)
25
26#else
Martin v. Löwisf30d60e2004-06-08 08:17:44 +000027
28typedef unsigned long long uint64;
29
Michael W. Hudson800ba232004-08-12 18:19:17 +000030#if defined(__ppc__) /* <- Don't know if this is the correct symbol; this
31 section should work for GCC on any PowerPC platform,
32 irrespective of OS. POWER? Who knows :-) */
33
Michael W. Hudson75eabd22005-01-18 15:56:11 +000034#define READ_TIMESTAMP(var) ppc_getcounter(&var)
Michael W. Hudson800ba232004-08-12 18:19:17 +000035
36static void
37ppc_getcounter(uint64 *v)
38{
39 register unsigned long tbu, tb, tbu2;
40
41 loop:
42 asm volatile ("mftbu %0" : "=r" (tbu) );
43 asm volatile ("mftb %0" : "=r" (tb) );
44 asm volatile ("mftbu %0" : "=r" (tbu2));
45 if (__builtin_expect(tbu != tbu2, 0)) goto loop;
46
Thomas Wouters477c8d52006-05-27 19:21:47 +000047 /* The slightly peculiar way of writing the next lines is
Michael W. Hudson800ba232004-08-12 18:19:17 +000048 compiled better by GCC than any other way I tried. */
49 ((long*)(v))[0] = tbu;
50 ((long*)(v))[1] = tb;
51}
52
Michael W. Hudson75eabd22005-01-18 15:56:11 +000053#else /* this is for linux/x86 (and probably any other GCC/x86 combo) */
Michael W. Hudson800ba232004-08-12 18:19:17 +000054
Michael W. Hudson75eabd22005-01-18 15:56:11 +000055#define READ_TIMESTAMP(val) \
56 __asm__ __volatile__("rdtsc" : "=A" (val))
Michael W. Hudson800ba232004-08-12 18:19:17 +000057
58#endif
59
Thomas Wouters477c8d52006-05-27 19:21:47 +000060void dump_tsc(int opcode, int ticked, uint64 inst0, uint64 inst1,
Martin v. Löwisf30d60e2004-06-08 08:17:44 +000061 uint64 loop0, uint64 loop1, uint64 intr0, uint64 intr1)
62{
63 uint64 intr, inst, loop;
64 PyThreadState *tstate = PyThreadState_Get();
65 if (!tstate->interp->tscdump)
66 return;
67 intr = intr1 - intr0;
68 inst = inst1 - inst0 - intr;
69 loop = loop1 - loop0 - intr;
70 fprintf(stderr, "opcode=%03d t=%d inst=%06lld loop=%06lld\n",
71 opcode, ticked, inst, loop);
72}
Michael W. Hudson800ba232004-08-12 18:19:17 +000073
Martin v. Löwisf30d60e2004-06-08 08:17:44 +000074#endif
75
Guido van Rossum04691fc1992-08-12 15:35:34 +000076/* Turn this on if your compiler chokes on the big switch: */
Guido van Rossum1ae940a1995-01-02 19:04:15 +000077/* #define CASE_TOO_BIG 1 */
Guido van Rossum04691fc1992-08-12 15:35:34 +000078
Guido van Rossum408027e1996-12-30 16:17:54 +000079#ifdef Py_DEBUG
Guido van Rossum96a42c81992-01-12 02:29:51 +000080/* For debugging the interpreter: */
81#define LLTRACE 1 /* Low-level trace feature */
82#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000083#endif
84
Jeremy Hylton52820442001-01-03 23:52:36 +000085typedef PyObject *(*callproc)(PyObject *, PyObject *, PyObject *);
Guido van Rossum5b722181993-03-30 17:46:03 +000086
Guido van Rossum374a9221991-04-04 10:40:29 +000087/* Forward declarations */
Martin v. Löwisf30d60e2004-06-08 08:17:44 +000088#ifdef WITH_TSC
Thomas Wouters477c8d52006-05-27 19:21:47 +000089static PyObject * call_function(PyObject ***, int, uint64*, uint64*);
Martin v. Löwisf30d60e2004-06-08 08:17:44 +000090#else
Thomas Wouters477c8d52006-05-27 19:21:47 +000091static PyObject * call_function(PyObject ***, int);
Martin v. Löwisf30d60e2004-06-08 08:17:44 +000092#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +000093static PyObject * fast_function(PyObject *, PyObject ***, int, int, int);
94static PyObject * do_call(PyObject *, PyObject ***, int, int);
95static PyObject * ext_do_call(PyObject *, PyObject ***, int, int, int);
96static PyObject * update_keyword_args(PyObject *, int, PyObject ***,PyObject *);
97static PyObject * update_star_args(int, int, PyObject *, PyObject ***);
98static PyObject * load_args(PyObject ***, int);
Jeremy Hylton52820442001-01-03 23:52:36 +000099#define CALL_FLAG_VAR 1
100#define CALL_FLAG_KW 2
101
Guido van Rossum0a066c01992-03-27 17:29:15 +0000102#ifdef LLTRACE
Guido van Rossumc2e20742006-02-27 22:32:47 +0000103static int lltrace;
Tim Petersdbd9ba62000-07-09 03:09:57 +0000104static int prtrace(PyObject *, char *);
Guido van Rossum0a066c01992-03-27 17:29:15 +0000105#endif
Fred Drake5755ce62001-06-27 19:19:46 +0000106static int call_trace(Py_tracefunc, PyObject *, PyFrameObject *,
107 int, PyObject *);
Fred Drake4ec5d562001-10-04 19:26:43 +0000108static void call_trace_protected(Py_tracefunc, PyObject *,
Armin Rigo1c2d7e52005-09-20 18:34:01 +0000109 PyFrameObject *, int, PyObject *);
Fred Drake5755ce62001-06-27 19:19:46 +0000110static void call_exc_trace(Py_tracefunc, PyObject *, PyFrameObject *);
Tim Peters8a5c3c72004-04-05 19:36:21 +0000111static int maybe_call_line_trace(Py_tracefunc, PyObject *,
Armin Rigobf57a142004-03-22 19:24:58 +0000112 PyFrameObject *, int *, int *, int *);
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000113
Thomas Wouters477c8d52006-05-27 19:21:47 +0000114static PyObject * apply_slice(PyObject *, PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000115static int assign_slice(PyObject *, PyObject *,
116 PyObject *, PyObject *);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000117static PyObject * cmp_outcome(int, PyObject *, PyObject *);
118static PyObject * import_from(PyObject *, PyObject *);
Thomas Wouters52152252000-08-17 22:55:00 +0000119static int import_all_from(PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000120static void set_exc_info(PyThreadState *, PyObject *, PyObject *, PyObject *);
121static void reset_exc_info(PyThreadState *);
Paul Prescode68140d2000-08-30 20:25:01 +0000122static void format_exc_check_arg(PyObject *, char *, PyObject *);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000123static PyObject * string_concatenate(PyObject *, PyObject *,
Raymond Hettinger52a21b82004-08-06 18:43:09 +0000124 PyFrameObject *, unsigned char *);
Guido van Rossum374a9221991-04-04 10:40:29 +0000125
Paul Prescode68140d2000-08-30 20:25:01 +0000126#define NAME_ERROR_MSG \
Fred Drake661ea262000-10-24 19:57:45 +0000127 "name '%.200s' is not defined"
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000128#define GLOBAL_NAME_ERROR_MSG \
129 "global name '%.200s' is not defined"
Paul Prescode68140d2000-08-30 20:25:01 +0000130#define UNBOUNDLOCAL_ERROR_MSG \
Fred Drake661ea262000-10-24 19:57:45 +0000131 "local variable '%.200s' referenced before assignment"
Jeremy Hyltonc76770c2001-04-13 16:51:46 +0000132#define UNBOUNDFREE_ERROR_MSG \
133 "free variable '%.200s' referenced before assignment" \
134 " in enclosing scope"
Guido van Rossum374a9221991-04-04 10:40:29 +0000135
Guido van Rossum950361c1997-01-24 13:49:28 +0000136/* Dynamic execution profile */
137#ifdef DYNAMIC_EXECUTION_PROFILE
138#ifdef DXPAIRS
139static long dxpairs[257][256];
140#define dxp dxpairs[256]
141#else
142static long dxp[256];
143#endif
144#endif
145
Jeremy Hylton985eba52003-02-05 23:13:00 +0000146/* Function call profile */
147#ifdef CALL_PROFILE
148#define PCALL_NUM 11
149static int pcall[PCALL_NUM];
150
151#define PCALL_ALL 0
152#define PCALL_FUNCTION 1
153#define PCALL_FAST_FUNCTION 2
154#define PCALL_FASTER_FUNCTION 3
155#define PCALL_METHOD 4
156#define PCALL_BOUND_METHOD 5
157#define PCALL_CFUNCTION 6
158#define PCALL_TYPE 7
159#define PCALL_GENERATOR 8
160#define PCALL_OTHER 9
161#define PCALL_POP 10
162
163/* Notes about the statistics
164
165 PCALL_FAST stats
166
167 FAST_FUNCTION means no argument tuple needs to be created.
168 FASTER_FUNCTION means that the fast-path frame setup code is used.
169
170 If there is a method call where the call can be optimized by changing
171 the argument tuple and calling the function directly, it gets recorded
172 twice.
173
174 As a result, the relationship among the statistics appears to be
175 PCALL_ALL == PCALL_FUNCTION + PCALL_METHOD - PCALL_BOUND_METHOD +
176 PCALL_CFUNCTION + PCALL_TYPE + PCALL_GENERATOR + PCALL_OTHER
177 PCALL_FUNCTION > PCALL_FAST_FUNCTION > PCALL_FASTER_FUNCTION
178 PCALL_METHOD > PCALL_BOUND_METHOD
179*/
180
181#define PCALL(POS) pcall[POS]++
182
183PyObject *
184PyEval_GetCallStats(PyObject *self)
185{
Thomas Wouters89f507f2006-12-13 04:49:30 +0000186 return Py_BuildValue("iiiiiiiiiii",
Jeremy Hylton985eba52003-02-05 23:13:00 +0000187 pcall[0], pcall[1], pcall[2], pcall[3],
188 pcall[4], pcall[5], pcall[6], pcall[7],
Thomas Wouters89f507f2006-12-13 04:49:30 +0000189 pcall[8], pcall[9], pcall[10]);
Jeremy Hylton985eba52003-02-05 23:13:00 +0000190}
191#else
192#define PCALL(O)
193
194PyObject *
195PyEval_GetCallStats(PyObject *self)
196{
197 Py_INCREF(Py_None);
198 return Py_None;
199}
200#endif
201
Tim Peters5ca576e2001-06-18 22:08:13 +0000202
Guido van Rossume59214e1994-08-30 08:01:59 +0000203#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000204
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000205#ifdef HAVE_ERRNO_H
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000206#include <errno.h>
Guido van Rossum2571cc81999-04-07 16:07:23 +0000207#endif
Guido van Rossum49b56061998-10-01 20:42:43 +0000208#include "pythread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000209
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000210static PyThread_type_lock interpreter_lock = 0; /* This is the GIL */
Guido van Rossuma9672091994-09-14 13:31:22 +0000211static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000212
Tim Peters7f468f22004-10-11 02:40:51 +0000213int
214PyEval_ThreadsInitialized(void)
215{
216 return interpreter_lock != 0;
217}
218
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000219void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000220PyEval_InitThreads(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000221{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000222 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000223 return;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000224 interpreter_lock = PyThread_allocate_lock();
225 PyThread_acquire_lock(interpreter_lock, 1);
226 main_thread = PyThread_get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000227}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000228
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000229void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000230PyEval_AcquireLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000231{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000232 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000233}
234
235void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000236PyEval_ReleaseLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000237{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000238 PyThread_release_lock(interpreter_lock);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000239}
240
241void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000242PyEval_AcquireThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000243{
244 if (tstate == NULL)
245 Py_FatalError("PyEval_AcquireThread: NULL new thread state");
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000246 /* Check someone has called PyEval_InitThreads() to create the lock */
247 assert(interpreter_lock);
Guido van Rossum65d5b571998-12-21 19:32:43 +0000248 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000249 if (PyThreadState_Swap(tstate) != NULL)
250 Py_FatalError(
251 "PyEval_AcquireThread: non-NULL old thread state");
252}
253
254void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000255PyEval_ReleaseThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000256{
257 if (tstate == NULL)
258 Py_FatalError("PyEval_ReleaseThread: NULL thread state");
259 if (PyThreadState_Swap(NULL) != tstate)
260 Py_FatalError("PyEval_ReleaseThread: wrong thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000261 PyThread_release_lock(interpreter_lock);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000262}
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000263
264/* This function is called from PyOS_AfterFork to ensure that newly
265 created child processes don't hold locks referring to threads which
266 are not running in the child process. (This could also be done using
267 pthread_atfork mechanism, at least for the pthreads implementation.) */
268
269void
270PyEval_ReInitThreads(void)
271{
272 if (!interpreter_lock)
273 return;
274 /*XXX Can't use PyThread_free_lock here because it does too
275 much error-checking. Doing this cleanly would require
276 adding a new function to each thread_*.h. Instead, just
277 create a new lock and waste a little bit of memory */
278 interpreter_lock = PyThread_allocate_lock();
279 PyThread_acquire_lock(interpreter_lock, 1);
280 main_thread = PyThread_get_thread_ident();
281}
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000282#endif
283
Guido van Rossumff4949e1992-08-05 19:58:53 +0000284/* Functions save_thread and restore_thread are always defined so
285 dynamically loaded modules needn't be compiled separately for use
286 with and without threads: */
287
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000288PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000289PyEval_SaveThread(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000290{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000291 PyThreadState *tstate = PyThreadState_Swap(NULL);
292 if (tstate == NULL)
293 Py_FatalError("PyEval_SaveThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000294#ifdef WITH_THREAD
Guido van Rossumb74eca91997-09-30 22:03:16 +0000295 if (interpreter_lock)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000296 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000297#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000298 return tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000299}
300
301void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000302PyEval_RestoreThread(PyThreadState *tstate)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000303{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000304 if (tstate == NULL)
305 Py_FatalError("PyEval_RestoreThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000306#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000307 if (interpreter_lock) {
Guido van Rossumb74eca91997-09-30 22:03:16 +0000308 int err = errno;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000309 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000310 errno = err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000311 }
312#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000313 PyThreadState_Swap(tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000314}
315
316
Guido van Rossuma9672091994-09-14 13:31:22 +0000317/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
318 signal handlers or Mac I/O completion routines) can schedule calls
319 to a function to be called synchronously.
320 The synchronous function is called with one void* argument.
321 It should return 0 for success or -1 for failure -- failure should
322 be accompanied by an exception.
323
324 If registry succeeds, the registry function returns 0; if it fails
325 (e.g. due to too many pending calls) it returns -1 (without setting
326 an exception condition).
327
328 Note that because registry may occur from within signal handlers,
329 or other asynchronous events, calling malloc() is unsafe!
330
331#ifdef WITH_THREAD
332 Any thread can schedule pending calls, but only the main thread
333 will execute them.
334#endif
335
336 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
337 There are two possible race conditions:
338 (1) nested asynchronous registry calls;
339 (2) registry calls made while pending calls are being processed.
340 While (1) is very unlikely, (2) is a real possibility.
341 The current code is safe against (2), but not against (1).
342 The safety against (2) is derived from the fact that only one
343 thread (the main thread) ever takes things out of the queue.
Guido van Rossuma9672091994-09-14 13:31:22 +0000344
Guido van Rossuma027efa1997-05-05 20:56:21 +0000345 XXX Darn! With the advent of thread state, we should have an array
346 of pending calls per thread in the thread state! Later...
347*/
Guido van Rossum8861b741996-07-30 16:49:37 +0000348
Guido van Rossuma9672091994-09-14 13:31:22 +0000349#define NPENDINGCALLS 32
350static struct {
Thomas Wouters334fb892000-07-25 12:56:38 +0000351 int (*func)(void *);
352 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000353} pendingcalls[NPENDINGCALLS];
354static volatile int pendingfirst = 0;
355static volatile int pendinglast = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000356static volatile int things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000357
358int
Thomas Wouters334fb892000-07-25 12:56:38 +0000359Py_AddPendingCall(int (*func)(void *), void *arg)
Guido van Rossuma9672091994-09-14 13:31:22 +0000360{
Michael W. Hudson30ea2f22004-07-07 17:44:12 +0000361 static volatile int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000362 int i, j;
363 /* XXX Begin critical section */
364 /* XXX If you want this to be safe against nested
365 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000366 if (busy)
367 return -1;
368 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000369 i = pendinglast;
370 j = (i + 1) % NPENDINGCALLS;
Guido van Rossum04e70322002-07-17 16:57:13 +0000371 if (j == pendingfirst) {
372 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000373 return -1; /* Queue full */
Guido van Rossum04e70322002-07-17 16:57:13 +0000374 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000375 pendingcalls[i].func = func;
376 pendingcalls[i].arg = arg;
377 pendinglast = j;
Skip Montanarod581d772002-09-03 20:10:45 +0000378
379 _Py_Ticker = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000380 things_to_do = 1; /* Signal main loop */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000381 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000382 /* XXX End critical section */
383 return 0;
384}
385
Guido van Rossum180d7b41994-09-29 09:45:57 +0000386int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000387Py_MakePendingCalls(void)
Guido van Rossuma9672091994-09-14 13:31:22 +0000388{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000389 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000390#ifdef WITH_THREAD
Guido van Rossum65d5b571998-12-21 19:32:43 +0000391 if (main_thread && PyThread_get_thread_ident() != main_thread)
Guido van Rossuma9672091994-09-14 13:31:22 +0000392 return 0;
393#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000394 if (busy)
Guido van Rossum180d7b41994-09-29 09:45:57 +0000395 return 0;
396 busy = 1;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000397 things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000398 for (;;) {
399 int i;
Thomas Wouters334fb892000-07-25 12:56:38 +0000400 int (*func)(void *);
401 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000402 i = pendingfirst;
403 if (i == pendinglast)
404 break; /* Queue empty */
405 func = pendingcalls[i].func;
406 arg = pendingcalls[i].arg;
407 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000408 if (func(arg) < 0) {
409 busy = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000410 things_to_do = 1; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000411 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000412 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000413 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000414 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000415 return 0;
416}
417
418
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000419/* The interpreter's recursion limit */
420
Hye-Shik Changb6fa2812005-04-04 15:49:02 +0000421#ifndef Py_DEFAULT_RECURSION_LIMIT
422#define Py_DEFAULT_RECURSION_LIMIT 1000
423#endif
424static int recursion_limit = Py_DEFAULT_RECURSION_LIMIT;
425int _Py_CheckRecursionLimit = Py_DEFAULT_RECURSION_LIMIT;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000426
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000427int
428Py_GetRecursionLimit(void)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000429{
430 return recursion_limit;
431}
432
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000433void
434Py_SetRecursionLimit(int new_limit)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000435{
436 recursion_limit = new_limit;
Armin Rigo2b3eb402003-10-28 12:05:48 +0000437 _Py_CheckRecursionLimit = recursion_limit;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000438}
439
Armin Rigo2b3eb402003-10-28 12:05:48 +0000440/* the macro Py_EnterRecursiveCall() only calls _Py_CheckRecursiveCall()
441 if the recursion_depth reaches _Py_CheckRecursionLimit.
442 If USE_STACKCHECK, the macro decrements _Py_CheckRecursionLimit
443 to guarantee that _Py_CheckRecursiveCall() is regularly called.
444 Without USE_STACKCHECK, there is no need for this. */
445int
446_Py_CheckRecursiveCall(char *where)
447{
448 PyThreadState *tstate = PyThreadState_GET();
449
450#ifdef USE_STACKCHECK
451 if (PyOS_CheckStack()) {
452 --tstate->recursion_depth;
453 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
454 return -1;
455 }
456#endif
457 if (tstate->recursion_depth > recursion_limit) {
458 --tstate->recursion_depth;
459 PyErr_Format(PyExc_RuntimeError,
460 "maximum recursion depth exceeded%s",
461 where);
462 return -1;
463 }
464 _Py_CheckRecursionLimit = recursion_limit;
465 return 0;
466}
467
Guido van Rossum374a9221991-04-04 10:40:29 +0000468/* Status code for main loop (reason for stack unwind) */
Raymond Hettinger7c958652004-04-06 10:11:10 +0000469enum why_code {
470 WHY_NOT = 0x0001, /* No error */
471 WHY_EXCEPTION = 0x0002, /* Exception occurred */
472 WHY_RERAISE = 0x0004, /* Exception re-raised by 'finally' */
473 WHY_RETURN = 0x0008, /* 'return' statement */
474 WHY_BREAK = 0x0010, /* 'break' statement */
475 WHY_CONTINUE = 0x0020, /* 'continue' statement */
476 WHY_YIELD = 0x0040 /* 'yield' operator */
477};
Guido van Rossum374a9221991-04-04 10:40:29 +0000478
Raymond Hettinger7c958652004-04-06 10:11:10 +0000479static enum why_code do_raise(PyObject *, PyObject *, PyObject *);
Guido van Rossum0368b722007-05-11 16:50:42 +0000480static int unpack_iterable(PyObject *, int, int, PyObject **);
Guido van Rossum1aa14831997-01-21 05:34:20 +0000481
Skip Montanarod581d772002-09-03 20:10:45 +0000482/* for manipulating the thread switch and periodic "stuff" - used to be
483 per thread, now just a pair o' globals */
Skip Montanaro99dba272002-09-03 20:19:06 +0000484int _Py_CheckInterval = 100;
485volatile int _Py_Ticker = 100;
Guido van Rossum374a9221991-04-04 10:40:29 +0000486
Guido van Rossumb209a111997-04-29 18:18:01 +0000487PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000488PyEval_EvalCode(PyCodeObject *co, PyObject *globals, PyObject *locals)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000489{
Jeremy Hylton985eba52003-02-05 23:13:00 +0000490 /* XXX raise SystemError if globals is NULL */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000491 return PyEval_EvalCodeEx(co,
Guido van Rossum681d79a1995-07-18 14:51:37 +0000492 globals, locals,
Guido van Rossumb209a111997-04-29 18:18:01 +0000493 (PyObject **)NULL, 0,
494 (PyObject **)NULL, 0,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000495 (PyObject **)NULL, 0,
Guido van Rossum4f72a782006-10-27 23:31:49 +0000496 NULL, NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000497}
498
499
500/* Interpreter main loop */
501
Martin v. Löwis8d97e332004-06-27 15:43:12 +0000502PyObject *
Phillip J. Eby0d6615f2005-08-02 00:46:46 +0000503PyEval_EvalFrame(PyFrameObject *f) {
504 /* This is for backward compatibility with extension modules that
505 used this API; core interpreter code should call PyEval_EvalFrameEx() */
506 return PyEval_EvalFrameEx(f, 0);
507}
508
509PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000510PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
Guido van Rossum374a9221991-04-04 10:40:29 +0000511{
Guido van Rossum950361c1997-01-24 13:49:28 +0000512#ifdef DXPAIRS
513 int lastopcode = 0;
514#endif
Armin Rigo8817fcd2004-06-17 10:22:40 +0000515 register PyObject **stack_pointer; /* Next free slot in value stack */
Guido van Rossum374a9221991-04-04 10:40:29 +0000516 register unsigned char *next_instr;
Armin Rigo8817fcd2004-06-17 10:22:40 +0000517 register int opcode; /* Current opcode */
518 register int oparg; /* Current opcode argument, if any */
Raymond Hettinger7c958652004-04-06 10:11:10 +0000519 register enum why_code why; /* Reason for block stack unwind */
Guido van Rossum374a9221991-04-04 10:40:29 +0000520 register int err; /* Error status -- nonzero if error */
Guido van Rossumb209a111997-04-29 18:18:01 +0000521 register PyObject *x; /* Result object -- NULL if error */
522 register PyObject *v; /* Temporary objects popped off stack */
523 register PyObject *w;
524 register PyObject *u;
525 register PyObject *t;
Jeremy Hylton2b724da2001-01-29 22:51:52 +0000526 register PyObject **fastlocals, **freevars;
Guido van Rossum014518f1998-11-23 21:09:51 +0000527 PyObject *retval = NULL; /* Return value */
Guido van Rossum885553e1998-12-21 18:33:30 +0000528 PyThreadState *tstate = PyThreadState_GET();
Tim Peters5ca576e2001-06-18 22:08:13 +0000529 PyCodeObject *co;
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000530
Tim Peters8a5c3c72004-04-05 19:36:21 +0000531 /* when tracing we set things up so that
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000532
533 not (instr_lb <= current_bytecode_offset < instr_ub)
534
Tim Peters8a5c3c72004-04-05 19:36:21 +0000535 is true when the line being executed has changed. The
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000536 initial values are such as to make this false the first
537 time it is tested. */
Armin Rigobf57a142004-03-22 19:24:58 +0000538 int instr_ub = -1, instr_lb = 0, instr_prev = -1;
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000539
Guido van Rossumd076c731998-10-07 19:42:25 +0000540 unsigned char *first_instr;
Skip Montanaro04d80f82002-08-04 21:03:35 +0000541 PyObject *names;
542 PyObject *consts;
Neal Norwitz5f5153e2005-10-21 04:28:38 +0000543#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000544 /* Make it easier to find out where we are with a debugger */
Tim Peters5ca576e2001-06-18 22:08:13 +0000545 char *filename;
Guido van Rossum99bec951992-09-03 20:29:45 +0000546#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000547
Neal Norwitza81d2202002-07-14 00:27:26 +0000548/* Tuple access macros */
549
550#ifndef Py_DEBUG
551#define GETITEM(v, i) PyTuple_GET_ITEM((PyTupleObject *)(v), (i))
552#else
553#define GETITEM(v, i) PyTuple_GetItem((v), (i))
554#endif
555
Martin v. Löwisf30d60e2004-06-08 08:17:44 +0000556#ifdef WITH_TSC
557/* Use Pentium timestamp counter to mark certain events:
558 inst0 -- beginning of switch statement for opcode dispatch
559 inst1 -- end of switch statement (may be skipped)
560 loop0 -- the top of the mainloop
Thomas Wouters477c8d52006-05-27 19:21:47 +0000561 loop1 -- place where control returns again to top of mainloop
Martin v. Löwisf30d60e2004-06-08 08:17:44 +0000562 (may be skipped)
563 intr1 -- beginning of long interruption
564 intr2 -- end of long interruption
565
566 Many opcodes call out to helper C functions. In some cases, the
567 time in those functions should be counted towards the time for the
568 opcode, but not in all cases. For example, a CALL_FUNCTION opcode
569 calls another Python function; there's no point in charge all the
570 bytecode executed by the called function to the caller.
571
572 It's hard to make a useful judgement statically. In the presence
573 of operator overloading, it's impossible to tell if a call will
574 execute new Python code or not.
575
576 It's a case-by-case judgement. I'll use intr1 for the following
577 cases:
578
Martin v. Löwisf30d60e2004-06-08 08:17:44 +0000579 IMPORT_STAR
580 IMPORT_FROM
581 CALL_FUNCTION (and friends)
582
583 */
584 uint64 inst0, inst1, loop0, loop1, intr0 = 0, intr1 = 0;
585 int ticked = 0;
586
Michael W. Hudson75eabd22005-01-18 15:56:11 +0000587 READ_TIMESTAMP(inst0);
588 READ_TIMESTAMP(inst1);
589 READ_TIMESTAMP(loop0);
590 READ_TIMESTAMP(loop1);
Michael W. Hudson800ba232004-08-12 18:19:17 +0000591
592 /* shut up the compiler */
593 opcode = 0;
Martin v. Löwisf30d60e2004-06-08 08:17:44 +0000594#endif
595
Guido van Rossum374a9221991-04-04 10:40:29 +0000596/* Code access macros */
597
Martin v. Löwis18e16552006-02-15 17:27:45 +0000598#define INSTR_OFFSET() ((int)(next_instr - first_instr))
Guido van Rossum374a9221991-04-04 10:40:29 +0000599#define NEXTOP() (*next_instr++)
Raymond Hettinger5bed4562004-04-10 23:34:17 +0000600#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Raymond Hettinger52a21b82004-08-06 18:43:09 +0000601#define PEEKARG() ((next_instr[2]<<8) + next_instr[1])
Guido van Rossumd076c731998-10-07 19:42:25 +0000602#define JUMPTO(x) (next_instr = first_instr + (x))
Guido van Rossum374a9221991-04-04 10:40:29 +0000603#define JUMPBY(x) (next_instr += (x))
604
Raymond Hettingerf606f872003-03-16 03:11:04 +0000605/* OpCode prediction macros
606 Some opcodes tend to come in pairs thus making it possible to predict
607 the second code when the first is run. For example, COMPARE_OP is often
608 followed by JUMP_IF_FALSE or JUMP_IF_TRUE. And, those opcodes are often
609 followed by a POP_TOP.
610
611 Verifying the prediction costs a single high-speed test of register
Raymond Hettingerac2072922003-03-16 15:41:11 +0000612 variable against a constant. If the pairing was good, then the
Raymond Hettingerf606f872003-03-16 03:11:04 +0000613 processor has a high likelihood of making its own successful branch
614 prediction which results in a nearly zero overhead transition to the
615 next opcode.
616
617 A successful prediction saves a trip through the eval-loop including
618 its two unpredictable branches, the HASARG test and the switch-case.
Raymond Hettingera7216982004-02-08 19:59:27 +0000619
Tim Peters8a5c3c72004-04-05 19:36:21 +0000620 If collecting opcode statistics, turn off prediction so that
621 statistics are accurately maintained (the predictions bypass
Raymond Hettingera7216982004-02-08 19:59:27 +0000622 the opcode frequency counter updates).
Raymond Hettingerf606f872003-03-16 03:11:04 +0000623*/
624
Raymond Hettingera7216982004-02-08 19:59:27 +0000625#ifdef DYNAMIC_EXECUTION_PROFILE
626#define PREDICT(op) if (0) goto PRED_##op
627#else
Raymond Hettingerac2072922003-03-16 15:41:11 +0000628#define PREDICT(op) if (*next_instr == op) goto PRED_##op
Raymond Hettingera7216982004-02-08 19:59:27 +0000629#endif
630
Raymond Hettingerf606f872003-03-16 03:11:04 +0000631#define PREDICTED(op) PRED_##op: next_instr++
Raymond Hettinger52a21b82004-08-06 18:43:09 +0000632#define PREDICTED_WITH_ARG(op) PRED_##op: oparg = PEEKARG(); next_instr += 3
Raymond Hettingerf606f872003-03-16 03:11:04 +0000633
Guido van Rossum374a9221991-04-04 10:40:29 +0000634/* Stack manipulation macros */
635
Martin v. Löwis18e16552006-02-15 17:27:45 +0000636/* The stack can grow at most MAXINT deep, as co_nlocals and
637 co_stacksize are ints. */
638#define STACK_LEVEL() ((int)(stack_pointer - f->f_valuestack))
Guido van Rossum374a9221991-04-04 10:40:29 +0000639#define EMPTY() (STACK_LEVEL() == 0)
640#define TOP() (stack_pointer[-1])
Raymond Hettinger663004b2003-01-09 15:24:30 +0000641#define SECOND() (stack_pointer[-2])
642#define THIRD() (stack_pointer[-3])
643#define FOURTH() (stack_pointer[-4])
Raymond Hettinger663004b2003-01-09 15:24:30 +0000644#define SET_TOP(v) (stack_pointer[-1] = (v))
645#define SET_SECOND(v) (stack_pointer[-2] = (v))
646#define SET_THIRD(v) (stack_pointer[-3] = (v))
647#define SET_FOURTH(v) (stack_pointer[-4] = (v))
Raymond Hettinger663004b2003-01-09 15:24:30 +0000648#define BASIC_STACKADJ(n) (stack_pointer += n)
Guido van Rossum374a9221991-04-04 10:40:29 +0000649#define BASIC_PUSH(v) (*stack_pointer++ = (v))
650#define BASIC_POP() (*--stack_pointer)
651
Guido van Rossum96a42c81992-01-12 02:29:51 +0000652#ifdef LLTRACE
Jeremy Hylton14368152001-10-17 13:29:30 +0000653#define PUSH(v) { (void)(BASIC_PUSH(v), \
654 lltrace && prtrace(TOP(), "push")); \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000655 assert(STACK_LEVEL() <= co->co_stacksize); }
Fred Drakede26cfc2001-10-13 06:11:28 +0000656#define POP() ((void)(lltrace && prtrace(TOP(), "pop")), BASIC_POP())
Raymond Hettinger663004b2003-01-09 15:24:30 +0000657#define STACKADJ(n) { (void)(BASIC_STACKADJ(n), \
658 lltrace && prtrace(TOP(), "stackadj")); \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000659 assert(STACK_LEVEL() <= co->co_stacksize); }
Guido van Rossumd8faa362007-04-27 19:54:29 +0000660#define EXT_POP(STACK_POINTER) (lltrace && prtrace((STACK_POINTER)[-1], "ext_pop"), *--(STACK_POINTER))
Guido van Rossum374a9221991-04-04 10:40:29 +0000661#else
662#define PUSH(v) BASIC_PUSH(v)
663#define POP() BASIC_POP()
Raymond Hettinger663004b2003-01-09 15:24:30 +0000664#define STACKADJ(n) BASIC_STACKADJ(n)
Guido van Rossumc2e20742006-02-27 22:32:47 +0000665#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
Guido van Rossum374a9221991-04-04 10:40:29 +0000666#endif
667
Guido van Rossum681d79a1995-07-18 14:51:37 +0000668/* Local variable macros */
669
670#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumcfbf1a32002-03-28 20:17:52 +0000671
672/* The SETLOCAL() macro must not DECREF the local variable in-place and
673 then store the new value; it must copy the old value to a temporary
674 value, then store the new value, and then DECREF the temporary value.
675 This is because it is possible that during the DECREF the frame is
676 accessed by other code (e.g. a __del__ method or gc.collect()) and the
677 variable would be pointing to already-freed memory. */
678#define SETLOCAL(i, value) do { PyObject *tmp = GETLOCAL(i); \
679 GETLOCAL(i) = value; \
680 Py_XDECREF(tmp); } while (0)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000681
Guido van Rossuma027efa1997-05-05 20:56:21 +0000682/* Start of code */
683
Tim Peters5ca576e2001-06-18 22:08:13 +0000684 if (f == NULL)
685 return NULL;
686
Armin Rigo1d313ab2003-10-25 14:33:09 +0000687 /* push frame */
Armin Rigo2b3eb402003-10-28 12:05:48 +0000688 if (Py_EnterRecursiveCall(""))
Armin Rigo1d313ab2003-10-25 14:33:09 +0000689 return NULL;
Guido van Rossum8861b741996-07-30 16:49:37 +0000690
Tim Peters5ca576e2001-06-18 22:08:13 +0000691 tstate->frame = f;
Tim Peters5ca576e2001-06-18 22:08:13 +0000692
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000693 if (tstate->use_tracing) {
694 if (tstate->c_tracefunc != NULL) {
695 /* tstate->c_tracefunc, if defined, is a
696 function that will be called on *every* entry
697 to a code block. Its return value, if not
698 None, is a function that will be called at
699 the start of each executed line of code.
700 (Actually, the function must return itself
701 in order to continue tracing.) The trace
702 functions are called with three arguments:
703 a pointer to the current frame, a string
704 indicating why the function is called, and
705 an argument which depends on the situation.
706 The global trace function is also called
707 whenever an exception is detected. */
708 if (call_trace(tstate->c_tracefunc, tstate->c_traceobj,
709 f, PyTrace_CALL, Py_None)) {
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000710 /* Trace function raised an error */
Armin Rigo2b3eb402003-10-28 12:05:48 +0000711 goto exit_eval_frame;
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000712 }
713 }
714 if (tstate->c_profilefunc != NULL) {
715 /* Similar for c_profilefunc, except it needn't
716 return itself and isn't called for "line" events */
717 if (call_trace(tstate->c_profilefunc,
718 tstate->c_profileobj,
719 f, PyTrace_CALL, Py_None)) {
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000720 /* Profile function raised an error */
Armin Rigo2b3eb402003-10-28 12:05:48 +0000721 goto exit_eval_frame;
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000722 }
723 }
724 }
725
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000726 co = f->f_code;
727 names = co->co_names;
728 consts = co->co_consts;
729 fastlocals = f->f_localsplus;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000730 freevars = f->f_localsplus + co->co_nlocals;
Brett Cannonc9371d42005-06-25 08:23:41 +0000731 first_instr = (unsigned char*) PyString_AS_STRING(co->co_code);
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000732 /* An explanation is in order for the next line.
733
734 f->f_lasti now refers to the index of the last instruction
735 executed. You might think this was obvious from the name, but
736 this wasn't always true before 2.3! PyFrame_New now sets
737 f->f_lasti to -1 (i.e. the index *before* the first instruction)
738 and YIELD_VALUE doesn't fiddle with f_lasti any more. So this
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000739 does work. Promise.
740
741 When the PREDICT() macros are enabled, some opcode pairs follow in
742 direct succession without updating f->f_lasti. A successful
743 prediction effectively links the two codes together as if they
744 were a single new opcode; accordingly,f->f_lasti will point to
745 the first code in the pair (for instance, GET_ITER followed by
746 FOR_ITER is effectively a single opcode and f->f_lasti will point
747 at to the beginning of the combined pair.)
748 */
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000749 next_instr = first_instr + f->f_lasti + 1;
750 stack_pointer = f->f_stacktop;
751 assert(stack_pointer != NULL);
752 f->f_stacktop = NULL; /* remains NULL unless yield suspends frame */
753
Tim Peters5ca576e2001-06-18 22:08:13 +0000754#ifdef LLTRACE
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000755 lltrace = PyDict_GetItemString(f->f_globals, "__lltrace__") != NULL;
Tim Peters5ca576e2001-06-18 22:08:13 +0000756#endif
Neal Norwitz5f5153e2005-10-21 04:28:38 +0000757#if defined(Py_DEBUG) || defined(LLTRACE)
Tim Peters5ca576e2001-06-18 22:08:13 +0000758 filename = PyString_AsString(co->co_filename);
759#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000760
Guido van Rossum374a9221991-04-04 10:40:29 +0000761 why = WHY_NOT;
762 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000763 x = Py_None; /* Not a reference, just anything non-NULL */
Fred Drake48fba732000-10-11 13:54:07 +0000764 w = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +0000765
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000766 if (throwflag) { /* support for generator.throw() */
Phillip J. Eby0d6615f2005-08-02 00:46:46 +0000767 why = WHY_EXCEPTION;
768 goto on_error;
769 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000770
Guido van Rossum374a9221991-04-04 10:40:29 +0000771 for (;;) {
Martin v. Löwisf30d60e2004-06-08 08:17:44 +0000772#ifdef WITH_TSC
773 if (inst1 == 0) {
774 /* Almost surely, the opcode executed a break
775 or a continue, preventing inst1 from being set
776 on the way out of the loop.
777 */
Michael W. Hudson75eabd22005-01-18 15:56:11 +0000778 READ_TIMESTAMP(inst1);
Martin v. Löwisf30d60e2004-06-08 08:17:44 +0000779 loop1 = inst1;
780 }
781 dump_tsc(opcode, ticked, inst0, inst1, loop0, loop1,
782 intr0, intr1);
783 ticked = 0;
784 inst1 = 0;
785 intr0 = 0;
786 intr1 = 0;
Michael W. Hudson75eabd22005-01-18 15:56:11 +0000787 READ_TIMESTAMP(loop0);
Martin v. Löwisf30d60e2004-06-08 08:17:44 +0000788#endif
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000789 assert(stack_pointer >= f->f_valuestack); /* else underflow */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000790 assert(STACK_LEVEL() <= co->co_stacksize); /* else overflow */
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000791
Guido van Rossuma027efa1997-05-05 20:56:21 +0000792 /* Do periodic things. Doing this every time through
793 the loop would add too much overhead, so we do it
794 only every Nth instruction. We also do it if
795 ``things_to_do'' is set, i.e. when an asynchronous
796 event needs attention (e.g. a signal handler or
797 async I/O handler); see Py_AddPendingCall() and
798 Py_MakePendingCalls() above. */
Guido van Rossumac7be682001-01-17 15:42:30 +0000799
Skip Montanarod581d772002-09-03 20:10:45 +0000800 if (--_Py_Ticker < 0) {
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000801 if (*next_instr == SETUP_FINALLY) {
802 /* Make the last opcode before
803 a try: finally: block uninterruptable. */
804 goto fast_next_opcode;
805 }
Skip Montanarod581d772002-09-03 20:10:45 +0000806 _Py_Ticker = _Py_CheckInterval;
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000807 tstate->tick_counter++;
Martin v. Löwisf30d60e2004-06-08 08:17:44 +0000808#ifdef WITH_TSC
809 ticked = 1;
810#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000811 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000812 if (Py_MakePendingCalls() < 0) {
813 why = WHY_EXCEPTION;
814 goto on_error;
815 }
Kurt B. Kaiser4c79a832004-11-23 18:06:08 +0000816 if (things_to_do)
817 /* MakePendingCalls() didn't succeed.
818 Force early re-execution of this
819 "periodic" code, possibly after
820 a thread switch */
821 _Py_Ticker = 0;
Guido van Rossum8861b741996-07-30 16:49:37 +0000822 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000823#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000824 if (interpreter_lock) {
825 /* Give another thread a chance */
826
Guido van Rossum25ce5661997-08-02 03:10:38 +0000827 if (PyThreadState_Swap(NULL) != tstate)
828 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000829 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000830
831 /* Other threads may run now */
832
Guido van Rossum65d5b571998-12-21 19:32:43 +0000833 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000834 if (PyThreadState_Swap(tstate) != NULL)
835 Py_FatalError("ceval: orphan tstate");
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000836
837 /* Check for thread interrupts */
838
839 if (tstate->async_exc != NULL) {
840 x = tstate->async_exc;
841 tstate->async_exc = NULL;
842 PyErr_SetNone(x);
843 Py_DECREF(x);
844 why = WHY_EXCEPTION;
845 goto on_error;
846 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000847 }
848#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000849 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000850
Neil Schemenauer63543862002-02-17 19:10:14 +0000851 fast_next_opcode:
Guido van Rossum99bec951992-09-03 20:29:45 +0000852 f->f_lasti = INSTR_OFFSET();
Guido van Rossumac7be682001-01-17 15:42:30 +0000853
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000854 /* line-by-line tracing support */
855
856 if (tstate->c_tracefunc != NULL && !tstate->tracing) {
857 /* see maybe_call_line_trace
858 for expository comments */
859 f->f_stacktop = stack_pointer;
Tim Peters8a5c3c72004-04-05 19:36:21 +0000860
Michael W. Hudson58ee2af2003-04-29 16:18:47 +0000861 err = maybe_call_line_trace(tstate->c_tracefunc,
862 tstate->c_traceobj,
Armin Rigobf57a142004-03-22 19:24:58 +0000863 f, &instr_lb, &instr_ub,
864 &instr_prev);
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000865 /* Reload possibly changed frame fields */
866 JUMPTO(f->f_lasti);
Michael W. Hudson58ee2af2003-04-29 16:18:47 +0000867 if (f->f_stacktop != NULL) {
868 stack_pointer = f->f_stacktop;
869 f->f_stacktop = NULL;
870 }
871 if (err) {
872 /* trace function raised an exception */
873 goto on_error;
874 }
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000875 }
876
877 /* Extract opcode and argument */
878
Guido van Rossum374a9221991-04-04 10:40:29 +0000879 opcode = NEXTOP();
Armin Rigo8817fcd2004-06-17 10:22:40 +0000880 oparg = 0; /* allows oparg to be stored in a register because
881 it doesn't have to be remembered across a full loop */
Raymond Hettinger5bed4562004-04-10 23:34:17 +0000882 if (HAS_ARG(opcode))
883 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +0000884 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +0000885#ifdef DYNAMIC_EXECUTION_PROFILE
886#ifdef DXPAIRS
887 dxpairs[lastopcode][opcode]++;
888 lastopcode = opcode;
889#endif
890 dxp[opcode]++;
891#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000892
Guido van Rossum96a42c81992-01-12 02:29:51 +0000893#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000894 /* Instruction tracing */
Guido van Rossumac7be682001-01-17 15:42:30 +0000895
Guido van Rossum96a42c81992-01-12 02:29:51 +0000896 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000897 if (HAS_ARG(opcode)) {
898 printf("%d: %d, %d\n",
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000899 f->f_lasti, opcode, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +0000900 }
901 else {
902 printf("%d: %d\n",
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000903 f->f_lasti, opcode);
Guido van Rossum374a9221991-04-04 10:40:29 +0000904 }
905 }
906#endif
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000907
Guido van Rossum374a9221991-04-04 10:40:29 +0000908 /* Main switch on opcode */
Michael W. Hudson75eabd22005-01-18 15:56:11 +0000909 READ_TIMESTAMP(inst0);
Jeremy Hylton52820442001-01-03 23:52:36 +0000910
Guido van Rossum374a9221991-04-04 10:40:29 +0000911 switch (opcode) {
Guido van Rossumac7be682001-01-17 15:42:30 +0000912
Guido van Rossum374a9221991-04-04 10:40:29 +0000913 /* BEWARE!
914 It is essential that any operation that fails sets either
915 x to NULL, err to nonzero, or why to anything but WHY_NOT,
916 and that no operation that succeeds does this! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000917
Guido van Rossum374a9221991-04-04 10:40:29 +0000918 /* case STOP_CODE: this is an error! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000919
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000920 case NOP:
921 goto fast_next_opcode;
922
Neil Schemenauer63543862002-02-17 19:10:14 +0000923 case LOAD_FAST:
924 x = GETLOCAL(oparg);
925 if (x != NULL) {
926 Py_INCREF(x);
927 PUSH(x);
928 goto fast_next_opcode;
929 }
930 format_exc_check_arg(PyExc_UnboundLocalError,
931 UNBOUNDLOCAL_ERROR_MSG,
932 PyTuple_GetItem(co->co_varnames, oparg));
933 break;
934
935 case LOAD_CONST:
Skip Montanaro04d80f82002-08-04 21:03:35 +0000936 x = GETITEM(consts, oparg);
Neil Schemenauer63543862002-02-17 19:10:14 +0000937 Py_INCREF(x);
938 PUSH(x);
939 goto fast_next_opcode;
940
Raymond Hettinger7dc52212003-03-16 20:14:44 +0000941 PREDICTED_WITH_ARG(STORE_FAST);
Neil Schemenauer63543862002-02-17 19:10:14 +0000942 case STORE_FAST:
943 v = POP();
944 SETLOCAL(oparg, v);
945 goto fast_next_opcode;
946
Raymond Hettingerf606f872003-03-16 03:11:04 +0000947 PREDICTED(POP_TOP);
Guido van Rossum374a9221991-04-04 10:40:29 +0000948 case POP_TOP:
949 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000950 Py_DECREF(v);
Neil Schemenauer63543862002-02-17 19:10:14 +0000951 goto fast_next_opcode;
Guido van Rossumac7be682001-01-17 15:42:30 +0000952
Guido van Rossum374a9221991-04-04 10:40:29 +0000953 case ROT_TWO:
Raymond Hettinger663004b2003-01-09 15:24:30 +0000954 v = TOP();
955 w = SECOND();
956 SET_TOP(w);
957 SET_SECOND(v);
Raymond Hettinger080cb322003-03-14 01:37:42 +0000958 goto fast_next_opcode;
Guido van Rossumac7be682001-01-17 15:42:30 +0000959
Guido van Rossum374a9221991-04-04 10:40:29 +0000960 case ROT_THREE:
Raymond Hettinger663004b2003-01-09 15:24:30 +0000961 v = TOP();
962 w = SECOND();
963 x = THIRD();
964 SET_TOP(w);
965 SET_SECOND(x);
966 SET_THIRD(v);
Raymond Hettinger080cb322003-03-14 01:37:42 +0000967 goto fast_next_opcode;
Guido van Rossumac7be682001-01-17 15:42:30 +0000968
Thomas Wouters434d0822000-08-24 20:11:32 +0000969 case ROT_FOUR:
Raymond Hettinger663004b2003-01-09 15:24:30 +0000970 u = TOP();
971 v = SECOND();
972 w = THIRD();
973 x = FOURTH();
974 SET_TOP(v);
975 SET_SECOND(w);
976 SET_THIRD(x);
977 SET_FOURTH(u);
Raymond Hettinger080cb322003-03-14 01:37:42 +0000978 goto fast_next_opcode;
Guido van Rossumac7be682001-01-17 15:42:30 +0000979
Guido van Rossum374a9221991-04-04 10:40:29 +0000980 case DUP_TOP:
981 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000982 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000983 PUSH(v);
Raymond Hettinger080cb322003-03-14 01:37:42 +0000984 goto fast_next_opcode;
Guido van Rossumac7be682001-01-17 15:42:30 +0000985
Thomas Wouters434d0822000-08-24 20:11:32 +0000986 case DUP_TOPX:
Raymond Hettinger4bad9ba2003-01-19 05:08:13 +0000987 if (oparg == 2) {
Raymond Hettinger663004b2003-01-09 15:24:30 +0000988 x = TOP();
Tim Peters35ba6892000-10-11 07:04:49 +0000989 Py_INCREF(x);
Raymond Hettinger663004b2003-01-09 15:24:30 +0000990 w = SECOND();
Tim Peters35ba6892000-10-11 07:04:49 +0000991 Py_INCREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +0000992 STACKADJ(2);
993 SET_TOP(x);
994 SET_SECOND(w);
Raymond Hettingerf606f872003-03-16 03:11:04 +0000995 goto fast_next_opcode;
Raymond Hettinger4bad9ba2003-01-19 05:08:13 +0000996 } else if (oparg == 3) {
Raymond Hettinger663004b2003-01-09 15:24:30 +0000997 x = TOP();
Tim Peters35ba6892000-10-11 07:04:49 +0000998 Py_INCREF(x);
Raymond Hettinger663004b2003-01-09 15:24:30 +0000999 w = SECOND();
Tim Peters35ba6892000-10-11 07:04:49 +00001000 Py_INCREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001001 v = THIRD();
Tim Peters35ba6892000-10-11 07:04:49 +00001002 Py_INCREF(v);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001003 STACKADJ(3);
1004 SET_TOP(x);
1005 SET_SECOND(w);
1006 SET_THIRD(v);
Raymond Hettingerf606f872003-03-16 03:11:04 +00001007 goto fast_next_opcode;
Thomas Wouters434d0822000-08-24 20:11:32 +00001008 }
Raymond Hettinger4bad9ba2003-01-19 05:08:13 +00001009 Py_FatalError("invalid argument to DUP_TOPX"
1010 " (bytecode corruption?)");
Tim Peters35ba6892000-10-11 07:04:49 +00001011 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00001012
Guido van Rossum374a9221991-04-04 10:40:29 +00001013 case UNARY_POSITIVE:
Raymond Hettinger663004b2003-01-09 15:24:30 +00001014 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001015 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001016 Py_DECREF(v);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001017 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001018 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001019 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001020
Guido van Rossum374a9221991-04-04 10:40:29 +00001021 case UNARY_NEGATIVE:
Raymond Hettinger663004b2003-01-09 15:24:30 +00001022 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001023 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001024 Py_DECREF(v);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001025 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001026 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001027 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001028
Guido van Rossum374a9221991-04-04 10:40:29 +00001029 case UNARY_NOT:
Raymond Hettinger663004b2003-01-09 15:24:30 +00001030 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001031 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001032 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +00001033 if (err == 0) {
1034 Py_INCREF(Py_True);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001035 SET_TOP(Py_True);
Guido van Rossumfc490731997-05-06 15:06:49 +00001036 continue;
1037 }
1038 else if (err > 0) {
1039 Py_INCREF(Py_False);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001040 SET_TOP(Py_False);
Guido van Rossumfc490731997-05-06 15:06:49 +00001041 err = 0;
1042 continue;
1043 }
Raymond Hettinger8bb90a52003-01-14 12:43:10 +00001044 STACKADJ(-1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001045 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001046
Guido van Rossum7928cd71991-10-24 14:59:31 +00001047 case UNARY_INVERT:
Raymond Hettinger663004b2003-01-09 15:24:30 +00001048 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001049 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001050 Py_DECREF(v);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001051 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001052 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001053 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001054
Guido van Rossum50564e81996-01-12 01:13:16 +00001055 case BINARY_POWER:
1056 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001057 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001058 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +00001059 Py_DECREF(v);
1060 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001061 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001062 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +00001063 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001064
Guido van Rossum374a9221991-04-04 10:40:29 +00001065 case BINARY_MULTIPLY:
1066 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001067 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001068 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001069 Py_DECREF(v);
1070 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001071 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001072 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001073 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001074
Tim Peters3caca232001-12-06 06:23:26 +00001075 case BINARY_TRUE_DIVIDE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001076 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001077 v = TOP();
Tim Peters3caca232001-12-06 06:23:26 +00001078 x = PyNumber_TrueDivide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001079 Py_DECREF(v);
1080 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001081 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001082 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001083 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001084
Guido van Rossum4668b002001-08-08 05:00:18 +00001085 case BINARY_FLOOR_DIVIDE:
1086 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001087 v = TOP();
Guido van Rossum4668b002001-08-08 05:00:18 +00001088 x = PyNumber_FloorDivide(v, w);
1089 Py_DECREF(v);
1090 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001091 SET_TOP(x);
Guido van Rossum4668b002001-08-08 05:00:18 +00001092 if (x != NULL) continue;
1093 break;
1094
Guido van Rossum374a9221991-04-04 10:40:29 +00001095 case BINARY_MODULO:
1096 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001097 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001098 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001099 Py_DECREF(v);
1100 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001101 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001102 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001103 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001104
Guido van Rossum374a9221991-04-04 10:40:29 +00001105 case BINARY_ADD:
1106 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001107 v = TOP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001108 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001109 /* INLINE: int + int */
1110 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001111 a = PyInt_AS_LONG(v);
1112 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001113 i = a + b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001114 if ((i^a) < 0 && (i^b) < 0)
1115 goto slow_add;
1116 x = PyInt_FromLong(i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001117 }
Raymond Hettinger52a21b82004-08-06 18:43:09 +00001118 else if (PyString_CheckExact(v) &&
1119 PyString_CheckExact(w)) {
1120 x = string_concatenate(v, w, f, next_instr);
1121 /* string_concatenate consumed the ref to v */
1122 goto skip_decref_vx;
1123 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001124 else {
1125 slow_add:
Guido van Rossumc12da691997-07-17 23:12:42 +00001126 x = PyNumber_Add(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001127 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001128 Py_DECREF(v);
Raymond Hettinger52a21b82004-08-06 18:43:09 +00001129 skip_decref_vx:
Guido van Rossumb209a111997-04-29 18:18:01 +00001130 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001131 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001132 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001133 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001134
Guido van Rossum374a9221991-04-04 10:40:29 +00001135 case BINARY_SUBTRACT:
1136 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001137 v = TOP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001138 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001139 /* INLINE: int - int */
1140 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001141 a = PyInt_AS_LONG(v);
1142 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001143 i = a - b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001144 if ((i^a) < 0 && (i^~b) < 0)
1145 goto slow_sub;
1146 x = PyInt_FromLong(i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001147 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001148 else {
1149 slow_sub:
Guido van Rossumc12da691997-07-17 23:12:42 +00001150 x = PyNumber_Subtract(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001151 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001152 Py_DECREF(v);
1153 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001154 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001155 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001156 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001157
Guido van Rossum374a9221991-04-04 10:40:29 +00001158 case BINARY_SUBSCR:
1159 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001160 v = TOP();
Tim Petersb1c46982001-10-05 20:41:38 +00001161 if (PyList_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001162 /* INLINE: list[int] */
Neal Norwitz814e9382006-03-02 07:54:28 +00001163 Py_ssize_t i = PyInt_AsSsize_t(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001164 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +00001165 i += PyList_GET_SIZE(v);
Raymond Hettinger467a6982004-04-07 11:39:21 +00001166 if (i >= 0 && i < PyList_GET_SIZE(v)) {
Guido van Rossumfa00e951998-07-08 15:02:37 +00001167 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001168 Py_INCREF(x);
1169 }
Raymond Hettinger467a6982004-04-07 11:39:21 +00001170 else
1171 goto slow_get;
Guido van Rossumc12da691997-07-17 23:12:42 +00001172 }
1173 else
Raymond Hettinger467a6982004-04-07 11:39:21 +00001174 slow_get:
Guido van Rossumc12da691997-07-17 23:12:42 +00001175 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001176 Py_DECREF(v);
1177 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001178 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001179 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001180 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001181
Guido van Rossum7928cd71991-10-24 14:59:31 +00001182 case BINARY_LSHIFT:
1183 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001184 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001185 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001186 Py_DECREF(v);
1187 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001188 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001189 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001190 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001191
Guido van Rossum7928cd71991-10-24 14:59:31 +00001192 case BINARY_RSHIFT:
1193 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001194 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001195 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001196 Py_DECREF(v);
1197 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001198 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001199 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001200 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001201
Guido van Rossum7928cd71991-10-24 14:59:31 +00001202 case BINARY_AND:
1203 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001204 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001205 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001206 Py_DECREF(v);
1207 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001208 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001209 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001210 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001211
Guido van Rossum7928cd71991-10-24 14:59:31 +00001212 case BINARY_XOR:
1213 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001214 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001215 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001216 Py_DECREF(v);
1217 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001218 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001219 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001220 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001221
Guido van Rossum7928cd71991-10-24 14:59:31 +00001222 case BINARY_OR:
1223 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001224 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001225 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001226 Py_DECREF(v);
1227 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001228 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001229 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001230 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00001231
Raymond Hettingerdd80f762004-03-07 07:31:06 +00001232 case LIST_APPEND:
1233 w = POP();
1234 v = POP();
1235 err = PyList_Append(v, w);
1236 Py_DECREF(v);
1237 Py_DECREF(w);
Raymond Hettingerfba1cfc2004-03-12 16:33:17 +00001238 if (err == 0) {
1239 PREDICT(JUMP_ABSOLUTE);
1240 continue;
1241 }
Raymond Hettingerdd80f762004-03-07 07:31:06 +00001242 break;
1243
Nick Coghlan650f0d02007-04-15 12:05:43 +00001244 case SET_ADD:
1245 w = POP();
1246 v = POP();
1247 err = PySet_Add(v, w);
1248 Py_DECREF(v);
1249 Py_DECREF(w);
1250 if (err == 0) {
1251 PREDICT(JUMP_ABSOLUTE);
1252 continue;
1253 }
1254 break;
1255
Thomas Wouters434d0822000-08-24 20:11:32 +00001256 case INPLACE_POWER:
1257 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001258 v = TOP();
Thomas Wouters434d0822000-08-24 20:11:32 +00001259 x = PyNumber_InPlacePower(v, w, Py_None);
1260 Py_DECREF(v);
1261 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001262 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001263 if (x != NULL) continue;
1264 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001265
Thomas Wouters434d0822000-08-24 20:11:32 +00001266 case INPLACE_MULTIPLY:
1267 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001268 v = TOP();
Thomas Wouters434d0822000-08-24 20:11:32 +00001269 x = PyNumber_InPlaceMultiply(v, w);
1270 Py_DECREF(v);
1271 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001272 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001273 if (x != NULL) continue;
1274 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001275
Tim Peters54b11912001-12-25 18:49:11 +00001276 case INPLACE_TRUE_DIVIDE:
Thomas Wouters434d0822000-08-24 20:11:32 +00001277 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001278 v = TOP();
Tim Peters54b11912001-12-25 18:49:11 +00001279 x = PyNumber_InPlaceTrueDivide(v, w);
Thomas Wouters434d0822000-08-24 20:11:32 +00001280 Py_DECREF(v);
1281 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001282 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001283 if (x != NULL) continue;
1284 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001285
Guido van Rossum4668b002001-08-08 05:00:18 +00001286 case INPLACE_FLOOR_DIVIDE:
1287 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001288 v = TOP();
Guido van Rossum4668b002001-08-08 05:00:18 +00001289 x = PyNumber_InPlaceFloorDivide(v, w);
1290 Py_DECREF(v);
1291 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001292 SET_TOP(x);
Guido van Rossum4668b002001-08-08 05:00:18 +00001293 if (x != NULL) continue;
1294 break;
1295
Thomas Wouters434d0822000-08-24 20:11:32 +00001296 case INPLACE_MODULO:
1297 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001298 v = TOP();
Thomas Wouters434d0822000-08-24 20:11:32 +00001299 x = PyNumber_InPlaceRemainder(v, w);
1300 Py_DECREF(v);
1301 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001302 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001303 if (x != NULL) continue;
1304 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001305
Thomas Wouters434d0822000-08-24 20:11:32 +00001306 case INPLACE_ADD:
1307 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001308 v = TOP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001309 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Thomas Wouters434d0822000-08-24 20:11:32 +00001310 /* INLINE: int + int */
1311 register long a, b, i;
1312 a = PyInt_AS_LONG(v);
1313 b = PyInt_AS_LONG(w);
1314 i = a + b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001315 if ((i^a) < 0 && (i^b) < 0)
1316 goto slow_iadd;
1317 x = PyInt_FromLong(i);
Thomas Wouters434d0822000-08-24 20:11:32 +00001318 }
Raymond Hettinger52a21b82004-08-06 18:43:09 +00001319 else if (PyString_CheckExact(v) &&
1320 PyString_CheckExact(w)) {
1321 x = string_concatenate(v, w, f, next_instr);
1322 /* string_concatenate consumed the ref to v */
1323 goto skip_decref_v;
1324 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001325 else {
1326 slow_iadd:
Thomas Wouters434d0822000-08-24 20:11:32 +00001327 x = PyNumber_InPlaceAdd(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001328 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001329 Py_DECREF(v);
Raymond Hettinger52a21b82004-08-06 18:43:09 +00001330 skip_decref_v:
Thomas Wouters434d0822000-08-24 20:11:32 +00001331 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001332 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001333 if (x != NULL) continue;
1334 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001335
Thomas Wouters434d0822000-08-24 20:11:32 +00001336 case INPLACE_SUBTRACT:
1337 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001338 v = TOP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001339 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Thomas Wouters434d0822000-08-24 20:11:32 +00001340 /* INLINE: int - int */
1341 register long a, b, i;
1342 a = PyInt_AS_LONG(v);
1343 b = PyInt_AS_LONG(w);
1344 i = a - b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001345 if ((i^a) < 0 && (i^~b) < 0)
1346 goto slow_isub;
1347 x = PyInt_FromLong(i);
Thomas Wouters434d0822000-08-24 20:11:32 +00001348 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001349 else {
1350 slow_isub:
Thomas Wouters434d0822000-08-24 20:11:32 +00001351 x = PyNumber_InPlaceSubtract(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001352 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001353 Py_DECREF(v);
1354 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001355 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001356 if (x != NULL) continue;
1357 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001358
Thomas Wouters434d0822000-08-24 20:11:32 +00001359 case INPLACE_LSHIFT:
1360 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001361 v = TOP();
Thomas Wouters434d0822000-08-24 20:11:32 +00001362 x = PyNumber_InPlaceLshift(v, w);
1363 Py_DECREF(v);
1364 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001365 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001366 if (x != NULL) continue;
1367 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001368
Thomas Wouters434d0822000-08-24 20:11:32 +00001369 case INPLACE_RSHIFT:
1370 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001371 v = TOP();
Thomas Wouters434d0822000-08-24 20:11:32 +00001372 x = PyNumber_InPlaceRshift(v, w);
1373 Py_DECREF(v);
1374 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001375 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001376 if (x != NULL) continue;
1377 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001378
Thomas Wouters434d0822000-08-24 20:11:32 +00001379 case INPLACE_AND:
1380 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001381 v = TOP();
Thomas Wouters434d0822000-08-24 20:11:32 +00001382 x = PyNumber_InPlaceAnd(v, w);
1383 Py_DECREF(v);
1384 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001385 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001386 if (x != NULL) continue;
1387 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001388
Thomas Wouters434d0822000-08-24 20:11:32 +00001389 case INPLACE_XOR:
1390 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001391 v = TOP();
Thomas Wouters434d0822000-08-24 20:11:32 +00001392 x = PyNumber_InPlaceXor(v, w);
1393 Py_DECREF(v);
1394 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001395 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001396 if (x != NULL) continue;
1397 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001398
Thomas Wouters434d0822000-08-24 20:11:32 +00001399 case INPLACE_OR:
1400 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001401 v = TOP();
Thomas Wouters434d0822000-08-24 20:11:32 +00001402 x = PyNumber_InPlaceOr(v, w);
1403 Py_DECREF(v);
1404 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001405 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001406 if (x != NULL) continue;
1407 break;
1408
Guido van Rossum374a9221991-04-04 10:40:29 +00001409 case SLICE+0:
1410 case SLICE+1:
1411 case SLICE+2:
1412 case SLICE+3:
1413 if ((opcode-SLICE) & 2)
1414 w = POP();
1415 else
1416 w = NULL;
1417 if ((opcode-SLICE) & 1)
1418 v = POP();
1419 else
1420 v = NULL;
Raymond Hettinger663004b2003-01-09 15:24:30 +00001421 u = TOP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001422 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001423 Py_DECREF(u);
1424 Py_XDECREF(v);
1425 Py_XDECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001426 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001427 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001428 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001429
Guido van Rossum374a9221991-04-04 10:40:29 +00001430 case STORE_SLICE+0:
1431 case STORE_SLICE+1:
1432 case STORE_SLICE+2:
1433 case STORE_SLICE+3:
1434 if ((opcode-STORE_SLICE) & 2)
1435 w = POP();
1436 else
1437 w = NULL;
1438 if ((opcode-STORE_SLICE) & 1)
1439 v = POP();
1440 else
1441 v = NULL;
1442 u = POP();
1443 t = POP();
1444 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +00001445 Py_DECREF(t);
1446 Py_DECREF(u);
1447 Py_XDECREF(v);
1448 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001449 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001450 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001451
Guido van Rossum374a9221991-04-04 10:40:29 +00001452 case DELETE_SLICE+0:
1453 case DELETE_SLICE+1:
1454 case DELETE_SLICE+2:
1455 case DELETE_SLICE+3:
1456 if ((opcode-DELETE_SLICE) & 2)
1457 w = POP();
1458 else
1459 w = NULL;
1460 if ((opcode-DELETE_SLICE) & 1)
1461 v = POP();
1462 else
1463 v = NULL;
1464 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001465 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +00001466 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00001467 Py_DECREF(u);
1468 Py_XDECREF(v);
1469 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001470 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001471 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001472
Guido van Rossum374a9221991-04-04 10:40:29 +00001473 case STORE_SUBSCR:
Raymond Hettinger663004b2003-01-09 15:24:30 +00001474 w = TOP();
1475 v = SECOND();
1476 u = THIRD();
1477 STACKADJ(-3);
Guido van Rossum374a9221991-04-04 10:40:29 +00001478 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +00001479 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001480 Py_DECREF(u);
1481 Py_DECREF(v);
1482 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001483 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001484 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001485
Guido van Rossum374a9221991-04-04 10:40:29 +00001486 case DELETE_SUBSCR:
Raymond Hettinger663004b2003-01-09 15:24:30 +00001487 w = TOP();
1488 v = SECOND();
1489 STACKADJ(-2);
Guido van Rossum374a9221991-04-04 10:40:29 +00001490 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001491 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001492 Py_DECREF(v);
1493 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001494 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001495 break;
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001496
Guido van Rossum374a9221991-04-04 10:40:29 +00001497 case PRINT_EXPR:
1498 v = POP();
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001499 w = PySys_GetObject("displayhook");
1500 if (w == NULL) {
1501 PyErr_SetString(PyExc_RuntimeError,
1502 "lost sys.displayhook");
1503 err = -1;
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001504 x = NULL;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001505 }
1506 if (err == 0) {
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001507 x = PyTuple_Pack(1, v);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001508 if (x == NULL)
1509 err = -1;
1510 }
1511 if (err == 0) {
1512 w = PyEval_CallObject(w, x);
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001513 Py_XDECREF(w);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001514 if (w == NULL)
1515 err = -1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001516 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001517 Py_DECREF(v);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001518 Py_XDECREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001519 break;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001520
Thomas Wouters434d0822000-08-24 20:11:32 +00001521#ifdef CASE_TOO_BIG
1522 default: switch (opcode) {
1523#endif
Guido van Rossumf10570b1995-07-07 22:53:21 +00001524 case RAISE_VARARGS:
1525 u = v = w = NULL;
1526 switch (oparg) {
1527 case 3:
1528 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001529 /* Fallthrough */
1530 case 2:
1531 v = POP(); /* value */
1532 /* Fallthrough */
1533 case 1:
1534 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001535 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001536 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001537 break;
1538 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001539 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001540 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001541 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001542 break;
1543 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001544 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001545
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001546 case STORE_LOCALS:
1547 x = POP();
1548 v = f->f_locals;
1549 Py_XDECREF(v);
1550 f->f_locals = x;
1551 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001552
Guido van Rossum374a9221991-04-04 10:40:29 +00001553 case RETURN_VALUE:
1554 retval = POP();
1555 why = WHY_RETURN;
Raymond Hettinger1dd83092004-02-06 18:32:33 +00001556 goto fast_block_end;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001557
Tim Peters5ca576e2001-06-18 22:08:13 +00001558 case YIELD_VALUE:
1559 retval = POP();
Tim Peters8c963692001-06-23 05:26:56 +00001560 f->f_stacktop = stack_pointer;
Tim Peters5ca576e2001-06-18 22:08:13 +00001561 why = WHY_YIELD;
Raymond Hettinger1dd83092004-02-06 18:32:33 +00001562 goto fast_yield;
Tim Peters5ca576e2001-06-18 22:08:13 +00001563
Guido van Rossum374a9221991-04-04 10:40:29 +00001564 case POP_BLOCK:
1565 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001566 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001567 while (STACK_LEVEL() > b->b_level) {
1568 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001569 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001570 }
1571 }
Raymond Hettinger7eddd782004-04-07 14:38:08 +00001572 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001573
Guido van Rossum374a9221991-04-04 10:40:29 +00001574 case END_FINALLY:
1575 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001576 if (PyInt_Check(v)) {
Raymond Hettinger7c958652004-04-06 10:11:10 +00001577 why = (enum why_code) PyInt_AS_LONG(v);
Tim Peters8a5c3c72004-04-05 19:36:21 +00001578 assert(why != WHY_YIELD);
Raymond Hettingerc8aa08b2004-04-11 14:59:33 +00001579 if (why == WHY_RETURN ||
1580 why == WHY_CONTINUE)
Guido van Rossum374a9221991-04-04 10:40:29 +00001581 retval = POP();
1582 }
Brett Cannonf74225d2007-02-26 21:10:16 +00001583 else if (PyExceptionClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001584 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001585 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001586 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001587 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001588 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001589 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001590 else if (v != Py_None) {
1591 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001592 "'finally' pops bad exception");
1593 why = WHY_EXCEPTION;
1594 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001595 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001596 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001597
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001598 case LOAD_BUILD_CLASS:
1599 x = PyDict_GetItemString(f->f_builtins,
1600 "__build_class__");
1601 if (x == NULL) {
1602 PyErr_SetString(PyExc_ImportError,
1603 "__build_class__ not found");
1604 break;
1605 }
1606 Py_INCREF(x);
1607 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001608 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001609
Guido van Rossum374a9221991-04-04 10:40:29 +00001610 case STORE_NAME:
Skip Montanaro496e6582002-08-06 17:47:40 +00001611 w = GETITEM(names, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001612 v = POP();
Raymond Hettinger467a6982004-04-07 11:39:21 +00001613 if ((x = f->f_locals) != NULL) {
Raymond Hettinger66bd2332004-08-02 08:30:07 +00001614 if (PyDict_CheckExact(x))
Raymond Hettinger214b1c32004-07-02 06:41:07 +00001615 err = PyDict_SetItem(x, w, v);
1616 else
1617 err = PyObject_SetItem(x, w, v);
Raymond Hettinger467a6982004-04-07 11:39:21 +00001618 Py_DECREF(v);
Raymond Hettinger7eddd782004-04-07 14:38:08 +00001619 if (err == 0) continue;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001620 break;
1621 }
Raymond Hettinger467a6982004-04-07 11:39:21 +00001622 PyErr_Format(PyExc_SystemError,
1623 "no locals found when storing %s",
1624 PyObject_REPR(w));
Guido van Rossum374a9221991-04-04 10:40:29 +00001625 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001626
Guido van Rossum374a9221991-04-04 10:40:29 +00001627 case DELETE_NAME:
Skip Montanaro496e6582002-08-06 17:47:40 +00001628 w = GETITEM(names, oparg);
Raymond Hettinger467a6982004-04-07 11:39:21 +00001629 if ((x = f->f_locals) != NULL) {
Raymond Hettinger214b1c32004-07-02 06:41:07 +00001630 if ((err = PyObject_DelItem(x, w)) != 0)
Raymond Hettinger467a6982004-04-07 11:39:21 +00001631 format_exc_check_arg(PyExc_NameError,
1632 NAME_ERROR_MSG ,w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001633 break;
1634 }
Raymond Hettinger467a6982004-04-07 11:39:21 +00001635 PyErr_Format(PyExc_SystemError,
1636 "no locals when deleting %s",
1637 PyObject_REPR(w));
Guido van Rossum374a9221991-04-04 10:40:29 +00001638 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001639
Raymond Hettinger7dc52212003-03-16 20:14:44 +00001640 PREDICTED_WITH_ARG(UNPACK_SEQUENCE);
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001641 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001642 v = POP();
Raymond Hettingerf114a3a2004-03-08 23:25:30 +00001643 if (PyTuple_CheckExact(v) && PyTuple_GET_SIZE(v) == oparg) {
1644 PyObject **items = ((PyTupleObject *)v)->ob_item;
1645 while (oparg--) {
1646 w = items[oparg];
1647 Py_INCREF(w);
1648 PUSH(w);
Barry Warsawe42b18f1997-08-25 22:13:04 +00001649 }
Raymond Hettinger7eddd782004-04-07 14:38:08 +00001650 Py_DECREF(v);
1651 continue;
Raymond Hettingerf114a3a2004-03-08 23:25:30 +00001652 } else if (PyList_CheckExact(v) && PyList_GET_SIZE(v) == oparg) {
1653 PyObject **items = ((PyListObject *)v)->ob_item;
1654 while (oparg--) {
1655 w = items[oparg];
1656 Py_INCREF(w);
1657 PUSH(w);
Barry Warsawe42b18f1997-08-25 22:13:04 +00001658 }
Guido van Rossum0368b722007-05-11 16:50:42 +00001659 } else if (unpack_iterable(v, oparg, -1,
Guido van Rossumd8faa362007-04-27 19:54:29 +00001660 stack_pointer + oparg)) {
Tim Petersd6d010b2001-06-21 02:49:55 +00001661 stack_pointer += oparg;
Guido van Rossumd8faa362007-04-27 19:54:29 +00001662 } else {
1663 /* unpack_iterable() raised an exception */
Barry Warsawe42b18f1997-08-25 22:13:04 +00001664 why = WHY_EXCEPTION;
Tim Peters8b13b3e2001-09-30 05:58:42 +00001665 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001666 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001667 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001668
Guido van Rossum0368b722007-05-11 16:50:42 +00001669 case UNPACK_EX:
1670 {
1671 int totalargs = 1 + (oparg & 0xFF) + (oparg >> 8);
1672 v = POP();
1673
1674 if (unpack_iterable(v, oparg & 0xFF, oparg >> 8,
1675 stack_pointer + totalargs)) {
1676 stack_pointer += totalargs;
1677 } else {
1678 why = WHY_EXCEPTION;
1679 }
1680 Py_DECREF(v);
1681 break;
1682 }
1683
Guido van Rossum374a9221991-04-04 10:40:29 +00001684 case STORE_ATTR:
Skip Montanaro496e6582002-08-06 17:47:40 +00001685 w = GETITEM(names, oparg);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001686 v = TOP();
1687 u = SECOND();
1688 STACKADJ(-2);
Guido van Rossumb209a111997-04-29 18:18:01 +00001689 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1690 Py_DECREF(v);
1691 Py_DECREF(u);
Raymond Hettinger7eddd782004-04-07 14:38:08 +00001692 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001693 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001694
Guido van Rossum374a9221991-04-04 10:40:29 +00001695 case DELETE_ATTR:
Skip Montanaro496e6582002-08-06 17:47:40 +00001696 w = GETITEM(names, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001697 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001698 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1699 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001700 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001701 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001702
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001703 case STORE_GLOBAL:
Skip Montanaro496e6582002-08-06 17:47:40 +00001704 w = GETITEM(names, oparg);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001705 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001706 err = PyDict_SetItem(f->f_globals, w, v);
1707 Py_DECREF(v);
Raymond Hettinger7eddd782004-04-07 14:38:08 +00001708 if (err == 0) continue;
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001709 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001710
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001711 case DELETE_GLOBAL:
Skip Montanaro496e6582002-08-06 17:47:40 +00001712 w = GETITEM(names, oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001713 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001714 format_exc_check_arg(
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001715 PyExc_NameError, GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001716 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001717
Guido van Rossum374a9221991-04-04 10:40:29 +00001718 case LOAD_NAME:
Skip Montanaro496e6582002-08-06 17:47:40 +00001719 w = GETITEM(names, oparg);
Raymond Hettinger214b1c32004-07-02 06:41:07 +00001720 if ((v = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001721 PyErr_Format(PyExc_SystemError,
1722 "no locals when loading %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001723 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001724 break;
1725 }
Michael W. Hudsona3711f72004-08-02 14:50:43 +00001726 if (PyDict_CheckExact(v)) {
Raymond Hettinger214b1c32004-07-02 06:41:07 +00001727 x = PyDict_GetItem(v, w);
Michael W. Hudsona3711f72004-08-02 14:50:43 +00001728 Py_XINCREF(x);
1729 }
Raymond Hettinger214b1c32004-07-02 06:41:07 +00001730 else {
1731 x = PyObject_GetItem(v, w);
1732 if (x == NULL && PyErr_Occurred()) {
1733 if (!PyErr_ExceptionMatches(PyExc_KeyError))
1734 break;
1735 PyErr_Clear();
1736 }
1737 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001738 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001739 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001740 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001741 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001742 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001743 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001744 PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001745 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001746 break;
1747 }
1748 }
Michael W. Hudsona3711f72004-08-02 14:50:43 +00001749 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001750 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001751 PUSH(x);
Raymond Hettinger467a6982004-04-07 11:39:21 +00001752 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001753
Guido van Rossum374a9221991-04-04 10:40:29 +00001754 case LOAD_GLOBAL:
Skip Montanaro496e6582002-08-06 17:47:40 +00001755 w = GETITEM(names, oparg);
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001756 if (PyString_CheckExact(w)) {
Guido van Rossumd8dbf842002-08-19 21:17:53 +00001757 /* Inline the PyDict_GetItem() calls.
1758 WARNING: this is an extreme speed hack.
1759 Do not try this at home. */
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001760 long hash = ((PyStringObject *)w)->ob_shash;
1761 if (hash != -1) {
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001762 PyDictObject *d;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001763 PyDictEntry *e;
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001764 d = (PyDictObject *)(f->f_globals);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001765 e = d->ma_lookup(d, w, hash);
1766 if (e == NULL) {
1767 x = NULL;
1768 break;
1769 }
1770 x = e->me_value;
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001771 if (x != NULL) {
1772 Py_INCREF(x);
1773 PUSH(x);
1774 continue;
1775 }
1776 d = (PyDictObject *)(f->f_builtins);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001777 e = d->ma_lookup(d, w, hash);
1778 if (e == NULL) {
1779 x = NULL;
1780 break;
1781 }
1782 x = e->me_value;
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001783 if (x != NULL) {
1784 Py_INCREF(x);
1785 PUSH(x);
1786 continue;
1787 }
1788 goto load_global_error;
1789 }
1790 }
1791 /* This is the un-inlined version of the code above */
Guido van Rossumb209a111997-04-29 18:18:01 +00001792 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001793 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001794 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001795 if (x == NULL) {
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001796 load_global_error:
Paul Prescode68140d2000-08-30 20:25:01 +00001797 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001798 PyExc_NameError,
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00001799 GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001800 break;
1801 }
1802 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001803 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001804 PUSH(x);
Raymond Hettinger7eddd782004-04-07 14:38:08 +00001805 continue;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001806
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001807 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001808 x = GETLOCAL(oparg);
Raymond Hettinger467a6982004-04-07 11:39:21 +00001809 if (x != NULL) {
1810 SETLOCAL(oparg, NULL);
1811 continue;
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001812 }
Raymond Hettinger467a6982004-04-07 11:39:21 +00001813 format_exc_check_arg(
1814 PyExc_UnboundLocalError,
1815 UNBOUNDLOCAL_ERROR_MSG,
1816 PyTuple_GetItem(co->co_varnames, oparg)
1817 );
1818 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001819
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001820 case LOAD_CLOSURE:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001821 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001822 Py_INCREF(x);
1823 PUSH(x);
Raymond Hettinger7eddd782004-04-07 14:38:08 +00001824 if (x != NULL) continue;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001825 break;
1826
1827 case LOAD_DEREF:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001828 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001829 w = PyCell_Get(x);
Raymond Hettinger467a6982004-04-07 11:39:21 +00001830 if (w != NULL) {
1831 PUSH(w);
1832 continue;
Jeremy Hylton2524d692001-02-05 17:23:16 +00001833 }
Raymond Hettinger467a6982004-04-07 11:39:21 +00001834 err = -1;
1835 /* Don't stomp existing exception */
1836 if (PyErr_Occurred())
1837 break;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001838 if (oparg < PyTuple_GET_SIZE(co->co_cellvars)) {
1839 v = PyTuple_GET_ITEM(co->co_cellvars,
Raymond Hettinger467a6982004-04-07 11:39:21 +00001840 oparg);
1841 format_exc_check_arg(
1842 PyExc_UnboundLocalError,
1843 UNBOUNDLOCAL_ERROR_MSG,
1844 v);
1845 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00001846 v = PyTuple_GET_ITEM(
Raymond Hettinger467a6982004-04-07 11:39:21 +00001847 co->co_freevars,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001848 oparg - PyTuple_GET_SIZE(co->co_cellvars));
Raymond Hettinger467a6982004-04-07 11:39:21 +00001849 format_exc_check_arg(
1850 PyExc_NameError,
1851 UNBOUNDFREE_ERROR_MSG,
1852 v);
1853 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001854 break;
1855
1856 case STORE_DEREF:
1857 w = POP();
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001858 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001859 PyCell_Set(x, w);
Jeremy Hylton30c9f392001-03-13 01:58:22 +00001860 Py_DECREF(w);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001861 continue;
1862
Guido van Rossum374a9221991-04-04 10:40:29 +00001863 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001864 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001865 if (x != NULL) {
Raymond Hettinger5bed4562004-04-10 23:34:17 +00001866 for (; --oparg >= 0;) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001867 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001868 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001869 }
1870 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001871 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001872 }
1873 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001874
Guido van Rossum374a9221991-04-04 10:40:29 +00001875 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001876 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001877 if (x != NULL) {
Raymond Hettinger5bed4562004-04-10 23:34:17 +00001878 for (; --oparg >= 0;) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001879 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001880 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001881 }
1882 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001883 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001884 }
1885 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001886
Guido van Rossum86e58e22006-08-28 15:27:34 +00001887 case BUILD_SET:
1888 x = PySet_New(NULL);
1889 if (x != NULL) {
1890 for (; --oparg >= 0;) {
1891 w = POP();
1892 if (err == 0)
1893 err = PySet_Add(x, w);
1894 Py_DECREF(w);
1895 }
1896 if (err != 0) {
1897 Py_DECREF(x);
1898 break;
1899 }
1900 PUSH(x);
1901 continue;
1902 }
1903 break;
1904
Guido van Rossum374a9221991-04-04 10:40:29 +00001905 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001906 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001907 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001908 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001909 break;
Thomas Wouters00e41de2007-02-23 19:56:57 +00001910
1911 case MAKE_BYTES:
1912 w = POP();
1913 if (PyString_Check(w))
1914 x = PyBytes_FromStringAndSize(
1915 PyString_AS_STRING(w),
1916 PyString_GET_SIZE(w));
1917 else
1918 x = NULL;
1919 Py_DECREF(w);
1920 PUSH(x);
1921 if (x != NULL) continue;
1922 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001923
Guido van Rossum374a9221991-04-04 10:40:29 +00001924 case LOAD_ATTR:
Skip Montanaro496e6582002-08-06 17:47:40 +00001925 w = GETITEM(names, oparg);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001926 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001927 x = PyObject_GetAttr(v, w);
1928 Py_DECREF(v);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001929 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001930 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001931 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001932
Guido van Rossum374a9221991-04-04 10:40:29 +00001933 case COMPARE_OP:
1934 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001935 v = TOP();
Raymond Hettinger4bad9ba2003-01-19 05:08:13 +00001936 if (PyInt_CheckExact(w) && PyInt_CheckExact(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001937 /* INLINE: cmp(int, int) */
1938 register long a, b;
1939 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001940 a = PyInt_AS_LONG(v);
1941 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001942 switch (oparg) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00001943 case PyCmp_LT: res = a < b; break;
1944 case PyCmp_LE: res = a <= b; break;
1945 case PyCmp_EQ: res = a == b; break;
1946 case PyCmp_NE: res = a != b; break;
1947 case PyCmp_GT: res = a > b; break;
1948 case PyCmp_GE: res = a >= b; break;
1949 case PyCmp_IS: res = v == w; break;
1950 case PyCmp_IS_NOT: res = v != w; break;
Guido van Rossumc12da691997-07-17 23:12:42 +00001951 default: goto slow_compare;
1952 }
1953 x = res ? Py_True : Py_False;
1954 Py_INCREF(x);
1955 }
1956 else {
1957 slow_compare:
1958 x = cmp_outcome(oparg, v, w);
1959 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001960 Py_DECREF(v);
1961 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001962 SET_TOP(x);
Raymond Hettingerf606f872003-03-16 03:11:04 +00001963 if (x == NULL) break;
1964 PREDICT(JUMP_IF_FALSE);
1965 PREDICT(JUMP_IF_TRUE);
1966 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001967
Guido van Rossum374a9221991-04-04 10:40:29 +00001968 case IMPORT_NAME:
Skip Montanaro496e6582002-08-06 17:47:40 +00001969 w = GETITEM(names, oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001970 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001971 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001972 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001973 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001974 break;
1975 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00001976 v = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001977 u = TOP();
Thomas Woutersf7f438b2006-02-28 16:09:29 +00001978 if (PyInt_AsLong(u) != -1 || PyErr_Occurred())
1979 w = PyTuple_Pack(5,
1980 w,
1981 f->f_globals,
1982 f->f_locals == NULL ?
1983 Py_None : f->f_locals,
1984 v,
1985 u);
1986 else
1987 w = PyTuple_Pack(4,
1988 w,
1989 f->f_globals,
1990 f->f_locals == NULL ?
1991 Py_None : f->f_locals,
1992 v);
1993 Py_DECREF(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001994 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001995 if (w == NULL) {
Raymond Hettinger663004b2003-01-09 15:24:30 +00001996 u = POP();
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001997 x = NULL;
1998 break;
1999 }
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002000 READ_TIMESTAMP(intr0);
Guido van Rossumb209a111997-04-29 18:18:01 +00002001 x = PyEval_CallObject(x, w);
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002002 READ_TIMESTAMP(intr1);
Guido van Rossumb209a111997-04-29 18:18:01 +00002003 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00002004 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002005 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00002006 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00002007
Thomas Wouters52152252000-08-17 22:55:00 +00002008 case IMPORT_STAR:
2009 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002010 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002011 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002012 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00002013 "no locals found during 'import *'");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002014 break;
2015 }
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002016 READ_TIMESTAMP(intr0);
Thomas Wouters52152252000-08-17 22:55:00 +00002017 err = import_all_from(x, v);
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002018 READ_TIMESTAMP(intr1);
Guido van Rossumb209a111997-04-29 18:18:01 +00002019 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00002020 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002021 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00002022 break;
Guido van Rossum25831651993-05-19 14:50:45 +00002023
Thomas Wouters52152252000-08-17 22:55:00 +00002024 case IMPORT_FROM:
Skip Montanaro496e6582002-08-06 17:47:40 +00002025 w = GETITEM(names, oparg);
Thomas Wouters52152252000-08-17 22:55:00 +00002026 v = TOP();
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002027 READ_TIMESTAMP(intr0);
Thomas Wouters52152252000-08-17 22:55:00 +00002028 x = import_from(v, w);
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002029 READ_TIMESTAMP(intr1);
Thomas Wouters52152252000-08-17 22:55:00 +00002030 PUSH(x);
2031 if (x != NULL) continue;
2032 break;
2033
Guido van Rossum374a9221991-04-04 10:40:29 +00002034 case JUMP_FORWARD:
2035 JUMPBY(oparg);
Neil Schemenauerc4b570f2003-06-01 19:21:12 +00002036 goto fast_next_opcode;
Guido van Rossumac7be682001-01-17 15:42:30 +00002037
Raymond Hettingerf606f872003-03-16 03:11:04 +00002038 PREDICTED_WITH_ARG(JUMP_IF_FALSE);
Guido van Rossum374a9221991-04-04 10:40:29 +00002039 case JUMP_IF_FALSE:
Raymond Hettinger21012b82003-02-26 18:11:50 +00002040 w = TOP();
Raymond Hettingerf606f872003-03-16 03:11:04 +00002041 if (w == Py_True) {
2042 PREDICT(POP_TOP);
Neil Schemenauerc4b570f2003-06-01 19:21:12 +00002043 goto fast_next_opcode;
Raymond Hettingerf606f872003-03-16 03:11:04 +00002044 }
Raymond Hettinger21012b82003-02-26 18:11:50 +00002045 if (w == Py_False) {
2046 JUMPBY(oparg);
Neil Schemenauerc4b570f2003-06-01 19:21:12 +00002047 goto fast_next_opcode;
Raymond Hettinger21012b82003-02-26 18:11:50 +00002048 }
2049 err = PyObject_IsTrue(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002050 if (err > 0)
2051 err = 0;
2052 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00002053 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002054 else
2055 break;
2056 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00002057
Raymond Hettingerf606f872003-03-16 03:11:04 +00002058 PREDICTED_WITH_ARG(JUMP_IF_TRUE);
Guido van Rossum374a9221991-04-04 10:40:29 +00002059 case JUMP_IF_TRUE:
Raymond Hettinger21012b82003-02-26 18:11:50 +00002060 w = TOP();
Raymond Hettingerf606f872003-03-16 03:11:04 +00002061 if (w == Py_False) {
2062 PREDICT(POP_TOP);
Neil Schemenauerc4b570f2003-06-01 19:21:12 +00002063 goto fast_next_opcode;
Raymond Hettingerf606f872003-03-16 03:11:04 +00002064 }
Raymond Hettinger21012b82003-02-26 18:11:50 +00002065 if (w == Py_True) {
2066 JUMPBY(oparg);
Neil Schemenauerc4b570f2003-06-01 19:21:12 +00002067 goto fast_next_opcode;
Raymond Hettinger21012b82003-02-26 18:11:50 +00002068 }
2069 err = PyObject_IsTrue(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002070 if (err > 0) {
2071 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00002072 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002073 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002074 else if (err == 0)
2075 ;
2076 else
2077 break;
2078 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00002079
Raymond Hettingerfba1cfc2004-03-12 16:33:17 +00002080 PREDICTED_WITH_ARG(JUMP_ABSOLUTE);
Guido van Rossum374a9221991-04-04 10:40:29 +00002081 case JUMP_ABSOLUTE:
2082 JUMPTO(oparg);
Neil Schemenauerca2a2f12003-05-30 23:59:44 +00002083 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00002084
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002085 case GET_ITER:
2086 /* before: [obj]; after [getiter(obj)] */
Raymond Hettinger663004b2003-01-09 15:24:30 +00002087 v = TOP();
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002088 x = PyObject_GetIter(v);
2089 Py_DECREF(v);
2090 if (x != NULL) {
Raymond Hettinger663004b2003-01-09 15:24:30 +00002091 SET_TOP(x);
Raymond Hettinger7dc52212003-03-16 20:14:44 +00002092 PREDICT(FOR_ITER);
Guido van Rossum213c7a62001-04-23 14:08:49 +00002093 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002094 }
Raymond Hettinger8bb90a52003-01-14 12:43:10 +00002095 STACKADJ(-1);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002096 break;
2097
Raymond Hettinger7dc52212003-03-16 20:14:44 +00002098 PREDICTED_WITH_ARG(FOR_ITER);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002099 case FOR_ITER:
2100 /* before: [iter]; after: [iter, iter()] *or* [] */
2101 v = TOP();
Raymond Hettingerdb0de9e2004-03-12 08:41:36 +00002102 x = (*v->ob_type->tp_iternext)(v);
Guido van Rossum213c7a62001-04-23 14:08:49 +00002103 if (x != NULL) {
2104 PUSH(x);
Raymond Hettinger7dc52212003-03-16 20:14:44 +00002105 PREDICT(STORE_FAST);
2106 PREDICT(UNPACK_SEQUENCE);
Guido van Rossum213c7a62001-04-23 14:08:49 +00002107 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002108 }
Raymond Hettingerdb0de9e2004-03-12 08:41:36 +00002109 if (PyErr_Occurred()) {
2110 if (!PyErr_ExceptionMatches(PyExc_StopIteration))
2111 break;
2112 PyErr_Clear();
Guido van Rossum213c7a62001-04-23 14:08:49 +00002113 }
Raymond Hettingerdb0de9e2004-03-12 08:41:36 +00002114 /* iterator ended normally */
2115 x = v = POP();
2116 Py_DECREF(v);
2117 JUMPBY(oparg);
2118 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002119
Raymond Hettinger2d783e92004-03-12 09:12:22 +00002120 case BREAK_LOOP:
2121 why = WHY_BREAK;
2122 goto fast_block_end;
2123
2124 case CONTINUE_LOOP:
2125 retval = PyInt_FromLong(oparg);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002126 if (!retval) {
2127 x = NULL;
2128 break;
2129 }
Raymond Hettinger2d783e92004-03-12 09:12:22 +00002130 why = WHY_CONTINUE;
2131 goto fast_block_end;
2132
Guido van Rossum374a9221991-04-04 10:40:29 +00002133 case SETUP_LOOP:
2134 case SETUP_EXCEPT:
2135 case SETUP_FINALLY:
Thomas Wouters9fe394c2007-02-05 01:24:16 +00002136 /* NOTE: If you add any new block-setup opcodes that are
2137 not try/except/finally handlers, you may need to
2138 update the PyGen_NeedsFinalizing() function. */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002139
Guido van Rossumb209a111997-04-29 18:18:01 +00002140 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002141 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002142 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00002143
Guido van Rossumc2e20742006-02-27 22:32:47 +00002144 case WITH_CLEANUP:
2145 {
2146 /* TOP is the context.__exit__ bound method.
2147 Below that are 1-3 values indicating how/why
2148 we entered the finally clause:
2149 - SECOND = None
Guido van Rossumf6694362006-03-10 02:28:35 +00002150 - (SECOND, THIRD) = (WHY_{RETURN,CONTINUE}), retval
Guido van Rossumc2e20742006-02-27 22:32:47 +00002151 - SECOND = WHY_*; no retval below it
2152 - (SECOND, THIRD, FOURTH) = exc_info()
2153 In the last case, we must call
2154 TOP(SECOND, THIRD, FOURTH)
2155 otherwise we must call
2156 TOP(None, None, None)
Guido van Rossum1a5e21e2006-02-28 21:57:43 +00002157
2158 In addition, if the stack represents an exception,
Guido van Rossumf6694362006-03-10 02:28:35 +00002159 *and* the function call returns a 'true' value, we
2160 "zap" this information, to prevent END_FINALLY from
2161 re-raising the exception. (But non-local gotos
2162 should still be resumed.)
Guido van Rossumc2e20742006-02-27 22:32:47 +00002163 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002164
Guido van Rossumc2e20742006-02-27 22:32:47 +00002165 x = TOP();
2166 u = SECOND();
2167 if (PyInt_Check(u) || u == Py_None) {
2168 u = v = w = Py_None;
2169 }
2170 else {
2171 v = THIRD();
2172 w = FOURTH();
2173 }
Guido van Rossumf6694362006-03-10 02:28:35 +00002174 /* XXX Not the fastest way to call it... */
2175 x = PyObject_CallFunctionObjArgs(x, u, v, w, NULL);
2176 if (x == NULL)
2177 break; /* Go to error exit */
2178 if (u != Py_None && PyObject_IsTrue(x)) {
2179 /* There was an exception and a true return */
2180 Py_DECREF(x);
2181 x = TOP(); /* Again */
2182 STACKADJ(-3);
2183 Py_INCREF(Py_None);
2184 SET_TOP(Py_None);
2185 Py_DECREF(x);
2186 Py_DECREF(u);
2187 Py_DECREF(v);
2188 Py_DECREF(w);
2189 } else {
2190 /* Let END_FINALLY do its thing */
2191 Py_DECREF(x);
2192 x = POP();
2193 Py_DECREF(x);
2194 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00002195 break;
2196 }
2197
Guido van Rossumf10570b1995-07-07 22:53:21 +00002198 case CALL_FUNCTION:
Armin Rigo8817fcd2004-06-17 10:22:40 +00002199 {
2200 PyObject **sp;
Jeremy Hylton985eba52003-02-05 23:13:00 +00002201 PCALL(PCALL_ALL);
Armin Rigo8817fcd2004-06-17 10:22:40 +00002202 sp = stack_pointer;
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00002203#ifdef WITH_TSC
Armin Rigo8817fcd2004-06-17 10:22:40 +00002204 x = call_function(&sp, oparg, &intr0, &intr1);
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00002205#else
Armin Rigo8817fcd2004-06-17 10:22:40 +00002206 x = call_function(&sp, oparg);
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00002207#endif
Armin Rigo8817fcd2004-06-17 10:22:40 +00002208 stack_pointer = sp;
Jeremy Hyltone8c04322002-08-16 17:47:26 +00002209 PUSH(x);
2210 if (x != NULL)
2211 continue;
2212 break;
Armin Rigo8817fcd2004-06-17 10:22:40 +00002213 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002214
Jeremy Hylton76901512000-03-28 23:49:17 +00002215 case CALL_FUNCTION_VAR:
2216 case CALL_FUNCTION_KW:
2217 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00002218 {
Jeremy Hylton76901512000-03-28 23:49:17 +00002219 int na = oparg & 0xff;
2220 int nk = (oparg>>8) & 0xff;
2221 int flags = (opcode - CALL_FUNCTION) & 3;
Jeremy Hylton52820442001-01-03 23:52:36 +00002222 int n = na + 2 * nk;
Armin Rigo8817fcd2004-06-17 10:22:40 +00002223 PyObject **pfunc, *func, **sp;
Jeremy Hylton985eba52003-02-05 23:13:00 +00002224 PCALL(PCALL_ALL);
Jeremy Hylton52820442001-01-03 23:52:36 +00002225 if (flags & CALL_FLAG_VAR)
2226 n++;
2227 if (flags & CALL_FLAG_KW)
2228 n++;
2229 pfunc = stack_pointer - n - 1;
2230 func = *pfunc;
Jeremy Hylton52820442001-01-03 23:52:36 +00002231
Guido van Rossumac7be682001-01-17 15:42:30 +00002232 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00002233 && PyMethod_GET_SELF(func) != NULL) {
2234 PyObject *self = PyMethod_GET_SELF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002235 Py_INCREF(self);
Jeremy Hylton52820442001-01-03 23:52:36 +00002236 func = PyMethod_GET_FUNCTION(func);
2237 Py_INCREF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002238 Py_DECREF(*pfunc);
2239 *pfunc = self;
2240 na++;
2241 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00002242 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00002243 Py_INCREF(func);
Armin Rigo8817fcd2004-06-17 10:22:40 +00002244 sp = stack_pointer;
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002245 READ_TIMESTAMP(intr0);
Armin Rigo8817fcd2004-06-17 10:22:40 +00002246 x = ext_do_call(func, &sp, flags, na, nk);
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002247 READ_TIMESTAMP(intr1);
Armin Rigo8817fcd2004-06-17 10:22:40 +00002248 stack_pointer = sp;
Jeremy Hylton76901512000-03-28 23:49:17 +00002249 Py_DECREF(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00002250
Jeremy Hylton76901512000-03-28 23:49:17 +00002251 while (stack_pointer > pfunc) {
Jeremy Hylton52820442001-01-03 23:52:36 +00002252 w = POP();
2253 Py_DECREF(w);
Jeremy Hylton76901512000-03-28 23:49:17 +00002254 }
2255 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00002256 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00002257 continue;
Jeremy Hylton76901512000-03-28 23:49:17 +00002258 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002259 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002260
Guido van Rossum0240b922007-02-26 21:23:50 +00002261 case MAKE_CLOSURE:
Guido van Rossum681d79a1995-07-18 14:51:37 +00002262 case MAKE_FUNCTION:
Guido van Rossum4f72a782006-10-27 23:31:49 +00002263 {
2264 int posdefaults = oparg & 0xff;
2265 int kwdefaults = (oparg>>8) & 0xff;
Neal Norwitzc1505362006-12-28 06:47:50 +00002266 int num_annotations = (oparg >> 16) & 0x7fff;
Guido van Rossum4f72a782006-10-27 23:31:49 +00002267
Guido van Rossum681d79a1995-07-18 14:51:37 +00002268 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00002269 x = PyFunction_New(v, f->f_globals);
2270 Py_DECREF(v);
Guido van Rossum0240b922007-02-26 21:23:50 +00002271
2272 if (x != NULL && opcode == MAKE_CLOSURE) {
2273 v = POP();
2274 err = PyFunction_SetClosure(x, v);
2275 Py_DECREF(v);
2276 }
Neal Norwitzc1505362006-12-28 06:47:50 +00002277
2278 if (x != NULL && num_annotations > 0) {
2279 Py_ssize_t name_ix;
2280 u = POP(); /* names of args with annotations */
2281 v = PyDict_New();
2282 if (v == NULL) {
2283 Py_DECREF(x);
2284 x = NULL;
2285 break;
2286 }
2287 name_ix = PyTuple_Size(u);
2288 assert(num_annotations == name_ix+1);
2289 while (name_ix > 0) {
2290 --name_ix;
2291 t = PyTuple_GET_ITEM(u, name_ix);
2292 w = POP();
2293 /* XXX(nnorwitz): check for errors */
2294 PyDict_SetItem(v, t, w);
2295 Py_DECREF(w);
2296 }
2297
2298 err = PyFunction_SetAnnotations(x, v);
2299 Py_DECREF(v);
2300 Py_DECREF(u);
2301 }
2302
Guido van Rossum681d79a1995-07-18 14:51:37 +00002303 /* XXX Maybe this should be a separate opcode? */
Guido van Rossum4f72a782006-10-27 23:31:49 +00002304 if (x != NULL && posdefaults > 0) {
2305 v = PyTuple_New(posdefaults);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002306 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002307 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002308 x = NULL;
2309 break;
2310 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00002311 while (--posdefaults >= 0) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002312 w = POP();
Guido van Rossum4f72a782006-10-27 23:31:49 +00002313 PyTuple_SET_ITEM(v, posdefaults, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002314 }
2315 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00002316 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002317 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00002318 if (x != NULL && kwdefaults > 0) {
2319 v = PyDict_New();
2320 if (v == NULL) {
2321 Py_DECREF(x);
2322 x = NULL;
2323 break;
2324 }
2325 while (--kwdefaults >= 0) {
2326 w = POP(); /* default value */
2327 u = POP(); /* kw only arg name */
Neal Norwitzc1505362006-12-28 06:47:50 +00002328 /* XXX(nnorwitz): check for errors */
Guido van Rossum4f72a782006-10-27 23:31:49 +00002329 PyDict_SetItem(v, u, w);
Georg Brandl94ab0002007-02-26 13:58:18 +00002330 Py_DECREF(w);
2331 Py_DECREF(u);
Guido van Rossum4f72a782006-10-27 23:31:49 +00002332 }
2333 err = PyFunction_SetKwDefaults(x, v);
2334 Py_DECREF(v);
2335 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002336 PUSH(x);
2337 break;
Guido van Rossum4f72a782006-10-27 23:31:49 +00002338 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002339
2340 case BUILD_SLICE:
2341 if (oparg == 3)
2342 w = POP();
2343 else
2344 w = NULL;
2345 v = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00002346 u = TOP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00002347 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00002348 Py_DECREF(u);
2349 Py_DECREF(v);
2350 Py_XDECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00002351 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002352 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00002353 break;
2354
Fred Drakeef8ace32000-08-24 00:32:09 +00002355 case EXTENDED_ARG:
2356 opcode = NEXTOP();
Raymond Hettinger5bed4562004-04-10 23:34:17 +00002357 oparg = oparg<<16 | NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +00002358 goto dispatch_opcode;
Guido van Rossum8861b741996-07-30 16:49:37 +00002359
Guido van Rossum374a9221991-04-04 10:40:29 +00002360 default:
2361 fprintf(stderr,
2362 "XXX lineno: %d, opcode: %d\n",
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002363 PyCode_Addr2Line(f->f_code, f->f_lasti),
2364 opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00002365 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00002366 why = WHY_EXCEPTION;
2367 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002368
2369#ifdef CASE_TOO_BIG
2370 }
2371#endif
2372
Guido van Rossum374a9221991-04-04 10:40:29 +00002373 } /* switch */
2374
2375 on_error:
Guido van Rossumac7be682001-01-17 15:42:30 +00002376
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002377 READ_TIMESTAMP(inst1);
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00002378
Guido van Rossum374a9221991-04-04 10:40:29 +00002379 /* Quickly continue if no error occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002380
Guido van Rossum374a9221991-04-04 10:40:29 +00002381 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002382 if (err == 0 && x != NULL) {
2383#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002384 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002385 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002386 fprintf(stderr,
2387 "XXX undetected error\n");
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00002388 else {
2389#endif
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002390 READ_TIMESTAMP(loop1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002391 continue; /* Normal, fast path */
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00002392#ifdef CHECKEXC
2393 }
2394#endif
Guido van Rossum681d79a1995-07-18 14:51:37 +00002395 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002396 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00002397 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00002398 err = 0;
2399 }
2400
Guido van Rossum374a9221991-04-04 10:40:29 +00002401 /* Double-check exception status */
Guido van Rossumac7be682001-01-17 15:42:30 +00002402
Raymond Hettingerc8aa08b2004-04-11 14:59:33 +00002403 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002404 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002405 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002406 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00002407 why = WHY_EXCEPTION;
2408 }
2409 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002410#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00002411 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002412 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002413 if (PyErr_Occurred()) {
Jeremy Hylton904ed862003-11-05 17:29:35 +00002414 char buf[1024];
2415 sprintf(buf, "Stack unwind with exception "
2416 "set and why=%d", why);
2417 Py_FatalError(buf);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002418 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002419 }
2420#endif
2421
2422 /* Log traceback info if this is a real exception */
Guido van Rossumac7be682001-01-17 15:42:30 +00002423
Guido van Rossum374a9221991-04-04 10:40:29 +00002424 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002425 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002426
Fred Drake8f51f542001-10-04 14:48:42 +00002427 if (tstate->c_tracefunc != NULL)
2428 call_exc_trace(tstate->c_tracefunc,
2429 tstate->c_traceobj, f);
Guido van Rossum014518f1998-11-23 21:09:51 +00002430 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002431
Guido van Rossum374a9221991-04-04 10:40:29 +00002432 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
Guido van Rossumac7be682001-01-17 15:42:30 +00002433
Guido van Rossum374a9221991-04-04 10:40:29 +00002434 if (why == WHY_RERAISE)
2435 why = WHY_EXCEPTION;
2436
2437 /* Unwind stacks if a (pseudo) exception occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002438
Raymond Hettinger1dd83092004-02-06 18:32:33 +00002439fast_block_end:
Tim Peters8a5c3c72004-04-05 19:36:21 +00002440 while (why != WHY_NOT && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002441 PyTryBlock *b = PyFrame_BlockPop(f);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002442
Tim Peters8a5c3c72004-04-05 19:36:21 +00002443 assert(why != WHY_YIELD);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002444 if (b->b_type == SETUP_LOOP && why == WHY_CONTINUE) {
2445 /* For a continue inside a try block,
2446 don't pop the block for the loop. */
Thomas Wouters1ee64222001-09-24 19:32:01 +00002447 PyFrame_BlockSetup(f, b->b_type, b->b_handler,
2448 b->b_level);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002449 why = WHY_NOT;
2450 JUMPTO(PyInt_AS_LONG(retval));
2451 Py_DECREF(retval);
2452 break;
2453 }
2454
Guido van Rossum374a9221991-04-04 10:40:29 +00002455 while (STACK_LEVEL() > b->b_level) {
2456 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002457 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002458 }
2459 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2460 why = WHY_NOT;
2461 JUMPTO(b->b_handler);
2462 break;
2463 }
2464 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00002465 (b->b_type == SETUP_EXCEPT &&
2466 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002467 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002468 PyObject *exc, *val, *tb;
2469 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002470 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002471 val = Py_None;
2472 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00002473 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002474 /* Make the raw exception data
2475 available to the handler,
2476 so a program can emulate the
2477 Python main loop. Don't do
2478 this for 'finally'. */
2479 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00002480 PyErr_NormalizeException(
2481 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002482 set_exc_info(tstate,
2483 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002484 }
Jeremy Hyltonc6314892001-09-26 19:24:45 +00002485 if (tb == NULL) {
2486 Py_INCREF(Py_None);
2487 PUSH(Py_None);
2488 } else
2489 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002490 PUSH(val);
2491 PUSH(exc);
2492 }
2493 else {
Raymond Hettinger06032cb2004-04-06 09:37:35 +00002494 if (why & (WHY_RETURN | WHY_CONTINUE))
Guido van Rossum374a9221991-04-04 10:40:29 +00002495 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00002496 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00002497 PUSH(v);
2498 }
2499 why = WHY_NOT;
2500 JUMPTO(b->b_handler);
2501 break;
2502 }
2503 } /* unwind stack */
2504
2505 /* End the loop if we still have an error (or return) */
Guido van Rossumac7be682001-01-17 15:42:30 +00002506
Guido van Rossum374a9221991-04-04 10:40:29 +00002507 if (why != WHY_NOT)
2508 break;
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002509 READ_TIMESTAMP(loop1);
Guido van Rossumac7be682001-01-17 15:42:30 +00002510
Guido van Rossum374a9221991-04-04 10:40:29 +00002511 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00002512
Tim Peters8a5c3c72004-04-05 19:36:21 +00002513 assert(why != WHY_YIELD);
2514 /* Pop remaining stack entries. */
2515 while (!EMPTY()) {
2516 v = POP();
2517 Py_XDECREF(v);
Guido van Rossum35974fb2001-12-06 21:28:18 +00002518 }
2519
Tim Peters8a5c3c72004-04-05 19:36:21 +00002520 if (why != WHY_RETURN)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002521 retval = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002522
Raymond Hettinger1dd83092004-02-06 18:32:33 +00002523fast_yield:
Fred Drake9e3ad782001-07-03 23:39:52 +00002524 if (tstate->use_tracing) {
Barry Warsawe2eca0b2005-08-15 18:14:19 +00002525 if (tstate->c_tracefunc) {
2526 if (why == WHY_RETURN || why == WHY_YIELD) {
2527 if (call_trace(tstate->c_tracefunc,
2528 tstate->c_traceobj, f,
2529 PyTrace_RETURN, retval)) {
2530 Py_XDECREF(retval);
2531 retval = NULL;
2532 why = WHY_EXCEPTION;
2533 }
2534 }
2535 else if (why == WHY_EXCEPTION) {
2536 call_trace_protected(tstate->c_tracefunc,
2537 tstate->c_traceobj, f,
Armin Rigo1c2d7e52005-09-20 18:34:01 +00002538 PyTrace_RETURN, NULL);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002539 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002540 }
Fred Drake8f51f542001-10-04 14:48:42 +00002541 if (tstate->c_profilefunc) {
Fred Drake4ec5d562001-10-04 19:26:43 +00002542 if (why == WHY_EXCEPTION)
2543 call_trace_protected(tstate->c_profilefunc,
2544 tstate->c_profileobj, f,
Armin Rigo1c2d7e52005-09-20 18:34:01 +00002545 PyTrace_RETURN, NULL);
Fred Drake4ec5d562001-10-04 19:26:43 +00002546 else if (call_trace(tstate->c_profilefunc,
2547 tstate->c_profileobj, f,
2548 PyTrace_RETURN, retval)) {
Fred Drake9e3ad782001-07-03 23:39:52 +00002549 Py_XDECREF(retval);
2550 retval = NULL;
2551 why = WHY_EXCEPTION;
2552 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002553 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002554 }
Guido van Rossuma4240131997-01-21 21:18:36 +00002555
Thomas Wouters477c8d52006-05-27 19:21:47 +00002556 if (tstate->frame->f_exc_type != NULL)
2557 reset_exc_info(tstate);
2558 else {
2559 assert(tstate->frame->f_exc_value == NULL);
2560 assert(tstate->frame->f_exc_traceback == NULL);
2561 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00002562
Tim Peters5ca576e2001-06-18 22:08:13 +00002563 /* pop frame */
Armin Rigo2b3eb402003-10-28 12:05:48 +00002564 exit_eval_frame:
2565 Py_LeaveRecursiveCall();
Guido van Rossuma027efa1997-05-05 20:56:21 +00002566 tstate->frame = f->f_back;
Guido van Rossumac7be682001-01-17 15:42:30 +00002567
Guido van Rossum96a42c81992-01-12 02:29:51 +00002568 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00002569}
2570
Guido van Rossumc2e20742006-02-27 22:32:47 +00002571/* This is gonna seem *real weird*, but if you put some other code between
Martin v. Löwis8d97e332004-06-27 15:43:12 +00002572 PyEval_EvalFrame() and PyEval_EvalCodeEx() you will need to adjust
Guido van Rossumc2e20742006-02-27 22:32:47 +00002573 the test in the if statements in Misc/gdbinit (pystack and pystackv). */
Skip Montanaro786ea6b2004-03-01 15:44:05 +00002574
Tim Peters6d6c1a32001-08-02 04:15:00 +00002575PyObject *
2576PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals,
Tim Peters5ca576e2001-06-18 22:08:13 +00002577 PyObject **args, int argcount, PyObject **kws, int kwcount,
Guido van Rossum4f72a782006-10-27 23:31:49 +00002578 PyObject **defs, int defcount, PyObject *kwdefs, PyObject *closure)
Tim Peters5ca576e2001-06-18 22:08:13 +00002579{
2580 register PyFrameObject *f;
2581 register PyObject *retval = NULL;
2582 register PyObject **fastlocals, **freevars;
2583 PyThreadState *tstate = PyThreadState_GET();
2584 PyObject *x, *u;
2585
2586 if (globals == NULL) {
Tim Peters8a5c3c72004-04-05 19:36:21 +00002587 PyErr_SetString(PyExc_SystemError,
Jeremy Hylton910d7d42001-08-12 21:52:24 +00002588 "PyEval_EvalCodeEx: NULL globals");
Tim Peters5ca576e2001-06-18 22:08:13 +00002589 return NULL;
2590 }
2591
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002592 assert(tstate != NULL);
Jeremy Hylton985eba52003-02-05 23:13:00 +00002593 assert(globals != NULL);
2594 f = PyFrame_New(tstate, co, globals, locals);
Tim Peters5ca576e2001-06-18 22:08:13 +00002595 if (f == NULL)
2596 return NULL;
2597
2598 fastlocals = f->f_localsplus;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002599 freevars = f->f_localsplus + co->co_nlocals;
Tim Peters5ca576e2001-06-18 22:08:13 +00002600
2601 if (co->co_argcount > 0 ||
Guido van Rossum4f72a782006-10-27 23:31:49 +00002602 co->co_kwonlyargcount > 0 ||
Tim Peters5ca576e2001-06-18 22:08:13 +00002603 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
2604 int i;
2605 int n = argcount;
2606 PyObject *kwdict = NULL;
2607 if (co->co_flags & CO_VARKEYWORDS) {
2608 kwdict = PyDict_New();
2609 if (kwdict == NULL)
2610 goto fail;
Guido van Rossum4f72a782006-10-27 23:31:49 +00002611 i = co->co_argcount + co->co_kwonlyargcount;
Tim Peters5ca576e2001-06-18 22:08:13 +00002612 if (co->co_flags & CO_VARARGS)
2613 i++;
2614 SETLOCAL(i, kwdict);
2615 }
2616 if (argcount > co->co_argcount) {
2617 if (!(co->co_flags & CO_VARARGS)) {
2618 PyErr_Format(PyExc_TypeError,
2619 "%.200s() takes %s %d "
Guido van Rossum4f72a782006-10-27 23:31:49 +00002620 "%spositional argument%s (%d given)",
Tim Peters5ca576e2001-06-18 22:08:13 +00002621 PyString_AsString(co->co_name),
2622 defcount ? "at most" : "exactly",
2623 co->co_argcount,
2624 kwcount ? "non-keyword " : "",
2625 co->co_argcount == 1 ? "" : "s",
2626 argcount);
2627 goto fail;
2628 }
2629 n = co->co_argcount;
2630 }
2631 for (i = 0; i < n; i++) {
2632 x = args[i];
2633 Py_INCREF(x);
2634 SETLOCAL(i, x);
2635 }
2636 if (co->co_flags & CO_VARARGS) {
2637 u = PyTuple_New(argcount - n);
2638 if (u == NULL)
2639 goto fail;
Guido van Rossum4f72a782006-10-27 23:31:49 +00002640 SETLOCAL(co->co_argcount + co->co_kwonlyargcount, u);
Tim Peters5ca576e2001-06-18 22:08:13 +00002641 for (i = n; i < argcount; i++) {
2642 x = args[i];
2643 Py_INCREF(x);
2644 PyTuple_SET_ITEM(u, i-n, x);
2645 }
2646 }
2647 for (i = 0; i < kwcount; i++) {
2648 PyObject *keyword = kws[2*i];
2649 PyObject *value = kws[2*i + 1];
2650 int j;
Guido van Rossum572dbf82007-04-27 23:53:51 +00002651 if (keyword == NULL || !(PyString_Check(keyword) || PyUnicode_Check(keyword))) {
Tim Peters5ca576e2001-06-18 22:08:13 +00002652 PyErr_Format(PyExc_TypeError,
2653 "%.200s() keywords must be strings",
2654 PyString_AsString(co->co_name));
2655 goto fail;
2656 }
2657 /* XXX slow -- speed up using dictionary? */
Guido van Rossum4f72a782006-10-27 23:31:49 +00002658 for (j = 0;
2659 j < co->co_argcount + co->co_kwonlyargcount;
2660 j++) {
Tim Peters5ca576e2001-06-18 22:08:13 +00002661 PyObject *nm = PyTuple_GET_ITEM(
2662 co->co_varnames, j);
2663 int cmp = PyObject_RichCompareBool(
2664 keyword, nm, Py_EQ);
2665 if (cmp > 0)
2666 break;
2667 else if (cmp < 0)
2668 goto fail;
2669 }
2670 /* Check errors from Compare */
2671 if (PyErr_Occurred())
2672 goto fail;
Guido van Rossum4f72a782006-10-27 23:31:49 +00002673 if (j >= co->co_argcount + co->co_kwonlyargcount) {
Tim Peters5ca576e2001-06-18 22:08:13 +00002674 if (kwdict == NULL) {
2675 PyErr_Format(PyExc_TypeError,
2676 "%.200s() got an unexpected "
2677 "keyword argument '%.400s'",
2678 PyString_AsString(co->co_name),
2679 PyString_AsString(keyword));
2680 goto fail;
2681 }
2682 PyDict_SetItem(kwdict, keyword, value);
2683 }
2684 else {
2685 if (GETLOCAL(j) != NULL) {
2686 PyErr_Format(PyExc_TypeError,
2687 "%.200s() got multiple "
2688 "values for keyword "
2689 "argument '%.400s'",
2690 PyString_AsString(co->co_name),
2691 PyString_AsString(keyword));
2692 goto fail;
2693 }
2694 Py_INCREF(value);
2695 SETLOCAL(j, value);
2696 }
2697 }
Guido van Rossum4f72a782006-10-27 23:31:49 +00002698 if (co->co_kwonlyargcount > 0) {
2699 for (i = co->co_argcount;
2700 i < co->co_argcount + co->co_kwonlyargcount;
2701 i++) {
Guido van Rossum29602e42006-11-22 04:45:33 +00002702 PyObject *name, *def;
Guido van Rossum4f72a782006-10-27 23:31:49 +00002703 if (GETLOCAL(i) != NULL)
2704 continue;
Guido van Rossum29602e42006-11-22 04:45:33 +00002705 name = PyTuple_GET_ITEM(co->co_varnames, i);
2706 def = NULL;
Guido van Rossum4f72a782006-10-27 23:31:49 +00002707 if (kwdefs != NULL)
2708 def = PyDict_GetItem(kwdefs, name);
2709 if (def != NULL) {
2710 Py_INCREF(def);
2711 SETLOCAL(i, def);
2712 continue;
2713 }
2714 PyErr_Format(PyExc_TypeError,
2715 "%.200s() needs "
Brett Cannone33a6112007-01-29 23:43:38 +00002716 "keyword-only argument %s",
Guido van Rossum4f72a782006-10-27 23:31:49 +00002717 PyString_AsString(co->co_name),
2718 PyString_AsString(name));
2719 goto fail;
2720 }
2721 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002722 if (argcount < co->co_argcount) {
2723 int m = co->co_argcount - defcount;
2724 for (i = argcount; i < m; i++) {
2725 if (GETLOCAL(i) == NULL) {
2726 PyErr_Format(PyExc_TypeError,
2727 "%.200s() takes %s %d "
Guido van Rossum4f72a782006-10-27 23:31:49 +00002728 "%spositional argument%s "
2729 "(%d given)",
Tim Peters5ca576e2001-06-18 22:08:13 +00002730 PyString_AsString(co->co_name),
2731 ((co->co_flags & CO_VARARGS) ||
2732 defcount) ? "at least"
2733 : "exactly",
2734 m, kwcount ? "non-keyword " : "",
2735 m == 1 ? "" : "s", i);
2736 goto fail;
2737 }
2738 }
2739 if (n > m)
2740 i = n - m;
2741 else
2742 i = 0;
2743 for (; i < defcount; i++) {
2744 if (GETLOCAL(m+i) == NULL) {
2745 PyObject *def = defs[i];
2746 Py_INCREF(def);
2747 SETLOCAL(m+i, def);
2748 }
2749 }
2750 }
2751 }
2752 else {
2753 if (argcount > 0 || kwcount > 0) {
2754 PyErr_Format(PyExc_TypeError,
2755 "%.200s() takes no arguments (%d given)",
2756 PyString_AsString(co->co_name),
2757 argcount + kwcount);
2758 goto fail;
2759 }
2760 }
2761 /* Allocate and initialize storage for cell vars, and copy free
2762 vars into frame. This isn't too efficient right now. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002763 if (PyTuple_GET_SIZE(co->co_cellvars)) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002764 int i, j, nargs, found;
Tim Peters5ca576e2001-06-18 22:08:13 +00002765 char *cellname, *argname;
2766 PyObject *c;
2767
2768 nargs = co->co_argcount;
2769 if (co->co_flags & CO_VARARGS)
2770 nargs++;
2771 if (co->co_flags & CO_VARKEYWORDS)
2772 nargs++;
2773
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002774 /* Initialize each cell var, taking into account
2775 cell vars that are initialized from arguments.
2776
2777 Should arrange for the compiler to put cellvars
2778 that are arguments at the beginning of the cellvars
2779 list so that we can march over it more efficiently?
2780 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002781 for (i = 0; i < PyTuple_GET_SIZE(co->co_cellvars); ++i) {
Tim Peters5ca576e2001-06-18 22:08:13 +00002782 cellname = PyString_AS_STRING(
2783 PyTuple_GET_ITEM(co->co_cellvars, i));
2784 found = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002785 for (j = 0; j < nargs; j++) {
Tim Peters5ca576e2001-06-18 22:08:13 +00002786 argname = PyString_AS_STRING(
2787 PyTuple_GET_ITEM(co->co_varnames, j));
2788 if (strcmp(cellname, argname) == 0) {
2789 c = PyCell_New(GETLOCAL(j));
2790 if (c == NULL)
2791 goto fail;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002792 GETLOCAL(co->co_nlocals + i) = c;
Tim Peters5ca576e2001-06-18 22:08:13 +00002793 found = 1;
2794 break;
2795 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002796 }
2797 if (found == 0) {
2798 c = PyCell_New(NULL);
2799 if (c == NULL)
2800 goto fail;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002801 SETLOCAL(co->co_nlocals + i, c);
Tim Peters5ca576e2001-06-18 22:08:13 +00002802 }
2803 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002804 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002805 if (PyTuple_GET_SIZE(co->co_freevars)) {
Tim Peters5ca576e2001-06-18 22:08:13 +00002806 int i;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002807 for (i = 0; i < PyTuple_GET_SIZE(co->co_freevars); ++i) {
Tim Peters5ca576e2001-06-18 22:08:13 +00002808 PyObject *o = PyTuple_GET_ITEM(closure, i);
2809 Py_INCREF(o);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002810 freevars[PyTuple_GET_SIZE(co->co_cellvars) + i] = o;
Tim Peters5ca576e2001-06-18 22:08:13 +00002811 }
2812 }
2813
Tim Peters5ca576e2001-06-18 22:08:13 +00002814 if (co->co_flags & CO_GENERATOR) {
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002815 /* Don't need to keep the reference to f_back, it will be set
2816 * when the generator is resumed. */
Tim Peters5ba58662001-07-16 02:29:45 +00002817 Py_XDECREF(f->f_back);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002818 f->f_back = NULL;
2819
Jeremy Hylton985eba52003-02-05 23:13:00 +00002820 PCALL(PCALL_GENERATOR);
2821
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002822 /* Create a new generator that owns the ready to run frame
2823 * and return that as the value. */
Martin v. Löwise440e472004-06-01 15:22:42 +00002824 return PyGen_New(f);
Tim Peters5ca576e2001-06-18 22:08:13 +00002825 }
2826
Phillip J. Eby0d6615f2005-08-02 00:46:46 +00002827 retval = PyEval_EvalFrameEx(f,0);
Tim Peters5ca576e2001-06-18 22:08:13 +00002828
2829 fail: /* Jump here from prelude on failure */
2830
Tim Petersb13680b2001-11-27 23:29:29 +00002831 /* decref'ing the frame can cause __del__ methods to get invoked,
2832 which can call back into Python. While we're done with the
2833 current Python frame (f), the associated C stack is still in use,
2834 so recursion_depth must be boosted for the duration.
2835 */
2836 assert(tstate != NULL);
2837 ++tstate->recursion_depth;
Tim Peters5ca576e2001-06-18 22:08:13 +00002838 Py_DECREF(f);
Tim Petersb13680b2001-11-27 23:29:29 +00002839 --tstate->recursion_depth;
Tim Peters5ca576e2001-06-18 22:08:13 +00002840 return retval;
2841}
2842
2843
Guido van Rossumc9fbb722003-03-01 03:36:33 +00002844/* Implementation notes for set_exc_info() and reset_exc_info():
2845
2846- Below, 'exc_ZZZ' stands for 'exc_type', 'exc_value' and
2847 'exc_traceback'. These always travel together.
2848
2849- tstate->curexc_ZZZ is the "hot" exception that is set by
2850 PyErr_SetString(), cleared by PyErr_Clear(), and so on.
2851
2852- Once an exception is caught by an except clause, it is transferred
2853 from tstate->curexc_ZZZ to tstate->exc_ZZZ, from which sys.exc_info()
2854 can pick it up. This is the primary task of set_exc_info().
Thomas Wouters477c8d52006-05-27 19:21:47 +00002855 XXX That can't be right: set_exc_info() doesn't look at tstate->curexc_ZZZ.
Guido van Rossumc9fbb722003-03-01 03:36:33 +00002856
2857- Now let me explain the complicated dance with frame->f_exc_ZZZ.
2858
2859 Long ago, when none of this existed, there were just a few globals:
2860 one set corresponding to the "hot" exception, and one set
2861 corresponding to sys.exc_ZZZ. (Actually, the latter weren't C
2862 globals; they were simply stored as sys.exc_ZZZ. For backwards
2863 compatibility, they still are!) The problem was that in code like
2864 this:
2865
2866 try:
2867 "something that may fail"
2868 except "some exception":
2869 "do something else first"
2870 "print the exception from sys.exc_ZZZ."
2871
2872 if "do something else first" invoked something that raised and caught
2873 an exception, sys.exc_ZZZ were overwritten. That was a frequent
2874 cause of subtle bugs. I fixed this by changing the semantics as
2875 follows:
2876
2877 - Within one frame, sys.exc_ZZZ will hold the last exception caught
2878 *in that frame*.
2879
2880 - But initially, and as long as no exception is caught in a given
2881 frame, sys.exc_ZZZ will hold the last exception caught in the
2882 previous frame (or the frame before that, etc.).
2883
2884 The first bullet fixed the bug in the above example. The second
2885 bullet was for backwards compatibility: it was (and is) common to
2886 have a function that is called when an exception is caught, and to
2887 have that function access the caught exception via sys.exc_ZZZ.
2888 (Example: traceback.print_exc()).
2889
2890 At the same time I fixed the problem that sys.exc_ZZZ weren't
2891 thread-safe, by introducing sys.exc_info() which gets it from tstate;
2892 but that's really a separate improvement.
2893
2894 The reset_exc_info() function in ceval.c restores the tstate->exc_ZZZ
2895 variables to what they were before the current frame was called. The
2896 set_exc_info() function saves them on the frame so that
2897 reset_exc_info() can restore them. The invariant is that
2898 frame->f_exc_ZZZ is NULL iff the current frame never caught an
2899 exception (where "catching" an exception applies only to successful
2900 except clauses); and if the current frame ever caught an exception,
2901 frame->f_exc_ZZZ is the exception that was stored in tstate->exc_ZZZ
2902 at the start of the current frame.
2903
2904*/
2905
Guido van Rossuma027efa1997-05-05 20:56:21 +00002906static void
Guido van Rossumac7be682001-01-17 15:42:30 +00002907set_exc_info(PyThreadState *tstate,
2908 PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002909{
Thomas Wouters477c8d52006-05-27 19:21:47 +00002910 PyFrameObject *frame = tstate->frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002911 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00002912
Thomas Wouters477c8d52006-05-27 19:21:47 +00002913 assert(type != NULL);
2914 assert(frame != NULL);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002915 if (frame->f_exc_type == NULL) {
Thomas Wouters477c8d52006-05-27 19:21:47 +00002916 assert(frame->f_exc_value == NULL);
2917 assert(frame->f_exc_traceback == NULL);
2918 /* This frame didn't catch an exception before. */
2919 /* Save previous exception of this thread in this frame. */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002920 if (tstate->exc_type == NULL) {
Thomas Wouters477c8d52006-05-27 19:21:47 +00002921 /* XXX Why is this set to Py_None? */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002922 Py_INCREF(Py_None);
2923 tstate->exc_type = Py_None;
2924 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002925 Py_INCREF(tstate->exc_type);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002926 Py_XINCREF(tstate->exc_value);
2927 Py_XINCREF(tstate->exc_traceback);
2928 frame->f_exc_type = tstate->exc_type;
2929 frame->f_exc_value = tstate->exc_value;
2930 frame->f_exc_traceback = tstate->exc_traceback;
2931 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002932 /* Set new exception for this thread. */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002933 tmp_type = tstate->exc_type;
2934 tmp_value = tstate->exc_value;
2935 tmp_tb = tstate->exc_traceback;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002936 Py_INCREF(type);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002937 Py_XINCREF(value);
2938 Py_XINCREF(tb);
2939 tstate->exc_type = type;
2940 tstate->exc_value = value;
2941 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002942 Py_XDECREF(tmp_type);
2943 Py_XDECREF(tmp_value);
2944 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002945 /* For b/w compatibility */
2946 PySys_SetObject("exc_type", type);
2947 PySys_SetObject("exc_value", value);
2948 PySys_SetObject("exc_traceback", tb);
2949}
2950
2951static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002952reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002953{
2954 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002955 PyObject *tmp_type, *tmp_value, *tmp_tb;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002956
2957 /* It's a precondition that the thread state's frame caught an
2958 * exception -- verify in a debug build.
2959 */
2960 assert(tstate != NULL);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002961 frame = tstate->frame;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002962 assert(frame != NULL);
2963 assert(frame->f_exc_type != NULL);
2964
2965 /* Copy the frame's exception info back to the thread state. */
2966 tmp_type = tstate->exc_type;
2967 tmp_value = tstate->exc_value;
2968 tmp_tb = tstate->exc_traceback;
2969 Py_INCREF(frame->f_exc_type);
2970 Py_XINCREF(frame->f_exc_value);
2971 Py_XINCREF(frame->f_exc_traceback);
2972 tstate->exc_type = frame->f_exc_type;
2973 tstate->exc_value = frame->f_exc_value;
2974 tstate->exc_traceback = frame->f_exc_traceback;
2975 Py_XDECREF(tmp_type);
2976 Py_XDECREF(tmp_value);
2977 Py_XDECREF(tmp_tb);
2978
2979 /* For b/w compatibility */
2980 PySys_SetObject("exc_type", frame->f_exc_type);
2981 PySys_SetObject("exc_value", frame->f_exc_value);
2982 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
2983
2984 /* Clear the frame's exception info. */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002985 tmp_type = frame->f_exc_type;
2986 tmp_value = frame->f_exc_value;
2987 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002988 frame->f_exc_type = NULL;
2989 frame->f_exc_value = NULL;
2990 frame->f_exc_traceback = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002991 Py_DECREF(tmp_type);
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002992 Py_XDECREF(tmp_value);
2993 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002994}
2995
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002996/* Logic for the raise statement (too complicated for inlining).
2997 This *consumes* a reference count to each of its arguments. */
Raymond Hettinger7c958652004-04-06 10:11:10 +00002998static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002999do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003000{
Guido van Rossumd295f121998-04-09 21:39:57 +00003001 if (type == NULL) {
3002 /* Reraise */
Nicholas Bastine5662ae2004-03-24 22:22:12 +00003003 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossumd295f121998-04-09 21:39:57 +00003004 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
3005 value = tstate->exc_value;
3006 tb = tstate->exc_traceback;
3007 Py_XINCREF(type);
3008 Py_XINCREF(value);
3009 Py_XINCREF(tb);
3010 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003011
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003012 /* We support the following forms of raise:
3013 raise <class>, <classinstance>
3014 raise <class>, <argument tuple>
3015 raise <class>, None
3016 raise <class>, <argument>
3017 raise <classinstance>, None
3018 raise <string>, <object>
3019 raise <string>, None
3020
3021 An omitted second argument is the same as None.
3022
3023 In addition, raise <tuple>, <anything> is the same as
3024 raising the tuple's first item (and it better have one!);
3025 this rule is applied recursively.
3026
3027 Finally, an optional third argument can be supplied, which
3028 gives the traceback to be substituted (useful when
3029 re-raising an exception after examining it). */
3030
3031 /* First, check the traceback argument, replacing None with
3032 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00003033 if (tb == Py_None) {
3034 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003035 tb = NULL;
3036 }
3037 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003038 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003039 "raise: arg 3 must be a traceback or None");
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003040 goto raise_error;
3041 }
3042
3043 /* Next, replace a missing value with None */
3044 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003045 value = Py_None;
3046 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003047 }
3048
3049 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00003050 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
3051 PyObject *tmp = type;
3052 type = PyTuple_GET_ITEM(type, 0);
3053 Py_INCREF(type);
3054 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003055 }
3056
Guido van Rossum45aecf42006-03-15 04:58:47 +00003057 if (PyExceptionClass_Check(type))
Barry Warsaw4249f541997-08-22 21:26:19 +00003058 PyErr_NormalizeException(&type, &value, &tb);
3059
Brett Cannonbf364092006-03-01 04:25:17 +00003060 else if (PyExceptionInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003061 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00003062 if (value != Py_None) {
3063 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003064 "instance exception may not have a separate value");
3065 goto raise_error;
3066 }
3067 else {
3068 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00003069 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003070 value = type;
Brett Cannonbf364092006-03-01 04:25:17 +00003071 type = PyExceptionInstance_Class(type);
Guido van Rossumb209a111997-04-29 18:18:01 +00003072 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003073 }
3074 }
3075 else {
3076 /* Not something you can raise. You get an exception
3077 anyway, just not what you specified :-) */
Guido van Rossum45aecf42006-03-15 04:58:47 +00003078 PyErr_SetString(PyExc_TypeError,
3079 "exceptions must derive from BaseException");
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003080 goto raise_error;
3081 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003082 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003083 if (tb == NULL)
3084 return WHY_EXCEPTION;
3085 else
3086 return WHY_RERAISE;
3087 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00003088 Py_XDECREF(value);
3089 Py_XDECREF(type);
3090 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003091 return WHY_EXCEPTION;
3092}
3093
Tim Petersd6d010b2001-06-21 02:49:55 +00003094/* Iterate v argcnt times and store the results on the stack (via decreasing
Guido van Rossum0368b722007-05-11 16:50:42 +00003095 sp). Return 1 for success, 0 if error.
3096
3097 If argcntafter == -1, do a simple unpack. If it is >= 0, do an unpack
3098 with a variable target.
3099*/
Tim Petersd6d010b2001-06-21 02:49:55 +00003100
Barry Warsawe42b18f1997-08-25 22:13:04 +00003101static int
Guido van Rossum0368b722007-05-11 16:50:42 +00003102unpack_iterable(PyObject *v, int argcnt, int argcntafter, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00003103{
Guido van Rossum0368b722007-05-11 16:50:42 +00003104 int i = 0, j = 0;
3105 Py_ssize_t ll = 0;
Tim Petersd6d010b2001-06-21 02:49:55 +00003106 PyObject *it; /* iter(v) */
Barry Warsawe42b18f1997-08-25 22:13:04 +00003107 PyObject *w;
Guido van Rossum0368b722007-05-11 16:50:42 +00003108 PyObject *l = NULL; /* variable list */
Guido van Rossumac7be682001-01-17 15:42:30 +00003109
Tim Petersd6d010b2001-06-21 02:49:55 +00003110 assert(v != NULL);
3111
3112 it = PyObject_GetIter(v);
3113 if (it == NULL)
3114 goto Error;
3115
3116 for (; i < argcnt; i++) {
3117 w = PyIter_Next(it);
3118 if (w == NULL) {
3119 /* Iterator done, via error or exhaustion. */
3120 if (!PyErr_Occurred()) {
3121 PyErr_Format(PyExc_ValueError,
3122 "need more than %d value%s to unpack",
3123 i, i == 1 ? "" : "s");
3124 }
3125 goto Error;
Barry Warsawe42b18f1997-08-25 22:13:04 +00003126 }
3127 *--sp = w;
3128 }
Tim Petersd6d010b2001-06-21 02:49:55 +00003129
Guido van Rossum0368b722007-05-11 16:50:42 +00003130 if (argcntafter == -1) {
3131 /* We better have exhausted the iterator now. */
3132 w = PyIter_Next(it);
3133 if (w == NULL) {
3134 if (PyErr_Occurred())
3135 goto Error;
3136 Py_DECREF(it);
3137 return 1;
3138 }
3139 Py_DECREF(w);
3140 PyErr_SetString(PyExc_ValueError, "too many values to unpack");
3141 goto Error;
Barry Warsawe42b18f1997-08-25 22:13:04 +00003142 }
Guido van Rossum0368b722007-05-11 16:50:42 +00003143
3144 l = PySequence_List(it);
3145 if (l == NULL)
3146 goto Error;
3147 *--sp = l;
3148 i++;
3149
3150 ll = PyList_GET_SIZE(l);
3151 if (ll < argcntafter) {
3152 PyErr_Format(PyExc_ValueError, "need more than %zd values to unpack",
3153 argcnt + ll);
3154 goto Error;
3155 }
3156
3157 /* Pop the "after-variable" args off the list. */
3158 for (j = argcntafter; j > 0; j--, i++) {
3159 *--sp = PyList_GET_ITEM(l, ll - j);
3160 }
3161 /* Resize the list. */
3162 ((PyListObject *)l)->ob_size = ll - argcntafter;
3163 Py_DECREF(it);
3164 return 1;
3165
Tim Petersd6d010b2001-06-21 02:49:55 +00003166Error:
Barry Warsaw91010551997-08-25 22:30:51 +00003167 for (; i > 0; i--, sp++)
3168 Py_DECREF(*sp);
Tim Petersd6d010b2001-06-21 02:49:55 +00003169 Py_XDECREF(it);
Barry Warsawe42b18f1997-08-25 22:13:04 +00003170 return 0;
3171}
3172
3173
Guido van Rossum96a42c81992-01-12 02:29:51 +00003174#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00003175static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003176prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003177{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003178 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00003179 if (PyObject_Print(v, stdout, 0) != 0)
3180 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00003181 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00003182 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003183}
Guido van Rossum3f5da241990-12-20 15:06:42 +00003184#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003185
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00003186static void
Fred Drake5755ce62001-06-27 19:19:46 +00003187call_exc_trace(Py_tracefunc func, PyObject *self, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00003188{
Guido van Rossumb209a111997-04-29 18:18:01 +00003189 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00003190 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00003191 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00003192 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003193 value = Py_None;
3194 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00003195 }
Raymond Hettinger8ae46892003-10-12 19:09:37 +00003196 arg = PyTuple_Pack(3, type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003197 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003198 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003199 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00003200 }
Fred Drake5755ce62001-06-27 19:19:46 +00003201 err = call_trace(func, self, f, PyTrace_EXCEPTION, arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00003202 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003203 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00003204 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003205 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00003206 Py_XDECREF(type);
3207 Py_XDECREF(value);
3208 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003209 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00003210}
3211
Fred Drake4ec5d562001-10-04 19:26:43 +00003212static void
3213call_trace_protected(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
Armin Rigo1c2d7e52005-09-20 18:34:01 +00003214 int what, PyObject *arg)
Fred Drake4ec5d562001-10-04 19:26:43 +00003215{
3216 PyObject *type, *value, *traceback;
3217 int err;
3218 PyErr_Fetch(&type, &value, &traceback);
Armin Rigo1c2d7e52005-09-20 18:34:01 +00003219 err = call_trace(func, obj, frame, what, arg);
Fred Drake4ec5d562001-10-04 19:26:43 +00003220 if (err == 0)
3221 PyErr_Restore(type, value, traceback);
3222 else {
3223 Py_XDECREF(type);
3224 Py_XDECREF(value);
3225 Py_XDECREF(traceback);
3226 }
3227}
3228
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00003229static int
Fred Drake5755ce62001-06-27 19:19:46 +00003230call_trace(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
3231 int what, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00003232{
Fred Drake5755ce62001-06-27 19:19:46 +00003233 register PyThreadState *tstate = frame->f_tstate;
3234 int result;
3235 if (tstate->tracing)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00003236 return 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +00003237 tstate->tracing++;
Fred Drake9e3ad782001-07-03 23:39:52 +00003238 tstate->use_tracing = 0;
Fred Drake5755ce62001-06-27 19:19:46 +00003239 result = func(obj, frame, what, arg);
Fred Drake9e3ad782001-07-03 23:39:52 +00003240 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
3241 || (tstate->c_profilefunc != NULL));
Guido van Rossuma027efa1997-05-05 20:56:21 +00003242 tstate->tracing--;
Fred Drake5755ce62001-06-27 19:19:46 +00003243 return result;
Guido van Rossum96a42c81992-01-12 02:29:51 +00003244}
3245
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00003246PyObject *
3247_PyEval_CallTracing(PyObject *func, PyObject *args)
3248{
3249 PyFrameObject *frame = PyEval_GetFrame();
3250 PyThreadState *tstate = frame->f_tstate;
3251 int save_tracing = tstate->tracing;
3252 int save_use_tracing = tstate->use_tracing;
3253 PyObject *result;
3254
3255 tstate->tracing = 0;
3256 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
3257 || (tstate->c_profilefunc != NULL));
3258 result = PyObject_Call(func, args, NULL);
3259 tstate->tracing = save_tracing;
3260 tstate->use_tracing = save_use_tracing;
3261 return result;
3262}
3263
Michael W. Hudson006c7522002-11-08 13:08:46 +00003264static int
Tim Peters8a5c3c72004-04-05 19:36:21 +00003265maybe_call_line_trace(Py_tracefunc func, PyObject *obj,
Armin Rigobf57a142004-03-22 19:24:58 +00003266 PyFrameObject *frame, int *instr_lb, int *instr_ub,
3267 int *instr_prev)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003268{
Michael W. Hudson006c7522002-11-08 13:08:46 +00003269 int result = 0;
3270
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003271 /* If the last instruction executed isn't in the current
3272 instruction window, reset the window. If the last
3273 instruction happens to fall at the start of a line or if it
3274 represents a jump backwards, call the trace function.
3275 */
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00003276 if ((frame->f_lasti < *instr_lb || frame->f_lasti >= *instr_ub)) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003277 int line;
3278 PyAddrPair bounds;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003279
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003280 line = PyCode_CheckLineNumber(frame->f_code, frame->f_lasti,
3281 &bounds);
3282 if (line >= 0) {
Michael W. Hudson02ff6a92002-09-11 15:36:32 +00003283 frame->f_lineno = line;
Tim Peters8a5c3c72004-04-05 19:36:21 +00003284 result = call_trace(func, obj, frame,
Michael W. Hudson006c7522002-11-08 13:08:46 +00003285 PyTrace_LINE, Py_None);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003286 }
3287 *instr_lb = bounds.ap_lower;
3288 *instr_ub = bounds.ap_upper;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003289 }
Armin Rigobf57a142004-03-22 19:24:58 +00003290 else if (frame->f_lasti <= *instr_prev) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003291 result = call_trace(func, obj, frame, PyTrace_LINE, Py_None);
Armin Rigobf57a142004-03-22 19:24:58 +00003292 }
3293 *instr_prev = frame->f_lasti;
Michael W. Hudson006c7522002-11-08 13:08:46 +00003294 return result;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003295}
3296
Fred Drake5755ce62001-06-27 19:19:46 +00003297void
3298PyEval_SetProfile(Py_tracefunc func, PyObject *arg)
Fred Draked0838392001-06-16 21:02:31 +00003299{
Nicholas Bastine5662ae2004-03-24 22:22:12 +00003300 PyThreadState *tstate = PyThreadState_GET();
Fred Drake5755ce62001-06-27 19:19:46 +00003301 PyObject *temp = tstate->c_profileobj;
3302 Py_XINCREF(arg);
3303 tstate->c_profilefunc = NULL;
3304 tstate->c_profileobj = NULL;
Brett Cannon55fa66d2005-06-25 07:07:35 +00003305 /* Must make sure that tracing is not ignored if 'temp' is freed */
Fred Drake9e3ad782001-07-03 23:39:52 +00003306 tstate->use_tracing = tstate->c_tracefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00003307 Py_XDECREF(temp);
3308 tstate->c_profilefunc = func;
3309 tstate->c_profileobj = arg;
Brett Cannon55fa66d2005-06-25 07:07:35 +00003310 /* Flag that tracing or profiling is turned on */
Fred Drake9e3ad782001-07-03 23:39:52 +00003311 tstate->use_tracing = (func != NULL) || (tstate->c_tracefunc != NULL);
Fred Drake5755ce62001-06-27 19:19:46 +00003312}
3313
3314void
3315PyEval_SetTrace(Py_tracefunc func, PyObject *arg)
3316{
Nicholas Bastine5662ae2004-03-24 22:22:12 +00003317 PyThreadState *tstate = PyThreadState_GET();
Fred Drake5755ce62001-06-27 19:19:46 +00003318 PyObject *temp = tstate->c_traceobj;
3319 Py_XINCREF(arg);
3320 tstate->c_tracefunc = NULL;
3321 tstate->c_traceobj = NULL;
Brett Cannon55fa66d2005-06-25 07:07:35 +00003322 /* Must make sure that profiling is not ignored if 'temp' is freed */
Fred Drake9e3ad782001-07-03 23:39:52 +00003323 tstate->use_tracing = tstate->c_profilefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00003324 Py_XDECREF(temp);
3325 tstate->c_tracefunc = func;
3326 tstate->c_traceobj = arg;
Brett Cannon55fa66d2005-06-25 07:07:35 +00003327 /* Flag that tracing or profiling is turned on */
Fred Drake9e3ad782001-07-03 23:39:52 +00003328 tstate->use_tracing = ((func != NULL)
3329 || (tstate->c_profilefunc != NULL));
Fred Draked0838392001-06-16 21:02:31 +00003330}
3331
Guido van Rossumb209a111997-04-29 18:18:01 +00003332PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003333PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00003334{
Guido van Rossum6297a7a2003-02-19 15:53:17 +00003335 PyFrameObject *current_frame = PyEval_GetFrame();
Guido van Rossum6135a871995-01-09 17:53:26 +00003336 if (current_frame == NULL)
Nicholas Bastine5662ae2004-03-24 22:22:12 +00003337 return PyThreadState_GET()->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00003338 else
3339 return current_frame->f_builtins;
3340}
3341
Guido van Rossumb209a111997-04-29 18:18:01 +00003342PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003343PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00003344{
Guido van Rossum6297a7a2003-02-19 15:53:17 +00003345 PyFrameObject *current_frame = PyEval_GetFrame();
Guido van Rossum5b722181993-03-30 17:46:03 +00003346 if (current_frame == NULL)
3347 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00003348 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00003349 return current_frame->f_locals;
3350}
3351
Guido van Rossumb209a111997-04-29 18:18:01 +00003352PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003353PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003354{
Guido van Rossum6297a7a2003-02-19 15:53:17 +00003355 PyFrameObject *current_frame = PyEval_GetFrame();
Guido van Rossum3f5da241990-12-20 15:06:42 +00003356 if (current_frame == NULL)
3357 return NULL;
3358 else
3359 return current_frame->f_globals;
3360}
3361
Guido van Rossum6297a7a2003-02-19 15:53:17 +00003362PyFrameObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003363PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00003364{
Nicholas Bastine5662ae2004-03-24 22:22:12 +00003365 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossum6297a7a2003-02-19 15:53:17 +00003366 return _PyThreadState_GetFrame(tstate);
Guido van Rossume59214e1994-08-30 08:01:59 +00003367}
3368
Guido van Rossum6135a871995-01-09 17:53:26 +00003369int
Tim Peters5ba58662001-07-16 02:29:45 +00003370PyEval_MergeCompilerFlags(PyCompilerFlags *cf)
Jeremy Hylton061d1062001-03-22 02:32:48 +00003371{
Guido van Rossum6297a7a2003-02-19 15:53:17 +00003372 PyFrameObject *current_frame = PyEval_GetFrame();
Just van Rossum3aaf42c2003-02-10 08:21:10 +00003373 int result = cf->cf_flags != 0;
Tim Peters5ba58662001-07-16 02:29:45 +00003374
3375 if (current_frame != NULL) {
3376 const int codeflags = current_frame->f_code->co_flags;
Tim Peterse2c18e92001-08-17 20:47:47 +00003377 const int compilerflags = codeflags & PyCF_MASK;
3378 if (compilerflags) {
Tim Peters5ba58662001-07-16 02:29:45 +00003379 result = 1;
Tim Peterse2c18e92001-08-17 20:47:47 +00003380 cf->cf_flags |= compilerflags;
Tim Peters5ba58662001-07-16 02:29:45 +00003381 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00003382#if 0 /* future keyword */
Martin v. Löwis7198a522002-01-01 19:59:11 +00003383 if (codeflags & CO_GENERATOR_ALLOWED) {
3384 result = 1;
3385 cf->cf_flags |= CO_GENERATOR_ALLOWED;
3386 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00003387#endif
Tim Peters5ba58662001-07-16 02:29:45 +00003388 }
3389 return result;
Jeremy Hylton061d1062001-03-22 02:32:48 +00003390}
3391
Guido van Rossum3f5da241990-12-20 15:06:42 +00003392
Guido van Rossum681d79a1995-07-18 14:51:37 +00003393/* External interface to call any callable object.
3394 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00003395
Guido van Rossumd7ed6831997-08-30 15:02:50 +00003396#undef PyEval_CallObject
3397/* for backward compatibility: export this interface */
3398
Guido van Rossumb209a111997-04-29 18:18:01 +00003399PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003400PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00003401{
Guido van Rossumb209a111997-04-29 18:18:01 +00003402 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003403}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00003404#define PyEval_CallObject(func,arg) \
3405 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00003406
Guido van Rossumb209a111997-04-29 18:18:01 +00003407PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003408PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003409{
Jeremy Hylton52820442001-01-03 23:52:36 +00003410 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003411
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00003412 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003413 arg = PyTuple_New(0);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00003414 if (arg == NULL)
3415 return NULL;
3416 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003417 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003418 PyErr_SetString(PyExc_TypeError,
3419 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00003420 return NULL;
3421 }
3422 else
Guido van Rossumb209a111997-04-29 18:18:01 +00003423 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003424
Guido van Rossumb209a111997-04-29 18:18:01 +00003425 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003426 PyErr_SetString(PyExc_TypeError,
3427 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00003428 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00003429 return NULL;
3430 }
3431
Tim Peters6d6c1a32001-08-02 04:15:00 +00003432 result = PyObject_Call(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00003433 Py_DECREF(arg);
Jeremy Hylton52820442001-01-03 23:52:36 +00003434 return result;
3435}
3436
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00003437const char *
Tim Peters6d6c1a32001-08-02 04:15:00 +00003438PyEval_GetFuncName(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00003439{
3440 if (PyMethod_Check(func))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003441 return PyEval_GetFuncName(PyMethod_GET_FUNCTION(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00003442 else if (PyFunction_Check(func))
3443 return PyString_AsString(((PyFunctionObject*)func)->func_name);
3444 else if (PyCFunction_Check(func))
3445 return ((PyCFunctionObject*)func)->m_ml->ml_name;
Guido van Rossum50e9fb92006-08-17 05:42:55 +00003446 else
Jeremy Hylton512a2372001-04-11 13:52:29 +00003447 return func->ob_type->tp_name;
Jeremy Hylton512a2372001-04-11 13:52:29 +00003448}
3449
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00003450const char *
Tim Peters6d6c1a32001-08-02 04:15:00 +00003451PyEval_GetFuncDesc(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00003452{
3453 if (PyMethod_Check(func))
3454 return "()";
3455 else if (PyFunction_Check(func))
3456 return "()";
3457 else if (PyCFunction_Check(func))
3458 return "()";
Guido van Rossum50e9fb92006-08-17 05:42:55 +00003459 else
Jeremy Hylton512a2372001-04-11 13:52:29 +00003460 return " object";
Jeremy Hylton512a2372001-04-11 13:52:29 +00003461}
3462
Neal Norwitzaddfe0c2002-11-10 14:33:26 +00003463static void
Jeremy Hylton192690e2002-08-16 18:36:11 +00003464err_args(PyObject *func, int flags, int nargs)
3465{
3466 if (flags & METH_NOARGS)
Tim Peters8a5c3c72004-04-05 19:36:21 +00003467 PyErr_Format(PyExc_TypeError,
Guido van Rossum86c659a2002-08-23 14:11:35 +00003468 "%.200s() takes no arguments (%d given)",
Tim Peters8a5c3c72004-04-05 19:36:21 +00003469 ((PyCFunctionObject *)func)->m_ml->ml_name,
Jeremy Hylton192690e2002-08-16 18:36:11 +00003470 nargs);
3471 else
Tim Peters8a5c3c72004-04-05 19:36:21 +00003472 PyErr_Format(PyExc_TypeError,
Guido van Rossum86c659a2002-08-23 14:11:35 +00003473 "%.200s() takes exactly one argument (%d given)",
Tim Peters8a5c3c72004-04-05 19:36:21 +00003474 ((PyCFunctionObject *)func)->m_ml->ml_name,
Jeremy Hylton192690e2002-08-16 18:36:11 +00003475 nargs);
3476}
3477
Armin Rigo1c2d7e52005-09-20 18:34:01 +00003478#define C_TRACE(x, call) \
Nicholas Bastind858a772004-06-25 23:31:06 +00003479if (tstate->use_tracing && tstate->c_profilefunc) { \
3480 if (call_trace(tstate->c_profilefunc, \
3481 tstate->c_profileobj, \
3482 tstate->frame, PyTrace_C_CALL, \
Armin Rigo1c2d7e52005-09-20 18:34:01 +00003483 func)) { \
3484 x = NULL; \
3485 } \
3486 else { \
3487 x = call; \
3488 if (tstate->c_profilefunc != NULL) { \
3489 if (x == NULL) { \
3490 call_trace_protected(tstate->c_profilefunc, \
3491 tstate->c_profileobj, \
3492 tstate->frame, PyTrace_C_EXCEPTION, \
3493 func); \
3494 /* XXX should pass (type, value, tb) */ \
3495 } else { \
3496 if (call_trace(tstate->c_profilefunc, \
3497 tstate->c_profileobj, \
3498 tstate->frame, PyTrace_C_RETURN, \
3499 func)) { \
3500 Py_DECREF(x); \
3501 x = NULL; \
3502 } \
3503 } \
Nicholas Bastinc69ebe82004-03-24 21:57:10 +00003504 } \
Nicholas Bastind858a772004-06-25 23:31:06 +00003505 } \
3506} else { \
Armin Rigo1c2d7e52005-09-20 18:34:01 +00003507 x = call; \
Nicholas Bastinc69ebe82004-03-24 21:57:10 +00003508 }
3509
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003510static PyObject *
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00003511call_function(PyObject ***pp_stack, int oparg
3512#ifdef WITH_TSC
3513 , uint64* pintr0, uint64* pintr1
3514#endif
3515 )
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003516{
3517 int na = oparg & 0xff;
3518 int nk = (oparg>>8) & 0xff;
3519 int n = na + 2 * nk;
3520 PyObject **pfunc = (*pp_stack) - n - 1;
3521 PyObject *func = *pfunc;
3522 PyObject *x, *w;
3523
Jeremy Hylton985eba52003-02-05 23:13:00 +00003524 /* Always dispatch PyCFunction first, because these are
3525 presumed to be the most frequent callable object.
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003526 */
3527 if (PyCFunction_Check(func) && nk == 0) {
3528 int flags = PyCFunction_GET_FLAGS(func);
Nicholas Bastind858a772004-06-25 23:31:06 +00003529 PyThreadState *tstate = PyThreadState_GET();
Raymond Hettingera7f56bc2004-06-26 04:34:33 +00003530
3531 PCALL(PCALL_CFUNCTION);
Jeremy Hylton192690e2002-08-16 18:36:11 +00003532 if (flags & (METH_NOARGS | METH_O)) {
3533 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
3534 PyObject *self = PyCFunction_GET_SELF(func);
Nicholas Bastinc69ebe82004-03-24 21:57:10 +00003535 if (flags & METH_NOARGS && na == 0) {
Armin Rigo1c2d7e52005-09-20 18:34:01 +00003536 C_TRACE(x, (*meth)(self,NULL));
Nicholas Bastinc69ebe82004-03-24 21:57:10 +00003537 }
Jeremy Hylton192690e2002-08-16 18:36:11 +00003538 else if (flags & METH_O && na == 1) {
3539 PyObject *arg = EXT_POP(*pp_stack);
Armin Rigo1c2d7e52005-09-20 18:34:01 +00003540 C_TRACE(x, (*meth)(self,arg));
Jeremy Hylton192690e2002-08-16 18:36:11 +00003541 Py_DECREF(arg);
3542 }
3543 else {
3544 err_args(func, flags, na);
3545 x = NULL;
3546 }
3547 }
3548 else {
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003549 PyObject *callargs;
3550 callargs = load_args(pp_stack, na);
Michael W. Hudson75eabd22005-01-18 15:56:11 +00003551 READ_TIMESTAMP(*pintr0);
Armin Rigo1c2d7e52005-09-20 18:34:01 +00003552 C_TRACE(x, PyCFunction_Call(func,callargs,NULL));
Michael W. Hudson75eabd22005-01-18 15:56:11 +00003553 READ_TIMESTAMP(*pintr1);
Tim Peters8a5c3c72004-04-05 19:36:21 +00003554 Py_XDECREF(callargs);
3555 }
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003556 } else {
3557 if (PyMethod_Check(func) && PyMethod_GET_SELF(func) != NULL) {
3558 /* optimize access to bound methods */
3559 PyObject *self = PyMethod_GET_SELF(func);
Jeremy Hylton985eba52003-02-05 23:13:00 +00003560 PCALL(PCALL_METHOD);
3561 PCALL(PCALL_BOUND_METHOD);
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003562 Py_INCREF(self);
3563 func = PyMethod_GET_FUNCTION(func);
3564 Py_INCREF(func);
3565 Py_DECREF(*pfunc);
3566 *pfunc = self;
3567 na++;
3568 n++;
3569 } else
3570 Py_INCREF(func);
Michael W. Hudson75eabd22005-01-18 15:56:11 +00003571 READ_TIMESTAMP(*pintr0);
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003572 if (PyFunction_Check(func))
3573 x = fast_function(func, pp_stack, n, na, nk);
Tim Peters8a5c3c72004-04-05 19:36:21 +00003574 else
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003575 x = do_call(func, pp_stack, na, nk);
Michael W. Hudson75eabd22005-01-18 15:56:11 +00003576 READ_TIMESTAMP(*pintr1);
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003577 Py_DECREF(func);
3578 }
Tim Peters8a5c3c72004-04-05 19:36:21 +00003579
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003580 /* Clear the stack of the function object. Also removes
3581 the arguments in case they weren't consumed already
3582 (fast_function() and err_args() leave them on the stack).
Thomas Wouters7f597322006-03-01 05:32:33 +00003583 */
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003584 while ((*pp_stack) > pfunc) {
3585 w = EXT_POP(*pp_stack);
3586 Py_DECREF(w);
Jeremy Hylton985eba52003-02-05 23:13:00 +00003587 PCALL(PCALL_POP);
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003588 }
3589 return x;
3590}
3591
Jeremy Hylton192690e2002-08-16 18:36:11 +00003592/* The fast_function() function optimize calls for which no argument
Jeremy Hylton52820442001-01-03 23:52:36 +00003593 tuple is necessary; the objects are passed directly from the stack.
Jeremy Hylton985eba52003-02-05 23:13:00 +00003594 For the simplest case -- a function that takes only positional
3595 arguments and is called with only positional arguments -- it
3596 inlines the most primitive frame setup code from
3597 PyEval_EvalCodeEx(), which vastly reduces the checks that must be
3598 done before evaluating the frame.
Jeremy Hylton52820442001-01-03 23:52:36 +00003599*/
3600
3601static PyObject *
Guido van Rossumac7be682001-01-17 15:42:30 +00003602fast_function(PyObject *func, PyObject ***pp_stack, int n, int na, int nk)
Jeremy Hylton52820442001-01-03 23:52:36 +00003603{
Jeremy Hylton985eba52003-02-05 23:13:00 +00003604 PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003605 PyObject *globals = PyFunction_GET_GLOBALS(func);
3606 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
Guido van Rossum4f72a782006-10-27 23:31:49 +00003607 PyObject *kwdefs = PyFunction_GET_KW_DEFAULTS(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003608 PyObject **d = NULL;
3609 int nd = 0;
3610
Jeremy Hylton985eba52003-02-05 23:13:00 +00003611 PCALL(PCALL_FUNCTION);
3612 PCALL(PCALL_FAST_FUNCTION);
Guido van Rossum4f72a782006-10-27 23:31:49 +00003613 if (argdefs == NULL && co->co_argcount == n &&
3614 co->co_kwonlyargcount == 0 && nk==0 &&
Jeremy Hylton985eba52003-02-05 23:13:00 +00003615 co->co_flags == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE)) {
3616 PyFrameObject *f;
3617 PyObject *retval = NULL;
3618 PyThreadState *tstate = PyThreadState_GET();
3619 PyObject **fastlocals, **stack;
3620 int i;
3621
3622 PCALL(PCALL_FASTER_FUNCTION);
3623 assert(globals != NULL);
3624 /* XXX Perhaps we should create a specialized
3625 PyFrame_New() that doesn't take locals, but does
3626 take builtins without sanity checking them.
3627 */
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00003628 assert(tstate != NULL);
Jeremy Hylton985eba52003-02-05 23:13:00 +00003629 f = PyFrame_New(tstate, co, globals, NULL);
3630 if (f == NULL)
3631 return NULL;
3632
3633 fastlocals = f->f_localsplus;
3634 stack = (*pp_stack) - n;
3635
3636 for (i = 0; i < n; i++) {
3637 Py_INCREF(*stack);
3638 fastlocals[i] = *stack++;
3639 }
Phillip J. Eby0d6615f2005-08-02 00:46:46 +00003640 retval = PyEval_EvalFrameEx(f,0);
Jeremy Hylton985eba52003-02-05 23:13:00 +00003641 ++tstate->recursion_depth;
3642 Py_DECREF(f);
3643 --tstate->recursion_depth;
3644 return retval;
3645 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003646 if (argdefs != NULL) {
3647 d = &PyTuple_GET_ITEM(argdefs, 0);
3648 nd = ((PyTupleObject *)argdefs)->ob_size;
3649 }
Jeremy Hylton985eba52003-02-05 23:13:00 +00003650 return PyEval_EvalCodeEx(co, globals,
3651 (PyObject *)NULL, (*pp_stack)-n, na,
Guido van Rossum4f72a782006-10-27 23:31:49 +00003652 (*pp_stack)-2*nk, nk, d, nd, kwdefs,
Jeremy Hylton985eba52003-02-05 23:13:00 +00003653 PyFunction_GET_CLOSURE(func));
Jeremy Hylton52820442001-01-03 23:52:36 +00003654}
3655
3656static PyObject *
Ka-Ping Yee20579702001-01-15 22:14:16 +00003657update_keyword_args(PyObject *orig_kwdict, int nk, PyObject ***pp_stack,
3658 PyObject *func)
Jeremy Hylton52820442001-01-03 23:52:36 +00003659{
3660 PyObject *kwdict = NULL;
3661 if (orig_kwdict == NULL)
3662 kwdict = PyDict_New();
3663 else {
3664 kwdict = PyDict_Copy(orig_kwdict);
3665 Py_DECREF(orig_kwdict);
3666 }
3667 if (kwdict == NULL)
3668 return NULL;
Raymond Hettinger5bed4562004-04-10 23:34:17 +00003669 while (--nk >= 0) {
Jeremy Hylton52820442001-01-03 23:52:36 +00003670 int err;
3671 PyObject *value = EXT_POP(*pp_stack);
3672 PyObject *key = EXT_POP(*pp_stack);
3673 if (PyDict_GetItem(kwdict, key) != NULL) {
Guido van Rossumac7be682001-01-17 15:42:30 +00003674 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +00003675 "%.200s%s got multiple values "
Jeremy Hylton512a2372001-04-11 13:52:29 +00003676 "for keyword argument '%.200s'",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003677 PyEval_GetFuncName(func),
3678 PyEval_GetFuncDesc(func),
Jeremy Hylton512a2372001-04-11 13:52:29 +00003679 PyString_AsString(key));
Jeremy Hylton52820442001-01-03 23:52:36 +00003680 Py_DECREF(key);
3681 Py_DECREF(value);
3682 Py_DECREF(kwdict);
3683 return NULL;
3684 }
3685 err = PyDict_SetItem(kwdict, key, value);
3686 Py_DECREF(key);
3687 Py_DECREF(value);
3688 if (err) {
3689 Py_DECREF(kwdict);
3690 return NULL;
3691 }
3692 }
3693 return kwdict;
3694}
3695
3696static PyObject *
3697update_star_args(int nstack, int nstar, PyObject *stararg,
3698 PyObject ***pp_stack)
3699{
3700 PyObject *callargs, *w;
3701
3702 callargs = PyTuple_New(nstack + nstar);
3703 if (callargs == NULL) {
3704 return NULL;
3705 }
3706 if (nstar) {
3707 int i;
3708 for (i = 0; i < nstar; i++) {
3709 PyObject *a = PyTuple_GET_ITEM(stararg, i);
3710 Py_INCREF(a);
3711 PyTuple_SET_ITEM(callargs, nstack + i, a);
3712 }
3713 }
Raymond Hettinger5bed4562004-04-10 23:34:17 +00003714 while (--nstack >= 0) {
Jeremy Hylton52820442001-01-03 23:52:36 +00003715 w = EXT_POP(*pp_stack);
3716 PyTuple_SET_ITEM(callargs, nstack, w);
3717 }
3718 return callargs;
3719}
3720
3721static PyObject *
3722load_args(PyObject ***pp_stack, int na)
3723{
3724 PyObject *args = PyTuple_New(na);
3725 PyObject *w;
3726
3727 if (args == NULL)
3728 return NULL;
Raymond Hettinger5bed4562004-04-10 23:34:17 +00003729 while (--na >= 0) {
Jeremy Hylton52820442001-01-03 23:52:36 +00003730 w = EXT_POP(*pp_stack);
3731 PyTuple_SET_ITEM(args, na, w);
3732 }
3733 return args;
3734}
3735
3736static PyObject *
3737do_call(PyObject *func, PyObject ***pp_stack, int na, int nk)
3738{
3739 PyObject *callargs = NULL;
3740 PyObject *kwdict = NULL;
3741 PyObject *result = NULL;
3742
3743 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003744 kwdict = update_keyword_args(NULL, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003745 if (kwdict == NULL)
3746 goto call_fail;
3747 }
3748 callargs = load_args(pp_stack, na);
3749 if (callargs == NULL)
3750 goto call_fail;
Jeremy Hylton985eba52003-02-05 23:13:00 +00003751#ifdef CALL_PROFILE
3752 /* At this point, we have to look at the type of func to
3753 update the call stats properly. Do it here so as to avoid
3754 exposing the call stats machinery outside ceval.c
3755 */
3756 if (PyFunction_Check(func))
3757 PCALL(PCALL_FUNCTION);
3758 else if (PyMethod_Check(func))
3759 PCALL(PCALL_METHOD);
3760 else if (PyType_Check(func))
3761 PCALL(PCALL_TYPE);
3762 else
3763 PCALL(PCALL_OTHER);
3764#endif
Tim Peters6d6c1a32001-08-02 04:15:00 +00003765 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00003766 call_fail:
3767 Py_XDECREF(callargs);
3768 Py_XDECREF(kwdict);
3769 return result;
3770}
3771
3772static PyObject *
3773ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)
3774{
3775 int nstar = 0;
3776 PyObject *callargs = NULL;
3777 PyObject *stararg = NULL;
3778 PyObject *kwdict = NULL;
3779 PyObject *result = NULL;
3780
3781 if (flags & CALL_FLAG_KW) {
3782 kwdict = EXT_POP(*pp_stack);
3783 if (!(kwdict && PyDict_Check(kwdict))) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003784 PyErr_Format(PyExc_TypeError,
Jeremy Hylton512a2372001-04-11 13:52:29 +00003785 "%s%s argument after ** "
3786 "must be a dictionary",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003787 PyEval_GetFuncName(func),
3788 PyEval_GetFuncDesc(func));
Jeremy Hylton52820442001-01-03 23:52:36 +00003789 goto ext_call_fail;
3790 }
3791 }
3792 if (flags & CALL_FLAG_VAR) {
3793 stararg = EXT_POP(*pp_stack);
3794 if (!PyTuple_Check(stararg)) {
3795 PyObject *t = NULL;
3796 t = PySequence_Tuple(stararg);
3797 if (t == NULL) {
Jeremy Hylton512a2372001-04-11 13:52:29 +00003798 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
3799 PyErr_Format(PyExc_TypeError,
3800 "%s%s argument after * "
3801 "must be a sequence",
Tim Peters6d6c1a32001-08-02 04:15:00 +00003802 PyEval_GetFuncName(func),
3803 PyEval_GetFuncDesc(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00003804 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003805 goto ext_call_fail;
3806 }
3807 Py_DECREF(stararg);
3808 stararg = t;
3809 }
3810 nstar = PyTuple_GET_SIZE(stararg);
3811 }
3812 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003813 kwdict = update_keyword_args(kwdict, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003814 if (kwdict == NULL)
3815 goto ext_call_fail;
3816 }
3817 callargs = update_star_args(na, nstar, stararg, pp_stack);
3818 if (callargs == NULL)
3819 goto ext_call_fail;
Jeremy Hylton985eba52003-02-05 23:13:00 +00003820#ifdef CALL_PROFILE
3821 /* At this point, we have to look at the type of func to
3822 update the call stats properly. Do it here so as to avoid
3823 exposing the call stats machinery outside ceval.c
3824 */
3825 if (PyFunction_Check(func))
3826 PCALL(PCALL_FUNCTION);
3827 else if (PyMethod_Check(func))
3828 PCALL(PCALL_METHOD);
3829 else if (PyType_Check(func))
3830 PCALL(PCALL_TYPE);
3831 else
3832 PCALL(PCALL_OTHER);
3833#endif
Tim Peters6d6c1a32001-08-02 04:15:00 +00003834 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00003835 ext_call_fail:
3836 Py_XDECREF(callargs);
3837 Py_XDECREF(kwdict);
3838 Py_XDECREF(stararg);
3839 return result;
3840}
3841
Guido van Rossum38fff8c2006-03-07 18:50:55 +00003842/* Extract a slice index from a PyInt or PyLong or an object with the
3843 nb_index slot defined, and store in *pi.
3844 Silently reduce values larger than PY_SSIZE_T_MAX to PY_SSIZE_T_MAX,
3845 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 +00003846 Return 0 on error, 1 on success.
Tim Peterscb479e72001-12-16 19:11:44 +00003847*/
Tim Petersb5196382001-12-16 19:44:20 +00003848/* Note: If v is NULL, return success without storing into *pi. This
3849 is because_PyEval_SliceIndex() is called by apply_slice(), which can be
3850 called by the SLICE opcode with v and/or w equal to NULL.
Tim Peterscb479e72001-12-16 19:11:44 +00003851*/
Guido van Rossum20c6add2000-05-08 14:06:50 +00003852int
Martin v. Löwis18e16552006-02-15 17:27:45 +00003853_PyEval_SliceIndex(PyObject *v, Py_ssize_t *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003854{
Tim Petersb5196382001-12-16 19:44:20 +00003855 if (v != NULL) {
Martin v. Löwisdde99d22006-02-17 15:57:41 +00003856 Py_ssize_t x;
Guido van Rossumddefaf32007-01-14 03:31:43 +00003857 if (PyInt_CheckExact(v)) {
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00003858 /* XXX(nnorwitz): I think PyInt_AS_LONG is correct,
3859 however, it looks like it should be AsSsize_t.
3860 There should be a comment here explaining why.
3861 */
3862 x = PyInt_AS_LONG(v);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003863 }
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00003864 else if (PyIndex_Check(v)) {
3865 x = PyNumber_AsSsize_t(v, NULL);
Guido van Rossum38fff8c2006-03-07 18:50:55 +00003866 if (x == -1 && PyErr_Occurred())
3867 return 0;
3868 }
3869 else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003870 PyErr_SetString(PyExc_TypeError,
Guido van Rossum38fff8c2006-03-07 18:50:55 +00003871 "slice indices must be integers or "
3872 "None or have an __index__ method");
Guido van Rossum20c6add2000-05-08 14:06:50 +00003873 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003874 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00003875 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003876 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00003877 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003878}
3879
Guido van Rossum38fff8c2006-03-07 18:50:55 +00003880#undef ISINDEX
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00003881#define ISINDEX(x) ((x) == NULL || \
3882 PyInt_Check(x) || PyLong_Check(x) || PyIndex_Check(x))
Guido van Rossum50d756e2001-08-18 17:43:36 +00003883
Guido van Rossumb209a111997-04-29 18:18:01 +00003884static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003885apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003886{
Guido van Rossum50d756e2001-08-18 17:43:36 +00003887 PyTypeObject *tp = u->ob_type;
3888 PySequenceMethods *sq = tp->tp_as_sequence;
3889
Guido van Rossum38fff8c2006-03-07 18:50:55 +00003890 if (sq && sq->sq_slice && ISINDEX(v) && ISINDEX(w)) {
Martin v. Löwisdde99d22006-02-17 15:57:41 +00003891 Py_ssize_t ilow = 0, ihigh = PY_SSIZE_T_MAX;
Guido van Rossum50d756e2001-08-18 17:43:36 +00003892 if (!_PyEval_SliceIndex(v, &ilow))
3893 return NULL;
3894 if (!_PyEval_SliceIndex(w, &ihigh))
3895 return NULL;
3896 return PySequence_GetSlice(u, ilow, ihigh);
3897 }
3898 else {
3899 PyObject *slice = PySlice_New(v, w, NULL);
Guido van Rossum354797c2001-12-03 19:45:06 +00003900 if (slice != NULL) {
3901 PyObject *res = PyObject_GetItem(u, slice);
3902 Py_DECREF(slice);
3903 return res;
3904 }
Guido van Rossum50d756e2001-08-18 17:43:36 +00003905 else
3906 return NULL;
3907 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003908}
Guido van Rossum3f5da241990-12-20 15:06:42 +00003909
3910static int
Guido van Rossumac7be682001-01-17 15:42:30 +00003911assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x)
3912 /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003913{
Guido van Rossum50d756e2001-08-18 17:43:36 +00003914 PyTypeObject *tp = u->ob_type;
3915 PySequenceMethods *sq = tp->tp_as_sequence;
3916
Guido van Rossumd8faa362007-04-27 19:54:29 +00003917 if (sq && sq->sq_ass_slice && ISINDEX(v) && ISINDEX(w)) {
Martin v. Löwisdde99d22006-02-17 15:57:41 +00003918 Py_ssize_t ilow = 0, ihigh = PY_SSIZE_T_MAX;
Guido van Rossum50d756e2001-08-18 17:43:36 +00003919 if (!_PyEval_SliceIndex(v, &ilow))
3920 return -1;
3921 if (!_PyEval_SliceIndex(w, &ihigh))
3922 return -1;
3923 if (x == NULL)
3924 return PySequence_DelSlice(u, ilow, ihigh);
3925 else
3926 return PySequence_SetSlice(u, ilow, ihigh, x);
3927 }
3928 else {
3929 PyObject *slice = PySlice_New(v, w, NULL);
3930 if (slice != NULL) {
Guido van Rossum354797c2001-12-03 19:45:06 +00003931 int res;
Guido van Rossum50d756e2001-08-18 17:43:36 +00003932 if (x != NULL)
Guido van Rossum354797c2001-12-03 19:45:06 +00003933 res = PyObject_SetItem(u, slice, x);
Guido van Rossum50d756e2001-08-18 17:43:36 +00003934 else
Guido van Rossum354797c2001-12-03 19:45:06 +00003935 res = PyObject_DelItem(u, slice);
3936 Py_DECREF(slice);
3937 return res;
Guido van Rossum50d756e2001-08-18 17:43:36 +00003938 }
3939 else
3940 return -1;
3941 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003942}
3943
Brett Cannon39590462007-02-26 22:01:14 +00003944#define CANNOT_CATCH_MSG "catching classes that do not inherit from"\
3945 "BaseException is not allowed"
Brett Cannonf74225d2007-02-26 21:10:16 +00003946
Guido van Rossumb209a111997-04-29 18:18:01 +00003947static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003948cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003949{
Guido van Rossumac7be682001-01-17 15:42:30 +00003950 int res = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003951 switch (op) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00003952 case PyCmp_IS:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003953 res = (v == w);
Raymond Hettinger4bad9ba2003-01-19 05:08:13 +00003954 break;
3955 case PyCmp_IS_NOT:
3956 res = (v != w);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003957 break;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003958 case PyCmp_IN:
Raymond Hettinger4bad9ba2003-01-19 05:08:13 +00003959 res = PySequence_Contains(w, v);
3960 if (res < 0)
3961 return NULL;
3962 break;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003963 case PyCmp_NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003964 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003965 if (res < 0)
3966 return NULL;
Raymond Hettinger4bad9ba2003-01-19 05:08:13 +00003967 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003968 break;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003969 case PyCmp_EXC_MATCH:
Thomas Wouters9fe394c2007-02-05 01:24:16 +00003970 if (PyTuple_Check(w)) {
3971 Py_ssize_t i, length;
3972 length = PyTuple_Size(w);
3973 for (i = 0; i < length; i += 1) {
3974 PyObject *exc = PyTuple_GET_ITEM(w, i);
Brett Cannon39590462007-02-26 22:01:14 +00003975 if (!PyExceptionClass_Check(exc)) {
3976 PyErr_SetString(PyExc_TypeError,
3977 CANNOT_CATCH_MSG);
Brett Cannonf74225d2007-02-26 21:10:16 +00003978 return NULL;
Thomas Wouters9fe394c2007-02-05 01:24:16 +00003979 }
3980 }
3981 }
3982 else {
Brett Cannon39590462007-02-26 22:01:14 +00003983 if (!PyExceptionClass_Check(w)) {
3984 PyErr_SetString(PyExc_TypeError,
3985 CANNOT_CATCH_MSG);
Brett Cannonf74225d2007-02-26 21:10:16 +00003986 return NULL;
Thomas Wouters9fe394c2007-02-05 01:24:16 +00003987 }
3988 }
Barry Warsaw4249f541997-08-22 21:26:19 +00003989 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003990 break;
3991 default:
Guido van Rossumac7be682001-01-17 15:42:30 +00003992 return PyObject_RichCompare(v, w, op);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003993 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003994 v = res ? Py_True : Py_False;
3995 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003996 return v;
3997}
3998
Thomas Wouters52152252000-08-17 22:55:00 +00003999static PyObject *
4000import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00004001{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00004002 PyObject *x;
4003
4004 x = PyObject_GetAttr(v, name);
4005 if (x == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
Thomas Wouters52152252000-08-17 22:55:00 +00004006 PyErr_Format(PyExc_ImportError,
4007 "cannot import name %.230s",
4008 PyString_AsString(name));
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00004009 }
Thomas Wouters52152252000-08-17 22:55:00 +00004010 return x;
4011}
Guido van Rossumac7be682001-01-17 15:42:30 +00004012
Thomas Wouters52152252000-08-17 22:55:00 +00004013static int
4014import_all_from(PyObject *locals, PyObject *v)
4015{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00004016 PyObject *all = PyObject_GetAttrString(v, "__all__");
4017 PyObject *dict, *name, *value;
4018 int skip_leading_underscores = 0;
4019 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00004020
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00004021 if (all == NULL) {
4022 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
4023 return -1; /* Unexpected error */
4024 PyErr_Clear();
4025 dict = PyObject_GetAttrString(v, "__dict__");
4026 if (dict == NULL) {
4027 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
4028 return -1;
4029 PyErr_SetString(PyExc_ImportError,
4030 "from-import-* object has no __dict__ and no __all__");
Guido van Rossum3f5da241990-12-20 15:06:42 +00004031 return -1;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00004032 }
4033 all = PyMapping_Keys(dict);
4034 Py_DECREF(dict);
4035 if (all == NULL)
4036 return -1;
4037 skip_leading_underscores = 1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00004038 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00004039
4040 for (pos = 0, err = 0; ; pos++) {
4041 name = PySequence_GetItem(all, pos);
4042 if (name == NULL) {
4043 if (!PyErr_ExceptionMatches(PyExc_IndexError))
4044 err = -1;
4045 else
4046 PyErr_Clear();
4047 break;
4048 }
4049 if (skip_leading_underscores &&
4050 PyString_Check(name) &&
4051 PyString_AS_STRING(name)[0] == '_')
4052 {
4053 Py_DECREF(name);
4054 continue;
4055 }
4056 value = PyObject_GetAttr(v, name);
4057 if (value == NULL)
4058 err = -1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00004059 else if (PyDict_CheckExact(locals))
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00004060 err = PyDict_SetItem(locals, name, value);
Thomas Wouters89f507f2006-12-13 04:49:30 +00004061 else
4062 err = PyObject_SetItem(locals, name, value);
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00004063 Py_DECREF(name);
4064 Py_XDECREF(value);
4065 if (err != 0)
4066 break;
4067 }
4068 Py_DECREF(all);
4069 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00004070}
4071
Guido van Rossumac7be682001-01-17 15:42:30 +00004072static void
Paul Prescode68140d2000-08-30 20:25:01 +00004073format_exc_check_arg(PyObject *exc, char *format_str, PyObject *obj)
4074{
4075 char *obj_str;
4076
4077 if (!obj)
4078 return;
4079
4080 obj_str = PyString_AsString(obj);
4081 if (!obj_str)
4082 return;
4083
4084 PyErr_Format(exc, format_str, obj_str);
4085}
Guido van Rossum950361c1997-01-24 13:49:28 +00004086
Raymond Hettinger52a21b82004-08-06 18:43:09 +00004087static PyObject *
4088string_concatenate(PyObject *v, PyObject *w,
4089 PyFrameObject *f, unsigned char *next_instr)
4090{
4091 /* This function implements 'variable += expr' when both arguments
4092 are strings. */
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004093 Py_ssize_t v_len = PyString_GET_SIZE(v);
4094 Py_ssize_t w_len = PyString_GET_SIZE(w);
4095 Py_ssize_t new_len = v_len + w_len;
4096 if (new_len < 0) {
4097 PyErr_SetString(PyExc_OverflowError,
4098 "strings are too large to concat");
4099 return NULL;
4100 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00004101
Raymond Hettinger52a21b82004-08-06 18:43:09 +00004102 if (v->ob_refcnt == 2) {
4103 /* In the common case, there are 2 references to the value
4104 * stored in 'variable' when the += is performed: one on the
4105 * value stack (in 'v') and one still stored in the 'variable'.
4106 * We try to delete the variable now to reduce the refcnt to 1.
4107 */
4108 switch (*next_instr) {
4109 case STORE_FAST:
4110 {
4111 int oparg = PEEKARG();
4112 PyObject **fastlocals = f->f_localsplus;
4113 if (GETLOCAL(oparg) == v)
4114 SETLOCAL(oparg, NULL);
4115 break;
4116 }
4117 case STORE_DEREF:
4118 {
Thomas Wouters477c8d52006-05-27 19:21:47 +00004119 PyObject **freevars = f->f_localsplus + f->f_code->co_nlocals;
Raymond Hettinger52a21b82004-08-06 18:43:09 +00004120 PyObject *c = freevars[PEEKARG()];
4121 if (PyCell_GET(c) == v)
4122 PyCell_Set(c, NULL);
4123 break;
4124 }
4125 case STORE_NAME:
4126 {
4127 PyObject *names = f->f_code->co_names;
4128 PyObject *name = GETITEM(names, PEEKARG());
4129 PyObject *locals = f->f_locals;
4130 if (PyDict_CheckExact(locals) &&
4131 PyDict_GetItem(locals, name) == v) {
4132 if (PyDict_DelItem(locals, name) != 0) {
4133 PyErr_Clear();
4134 }
4135 }
4136 break;
4137 }
4138 }
4139 }
4140
Armin Rigo618fbf52004-08-07 20:58:32 +00004141 if (v->ob_refcnt == 1 && !PyString_CHECK_INTERNED(v)) {
Raymond Hettinger52a21b82004-08-06 18:43:09 +00004142 /* Now we own the last reference to 'v', so we can resize it
4143 * in-place.
4144 */
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004145 if (_PyString_Resize(&v, new_len) != 0) {
Raymond Hettinger52a21b82004-08-06 18:43:09 +00004146 /* XXX if _PyString_Resize() fails, 'v' has been
4147 * deallocated so it cannot be put back into 'variable'.
4148 * The MemoryError is raised when there is no value in
4149 * 'variable', which might (very remotely) be a cause
4150 * of incompatibilities.
4151 */
4152 return NULL;
4153 }
4154 /* copy 'w' into the newly allocated area of 'v' */
4155 memcpy(PyString_AS_STRING(v) + v_len,
4156 PyString_AS_STRING(w), w_len);
4157 return v;
4158 }
4159 else {
4160 /* When in-place resizing is not an option. */
4161 PyString_Concat(&v, w);
4162 return v;
4163 }
4164}
4165
Guido van Rossum950361c1997-01-24 13:49:28 +00004166#ifdef DYNAMIC_EXECUTION_PROFILE
4167
Skip Montanarof118cb12001-10-15 20:51:38 +00004168static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004169getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00004170{
4171 int i;
4172 PyObject *l = PyList_New(256);
4173 if (l == NULL) return NULL;
4174 for (i = 0; i < 256; i++) {
4175 PyObject *x = PyInt_FromLong(a[i]);
4176 if (x == NULL) {
4177 Py_DECREF(l);
4178 return NULL;
4179 }
4180 PyList_SetItem(l, i, x);
4181 }
4182 for (i = 0; i < 256; i++)
4183 a[i] = 0;
4184 return l;
4185}
4186
4187PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004188_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00004189{
4190#ifndef DXPAIRS
4191 return getarray(dxp);
4192#else
4193 int i;
4194 PyObject *l = PyList_New(257);
4195 if (l == NULL) return NULL;
4196 for (i = 0; i < 257; i++) {
4197 PyObject *x = getarray(dxpairs[i]);
4198 if (x == NULL) {
4199 Py_DECREF(l);
4200 return NULL;
4201 }
4202 PyList_SetItem(l, i, x);
4203 }
4204 return l;
4205#endif
4206}
4207
4208#endif