blob: 88b9d0e8882bcfdec958c69e6d11d3d6ec51a9aa [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
Fredrik Lundh7a830892006-05-27 10:39:48 +00009/* enable more aggressive intra-module optimizations, where available */
Fredrik Lundh57640f52006-05-26 11:54:04 +000010#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
Tim Peters7df5e7f2006-05-26 23:14:37 +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
Thomas Wouterse2176022007-09-20 17:35:10 +000031 section should work for GCC on any PowerPC
32 platform, irrespective of OS.
33 POWER? Who knows :-) */
Michael W. Hudson800ba232004-08-12 18:19:17 +000034
Michael W. Hudson75eabd22005-01-18 15:56:11 +000035#define READ_TIMESTAMP(var) ppc_getcounter(&var)
Michael W. Hudson800ba232004-08-12 18:19:17 +000036
Fredrik Lundh7a830892006-05-27 10:39:48 +000037static void
Michael W. Hudson800ba232004-08-12 18:19:17 +000038ppc_getcounter(uint64 *v)
39{
40 register unsigned long tbu, tb, tbu2;
41
42 loop:
43 asm volatile ("mftbu %0" : "=r" (tbu) );
44 asm volatile ("mftb %0" : "=r" (tb) );
45 asm volatile ("mftbu %0" : "=r" (tbu2));
46 if (__builtin_expect(tbu != tbu2, 0)) goto loop;
47
Tim Peters7df5e7f2006-05-26 23:14:37 +000048 /* The slightly peculiar way of writing the next lines is
Michael W. Hudson800ba232004-08-12 18:19:17 +000049 compiled better by GCC than any other way I tried. */
50 ((long*)(v))[0] = tbu;
51 ((long*)(v))[1] = tb;
52}
53
Michael W. Hudson75eabd22005-01-18 15:56:11 +000054#else /* this is for linux/x86 (and probably any other GCC/x86 combo) */
Michael W. Hudson800ba232004-08-12 18:19:17 +000055
Michael W. Hudson75eabd22005-01-18 15:56:11 +000056#define READ_TIMESTAMP(val) \
57 __asm__ __volatile__("rdtsc" : "=A" (val))
Michael W. Hudson800ba232004-08-12 18:19:17 +000058
59#endif
60
Tim Peters7df5e7f2006-05-26 23:14:37 +000061void dump_tsc(int opcode, int ticked, uint64 inst0, uint64 inst1,
Martin v. Löwisf30d60e2004-06-08 08:17:44 +000062 uint64 loop0, uint64 loop1, uint64 intr0, uint64 intr1)
63{
64 uint64 intr, inst, loop;
65 PyThreadState *tstate = PyThreadState_Get();
66 if (!tstate->interp->tscdump)
67 return;
68 intr = intr1 - intr0;
69 inst = inst1 - inst0 - intr;
70 loop = loop1 - loop0 - intr;
71 fprintf(stderr, "opcode=%03d t=%d inst=%06lld loop=%06lld\n",
72 opcode, ticked, inst, loop);
73}
Michael W. Hudson800ba232004-08-12 18:19:17 +000074
Martin v. Löwisf30d60e2004-06-08 08:17:44 +000075#endif
76
Guido van Rossum04691fc1992-08-12 15:35:34 +000077/* Turn this on if your compiler chokes on the big switch: */
Guido van Rossum1ae940a1995-01-02 19:04:15 +000078/* #define CASE_TOO_BIG 1 */
Guido van Rossum04691fc1992-08-12 15:35:34 +000079
Guido van Rossum408027e1996-12-30 16:17:54 +000080#ifdef Py_DEBUG
Guido van Rossum96a42c81992-01-12 02:29:51 +000081/* For debugging the interpreter: */
82#define LLTRACE 1 /* Low-level trace feature */
83#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000084#endif
85
Jeremy Hylton52820442001-01-03 23:52:36 +000086typedef PyObject *(*callproc)(PyObject *, PyObject *, PyObject *);
Guido van Rossum5b722181993-03-30 17:46:03 +000087
Guido van Rossum374a9221991-04-04 10:40:29 +000088/* Forward declarations */
Martin v. Löwisf30d60e2004-06-08 08:17:44 +000089#ifdef WITH_TSC
Fredrik Lundh7a830892006-05-27 10:39:48 +000090static PyObject * call_function(PyObject ***, int, uint64*, uint64*);
Martin v. Löwisf30d60e2004-06-08 08:17:44 +000091#else
Fredrik Lundh7a830892006-05-27 10:39:48 +000092static PyObject * call_function(PyObject ***, int);
Martin v. Löwisf30d60e2004-06-08 08:17:44 +000093#endif
Fredrik Lundh7a830892006-05-27 10:39:48 +000094static PyObject * fast_function(PyObject *, PyObject ***, int, int, int);
95static PyObject * do_call(PyObject *, PyObject ***, int, int);
96static PyObject * ext_do_call(PyObject *, PyObject ***, int, int, int);
Thomas Wouterse2176022007-09-20 17:35:10 +000097static PyObject * update_keyword_args(PyObject *, int, PyObject ***,
98 PyObject *);
Fredrik Lundh7a830892006-05-27 10:39:48 +000099static PyObject * update_star_args(int, int, PyObject *, PyObject ***);
100static PyObject * load_args(PyObject ***, int);
Jeremy Hylton52820442001-01-03 23:52:36 +0000101#define CALL_FLAG_VAR 1
102#define CALL_FLAG_KW 2
103
Guido van Rossum0a066c01992-03-27 17:29:15 +0000104#ifdef LLTRACE
Fredrik Lundh1b949402006-05-26 12:01:49 +0000105static int lltrace;
Fredrik Lundh7a830892006-05-27 10:39:48 +0000106static int prtrace(PyObject *, char *);
Guido van Rossum0a066c01992-03-27 17:29:15 +0000107#endif
Fredrik Lundh7a830892006-05-27 10:39:48 +0000108static int call_trace(Py_tracefunc, PyObject *, PyFrameObject *,
Fred Drake5755ce62001-06-27 19:19:46 +0000109 int, PyObject *);
Amaury Forgeot d'Arc0d75f092007-11-13 21:54:28 +0000110static int call_trace_protected(Py_tracefunc, PyObject *,
Armin Rigo1c2d7e52005-09-20 18:34:01 +0000111 PyFrameObject *, int, PyObject *);
Fredrik Lundh7a830892006-05-27 10:39:48 +0000112static void call_exc_trace(Py_tracefunc, PyObject *, PyFrameObject *);
113static int maybe_call_line_trace(Py_tracefunc, PyObject *,
Armin Rigobf57a142004-03-22 19:24:58 +0000114 PyFrameObject *, int *, int *, int *);
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000115
Fredrik Lundh7a830892006-05-27 10:39:48 +0000116static PyObject * apply_slice(PyObject *, PyObject *, PyObject *);
117static int assign_slice(PyObject *, PyObject *,
Tim Petersdbd9ba62000-07-09 03:09:57 +0000118 PyObject *, PyObject *);
Fredrik Lundh7a830892006-05-27 10:39:48 +0000119static PyObject * cmp_outcome(int, PyObject *, PyObject *);
120static PyObject * import_from(PyObject *, PyObject *);
121static int import_all_from(PyObject *, PyObject *);
122static PyObject * build_class(PyObject *, PyObject *, PyObject *);
123static int exec_statement(PyFrameObject *,
Tim Petersdbd9ba62000-07-09 03:09:57 +0000124 PyObject *, PyObject *, PyObject *);
Fredrik Lundh7a830892006-05-27 10:39:48 +0000125static void set_exc_info(PyThreadState *, PyObject *, PyObject *, PyObject *);
126static void reset_exc_info(PyThreadState *);
127static void format_exc_check_arg(PyObject *, char *, PyObject *);
128static PyObject * string_concatenate(PyObject *, PyObject *,
Raymond Hettinger52a21b82004-08-06 18:43:09 +0000129 PyFrameObject *, unsigned char *);
Benjamin Petersone18ef192009-01-20 14:21:16 +0000130static PyObject * kwd_as_string(PyObject *);
Guido van Rossum374a9221991-04-04 10:40:29 +0000131
Paul Prescode68140d2000-08-30 20:25:01 +0000132#define NAME_ERROR_MSG \
Fred Drake661ea262000-10-24 19:57:45 +0000133 "name '%.200s' is not defined"
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000134#define GLOBAL_NAME_ERROR_MSG \
135 "global name '%.200s' is not defined"
Paul Prescode68140d2000-08-30 20:25:01 +0000136#define UNBOUNDLOCAL_ERROR_MSG \
Fred Drake661ea262000-10-24 19:57:45 +0000137 "local variable '%.200s' referenced before assignment"
Jeremy Hyltonc76770c2001-04-13 16:51:46 +0000138#define UNBOUNDFREE_ERROR_MSG \
139 "free variable '%.200s' referenced before assignment" \
140 " in enclosing scope"
Guido van Rossum374a9221991-04-04 10:40:29 +0000141
Guido van Rossum950361c1997-01-24 13:49:28 +0000142/* Dynamic execution profile */
143#ifdef DYNAMIC_EXECUTION_PROFILE
144#ifdef DXPAIRS
145static long dxpairs[257][256];
146#define dxp dxpairs[256]
147#else
148static long dxp[256];
149#endif
150#endif
151
Jeremy Hylton985eba52003-02-05 23:13:00 +0000152/* Function call profile */
153#ifdef CALL_PROFILE
154#define PCALL_NUM 11
155static int pcall[PCALL_NUM];
156
157#define PCALL_ALL 0
158#define PCALL_FUNCTION 1
159#define PCALL_FAST_FUNCTION 2
160#define PCALL_FASTER_FUNCTION 3
161#define PCALL_METHOD 4
162#define PCALL_BOUND_METHOD 5
163#define PCALL_CFUNCTION 6
164#define PCALL_TYPE 7
165#define PCALL_GENERATOR 8
166#define PCALL_OTHER 9
167#define PCALL_POP 10
168
169/* Notes about the statistics
170
171 PCALL_FAST stats
172
173 FAST_FUNCTION means no argument tuple needs to be created.
174 FASTER_FUNCTION means that the fast-path frame setup code is used.
175
176 If there is a method call where the call can be optimized by changing
177 the argument tuple and calling the function directly, it gets recorded
178 twice.
179
180 As a result, the relationship among the statistics appears to be
181 PCALL_ALL == PCALL_FUNCTION + PCALL_METHOD - PCALL_BOUND_METHOD +
182 PCALL_CFUNCTION + PCALL_TYPE + PCALL_GENERATOR + PCALL_OTHER
183 PCALL_FUNCTION > PCALL_FAST_FUNCTION > PCALL_FASTER_FUNCTION
184 PCALL_METHOD > PCALL_BOUND_METHOD
185*/
186
187#define PCALL(POS) pcall[POS]++
188
189PyObject *
190PyEval_GetCallStats(PyObject *self)
191{
Andrew M. Kuchling1f3ebe02006-10-27 13:22:46 +0000192 return Py_BuildValue("iiiiiiiiiii",
Jeremy Hylton985eba52003-02-05 23:13:00 +0000193 pcall[0], pcall[1], pcall[2], pcall[3],
194 pcall[4], pcall[5], pcall[6], pcall[7],
Andrew M. Kuchling1f3ebe02006-10-27 13:22:46 +0000195 pcall[8], pcall[9], pcall[10]);
Jeremy Hylton985eba52003-02-05 23:13:00 +0000196}
197#else
198#define PCALL(O)
199
200PyObject *
201PyEval_GetCallStats(PyObject *self)
202{
203 Py_INCREF(Py_None);
204 return Py_None;
205}
206#endif
207
Tim Peters5ca576e2001-06-18 22:08:13 +0000208
Guido van Rossume59214e1994-08-30 08:01:59 +0000209#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000210
Martin v. Löwis0e8bd7e2006-06-10 12:23:46 +0000211#ifdef HAVE_ERRNO_H
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000212#include <errno.h>
Guido van Rossum2571cc81999-04-07 16:07:23 +0000213#endif
Guido van Rossum49b56061998-10-01 20:42:43 +0000214#include "pythread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000215
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000216static PyThread_type_lock interpreter_lock = 0; /* This is the GIL */
Kristján Valur Jónsson0e919382009-01-09 20:31:26 +0000217static PyThread_type_lock pending_lock = 0; /* for pending calls */
Guido van Rossuma9672091994-09-14 13:31:22 +0000218static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000219
Tim Peters7f468f22004-10-11 02:40:51 +0000220int
221PyEval_ThreadsInitialized(void)
222{
223 return interpreter_lock != 0;
224}
225
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000226void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000227PyEval_InitThreads(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000228{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000229 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000230 return;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000231 interpreter_lock = PyThread_allocate_lock();
232 PyThread_acquire_lock(interpreter_lock, 1);
233 main_thread = PyThread_get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000234}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000235
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000236void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000237PyEval_AcquireLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000238{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000239 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000240}
241
242void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000243PyEval_ReleaseLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000244{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000245 PyThread_release_lock(interpreter_lock);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000246}
247
248void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000249PyEval_AcquireThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000250{
251 if (tstate == NULL)
252 Py_FatalError("PyEval_AcquireThread: NULL new thread state");
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000253 /* Check someone has called PyEval_InitThreads() to create the lock */
254 assert(interpreter_lock);
Guido van Rossum65d5b571998-12-21 19:32:43 +0000255 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000256 if (PyThreadState_Swap(tstate) != NULL)
257 Py_FatalError(
258 "PyEval_AcquireThread: non-NULL old thread state");
259}
260
261void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000262PyEval_ReleaseThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000263{
264 if (tstate == NULL)
265 Py_FatalError("PyEval_ReleaseThread: NULL thread state");
266 if (PyThreadState_Swap(NULL) != tstate)
267 Py_FatalError("PyEval_ReleaseThread: wrong thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000268 PyThread_release_lock(interpreter_lock);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000269}
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000270
271/* This function is called from PyOS_AfterFork to ensure that newly
272 created child processes don't hold locks referring to threads which
273 are not running in the child process. (This could also be done using
274 pthread_atfork mechanism, at least for the pthreads implementation.) */
275
276void
277PyEval_ReInitThreads(void)
278{
Jesse Noller5e62ca42008-07-16 20:03:47 +0000279 PyObject *threading, *result;
280 PyThreadState *tstate;
281
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000282 if (!interpreter_lock)
283 return;
284 /*XXX Can't use PyThread_free_lock here because it does too
285 much error-checking. Doing this cleanly would require
286 adding a new function to each thread_*.h. Instead, just
287 create a new lock and waste a little bit of memory */
288 interpreter_lock = PyThread_allocate_lock();
Kristján Valur Jónsson0e919382009-01-09 20:31:26 +0000289 pending_lock = PyThread_allocate_lock();
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000290 PyThread_acquire_lock(interpreter_lock, 1);
291 main_thread = PyThread_get_thread_ident();
Jesse Noller5e62ca42008-07-16 20:03:47 +0000292
293 /* Update the threading module with the new state.
294 */
295 tstate = PyThreadState_GET();
296 threading = PyMapping_GetItemString(tstate->interp->modules,
297 "threading");
298 if (threading == NULL) {
299 /* threading not imported */
300 PyErr_Clear();
301 return;
302 }
303 result = PyObject_CallMethod(threading, "_after_fork", NULL);
304 if (result == NULL)
305 PyErr_WriteUnraisable(threading);
306 else
307 Py_DECREF(result);
308 Py_DECREF(threading);
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000309}
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000310#endif
311
Guido van Rossumff4949e1992-08-05 19:58:53 +0000312/* Functions save_thread and restore_thread are always defined so
313 dynamically loaded modules needn't be compiled separately for use
314 with and without threads: */
315
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000316PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000317PyEval_SaveThread(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000318{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000319 PyThreadState *tstate = PyThreadState_Swap(NULL);
320 if (tstate == NULL)
321 Py_FatalError("PyEval_SaveThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000322#ifdef WITH_THREAD
Guido van Rossumb74eca91997-09-30 22:03:16 +0000323 if (interpreter_lock)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000324 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000325#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000326 return tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000327}
328
329void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000330PyEval_RestoreThread(PyThreadState *tstate)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000331{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000332 if (tstate == NULL)
333 Py_FatalError("PyEval_RestoreThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000334#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000335 if (interpreter_lock) {
Guido van Rossumb74eca91997-09-30 22:03:16 +0000336 int err = errno;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000337 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000338 errno = err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000339 }
340#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000341 PyThreadState_Swap(tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000342}
343
344
Guido van Rossuma9672091994-09-14 13:31:22 +0000345/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
346 signal handlers or Mac I/O completion routines) can schedule calls
347 to a function to be called synchronously.
348 The synchronous function is called with one void* argument.
349 It should return 0 for success or -1 for failure -- failure should
350 be accompanied by an exception.
351
352 If registry succeeds, the registry function returns 0; if it fails
353 (e.g. due to too many pending calls) it returns -1 (without setting
354 an exception condition).
355
356 Note that because registry may occur from within signal handlers,
357 or other asynchronous events, calling malloc() is unsafe!
358
359#ifdef WITH_THREAD
360 Any thread can schedule pending calls, but only the main thread
361 will execute them.
Kristján Valur Jónsson0e919382009-01-09 20:31:26 +0000362 There is no facility to schedule calls to a particular thread, but
363 that should be easy to change, should that ever be required. In
364 that case, the static variables here should go into the python
365 threadstate.
Guido van Rossuma9672091994-09-14 13:31:22 +0000366#endif
Kristján Valur Jónsson0e919382009-01-09 20:31:26 +0000367*/
Guido van Rossuma9672091994-09-14 13:31:22 +0000368
Kristján Valur Jónsson0e919382009-01-09 20:31:26 +0000369#ifdef WITH_THREAD
370
371/* The WITH_THREAD implementation is thread-safe. It allows
372 scheduling to be made from any thread, and even from an executing
373 callback.
374 */
375
376#define NPENDINGCALLS 32
377static struct {
378 int (*func)(void *);
379 void *arg;
380} pendingcalls[NPENDINGCALLS];
381static int pendingfirst = 0;
382static int pendinglast = 0;
383static volatile int pendingcalls_to_do = 1; /* trigger initialization of lock */
384static char pendingbusy = 0;
385
386int
387Py_AddPendingCall(int (*func)(void *), void *arg)
388{
389 int i, j, result=0;
390 PyThread_type_lock lock = pending_lock;
391
392 /* try a few times for the lock. Since this mechanism is used
393 * for signal handling (on the main thread), there is a (slim)
394 * chance that a signal is delivered on the same thread while we
395 * hold the lock during the Py_MakePendingCalls() function.
396 * This avoids a deadlock in that case.
397 * Note that signals can be delivered on any thread. In particular,
398 * on Windows, a SIGINT is delivered on a system-created worker
399 * thread.
400 * We also check for lock being NULL, in the unlikely case that
401 * this function is called before any bytecode evaluation takes place.
402 */
403 if (lock != NULL) {
404 for (i = 0; i<100; i++) {
405 if (PyThread_acquire_lock(lock, NOWAIT_LOCK))
406 break;
407 }
408 if (i == 100)
409 return -1;
410 }
411
412 i = pendinglast;
413 j = (i + 1) % NPENDINGCALLS;
414 if (j == pendingfirst) {
415 result = -1; /* Queue full */
416 } else {
417 pendingcalls[i].func = func;
418 pendingcalls[i].arg = arg;
419 pendinglast = j;
420 }
421 /* signal main loop */
422 _Py_Ticker = 0;
423 pendingcalls_to_do = 1;
424 if (lock != NULL)
425 PyThread_release_lock(lock);
426 return result;
427}
428
429int
430Py_MakePendingCalls(void)
431{
432 int i;
433 int r = 0;
434
435 if (!pending_lock) {
436 /* initial allocation of the lock */
437 pending_lock = PyThread_allocate_lock();
438 if (pending_lock == NULL)
439 return -1;
440 }
441
442 /* only service pending calls on main thread */
443 if (main_thread && PyThread_get_thread_ident() != main_thread)
444 return 0;
445 /* don't perform recursive pending calls */
446 if (pendingbusy)
447 return 0;
448 pendingbusy = 1;
449 /* perform a bounded number of calls, in case of recursion */
450 for (i=0; i<NPENDINGCALLS; i++) {
451 int j;
452 int (*func)(void *);
Mark Dickinson9e58a372009-02-08 17:33:11 +0000453 void *arg = NULL;
Kristján Valur Jónsson0e919382009-01-09 20:31:26 +0000454
455 /* pop one item off the queue while holding the lock */
456 PyThread_acquire_lock(pending_lock, WAIT_LOCK);
457 j = pendingfirst;
458 if (j == pendinglast) {
459 func = NULL; /* Queue empty */
460 } else {
461 func = pendingcalls[j].func;
462 arg = pendingcalls[j].arg;
463 pendingfirst = (j + 1) % NPENDINGCALLS;
464 }
465 pendingcalls_to_do = pendingfirst != pendinglast;
466 PyThread_release_lock(pending_lock);
467 /* having released the lock, perform the callback */
468 if (func == NULL)
469 break;
470 r = func(arg);
471 if (r)
472 break;
473 }
474 pendingbusy = 0;
475 return r;
476}
477
478#else /* if ! defined WITH_THREAD */
479
480/*
481 WARNING! ASYNCHRONOUSLY EXECUTING CODE!
482 This code is used for signal handling in python that isn't built
483 with WITH_THREAD.
484 Don't use this implementation when Py_AddPendingCalls() can happen
485 on a different thread!
486
Guido van Rossuma9672091994-09-14 13:31:22 +0000487 There are two possible race conditions:
Kristján Valur Jónsson0e919382009-01-09 20:31:26 +0000488 (1) nested asynchronous calls to Py_AddPendingCall()
489 (2) AddPendingCall() calls made while pending calls are being processed.
490
491 (1) is very unlikely because typically signal delivery
492 is blocked during signal handling. So it should be impossible.
493 (2) is a real possibility.
Guido van Rossuma9672091994-09-14 13:31:22 +0000494 The current code is safe against (2), but not against (1).
495 The safety against (2) is derived from the fact that only one
Kristján Valur Jónsson0e919382009-01-09 20:31:26 +0000496 thread is present, interrupted by signals, and that the critical
497 section is protected with the "busy" variable. On Windows, which
498 delivers SIGINT on a system thread, this does not hold and therefore
499 Windows really shouldn't use this version.
500 The two threads could theoretically wiggle around the "busy" variable.
Guido van Rossuma027efa1997-05-05 20:56:21 +0000501*/
Guido van Rossum8861b741996-07-30 16:49:37 +0000502
Guido van Rossuma9672091994-09-14 13:31:22 +0000503#define NPENDINGCALLS 32
504static struct {
Thomas Wouters334fb892000-07-25 12:56:38 +0000505 int (*func)(void *);
506 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000507} pendingcalls[NPENDINGCALLS];
508static volatile int pendingfirst = 0;
509static volatile int pendinglast = 0;
Kristján Valur Jónsson0e919382009-01-09 20:31:26 +0000510static volatile int pendingcalls_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000511
512int
Thomas Wouters334fb892000-07-25 12:56:38 +0000513Py_AddPendingCall(int (*func)(void *), void *arg)
Guido van Rossuma9672091994-09-14 13:31:22 +0000514{
Michael W. Hudson30ea2f22004-07-07 17:44:12 +0000515 static volatile int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000516 int i, j;
517 /* XXX Begin critical section */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000518 if (busy)
519 return -1;
520 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000521 i = pendinglast;
522 j = (i + 1) % NPENDINGCALLS;
Guido van Rossum04e70322002-07-17 16:57:13 +0000523 if (j == pendingfirst) {
524 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000525 return -1; /* Queue full */
Guido van Rossum04e70322002-07-17 16:57:13 +0000526 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000527 pendingcalls[i].func = func;
528 pendingcalls[i].arg = arg;
529 pendinglast = j;
Skip Montanarod581d772002-09-03 20:10:45 +0000530
531 _Py_Ticker = 0;
Kristján Valur Jónsson0e919382009-01-09 20:31:26 +0000532 pendingcalls_to_do = 1; /* Signal main loop */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000533 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000534 /* XXX End critical section */
535 return 0;
536}
537
Guido van Rossum180d7b41994-09-29 09:45:57 +0000538int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000539Py_MakePendingCalls(void)
Guido van Rossuma9672091994-09-14 13:31:22 +0000540{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000541 static int busy = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000542 if (busy)
Guido van Rossum180d7b41994-09-29 09:45:57 +0000543 return 0;
544 busy = 1;
Kristján Valur Jónsson0e919382009-01-09 20:31:26 +0000545 pendingcalls_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000546 for (;;) {
547 int i;
Thomas Wouters334fb892000-07-25 12:56:38 +0000548 int (*func)(void *);
549 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000550 i = pendingfirst;
551 if (i == pendinglast)
552 break; /* Queue empty */
553 func = pendingcalls[i].func;
554 arg = pendingcalls[i].arg;
555 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000556 if (func(arg) < 0) {
557 busy = 0;
Kristján Valur Jónsson0e919382009-01-09 20:31:26 +0000558 pendingcalls_to_do = 1; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000559 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000560 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000561 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000562 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000563 return 0;
564}
565
Kristján Valur Jónsson0e919382009-01-09 20:31:26 +0000566#endif /* WITH_THREAD */
567
Guido van Rossuma9672091994-09-14 13:31:22 +0000568
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000569/* The interpreter's recursion limit */
570
Hye-Shik Changb6fa2812005-04-04 15:49:02 +0000571#ifndef Py_DEFAULT_RECURSION_LIMIT
572#define Py_DEFAULT_RECURSION_LIMIT 1000
573#endif
574static int recursion_limit = Py_DEFAULT_RECURSION_LIMIT;
575int _Py_CheckRecursionLimit = Py_DEFAULT_RECURSION_LIMIT;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000576
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000577int
578Py_GetRecursionLimit(void)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000579{
580 return recursion_limit;
581}
582
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000583void
584Py_SetRecursionLimit(int new_limit)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000585{
586 recursion_limit = new_limit;
Thomas Woutersae406c62007-09-19 17:27:43 +0000587 _Py_CheckRecursionLimit = recursion_limit;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000588}
589
Armin Rigo2b3eb402003-10-28 12:05:48 +0000590/* the macro Py_EnterRecursiveCall() only calls _Py_CheckRecursiveCall()
591 if the recursion_depth reaches _Py_CheckRecursionLimit.
592 If USE_STACKCHECK, the macro decrements _Py_CheckRecursionLimit
593 to guarantee that _Py_CheckRecursiveCall() is regularly called.
594 Without USE_STACKCHECK, there is no need for this. */
595int
596_Py_CheckRecursiveCall(char *where)
597{
598 PyThreadState *tstate = PyThreadState_GET();
599
600#ifdef USE_STACKCHECK
601 if (PyOS_CheckStack()) {
602 --tstate->recursion_depth;
603 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
604 return -1;
605 }
606#endif
607 if (tstate->recursion_depth > recursion_limit) {
608 --tstate->recursion_depth;
609 PyErr_Format(PyExc_RuntimeError,
610 "maximum recursion depth exceeded%s",
611 where);
612 return -1;
613 }
Thomas Woutersae406c62007-09-19 17:27:43 +0000614 _Py_CheckRecursionLimit = recursion_limit;
Armin Rigo2b3eb402003-10-28 12:05:48 +0000615 return 0;
616}
617
Guido van Rossum374a9221991-04-04 10:40:29 +0000618/* Status code for main loop (reason for stack unwind) */
Raymond Hettinger7c958652004-04-06 10:11:10 +0000619enum why_code {
620 WHY_NOT = 0x0001, /* No error */
621 WHY_EXCEPTION = 0x0002, /* Exception occurred */
622 WHY_RERAISE = 0x0004, /* Exception re-raised by 'finally' */
623 WHY_RETURN = 0x0008, /* 'return' statement */
624 WHY_BREAK = 0x0010, /* 'break' statement */
625 WHY_CONTINUE = 0x0020, /* 'continue' statement */
626 WHY_YIELD = 0x0040 /* 'yield' operator */
627};
Guido van Rossum374a9221991-04-04 10:40:29 +0000628
Fredrik Lundh7a830892006-05-27 10:39:48 +0000629static enum why_code do_raise(PyObject *, PyObject *, PyObject *);
630static int unpack_iterable(PyObject *, int, PyObject **);
Guido van Rossum1aa14831997-01-21 05:34:20 +0000631
Jeffrey Yasskinfd8a1ec2008-12-03 06:46:45 +0000632/* Records whether tracing is on for any thread. Counts the number of
633 threads for which tstate->c_tracefunc is non-NULL, so if the value
634 is 0, we know we don't have to check this thread's c_tracefunc.
635 This speeds up the if statement in PyEval_EvalFrameEx() after
636 fast_next_opcode*/
637static int _Py_TracingPossible = 0;
638
Skip Montanarod581d772002-09-03 20:10:45 +0000639/* for manipulating the thread switch and periodic "stuff" - used to be
640 per thread, now just a pair o' globals */
Skip Montanaro99dba272002-09-03 20:19:06 +0000641int _Py_CheckInterval = 100;
Kristján Valur Jónsson0e919382009-01-09 20:31:26 +0000642volatile int _Py_Ticker = 0; /* so that we hit a "tick" first thing */
Guido van Rossum374a9221991-04-04 10:40:29 +0000643
Guido van Rossumb209a111997-04-29 18:18:01 +0000644PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000645PyEval_EvalCode(PyCodeObject *co, PyObject *globals, PyObject *locals)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000646{
Tim Peters6d6c1a32001-08-02 04:15:00 +0000647 return PyEval_EvalCodeEx(co,
Guido van Rossum681d79a1995-07-18 14:51:37 +0000648 globals, locals,
Guido van Rossumb209a111997-04-29 18:18:01 +0000649 (PyObject **)NULL, 0,
650 (PyObject **)NULL, 0,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000651 (PyObject **)NULL, 0,
652 NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000653}
654
655
656/* Interpreter main loop */
657
Martin v. Löwis8d97e332004-06-27 15:43:12 +0000658PyObject *
Phillip J. Eby0d6615f2005-08-02 00:46:46 +0000659PyEval_EvalFrame(PyFrameObject *f) {
660 /* This is for backward compatibility with extension modules that
Thomas Wouterse2176022007-09-20 17:35:10 +0000661 used this API; core interpreter code should call
662 PyEval_EvalFrameEx() */
Phillip J. Eby0d6615f2005-08-02 00:46:46 +0000663 return PyEval_EvalFrameEx(f, 0);
664}
665
666PyObject *
Anthony Baxtera863d332006-04-11 07:43:46 +0000667PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
Guido van Rossum374a9221991-04-04 10:40:29 +0000668{
Guido van Rossum950361c1997-01-24 13:49:28 +0000669#ifdef DXPAIRS
670 int lastopcode = 0;
671#endif
Thomas Wouterse2176022007-09-20 17:35:10 +0000672 register PyObject **stack_pointer; /* Next free slot in value stack */
Guido van Rossum374a9221991-04-04 10:40:29 +0000673 register unsigned char *next_instr;
Armin Rigo8817fcd2004-06-17 10:22:40 +0000674 register int opcode; /* Current opcode */
675 register int oparg; /* Current opcode argument, if any */
Raymond Hettinger7c958652004-04-06 10:11:10 +0000676 register enum why_code why; /* Reason for block stack unwind */
Guido van Rossum374a9221991-04-04 10:40:29 +0000677 register int err; /* Error status -- nonzero if error */
Guido van Rossumb209a111997-04-29 18:18:01 +0000678 register PyObject *x; /* Result object -- NULL if error */
679 register PyObject *v; /* Temporary objects popped off stack */
680 register PyObject *w;
681 register PyObject *u;
682 register PyObject *t;
Barry Warsaw23c9ec82000-08-21 15:44:01 +0000683 register PyObject *stream = NULL; /* for PRINT opcodes */
Jeremy Hylton2b724da2001-01-29 22:51:52 +0000684 register PyObject **fastlocals, **freevars;
Guido van Rossum014518f1998-11-23 21:09:51 +0000685 PyObject *retval = NULL; /* Return value */
Guido van Rossum885553e1998-12-21 18:33:30 +0000686 PyThreadState *tstate = PyThreadState_GET();
Tim Peters5ca576e2001-06-18 22:08:13 +0000687 PyCodeObject *co;
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000688
Tim Peters8a5c3c72004-04-05 19:36:21 +0000689 /* when tracing we set things up so that
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000690
691 not (instr_lb <= current_bytecode_offset < instr_ub)
692
Tim Peters8a5c3c72004-04-05 19:36:21 +0000693 is true when the line being executed has changed. The
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000694 initial values are such as to make this false the first
695 time it is tested. */
Armin Rigobf57a142004-03-22 19:24:58 +0000696 int instr_ub = -1, instr_lb = 0, instr_prev = -1;
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000697
Guido van Rossumd076c731998-10-07 19:42:25 +0000698 unsigned char *first_instr;
Skip Montanaro04d80f82002-08-04 21:03:35 +0000699 PyObject *names;
700 PyObject *consts;
Neal Norwitz5f5153e2005-10-21 04:28:38 +0000701#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000702 /* Make it easier to find out where we are with a debugger */
Tim Peters5ca576e2001-06-18 22:08:13 +0000703 char *filename;
Guido van Rossum99bec951992-09-03 20:29:45 +0000704#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000705
Neal Norwitza81d2202002-07-14 00:27:26 +0000706/* Tuple access macros */
707
708#ifndef Py_DEBUG
709#define GETITEM(v, i) PyTuple_GET_ITEM((PyTupleObject *)(v), (i))
710#else
711#define GETITEM(v, i) PyTuple_GetItem((v), (i))
712#endif
713
Martin v. Löwisf30d60e2004-06-08 08:17:44 +0000714#ifdef WITH_TSC
715/* Use Pentium timestamp counter to mark certain events:
716 inst0 -- beginning of switch statement for opcode dispatch
717 inst1 -- end of switch statement (may be skipped)
718 loop0 -- the top of the mainloop
Tim Peters7df5e7f2006-05-26 23:14:37 +0000719 loop1 -- place where control returns again to top of mainloop
Martin v. Löwisf30d60e2004-06-08 08:17:44 +0000720 (may be skipped)
721 intr1 -- beginning of long interruption
722 intr2 -- end of long interruption
723
724 Many opcodes call out to helper C functions. In some cases, the
725 time in those functions should be counted towards the time for the
726 opcode, but not in all cases. For example, a CALL_FUNCTION opcode
727 calls another Python function; there's no point in charge all the
728 bytecode executed by the called function to the caller.
729
730 It's hard to make a useful judgement statically. In the presence
731 of operator overloading, it's impossible to tell if a call will
732 execute new Python code or not.
733
734 It's a case-by-case judgement. I'll use intr1 for the following
735 cases:
736
737 EXEC_STMT
738 IMPORT_STAR
739 IMPORT_FROM
740 CALL_FUNCTION (and friends)
741
742 */
743 uint64 inst0, inst1, loop0, loop1, intr0 = 0, intr1 = 0;
744 int ticked = 0;
745
Michael W. Hudson75eabd22005-01-18 15:56:11 +0000746 READ_TIMESTAMP(inst0);
747 READ_TIMESTAMP(inst1);
748 READ_TIMESTAMP(loop0);
749 READ_TIMESTAMP(loop1);
Michael W. Hudson800ba232004-08-12 18:19:17 +0000750
751 /* shut up the compiler */
752 opcode = 0;
Martin v. Löwisf30d60e2004-06-08 08:17:44 +0000753#endif
754
Guido van Rossum374a9221991-04-04 10:40:29 +0000755/* Code access macros */
756
Martin v. Löwis18e16552006-02-15 17:27:45 +0000757#define INSTR_OFFSET() ((int)(next_instr - first_instr))
Guido van Rossum374a9221991-04-04 10:40:29 +0000758#define NEXTOP() (*next_instr++)
Raymond Hettinger5bed4562004-04-10 23:34:17 +0000759#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Raymond Hettinger52a21b82004-08-06 18:43:09 +0000760#define PEEKARG() ((next_instr[2]<<8) + next_instr[1])
Guido van Rossumd076c731998-10-07 19:42:25 +0000761#define JUMPTO(x) (next_instr = first_instr + (x))
Guido van Rossum374a9221991-04-04 10:40:29 +0000762#define JUMPBY(x) (next_instr += (x))
763
Raymond Hettingerf606f872003-03-16 03:11:04 +0000764/* OpCode prediction macros
Thomas Wouterse2176022007-09-20 17:35:10 +0000765 Some opcodes tend to come in pairs thus making it possible to
766 predict the second code when the first is run. For example,
Jeffrey Yasskin68d68522009-02-28 19:03:21 +0000767 GET_ITER is often followed by FOR_ITER. And FOR_ITER is often
768 followed by STORE_FAST or UNPACK_SEQUENCE.
Raymond Hettingerf606f872003-03-16 03:11:04 +0000769
Raymond Hettingerafae11e2008-07-05 02:11:55 +0000770 Verifying the prediction costs a single high-speed test of a register
Raymond Hettingerac2072922003-03-16 15:41:11 +0000771 variable against a constant. If the pairing was good, then the
Raymond Hettingerafae11e2008-07-05 02:11:55 +0000772 processor's own internal branch predication has a high likelihood of
773 success, resulting in a nearly zero-overhead transition to the
774 next opcode. A successful prediction saves a trip through the eval-loop
Antoine Pitrouc2cc80c2008-07-25 22:13:52 +0000775 including its two unpredictable branches, the HAS_ARG test and the
Raymond Hettingerafae11e2008-07-05 02:11:55 +0000776 switch-case. Combined with the processor's internal branch prediction,
Antoine Pitrouc2cc80c2008-07-25 22:13:52 +0000777 a successful PREDICT has the effect of making the two opcodes run as if
Raymond Hettingerafae11e2008-07-05 02:11:55 +0000778 they were a single new opcode with the bodies combined.
Raymond Hettingerf606f872003-03-16 03:11:04 +0000779
Raymond Hettingerafae11e2008-07-05 02:11:55 +0000780 If collecting opcode statistics, your choices are to either keep the
781 predictions turned-on and interpret the results as if some opcodes
782 had been combined or turn-off predictions so that the opcode frequency
783 counter updates for both opcodes.
Raymond Hettingerf606f872003-03-16 03:11:04 +0000784*/
785
Raymond Hettingera7216982004-02-08 19:59:27 +0000786#ifdef DYNAMIC_EXECUTION_PROFILE
787#define PREDICT(op) if (0) goto PRED_##op
788#else
Raymond Hettingerac2072922003-03-16 15:41:11 +0000789#define PREDICT(op) if (*next_instr == op) goto PRED_##op
Raymond Hettingera7216982004-02-08 19:59:27 +0000790#endif
791
Raymond Hettingerf606f872003-03-16 03:11:04 +0000792#define PREDICTED(op) PRED_##op: next_instr++
Raymond Hettinger52a21b82004-08-06 18:43:09 +0000793#define PREDICTED_WITH_ARG(op) PRED_##op: oparg = PEEKARG(); next_instr += 3
Raymond Hettingerf606f872003-03-16 03:11:04 +0000794
Guido van Rossum374a9221991-04-04 10:40:29 +0000795/* Stack manipulation macros */
796
Martin v. Löwis18e16552006-02-15 17:27:45 +0000797/* The stack can grow at most MAXINT deep, as co_nlocals and
798 co_stacksize are ints. */
799#define STACK_LEVEL() ((int)(stack_pointer - f->f_valuestack))
Guido van Rossum374a9221991-04-04 10:40:29 +0000800#define EMPTY() (STACK_LEVEL() == 0)
801#define TOP() (stack_pointer[-1])
Raymond Hettinger663004b2003-01-09 15:24:30 +0000802#define SECOND() (stack_pointer[-2])
803#define THIRD() (stack_pointer[-3])
804#define FOURTH() (stack_pointer[-4])
Raymond Hettinger663004b2003-01-09 15:24:30 +0000805#define SET_TOP(v) (stack_pointer[-1] = (v))
806#define SET_SECOND(v) (stack_pointer[-2] = (v))
807#define SET_THIRD(v) (stack_pointer[-3] = (v))
808#define SET_FOURTH(v) (stack_pointer[-4] = (v))
Raymond Hettinger663004b2003-01-09 15:24:30 +0000809#define BASIC_STACKADJ(n) (stack_pointer += n)
Guido van Rossum374a9221991-04-04 10:40:29 +0000810#define BASIC_PUSH(v) (*stack_pointer++ = (v))
811#define BASIC_POP() (*--stack_pointer)
812
Guido van Rossum96a42c81992-01-12 02:29:51 +0000813#ifdef LLTRACE
Jeremy Hylton14368152001-10-17 13:29:30 +0000814#define PUSH(v) { (void)(BASIC_PUSH(v), \
815 lltrace && prtrace(TOP(), "push")); \
Richard Jonescebbefc2006-05-23 18:28:17 +0000816 assert(STACK_LEVEL() <= co->co_stacksize); }
Thomas Wouterse2176022007-09-20 17:35:10 +0000817#define POP() ((void)(lltrace && prtrace(TOP(), "pop")), \
818 BASIC_POP())
Raymond Hettinger663004b2003-01-09 15:24:30 +0000819#define STACKADJ(n) { (void)(BASIC_STACKADJ(n), \
820 lltrace && prtrace(TOP(), "stackadj")); \
Richard Jonescebbefc2006-05-23 18:28:17 +0000821 assert(STACK_LEVEL() <= co->co_stacksize); }
Christian Heimes52729ac2007-12-14 02:33:57 +0000822#define EXT_POP(STACK_POINTER) ((void)(lltrace && \
823 prtrace((STACK_POINTER)[-1], "ext_pop")), \
824 *--(STACK_POINTER))
Guido van Rossum374a9221991-04-04 10:40:29 +0000825#else
826#define PUSH(v) BASIC_PUSH(v)
827#define POP() BASIC_POP()
Raymond Hettinger663004b2003-01-09 15:24:30 +0000828#define STACKADJ(n) BASIC_STACKADJ(n)
Guido van Rossumc2e20742006-02-27 22:32:47 +0000829#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
Guido van Rossum374a9221991-04-04 10:40:29 +0000830#endif
831
Guido van Rossum681d79a1995-07-18 14:51:37 +0000832/* Local variable macros */
833
834#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumcfbf1a32002-03-28 20:17:52 +0000835
836/* The SETLOCAL() macro must not DECREF the local variable in-place and
837 then store the new value; it must copy the old value to a temporary
838 value, then store the new value, and then DECREF the temporary value.
839 This is because it is possible that during the DECREF the frame is
840 accessed by other code (e.g. a __del__ method or gc.collect()) and the
841 variable would be pointing to already-freed memory. */
842#define SETLOCAL(i, value) do { PyObject *tmp = GETLOCAL(i); \
843 GETLOCAL(i) = value; \
844 Py_XDECREF(tmp); } while (0)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000845
Guido van Rossuma027efa1997-05-05 20:56:21 +0000846/* Start of code */
847
Tim Peters5ca576e2001-06-18 22:08:13 +0000848 if (f == NULL)
849 return NULL;
850
Armin Rigo1d313ab2003-10-25 14:33:09 +0000851 /* push frame */
Armin Rigo2b3eb402003-10-28 12:05:48 +0000852 if (Py_EnterRecursiveCall(""))
Armin Rigo1d313ab2003-10-25 14:33:09 +0000853 return NULL;
Guido van Rossum8861b741996-07-30 16:49:37 +0000854
Tim Peters5ca576e2001-06-18 22:08:13 +0000855 tstate->frame = f;
Tim Peters5ca576e2001-06-18 22:08:13 +0000856
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000857 if (tstate->use_tracing) {
858 if (tstate->c_tracefunc != NULL) {
859 /* tstate->c_tracefunc, if defined, is a
860 function that will be called on *every* entry
861 to a code block. Its return value, if not
862 None, is a function that will be called at
863 the start of each executed line of code.
864 (Actually, the function must return itself
865 in order to continue tracing.) The trace
866 functions are called with three arguments:
867 a pointer to the current frame, a string
868 indicating why the function is called, and
869 an argument which depends on the situation.
870 The global trace function is also called
871 whenever an exception is detected. */
Antoine Pitrouc2cc80c2008-07-25 22:13:52 +0000872 if (call_trace_protected(tstate->c_tracefunc,
Amaury Forgeot d'Arc0d75f092007-11-13 21:54:28 +0000873 tstate->c_traceobj,
874 f, PyTrace_CALL, Py_None)) {
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000875 /* Trace function raised an error */
Armin Rigo2b3eb402003-10-28 12:05:48 +0000876 goto exit_eval_frame;
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000877 }
878 }
879 if (tstate->c_profilefunc != NULL) {
880 /* Similar for c_profilefunc, except it needn't
881 return itself and isn't called for "line" events */
Amaury Forgeot d'Arc0d75f092007-11-13 21:54:28 +0000882 if (call_trace_protected(tstate->c_profilefunc,
883 tstate->c_profileobj,
884 f, PyTrace_CALL, Py_None)) {
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000885 /* Profile function raised an error */
Armin Rigo2b3eb402003-10-28 12:05:48 +0000886 goto exit_eval_frame;
Neil Schemenauer6c0f2002001-09-04 19:03:35 +0000887 }
888 }
889 }
890
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000891 co = f->f_code;
892 names = co->co_names;
893 consts = co->co_consts;
894 fastlocals = f->f_localsplus;
Richard Jonescebbefc2006-05-23 18:28:17 +0000895 freevars = f->f_localsplus + co->co_nlocals;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000896 first_instr = (unsigned char*) PyString_AS_STRING(co->co_code);
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000897 /* An explanation is in order for the next line.
898
899 f->f_lasti now refers to the index of the last instruction
900 executed. You might think this was obvious from the name, but
901 this wasn't always true before 2.3! PyFrame_New now sets
902 f->f_lasti to -1 (i.e. the index *before* the first instruction)
903 and YIELD_VALUE doesn't fiddle with f_lasti any more. So this
Antoine Pitrouc2cc80c2008-07-25 22:13:52 +0000904 does work. Promise.
Raymond Hettinger4bd97d42007-01-06 01:14:41 +0000905
906 When the PREDICT() macros are enabled, some opcode pairs follow in
Antoine Pitrouc2cc80c2008-07-25 22:13:52 +0000907 direct succession without updating f->f_lasti. A successful
Raymond Hettinger4bd97d42007-01-06 01:14:41 +0000908 prediction effectively links the two codes together as if they
909 were a single new opcode; accordingly,f->f_lasti will point to
910 the first code in the pair (for instance, GET_ITER followed by
911 FOR_ITER is effectively a single opcode and f->f_lasti will point
912 at to the beginning of the combined pair.)
913 */
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000914 next_instr = first_instr + f->f_lasti + 1;
915 stack_pointer = f->f_stacktop;
916 assert(stack_pointer != NULL);
917 f->f_stacktop = NULL; /* remains NULL unless yield suspends frame */
918
Tim Peters5ca576e2001-06-18 22:08:13 +0000919#ifdef LLTRACE
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000920 lltrace = PyDict_GetItemString(f->f_globals, "__lltrace__") != NULL;
Tim Peters5ca576e2001-06-18 22:08:13 +0000921#endif
Neal Norwitz5f5153e2005-10-21 04:28:38 +0000922#if defined(Py_DEBUG) || defined(LLTRACE)
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000923 filename = PyString_AsString(co->co_filename);
Tim Peters5ca576e2001-06-18 22:08:13 +0000924#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000925
Guido van Rossum374a9221991-04-04 10:40:29 +0000926 why = WHY_NOT;
927 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000928 x = Py_None; /* Not a reference, just anything non-NULL */
Fred Drake48fba732000-10-11 13:54:07 +0000929 w = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +0000930
Anthony Baxtera863d332006-04-11 07:43:46 +0000931 if (throwflag) { /* support for generator.throw() */
Phillip J. Eby0d6615f2005-08-02 00:46:46 +0000932 why = WHY_EXCEPTION;
933 goto on_error;
934 }
Tim Peters7df5e7f2006-05-26 23:14:37 +0000935
Guido van Rossum374a9221991-04-04 10:40:29 +0000936 for (;;) {
Martin v. Löwisf30d60e2004-06-08 08:17:44 +0000937#ifdef WITH_TSC
938 if (inst1 == 0) {
939 /* Almost surely, the opcode executed a break
940 or a continue, preventing inst1 from being set
941 on the way out of the loop.
942 */
Michael W. Hudson75eabd22005-01-18 15:56:11 +0000943 READ_TIMESTAMP(inst1);
Martin v. Löwisf30d60e2004-06-08 08:17:44 +0000944 loop1 = inst1;
945 }
946 dump_tsc(opcode, ticked, inst0, inst1, loop0, loop1,
947 intr0, intr1);
948 ticked = 0;
949 inst1 = 0;
950 intr0 = 0;
951 intr1 = 0;
Michael W. Hudson75eabd22005-01-18 15:56:11 +0000952 READ_TIMESTAMP(loop0);
Martin v. Löwisf30d60e2004-06-08 08:17:44 +0000953#endif
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000954 assert(stack_pointer >= f->f_valuestack); /* else underflow */
Richard Jonescebbefc2006-05-23 18:28:17 +0000955 assert(STACK_LEVEL() <= co->co_stacksize); /* else overflow */
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000956
Guido van Rossuma027efa1997-05-05 20:56:21 +0000957 /* Do periodic things. Doing this every time through
958 the loop would add too much overhead, so we do it
959 only every Nth instruction. We also do it if
Kristján Valur Jónsson0e919382009-01-09 20:31:26 +0000960 ``pendingcalls_to_do'' is set, i.e. when an asynchronous
Guido van Rossuma027efa1997-05-05 20:56:21 +0000961 event needs attention (e.g. a signal handler or
962 async I/O handler); see Py_AddPendingCall() and
963 Py_MakePendingCalls() above. */
Guido van Rossumac7be682001-01-17 15:42:30 +0000964
Skip Montanarod581d772002-09-03 20:10:45 +0000965 if (--_Py_Ticker < 0) {
Thomas Woutersae406c62007-09-19 17:27:43 +0000966 if (*next_instr == SETUP_FINALLY) {
967 /* Make the last opcode before
968 a try: finally: block uninterruptable. */
969 goto fast_next_opcode;
970 }
Skip Montanarod581d772002-09-03 20:10:45 +0000971 _Py_Ticker = _Py_CheckInterval;
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000972 tstate->tick_counter++;
Martin v. Löwisf30d60e2004-06-08 08:17:44 +0000973#ifdef WITH_TSC
974 ticked = 1;
975#endif
Kristján Valur Jónsson0e919382009-01-09 20:31:26 +0000976 if (pendingcalls_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000977 if (Py_MakePendingCalls() < 0) {
978 why = WHY_EXCEPTION;
979 goto on_error;
980 }
Kristján Valur Jónsson0e919382009-01-09 20:31:26 +0000981 if (pendingcalls_to_do)
Kurt B. Kaiser4c79a832004-11-23 18:06:08 +0000982 /* MakePendingCalls() didn't succeed.
983 Force early re-execution of this
984 "periodic" code, possibly after
985 a thread switch */
986 _Py_Ticker = 0;
Guido van Rossum8861b741996-07-30 16:49:37 +0000987 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000988#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000989 if (interpreter_lock) {
990 /* Give another thread a chance */
991
Guido van Rossum25ce5661997-08-02 03:10:38 +0000992 if (PyThreadState_Swap(NULL) != tstate)
993 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000994 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000995
996 /* Other threads may run now */
997
Guido van Rossum65d5b571998-12-21 19:32:43 +0000998 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000999 if (PyThreadState_Swap(tstate) != NULL)
1000 Py_FatalError("ceval: orphan tstate");
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +00001001
1002 /* Check for thread interrupts */
1003
1004 if (tstate->async_exc != NULL) {
1005 x = tstate->async_exc;
1006 tstate->async_exc = NULL;
1007 PyErr_SetNone(x);
1008 Py_DECREF(x);
1009 why = WHY_EXCEPTION;
1010 goto on_error;
1011 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001012 }
1013#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001014 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001015
Neil Schemenauer63543862002-02-17 19:10:14 +00001016 fast_next_opcode:
Guido van Rossum99bec951992-09-03 20:29:45 +00001017 f->f_lasti = INSTR_OFFSET();
Guido van Rossumac7be682001-01-17 15:42:30 +00001018
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001019 /* line-by-line tracing support */
1020
Jeffrey Yasskinfd8a1ec2008-12-03 06:46:45 +00001021 if (_Py_TracingPossible &&
1022 tstate->c_tracefunc != NULL && !tstate->tracing) {
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001023 /* see maybe_call_line_trace
1024 for expository comments */
1025 f->f_stacktop = stack_pointer;
Tim Peters8a5c3c72004-04-05 19:36:21 +00001026
Michael W. Hudson58ee2af2003-04-29 16:18:47 +00001027 err = maybe_call_line_trace(tstate->c_tracefunc,
1028 tstate->c_traceobj,
Armin Rigobf57a142004-03-22 19:24:58 +00001029 f, &instr_lb, &instr_ub,
1030 &instr_prev);
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001031 /* Reload possibly changed frame fields */
1032 JUMPTO(f->f_lasti);
Michael W. Hudson58ee2af2003-04-29 16:18:47 +00001033 if (f->f_stacktop != NULL) {
1034 stack_pointer = f->f_stacktop;
1035 f->f_stacktop = NULL;
1036 }
1037 if (err) {
1038 /* trace function raised an exception */
1039 goto on_error;
1040 }
Michael W. Hudson019a78e2002-11-08 12:53:11 +00001041 }
1042
1043 /* Extract opcode and argument */
1044
Guido van Rossum374a9221991-04-04 10:40:29 +00001045 opcode = NEXTOP();
Armin Rigo8817fcd2004-06-17 10:22:40 +00001046 oparg = 0; /* allows oparg to be stored in a register because
1047 it doesn't have to be remembered across a full loop */
Raymond Hettinger5bed4562004-04-10 23:34:17 +00001048 if (HAS_ARG(opcode))
1049 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +00001050 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +00001051#ifdef DYNAMIC_EXECUTION_PROFILE
1052#ifdef DXPAIRS
1053 dxpairs[lastopcode][opcode]++;
1054 lastopcode = opcode;
1055#endif
1056 dxp[opcode]++;
1057#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001058
Guido van Rossum96a42c81992-01-12 02:29:51 +00001059#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +00001060 /* Instruction tracing */
Guido van Rossumac7be682001-01-17 15:42:30 +00001061
Guido van Rossum96a42c81992-01-12 02:29:51 +00001062 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001063 if (HAS_ARG(opcode)) {
1064 printf("%d: %d, %d\n",
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001065 f->f_lasti, opcode, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001066 }
1067 else {
1068 printf("%d: %d\n",
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001069 f->f_lasti, opcode);
Guido van Rossum374a9221991-04-04 10:40:29 +00001070 }
1071 }
1072#endif
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001073
Guido van Rossum374a9221991-04-04 10:40:29 +00001074 /* Main switch on opcode */
Michael W. Hudson75eabd22005-01-18 15:56:11 +00001075 READ_TIMESTAMP(inst0);
Jeremy Hylton52820442001-01-03 23:52:36 +00001076
Guido van Rossum374a9221991-04-04 10:40:29 +00001077 switch (opcode) {
Guido van Rossumac7be682001-01-17 15:42:30 +00001078
Guido van Rossum374a9221991-04-04 10:40:29 +00001079 /* BEWARE!
1080 It is essential that any operation that fails sets either
1081 x to NULL, err to nonzero, or why to anything but WHY_NOT,
1082 and that no operation that succeeds does this! */
Guido van Rossumac7be682001-01-17 15:42:30 +00001083
Guido van Rossum374a9221991-04-04 10:40:29 +00001084 /* case STOP_CODE: this is an error! */
Guido van Rossumac7be682001-01-17 15:42:30 +00001085
Raymond Hettinger9c18e812004-06-21 16:31:15 +00001086 case NOP:
1087 goto fast_next_opcode;
1088
Neil Schemenauer63543862002-02-17 19:10:14 +00001089 case LOAD_FAST:
1090 x = GETLOCAL(oparg);
1091 if (x != NULL) {
1092 Py_INCREF(x);
1093 PUSH(x);
1094 goto fast_next_opcode;
1095 }
1096 format_exc_check_arg(PyExc_UnboundLocalError,
1097 UNBOUNDLOCAL_ERROR_MSG,
1098 PyTuple_GetItem(co->co_varnames, oparg));
1099 break;
1100
1101 case LOAD_CONST:
Skip Montanaro04d80f82002-08-04 21:03:35 +00001102 x = GETITEM(consts, oparg);
Neil Schemenauer63543862002-02-17 19:10:14 +00001103 Py_INCREF(x);
1104 PUSH(x);
1105 goto fast_next_opcode;
1106
Raymond Hettinger7dc52212003-03-16 20:14:44 +00001107 PREDICTED_WITH_ARG(STORE_FAST);
Neil Schemenauer63543862002-02-17 19:10:14 +00001108 case STORE_FAST:
1109 v = POP();
1110 SETLOCAL(oparg, v);
1111 goto fast_next_opcode;
1112
Guido van Rossum374a9221991-04-04 10:40:29 +00001113 case POP_TOP:
1114 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001115 Py_DECREF(v);
Neil Schemenauer63543862002-02-17 19:10:14 +00001116 goto fast_next_opcode;
Guido van Rossumac7be682001-01-17 15:42:30 +00001117
Guido van Rossum374a9221991-04-04 10:40:29 +00001118 case ROT_TWO:
Raymond Hettinger663004b2003-01-09 15:24:30 +00001119 v = TOP();
1120 w = SECOND();
1121 SET_TOP(w);
1122 SET_SECOND(v);
Raymond Hettinger080cb322003-03-14 01:37:42 +00001123 goto fast_next_opcode;
Guido van Rossumac7be682001-01-17 15:42:30 +00001124
Guido van Rossum374a9221991-04-04 10:40:29 +00001125 case ROT_THREE:
Raymond Hettinger663004b2003-01-09 15:24:30 +00001126 v = TOP();
1127 w = SECOND();
1128 x = THIRD();
1129 SET_TOP(w);
1130 SET_SECOND(x);
1131 SET_THIRD(v);
Raymond Hettinger080cb322003-03-14 01:37:42 +00001132 goto fast_next_opcode;
Guido van Rossumac7be682001-01-17 15:42:30 +00001133
Thomas Wouters434d0822000-08-24 20:11:32 +00001134 case ROT_FOUR:
Raymond Hettinger663004b2003-01-09 15:24:30 +00001135 u = TOP();
1136 v = SECOND();
1137 w = THIRD();
1138 x = FOURTH();
1139 SET_TOP(v);
1140 SET_SECOND(w);
1141 SET_THIRD(x);
1142 SET_FOURTH(u);
Raymond Hettinger080cb322003-03-14 01:37:42 +00001143 goto fast_next_opcode;
Guido van Rossumac7be682001-01-17 15:42:30 +00001144
Guido van Rossum374a9221991-04-04 10:40:29 +00001145 case DUP_TOP:
1146 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001147 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001148 PUSH(v);
Raymond Hettinger080cb322003-03-14 01:37:42 +00001149 goto fast_next_opcode;
Guido van Rossumac7be682001-01-17 15:42:30 +00001150
Thomas Wouters434d0822000-08-24 20:11:32 +00001151 case DUP_TOPX:
Raymond Hettinger4bad9ba2003-01-19 05:08:13 +00001152 if (oparg == 2) {
Raymond Hettinger663004b2003-01-09 15:24:30 +00001153 x = TOP();
Tim Peters35ba6892000-10-11 07:04:49 +00001154 Py_INCREF(x);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001155 w = SECOND();
Tim Peters35ba6892000-10-11 07:04:49 +00001156 Py_INCREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001157 STACKADJ(2);
1158 SET_TOP(x);
1159 SET_SECOND(w);
Raymond Hettingerf606f872003-03-16 03:11:04 +00001160 goto fast_next_opcode;
Raymond Hettinger4bad9ba2003-01-19 05:08:13 +00001161 } else if (oparg == 3) {
Raymond Hettinger663004b2003-01-09 15:24:30 +00001162 x = TOP();
Tim Peters35ba6892000-10-11 07:04:49 +00001163 Py_INCREF(x);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001164 w = SECOND();
Tim Peters35ba6892000-10-11 07:04:49 +00001165 Py_INCREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001166 v = THIRD();
Tim Peters35ba6892000-10-11 07:04:49 +00001167 Py_INCREF(v);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001168 STACKADJ(3);
1169 SET_TOP(x);
1170 SET_SECOND(w);
1171 SET_THIRD(v);
Raymond Hettingerf606f872003-03-16 03:11:04 +00001172 goto fast_next_opcode;
Thomas Wouters434d0822000-08-24 20:11:32 +00001173 }
Raymond Hettinger4bad9ba2003-01-19 05:08:13 +00001174 Py_FatalError("invalid argument to DUP_TOPX"
1175 " (bytecode corruption?)");
Jeffrey Yasskin2d873bd2008-12-08 18:55:24 +00001176 /* Never returns, so don't bother to set why. */
Tim Peters35ba6892000-10-11 07:04:49 +00001177 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00001178
Guido van Rossum374a9221991-04-04 10:40:29 +00001179 case UNARY_POSITIVE:
Raymond Hettinger663004b2003-01-09 15:24:30 +00001180 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001181 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001182 Py_DECREF(v);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001183 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001184 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001185 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001186
Guido van Rossum374a9221991-04-04 10:40:29 +00001187 case UNARY_NEGATIVE:
Raymond Hettinger663004b2003-01-09 15:24:30 +00001188 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001189 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001190 Py_DECREF(v);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001191 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001192 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001193 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001194
Guido van Rossum374a9221991-04-04 10:40:29 +00001195 case UNARY_NOT:
Raymond Hettinger663004b2003-01-09 15:24:30 +00001196 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001197 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001198 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +00001199 if (err == 0) {
1200 Py_INCREF(Py_True);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001201 SET_TOP(Py_True);
Guido van Rossumfc490731997-05-06 15:06:49 +00001202 continue;
1203 }
1204 else if (err > 0) {
1205 Py_INCREF(Py_False);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001206 SET_TOP(Py_False);
Guido van Rossumfc490731997-05-06 15:06:49 +00001207 err = 0;
1208 continue;
1209 }
Raymond Hettinger8bb90a52003-01-14 12:43:10 +00001210 STACKADJ(-1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001211 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001212
Guido van Rossum374a9221991-04-04 10:40:29 +00001213 case UNARY_CONVERT:
Raymond Hettinger663004b2003-01-09 15:24:30 +00001214 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001215 x = PyObject_Repr(v);
1216 Py_DECREF(v);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001217 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001218 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001219 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001220
Guido van Rossum7928cd71991-10-24 14:59:31 +00001221 case UNARY_INVERT:
Raymond Hettinger663004b2003-01-09 15:24:30 +00001222 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001223 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001224 Py_DECREF(v);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001225 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001226 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001227 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001228
Guido van Rossum50564e81996-01-12 01:13:16 +00001229 case BINARY_POWER:
1230 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001231 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001232 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +00001233 Py_DECREF(v);
1234 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001235 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001236 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +00001237 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001238
Guido van Rossum374a9221991-04-04 10:40:29 +00001239 case BINARY_MULTIPLY:
1240 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001241 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001242 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001243 Py_DECREF(v);
1244 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001245 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001246 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001247 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001248
Guido van Rossum374a9221991-04-04 10:40:29 +00001249 case BINARY_DIVIDE:
Tim Peters3caca232001-12-06 06:23:26 +00001250 if (!_Py_QnewFlag) {
1251 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001252 v = TOP();
Tim Peters3caca232001-12-06 06:23:26 +00001253 x = PyNumber_Divide(v, w);
1254 Py_DECREF(v);
1255 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001256 SET_TOP(x);
Tim Peters3caca232001-12-06 06:23:26 +00001257 if (x != NULL) continue;
1258 break;
1259 }
Raymond Hettinger663004b2003-01-09 15:24:30 +00001260 /* -Qnew is in effect: fall through to
Tim Peters3caca232001-12-06 06:23:26 +00001261 BINARY_TRUE_DIVIDE */
1262 case BINARY_TRUE_DIVIDE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001263 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001264 v = TOP();
Tim Peters3caca232001-12-06 06:23:26 +00001265 x = PyNumber_TrueDivide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001266 Py_DECREF(v);
1267 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001268 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001269 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001270 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001271
Guido van Rossum4668b002001-08-08 05:00:18 +00001272 case BINARY_FLOOR_DIVIDE:
1273 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001274 v = TOP();
Guido van Rossum4668b002001-08-08 05:00:18 +00001275 x = PyNumber_FloorDivide(v, w);
1276 Py_DECREF(v);
1277 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001278 SET_TOP(x);
Guido van Rossum4668b002001-08-08 05:00:18 +00001279 if (x != NULL) continue;
1280 break;
1281
Guido van Rossum374a9221991-04-04 10:40:29 +00001282 case BINARY_MODULO:
1283 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001284 v = TOP();
Collin Winter8725dce2009-02-20 19:30:41 +00001285 if (PyString_CheckExact(v))
1286 x = PyString_Format(v, w);
1287 else
1288 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001289 Py_DECREF(v);
1290 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001291 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001292 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001293 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001294
Guido van Rossum374a9221991-04-04 10:40:29 +00001295 case BINARY_ADD:
1296 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001297 v = TOP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001298 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001299 /* INLINE: int + int */
1300 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001301 a = PyInt_AS_LONG(v);
1302 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001303 i = a + b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001304 if ((i^a) < 0 && (i^b) < 0)
1305 goto slow_add;
1306 x = PyInt_FromLong(i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001307 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001308 else if (PyString_CheckExact(v) &&
1309 PyString_CheckExact(w)) {
Raymond Hettinger52a21b82004-08-06 18:43:09 +00001310 x = string_concatenate(v, w, f, next_instr);
1311 /* string_concatenate consumed the ref to v */
1312 goto skip_decref_vx;
1313 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001314 else {
1315 slow_add:
Guido van Rossumc12da691997-07-17 23:12:42 +00001316 x = PyNumber_Add(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001317 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001318 Py_DECREF(v);
Raymond Hettinger52a21b82004-08-06 18:43:09 +00001319 skip_decref_vx:
Guido van Rossumb209a111997-04-29 18:18:01 +00001320 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001321 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001322 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001323 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001324
Guido van Rossum374a9221991-04-04 10:40:29 +00001325 case BINARY_SUBTRACT:
1326 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001327 v = TOP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001328 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001329 /* INLINE: int - int */
1330 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001331 a = PyInt_AS_LONG(v);
1332 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001333 i = a - b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001334 if ((i^a) < 0 && (i^~b) < 0)
1335 goto slow_sub;
1336 x = PyInt_FromLong(i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001337 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001338 else {
1339 slow_sub:
Guido van Rossumc12da691997-07-17 23:12:42 +00001340 x = PyNumber_Subtract(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001341 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001342 Py_DECREF(v);
1343 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001344 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001345 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001346 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001347
Guido van Rossum374a9221991-04-04 10:40:29 +00001348 case BINARY_SUBSCR:
1349 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001350 v = TOP();
Tim Petersb1c46982001-10-05 20:41:38 +00001351 if (PyList_CheckExact(v) && PyInt_CheckExact(w)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001352 /* INLINE: list[int] */
Neal Norwitz814e9382006-03-02 07:54:28 +00001353 Py_ssize_t i = PyInt_AsSsize_t(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001354 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +00001355 i += PyList_GET_SIZE(v);
Raymond Hettinger467a6982004-04-07 11:39:21 +00001356 if (i >= 0 && i < PyList_GET_SIZE(v)) {
Guido van Rossumfa00e951998-07-08 15:02:37 +00001357 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001358 Py_INCREF(x);
1359 }
Raymond Hettinger467a6982004-04-07 11:39:21 +00001360 else
1361 goto slow_get;
Guido van Rossumc12da691997-07-17 23:12:42 +00001362 }
1363 else
Raymond Hettinger467a6982004-04-07 11:39:21 +00001364 slow_get:
Guido van Rossumc12da691997-07-17 23:12:42 +00001365 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001366 Py_DECREF(v);
1367 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001368 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001369 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001370 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001371
Guido van Rossum7928cd71991-10-24 14:59:31 +00001372 case BINARY_LSHIFT:
1373 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001374 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001375 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001376 Py_DECREF(v);
1377 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001378 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001379 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001380 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001381
Guido van Rossum7928cd71991-10-24 14:59:31 +00001382 case BINARY_RSHIFT:
1383 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001384 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001385 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001386 Py_DECREF(v);
1387 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001388 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001389 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001390 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001391
Guido van Rossum7928cd71991-10-24 14:59:31 +00001392 case BINARY_AND:
1393 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001394 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001395 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001396 Py_DECREF(v);
1397 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001398 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001399 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001400 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001401
Guido van Rossum7928cd71991-10-24 14:59:31 +00001402 case BINARY_XOR:
1403 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001404 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001405 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001406 Py_DECREF(v);
1407 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001408 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001409 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001410 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001411
Guido van Rossum7928cd71991-10-24 14:59:31 +00001412 case BINARY_OR:
1413 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001414 v = TOP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001415 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001416 Py_DECREF(v);
1417 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001418 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001419 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001420 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00001421
Raymond Hettingerdd80f762004-03-07 07:31:06 +00001422 case LIST_APPEND:
1423 w = POP();
Antoine Pitroud0c35152008-12-17 00:38:28 +00001424 v = stack_pointer[-oparg];
Raymond Hettingerdd80f762004-03-07 07:31:06 +00001425 err = PyList_Append(v, w);
Raymond Hettingerdd80f762004-03-07 07:31:06 +00001426 Py_DECREF(w);
Raymond Hettingerfba1cfc2004-03-12 16:33:17 +00001427 if (err == 0) {
1428 PREDICT(JUMP_ABSOLUTE);
1429 continue;
1430 }
Raymond Hettingerdd80f762004-03-07 07:31:06 +00001431 break;
1432
Thomas Wouters434d0822000-08-24 20:11:32 +00001433 case INPLACE_POWER:
1434 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001435 v = TOP();
Thomas Wouters434d0822000-08-24 20:11:32 +00001436 x = PyNumber_InPlacePower(v, w, Py_None);
1437 Py_DECREF(v);
1438 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001439 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001440 if (x != NULL) continue;
1441 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001442
Thomas Wouters434d0822000-08-24 20:11:32 +00001443 case INPLACE_MULTIPLY:
1444 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001445 v = TOP();
Thomas Wouters434d0822000-08-24 20:11:32 +00001446 x = PyNumber_InPlaceMultiply(v, w);
1447 Py_DECREF(v);
1448 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001449 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001450 if (x != NULL) continue;
1451 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001452
Thomas Wouters434d0822000-08-24 20:11:32 +00001453 case INPLACE_DIVIDE:
Tim Peters54b11912001-12-25 18:49:11 +00001454 if (!_Py_QnewFlag) {
1455 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001456 v = TOP();
Tim Peters54b11912001-12-25 18:49:11 +00001457 x = PyNumber_InPlaceDivide(v, w);
1458 Py_DECREF(v);
1459 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001460 SET_TOP(x);
Tim Peters54b11912001-12-25 18:49:11 +00001461 if (x != NULL) continue;
1462 break;
1463 }
Raymond Hettinger663004b2003-01-09 15:24:30 +00001464 /* -Qnew is in effect: fall through to
Tim Peters54b11912001-12-25 18:49:11 +00001465 INPLACE_TRUE_DIVIDE */
1466 case INPLACE_TRUE_DIVIDE:
Thomas Wouters434d0822000-08-24 20:11:32 +00001467 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001468 v = TOP();
Tim Peters54b11912001-12-25 18:49:11 +00001469 x = PyNumber_InPlaceTrueDivide(v, w);
Thomas Wouters434d0822000-08-24 20:11:32 +00001470 Py_DECREF(v);
1471 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001472 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001473 if (x != NULL) continue;
1474 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001475
Guido van Rossum4668b002001-08-08 05:00:18 +00001476 case INPLACE_FLOOR_DIVIDE:
1477 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001478 v = TOP();
Guido van Rossum4668b002001-08-08 05:00:18 +00001479 x = PyNumber_InPlaceFloorDivide(v, w);
1480 Py_DECREF(v);
1481 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001482 SET_TOP(x);
Guido van Rossum4668b002001-08-08 05:00:18 +00001483 if (x != NULL) continue;
1484 break;
1485
Thomas Wouters434d0822000-08-24 20:11:32 +00001486 case INPLACE_MODULO:
1487 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001488 v = TOP();
Thomas Wouters434d0822000-08-24 20:11:32 +00001489 x = PyNumber_InPlaceRemainder(v, w);
1490 Py_DECREF(v);
1491 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001492 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001493 if (x != NULL) continue;
1494 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001495
Thomas Wouters434d0822000-08-24 20:11:32 +00001496 case INPLACE_ADD:
1497 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001498 v = TOP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001499 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Thomas Wouters434d0822000-08-24 20:11:32 +00001500 /* INLINE: int + int */
1501 register long a, b, i;
1502 a = PyInt_AS_LONG(v);
1503 b = PyInt_AS_LONG(w);
1504 i = a + b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001505 if ((i^a) < 0 && (i^b) < 0)
1506 goto slow_iadd;
1507 x = PyInt_FromLong(i);
Thomas Wouters434d0822000-08-24 20:11:32 +00001508 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001509 else if (PyString_CheckExact(v) &&
1510 PyString_CheckExact(w)) {
Raymond Hettinger52a21b82004-08-06 18:43:09 +00001511 x = string_concatenate(v, w, f, next_instr);
1512 /* string_concatenate consumed the ref to v */
1513 goto skip_decref_v;
1514 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001515 else {
1516 slow_iadd:
Thomas Wouters434d0822000-08-24 20:11:32 +00001517 x = PyNumber_InPlaceAdd(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001518 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001519 Py_DECREF(v);
Raymond Hettinger52a21b82004-08-06 18:43:09 +00001520 skip_decref_v:
Thomas Wouters434d0822000-08-24 20:11:32 +00001521 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001522 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001523 if (x != NULL) continue;
1524 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001525
Thomas Wouters434d0822000-08-24 20:11:32 +00001526 case INPLACE_SUBTRACT:
1527 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001528 v = TOP();
Tim Petersc1e6d962001-10-05 20:21:03 +00001529 if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
Thomas Wouters434d0822000-08-24 20:11:32 +00001530 /* INLINE: int - int */
1531 register long a, b, i;
1532 a = PyInt_AS_LONG(v);
1533 b = PyInt_AS_LONG(w);
1534 i = a - b;
Guido van Rossum87780df2001-08-23 02:58:07 +00001535 if ((i^a) < 0 && (i^~b) < 0)
1536 goto slow_isub;
1537 x = PyInt_FromLong(i);
Thomas Wouters434d0822000-08-24 20:11:32 +00001538 }
Guido van Rossum87780df2001-08-23 02:58:07 +00001539 else {
1540 slow_isub:
Thomas Wouters434d0822000-08-24 20:11:32 +00001541 x = PyNumber_InPlaceSubtract(v, w);
Guido van Rossum87780df2001-08-23 02:58:07 +00001542 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001543 Py_DECREF(v);
1544 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001545 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001546 if (x != NULL) continue;
1547 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001548
Thomas Wouters434d0822000-08-24 20:11:32 +00001549 case INPLACE_LSHIFT:
1550 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001551 v = TOP();
Thomas Wouters434d0822000-08-24 20:11:32 +00001552 x = PyNumber_InPlaceLshift(v, w);
1553 Py_DECREF(v);
1554 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001555 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001556 if (x != NULL) continue;
1557 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001558
Thomas Wouters434d0822000-08-24 20:11:32 +00001559 case INPLACE_RSHIFT:
1560 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001561 v = TOP();
Thomas Wouters434d0822000-08-24 20:11:32 +00001562 x = PyNumber_InPlaceRshift(v, w);
1563 Py_DECREF(v);
1564 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001565 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001566 if (x != NULL) continue;
1567 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001568
Thomas Wouters434d0822000-08-24 20:11:32 +00001569 case INPLACE_AND:
1570 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001571 v = TOP();
Thomas Wouters434d0822000-08-24 20:11:32 +00001572 x = PyNumber_InPlaceAnd(v, w);
1573 Py_DECREF(v);
1574 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001575 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001576 if (x != NULL) continue;
1577 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001578
Thomas Wouters434d0822000-08-24 20:11:32 +00001579 case INPLACE_XOR:
1580 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001581 v = TOP();
Thomas Wouters434d0822000-08-24 20:11:32 +00001582 x = PyNumber_InPlaceXor(v, w);
1583 Py_DECREF(v);
1584 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001585 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001586 if (x != NULL) continue;
1587 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001588
Thomas Wouters434d0822000-08-24 20:11:32 +00001589 case INPLACE_OR:
1590 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00001591 v = TOP();
Thomas Wouters434d0822000-08-24 20:11:32 +00001592 x = PyNumber_InPlaceOr(v, w);
1593 Py_DECREF(v);
1594 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001595 SET_TOP(x);
Thomas Wouters434d0822000-08-24 20:11:32 +00001596 if (x != NULL) continue;
1597 break;
1598
Guido van Rossum374a9221991-04-04 10:40:29 +00001599 case SLICE+0:
1600 case SLICE+1:
1601 case SLICE+2:
1602 case SLICE+3:
1603 if ((opcode-SLICE) & 2)
1604 w = POP();
1605 else
1606 w = NULL;
1607 if ((opcode-SLICE) & 1)
1608 v = POP();
1609 else
1610 v = NULL;
Raymond Hettinger663004b2003-01-09 15:24:30 +00001611 u = TOP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001612 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001613 Py_DECREF(u);
1614 Py_XDECREF(v);
1615 Py_XDECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001616 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001617 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001618 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001619
Guido van Rossum374a9221991-04-04 10:40:29 +00001620 case STORE_SLICE+0:
1621 case STORE_SLICE+1:
1622 case STORE_SLICE+2:
1623 case STORE_SLICE+3:
1624 if ((opcode-STORE_SLICE) & 2)
1625 w = POP();
1626 else
1627 w = NULL;
1628 if ((opcode-STORE_SLICE) & 1)
1629 v = POP();
1630 else
1631 v = NULL;
1632 u = POP();
1633 t = POP();
1634 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +00001635 Py_DECREF(t);
1636 Py_DECREF(u);
1637 Py_XDECREF(v);
1638 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001639 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001640 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001641
Guido van Rossum374a9221991-04-04 10:40:29 +00001642 case DELETE_SLICE+0:
1643 case DELETE_SLICE+1:
1644 case DELETE_SLICE+2:
1645 case DELETE_SLICE+3:
1646 if ((opcode-DELETE_SLICE) & 2)
1647 w = POP();
1648 else
1649 w = NULL;
1650 if ((opcode-DELETE_SLICE) & 1)
1651 v = POP();
1652 else
1653 v = NULL;
1654 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001655 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +00001656 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00001657 Py_DECREF(u);
1658 Py_XDECREF(v);
1659 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001660 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001661 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001662
Guido van Rossum374a9221991-04-04 10:40:29 +00001663 case STORE_SUBSCR:
Raymond Hettinger663004b2003-01-09 15:24:30 +00001664 w = TOP();
1665 v = SECOND();
1666 u = THIRD();
1667 STACKADJ(-3);
Guido van Rossum374a9221991-04-04 10:40:29 +00001668 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +00001669 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001670 Py_DECREF(u);
1671 Py_DECREF(v);
1672 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001673 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001674 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001675
Guido van Rossum374a9221991-04-04 10:40:29 +00001676 case DELETE_SUBSCR:
Raymond Hettinger663004b2003-01-09 15:24:30 +00001677 w = TOP();
1678 v = SECOND();
1679 STACKADJ(-2);
Guido van Rossum374a9221991-04-04 10:40:29 +00001680 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001681 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001682 Py_DECREF(v);
1683 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001684 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001685 break;
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001686
Guido van Rossum374a9221991-04-04 10:40:29 +00001687 case PRINT_EXPR:
1688 v = POP();
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001689 w = PySys_GetObject("displayhook");
1690 if (w == NULL) {
1691 PyErr_SetString(PyExc_RuntimeError,
1692 "lost sys.displayhook");
1693 err = -1;
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001694 x = NULL;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001695 }
1696 if (err == 0) {
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001697 x = PyTuple_Pack(1, v);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001698 if (x == NULL)
1699 err = -1;
1700 }
1701 if (err == 0) {
1702 w = PyEval_CallObject(w, x);
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001703 Py_XDECREF(w);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001704 if (w == NULL)
1705 err = -1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001706 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001707 Py_DECREF(v);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001708 Py_XDECREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001709 break;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001710
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001711 case PRINT_ITEM_TO:
1712 w = stream = POP();
1713 /* fall through to PRINT_ITEM */
1714
Guido van Rossum374a9221991-04-04 10:40:29 +00001715 case PRINT_ITEM:
1716 v = POP();
Barry Warsaw093abe02000-08-29 04:56:13 +00001717 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001718 w = PySys_GetObject("stdout");
1719 if (w == NULL) {
1720 PyErr_SetString(PyExc_RuntimeError,
1721 "lost sys.stdout");
1722 err = -1;
1723 }
Guido van Rossum8f183201997-12-31 05:53:15 +00001724 }
Neal Norwitzc5131bc2003-06-29 14:48:32 +00001725 /* PyFile_SoftSpace() can exececute arbitrary code
1726 if sys.stdout is an instance with a __getattr__.
1727 If __getattr__ raises an exception, w will
1728 be freed, so we need to prevent that temporarily. */
1729 Py_XINCREF(w);
Tim Peters8e5fd532002-03-24 19:25:00 +00001730 if (w != NULL && PyFile_SoftSpace(w, 0))
Guido van Rossumbe270261997-05-22 22:26:18 +00001731 err = PyFile_WriteString(" ", w);
1732 if (err == 0)
1733 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001734 if (err == 0) {
Tim Peters8e5fd532002-03-24 19:25:00 +00001735 /* XXX move into writeobject() ? */
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001736 if (PyString_Check(v)) {
1737 char *s = PyString_AS_STRING(v);
1738 Py_ssize_t len = PyString_GET_SIZE(v);
Tim Peters8e5fd532002-03-24 19:25:00 +00001739 if (len == 0 ||
1740 !isspace(Py_CHARMASK(s[len-1])) ||
1741 s[len-1] == ' ')
1742 PyFile_SoftSpace(w, 1);
Tim Peters8a5c3c72004-04-05 19:36:21 +00001743 }
Martin v. Löwis8d3ce5a2001-12-18 22:36:40 +00001744#ifdef Py_USING_UNICODE
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001745 else if (PyUnicode_Check(v)) {
1746 Py_UNICODE *s = PyUnicode_AS_UNICODE(v);
Martin v. Löwis66851282006-04-22 11:40:03 +00001747 Py_ssize_t len = PyUnicode_GET_SIZE(v);
Tim Peters8e5fd532002-03-24 19:25:00 +00001748 if (len == 0 ||
1749 !Py_UNICODE_ISSPACE(s[len-1]) ||
1750 s[len-1] == ' ')
1751 PyFile_SoftSpace(w, 1);
Marc-André Lemburg0c4d8d02001-11-20 15:17:25 +00001752 }
Michael W. Hudsond95c8282002-05-20 13:56:11 +00001753#endif
Tim Peters8e5fd532002-03-24 19:25:00 +00001754 else
1755 PyFile_SoftSpace(w, 1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001756 }
Neal Norwitzc5131bc2003-06-29 14:48:32 +00001757 Py_XDECREF(w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001758 Py_DECREF(v);
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001759 Py_XDECREF(stream);
1760 stream = NULL;
1761 if (err == 0)
1762 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001763 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001764
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001765 case PRINT_NEWLINE_TO:
1766 w = stream = POP();
1767 /* fall through to PRINT_NEWLINE */
1768
Guido van Rossum374a9221991-04-04 10:40:29 +00001769 case PRINT_NEWLINE:
Barry Warsaw093abe02000-08-29 04:56:13 +00001770 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001771 w = PySys_GetObject("stdout");
Jeffrey Yasskin2d873bd2008-12-08 18:55:24 +00001772 if (w == NULL) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001773 PyErr_SetString(PyExc_RuntimeError,
1774 "lost sys.stdout");
Jeffrey Yasskin2d873bd2008-12-08 18:55:24 +00001775 why = WHY_EXCEPTION;
1776 }
Guido van Rossum3165fe61992-09-25 21:59:05 +00001777 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001778 if (w != NULL) {
Georg Brandlaa76d772008-07-01 20:56:03 +00001779 /* w.write() may replace sys.stdout, so we
1780 * have to keep our reference to it */
Amaury Forgeot d'Arcbdd941f2008-07-01 20:38:04 +00001781 Py_INCREF(w);
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001782 err = PyFile_WriteString("\n", w);
1783 if (err == 0)
1784 PyFile_SoftSpace(w, 0);
Amaury Forgeot d'Arcbdd941f2008-07-01 20:38:04 +00001785 Py_DECREF(w);
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001786 }
1787 Py_XDECREF(stream);
1788 stream = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +00001789 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001790
Thomas Wouters434d0822000-08-24 20:11:32 +00001791
1792#ifdef CASE_TOO_BIG
1793 default: switch (opcode) {
1794#endif
Guido van Rossumf10570b1995-07-07 22:53:21 +00001795 case RAISE_VARARGS:
1796 u = v = w = NULL;
1797 switch (oparg) {
1798 case 3:
1799 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001800 /* Fallthrough */
1801 case 2:
1802 v = POP(); /* value */
1803 /* Fallthrough */
1804 case 1:
1805 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001806 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001807 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001808 break;
1809 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001810 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001811 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001812 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001813 break;
1814 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001815 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001816
Guido van Rossum374a9221991-04-04 10:40:29 +00001817 case LOAD_LOCALS:
Raymond Hettinger467a6982004-04-07 11:39:21 +00001818 if ((x = f->f_locals) != NULL) {
1819 Py_INCREF(x);
1820 PUSH(x);
1821 continue;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001822 }
Raymond Hettinger467a6982004-04-07 11:39:21 +00001823 PyErr_SetString(PyExc_SystemError, "no locals");
Guido van Rossum374a9221991-04-04 10:40:29 +00001824 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001825
Guido van Rossum374a9221991-04-04 10:40:29 +00001826 case RETURN_VALUE:
1827 retval = POP();
1828 why = WHY_RETURN;
Raymond Hettinger1dd83092004-02-06 18:32:33 +00001829 goto fast_block_end;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001830
Tim Peters5ca576e2001-06-18 22:08:13 +00001831 case YIELD_VALUE:
1832 retval = POP();
Tim Peters8c963692001-06-23 05:26:56 +00001833 f->f_stacktop = stack_pointer;
Tim Peters5ca576e2001-06-18 22:08:13 +00001834 why = WHY_YIELD;
Raymond Hettinger1dd83092004-02-06 18:32:33 +00001835 goto fast_yield;
Tim Peters5ca576e2001-06-18 22:08:13 +00001836
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001837 case EXEC_STMT:
Raymond Hettinger663004b2003-01-09 15:24:30 +00001838 w = TOP();
1839 v = SECOND();
1840 u = THIRD();
1841 STACKADJ(-3);
Michael W. Hudson75eabd22005-01-18 15:56:11 +00001842 READ_TIMESTAMP(intr0);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001843 err = exec_statement(f, u, v, w);
Michael W. Hudson75eabd22005-01-18 15:56:11 +00001844 READ_TIMESTAMP(intr1);
Guido van Rossumb209a111997-04-29 18:18:01 +00001845 Py_DECREF(u);
1846 Py_DECREF(v);
1847 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001848 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001849
Guido van Rossum374a9221991-04-04 10:40:29 +00001850 case POP_BLOCK:
1851 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001852 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001853 while (STACK_LEVEL() > b->b_level) {
1854 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001855 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001856 }
1857 }
Raymond Hettinger7eddd782004-04-07 14:38:08 +00001858 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001859
Jeffrey Yasskin9063a992008-03-03 01:27:03 +00001860 PREDICTED(END_FINALLY);
Guido van Rossum374a9221991-04-04 10:40:29 +00001861 case END_FINALLY:
1862 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001863 if (PyInt_Check(v)) {
Raymond Hettinger7c958652004-04-06 10:11:10 +00001864 why = (enum why_code) PyInt_AS_LONG(v);
Tim Peters8a5c3c72004-04-05 19:36:21 +00001865 assert(why != WHY_YIELD);
Raymond Hettingerc8aa08b2004-04-11 14:59:33 +00001866 if (why == WHY_RETURN ||
1867 why == WHY_CONTINUE)
Guido van Rossum374a9221991-04-04 10:40:29 +00001868 retval = POP();
1869 }
Thomas Wouterse2176022007-09-20 17:35:10 +00001870 else if (PyExceptionClass_Check(v) ||
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001871 PyString_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001872 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001873 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001874 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001875 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001876 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001877 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001878 else if (v != Py_None) {
1879 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001880 "'finally' pops bad exception");
1881 why = WHY_EXCEPTION;
1882 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001883 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001884 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001885
Guido van Rossum374a9221991-04-04 10:40:29 +00001886 case BUILD_CLASS:
Raymond Hettinger663004b2003-01-09 15:24:30 +00001887 u = TOP();
1888 v = SECOND();
1889 w = THIRD();
1890 STACKADJ(-2);
Guido van Rossum25831651993-05-19 14:50:45 +00001891 x = build_class(u, v, w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001892 SET_TOP(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001893 Py_DECREF(u);
1894 Py_DECREF(v);
1895 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001896 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001897
Guido van Rossum374a9221991-04-04 10:40:29 +00001898 case STORE_NAME:
Skip Montanaro496e6582002-08-06 17:47:40 +00001899 w = GETITEM(names, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001900 v = POP();
Raymond Hettinger467a6982004-04-07 11:39:21 +00001901 if ((x = f->f_locals) != NULL) {
Raymond Hettinger66bd2332004-08-02 08:30:07 +00001902 if (PyDict_CheckExact(x))
Raymond Hettinger214b1c32004-07-02 06:41:07 +00001903 err = PyDict_SetItem(x, w, v);
1904 else
1905 err = PyObject_SetItem(x, w, v);
Raymond Hettinger467a6982004-04-07 11:39:21 +00001906 Py_DECREF(v);
Raymond Hettinger7eddd782004-04-07 14:38:08 +00001907 if (err == 0) continue;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001908 break;
1909 }
Raymond Hettinger467a6982004-04-07 11:39:21 +00001910 PyErr_Format(PyExc_SystemError,
1911 "no locals found when storing %s",
1912 PyObject_REPR(w));
Guido van Rossum374a9221991-04-04 10:40:29 +00001913 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001914
Guido van Rossum374a9221991-04-04 10:40:29 +00001915 case DELETE_NAME:
Skip Montanaro496e6582002-08-06 17:47:40 +00001916 w = GETITEM(names, oparg);
Raymond Hettinger467a6982004-04-07 11:39:21 +00001917 if ((x = f->f_locals) != NULL) {
Raymond Hettinger214b1c32004-07-02 06:41:07 +00001918 if ((err = PyObject_DelItem(x, w)) != 0)
Raymond Hettinger467a6982004-04-07 11:39:21 +00001919 format_exc_check_arg(PyExc_NameError,
Thomas Wouterse2176022007-09-20 17:35:10 +00001920 NAME_ERROR_MSG,
1921 w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001922 break;
1923 }
Raymond Hettinger467a6982004-04-07 11:39:21 +00001924 PyErr_Format(PyExc_SystemError,
1925 "no locals when deleting %s",
1926 PyObject_REPR(w));
Guido van Rossum374a9221991-04-04 10:40:29 +00001927 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001928
Raymond Hettinger7dc52212003-03-16 20:14:44 +00001929 PREDICTED_WITH_ARG(UNPACK_SEQUENCE);
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001930 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001931 v = POP();
Thomas Wouterse2176022007-09-20 17:35:10 +00001932 if (PyTuple_CheckExact(v) &&
1933 PyTuple_GET_SIZE(v) == oparg) {
1934 PyObject **items = \
1935 ((PyTupleObject *)v)->ob_item;
Raymond Hettingerf114a3a2004-03-08 23:25:30 +00001936 while (oparg--) {
1937 w = items[oparg];
1938 Py_INCREF(w);
1939 PUSH(w);
Barry Warsawe42b18f1997-08-25 22:13:04 +00001940 }
Raymond Hettinger7eddd782004-04-07 14:38:08 +00001941 Py_DECREF(v);
1942 continue;
Thomas Wouterse2176022007-09-20 17:35:10 +00001943 } else if (PyList_CheckExact(v) &&
1944 PyList_GET_SIZE(v) == oparg) {
1945 PyObject **items = \
1946 ((PyListObject *)v)->ob_item;
Raymond Hettingerf114a3a2004-03-08 23:25:30 +00001947 while (oparg--) {
1948 w = items[oparg];
1949 Py_INCREF(w);
1950 PUSH(w);
Barry Warsawe42b18f1997-08-25 22:13:04 +00001951 }
Raymond Hettingerf114a3a2004-03-08 23:25:30 +00001952 } else if (unpack_iterable(v, oparg,
Thomas Wouterse2176022007-09-20 17:35:10 +00001953 stack_pointer + oparg)) {
Tim Petersd6d010b2001-06-21 02:49:55 +00001954 stack_pointer += oparg;
Georg Brandl5cb76c12007-03-21 09:00:39 +00001955 } else {
1956 /* unpack_iterable() raised an exception */
Barry Warsawe42b18f1997-08-25 22:13:04 +00001957 why = WHY_EXCEPTION;
Tim Peters8b13b3e2001-09-30 05:58:42 +00001958 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001959 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001960 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001961
Guido van Rossum374a9221991-04-04 10:40:29 +00001962 case STORE_ATTR:
Skip Montanaro496e6582002-08-06 17:47:40 +00001963 w = GETITEM(names, oparg);
Raymond Hettinger663004b2003-01-09 15:24:30 +00001964 v = TOP();
1965 u = SECOND();
1966 STACKADJ(-2);
Guido van Rossumb209a111997-04-29 18:18:01 +00001967 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1968 Py_DECREF(v);
1969 Py_DECREF(u);
Raymond Hettinger7eddd782004-04-07 14:38:08 +00001970 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001971 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001972
Guido van Rossum374a9221991-04-04 10:40:29 +00001973 case DELETE_ATTR:
Skip Montanaro496e6582002-08-06 17:47:40 +00001974 w = GETITEM(names, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001975 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001976 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1977 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001978 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001979 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001980
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001981 case STORE_GLOBAL:
Skip Montanaro496e6582002-08-06 17:47:40 +00001982 w = GETITEM(names, oparg);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001983 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001984 err = PyDict_SetItem(f->f_globals, w, v);
1985 Py_DECREF(v);
Raymond Hettinger7eddd782004-04-07 14:38:08 +00001986 if (err == 0) continue;
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001987 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001988
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001989 case DELETE_GLOBAL:
Skip Montanaro496e6582002-08-06 17:47:40 +00001990 w = GETITEM(names, oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001991 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001992 format_exc_check_arg(
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001993 PyExc_NameError, GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001994 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001995
Guido van Rossum374a9221991-04-04 10:40:29 +00001996 case LOAD_NAME:
Skip Montanaro496e6582002-08-06 17:47:40 +00001997 w = GETITEM(names, oparg);
Raymond Hettinger214b1c32004-07-02 06:41:07 +00001998 if ((v = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001999 PyErr_Format(PyExc_SystemError,
2000 "no locals when loading %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00002001 PyObject_REPR(w));
Jeffrey Yasskin2d873bd2008-12-08 18:55:24 +00002002 why = WHY_EXCEPTION;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002003 break;
2004 }
Michael W. Hudsona3711f72004-08-02 14:50:43 +00002005 if (PyDict_CheckExact(v)) {
Raymond Hettinger214b1c32004-07-02 06:41:07 +00002006 x = PyDict_GetItem(v, w);
Michael W. Hudsona3711f72004-08-02 14:50:43 +00002007 Py_XINCREF(x);
2008 }
Raymond Hettinger214b1c32004-07-02 06:41:07 +00002009 else {
2010 x = PyObject_GetItem(v, w);
2011 if (x == NULL && PyErr_Occurred()) {
Thomas Wouterse2176022007-09-20 17:35:10 +00002012 if (!PyErr_ExceptionMatches(
2013 PyExc_KeyError))
Raymond Hettinger214b1c32004-07-02 06:41:07 +00002014 break;
2015 PyErr_Clear();
2016 }
2017 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002018 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002019 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00002020 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002021 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00002022 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00002023 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00002024 PyExc_NameError,
Thomas Wouterse2176022007-09-20 17:35:10 +00002025 NAME_ERROR_MSG, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00002026 break;
2027 }
2028 }
Michael W. Hudsona3711f72004-08-02 14:50:43 +00002029 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00002030 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002031 PUSH(x);
Raymond Hettinger467a6982004-04-07 11:39:21 +00002032 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00002033
Guido van Rossum374a9221991-04-04 10:40:29 +00002034 case LOAD_GLOBAL:
Skip Montanaro496e6582002-08-06 17:47:40 +00002035 w = GETITEM(names, oparg);
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002036 if (PyString_CheckExact(w)) {
Guido van Rossumd8dbf842002-08-19 21:17:53 +00002037 /* Inline the PyDict_GetItem() calls.
2038 WARNING: this is an extreme speed hack.
2039 Do not try this at home. */
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002040 long hash = ((PyStringObject *)w)->ob_shash;
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00002041 if (hash != -1) {
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00002042 PyDictObject *d;
Armin Rigo35f6d362006-06-01 13:19:12 +00002043 PyDictEntry *e;
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00002044 d = (PyDictObject *)(f->f_globals);
Armin Rigo35f6d362006-06-01 13:19:12 +00002045 e = d->ma_lookup(d, w, hash);
2046 if (e == NULL) {
2047 x = NULL;
2048 break;
2049 }
2050 x = e->me_value;
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00002051 if (x != NULL) {
2052 Py_INCREF(x);
2053 PUSH(x);
2054 continue;
2055 }
2056 d = (PyDictObject *)(f->f_builtins);
Armin Rigo35f6d362006-06-01 13:19:12 +00002057 e = d->ma_lookup(d, w, hash);
2058 if (e == NULL) {
2059 x = NULL;
2060 break;
2061 }
2062 x = e->me_value;
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00002063 if (x != NULL) {
2064 Py_INCREF(x);
2065 PUSH(x);
2066 continue;
2067 }
2068 goto load_global_error;
2069 }
2070 }
2071 /* This is the un-inlined version of the code above */
Guido van Rossumb209a111997-04-29 18:18:01 +00002072 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00002073 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002074 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00002075 if (x == NULL) {
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00002076 load_global_error:
Paul Prescode68140d2000-08-30 20:25:01 +00002077 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00002078 PyExc_NameError,
Guido van Rossum3a4dfc82002-08-19 20:24:07 +00002079 GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00002080 break;
2081 }
2082 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002083 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00002084 PUSH(x);
Raymond Hettinger7eddd782004-04-07 14:38:08 +00002085 continue;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002086
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00002087 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00002088 x = GETLOCAL(oparg);
Raymond Hettinger467a6982004-04-07 11:39:21 +00002089 if (x != NULL) {
2090 SETLOCAL(oparg, NULL);
2091 continue;
Guido van Rossum2e4c8991998-05-12 20:27:36 +00002092 }
Raymond Hettinger467a6982004-04-07 11:39:21 +00002093 format_exc_check_arg(
2094 PyExc_UnboundLocalError,
2095 UNBOUNDLOCAL_ERROR_MSG,
2096 PyTuple_GetItem(co->co_varnames, oparg)
2097 );
2098 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00002099
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002100 case LOAD_CLOSURE:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00002101 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002102 Py_INCREF(x);
2103 PUSH(x);
Raymond Hettinger7eddd782004-04-07 14:38:08 +00002104 if (x != NULL) continue;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002105 break;
2106
2107 case LOAD_DEREF:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00002108 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002109 w = PyCell_Get(x);
Raymond Hettinger467a6982004-04-07 11:39:21 +00002110 if (w != NULL) {
2111 PUSH(w);
2112 continue;
Jeremy Hylton2524d692001-02-05 17:23:16 +00002113 }
Raymond Hettinger467a6982004-04-07 11:39:21 +00002114 err = -1;
2115 /* Don't stomp existing exception */
2116 if (PyErr_Occurred())
2117 break;
Richard Jonescebbefc2006-05-23 18:28:17 +00002118 if (oparg < PyTuple_GET_SIZE(co->co_cellvars)) {
2119 v = PyTuple_GET_ITEM(co->co_cellvars,
Raymond Hettinger467a6982004-04-07 11:39:21 +00002120 oparg);
2121 format_exc_check_arg(
2122 PyExc_UnboundLocalError,
2123 UNBOUNDLOCAL_ERROR_MSG,
2124 v);
2125 } else {
Thomas Wouterse2176022007-09-20 17:35:10 +00002126 v = PyTuple_GET_ITEM(co->co_freevars, oparg -
2127 PyTuple_GET_SIZE(co->co_cellvars));
2128 format_exc_check_arg(PyExc_NameError,
2129 UNBOUNDFREE_ERROR_MSG, v);
Raymond Hettinger467a6982004-04-07 11:39:21 +00002130 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002131 break;
2132
2133 case STORE_DEREF:
2134 w = POP();
Jeremy Hylton2b724da2001-01-29 22:51:52 +00002135 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002136 PyCell_Set(x, w);
Jeremy Hylton30c9f392001-03-13 01:58:22 +00002137 Py_DECREF(w);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002138 continue;
2139
Guido van Rossum374a9221991-04-04 10:40:29 +00002140 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00002141 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00002142 if (x != NULL) {
Raymond Hettinger5bed4562004-04-10 23:34:17 +00002143 for (; --oparg >= 0;) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002144 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002145 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00002146 }
2147 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002148 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00002149 }
2150 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00002151
Guido van Rossum374a9221991-04-04 10:40:29 +00002152 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00002153 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00002154 if (x != NULL) {
Raymond Hettinger5bed4562004-04-10 23:34:17 +00002155 for (; --oparg >= 0;) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002156 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00002157 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00002158 }
2159 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002160 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00002161 }
2162 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00002163
Guido van Rossum374a9221991-04-04 10:40:29 +00002164 case BUILD_MAP:
Raymond Hettingerfd7ed402007-12-18 21:24:09 +00002165 x = _PyDict_NewPresized((Py_ssize_t)oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00002166 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002167 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00002168 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00002169
Raymond Hettingereffde122007-12-18 18:26:18 +00002170 case STORE_MAP:
2171 w = TOP(); /* key */
2172 u = SECOND(); /* value */
2173 v = THIRD(); /* dict */
2174 STACKADJ(-2);
2175 assert (PyDict_CheckExact(v));
2176 err = PyDict_SetItem(v, w, u); /* v[w] = u */
2177 Py_DECREF(u);
2178 Py_DECREF(w);
2179 if (err == 0) continue;
2180 break;
2181
Guido van Rossum374a9221991-04-04 10:40:29 +00002182 case LOAD_ATTR:
Skip Montanaro496e6582002-08-06 17:47:40 +00002183 w = GETITEM(names, oparg);
Raymond Hettinger663004b2003-01-09 15:24:30 +00002184 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002185 x = PyObject_GetAttr(v, w);
2186 Py_DECREF(v);
Raymond Hettinger663004b2003-01-09 15:24:30 +00002187 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002188 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00002189 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00002190
Guido van Rossum374a9221991-04-04 10:40:29 +00002191 case COMPARE_OP:
2192 w = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00002193 v = TOP();
Raymond Hettinger4bad9ba2003-01-19 05:08:13 +00002194 if (PyInt_CheckExact(w) && PyInt_CheckExact(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00002195 /* INLINE: cmp(int, int) */
2196 register long a, b;
2197 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00002198 a = PyInt_AS_LONG(v);
2199 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00002200 switch (oparg) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00002201 case PyCmp_LT: res = a < b; break;
2202 case PyCmp_LE: res = a <= b; break;
2203 case PyCmp_EQ: res = a == b; break;
2204 case PyCmp_NE: res = a != b; break;
2205 case PyCmp_GT: res = a > b; break;
2206 case PyCmp_GE: res = a >= b; break;
2207 case PyCmp_IS: res = v == w; break;
2208 case PyCmp_IS_NOT: res = v != w; break;
Guido van Rossumc12da691997-07-17 23:12:42 +00002209 default: goto slow_compare;
2210 }
2211 x = res ? Py_True : Py_False;
2212 Py_INCREF(x);
2213 }
2214 else {
2215 slow_compare:
2216 x = cmp_outcome(oparg, v, w);
2217 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002218 Py_DECREF(v);
2219 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00002220 SET_TOP(x);
Raymond Hettingerf606f872003-03-16 03:11:04 +00002221 if (x == NULL) break;
Jeffrey Yasskin68d68522009-02-28 19:03:21 +00002222 PREDICT(POP_JUMP_IF_FALSE);
2223 PREDICT(POP_JUMP_IF_TRUE);
Raymond Hettingerf606f872003-03-16 03:11:04 +00002224 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00002225
Guido van Rossum374a9221991-04-04 10:40:29 +00002226 case IMPORT_NAME:
Skip Montanaro496e6582002-08-06 17:47:40 +00002227 w = GETITEM(names, oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002228 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002229 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002230 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00002231 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002232 break;
2233 }
Guido van Rossum1d9a9ea2008-01-23 20:19:01 +00002234 Py_INCREF(x);
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002235 v = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00002236 u = TOP();
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002237 if (PyInt_AsLong(u) != -1 || PyErr_Occurred())
2238 w = PyTuple_Pack(5,
2239 w,
2240 f->f_globals,
2241 f->f_locals == NULL ?
2242 Py_None : f->f_locals,
2243 v,
2244 u);
2245 else
2246 w = PyTuple_Pack(4,
2247 w,
2248 f->f_globals,
2249 f->f_locals == NULL ?
2250 Py_None : f->f_locals,
2251 v);
2252 Py_DECREF(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00002253 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002254 if (w == NULL) {
Raymond Hettinger663004b2003-01-09 15:24:30 +00002255 u = POP();
Guido van Rossum1d9a9ea2008-01-23 20:19:01 +00002256 Py_DECREF(x);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002257 x = NULL;
2258 break;
2259 }
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002260 READ_TIMESTAMP(intr0);
Guido van Rossum1d9a9ea2008-01-23 20:19:01 +00002261 v = x;
2262 x = PyEval_CallObject(v, w);
2263 Py_DECREF(v);
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002264 READ_TIMESTAMP(intr1);
Guido van Rossumb209a111997-04-29 18:18:01 +00002265 Py_DECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00002266 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002267 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00002268 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00002269
Thomas Wouters52152252000-08-17 22:55:00 +00002270 case IMPORT_STAR:
2271 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002272 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002273 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002274 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00002275 "no locals found during 'import *'");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002276 break;
2277 }
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002278 READ_TIMESTAMP(intr0);
Thomas Wouters52152252000-08-17 22:55:00 +00002279 err = import_all_from(x, v);
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002280 READ_TIMESTAMP(intr1);
Guido van Rossumb209a111997-04-29 18:18:01 +00002281 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00002282 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002283 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00002284 break;
Guido van Rossum25831651993-05-19 14:50:45 +00002285
Thomas Wouters52152252000-08-17 22:55:00 +00002286 case IMPORT_FROM:
Skip Montanaro496e6582002-08-06 17:47:40 +00002287 w = GETITEM(names, oparg);
Thomas Wouters52152252000-08-17 22:55:00 +00002288 v = TOP();
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002289 READ_TIMESTAMP(intr0);
Thomas Wouters52152252000-08-17 22:55:00 +00002290 x = import_from(v, w);
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002291 READ_TIMESTAMP(intr1);
Thomas Wouters52152252000-08-17 22:55:00 +00002292 PUSH(x);
2293 if (x != NULL) continue;
2294 break;
2295
Guido van Rossum374a9221991-04-04 10:40:29 +00002296 case JUMP_FORWARD:
2297 JUMPBY(oparg);
Neil Schemenauerc4b570f2003-06-01 19:21:12 +00002298 goto fast_next_opcode;
Guido van Rossumac7be682001-01-17 15:42:30 +00002299
Jeffrey Yasskin68d68522009-02-28 19:03:21 +00002300 PREDICTED_WITH_ARG(POP_JUMP_IF_FALSE);
2301 case POP_JUMP_IF_FALSE:
2302 w = POP();
Raymond Hettingerf606f872003-03-16 03:11:04 +00002303 if (w == Py_True) {
Jeffrey Yasskin68d68522009-02-28 19:03:21 +00002304 Py_DECREF(w);
Neil Schemenauerc4b570f2003-06-01 19:21:12 +00002305 goto fast_next_opcode;
Raymond Hettingerf606f872003-03-16 03:11:04 +00002306 }
Raymond Hettinger21012b82003-02-26 18:11:50 +00002307 if (w == Py_False) {
Jeffrey Yasskin68d68522009-02-28 19:03:21 +00002308 Py_DECREF(w);
2309 JUMPTO(oparg);
Neil Schemenauerc4b570f2003-06-01 19:21:12 +00002310 goto fast_next_opcode;
Raymond Hettinger21012b82003-02-26 18:11:50 +00002311 }
2312 err = PyObject_IsTrue(w);
Jeffrey Yasskin68d68522009-02-28 19:03:21 +00002313 Py_DECREF(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002314 if (err > 0)
2315 err = 0;
2316 else if (err == 0)
Jeffrey Yasskin68d68522009-02-28 19:03:21 +00002317 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002318 else
2319 break;
2320 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00002321
Jeffrey Yasskin68d68522009-02-28 19:03:21 +00002322 PREDICTED_WITH_ARG(POP_JUMP_IF_TRUE);
2323 case POP_JUMP_IF_TRUE:
2324 w = POP();
Raymond Hettingerf606f872003-03-16 03:11:04 +00002325 if (w == Py_False) {
Jeffrey Yasskin68d68522009-02-28 19:03:21 +00002326 Py_DECREF(w);
Neil Schemenauerc4b570f2003-06-01 19:21:12 +00002327 goto fast_next_opcode;
Raymond Hettingerf606f872003-03-16 03:11:04 +00002328 }
Raymond Hettinger21012b82003-02-26 18:11:50 +00002329 if (w == Py_True) {
Jeffrey Yasskin68d68522009-02-28 19:03:21 +00002330 Py_DECREF(w);
2331 JUMPTO(oparg);
2332 goto fast_next_opcode;
2333 }
2334 err = PyObject_IsTrue(w);
2335 Py_DECREF(w);
2336 if (err > 0) {
2337 err = 0;
2338 JUMPTO(oparg);
2339 }
2340 else if (err == 0)
2341 ;
2342 else
2343 break;
2344 continue;
2345
2346 case JUMP_IF_FALSE_OR_POP:
2347 w = TOP();
2348 if (w == Py_True) {
2349 STACKADJ(-1);
2350 Py_DECREF(w);
2351 goto fast_next_opcode;
2352 }
2353 if (w == Py_False) {
2354 JUMPTO(oparg);
2355 goto fast_next_opcode;
2356 }
2357 err = PyObject_IsTrue(w);
2358 if (err > 0) {
2359 STACKADJ(-1);
2360 Py_DECREF(w);
2361 err = 0;
2362 }
2363 else if (err == 0)
2364 JUMPTO(oparg);
2365 else
2366 break;
2367 continue;
2368
2369 case JUMP_IF_TRUE_OR_POP:
2370 w = TOP();
2371 if (w == Py_False) {
2372 STACKADJ(-1);
2373 Py_DECREF(w);
2374 goto fast_next_opcode;
2375 }
2376 if (w == Py_True) {
2377 JUMPTO(oparg);
Neil Schemenauerc4b570f2003-06-01 19:21:12 +00002378 goto fast_next_opcode;
Raymond Hettinger21012b82003-02-26 18:11:50 +00002379 }
2380 err = PyObject_IsTrue(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002381 if (err > 0) {
2382 err = 0;
Jeffrey Yasskin68d68522009-02-28 19:03:21 +00002383 JUMPTO(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002384 }
Jeffrey Yasskin68d68522009-02-28 19:03:21 +00002385 else if (err == 0) {
2386 STACKADJ(-1);
2387 Py_DECREF(w);
2388 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002389 else
2390 break;
2391 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00002392
Raymond Hettingerfba1cfc2004-03-12 16:33:17 +00002393 PREDICTED_WITH_ARG(JUMP_ABSOLUTE);
Guido van Rossum374a9221991-04-04 10:40:29 +00002394 case JUMP_ABSOLUTE:
2395 JUMPTO(oparg);
Raymond Hettingerdc1d1ba2007-11-07 02:45:46 +00002396#if FAST_LOOPS
2397 /* Enabling this path speeds-up all while and for-loops by bypassing
2398 the per-loop checks for signals. By default, this should be turned-off
2399 because it prevents detection of a control-break in tight loops like
2400 "while 1: pass". Compile with this option turned-on when you need
2401 the speed-up and do not need break checking inside tight loops (ones
Antoine Pitrouc2cc80c2008-07-25 22:13:52 +00002402 that contain only instructions ending with goto fast_next_opcode).
Raymond Hettingerdc1d1ba2007-11-07 02:45:46 +00002403 */
2404 goto fast_next_opcode;
2405#else
Neil Schemenauerca2a2f12003-05-30 23:59:44 +00002406 continue;
Raymond Hettingerdc1d1ba2007-11-07 02:45:46 +00002407#endif
Guido van Rossumac7be682001-01-17 15:42:30 +00002408
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002409 case GET_ITER:
2410 /* before: [obj]; after [getiter(obj)] */
Raymond Hettinger663004b2003-01-09 15:24:30 +00002411 v = TOP();
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002412 x = PyObject_GetIter(v);
2413 Py_DECREF(v);
2414 if (x != NULL) {
Raymond Hettinger663004b2003-01-09 15:24:30 +00002415 SET_TOP(x);
Raymond Hettinger7dc52212003-03-16 20:14:44 +00002416 PREDICT(FOR_ITER);
Guido van Rossum213c7a62001-04-23 14:08:49 +00002417 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002418 }
Raymond Hettinger8bb90a52003-01-14 12:43:10 +00002419 STACKADJ(-1);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002420 break;
2421
Raymond Hettinger7dc52212003-03-16 20:14:44 +00002422 PREDICTED_WITH_ARG(FOR_ITER);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002423 case FOR_ITER:
2424 /* before: [iter]; after: [iter, iter()] *or* [] */
2425 v = TOP();
Raymond Hettingerdb0de9e2004-03-12 08:41:36 +00002426 x = (*v->ob_type->tp_iternext)(v);
Guido van Rossum213c7a62001-04-23 14:08:49 +00002427 if (x != NULL) {
2428 PUSH(x);
Raymond Hettinger7dc52212003-03-16 20:14:44 +00002429 PREDICT(STORE_FAST);
2430 PREDICT(UNPACK_SEQUENCE);
Guido van Rossum213c7a62001-04-23 14:08:49 +00002431 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002432 }
Raymond Hettingerdb0de9e2004-03-12 08:41:36 +00002433 if (PyErr_Occurred()) {
Thomas Wouterse2176022007-09-20 17:35:10 +00002434 if (!PyErr_ExceptionMatches(
2435 PyExc_StopIteration))
Raymond Hettingerdb0de9e2004-03-12 08:41:36 +00002436 break;
2437 PyErr_Clear();
Guido van Rossum213c7a62001-04-23 14:08:49 +00002438 }
Raymond Hettingerdb0de9e2004-03-12 08:41:36 +00002439 /* iterator ended normally */
2440 x = v = POP();
2441 Py_DECREF(v);
2442 JUMPBY(oparg);
2443 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002444
Raymond Hettinger2d783e92004-03-12 09:12:22 +00002445 case BREAK_LOOP:
2446 why = WHY_BREAK;
2447 goto fast_block_end;
2448
2449 case CONTINUE_LOOP:
2450 retval = PyInt_FromLong(oparg);
Neal Norwitz02104df2006-05-19 06:31:23 +00002451 if (!retval) {
2452 x = NULL;
2453 break;
2454 }
Raymond Hettinger2d783e92004-03-12 09:12:22 +00002455 why = WHY_CONTINUE;
2456 goto fast_block_end;
2457
Guido van Rossum374a9221991-04-04 10:40:29 +00002458 case SETUP_LOOP:
2459 case SETUP_EXCEPT:
2460 case SETUP_FINALLY:
Thomas Wouterse2176022007-09-20 17:35:10 +00002461 /* NOTE: If you add any new block-setup opcodes that
2462 are not try/except/finally handlers, you may need
2463 to update the PyGen_NeedsFinalizing() function.
2464 */
Phillip J. Eby2ba96612006-04-10 17:51:05 +00002465
Guido van Rossumb209a111997-04-29 18:18:01 +00002466 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002467 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002468 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00002469
Guido van Rossumc2e20742006-02-27 22:32:47 +00002470 case WITH_CLEANUP:
2471 {
Nick Coghlan7af53be2008-03-07 14:13:28 +00002472 /* At the top of the stack are 1-3 values indicating
2473 how/why we entered the finally clause:
2474 - TOP = None
2475 - (TOP, SECOND) = (WHY_{RETURN,CONTINUE}), retval
2476 - TOP = WHY_*; no retval below it
2477 - (TOP, SECOND, THIRD) = exc_info()
2478 Below them is EXIT, the context.__exit__ bound method.
Guido van Rossumc2e20742006-02-27 22:32:47 +00002479 In the last case, we must call
Nick Coghlan7af53be2008-03-07 14:13:28 +00002480 EXIT(TOP, SECOND, THIRD)
Guido van Rossumc2e20742006-02-27 22:32:47 +00002481 otherwise we must call
Nick Coghlan7af53be2008-03-07 14:13:28 +00002482 EXIT(None, None, None)
2483
2484 In all cases, we remove EXIT from the stack, leaving
2485 the rest in the same order.
Guido van Rossum1a5e21e2006-02-28 21:57:43 +00002486
2487 In addition, if the stack represents an exception,
Guido van Rossumf6694362006-03-10 02:28:35 +00002488 *and* the function call returns a 'true' value, we
2489 "zap" this information, to prevent END_FINALLY from
2490 re-raising the exception. (But non-local gotos
2491 should still be resumed.)
Guido van Rossumc2e20742006-02-27 22:32:47 +00002492 */
Tim Peters7df5e7f2006-05-26 23:14:37 +00002493
Nick Coghlan7af53be2008-03-07 14:13:28 +00002494 PyObject *exit_func;
2495
2496 u = POP();
2497 if (u == Py_None) {
2498 exit_func = TOP();
2499 SET_TOP(u);
2500 v = w = Py_None;
2501 }
2502 else if (PyInt_Check(u)) {
2503 switch(PyInt_AS_LONG(u)) {
2504 case WHY_RETURN:
2505 case WHY_CONTINUE:
2506 /* Retval in TOP. */
2507 exit_func = SECOND();
2508 SET_SECOND(TOP());
2509 SET_TOP(u);
2510 break;
2511 default:
2512 exit_func = TOP();
2513 SET_TOP(u);
2514 break;
2515 }
Guido van Rossumc2e20742006-02-27 22:32:47 +00002516 u = v = w = Py_None;
2517 }
2518 else {
Nick Coghlan7af53be2008-03-07 14:13:28 +00002519 v = TOP();
2520 w = SECOND();
2521 exit_func = THIRD();
2522 SET_TOP(u);
2523 SET_SECOND(v);
2524 SET_THIRD(w);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002525 }
Guido van Rossumf6694362006-03-10 02:28:35 +00002526 /* XXX Not the fastest way to call it... */
Nick Coghlan7af53be2008-03-07 14:13:28 +00002527 x = PyObject_CallFunctionObjArgs(exit_func, u, v, w,
2528 NULL);
Amaury Forgeot d'Arcad9b5992008-12-10 23:22:49 +00002529 Py_DECREF(exit_func);
2530 if (x == NULL)
Guido van Rossumf6694362006-03-10 02:28:35 +00002531 break; /* Go to error exit */
Amaury Forgeot d'Arcad9b5992008-12-10 23:22:49 +00002532
2533 if (u != Py_None)
2534 err = PyObject_IsTrue(x);
2535 else
2536 err = 0;
2537 Py_DECREF(x);
2538
2539 if (err < 0)
2540 break; /* Go to error exit */
2541 else if (err > 0) {
2542 err = 0;
Guido van Rossumf6694362006-03-10 02:28:35 +00002543 /* There was an exception and a true return */
Nick Coghlan7af53be2008-03-07 14:13:28 +00002544 STACKADJ(-2);
Guido van Rossumf6694362006-03-10 02:28:35 +00002545 Py_INCREF(Py_None);
2546 SET_TOP(Py_None);
Guido van Rossumf6694362006-03-10 02:28:35 +00002547 Py_DECREF(u);
2548 Py_DECREF(v);
2549 Py_DECREF(w);
2550 } else {
Nick Coghlan7af53be2008-03-07 14:13:28 +00002551 /* The stack was rearranged to remove EXIT
2552 above. Let END_FINALLY do its thing */
Guido van Rossumf6694362006-03-10 02:28:35 +00002553 }
Jeffrey Yasskin9063a992008-03-03 01:27:03 +00002554 PREDICT(END_FINALLY);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002555 break;
2556 }
2557
Guido van Rossumf10570b1995-07-07 22:53:21 +00002558 case CALL_FUNCTION:
Armin Rigo8817fcd2004-06-17 10:22:40 +00002559 {
2560 PyObject **sp;
Jeremy Hylton985eba52003-02-05 23:13:00 +00002561 PCALL(PCALL_ALL);
Armin Rigo8817fcd2004-06-17 10:22:40 +00002562 sp = stack_pointer;
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00002563#ifdef WITH_TSC
Armin Rigo8817fcd2004-06-17 10:22:40 +00002564 x = call_function(&sp, oparg, &intr0, &intr1);
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00002565#else
Armin Rigo8817fcd2004-06-17 10:22:40 +00002566 x = call_function(&sp, oparg);
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00002567#endif
Armin Rigo8817fcd2004-06-17 10:22:40 +00002568 stack_pointer = sp;
Jeremy Hyltone8c04322002-08-16 17:47:26 +00002569 PUSH(x);
2570 if (x != NULL)
2571 continue;
2572 break;
Armin Rigo8817fcd2004-06-17 10:22:40 +00002573 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002574
Jeremy Hylton76901512000-03-28 23:49:17 +00002575 case CALL_FUNCTION_VAR:
2576 case CALL_FUNCTION_KW:
2577 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00002578 {
Jeremy Hylton76901512000-03-28 23:49:17 +00002579 int na = oparg & 0xff;
2580 int nk = (oparg>>8) & 0xff;
2581 int flags = (opcode - CALL_FUNCTION) & 3;
Jeremy Hylton52820442001-01-03 23:52:36 +00002582 int n = na + 2 * nk;
Armin Rigo8817fcd2004-06-17 10:22:40 +00002583 PyObject **pfunc, *func, **sp;
Jeremy Hylton985eba52003-02-05 23:13:00 +00002584 PCALL(PCALL_ALL);
Jeremy Hylton52820442001-01-03 23:52:36 +00002585 if (flags & CALL_FLAG_VAR)
2586 n++;
2587 if (flags & CALL_FLAG_KW)
2588 n++;
2589 pfunc = stack_pointer - n - 1;
2590 func = *pfunc;
Jeremy Hylton52820442001-01-03 23:52:36 +00002591
Guido van Rossumac7be682001-01-17 15:42:30 +00002592 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00002593 && PyMethod_GET_SELF(func) != NULL) {
2594 PyObject *self = PyMethod_GET_SELF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002595 Py_INCREF(self);
Jeremy Hylton52820442001-01-03 23:52:36 +00002596 func = PyMethod_GET_FUNCTION(func);
2597 Py_INCREF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002598 Py_DECREF(*pfunc);
2599 *pfunc = self;
2600 na++;
2601 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00002602 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00002603 Py_INCREF(func);
Armin Rigo8817fcd2004-06-17 10:22:40 +00002604 sp = stack_pointer;
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002605 READ_TIMESTAMP(intr0);
Armin Rigo8817fcd2004-06-17 10:22:40 +00002606 x = ext_do_call(func, &sp, flags, na, nk);
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002607 READ_TIMESTAMP(intr1);
Armin Rigo8817fcd2004-06-17 10:22:40 +00002608 stack_pointer = sp;
Jeremy Hylton76901512000-03-28 23:49:17 +00002609 Py_DECREF(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00002610
Jeremy Hylton76901512000-03-28 23:49:17 +00002611 while (stack_pointer > pfunc) {
Jeremy Hylton52820442001-01-03 23:52:36 +00002612 w = POP();
2613 Py_DECREF(w);
Jeremy Hylton76901512000-03-28 23:49:17 +00002614 }
2615 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00002616 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00002617 continue;
Jeremy Hylton76901512000-03-28 23:49:17 +00002618 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002619 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002620
Guido van Rossum681d79a1995-07-18 14:51:37 +00002621 case MAKE_FUNCTION:
2622 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00002623 x = PyFunction_New(v, f->f_globals);
2624 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002625 /* XXX Maybe this should be a separate opcode? */
2626 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002627 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002628 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002629 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002630 x = NULL;
2631 break;
2632 }
Raymond Hettinger5bed4562004-04-10 23:34:17 +00002633 while (--oparg >= 0) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002634 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002635 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002636 }
2637 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00002638 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002639 }
2640 PUSH(x);
2641 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002642
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002643 case MAKE_CLOSURE:
2644 {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002645 v = POP(); /* code object */
2646 x = PyFunction_New(v, f->f_globals);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002647 Py_DECREF(v);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002648 if (x != NULL) {
2649 v = POP();
Jeffrey Yasskin2d873bd2008-12-08 18:55:24 +00002650 if (PyFunction_SetClosure(x, v) != 0) {
2651 /* Can't happen unless bytecode is corrupt. */
2652 why = WHY_EXCEPTION;
2653 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002654 Py_DECREF(v);
2655 }
2656 if (x != NULL && oparg > 0) {
2657 v = PyTuple_New(oparg);
2658 if (v == NULL) {
2659 Py_DECREF(x);
2660 x = NULL;
2661 break;
2662 }
Raymond Hettinger5bed4562004-04-10 23:34:17 +00002663 while (--oparg >= 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002664 w = POP();
2665 PyTuple_SET_ITEM(v, oparg, w);
2666 }
Jeffrey Yasskin2d873bd2008-12-08 18:55:24 +00002667 if (PyFunction_SetDefaults(x, v) != 0) {
2668 /* Can't happen unless
2669 PyFunction_SetDefaults changes. */
2670 why = WHY_EXCEPTION;
2671 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002672 Py_DECREF(v);
2673 }
2674 PUSH(x);
2675 break;
2676 }
2677
Guido van Rossum8861b741996-07-30 16:49:37 +00002678 case BUILD_SLICE:
2679 if (oparg == 3)
2680 w = POP();
2681 else
2682 w = NULL;
2683 v = POP();
Raymond Hettinger663004b2003-01-09 15:24:30 +00002684 u = TOP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00002685 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00002686 Py_DECREF(u);
2687 Py_DECREF(v);
2688 Py_XDECREF(w);
Raymond Hettinger663004b2003-01-09 15:24:30 +00002689 SET_TOP(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002690 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00002691 break;
2692
Fred Drakeef8ace32000-08-24 00:32:09 +00002693 case EXTENDED_ARG:
2694 opcode = NEXTOP();
Raymond Hettinger5bed4562004-04-10 23:34:17 +00002695 oparg = oparg<<16 | NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +00002696 goto dispatch_opcode;
Guido van Rossum8861b741996-07-30 16:49:37 +00002697
Guido van Rossum374a9221991-04-04 10:40:29 +00002698 default:
2699 fprintf(stderr,
2700 "XXX lineno: %d, opcode: %d\n",
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002701 PyCode_Addr2Line(f->f_code, f->f_lasti),
2702 opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00002703 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00002704 why = WHY_EXCEPTION;
2705 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002706
2707#ifdef CASE_TOO_BIG
2708 }
2709#endif
2710
Guido van Rossum374a9221991-04-04 10:40:29 +00002711 } /* switch */
2712
2713 on_error:
Guido van Rossumac7be682001-01-17 15:42:30 +00002714
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002715 READ_TIMESTAMP(inst1);
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00002716
Guido van Rossum374a9221991-04-04 10:40:29 +00002717 /* Quickly continue if no error occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002718
Guido van Rossum374a9221991-04-04 10:40:29 +00002719 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002720 if (err == 0 && x != NULL) {
2721#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002722 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002723 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002724 fprintf(stderr,
2725 "XXX undetected error\n");
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00002726 else {
2727#endif
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002728 READ_TIMESTAMP(loop1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002729 continue; /* Normal, fast path */
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00002730#ifdef CHECKEXC
2731 }
2732#endif
Guido van Rossum681d79a1995-07-18 14:51:37 +00002733 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002734 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00002735 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00002736 err = 0;
2737 }
2738
Guido van Rossum374a9221991-04-04 10:40:29 +00002739 /* Double-check exception status */
Guido van Rossumac7be682001-01-17 15:42:30 +00002740
Raymond Hettingerc8aa08b2004-04-11 14:59:33 +00002741 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002742 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002743 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002744 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00002745 why = WHY_EXCEPTION;
2746 }
2747 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002748#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00002749 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002750 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002751 if (PyErr_Occurred()) {
Neal Norwitz8250fbe2008-01-27 17:12:15 +00002752 char buf[128];
Jeremy Hylton904ed862003-11-05 17:29:35 +00002753 sprintf(buf, "Stack unwind with exception "
2754 "set and why=%d", why);
2755 Py_FatalError(buf);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002756 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002757 }
2758#endif
2759
2760 /* Log traceback info if this is a real exception */
Guido van Rossumac7be682001-01-17 15:42:30 +00002761
Guido van Rossum374a9221991-04-04 10:40:29 +00002762 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002763 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002764
Fred Drake8f51f542001-10-04 14:48:42 +00002765 if (tstate->c_tracefunc != NULL)
2766 call_exc_trace(tstate->c_tracefunc,
2767 tstate->c_traceobj, f);
Guido van Rossum014518f1998-11-23 21:09:51 +00002768 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002769
Guido van Rossum374a9221991-04-04 10:40:29 +00002770 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
Guido van Rossumac7be682001-01-17 15:42:30 +00002771
Guido van Rossum374a9221991-04-04 10:40:29 +00002772 if (why == WHY_RERAISE)
2773 why = WHY_EXCEPTION;
2774
2775 /* Unwind stacks if a (pseudo) exception occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002776
Raymond Hettinger1dd83092004-02-06 18:32:33 +00002777fast_block_end:
Tim Peters8a5c3c72004-04-05 19:36:21 +00002778 while (why != WHY_NOT && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002779 PyTryBlock *b = PyFrame_BlockPop(f);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002780
Tim Peters8a5c3c72004-04-05 19:36:21 +00002781 assert(why != WHY_YIELD);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002782 if (b->b_type == SETUP_LOOP && why == WHY_CONTINUE) {
2783 /* For a continue inside a try block,
2784 don't pop the block for the loop. */
Thomas Wouters1ee64222001-09-24 19:32:01 +00002785 PyFrame_BlockSetup(f, b->b_type, b->b_handler,
2786 b->b_level);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002787 why = WHY_NOT;
2788 JUMPTO(PyInt_AS_LONG(retval));
2789 Py_DECREF(retval);
2790 break;
2791 }
2792
Guido van Rossum374a9221991-04-04 10:40:29 +00002793 while (STACK_LEVEL() > b->b_level) {
2794 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002795 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002796 }
2797 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2798 why = WHY_NOT;
2799 JUMPTO(b->b_handler);
2800 break;
2801 }
2802 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00002803 (b->b_type == SETUP_EXCEPT &&
2804 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002805 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002806 PyObject *exc, *val, *tb;
2807 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002808 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002809 val = Py_None;
2810 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00002811 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002812 /* Make the raw exception data
2813 available to the handler,
2814 so a program can emulate the
2815 Python main loop. Don't do
2816 this for 'finally'. */
2817 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00002818 PyErr_NormalizeException(
2819 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002820 set_exc_info(tstate,
2821 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002822 }
Jeremy Hyltonc6314892001-09-26 19:24:45 +00002823 if (tb == NULL) {
2824 Py_INCREF(Py_None);
2825 PUSH(Py_None);
2826 } else
2827 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002828 PUSH(val);
2829 PUSH(exc);
2830 }
2831 else {
Raymond Hettinger06032cb2004-04-06 09:37:35 +00002832 if (why & (WHY_RETURN | WHY_CONTINUE))
Guido van Rossum374a9221991-04-04 10:40:29 +00002833 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00002834 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00002835 PUSH(v);
2836 }
2837 why = WHY_NOT;
2838 JUMPTO(b->b_handler);
2839 break;
2840 }
2841 } /* unwind stack */
2842
2843 /* End the loop if we still have an error (or return) */
Guido van Rossumac7be682001-01-17 15:42:30 +00002844
Guido van Rossum374a9221991-04-04 10:40:29 +00002845 if (why != WHY_NOT)
2846 break;
Michael W. Hudson75eabd22005-01-18 15:56:11 +00002847 READ_TIMESTAMP(loop1);
Guido van Rossumac7be682001-01-17 15:42:30 +00002848
Guido van Rossum374a9221991-04-04 10:40:29 +00002849 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00002850
Tim Peters8a5c3c72004-04-05 19:36:21 +00002851 assert(why != WHY_YIELD);
2852 /* Pop remaining stack entries. */
2853 while (!EMPTY()) {
2854 v = POP();
2855 Py_XDECREF(v);
Guido van Rossum35974fb2001-12-06 21:28:18 +00002856 }
2857
Tim Peters8a5c3c72004-04-05 19:36:21 +00002858 if (why != WHY_RETURN)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002859 retval = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002860
Raymond Hettinger1dd83092004-02-06 18:32:33 +00002861fast_yield:
Fred Drake9e3ad782001-07-03 23:39:52 +00002862 if (tstate->use_tracing) {
Barry Warsawe2eca0b2005-08-15 18:14:19 +00002863 if (tstate->c_tracefunc) {
2864 if (why == WHY_RETURN || why == WHY_YIELD) {
2865 if (call_trace(tstate->c_tracefunc,
2866 tstate->c_traceobj, f,
2867 PyTrace_RETURN, retval)) {
2868 Py_XDECREF(retval);
2869 retval = NULL;
2870 why = WHY_EXCEPTION;
2871 }
2872 }
2873 else if (why == WHY_EXCEPTION) {
2874 call_trace_protected(tstate->c_tracefunc,
2875 tstate->c_traceobj, f,
Armin Rigo1c2d7e52005-09-20 18:34:01 +00002876 PyTrace_RETURN, NULL);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002877 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002878 }
Fred Drake8f51f542001-10-04 14:48:42 +00002879 if (tstate->c_profilefunc) {
Fred Drake4ec5d562001-10-04 19:26:43 +00002880 if (why == WHY_EXCEPTION)
2881 call_trace_protected(tstate->c_profilefunc,
2882 tstate->c_profileobj, f,
Armin Rigo1c2d7e52005-09-20 18:34:01 +00002883 PyTrace_RETURN, NULL);
Fred Drake4ec5d562001-10-04 19:26:43 +00002884 else if (call_trace(tstate->c_profilefunc,
2885 tstate->c_profileobj, f,
2886 PyTrace_RETURN, retval)) {
Fred Drake9e3ad782001-07-03 23:39:52 +00002887 Py_XDECREF(retval);
2888 retval = NULL;
2889 why = WHY_EXCEPTION;
2890 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002891 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002892 }
Guido van Rossuma4240131997-01-21 21:18:36 +00002893
Tim Peters7df5e7f2006-05-26 23:14:37 +00002894 if (tstate->frame->f_exc_type != NULL)
2895 reset_exc_info(tstate);
2896 else {
2897 assert(tstate->frame->f_exc_value == NULL);
2898 assert(tstate->frame->f_exc_traceback == NULL);
2899 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00002900
Tim Peters5ca576e2001-06-18 22:08:13 +00002901 /* pop frame */
Thomas Woutersae406c62007-09-19 17:27:43 +00002902exit_eval_frame:
Armin Rigo2b3eb402003-10-28 12:05:48 +00002903 Py_LeaveRecursiveCall();
Guido van Rossuma027efa1997-05-05 20:56:21 +00002904 tstate->frame = f->f_back;
Guido van Rossumac7be682001-01-17 15:42:30 +00002905
Guido van Rossum96a42c81992-01-12 02:29:51 +00002906 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00002907}
2908
Guido van Rossumc2e20742006-02-27 22:32:47 +00002909/* This is gonna seem *real weird*, but if you put some other code between
Martin v. Löwis8d97e332004-06-27 15:43:12 +00002910 PyEval_EvalFrame() and PyEval_EvalCodeEx() you will need to adjust
Guido van Rossumc2e20742006-02-27 22:32:47 +00002911 the test in the if statements in Misc/gdbinit (pystack and pystackv). */
Skip Montanaro786ea6b2004-03-01 15:44:05 +00002912
Tim Peters6d6c1a32001-08-02 04:15:00 +00002913PyObject *
2914PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals,
Tim Peters5ca576e2001-06-18 22:08:13 +00002915 PyObject **args, int argcount, PyObject **kws, int kwcount,
2916 PyObject **defs, int defcount, PyObject *closure)
2917{
2918 register PyFrameObject *f;
2919 register PyObject *retval = NULL;
2920 register PyObject **fastlocals, **freevars;
2921 PyThreadState *tstate = PyThreadState_GET();
2922 PyObject *x, *u;
2923
2924 if (globals == NULL) {
Tim Peters8a5c3c72004-04-05 19:36:21 +00002925 PyErr_SetString(PyExc_SystemError,
Jeremy Hylton910d7d42001-08-12 21:52:24 +00002926 "PyEval_EvalCodeEx: NULL globals");
Tim Peters5ca576e2001-06-18 22:08:13 +00002927 return NULL;
2928 }
2929
Neal Norwitzdf6a6492006-08-13 18:10:10 +00002930 assert(tstate != NULL);
Jeremy Hylton985eba52003-02-05 23:13:00 +00002931 assert(globals != NULL);
2932 f = PyFrame_New(tstate, co, globals, locals);
Tim Peters5ca576e2001-06-18 22:08:13 +00002933 if (f == NULL)
2934 return NULL;
2935
2936 fastlocals = f->f_localsplus;
Richard Jonescebbefc2006-05-23 18:28:17 +00002937 freevars = f->f_localsplus + co->co_nlocals;
Tim Peters5ca576e2001-06-18 22:08:13 +00002938
2939 if (co->co_argcount > 0 ||
2940 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
2941 int i;
2942 int n = argcount;
2943 PyObject *kwdict = NULL;
2944 if (co->co_flags & CO_VARKEYWORDS) {
2945 kwdict = PyDict_New();
2946 if (kwdict == NULL)
2947 goto fail;
2948 i = co->co_argcount;
2949 if (co->co_flags & CO_VARARGS)
2950 i++;
2951 SETLOCAL(i, kwdict);
2952 }
2953 if (argcount > co->co_argcount) {
2954 if (!(co->co_flags & CO_VARARGS)) {
2955 PyErr_Format(PyExc_TypeError,
2956 "%.200s() takes %s %d "
2957 "%sargument%s (%d given)",
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002958 PyString_AsString(co->co_name),
Tim Peters5ca576e2001-06-18 22:08:13 +00002959 defcount ? "at most" : "exactly",
2960 co->co_argcount,
2961 kwcount ? "non-keyword " : "",
2962 co->co_argcount == 1 ? "" : "s",
2963 argcount);
2964 goto fail;
2965 }
2966 n = co->co_argcount;
2967 }
2968 for (i = 0; i < n; i++) {
2969 x = args[i];
2970 Py_INCREF(x);
2971 SETLOCAL(i, x);
2972 }
2973 if (co->co_flags & CO_VARARGS) {
2974 u = PyTuple_New(argcount - n);
2975 if (u == NULL)
2976 goto fail;
2977 SETLOCAL(co->co_argcount, u);
2978 for (i = n; i < argcount; i++) {
2979 x = args[i];
2980 Py_INCREF(x);
2981 PyTuple_SET_ITEM(u, i-n, x);
2982 }
2983 }
2984 for (i = 0; i < kwcount; i++) {
Antoine Pitrouc2cc80c2008-07-25 22:13:52 +00002985 PyObject **co_varnames;
Tim Peters5ca576e2001-06-18 22:08:13 +00002986 PyObject *keyword = kws[2*i];
2987 PyObject *value = kws[2*i + 1];
2988 int j;
Benjamin Peterson78821dd2009-01-25 17:15:10 +00002989 if (keyword == NULL || !(PyString_Check(keyword)
2990#ifdef Py_USING_UNICODE
2991 || PyUnicode_Check(keyword)
2992#endif
2993 )) {
Tim Peters5ca576e2001-06-18 22:08:13 +00002994 PyErr_Format(PyExc_TypeError,
2995 "%.200s() keywords must be strings",
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002996 PyString_AsString(co->co_name));
Tim Peters5ca576e2001-06-18 22:08:13 +00002997 goto fail;
2998 }
Antoine Pitrouc2cc80c2008-07-25 22:13:52 +00002999 /* Speed hack: do raw pointer compares. As names are
3000 normally interned this should almost always hit. */
3001 co_varnames = PySequence_Fast_ITEMS(co->co_varnames);
Tim Peters5ca576e2001-06-18 22:08:13 +00003002 for (j = 0; j < co->co_argcount; j++) {
Antoine Pitrouc2cc80c2008-07-25 22:13:52 +00003003 PyObject *nm = co_varnames[j];
3004 if (nm == keyword)
3005 goto kw_found;
3006 }
3007 /* Slow fallback, just in case */
3008 for (j = 0; j < co->co_argcount; j++) {
3009 PyObject *nm = co_varnames[j];
Tim Peters5ca576e2001-06-18 22:08:13 +00003010 int cmp = PyObject_RichCompareBool(
3011 keyword, nm, Py_EQ);
3012 if (cmp > 0)
Antoine Pitrouc2cc80c2008-07-25 22:13:52 +00003013 goto kw_found;
Tim Peters5ca576e2001-06-18 22:08:13 +00003014 else if (cmp < 0)
3015 goto fail;
3016 }
3017 /* Check errors from Compare */
3018 if (PyErr_Occurred())
3019 goto fail;
3020 if (j >= co->co_argcount) {
3021 if (kwdict == NULL) {
Benjamin Petersone18ef192009-01-20 14:21:16 +00003022 PyObject *kwd_str = kwd_as_string(keyword);
3023 if (kwd_str) {
3024 PyErr_Format(PyExc_TypeError,
3025 "%.200s() got an unexpected "
3026 "keyword argument '%.400s'",
3027 PyString_AsString(co->co_name),
3028 PyString_AsString(kwd_str));
3029 Py_DECREF(kwd_str);
3030 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003031 goto fail;
3032 }
3033 PyDict_SetItem(kwdict, keyword, value);
Antoine Pitrouc2cc80c2008-07-25 22:13:52 +00003034 continue;
Tim Peters5ca576e2001-06-18 22:08:13 +00003035 }
Antoine Pitrouc2cc80c2008-07-25 22:13:52 +00003036kw_found:
3037 if (GETLOCAL(j) != NULL) {
Benjamin Petersone18ef192009-01-20 14:21:16 +00003038 PyObject *kwd_str = kwd_as_string(keyword);
3039 if (kwd_str) {
3040 PyErr_Format(PyExc_TypeError,
3041 "%.200s() got multiple "
3042 "values for keyword "
3043 "argument '%.400s'",
3044 PyString_AsString(co->co_name),
3045 PyString_AsString(kwd_str));
3046 Py_DECREF(kwd_str);
3047 }
Antoine Pitrouc2cc80c2008-07-25 22:13:52 +00003048 goto fail;
Tim Peters5ca576e2001-06-18 22:08:13 +00003049 }
Antoine Pitrouc2cc80c2008-07-25 22:13:52 +00003050 Py_INCREF(value);
3051 SETLOCAL(j, value);
Tim Peters5ca576e2001-06-18 22:08:13 +00003052 }
3053 if (argcount < co->co_argcount) {
3054 int m = co->co_argcount - defcount;
3055 for (i = argcount; i < m; i++) {
3056 if (GETLOCAL(i) == NULL) {
3057 PyErr_Format(PyExc_TypeError,
3058 "%.200s() takes %s %d "
3059 "%sargument%s (%d given)",
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003060 PyString_AsString(co->co_name),
Tim Peters5ca576e2001-06-18 22:08:13 +00003061 ((co->co_flags & CO_VARARGS) ||
3062 defcount) ? "at least"
3063 : "exactly",
3064 m, kwcount ? "non-keyword " : "",
3065 m == 1 ? "" : "s", i);
3066 goto fail;
3067 }
3068 }
3069 if (n > m)
3070 i = n - m;
3071 else
3072 i = 0;
3073 for (; i < defcount; i++) {
3074 if (GETLOCAL(m+i) == NULL) {
3075 PyObject *def = defs[i];
3076 Py_INCREF(def);
3077 SETLOCAL(m+i, def);
3078 }
3079 }
3080 }
3081 }
3082 else {
3083 if (argcount > 0 || kwcount > 0) {
3084 PyErr_Format(PyExc_TypeError,
3085 "%.200s() takes no arguments (%d given)",
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003086 PyString_AsString(co->co_name),
Tim Peters5ca576e2001-06-18 22:08:13 +00003087 argcount + kwcount);
3088 goto fail;
3089 }
3090 }
3091 /* Allocate and initialize storage for cell vars, and copy free
3092 vars into frame. This isn't too efficient right now. */
Richard Jonescebbefc2006-05-23 18:28:17 +00003093 if (PyTuple_GET_SIZE(co->co_cellvars)) {
Neal Norwitz245ce8d2006-06-12 02:16:10 +00003094 int i, j, nargs, found;
Tim Peters5ca576e2001-06-18 22:08:13 +00003095 char *cellname, *argname;
3096 PyObject *c;
3097
3098 nargs = co->co_argcount;
3099 if (co->co_flags & CO_VARARGS)
3100 nargs++;
3101 if (co->co_flags & CO_VARKEYWORDS)
3102 nargs++;
3103
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003104 /* Initialize each cell var, taking into account
3105 cell vars that are initialized from arguments.
3106
3107 Should arrange for the compiler to put cellvars
3108 that are arguments at the beginning of the cellvars
3109 list so that we can march over it more efficiently?
3110 */
Richard Jonescebbefc2006-05-23 18:28:17 +00003111 for (i = 0; i < PyTuple_GET_SIZE(co->co_cellvars); ++i) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003112 cellname = PyString_AS_STRING(
Tim Peters5ca576e2001-06-18 22:08:13 +00003113 PyTuple_GET_ITEM(co->co_cellvars, i));
3114 found = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003115 for (j = 0; j < nargs; j++) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003116 argname = PyString_AS_STRING(
Tim Peters5ca576e2001-06-18 22:08:13 +00003117 PyTuple_GET_ITEM(co->co_varnames, j));
3118 if (strcmp(cellname, argname) == 0) {
3119 c = PyCell_New(GETLOCAL(j));
3120 if (c == NULL)
3121 goto fail;
Richard Jonescebbefc2006-05-23 18:28:17 +00003122 GETLOCAL(co->co_nlocals + i) = c;
Tim Peters5ca576e2001-06-18 22:08:13 +00003123 found = 1;
3124 break;
3125 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003126 }
3127 if (found == 0) {
3128 c = PyCell_New(NULL);
3129 if (c == NULL)
3130 goto fail;
Richard Jonescebbefc2006-05-23 18:28:17 +00003131 SETLOCAL(co->co_nlocals + i, c);
Tim Peters5ca576e2001-06-18 22:08:13 +00003132 }
3133 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003134 }
Richard Jonescebbefc2006-05-23 18:28:17 +00003135 if (PyTuple_GET_SIZE(co->co_freevars)) {
Tim Peters5ca576e2001-06-18 22:08:13 +00003136 int i;
Richard Jonescebbefc2006-05-23 18:28:17 +00003137 for (i = 0; i < PyTuple_GET_SIZE(co->co_freevars); ++i) {
Tim Peters5ca576e2001-06-18 22:08:13 +00003138 PyObject *o = PyTuple_GET_ITEM(closure, i);
3139 Py_INCREF(o);
Richard Jonescebbefc2006-05-23 18:28:17 +00003140 freevars[PyTuple_GET_SIZE(co->co_cellvars) + i] = o;
Tim Peters5ca576e2001-06-18 22:08:13 +00003141 }
3142 }
3143
Tim Peters5ca576e2001-06-18 22:08:13 +00003144 if (co->co_flags & CO_GENERATOR) {
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00003145 /* Don't need to keep the reference to f_back, it will be set
3146 * when the generator is resumed. */
Tim Peters5ba58662001-07-16 02:29:45 +00003147 Py_XDECREF(f->f_back);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00003148 f->f_back = NULL;
3149
Jeremy Hylton985eba52003-02-05 23:13:00 +00003150 PCALL(PCALL_GENERATOR);
3151
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00003152 /* Create a new generator that owns the ready to run frame
3153 * and return that as the value. */
Martin v. Löwise440e472004-06-01 15:22:42 +00003154 return PyGen_New(f);
Tim Peters5ca576e2001-06-18 22:08:13 +00003155 }
3156
Thomas Woutersae406c62007-09-19 17:27:43 +00003157 retval = PyEval_EvalFrameEx(f,0);
Tim Peters5ca576e2001-06-18 22:08:13 +00003158
Thomas Woutersae406c62007-09-19 17:27:43 +00003159fail: /* Jump here from prelude on failure */
Tim Peters5ca576e2001-06-18 22:08:13 +00003160
Tim Petersb13680b2001-11-27 23:29:29 +00003161 /* decref'ing the frame can cause __del__ methods to get invoked,
3162 which can call back into Python. While we're done with the
3163 current Python frame (f), the associated C stack is still in use,
3164 so recursion_depth must be boosted for the duration.
3165 */
3166 assert(tstate != NULL);
3167 ++tstate->recursion_depth;
Thomas Woutersae406c62007-09-19 17:27:43 +00003168 Py_DECREF(f);
Tim Petersb13680b2001-11-27 23:29:29 +00003169 --tstate->recursion_depth;
Tim Peters5ca576e2001-06-18 22:08:13 +00003170 return retval;
3171}
3172
3173
Benjamin Peterson78821dd2009-01-25 17:15:10 +00003174
Benjamin Petersone18ef192009-01-20 14:21:16 +00003175static PyObject *
3176kwd_as_string(PyObject *kwd) {
Benjamin Peterson78821dd2009-01-25 17:15:10 +00003177#ifdef Py_USING_UNICODE
Benjamin Petersone18ef192009-01-20 14:21:16 +00003178 if (PyString_Check(kwd)) {
Benjamin Peterson78821dd2009-01-25 17:15:10 +00003179#else
3180 assert(PyString_Check(kwd));
3181#endif
Benjamin Petersone18ef192009-01-20 14:21:16 +00003182 Py_INCREF(kwd);
3183 return kwd;
Benjamin Peterson78821dd2009-01-25 17:15:10 +00003184#ifdef Py_USING_UNICODE
Benjamin Petersone18ef192009-01-20 14:21:16 +00003185 }
Benjamin Peterson78821dd2009-01-25 17:15:10 +00003186 return _PyUnicode_AsDefaultEncodedString(kwd, "replace");
3187#endif
Benjamin Petersone18ef192009-01-20 14:21:16 +00003188}
3189
3190
Guido van Rossumc9fbb722003-03-01 03:36:33 +00003191/* Implementation notes for set_exc_info() and reset_exc_info():
3192
3193- Below, 'exc_ZZZ' stands for 'exc_type', 'exc_value' and
3194 'exc_traceback'. These always travel together.
3195
3196- tstate->curexc_ZZZ is the "hot" exception that is set by
3197 PyErr_SetString(), cleared by PyErr_Clear(), and so on.
3198
3199- Once an exception is caught by an except clause, it is transferred
3200 from tstate->curexc_ZZZ to tstate->exc_ZZZ, from which sys.exc_info()
3201 can pick it up. This is the primary task of set_exc_info().
Tim Peters7df5e7f2006-05-26 23:14:37 +00003202 XXX That can't be right: set_exc_info() doesn't look at tstate->curexc_ZZZ.
Guido van Rossumc9fbb722003-03-01 03:36:33 +00003203
3204- Now let me explain the complicated dance with frame->f_exc_ZZZ.
3205
3206 Long ago, when none of this existed, there were just a few globals:
3207 one set corresponding to the "hot" exception, and one set
3208 corresponding to sys.exc_ZZZ. (Actually, the latter weren't C
3209 globals; they were simply stored as sys.exc_ZZZ. For backwards
3210 compatibility, they still are!) The problem was that in code like
3211 this:
3212
3213 try:
3214 "something that may fail"
3215 except "some exception":
3216 "do something else first"
3217 "print the exception from sys.exc_ZZZ."
3218
3219 if "do something else first" invoked something that raised and caught
3220 an exception, sys.exc_ZZZ were overwritten. That was a frequent
3221 cause of subtle bugs. I fixed this by changing the semantics as
3222 follows:
3223
3224 - Within one frame, sys.exc_ZZZ will hold the last exception caught
3225 *in that frame*.
3226
3227 - But initially, and as long as no exception is caught in a given
3228 frame, sys.exc_ZZZ will hold the last exception caught in the
3229 previous frame (or the frame before that, etc.).
3230
3231 The first bullet fixed the bug in the above example. The second
3232 bullet was for backwards compatibility: it was (and is) common to
3233 have a function that is called when an exception is caught, and to
3234 have that function access the caught exception via sys.exc_ZZZ.
3235 (Example: traceback.print_exc()).
3236
3237 At the same time I fixed the problem that sys.exc_ZZZ weren't
3238 thread-safe, by introducing sys.exc_info() which gets it from tstate;
3239 but that's really a separate improvement.
3240
3241 The reset_exc_info() function in ceval.c restores the tstate->exc_ZZZ
3242 variables to what they were before the current frame was called. The
3243 set_exc_info() function saves them on the frame so that
3244 reset_exc_info() can restore them. The invariant is that
3245 frame->f_exc_ZZZ is NULL iff the current frame never caught an
3246 exception (where "catching" an exception applies only to successful
3247 except clauses); and if the current frame ever caught an exception,
3248 frame->f_exc_ZZZ is the exception that was stored in tstate->exc_ZZZ
3249 at the start of the current frame.
3250
3251*/
3252
Fredrik Lundh7a830892006-05-27 10:39:48 +00003253static void
Guido van Rossumac7be682001-01-17 15:42:30 +00003254set_exc_info(PyThreadState *tstate,
3255 PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00003256{
Tim Peters7df5e7f2006-05-26 23:14:37 +00003257 PyFrameObject *frame = tstate->frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00003258 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00003259
Tim Peters7df5e7f2006-05-26 23:14:37 +00003260 assert(type != NULL);
3261 assert(frame != NULL);
Guido van Rossuma027efa1997-05-05 20:56:21 +00003262 if (frame->f_exc_type == NULL) {
Tim Peters7df5e7f2006-05-26 23:14:37 +00003263 assert(frame->f_exc_value == NULL);
3264 assert(frame->f_exc_traceback == NULL);
3265 /* This frame didn't catch an exception before. */
3266 /* Save previous exception of this thread in this frame. */
Guido van Rossuma027efa1997-05-05 20:56:21 +00003267 if (tstate->exc_type == NULL) {
Tim Peters7df5e7f2006-05-26 23:14:37 +00003268 /* XXX Why is this set to Py_None? */
Guido van Rossuma027efa1997-05-05 20:56:21 +00003269 Py_INCREF(Py_None);
3270 tstate->exc_type = Py_None;
3271 }
Tim Peters7df5e7f2006-05-26 23:14:37 +00003272 Py_INCREF(tstate->exc_type);
Guido van Rossuma027efa1997-05-05 20:56:21 +00003273 Py_XINCREF(tstate->exc_value);
3274 Py_XINCREF(tstate->exc_traceback);
3275 frame->f_exc_type = tstate->exc_type;
3276 frame->f_exc_value = tstate->exc_value;
3277 frame->f_exc_traceback = tstate->exc_traceback;
3278 }
Tim Peters7df5e7f2006-05-26 23:14:37 +00003279 /* Set new exception for this thread. */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00003280 tmp_type = tstate->exc_type;
3281 tmp_value = tstate->exc_value;
3282 tmp_tb = tstate->exc_traceback;
Tim Peters7df5e7f2006-05-26 23:14:37 +00003283 Py_INCREF(type);
Guido van Rossuma027efa1997-05-05 20:56:21 +00003284 Py_XINCREF(value);
3285 Py_XINCREF(tb);
3286 tstate->exc_type = type;
3287 tstate->exc_value = value;
3288 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00003289 Py_XDECREF(tmp_type);
3290 Py_XDECREF(tmp_value);
3291 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00003292 /* For b/w compatibility */
3293 PySys_SetObject("exc_type", type);
3294 PySys_SetObject("exc_value", value);
3295 PySys_SetObject("exc_traceback", tb);
3296}
3297
Fredrik Lundh7a830892006-05-27 10:39:48 +00003298static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003299reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00003300{
3301 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00003302 PyObject *tmp_type, *tmp_value, *tmp_tb;
Tim Peters7df5e7f2006-05-26 23:14:37 +00003303
3304 /* It's a precondition that the thread state's frame caught an
3305 * exception -- verify in a debug build.
3306 */
3307 assert(tstate != NULL);
Guido van Rossuma027efa1997-05-05 20:56:21 +00003308 frame = tstate->frame;
Tim Peters7df5e7f2006-05-26 23:14:37 +00003309 assert(frame != NULL);
3310 assert(frame->f_exc_type != NULL);
3311
3312 /* Copy the frame's exception info back to the thread state. */
3313 tmp_type = tstate->exc_type;
3314 tmp_value = tstate->exc_value;
3315 tmp_tb = tstate->exc_traceback;
3316 Py_INCREF(frame->f_exc_type);
3317 Py_XINCREF(frame->f_exc_value);
3318 Py_XINCREF(frame->f_exc_traceback);
3319 tstate->exc_type = frame->f_exc_type;
3320 tstate->exc_value = frame->f_exc_value;
3321 tstate->exc_traceback = frame->f_exc_traceback;
3322 Py_XDECREF(tmp_type);
3323 Py_XDECREF(tmp_value);
3324 Py_XDECREF(tmp_tb);
3325
3326 /* For b/w compatibility */
3327 PySys_SetObject("exc_type", frame->f_exc_type);
3328 PySys_SetObject("exc_value", frame->f_exc_value);
3329 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
3330
3331 /* Clear the frame's exception info. */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00003332 tmp_type = frame->f_exc_type;
3333 tmp_value = frame->f_exc_value;
3334 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00003335 frame->f_exc_type = NULL;
3336 frame->f_exc_value = NULL;
3337 frame->f_exc_traceback = NULL;
Tim Peters7df5e7f2006-05-26 23:14:37 +00003338 Py_DECREF(tmp_type);
Guido van Rossumdf4c3081997-05-20 17:06:11 +00003339 Py_XDECREF(tmp_value);
3340 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00003341}
3342
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003343/* Logic for the raise statement (too complicated for inlining).
3344 This *consumes* a reference count to each of its arguments. */
Fredrik Lundh7a830892006-05-27 10:39:48 +00003345static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003346do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003347{
Guido van Rossumd295f121998-04-09 21:39:57 +00003348 if (type == NULL) {
3349 /* Reraise */
Nicholas Bastine5662ae2004-03-24 22:22:12 +00003350 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossumd295f121998-04-09 21:39:57 +00003351 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
3352 value = tstate->exc_value;
3353 tb = tstate->exc_traceback;
3354 Py_XINCREF(type);
3355 Py_XINCREF(value);
3356 Py_XINCREF(tb);
3357 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003358
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003359 /* We support the following forms of raise:
3360 raise <class>, <classinstance>
3361 raise <class>, <argument tuple>
3362 raise <class>, None
3363 raise <class>, <argument>
3364 raise <classinstance>, None
3365 raise <string>, <object>
3366 raise <string>, None
3367
3368 An omitted second argument is the same as None.
3369
3370 In addition, raise <tuple>, <anything> is the same as
3371 raising the tuple's first item (and it better have one!);
3372 this rule is applied recursively.
3373
3374 Finally, an optional third argument can be supplied, which
3375 gives the traceback to be substituted (useful when
3376 re-raising an exception after examining it). */
3377
3378 /* First, check the traceback argument, replacing None with
3379 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00003380 if (tb == Py_None) {
3381 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003382 tb = NULL;
3383 }
3384 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003385 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003386 "raise: arg 3 must be a traceback or None");
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003387 goto raise_error;
3388 }
3389
3390 /* Next, replace a missing value with None */
3391 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003392 value = Py_None;
3393 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003394 }
3395
3396 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00003397 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
3398 PyObject *tmp = type;
3399 type = PyTuple_GET_ITEM(type, 0);
3400 Py_INCREF(type);
3401 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003402 }
3403
Brett Cannon129bd522007-01-30 21:34:36 +00003404 if (PyExceptionClass_Check(type))
Barry Warsaw4249f541997-08-22 21:26:19 +00003405 PyErr_NormalizeException(&type, &value, &tb);
3406
Brett Cannonbf364092006-03-01 04:25:17 +00003407 else if (PyExceptionInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003408 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00003409 if (value != Py_None) {
3410 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003411 "instance exception may not have a separate value");
3412 goto raise_error;
3413 }
3414 else {
3415 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00003416 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003417 value = type;
Brett Cannonbf364092006-03-01 04:25:17 +00003418 type = PyExceptionInstance_Class(type);
Guido van Rossumb209a111997-04-29 18:18:01 +00003419 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003420 }
3421 }
3422 else {
3423 /* Not something you can raise. You get an exception
3424 anyway, just not what you specified :-) */
Jeremy Hylton960d9482001-04-27 02:25:33 +00003425 PyErr_Format(PyExc_TypeError,
Benjamin Petersonf19a7b92008-04-27 18:40:21 +00003426 "exceptions must be classes or instances, not %s",
3427 type->ob_type->tp_name);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003428 goto raise_error;
3429 }
Guido van Rossum504153d2008-03-18 04:26:48 +00003430
3431 assert(PyExceptionClass_Check(type));
3432 if (Py_Py3kWarningFlag && PyClass_Check(type)) {
Benjamin Peterson9f4f4812008-04-27 03:01:45 +00003433 if (PyErr_WarnEx(PyExc_DeprecationWarning,
Benjamin Petersonf19a7b92008-04-27 18:40:21 +00003434 "exceptions must derive from BaseException "
3435 "in 3.x", 1) < 0)
Guido van Rossum504153d2008-03-18 04:26:48 +00003436 goto raise_error;
3437 }
3438
Guido van Rossumb209a111997-04-29 18:18:01 +00003439 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003440 if (tb == NULL)
3441 return WHY_EXCEPTION;
3442 else
3443 return WHY_RERAISE;
3444 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00003445 Py_XDECREF(value);
3446 Py_XDECREF(type);
3447 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00003448 return WHY_EXCEPTION;
3449}
3450
Tim Petersd6d010b2001-06-21 02:49:55 +00003451/* Iterate v argcnt times and store the results on the stack (via decreasing
3452 sp). Return 1 for success, 0 if error. */
3453
Fredrik Lundh7a830892006-05-27 10:39:48 +00003454static int
Tim Petersd6d010b2001-06-21 02:49:55 +00003455unpack_iterable(PyObject *v, int argcnt, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00003456{
Tim Petersd6d010b2001-06-21 02:49:55 +00003457 int i = 0;
3458 PyObject *it; /* iter(v) */
Barry Warsawe42b18f1997-08-25 22:13:04 +00003459 PyObject *w;
Guido van Rossumac7be682001-01-17 15:42:30 +00003460
Tim Petersd6d010b2001-06-21 02:49:55 +00003461 assert(v != NULL);
3462
3463 it = PyObject_GetIter(v);
3464 if (it == NULL)
3465 goto Error;
3466
3467 for (; i < argcnt; i++) {
3468 w = PyIter_Next(it);
3469 if (w == NULL) {
3470 /* Iterator done, via error or exhaustion. */
3471 if (!PyErr_Occurred()) {
3472 PyErr_Format(PyExc_ValueError,
3473 "need more than %d value%s to unpack",
3474 i, i == 1 ? "" : "s");
3475 }
3476 goto Error;
Barry Warsawe42b18f1997-08-25 22:13:04 +00003477 }
3478 *--sp = w;
3479 }
Tim Petersd6d010b2001-06-21 02:49:55 +00003480
3481 /* We better have exhausted the iterator now. */
3482 w = PyIter_Next(it);
3483 if (w == NULL) {
3484 if (PyErr_Occurred())
3485 goto Error;
3486 Py_DECREF(it);
3487 return 1;
Barry Warsawe42b18f1997-08-25 22:13:04 +00003488 }
Guido van Rossumbb8f59a2001-12-03 19:33:25 +00003489 Py_DECREF(w);
Tim Petersd6d010b2001-06-21 02:49:55 +00003490 PyErr_SetString(PyExc_ValueError, "too many values to unpack");
Barry Warsawe42b18f1997-08-25 22:13:04 +00003491 /* fall through */
Tim Petersd6d010b2001-06-21 02:49:55 +00003492Error:
Barry Warsaw91010551997-08-25 22:30:51 +00003493 for (; i > 0; i--, sp++)
3494 Py_DECREF(*sp);
Tim Petersd6d010b2001-06-21 02:49:55 +00003495 Py_XDECREF(it);
Barry Warsawe42b18f1997-08-25 22:13:04 +00003496 return 0;
3497}
3498
3499
Guido van Rossum96a42c81992-01-12 02:29:51 +00003500#ifdef LLTRACE
Fredrik Lundh7a830892006-05-27 10:39:48 +00003501static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003502prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003503{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003504 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00003505 if (PyObject_Print(v, stdout, 0) != 0)
3506 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00003507 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00003508 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003509}
Guido van Rossum3f5da241990-12-20 15:06:42 +00003510#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003511
Fredrik Lundh7a830892006-05-27 10:39:48 +00003512static void
Fred Drake5755ce62001-06-27 19:19:46 +00003513call_exc_trace(Py_tracefunc func, PyObject *self, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00003514{
Guido van Rossumb209a111997-04-29 18:18:01 +00003515 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00003516 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00003517 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00003518 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003519 value = Py_None;
3520 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00003521 }
Raymond Hettinger8ae46892003-10-12 19:09:37 +00003522 arg = PyTuple_Pack(3, type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003523 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003524 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003525 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00003526 }
Fred Drake5755ce62001-06-27 19:19:46 +00003527 err = call_trace(func, self, f, PyTrace_EXCEPTION, arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00003528 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003529 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00003530 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003531 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00003532 Py_XDECREF(type);
3533 Py_XDECREF(value);
3534 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00003535 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00003536}
3537
Amaury Forgeot d'Arc0d75f092007-11-13 21:54:28 +00003538static int
Fred Drake4ec5d562001-10-04 19:26:43 +00003539call_trace_protected(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
Armin Rigo1c2d7e52005-09-20 18:34:01 +00003540 int what, PyObject *arg)
Fred Drake4ec5d562001-10-04 19:26:43 +00003541{
3542 PyObject *type, *value, *traceback;
3543 int err;
3544 PyErr_Fetch(&type, &value, &traceback);
Armin Rigo1c2d7e52005-09-20 18:34:01 +00003545 err = call_trace(func, obj, frame, what, arg);
Fred Drake4ec5d562001-10-04 19:26:43 +00003546 if (err == 0)
Amaury Forgeot d'Arc0d75f092007-11-13 21:54:28 +00003547 {
Fred Drake4ec5d562001-10-04 19:26:43 +00003548 PyErr_Restore(type, value, traceback);
Amaury Forgeot d'Arc0d75f092007-11-13 21:54:28 +00003549 return 0;
3550 }
Fred Drake4ec5d562001-10-04 19:26:43 +00003551 else {
3552 Py_XDECREF(type);
3553 Py_XDECREF(value);
3554 Py_XDECREF(traceback);
Amaury Forgeot d'Arc0d75f092007-11-13 21:54:28 +00003555 return -1;
Fred Drake4ec5d562001-10-04 19:26:43 +00003556 }
3557}
3558
Fredrik Lundh7a830892006-05-27 10:39:48 +00003559static int
Fred Drake5755ce62001-06-27 19:19:46 +00003560call_trace(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
3561 int what, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00003562{
Fred Drake5755ce62001-06-27 19:19:46 +00003563 register PyThreadState *tstate = frame->f_tstate;
3564 int result;
3565 if (tstate->tracing)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00003566 return 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +00003567 tstate->tracing++;
Fred Drake9e3ad782001-07-03 23:39:52 +00003568 tstate->use_tracing = 0;
Fred Drake5755ce62001-06-27 19:19:46 +00003569 result = func(obj, frame, what, arg);
Fred Drake9e3ad782001-07-03 23:39:52 +00003570 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
3571 || (tstate->c_profilefunc != NULL));
Guido van Rossuma027efa1997-05-05 20:56:21 +00003572 tstate->tracing--;
Fred Drake5755ce62001-06-27 19:19:46 +00003573 return result;
Guido van Rossum96a42c81992-01-12 02:29:51 +00003574}
3575
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00003576PyObject *
3577_PyEval_CallTracing(PyObject *func, PyObject *args)
3578{
3579 PyFrameObject *frame = PyEval_GetFrame();
3580 PyThreadState *tstate = frame->f_tstate;
3581 int save_tracing = tstate->tracing;
3582 int save_use_tracing = tstate->use_tracing;
3583 PyObject *result;
3584
3585 tstate->tracing = 0;
3586 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
3587 || (tstate->c_profilefunc != NULL));
3588 result = PyObject_Call(func, args, NULL);
3589 tstate->tracing = save_tracing;
3590 tstate->use_tracing = save_use_tracing;
3591 return result;
3592}
3593
Fredrik Lundh7a830892006-05-27 10:39:48 +00003594static int
Tim Peters8a5c3c72004-04-05 19:36:21 +00003595maybe_call_line_trace(Py_tracefunc func, PyObject *obj,
Armin Rigobf57a142004-03-22 19:24:58 +00003596 PyFrameObject *frame, int *instr_lb, int *instr_ub,
3597 int *instr_prev)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003598{
Michael W. Hudson006c7522002-11-08 13:08:46 +00003599 int result = 0;
3600
Jeremy Hyltona4ebc132006-04-18 14:47:00 +00003601 /* If the last instruction executed isn't in the current
3602 instruction window, reset the window. If the last
3603 instruction happens to fall at the start of a line or if it
3604 represents a jump backwards, call the trace function.
3605 */
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00003606 if ((frame->f_lasti < *instr_lb || frame->f_lasti >= *instr_ub)) {
Thomas Woutersae406c62007-09-19 17:27:43 +00003607 int line;
3608 PyAddrPair bounds;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003609
Thomas Woutersae406c62007-09-19 17:27:43 +00003610 line = PyCode_CheckLineNumber(frame->f_code, frame->f_lasti,
3611 &bounds);
3612 if (line >= 0) {
Michael W. Hudson02ff6a92002-09-11 15:36:32 +00003613 frame->f_lineno = line;
Tim Peters8a5c3c72004-04-05 19:36:21 +00003614 result = call_trace(func, obj, frame,
Michael W. Hudson006c7522002-11-08 13:08:46 +00003615 PyTrace_LINE, Py_None);
Thomas Woutersae406c62007-09-19 17:27:43 +00003616 }
3617 *instr_lb = bounds.ap_lower;
3618 *instr_ub = bounds.ap_upper;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003619 }
Armin Rigobf57a142004-03-22 19:24:58 +00003620 else if (frame->f_lasti <= *instr_prev) {
Jeremy Hyltona4ebc132006-04-18 14:47:00 +00003621 result = call_trace(func, obj, frame, PyTrace_LINE, Py_None);
Armin Rigobf57a142004-03-22 19:24:58 +00003622 }
3623 *instr_prev = frame->f_lasti;
Michael W. Hudson006c7522002-11-08 13:08:46 +00003624 return result;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003625}
3626
Fred Drake5755ce62001-06-27 19:19:46 +00003627void
3628PyEval_SetProfile(Py_tracefunc func, PyObject *arg)
Fred Draked0838392001-06-16 21:02:31 +00003629{
Nicholas Bastine5662ae2004-03-24 22:22:12 +00003630 PyThreadState *tstate = PyThreadState_GET();
Fred Drake5755ce62001-06-27 19:19:46 +00003631 PyObject *temp = tstate->c_profileobj;
3632 Py_XINCREF(arg);
3633 tstate->c_profilefunc = NULL;
3634 tstate->c_profileobj = NULL;
Brett Cannon55fa66d2005-06-25 07:07:35 +00003635 /* Must make sure that tracing is not ignored if 'temp' is freed */
Fred Drake9e3ad782001-07-03 23:39:52 +00003636 tstate->use_tracing = tstate->c_tracefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00003637 Py_XDECREF(temp);
3638 tstate->c_profilefunc = func;
3639 tstate->c_profileobj = arg;
Brett Cannon55fa66d2005-06-25 07:07:35 +00003640 /* Flag that tracing or profiling is turned on */
Fred Drake9e3ad782001-07-03 23:39:52 +00003641 tstate->use_tracing = (func != NULL) || (tstate->c_tracefunc != NULL);
Fred Drake5755ce62001-06-27 19:19:46 +00003642}
3643
3644void
3645PyEval_SetTrace(Py_tracefunc func, PyObject *arg)
3646{
Nicholas Bastine5662ae2004-03-24 22:22:12 +00003647 PyThreadState *tstate = PyThreadState_GET();
Fred Drake5755ce62001-06-27 19:19:46 +00003648 PyObject *temp = tstate->c_traceobj;
Jeffrey Yasskinfd8a1ec2008-12-03 06:46:45 +00003649 _Py_TracingPossible += (func != NULL) - (tstate->c_tracefunc != NULL);
Fred Drake5755ce62001-06-27 19:19:46 +00003650 Py_XINCREF(arg);
3651 tstate->c_tracefunc = NULL;
3652 tstate->c_traceobj = NULL;
Brett Cannon55fa66d2005-06-25 07:07:35 +00003653 /* Must make sure that profiling is not ignored if 'temp' is freed */
Fred Drake9e3ad782001-07-03 23:39:52 +00003654 tstate->use_tracing = tstate->c_profilefunc != NULL;
Fred Drake5755ce62001-06-27 19:19:46 +00003655 Py_XDECREF(temp);
3656 tstate->c_tracefunc = func;
3657 tstate->c_traceobj = arg;
Brett Cannon55fa66d2005-06-25 07:07:35 +00003658 /* Flag that tracing or profiling is turned on */
Fred Drake9e3ad782001-07-03 23:39:52 +00003659 tstate->use_tracing = ((func != NULL)
3660 || (tstate->c_profilefunc != NULL));
Fred Draked0838392001-06-16 21:02:31 +00003661}
3662
Guido van Rossumb209a111997-04-29 18:18:01 +00003663PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003664PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00003665{
Guido van Rossum6297a7a2003-02-19 15:53:17 +00003666 PyFrameObject *current_frame = PyEval_GetFrame();
Guido van Rossum6135a871995-01-09 17:53:26 +00003667 if (current_frame == NULL)
Nicholas Bastine5662ae2004-03-24 22:22:12 +00003668 return PyThreadState_GET()->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00003669 else
3670 return current_frame->f_builtins;
3671}
3672
Guido van Rossumb209a111997-04-29 18:18:01 +00003673PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003674PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00003675{
Guido van Rossum6297a7a2003-02-19 15:53:17 +00003676 PyFrameObject *current_frame = PyEval_GetFrame();
Guido van Rossum5b722181993-03-30 17:46:03 +00003677 if (current_frame == NULL)
3678 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00003679 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00003680 return current_frame->f_locals;
3681}
3682
Guido van Rossumb209a111997-04-29 18:18:01 +00003683PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003684PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003685{
Guido van Rossum6297a7a2003-02-19 15:53:17 +00003686 PyFrameObject *current_frame = PyEval_GetFrame();
Guido van Rossum3f5da241990-12-20 15:06:42 +00003687 if (current_frame == NULL)
3688 return NULL;
3689 else
3690 return current_frame->f_globals;
3691}
3692
Guido van Rossum6297a7a2003-02-19 15:53:17 +00003693PyFrameObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003694PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00003695{
Nicholas Bastine5662ae2004-03-24 22:22:12 +00003696 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossum6297a7a2003-02-19 15:53:17 +00003697 return _PyThreadState_GetFrame(tstate);
Guido van Rossume59214e1994-08-30 08:01:59 +00003698}
3699
Guido van Rossum6135a871995-01-09 17:53:26 +00003700int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003701PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00003702{
Guido van Rossum6297a7a2003-02-19 15:53:17 +00003703 PyFrameObject *current_frame = PyEval_GetFrame();
Neal Norwitzb9845e72006-06-12 02:11:18 +00003704 return current_frame == NULL ? 0 : PyFrame_IsRestricted(current_frame);
Guido van Rossum6135a871995-01-09 17:53:26 +00003705}
3706
Guido van Rossumbe270261997-05-22 22:26:18 +00003707int
Tim Peters5ba58662001-07-16 02:29:45 +00003708PyEval_MergeCompilerFlags(PyCompilerFlags *cf)
Jeremy Hylton061d1062001-03-22 02:32:48 +00003709{
Guido van Rossum6297a7a2003-02-19 15:53:17 +00003710 PyFrameObject *current_frame = PyEval_GetFrame();
Just van Rossum3aaf42c2003-02-10 08:21:10 +00003711 int result = cf->cf_flags != 0;
Tim Peters5ba58662001-07-16 02:29:45 +00003712
3713 if (current_frame != NULL) {
3714 const int codeflags = current_frame->f_code->co_flags;
Tim Peterse2c18e92001-08-17 20:47:47 +00003715 const int compilerflags = codeflags & PyCF_MASK;
3716 if (compilerflags) {
Tim Peters5ba58662001-07-16 02:29:45 +00003717 result = 1;
Tim Peterse2c18e92001-08-17 20:47:47 +00003718 cf->cf_flags |= compilerflags;
Tim Peters5ba58662001-07-16 02:29:45 +00003719 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00003720#if 0 /* future keyword */
Martin v. Löwis7198a522002-01-01 19:59:11 +00003721 if (codeflags & CO_GENERATOR_ALLOWED) {
3722 result = 1;
3723 cf->cf_flags |= CO_GENERATOR_ALLOWED;
3724 }
Neil Schemenauerc24ea082002-03-22 23:53:36 +00003725#endif
Tim Peters5ba58662001-07-16 02:29:45 +00003726 }
3727 return result;
Jeremy Hylton061d1062001-03-22 02:32:48 +00003728}
3729
3730int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003731Py_FlushLine(void)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003732{
Guido van Rossumb209a111997-04-29 18:18:01 +00003733 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00003734 if (f == NULL)
3735 return 0;
3736 if (!PyFile_SoftSpace(f, 0))
3737 return 0;
3738 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003739}
3740
Guido van Rossum3f5da241990-12-20 15:06:42 +00003741
Guido van Rossum681d79a1995-07-18 14:51:37 +00003742/* External interface to call any callable object.
3743 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00003744
Guido van Rossumd7ed6831997-08-30 15:02:50 +00003745#undef PyEval_CallObject
3746/* for backward compatibility: export this interface */
3747
Guido van Rossumb209a111997-04-29 18:18:01 +00003748PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003749PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00003750{
Guido van Rossumb209a111997-04-29 18:18:01 +00003751 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003752}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00003753#define PyEval_CallObject(func,arg) \
3754 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00003755
Guido van Rossumb209a111997-04-29 18:18:01 +00003756PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003757PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003758{
Jeremy Hylton52820442001-01-03 23:52:36 +00003759 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003760
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00003761 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003762 arg = PyTuple_New(0);
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00003763 if (arg == NULL)
3764 return NULL;
3765 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003766 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003767 PyErr_SetString(PyExc_TypeError,
3768 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00003769 return NULL;
3770 }
3771 else
Guido van Rossumb209a111997-04-29 18:18:01 +00003772 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003773
Guido van Rossumb209a111997-04-29 18:18:01 +00003774 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003775 PyErr_SetString(PyExc_TypeError,
3776 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00003777 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00003778 return NULL;
3779 }
3780
Tim Peters6d6c1a32001-08-02 04:15:00 +00003781 result = PyObject_Call(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00003782 Py_DECREF(arg);
Jeremy Hylton52820442001-01-03 23:52:36 +00003783 return result;
3784}
3785
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00003786const char *
Tim Peters6d6c1a32001-08-02 04:15:00 +00003787PyEval_GetFuncName(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00003788{
3789 if (PyMethod_Check(func))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003790 return PyEval_GetFuncName(PyMethod_GET_FUNCTION(func));
Jeremy Hylton512a2372001-04-11 13:52:29 +00003791 else if (PyFunction_Check(func))
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003792 return PyString_AsString(((PyFunctionObject*)func)->func_name);
Jeremy Hylton512a2372001-04-11 13:52:29 +00003793 else if (PyCFunction_Check(func))
3794 return ((PyCFunctionObject*)func)->m_ml->ml_name;
3795 else if (PyClass_Check(func))
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003796 return PyString_AsString(((PyClassObject*)func)->cl_name);
Jeremy Hylton512a2372001-04-11 13:52:29 +00003797 else if (PyInstance_Check(func)) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003798 return PyString_AsString(
Jeremy Hylton512a2372001-04-11 13:52:29 +00003799 ((PyInstanceObject*)func)->in_class->cl_name);
3800 } else {
3801 return func->ob_type->tp_name;
3802 }
3803}
3804
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00003805const char *
Tim Peters6d6c1a32001-08-02 04:15:00 +00003806PyEval_GetFuncDesc(PyObject *func)
Jeremy Hylton512a2372001-04-11 13:52:29 +00003807{
3808 if (PyMethod_Check(func))
3809 return "()";
3810 else if (PyFunction_Check(func))
3811 return "()";
3812 else if (PyCFunction_Check(func))
3813 return "()";
3814 else if (PyClass_Check(func))
3815 return " constructor";
3816 else if (PyInstance_Check(func)) {
3817 return " instance";
3818 } else {
3819 return " object";
3820 }
3821}
3822
Fredrik Lundh7a830892006-05-27 10:39:48 +00003823static void
Jeremy Hylton192690e2002-08-16 18:36:11 +00003824err_args(PyObject *func, int flags, int nargs)
3825{
3826 if (flags & METH_NOARGS)
Tim Peters8a5c3c72004-04-05 19:36:21 +00003827 PyErr_Format(PyExc_TypeError,
Guido van Rossum86c659a2002-08-23 14:11:35 +00003828 "%.200s() takes no arguments (%d given)",
Tim Peters8a5c3c72004-04-05 19:36:21 +00003829 ((PyCFunctionObject *)func)->m_ml->ml_name,
Jeremy Hylton192690e2002-08-16 18:36:11 +00003830 nargs);
3831 else
Tim Peters8a5c3c72004-04-05 19:36:21 +00003832 PyErr_Format(PyExc_TypeError,
Guido van Rossum86c659a2002-08-23 14:11:35 +00003833 "%.200s() takes exactly one argument (%d given)",
Tim Peters8a5c3c72004-04-05 19:36:21 +00003834 ((PyCFunctionObject *)func)->m_ml->ml_name,
Jeremy Hylton192690e2002-08-16 18:36:11 +00003835 nargs);
3836}
3837
Armin Rigo1c2d7e52005-09-20 18:34:01 +00003838#define C_TRACE(x, call) \
Nicholas Bastind858a772004-06-25 23:31:06 +00003839if (tstate->use_tracing && tstate->c_profilefunc) { \
3840 if (call_trace(tstate->c_profilefunc, \
3841 tstate->c_profileobj, \
3842 tstate->frame, PyTrace_C_CALL, \
Armin Rigo1c2d7e52005-09-20 18:34:01 +00003843 func)) { \
3844 x = NULL; \
3845 } \
3846 else { \
3847 x = call; \
3848 if (tstate->c_profilefunc != NULL) { \
3849 if (x == NULL) { \
3850 call_trace_protected(tstate->c_profilefunc, \
3851 tstate->c_profileobj, \
3852 tstate->frame, PyTrace_C_EXCEPTION, \
3853 func); \
3854 /* XXX should pass (type, value, tb) */ \
3855 } else { \
3856 if (call_trace(tstate->c_profilefunc, \
3857 tstate->c_profileobj, \
3858 tstate->frame, PyTrace_C_RETURN, \
3859 func)) { \
3860 Py_DECREF(x); \
3861 x = NULL; \
3862 } \
3863 } \
Nicholas Bastinc69ebe82004-03-24 21:57:10 +00003864 } \
Nicholas Bastind858a772004-06-25 23:31:06 +00003865 } \
3866} else { \
Armin Rigo1c2d7e52005-09-20 18:34:01 +00003867 x = call; \
Nicholas Bastinc69ebe82004-03-24 21:57:10 +00003868 }
3869
Fredrik Lundh7a830892006-05-27 10:39:48 +00003870static PyObject *
Martin v. Löwisf30d60e2004-06-08 08:17:44 +00003871call_function(PyObject ***pp_stack, int oparg
3872#ifdef WITH_TSC
3873 , uint64* pintr0, uint64* pintr1
3874#endif
3875 )
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003876{
3877 int na = oparg & 0xff;
3878 int nk = (oparg>>8) & 0xff;
3879 int n = na + 2 * nk;
3880 PyObject **pfunc = (*pp_stack) - n - 1;
3881 PyObject *func = *pfunc;
3882 PyObject *x, *w;
3883
Jeremy Hylton985eba52003-02-05 23:13:00 +00003884 /* Always dispatch PyCFunction first, because these are
3885 presumed to be the most frequent callable object.
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003886 */
3887 if (PyCFunction_Check(func) && nk == 0) {
3888 int flags = PyCFunction_GET_FLAGS(func);
Nicholas Bastind858a772004-06-25 23:31:06 +00003889 PyThreadState *tstate = PyThreadState_GET();
Raymond Hettingera7f56bc2004-06-26 04:34:33 +00003890
3891 PCALL(PCALL_CFUNCTION);
Jeremy Hylton192690e2002-08-16 18:36:11 +00003892 if (flags & (METH_NOARGS | METH_O)) {
3893 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
3894 PyObject *self = PyCFunction_GET_SELF(func);
Nicholas Bastinc69ebe82004-03-24 21:57:10 +00003895 if (flags & METH_NOARGS && na == 0) {
Armin Rigo1c2d7e52005-09-20 18:34:01 +00003896 C_TRACE(x, (*meth)(self,NULL));
Nicholas Bastinc69ebe82004-03-24 21:57:10 +00003897 }
Jeremy Hylton192690e2002-08-16 18:36:11 +00003898 else if (flags & METH_O && na == 1) {
3899 PyObject *arg = EXT_POP(*pp_stack);
Armin Rigo1c2d7e52005-09-20 18:34:01 +00003900 C_TRACE(x, (*meth)(self,arg));
Jeremy Hylton192690e2002-08-16 18:36:11 +00003901 Py_DECREF(arg);
3902 }
3903 else {
3904 err_args(func, flags, na);
3905 x = NULL;
3906 }
3907 }
3908 else {
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003909 PyObject *callargs;
3910 callargs = load_args(pp_stack, na);
Michael W. Hudson75eabd22005-01-18 15:56:11 +00003911 READ_TIMESTAMP(*pintr0);
Armin Rigo1c2d7e52005-09-20 18:34:01 +00003912 C_TRACE(x, PyCFunction_Call(func,callargs,NULL));
Michael W. Hudson75eabd22005-01-18 15:56:11 +00003913 READ_TIMESTAMP(*pintr1);
Tim Peters8a5c3c72004-04-05 19:36:21 +00003914 Py_XDECREF(callargs);
3915 }
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003916 } else {
3917 if (PyMethod_Check(func) && PyMethod_GET_SELF(func) != NULL) {
3918 /* optimize access to bound methods */
3919 PyObject *self = PyMethod_GET_SELF(func);
Jeremy Hylton985eba52003-02-05 23:13:00 +00003920 PCALL(PCALL_METHOD);
3921 PCALL(PCALL_BOUND_METHOD);
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003922 Py_INCREF(self);
3923 func = PyMethod_GET_FUNCTION(func);
3924 Py_INCREF(func);
3925 Py_DECREF(*pfunc);
3926 *pfunc = self;
3927 na++;
3928 n++;
3929 } else
3930 Py_INCREF(func);
Michael W. Hudson75eabd22005-01-18 15:56:11 +00003931 READ_TIMESTAMP(*pintr0);
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003932 if (PyFunction_Check(func))
3933 x = fast_function(func, pp_stack, n, na, nk);
Tim Peters8a5c3c72004-04-05 19:36:21 +00003934 else
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003935 x = do_call(func, pp_stack, na, nk);
Michael W. Hudson75eabd22005-01-18 15:56:11 +00003936 READ_TIMESTAMP(*pintr1);
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003937 Py_DECREF(func);
3938 }
Tim Peters8a5c3c72004-04-05 19:36:21 +00003939
Armin Rigod34fa522006-03-28 19:10:40 +00003940 /* Clear the stack of the function object. Also removes
3941 the arguments in case they weren't consumed already
3942 (fast_function() and err_args() leave them on the stack).
Thomas Wouters7f597322006-03-01 05:32:33 +00003943 */
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003944 while ((*pp_stack) > pfunc) {
3945 w = EXT_POP(*pp_stack);
3946 Py_DECREF(w);
Jeremy Hylton985eba52003-02-05 23:13:00 +00003947 PCALL(PCALL_POP);
Jeremy Hyltone8c04322002-08-16 17:47:26 +00003948 }
3949 return x;
3950}
3951
Jeremy Hylton192690e2002-08-16 18:36:11 +00003952/* The fast_function() function optimize calls for which no argument
Jeremy Hylton52820442001-01-03 23:52:36 +00003953 tuple is necessary; the objects are passed directly from the stack.
Jeremy Hylton985eba52003-02-05 23:13:00 +00003954 For the simplest case -- a function that takes only positional
3955 arguments and is called with only positional arguments -- it
3956 inlines the most primitive frame setup code from
3957 PyEval_EvalCodeEx(), which vastly reduces the checks that must be
3958 done before evaluating the frame.
Jeremy Hylton52820442001-01-03 23:52:36 +00003959*/
3960
Fredrik Lundh7a830892006-05-27 10:39:48 +00003961static PyObject *
Guido van Rossumac7be682001-01-17 15:42:30 +00003962fast_function(PyObject *func, PyObject ***pp_stack, int n, int na, int nk)
Jeremy Hylton52820442001-01-03 23:52:36 +00003963{
Jeremy Hylton985eba52003-02-05 23:13:00 +00003964 PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003965 PyObject *globals = PyFunction_GET_GLOBALS(func);
3966 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
3967 PyObject **d = NULL;
3968 int nd = 0;
3969
Jeremy Hylton985eba52003-02-05 23:13:00 +00003970 PCALL(PCALL_FUNCTION);
3971 PCALL(PCALL_FAST_FUNCTION);
Raymond Hettinger40174c32003-05-31 07:04:16 +00003972 if (argdefs == NULL && co->co_argcount == n && nk==0 &&
Jeremy Hylton985eba52003-02-05 23:13:00 +00003973 co->co_flags == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE)) {
3974 PyFrameObject *f;
3975 PyObject *retval = NULL;
3976 PyThreadState *tstate = PyThreadState_GET();
3977 PyObject **fastlocals, **stack;
3978 int i;
3979
3980 PCALL(PCALL_FASTER_FUNCTION);
3981 assert(globals != NULL);
3982 /* XXX Perhaps we should create a specialized
3983 PyFrame_New() that doesn't take locals, but does
3984 take builtins without sanity checking them.
3985 */
Neal Norwitzdf6a6492006-08-13 18:10:10 +00003986 assert(tstate != NULL);
Jeremy Hylton985eba52003-02-05 23:13:00 +00003987 f = PyFrame_New(tstate, co, globals, NULL);
3988 if (f == NULL)
3989 return NULL;
3990
3991 fastlocals = f->f_localsplus;
3992 stack = (*pp_stack) - n;
3993
3994 for (i = 0; i < n; i++) {
3995 Py_INCREF(*stack);
3996 fastlocals[i] = *stack++;
3997 }
Phillip J. Eby0d6615f2005-08-02 00:46:46 +00003998 retval = PyEval_EvalFrameEx(f,0);
Jeremy Hylton985eba52003-02-05 23:13:00 +00003999 ++tstate->recursion_depth;
4000 Py_DECREF(f);
4001 --tstate->recursion_depth;
4002 return retval;
4003 }
Jeremy Hylton52820442001-01-03 23:52:36 +00004004 if (argdefs != NULL) {
4005 d = &PyTuple_GET_ITEM(argdefs, 0);
Christian Heimese93237d2007-12-19 02:37:44 +00004006 nd = Py_SIZE(argdefs);
Jeremy Hylton52820442001-01-03 23:52:36 +00004007 }
Jeremy Hylton985eba52003-02-05 23:13:00 +00004008 return PyEval_EvalCodeEx(co, globals,
4009 (PyObject *)NULL, (*pp_stack)-n, na,
4010 (*pp_stack)-2*nk, nk, d, nd,
4011 PyFunction_GET_CLOSURE(func));
Jeremy Hylton52820442001-01-03 23:52:36 +00004012}
4013
Fredrik Lundh7a830892006-05-27 10:39:48 +00004014static PyObject *
Ka-Ping Yee20579702001-01-15 22:14:16 +00004015update_keyword_args(PyObject *orig_kwdict, int nk, PyObject ***pp_stack,
4016 PyObject *func)
Jeremy Hylton52820442001-01-03 23:52:36 +00004017{
4018 PyObject *kwdict = NULL;
4019 if (orig_kwdict == NULL)
4020 kwdict = PyDict_New();
4021 else {
4022 kwdict = PyDict_Copy(orig_kwdict);
4023 Py_DECREF(orig_kwdict);
4024 }
4025 if (kwdict == NULL)
4026 return NULL;
Raymond Hettinger5bed4562004-04-10 23:34:17 +00004027 while (--nk >= 0) {
Jeremy Hylton52820442001-01-03 23:52:36 +00004028 int err;
4029 PyObject *value = EXT_POP(*pp_stack);
4030 PyObject *key = EXT_POP(*pp_stack);
4031 if (PyDict_GetItem(kwdict, key) != NULL) {
Thomas Woutersae406c62007-09-19 17:27:43 +00004032 PyErr_Format(PyExc_TypeError,
4033 "%.200s%s got multiple values "
4034 "for keyword argument '%.200s'",
Tim Peters6d6c1a32001-08-02 04:15:00 +00004035 PyEval_GetFuncName(func),
4036 PyEval_GetFuncDesc(func),
Gregory P. Smithdd96db62008-06-09 04:58:54 +00004037 PyString_AsString(key));
Jeremy Hylton52820442001-01-03 23:52:36 +00004038 Py_DECREF(key);
4039 Py_DECREF(value);
4040 Py_DECREF(kwdict);
4041 return NULL;
4042 }
4043 err = PyDict_SetItem(kwdict, key, value);
4044 Py_DECREF(key);
4045 Py_DECREF(value);
4046 if (err) {
4047 Py_DECREF(kwdict);
4048 return NULL;
4049 }
4050 }
4051 return kwdict;
4052}
4053
Fredrik Lundh7a830892006-05-27 10:39:48 +00004054static PyObject *
Jeremy Hylton52820442001-01-03 23:52:36 +00004055update_star_args(int nstack, int nstar, PyObject *stararg,
4056 PyObject ***pp_stack)
4057{
4058 PyObject *callargs, *w;
4059
4060 callargs = PyTuple_New(nstack + nstar);
4061 if (callargs == NULL) {
4062 return NULL;
4063 }
4064 if (nstar) {
4065 int i;
4066 for (i = 0; i < nstar; i++) {
4067 PyObject *a = PyTuple_GET_ITEM(stararg, i);
4068 Py_INCREF(a);
4069 PyTuple_SET_ITEM(callargs, nstack + i, a);
4070 }
4071 }
Raymond Hettinger5bed4562004-04-10 23:34:17 +00004072 while (--nstack >= 0) {
Jeremy Hylton52820442001-01-03 23:52:36 +00004073 w = EXT_POP(*pp_stack);
4074 PyTuple_SET_ITEM(callargs, nstack, w);
4075 }
4076 return callargs;
4077}
4078
Fredrik Lundh7a830892006-05-27 10:39:48 +00004079static PyObject *
Jeremy Hylton52820442001-01-03 23:52:36 +00004080load_args(PyObject ***pp_stack, int na)
4081{
4082 PyObject *args = PyTuple_New(na);
4083 PyObject *w;
4084
4085 if (args == NULL)
4086 return NULL;
Raymond Hettinger5bed4562004-04-10 23:34:17 +00004087 while (--na >= 0) {
Jeremy Hylton52820442001-01-03 23:52:36 +00004088 w = EXT_POP(*pp_stack);
4089 PyTuple_SET_ITEM(args, na, w);
4090 }
4091 return args;
4092}
4093
Fredrik Lundh7a830892006-05-27 10:39:48 +00004094static PyObject *
Jeremy Hylton52820442001-01-03 23:52:36 +00004095do_call(PyObject *func, PyObject ***pp_stack, int na, int nk)
4096{
4097 PyObject *callargs = NULL;
4098 PyObject *kwdict = NULL;
4099 PyObject *result = NULL;
4100
4101 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00004102 kwdict = update_keyword_args(NULL, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00004103 if (kwdict == NULL)
4104 goto call_fail;
4105 }
4106 callargs = load_args(pp_stack, na);
4107 if (callargs == NULL)
4108 goto call_fail;
Jeremy Hylton985eba52003-02-05 23:13:00 +00004109#ifdef CALL_PROFILE
4110 /* At this point, we have to look at the type of func to
4111 update the call stats properly. Do it here so as to avoid
4112 exposing the call stats machinery outside ceval.c
4113 */
4114 if (PyFunction_Check(func))
4115 PCALL(PCALL_FUNCTION);
4116 else if (PyMethod_Check(func))
4117 PCALL(PCALL_METHOD);
4118 else if (PyType_Check(func))
4119 PCALL(PCALL_TYPE);
4120 else
4121 PCALL(PCALL_OTHER);
4122#endif
Tim Peters6d6c1a32001-08-02 04:15:00 +00004123 result = PyObject_Call(func, callargs, kwdict);
Jeremy Hylton52820442001-01-03 23:52:36 +00004124 call_fail:
4125 Py_XDECREF(callargs);
4126 Py_XDECREF(kwdict);
4127 return result;
4128}
4129
Fredrik Lundh7a830892006-05-27 10:39:48 +00004130static PyObject *
Jeremy Hylton52820442001-01-03 23:52:36 +00004131ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)
4132{
4133 int nstar = 0;
4134 PyObject *callargs = NULL;
4135 PyObject *stararg = NULL;
4136 PyObject *kwdict = NULL;
4137 PyObject *result = NULL;
4138
4139 if (flags & CALL_FLAG_KW) {
4140 kwdict = EXT_POP(*pp_stack);
Georg Brandl2134e752007-05-21 20:34:16 +00004141 if (!PyDict_Check(kwdict)) {
4142 PyObject *d;
4143 d = PyDict_New();
4144 if (d == NULL)
4145 goto ext_call_fail;
4146 if (PyDict_Update(d, kwdict) != 0) {
4147 Py_DECREF(d);
4148 /* PyDict_Update raises attribute
4149 * error (percolated from an attempt
4150 * to get 'keys' attribute) instead of
4151 * a type error if its second argument
4152 * is not a mapping.
4153 */
4154 if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
4155 PyErr_Format(PyExc_TypeError,
4156 "%.200s%.200s argument after ** "
4157 "must be a mapping, not %.200s",
4158 PyEval_GetFuncName(func),
4159 PyEval_GetFuncDesc(func),
4160 kwdict->ob_type->tp_name);
4161 }
4162 goto ext_call_fail;
4163 }
4164 Py_DECREF(kwdict);
4165 kwdict = d;
Jeremy Hylton52820442001-01-03 23:52:36 +00004166 }
4167 }
4168 if (flags & CALL_FLAG_VAR) {
4169 stararg = EXT_POP(*pp_stack);
4170 if (!PyTuple_Check(stararg)) {
4171 PyObject *t = NULL;
4172 t = PySequence_Tuple(stararg);
4173 if (t == NULL) {
Jeremy Hylton512a2372001-04-11 13:52:29 +00004174 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
4175 PyErr_Format(PyExc_TypeError,
Georg Brandl2134e752007-05-21 20:34:16 +00004176 "%.200s%.200s argument after * "
4177 "must be a sequence, not %200s",
Tim Peters6d6c1a32001-08-02 04:15:00 +00004178 PyEval_GetFuncName(func),
Georg Brandl2134e752007-05-21 20:34:16 +00004179 PyEval_GetFuncDesc(func),
4180 stararg->ob_type->tp_name);
Jeremy Hylton512a2372001-04-11 13:52:29 +00004181 }
Jeremy Hylton52820442001-01-03 23:52:36 +00004182 goto ext_call_fail;
4183 }
4184 Py_DECREF(stararg);
4185 stararg = t;
4186 }
4187 nstar = PyTuple_GET_SIZE(stararg);
4188 }
4189 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00004190 kwdict = update_keyword_args(kwdict, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00004191 if (kwdict == NULL)
4192 goto ext_call_fail;
4193 }
4194 callargs = update_star_args(na, nstar, stararg, pp_stack);
4195 if (callargs == NULL)
4196 goto ext_call_fail;
Jeremy Hylton985eba52003-02-05 23:13:00 +00004197#ifdef CALL_PROFILE
4198 /* At this point, we have to look at the type of func to
4199 update the call stats properly. Do it here so as to avoid
4200 exposing the call stats machinery outside ceval.c
4201 */
4202 if (PyFunction_Check(func))
4203 PCALL(PCALL_FUNCTION);
4204 else if (PyMethod_Check(func))
4205 PCALL(PCALL_METHOD);
4206 else if (PyType_Check(func))
4207 PCALL(PCALL_TYPE);
4208 else
4209 PCALL(PCALL_OTHER);
4210#endif
Tim Peters6d6c1a32001-08-02 04:15:00 +00004211 result = PyObject_Call(func, callargs, kwdict);
Thomas Woutersae406c62007-09-19 17:27:43 +00004212ext_call_fail:
Jeremy Hylton52820442001-01-03 23:52:36 +00004213 Py_XDECREF(callargs);
4214 Py_XDECREF(kwdict);
4215 Py_XDECREF(stararg);
4216 return result;
4217}
4218
Guido van Rossum38fff8c2006-03-07 18:50:55 +00004219/* Extract a slice index from a PyInt or PyLong or an object with the
4220 nb_index slot defined, and store in *pi.
4221 Silently reduce values larger than PY_SSIZE_T_MAX to PY_SSIZE_T_MAX,
4222 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 +00004223 Return 0 on error, 1 on success.
Tim Peterscb479e72001-12-16 19:11:44 +00004224*/
Tim Petersb5196382001-12-16 19:44:20 +00004225/* Note: If v is NULL, return success without storing into *pi. This
4226 is because_PyEval_SliceIndex() is called by apply_slice(), which can be
4227 called by the SLICE opcode with v and/or w equal to NULL.
Tim Peterscb479e72001-12-16 19:11:44 +00004228*/
Guido van Rossum20c6add2000-05-08 14:06:50 +00004229int
Martin v. Löwis18e16552006-02-15 17:27:45 +00004230_PyEval_SliceIndex(PyObject *v, Py_ssize_t *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004231{
Tim Petersb5196382001-12-16 19:44:20 +00004232 if (v != NULL) {
Martin v. Löwisdde99d22006-02-17 15:57:41 +00004233 Py_ssize_t x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00004234 if (PyInt_Check(v)) {
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00004235 /* XXX(nnorwitz): I think PyInt_AS_LONG is correct,
4236 however, it looks like it should be AsSsize_t.
4237 There should be a comment here explaining why.
4238 */
4239 x = PyInt_AS_LONG(v);
Tim Peters7df5e7f2006-05-26 23:14:37 +00004240 }
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00004241 else if (PyIndex_Check(v)) {
4242 x = PyNumber_AsSsize_t(v, NULL);
Guido van Rossum38fff8c2006-03-07 18:50:55 +00004243 if (x == -1 && PyErr_Occurred())
4244 return 0;
4245 }
4246 else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00004247 PyErr_SetString(PyExc_TypeError,
Guido van Rossum38fff8c2006-03-07 18:50:55 +00004248 "slice indices must be integers or "
4249 "None or have an __index__ method");
Guido van Rossum20c6add2000-05-08 14:06:50 +00004250 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004251 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00004252 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004253 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00004254 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004255}
4256
Guido van Rossum38fff8c2006-03-07 18:50:55 +00004257#undef ISINDEX
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00004258#define ISINDEX(x) ((x) == NULL || \
4259 PyInt_Check(x) || PyLong_Check(x) || PyIndex_Check(x))
Guido van Rossum50d756e2001-08-18 17:43:36 +00004260
Fredrik Lundh7a830892006-05-27 10:39:48 +00004261static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004262apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004263{
Guido van Rossum50d756e2001-08-18 17:43:36 +00004264 PyTypeObject *tp = u->ob_type;
4265 PySequenceMethods *sq = tp->tp_as_sequence;
4266
Guido van Rossum38fff8c2006-03-07 18:50:55 +00004267 if (sq && sq->sq_slice && ISINDEX(v) && ISINDEX(w)) {
Martin v. Löwisdde99d22006-02-17 15:57:41 +00004268 Py_ssize_t ilow = 0, ihigh = PY_SSIZE_T_MAX;
Guido van Rossum50d756e2001-08-18 17:43:36 +00004269 if (!_PyEval_SliceIndex(v, &ilow))
4270 return NULL;
4271 if (!_PyEval_SliceIndex(w, &ihigh))
4272 return NULL;
4273 return PySequence_GetSlice(u, ilow, ihigh);
4274 }
4275 else {
4276 PyObject *slice = PySlice_New(v, w, NULL);
Guido van Rossum354797c2001-12-03 19:45:06 +00004277 if (slice != NULL) {
4278 PyObject *res = PyObject_GetItem(u, slice);
4279 Py_DECREF(slice);
4280 return res;
4281 }
Guido van Rossum50d756e2001-08-18 17:43:36 +00004282 else
4283 return NULL;
4284 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004285}
Guido van Rossum3f5da241990-12-20 15:06:42 +00004286
Fredrik Lundh7a830892006-05-27 10:39:48 +00004287static int
Guido van Rossumac7be682001-01-17 15:42:30 +00004288assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x)
4289 /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004290{
Guido van Rossum50d756e2001-08-18 17:43:36 +00004291 PyTypeObject *tp = u->ob_type;
4292 PySequenceMethods *sq = tp->tp_as_sequence;
4293
Georg Brandl0fca97a2007-03-05 22:28:08 +00004294 if (sq && sq->sq_ass_slice && ISINDEX(v) && ISINDEX(w)) {
Martin v. Löwisdde99d22006-02-17 15:57:41 +00004295 Py_ssize_t ilow = 0, ihigh = PY_SSIZE_T_MAX;
Guido van Rossum50d756e2001-08-18 17:43:36 +00004296 if (!_PyEval_SliceIndex(v, &ilow))
4297 return -1;
4298 if (!_PyEval_SliceIndex(w, &ihigh))
4299 return -1;
4300 if (x == NULL)
4301 return PySequence_DelSlice(u, ilow, ihigh);
4302 else
4303 return PySequence_SetSlice(u, ilow, ihigh, x);
4304 }
4305 else {
4306 PyObject *slice = PySlice_New(v, w, NULL);
4307 if (slice != NULL) {
Guido van Rossum354797c2001-12-03 19:45:06 +00004308 int res;
Guido van Rossum50d756e2001-08-18 17:43:36 +00004309 if (x != NULL)
Guido van Rossum354797c2001-12-03 19:45:06 +00004310 res = PyObject_SetItem(u, slice, x);
Guido van Rossum50d756e2001-08-18 17:43:36 +00004311 else
Guido van Rossum354797c2001-12-03 19:45:06 +00004312 res = PyObject_DelItem(u, slice);
4313 Py_DECREF(slice);
4314 return res;
Guido van Rossum50d756e2001-08-18 17:43:36 +00004315 }
4316 else
4317 return -1;
4318 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004319}
4320
Guido van Rossum04edb522008-03-18 02:49:46 +00004321#define Py3kExceptionClass_Check(x) \
4322 (PyType_Check((x)) && \
4323 PyType_FastSubclass((PyTypeObject*)(x), Py_TPFLAGS_BASE_EXC_SUBCLASS))
4324
4325#define CANNOT_CATCH_MSG "catching classes that don't inherit from " \
Georg Brandld5b635f2008-03-25 08:29:14 +00004326 "BaseException is not allowed in 3.x"
Guido van Rossum04edb522008-03-18 02:49:46 +00004327
Fredrik Lundh7a830892006-05-27 10:39:48 +00004328static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004329cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004330{
Guido van Rossumac7be682001-01-17 15:42:30 +00004331 int res = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004332 switch (op) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00004333 case PyCmp_IS:
Guido van Rossum3f5da241990-12-20 15:06:42 +00004334 res = (v == w);
Raymond Hettinger4bad9ba2003-01-19 05:08:13 +00004335 break;
4336 case PyCmp_IS_NOT:
4337 res = (v != w);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004338 break;
Martin v. Löwis7198a522002-01-01 19:59:11 +00004339 case PyCmp_IN:
Raymond Hettinger4bad9ba2003-01-19 05:08:13 +00004340 res = PySequence_Contains(w, v);
4341 if (res < 0)
4342 return NULL;
4343 break;
Martin v. Löwis7198a522002-01-01 19:59:11 +00004344 case PyCmp_NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00004345 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004346 if (res < 0)
4347 return NULL;
Raymond Hettinger4bad9ba2003-01-19 05:08:13 +00004348 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004349 break;
Martin v. Löwis7198a522002-01-01 19:59:11 +00004350 case PyCmp_EXC_MATCH:
Brett Cannon129bd522007-01-30 21:34:36 +00004351 if (PyTuple_Check(w)) {
4352 Py_ssize_t i, length;
4353 length = PyTuple_Size(w);
4354 for (i = 0; i < length; i += 1) {
4355 PyObject *exc = PyTuple_GET_ITEM(w, i);
Gregory P. Smithdd96db62008-06-09 04:58:54 +00004356 if (PyString_Check(exc)) {
Brett Cannon129bd522007-01-30 21:34:36 +00004357 int ret_val;
4358 ret_val = PyErr_WarnEx(
Thomas Wouterse2176022007-09-20 17:35:10 +00004359 PyExc_DeprecationWarning,
4360 "catching of string "
4361 "exceptions is deprecated", 1);
Benjamin Petersonf19a7b92008-04-27 18:40:21 +00004362 if (ret_val < 0)
Brett Cannon129bd522007-01-30 21:34:36 +00004363 return NULL;
4364 }
Guido van Rossum20bda582008-03-18 03:15:05 +00004365 else if (Py_Py3kWarningFlag &&
4366 !PyTuple_Check(exc) &&
4367 !Py3kExceptionClass_Check(exc))
Guido van Rossum04edb522008-03-18 02:49:46 +00004368 {
4369 int ret_val;
4370 ret_val = PyErr_WarnEx(
4371 PyExc_DeprecationWarning,
4372 CANNOT_CATCH_MSG, 1);
Benjamin Petersonf19a7b92008-04-27 18:40:21 +00004373 if (ret_val < 0)
Guido van Rossum04edb522008-03-18 02:49:46 +00004374 return NULL;
4375 }
Brett Cannon129bd522007-01-30 21:34:36 +00004376 }
4377 }
4378 else {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00004379 if (PyString_Check(w)) {
Brett Cannon129bd522007-01-30 21:34:36 +00004380 int ret_val;
4381 ret_val = PyErr_WarnEx(
4382 PyExc_DeprecationWarning,
4383 "catching of string "
Thomas Wouterse2176022007-09-20 17:35:10 +00004384 "exceptions is deprecated", 1);
Benjamin Petersonf19a7b92008-04-27 18:40:21 +00004385 if (ret_val < 0)
Brett Cannon129bd522007-01-30 21:34:36 +00004386 return NULL;
4387 }
Guido van Rossum20bda582008-03-18 03:15:05 +00004388 else if (Py_Py3kWarningFlag &&
4389 !PyTuple_Check(w) &&
4390 !Py3kExceptionClass_Check(w))
Guido van Rossum04edb522008-03-18 02:49:46 +00004391 {
4392 int ret_val;
4393 ret_val = PyErr_WarnEx(
4394 PyExc_DeprecationWarning,
4395 CANNOT_CATCH_MSG, 1);
Benjamin Petersonf19a7b92008-04-27 18:40:21 +00004396 if (ret_val < 0)
Guido van Rossum04edb522008-03-18 02:49:46 +00004397 return NULL;
4398 }
Brett Cannon129bd522007-01-30 21:34:36 +00004399 }
Barry Warsaw4249f541997-08-22 21:26:19 +00004400 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004401 break;
4402 default:
Guido van Rossumac7be682001-01-17 15:42:30 +00004403 return PyObject_RichCompare(v, w, op);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004404 }
Guido van Rossumb209a111997-04-29 18:18:01 +00004405 v = res ? Py_True : Py_False;
4406 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004407 return v;
4408}
4409
Fredrik Lundh7a830892006-05-27 10:39:48 +00004410static PyObject *
Thomas Wouters52152252000-08-17 22:55:00 +00004411import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00004412{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00004413 PyObject *x;
4414
4415 x = PyObject_GetAttr(v, name);
4416 if (x == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
Thomas Wouters52152252000-08-17 22:55:00 +00004417 PyErr_Format(PyExc_ImportError,
4418 "cannot import name %.230s",
Gregory P. Smithdd96db62008-06-09 04:58:54 +00004419 PyString_AsString(name));
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00004420 }
Thomas Wouters52152252000-08-17 22:55:00 +00004421 return x;
4422}
Guido van Rossumac7be682001-01-17 15:42:30 +00004423
Fredrik Lundh7a830892006-05-27 10:39:48 +00004424static int
Thomas Wouters52152252000-08-17 22:55:00 +00004425import_all_from(PyObject *locals, PyObject *v)
4426{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00004427 PyObject *all = PyObject_GetAttrString(v, "__all__");
4428 PyObject *dict, *name, *value;
4429 int skip_leading_underscores = 0;
4430 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00004431
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00004432 if (all == NULL) {
4433 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
4434 return -1; /* Unexpected error */
4435 PyErr_Clear();
4436 dict = PyObject_GetAttrString(v, "__dict__");
4437 if (dict == NULL) {
4438 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
4439 return -1;
4440 PyErr_SetString(PyExc_ImportError,
4441 "from-import-* object has no __dict__ and no __all__");
Guido van Rossum3f5da241990-12-20 15:06:42 +00004442 return -1;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00004443 }
4444 all = PyMapping_Keys(dict);
4445 Py_DECREF(dict);
4446 if (all == NULL)
4447 return -1;
4448 skip_leading_underscores = 1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00004449 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00004450
4451 for (pos = 0, err = 0; ; pos++) {
4452 name = PySequence_GetItem(all, pos);
4453 if (name == NULL) {
4454 if (!PyErr_ExceptionMatches(PyExc_IndexError))
4455 err = -1;
4456 else
4457 PyErr_Clear();
4458 break;
4459 }
4460 if (skip_leading_underscores &&
Gregory P. Smithdd96db62008-06-09 04:58:54 +00004461 PyString_Check(name) &&
4462 PyString_AS_STRING(name)[0] == '_')
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00004463 {
4464 Py_DECREF(name);
4465 continue;
4466 }
4467 value = PyObject_GetAttr(v, name);
4468 if (value == NULL)
4469 err = -1;
Armin Rigo70370852006-11-29 21:59:22 +00004470 else if (PyDict_CheckExact(locals))
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00004471 err = PyDict_SetItem(locals, name, value);
Armin Rigo70370852006-11-29 21:59:22 +00004472 else
4473 err = PyObject_SetItem(locals, name, value);
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00004474 Py_DECREF(name);
4475 Py_XDECREF(value);
4476 if (err != 0)
4477 break;
4478 }
4479 Py_DECREF(all);
4480 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00004481}
4482
Fredrik Lundh7a830892006-05-27 10:39:48 +00004483static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004484build_class(PyObject *methods, PyObject *bases, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00004485{
Guido van Rossum7851eea2001-09-12 19:19:18 +00004486 PyObject *metaclass = NULL, *result, *base;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004487
4488 if (PyDict_Check(methods))
4489 metaclass = PyDict_GetItemString(methods, "__metaclass__");
Guido van Rossum7851eea2001-09-12 19:19:18 +00004490 if (metaclass != NULL)
Guido van Rossum2556f2e2001-12-06 14:09:56 +00004491 Py_INCREF(metaclass);
Guido van Rossum7851eea2001-09-12 19:19:18 +00004492 else if (PyTuple_Check(bases) && PyTuple_GET_SIZE(bases) > 0) {
4493 base = PyTuple_GET_ITEM(bases, 0);
4494 metaclass = PyObject_GetAttrString(base, "__class__");
4495 if (metaclass == NULL) {
4496 PyErr_Clear();
4497 metaclass = (PyObject *)base->ob_type;
4498 Py_INCREF(metaclass);
Guido van Rossum25831651993-05-19 14:50:45 +00004499 }
4500 }
Guido van Rossum7851eea2001-09-12 19:19:18 +00004501 else {
4502 PyObject *g = PyEval_GetGlobals();
4503 if (g != NULL && PyDict_Check(g))
4504 metaclass = PyDict_GetItemString(g, "__metaclass__");
4505 if (metaclass == NULL)
4506 metaclass = (PyObject *) &PyClass_Type;
4507 Py_INCREF(metaclass);
4508 }
Jeremy Hylton7c1e3472007-02-26 16:14:51 +00004509 result = PyObject_CallFunctionObjArgs(metaclass, name, bases, methods,
Thomas Woutersae406c62007-09-19 17:27:43 +00004510 NULL);
Guido van Rossum7851eea2001-09-12 19:19:18 +00004511 Py_DECREF(metaclass);
Raymond Hettingerf2c08302004-06-05 06:16:22 +00004512 if (result == NULL && PyErr_ExceptionMatches(PyExc_TypeError)) {
Tim Peters7df5e7f2006-05-26 23:14:37 +00004513 /* A type error here likely means that the user passed
Raymond Hettingerf2c08302004-06-05 06:16:22 +00004514 in a base that was not a class (such the random module
4515 instead of the random.random type). Help them out with
Raymond Hettingercfc31922004-09-16 16:41:57 +00004516 by augmenting the error message with more information.*/
4517
4518 PyObject *ptype, *pvalue, *ptraceback;
4519
4520 PyErr_Fetch(&ptype, &pvalue, &ptraceback);
Gregory P. Smithdd96db62008-06-09 04:58:54 +00004521 if (PyString_Check(pvalue)) {
Raymond Hettingercfc31922004-09-16 16:41:57 +00004522 PyObject *newmsg;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00004523 newmsg = PyString_FromFormat(
Jeremy Hylton7c1e3472007-02-26 16:14:51 +00004524 "Error when calling the metaclass bases\n"
Thomas Woutersae406c62007-09-19 17:27:43 +00004525 " %s",
Gregory P. Smithdd96db62008-06-09 04:58:54 +00004526 PyString_AS_STRING(pvalue));
Raymond Hettingercfc31922004-09-16 16:41:57 +00004527 if (newmsg != NULL) {
4528 Py_DECREF(pvalue);
4529 pvalue = newmsg;
4530 }
4531 }
4532 PyErr_Restore(ptype, pvalue, ptraceback);
Raymond Hettingerf2c08302004-06-05 06:16:22 +00004533 }
Guido van Rossum7851eea2001-09-12 19:19:18 +00004534 return result;
Guido van Rossum25831651993-05-19 14:50:45 +00004535}
4536
Fredrik Lundh7a830892006-05-27 10:39:48 +00004537static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004538exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
4539 PyObject *locals)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004540{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004541 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00004542 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004543 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004544
Guido van Rossumb209a111997-04-29 18:18:01 +00004545 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
4546 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004547 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00004548 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004549 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00004550 locals = PyTuple_GetItem(prog, 2);
4551 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004552 }
Guido van Rossumb209a111997-04-29 18:18:01 +00004553 if (globals == Py_None) {
4554 globals = PyEval_GetGlobals();
4555 if (locals == Py_None) {
4556 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00004557 plain = 1;
4558 }
Neal Norwitzdf6a6492006-08-13 18:10:10 +00004559 if (!globals || !locals) {
4560 PyErr_SetString(PyExc_SystemError,
4561 "globals and locals cannot be NULL");
4562 return -1;
4563 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004564 }
Guido van Rossumb209a111997-04-29 18:18:01 +00004565 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004566 locals = globals;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00004567 if (!PyString_Check(prog) &&
Benjamin Peterson78821dd2009-01-25 17:15:10 +00004568#ifdef Py_USING_UNICODE
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00004569 !PyUnicode_Check(prog) &&
Benjamin Peterson78821dd2009-01-25 17:15:10 +00004570#endif
Guido van Rossumb209a111997-04-29 18:18:01 +00004571 !PyCode_Check(prog) &&
4572 !PyFile_Check(prog)) {
4573 PyErr_SetString(PyExc_TypeError,
Guido van Rossumac7be682001-01-17 15:42:30 +00004574 "exec: arg 1 must be a string, file, or code object");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004575 return -1;
4576 }
Fred Drake661ea262000-10-24 19:57:45 +00004577 if (!PyDict_Check(globals)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00004578 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00004579 "exec: arg 2 must be a dictionary or None");
4580 return -1;
4581 }
Raymond Hettinger66bd2332004-08-02 08:30:07 +00004582 if (!PyMapping_Check(locals)) {
Fred Drake661ea262000-10-24 19:57:45 +00004583 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger66bd2332004-08-02 08:30:07 +00004584 "exec: arg 3 must be a mapping or None");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004585 return -1;
4586 }
Guido van Rossumb209a111997-04-29 18:18:01 +00004587 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00004588 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00004589 if (PyCode_Check(prog)) {
Jeremy Hylton733c8932001-12-13 19:51:56 +00004590 if (PyCode_GetNumFree((PyCodeObject *)prog) > 0) {
4591 PyErr_SetString(PyExc_TypeError,
4592 "code object passed to exec may not contain free variables");
4593 return -1;
4594 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00004595 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004596 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00004597 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00004598 FILE *fp = PyFile_AsFile(prog);
Gregory P. Smithdd96db62008-06-09 04:58:54 +00004599 char *name = PyString_AsString(PyFile_Name(prog));
Jeremy Hylton714b1122007-02-25 16:01:58 +00004600 PyCompilerFlags cf;
Thomas Woutersae406c62007-09-19 17:27:43 +00004601 if (name == NULL)
4602 return -1;
Tim Peters5ba58662001-07-16 02:29:45 +00004603 cf.cf_flags = 0;
4604 if (PyEval_MergeCompilerFlags(&cf))
Jeremy Hyltonbc320242001-03-22 02:47:58 +00004605 v = PyRun_FileFlags(fp, name, Py_file_input, globals,
Tim Peters8a5c3c72004-04-05 19:36:21 +00004606 locals, &cf);
Tim Peters5ba58662001-07-16 02:29:45 +00004607 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +00004608 v = PyRun_File(fp, name, Py_file_input, globals,
Tim Peters8a5c3c72004-04-05 19:36:21 +00004609 locals);
Guido van Rossuma400d8a2000-01-12 22:45:54 +00004610 }
4611 else {
Just van Rossum3aaf42c2003-02-10 08:21:10 +00004612 PyObject *tmp = NULL;
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00004613 char *str;
Tim Peters5ba58662001-07-16 02:29:45 +00004614 PyCompilerFlags cf;
Just van Rossum3aaf42c2003-02-10 08:21:10 +00004615 cf.cf_flags = 0;
4616#ifdef Py_USING_UNICODE
4617 if (PyUnicode_Check(prog)) {
4618 tmp = PyUnicode_AsUTF8String(prog);
4619 if (tmp == NULL)
4620 return -1;
4621 prog = tmp;
4622 cf.cf_flags |= PyCF_SOURCE_IS_UTF8;
4623 }
4624#endif
Gregory P. Smithdd96db62008-06-09 04:58:54 +00004625 if (PyString_AsStringAndSize(prog, &str, NULL))
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004626 return -1;
Tim Peters5ba58662001-07-16 02:29:45 +00004627 if (PyEval_MergeCompilerFlags(&cf))
Tim Peters8a5c3c72004-04-05 19:36:21 +00004628 v = PyRun_StringFlags(str, Py_file_input, globals,
Jeremy Hyltonbc320242001-03-22 02:47:58 +00004629 locals, &cf);
Tim Peters5ba58662001-07-16 02:29:45 +00004630 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +00004631 v = PyRun_String(str, Py_file_input, globals, locals);
Just van Rossum3aaf42c2003-02-10 08:21:10 +00004632 Py_XDECREF(tmp);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004633 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00004634 if (plain)
4635 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004636 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004637 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00004638 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004639 return 0;
4640}
Guido van Rossum24c13741995-02-14 09:42:43 +00004641
Fredrik Lundh7a830892006-05-27 10:39:48 +00004642static void
Paul Prescode68140d2000-08-30 20:25:01 +00004643format_exc_check_arg(PyObject *exc, char *format_str, PyObject *obj)
4644{
4645 char *obj_str;
4646
4647 if (!obj)
4648 return;
4649
Gregory P. Smithdd96db62008-06-09 04:58:54 +00004650 obj_str = PyString_AsString(obj);
Paul Prescode68140d2000-08-30 20:25:01 +00004651 if (!obj_str)
4652 return;
4653
4654 PyErr_Format(exc, format_str, obj_str);
4655}
Guido van Rossum950361c1997-01-24 13:49:28 +00004656
Fredrik Lundh7a830892006-05-27 10:39:48 +00004657static PyObject *
Raymond Hettinger52a21b82004-08-06 18:43:09 +00004658string_concatenate(PyObject *v, PyObject *w,
4659 PyFrameObject *f, unsigned char *next_instr)
4660{
4661 /* This function implements 'variable += expr' when both arguments
4662 are strings. */
Gregory P. Smithdd96db62008-06-09 04:58:54 +00004663 Py_ssize_t v_len = PyString_GET_SIZE(v);
4664 Py_ssize_t w_len = PyString_GET_SIZE(w);
Armin Rigo97ff0472006-08-09 15:37:26 +00004665 Py_ssize_t new_len = v_len + w_len;
4666 if (new_len < 0) {
4667 PyErr_SetString(PyExc_OverflowError,
4668 "strings are too large to concat");
4669 return NULL;
4670 }
Tim Peters7df5e7f2006-05-26 23:14:37 +00004671
Raymond Hettinger52a21b82004-08-06 18:43:09 +00004672 if (v->ob_refcnt == 2) {
4673 /* In the common case, there are 2 references to the value
4674 * stored in 'variable' when the += is performed: one on the
Thomas Wouterse2176022007-09-20 17:35:10 +00004675 * value stack (in 'v') and one still stored in the
4676 * 'variable'. We try to delete the variable now to reduce
4677 * the refcnt to 1.
Raymond Hettinger52a21b82004-08-06 18:43:09 +00004678 */
4679 switch (*next_instr) {
4680 case STORE_FAST:
4681 {
4682 int oparg = PEEKARG();
4683 PyObject **fastlocals = f->f_localsplus;
4684 if (GETLOCAL(oparg) == v)
4685 SETLOCAL(oparg, NULL);
4686 break;
4687 }
4688 case STORE_DEREF:
4689 {
Thomas Wouterse2176022007-09-20 17:35:10 +00004690 PyObject **freevars = (f->f_localsplus +
4691 f->f_code->co_nlocals);
Raymond Hettinger52a21b82004-08-06 18:43:09 +00004692 PyObject *c = freevars[PEEKARG()];
4693 if (PyCell_GET(c) == v)
4694 PyCell_Set(c, NULL);
4695 break;
4696 }
4697 case STORE_NAME:
4698 {
4699 PyObject *names = f->f_code->co_names;
4700 PyObject *name = GETITEM(names, PEEKARG());
4701 PyObject *locals = f->f_locals;
4702 if (PyDict_CheckExact(locals) &&
4703 PyDict_GetItem(locals, name) == v) {
4704 if (PyDict_DelItem(locals, name) != 0) {
4705 PyErr_Clear();
4706 }
4707 }
4708 break;
4709 }
4710 }
4711 }
4712
Gregory P. Smithdd96db62008-06-09 04:58:54 +00004713 if (v->ob_refcnt == 1 && !PyString_CHECK_INTERNED(v)) {
Raymond Hettinger52a21b82004-08-06 18:43:09 +00004714 /* Now we own the last reference to 'v', so we can resize it
4715 * in-place.
4716 */
Gregory P. Smithdd96db62008-06-09 04:58:54 +00004717 if (_PyString_Resize(&v, new_len) != 0) {
4718 /* XXX if _PyString_Resize() fails, 'v' has been
Thomas Wouterse2176022007-09-20 17:35:10 +00004719 * deallocated so it cannot be put back into
4720 * 'variable'. The MemoryError is raised when there
4721 * is no value in 'variable', which might (very
4722 * remotely) be a cause of incompatibilities.
Raymond Hettinger52a21b82004-08-06 18:43:09 +00004723 */
4724 return NULL;
4725 }
4726 /* copy 'w' into the newly allocated area of 'v' */
Gregory P. Smithdd96db62008-06-09 04:58:54 +00004727 memcpy(PyString_AS_STRING(v) + v_len,
4728 PyString_AS_STRING(w), w_len);
Raymond Hettinger52a21b82004-08-06 18:43:09 +00004729 return v;
4730 }
4731 else {
4732 /* When in-place resizing is not an option. */
Gregory P. Smithdd96db62008-06-09 04:58:54 +00004733 PyString_Concat(&v, w);
Raymond Hettinger52a21b82004-08-06 18:43:09 +00004734 return v;
4735 }
4736}
4737
Guido van Rossum950361c1997-01-24 13:49:28 +00004738#ifdef DYNAMIC_EXECUTION_PROFILE
4739
Fredrik Lundh7a830892006-05-27 10:39:48 +00004740static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004741getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00004742{
4743 int i;
4744 PyObject *l = PyList_New(256);
4745 if (l == NULL) return NULL;
4746 for (i = 0; i < 256; i++) {
4747 PyObject *x = PyInt_FromLong(a[i]);
4748 if (x == NULL) {
4749 Py_DECREF(l);
4750 return NULL;
4751 }
4752 PyList_SetItem(l, i, x);
4753 }
4754 for (i = 0; i < 256; i++)
4755 a[i] = 0;
4756 return l;
4757}
4758
4759PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004760_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00004761{
4762#ifndef DXPAIRS
4763 return getarray(dxp);
4764#else
4765 int i;
4766 PyObject *l = PyList_New(257);
4767 if (l == NULL) return NULL;
4768 for (i = 0; i < 257; i++) {
4769 PyObject *x = getarray(dxpairs[i]);
4770 if (x == NULL) {
4771 Py_DECREF(l);
4772 return NULL;
4773 }
4774 PyList_SetItem(l, i, x);
4775 }
4776 return l;
4777#endif
4778}
4779
4780#endif