blob: 646388106f70eca8322afda591cd60a485a6940b [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum6d023c91995-01-04 19:12:13 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossumf70e43a1991-02-19 12:39:46 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000029
30******************************************************************/
31
Guido van Rossum3f5da241990-12-20 15:06:42 +000032/* Execute compiled code */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000033
Guido van Rossum681d79a1995-07-18 14:51:37 +000034/* XXX TO DO:
35 XXX how to pass arguments to call_trace?
Guido van Rossum681d79a1995-07-18 14:51:37 +000036 XXX speed up searching for keywords by using a dictionary
Guido van Rossum681d79a1995-07-18 14:51:37 +000037 XXX document it!
38 */
39
Guido van Rossumb209a111997-04-29 18:18:01 +000040#include "Python.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000041
Guido van Rossum10dc2e81990-11-18 17:27:39 +000042#include "compile.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000043#include "frameobject.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000044#include "eval.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000045#include "opcode.h"
46
Guido van Rossumc6004111993-11-05 10:22:19 +000047#include <ctype.h>
48
Guido van Rossuma027efa1997-05-05 20:56:21 +000049#ifdef HAVE_LIMITS_H
50#include <limits.h>
51#else
52#define INT_MAX 2147483647
53#endif
54
Guido van Rossum04691fc1992-08-12 15:35:34 +000055/* Turn this on if your compiler chokes on the big switch: */
Guido van Rossum1ae940a1995-01-02 19:04:15 +000056/* #define CASE_TOO_BIG 1 */
Guido van Rossum04691fc1992-08-12 15:35:34 +000057
Guido van Rossum408027e1996-12-30 16:17:54 +000058#ifdef Py_DEBUG
Guido van Rossum96a42c81992-01-12 02:29:51 +000059/* For debugging the interpreter: */
60#define LLTRACE 1 /* Low-level trace feature */
61#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000062#endif
63
Guido van Rossum5b722181993-03-30 17:46:03 +000064
Guido van Rossum374a9221991-04-04 10:40:29 +000065/* Forward declarations */
Guido van Rossum374a9221991-04-04 10:40:29 +000066
Guido van Rossumb209a111997-04-29 18:18:01 +000067static PyObject *eval_code2 Py_PROTO((PyCodeObject *,
68 PyObject *, PyObject *,
69 PyObject **, int,
70 PyObject **, int,
71 PyObject **, int,
72 PyObject *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000073#ifdef LLTRACE
Guido van Rossumb209a111997-04-29 18:18:01 +000074static int prtrace Py_PROTO((PyObject *, char *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000075#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +000076static void call_exc_trace Py_PROTO((PyObject **, PyObject**,
77 PyFrameObject *));
78static int call_trace Py_PROTO((PyObject **, PyObject **,
79 PyFrameObject *, char *, PyObject *));
Guido van Rossumb209a111997-04-29 18:18:01 +000080static PyObject *call_builtin Py_PROTO((PyObject *, PyObject *, PyObject *));
81static PyObject *call_function Py_PROTO((PyObject *, PyObject *, PyObject *));
Guido van Rossumb209a111997-04-29 18:18:01 +000082static PyObject *loop_subscript Py_PROTO((PyObject *, PyObject *));
Guido van Rossuma027efa1997-05-05 20:56:21 +000083static int slice_index Py_PROTO((PyObject *, int *));
Guido van Rossumb209a111997-04-29 18:18:01 +000084static PyObject *apply_slice Py_PROTO((PyObject *, PyObject *, PyObject *));
Guido van Rossuma027efa1997-05-05 20:56:21 +000085static int assign_slice Py_PROTO((PyObject *, PyObject *,
86 PyObject *, PyObject *));
Guido van Rossumb209a111997-04-29 18:18:01 +000087static PyObject *cmp_outcome Py_PROTO((int, PyObject *, PyObject *));
88static int import_from Py_PROTO((PyObject *, PyObject *, PyObject *));
89static PyObject *build_class Py_PROTO((PyObject *, PyObject *, PyObject *));
Guido van Rossuma027efa1997-05-05 20:56:21 +000090static int exec_statement Py_PROTO((PyFrameObject *,
91 PyObject *, PyObject *, PyObject *));
Guido van Rossumb209a111997-04-29 18:18:01 +000092static PyObject *find_from_args Py_PROTO((PyFrameObject *, int));
Guido van Rossuma027efa1997-05-05 20:56:21 +000093static void set_exc_info Py_PROTO((PyThreadState *,
94 PyObject *, PyObject *, PyObject *));
95static void reset_exc_info Py_PROTO((PyThreadState *));
Guido van Rossum374a9221991-04-04 10:40:29 +000096
97
Guido van Rossum950361c1997-01-24 13:49:28 +000098/* Dynamic execution profile */
99#ifdef DYNAMIC_EXECUTION_PROFILE
100#ifdef DXPAIRS
101static long dxpairs[257][256];
102#define dxp dxpairs[256]
103#else
104static long dxp[256];
105#endif
106#endif
107
108
Guido van Rossume59214e1994-08-30 08:01:59 +0000109#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000110
Guido van Rossum2571cc81999-04-07 16:07:23 +0000111#ifndef DONT_HAVE_ERRNO_H
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000112#include <errno.h>
Guido van Rossum2571cc81999-04-07 16:07:23 +0000113#endif
Guido van Rossum49b56061998-10-01 20:42:43 +0000114#include "pythread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000115
Guido van Rossuma027efa1997-05-05 20:56:21 +0000116extern int _PyThread_Started; /* Flag for Py_Exit */
117
Guido van Rossum65d5b571998-12-21 19:32:43 +0000118static PyThread_type_lock interpreter_lock = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000119static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000120
121void
Guido van Rossumb209a111997-04-29 18:18:01 +0000122PyEval_InitThreads()
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000123{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000124 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000125 return;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000126 _PyThread_Started = 1;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000127 interpreter_lock = PyThread_allocate_lock();
128 PyThread_acquire_lock(interpreter_lock, 1);
129 main_thread = PyThread_get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000130}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000131
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000132void
Guido van Rossum25ce5661997-08-02 03:10:38 +0000133PyEval_AcquireLock()
134{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000135 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000136}
137
138void
139PyEval_ReleaseLock()
140{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000141 PyThread_release_lock(interpreter_lock);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000142}
143
144void
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000145PyEval_AcquireThread(tstate)
146 PyThreadState *tstate;
147{
148 if (tstate == NULL)
149 Py_FatalError("PyEval_AcquireThread: NULL new thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000150 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000151 if (PyThreadState_Swap(tstate) != NULL)
152 Py_FatalError(
153 "PyEval_AcquireThread: non-NULL old thread state");
154}
155
156void
157PyEval_ReleaseThread(tstate)
158 PyThreadState *tstate;
159{
160 if (tstate == NULL)
161 Py_FatalError("PyEval_ReleaseThread: NULL thread state");
162 if (PyThreadState_Swap(NULL) != tstate)
163 Py_FatalError("PyEval_ReleaseThread: wrong thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000164 PyThread_release_lock(interpreter_lock);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000165}
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000166#endif
167
Guido van Rossumff4949e1992-08-05 19:58:53 +0000168/* Functions save_thread and restore_thread are always defined so
169 dynamically loaded modules needn't be compiled separately for use
170 with and without threads: */
171
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000172PyThreadState *
Guido van Rossumb209a111997-04-29 18:18:01 +0000173PyEval_SaveThread()
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000174{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000175 PyThreadState *tstate = PyThreadState_Swap(NULL);
176 if (tstate == NULL)
177 Py_FatalError("PyEval_SaveThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000178#ifdef WITH_THREAD
Guido van Rossumb74eca91997-09-30 22:03:16 +0000179 if (interpreter_lock)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000180 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000181#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000182 return tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000183}
184
185void
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000186PyEval_RestoreThread(tstate)
187 PyThreadState *tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000188{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000189 if (tstate == NULL)
190 Py_FatalError("PyEval_RestoreThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000191#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000192 if (interpreter_lock) {
Guido van Rossumb74eca91997-09-30 22:03:16 +0000193 int err = errno;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000194 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000195 errno = err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000196 }
197#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000198 PyThreadState_Swap(tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000199}
200
201
Guido van Rossuma9672091994-09-14 13:31:22 +0000202/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
203 signal handlers or Mac I/O completion routines) can schedule calls
204 to a function to be called synchronously.
205 The synchronous function is called with one void* argument.
206 It should return 0 for success or -1 for failure -- failure should
207 be accompanied by an exception.
208
209 If registry succeeds, the registry function returns 0; if it fails
210 (e.g. due to too many pending calls) it returns -1 (without setting
211 an exception condition).
212
213 Note that because registry may occur from within signal handlers,
214 or other asynchronous events, calling malloc() is unsafe!
215
216#ifdef WITH_THREAD
217 Any thread can schedule pending calls, but only the main thread
218 will execute them.
219#endif
220
221 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
222 There are two possible race conditions:
223 (1) nested asynchronous registry calls;
224 (2) registry calls made while pending calls are being processed.
225 While (1) is very unlikely, (2) is a real possibility.
226 The current code is safe against (2), but not against (1).
227 The safety against (2) is derived from the fact that only one
228 thread (the main thread) ever takes things out of the queue.
Guido van Rossuma9672091994-09-14 13:31:22 +0000229
Guido van Rossuma027efa1997-05-05 20:56:21 +0000230 XXX Darn! With the advent of thread state, we should have an array
231 of pending calls per thread in the thread state! Later...
232*/
Guido van Rossum8861b741996-07-30 16:49:37 +0000233
Guido van Rossuma9672091994-09-14 13:31:22 +0000234#define NPENDINGCALLS 32
235static struct {
Guido van Rossumb209a111997-04-29 18:18:01 +0000236 int (*func) Py_PROTO((ANY *));
Guido van Rossuma9672091994-09-14 13:31:22 +0000237 ANY *arg;
238} pendingcalls[NPENDINGCALLS];
239static volatile int pendingfirst = 0;
240static volatile int pendinglast = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000241static volatile int things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000242
243int
244Py_AddPendingCall(func, arg)
Guido van Rossumb209a111997-04-29 18:18:01 +0000245 int (*func) Py_PROTO((ANY *));
Guido van Rossuma9672091994-09-14 13:31:22 +0000246 ANY *arg;
247{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000248 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000249 int i, j;
250 /* XXX Begin critical section */
251 /* XXX If you want this to be safe against nested
252 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000253 if (busy)
254 return -1;
255 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000256 i = pendinglast;
257 j = (i + 1) % NPENDINGCALLS;
258 if (j == pendingfirst)
259 return -1; /* Queue full */
260 pendingcalls[i].func = func;
261 pendingcalls[i].arg = arg;
262 pendinglast = j;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000263 things_to_do = 1; /* Signal main loop */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000264 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000265 /* XXX End critical section */
266 return 0;
267}
268
Guido van Rossum180d7b41994-09-29 09:45:57 +0000269int
270Py_MakePendingCalls()
Guido van Rossuma9672091994-09-14 13:31:22 +0000271{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000272 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000273#ifdef WITH_THREAD
Guido van Rossum65d5b571998-12-21 19:32:43 +0000274 if (main_thread && PyThread_get_thread_ident() != main_thread)
Guido van Rossuma9672091994-09-14 13:31:22 +0000275 return 0;
276#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000277 if (busy)
Guido van Rossum180d7b41994-09-29 09:45:57 +0000278 return 0;
279 busy = 1;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000280 things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000281 for (;;) {
282 int i;
Guido van Rossumb209a111997-04-29 18:18:01 +0000283 int (*func) Py_PROTO((ANY *));
Guido van Rossuma9672091994-09-14 13:31:22 +0000284 ANY *arg;
285 i = pendingfirst;
286 if (i == pendinglast)
287 break; /* Queue empty */
288 func = pendingcalls[i].func;
289 arg = pendingcalls[i].arg;
290 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000291 if (func(arg) < 0) {
292 busy = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000293 things_to_do = 1; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000294 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000295 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000296 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000297 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000298 return 0;
299}
300
301
Guido van Rossum374a9221991-04-04 10:40:29 +0000302/* Status code for main loop (reason for stack unwind) */
303
304enum why_code {
305 WHY_NOT, /* No error */
306 WHY_EXCEPTION, /* Exception occurred */
307 WHY_RERAISE, /* Exception re-raised by 'finally' */
308 WHY_RETURN, /* 'return' statement */
309 WHY_BREAK /* 'break' statement */
310};
311
Guido van Rossumb209a111997-04-29 18:18:01 +0000312static enum why_code do_raise Py_PROTO((PyObject *, PyObject *, PyObject *));
Barry Warsawe42b18f1997-08-25 22:13:04 +0000313static int unpack_sequence Py_PROTO((PyObject *, int, PyObject **));
Guido van Rossum1aa14831997-01-21 05:34:20 +0000314
Guido van Rossum374a9221991-04-04 10:40:29 +0000315
Guido van Rossum681d79a1995-07-18 14:51:37 +0000316/* Backward compatible interface */
Guido van Rossum374a9221991-04-04 10:40:29 +0000317
Guido van Rossumb209a111997-04-29 18:18:01 +0000318PyObject *
319PyEval_EvalCode(co, globals, locals)
320 PyCodeObject *co;
321 PyObject *globals;
322 PyObject *locals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000323{
324 return eval_code2(co,
325 globals, locals,
Guido van Rossumb209a111997-04-29 18:18:01 +0000326 (PyObject **)NULL, 0,
327 (PyObject **)NULL, 0,
328 (PyObject **)NULL, 0,
329 (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000330}
331
332
333/* Interpreter main loop */
334
Guido van Rossum8861b741996-07-30 16:49:37 +0000335#ifndef MAX_RECURSION_DEPTH
336#define MAX_RECURSION_DEPTH 10000
337#endif
338
Guido van Rossumb209a111997-04-29 18:18:01 +0000339static PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +0000340eval_code2(co, globals, locals,
341 args, argcount, kws, kwcount, defs, defcount, owner)
Guido van Rossumb209a111997-04-29 18:18:01 +0000342 PyCodeObject *co;
343 PyObject *globals;
344 PyObject *locals;
345 PyObject **args;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000346 int argcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000347 PyObject **kws; /* length: 2*kwcount */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000348 int kwcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000349 PyObject **defs;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000350 int defcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000351 PyObject *owner;
Guido van Rossum374a9221991-04-04 10:40:29 +0000352{
Guido van Rossum950361c1997-01-24 13:49:28 +0000353#ifdef DXPAIRS
354 int lastopcode = 0;
355#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000356 register unsigned char *next_instr;
Guido van Rossum50cd3481998-11-17 17:02:51 +0000357 register int opcode; /* Current opcode */
358 register int oparg; /* Current opcode argument, if any */
Guido van Rossumb209a111997-04-29 18:18:01 +0000359 register PyObject **stack_pointer;
Guido van Rossum374a9221991-04-04 10:40:29 +0000360 register enum why_code why; /* Reason for block stack unwind */
361 register int err; /* Error status -- nonzero if error */
Guido van Rossumb209a111997-04-29 18:18:01 +0000362 register PyObject *x; /* Result object -- NULL if error */
363 register PyObject *v; /* Temporary objects popped off stack */
364 register PyObject *w;
365 register PyObject *u;
366 register PyObject *t;
367 register PyFrameObject *f; /* Current frame */
Guido van Rossum50cd3481998-11-17 17:02:51 +0000368 register PyObject **fastlocals;
Guido van Rossum014518f1998-11-23 21:09:51 +0000369 PyObject *retval = NULL; /* Return value */
Guido van Rossum885553e1998-12-21 18:33:30 +0000370 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossumd076c731998-10-07 19:42:25 +0000371 unsigned char *first_instr;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000372#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000373 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000374#endif
Guido van Rossum408027e1996-12-30 16:17:54 +0000375#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000376 /* Make it easier to find out where we are with a debugger */
Guido van Rossumb209a111997-04-29 18:18:01 +0000377 char *filename = PyString_AsString(co->co_filename);
Guido van Rossum99bec951992-09-03 20:29:45 +0000378#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000379
380/* Code access macros */
381
382#define GETCONST(i) Getconst(f, i)
383#define GETNAME(i) Getname(f, i)
384#define GETNAMEV(i) Getnamev(f, i)
Guido van Rossumd076c731998-10-07 19:42:25 +0000385#define INSTR_OFFSET() (next_instr - first_instr)
Guido van Rossum374a9221991-04-04 10:40:29 +0000386#define NEXTOP() (*next_instr++)
387#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossumd076c731998-10-07 19:42:25 +0000388#define JUMPTO(x) (next_instr = first_instr + (x))
Guido van Rossum374a9221991-04-04 10:40:29 +0000389#define JUMPBY(x) (next_instr += (x))
390
391/* Stack manipulation macros */
392
393#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
394#define EMPTY() (STACK_LEVEL() == 0)
395#define TOP() (stack_pointer[-1])
396#define BASIC_PUSH(v) (*stack_pointer++ = (v))
397#define BASIC_POP() (*--stack_pointer)
398
Guido van Rossum96a42c81992-01-12 02:29:51 +0000399#ifdef LLTRACE
400#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
401#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000402#else
403#define PUSH(v) BASIC_PUSH(v)
404#define POP() BASIC_POP()
405#endif
406
Guido van Rossum681d79a1995-07-18 14:51:37 +0000407/* Local variable macros */
408
409#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumb209a111997-04-29 18:18:01 +0000410#define SETLOCAL(i, value) do { Py_XDECREF(GETLOCAL(i)); \
Guido van Rossum681d79a1995-07-18 14:51:37 +0000411 GETLOCAL(i) = value; } while (0)
412
Guido van Rossuma027efa1997-05-05 20:56:21 +0000413/* Start of code */
414
Guido van Rossum8861b741996-07-30 16:49:37 +0000415#ifdef USE_STACKCHECK
Guido van Rossuma027efa1997-05-05 20:56:21 +0000416 if (tstate->recursion_depth%10 == 0 && PyOS_CheckStack()) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000417 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
Guido van Rossum8861b741996-07-30 16:49:37 +0000418 return NULL;
419 }
420#endif
421
Guido van Rossum681d79a1995-07-18 14:51:37 +0000422 if (globals == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000423 PyErr_SetString(PyExc_SystemError, "eval_code2: NULL globals");
Guido van Rossum6135a871995-01-09 17:53:26 +0000424 return NULL;
Guido van Rossum5b722181993-03-30 17:46:03 +0000425 }
426
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000427#ifdef LLTRACE
Guido van Rossumb209a111997-04-29 18:18:01 +0000428 lltrace = PyDict_GetItemString(globals, "__lltrace__") != NULL;
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000429#endif
430
Guido van Rossumb209a111997-04-29 18:18:01 +0000431 f = PyFrame_New(
Guido van Rossuma027efa1997-05-05 20:56:21 +0000432 tstate, /*back*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000433 co, /*code*/
434 globals, /*globals*/
Guido van Rossum76836021997-01-20 04:26:20 +0000435 locals); /*locals*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000436 if (f == NULL)
437 return NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000438
Guido van Rossuma027efa1997-05-05 20:56:21 +0000439 tstate->frame = f;
Guido van Rossumdeb0c5e1997-01-27 23:42:36 +0000440 fastlocals = f->f_localsplus;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000441
442 if (co->co_argcount > 0 ||
443 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
444 int i;
445 int n = argcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000446 PyObject *kwdict = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000447 if (co->co_flags & CO_VARKEYWORDS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000448 kwdict = PyDict_New();
Guido van Rossum681d79a1995-07-18 14:51:37 +0000449 if (kwdict == NULL)
450 goto fail;
Guido van Rossum8c5df061997-01-24 04:19:24 +0000451 i = co->co_argcount;
452 if (co->co_flags & CO_VARARGS)
453 i++;
454 SETLOCAL(i, kwdict);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000455 }
456 if (argcount > co->co_argcount) {
457 if (!(co->co_flags & CO_VARARGS)) {
Guido van Rossumdf9db1e1997-11-19 16:05:40 +0000458 PyErr_Format(PyExc_TypeError,
459 "too many arguments; expected %d, got %d",
460 co->co_argcount, argcount);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000461 goto fail;
462 }
463 n = co->co_argcount;
464 }
465 for (i = 0; i < n; i++) {
466 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000467 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000468 SETLOCAL(i, x);
469 }
470 if (co->co_flags & CO_VARARGS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000471 u = PyTuple_New(argcount - n);
Guido van Rossum8c5df061997-01-24 04:19:24 +0000472 if (u == NULL)
473 goto fail;
474 SETLOCAL(co->co_argcount, u);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000475 for (i = n; i < argcount; i++) {
476 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000477 Py_INCREF(x);
478 PyTuple_SET_ITEM(u, i-n, x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000479 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000480 }
481 for (i = 0; i < kwcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000482 PyObject *keyword = kws[2*i];
483 PyObject *value = kws[2*i + 1];
Guido van Rossum681d79a1995-07-18 14:51:37 +0000484 int j;
Guido van Rossum25da5be1999-10-26 00:12:20 +0000485 if (keyword == NULL || !PyString_Check(keyword)) {
486 PyErr_SetString(PyExc_TypeError,
487 "keywords must be strings");
488 goto fail;
489 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000490 /* XXX slow -- speed up using dictionary? */
491 for (j = 0; j < co->co_argcount; j++) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000492 PyObject *nm = PyTuple_GET_ITEM(
493 co->co_varnames, j);
Guido van Rossumb209a111997-04-29 18:18:01 +0000494 if (PyObject_Compare(keyword, nm) == 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000495 break;
496 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000497 /* Check errors from Compare */
498 if (PyErr_Occurred())
499 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000500 if (j >= co->co_argcount) {
501 if (kwdict == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000502 PyErr_Format(PyExc_TypeError,
Guido van Rossuma027efa1997-05-05 20:56:21 +0000503 "unexpected keyword argument: %.400s",
504 PyString_AsString(keyword));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000505 goto fail;
506 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000507 PyDict_SetItem(kwdict, keyword, value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000508 }
509 else {
510 if (GETLOCAL(j) != NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000511 PyErr_SetString(PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +0000512 "keyword parameter redefined");
513 goto fail;
514 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000515 Py_INCREF(value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000516 SETLOCAL(j, value);
517 }
518 }
519 if (argcount < co->co_argcount) {
520 int m = co->co_argcount - defcount;
521 for (i = argcount; i < m; i++) {
522 if (GETLOCAL(i) == NULL) {
Guido van Rossumdf9db1e1997-11-19 16:05:40 +0000523 PyErr_Format(PyExc_TypeError,
524 "not enough arguments; expected %d, got %d",
525 m, i);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000526 goto fail;
527 }
528 }
529 if (n > m)
530 i = n - m;
531 else
532 i = 0;
533 for (; i < defcount; i++) {
534 if (GETLOCAL(m+i) == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000535 PyObject *def = defs[i];
536 Py_INCREF(def);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000537 SETLOCAL(m+i, def);
538 }
539 }
540 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000541 }
542 else {
543 if (argcount > 0 || kwcount > 0) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000544 PyErr_SetString(PyExc_TypeError,
545 "no arguments expected");
Guido van Rossum8c5df061997-01-24 04:19:24 +0000546 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000547 }
548 }
549
Guido van Rossuma027efa1997-05-05 20:56:21 +0000550 if (tstate->sys_tracefunc != NULL) {
551 /* tstate->sys_tracefunc, if defined, is a function that
552 will be called on *every* entry to a code block.
Guido van Rossum96a42c81992-01-12 02:29:51 +0000553 Its return value, if not None, is a function that
554 will be called at the start of each executed line
555 of code. (Actually, the function must return
556 itself in order to continue tracing.)
557 The trace functions are called with three arguments:
558 a pointer to the current frame, a string indicating
559 why the function is called, and an argument which
560 depends on the situation. The global trace function
561 (sys.trace) is also called whenever an exception
562 is detected. */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000563 if (call_trace(&tstate->sys_tracefunc,
564 &f->f_trace, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000565 Py_None/*XXX how to compute arguments now?*/)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000566 /* Trace function raised an error */
Guido van Rossum8c5df061997-01-24 04:19:24 +0000567 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000568 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000569 }
570
Guido van Rossuma027efa1997-05-05 20:56:21 +0000571 if (tstate->sys_profilefunc != NULL) {
572 /* Similar for sys_profilefunc, except it needn't return
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000573 itself and isn't called for "line" events */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000574 if (call_trace(&tstate->sys_profilefunc,
575 (PyObject**)0, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000576 Py_None/*XXX*/)) {
Guido van Rossum8c5df061997-01-24 04:19:24 +0000577 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000578 }
579 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000580
Guido van Rossuma027efa1997-05-05 20:56:21 +0000581 if (++tstate->recursion_depth > MAX_RECURSION_DEPTH) {
582 --tstate->recursion_depth;
583 PyErr_SetString(PyExc_RuntimeError,
584 "Maximum recursion depth exceeded");
585 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +0000586 Py_DECREF(f);
Guido van Rossum8861b741996-07-30 16:49:37 +0000587 return NULL;
588 }
589
Guido van Rossumd076c731998-10-07 19:42:25 +0000590 _PyCode_GETCODEPTR(co, &first_instr);
591 next_instr = first_instr;
Guido van Rossum374a9221991-04-04 10:40:29 +0000592 stack_pointer = f->f_valuestack;
593
Guido van Rossum374a9221991-04-04 10:40:29 +0000594 why = WHY_NOT;
595 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000596 x = Py_None; /* Not a reference, just anything non-NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000597
598 for (;;) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000599 /* Do periodic things. Doing this every time through
600 the loop would add too much overhead, so we do it
601 only every Nth instruction. We also do it if
602 ``things_to_do'' is set, i.e. when an asynchronous
603 event needs attention (e.g. a signal handler or
604 async I/O handler); see Py_AddPendingCall() and
605 Py_MakePendingCalls() above. */
Guido van Rossuma9672091994-09-14 13:31:22 +0000606
Guido van Rossuma027efa1997-05-05 20:56:21 +0000607 if (things_to_do || --tstate->ticker < 0) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000608 tstate->ticker = tstate->interp->checkinterval;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000609 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000610 if (Py_MakePendingCalls() < 0) {
611 why = WHY_EXCEPTION;
612 goto on_error;
613 }
614 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000615#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000616 /* If we have true signals, the signal handler
617 will call Py_AddPendingCall() so we don't
618 have to call sigcheck(). On the Mac and
619 DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000620 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000621 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000622 goto on_error;
623 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000624#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000625
Guido van Rossume59214e1994-08-30 08:01:59 +0000626#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000627 if (interpreter_lock) {
628 /* Give another thread a chance */
629
Guido van Rossum25ce5661997-08-02 03:10:38 +0000630 if (PyThreadState_Swap(NULL) != tstate)
631 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000632 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000633
634 /* Other threads may run now */
635
Guido van Rossum65d5b571998-12-21 19:32:43 +0000636 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000637 if (PyThreadState_Swap(tstate) != NULL)
638 Py_FatalError("ceval: orphan tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000639 }
640#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000641 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000642
Guido van Rossum374a9221991-04-04 10:40:29 +0000643 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000644
Guido van Rossum408027e1996-12-30 16:17:54 +0000645#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000646 f->f_lasti = INSTR_OFFSET();
647#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000648
649 opcode = NEXTOP();
650 if (HAS_ARG(opcode))
651 oparg = NEXTARG();
Guido van Rossum950361c1997-01-24 13:49:28 +0000652#ifdef DYNAMIC_EXECUTION_PROFILE
653#ifdef DXPAIRS
654 dxpairs[lastopcode][opcode]++;
655 lastopcode = opcode;
656#endif
657 dxp[opcode]++;
658#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000659
Guido van Rossum96a42c81992-01-12 02:29:51 +0000660#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000661 /* Instruction tracing */
662
Guido van Rossum96a42c81992-01-12 02:29:51 +0000663 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000664 if (HAS_ARG(opcode)) {
665 printf("%d: %d, %d\n",
666 (int) (INSTR_OFFSET() - 3),
667 opcode, oparg);
668 }
669 else {
670 printf("%d: %d\n",
671 (int) (INSTR_OFFSET() - 1), opcode);
672 }
673 }
674#endif
675
676 /* Main switch on opcode */
677
678 switch (opcode) {
679
680 /* BEWARE!
681 It is essential that any operation that fails sets either
682 x to NULL, err to nonzero, or why to anything but WHY_NOT,
683 and that no operation that succeeds does this! */
684
685 /* case STOP_CODE: this is an error! */
686
687 case POP_TOP:
688 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000689 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000690 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000691
692 case ROT_TWO:
693 v = POP();
694 w = POP();
695 PUSH(v);
696 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000697 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000698
699 case ROT_THREE:
700 v = POP();
701 w = POP();
702 x = POP();
703 PUSH(v);
704 PUSH(x);
705 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000706 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000707
708 case DUP_TOP:
709 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000710 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000711 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000712 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000713
714 case UNARY_POSITIVE:
715 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000716 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000717 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000718 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000719 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000720 break;
721
722 case UNARY_NEGATIVE:
723 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000724 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000725 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000726 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000727 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000728 break;
729
730 case UNARY_NOT:
731 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000732 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000733 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000734 if (err == 0) {
735 Py_INCREF(Py_True);
736 PUSH(Py_True);
737 continue;
738 }
739 else if (err > 0) {
740 Py_INCREF(Py_False);
741 PUSH(Py_False);
742 err = 0;
743 continue;
744 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000745 break;
746
747 case UNARY_CONVERT:
748 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000749 x = PyObject_Repr(v);
750 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000751 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000752 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000753 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000754
755 case UNARY_INVERT:
756 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000757 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000758 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000759 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000760 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000761 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000762
Guido van Rossum50564e81996-01-12 01:13:16 +0000763 case BINARY_POWER:
764 w = POP();
765 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000766 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000767 Py_DECREF(v);
768 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000769 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000770 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000771 break;
772
Guido van Rossum374a9221991-04-04 10:40:29 +0000773 case BINARY_MULTIPLY:
774 w = POP();
775 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000776 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000777 Py_DECREF(v);
778 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000779 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000780 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000781 break;
782
783 case BINARY_DIVIDE:
784 w = POP();
785 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000786 x = PyNumber_Divide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000787 Py_DECREF(v);
788 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000789 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000790 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000791 break;
792
793 case BINARY_MODULO:
794 w = POP();
795 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000796 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000797 Py_DECREF(v);
798 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000799 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000800 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000801 break;
802
803 case BINARY_ADD:
804 w = POP();
805 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000806 if (PyInt_Check(v) && PyInt_Check(w)) {
807 /* INLINE: int + int */
808 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000809 a = PyInt_AS_LONG(v);
810 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000811 i = a + b;
812 if ((i^a) < 0 && (i^b) < 0) {
813 PyErr_SetString(PyExc_OverflowError,
814 "integer addition");
815 x = NULL;
816 }
817 else
818 x = PyInt_FromLong(i);
819 }
820 else
821 x = PyNumber_Add(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000822 Py_DECREF(v);
823 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000824 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000825 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000826 break;
827
828 case BINARY_SUBTRACT:
829 w = POP();
830 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000831 if (PyInt_Check(v) && PyInt_Check(w)) {
832 /* INLINE: int - int */
833 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000834 a = PyInt_AS_LONG(v);
835 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000836 i = a - b;
837 if ((i^a) < 0 && (i^~b) < 0) {
838 PyErr_SetString(PyExc_OverflowError,
839 "integer subtraction");
840 x = NULL;
841 }
842 else
843 x = PyInt_FromLong(i);
844 }
845 else
846 x = PyNumber_Subtract(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000847 Py_DECREF(v);
848 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000849 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000850 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000851 break;
852
853 case BINARY_SUBSCR:
854 w = POP();
855 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000856 if (PyList_Check(v) && PyInt_Check(w)) {
857 /* INLINE: list[int] */
858 long i = PyInt_AsLong(w);
859 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +0000860 i += PyList_GET_SIZE(v);
Guido van Rossumc12da691997-07-17 23:12:42 +0000861 if (i < 0 ||
Guido van Rossumfa00e951998-07-08 15:02:37 +0000862 i >= PyList_GET_SIZE(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +0000863 PyErr_SetString(PyExc_IndexError,
864 "list index out of range");
865 x = NULL;
866 }
867 else {
Guido van Rossumfa00e951998-07-08 15:02:37 +0000868 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +0000869 Py_INCREF(x);
870 }
871 }
872 else
873 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000874 Py_DECREF(v);
875 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000876 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000877 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000878 break;
879
Guido van Rossum7928cd71991-10-24 14:59:31 +0000880 case BINARY_LSHIFT:
881 w = POP();
882 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000883 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000884 Py_DECREF(v);
885 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000886 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000887 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000888 break;
889
890 case BINARY_RSHIFT:
891 w = POP();
892 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000893 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000894 Py_DECREF(v);
895 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000896 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000897 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000898 break;
899
900 case BINARY_AND:
901 w = POP();
902 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000903 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000904 Py_DECREF(v);
905 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000906 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000907 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000908 break;
909
910 case BINARY_XOR:
911 w = POP();
912 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000913 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000914 Py_DECREF(v);
915 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000916 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000917 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000918 break;
919
920 case BINARY_OR:
921 w = POP();
922 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000923 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000924 Py_DECREF(v);
925 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000926 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000927 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000928 break;
929
Guido van Rossum374a9221991-04-04 10:40:29 +0000930 case SLICE+0:
931 case SLICE+1:
932 case SLICE+2:
933 case SLICE+3:
934 if ((opcode-SLICE) & 2)
935 w = POP();
936 else
937 w = NULL;
938 if ((opcode-SLICE) & 1)
939 v = POP();
940 else
941 v = NULL;
942 u = POP();
943 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000944 Py_DECREF(u);
945 Py_XDECREF(v);
946 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000947 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000948 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000949 break;
950
951 case STORE_SLICE+0:
952 case STORE_SLICE+1:
953 case STORE_SLICE+2:
954 case STORE_SLICE+3:
955 if ((opcode-STORE_SLICE) & 2)
956 w = POP();
957 else
958 w = NULL;
959 if ((opcode-STORE_SLICE) & 1)
960 v = POP();
961 else
962 v = NULL;
963 u = POP();
964 t = POP();
965 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +0000966 Py_DECREF(t);
967 Py_DECREF(u);
968 Py_XDECREF(v);
969 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000970 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000971 break;
972
973 case DELETE_SLICE+0:
974 case DELETE_SLICE+1:
975 case DELETE_SLICE+2:
976 case DELETE_SLICE+3:
977 if ((opcode-DELETE_SLICE) & 2)
978 w = POP();
979 else
980 w = NULL;
981 if ((opcode-DELETE_SLICE) & 1)
982 v = POP();
983 else
984 v = NULL;
985 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000986 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +0000987 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +0000988 Py_DECREF(u);
989 Py_XDECREF(v);
990 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000991 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000992 break;
993
994 case STORE_SUBSCR:
995 w = POP();
996 v = POP();
997 u = POP();
998 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +0000999 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001000 Py_DECREF(u);
1001 Py_DECREF(v);
1002 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001003 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001004 break;
1005
1006 case DELETE_SUBSCR:
1007 w = POP();
1008 v = POP();
1009 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001010 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001011 Py_DECREF(v);
1012 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001013 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001014 break;
1015
1016 case PRINT_EXPR:
1017 v = POP();
Guido van Rossumaa06b0e1997-12-26 22:15:57 +00001018 /* Print value except if None */
1019 /* After printing, also assign to '_' */
1020 /* Before, set '_' to None to avoid recursion */
Guido van Rossumb209a111997-04-29 18:18:01 +00001021 if (v != Py_None &&
Guido van Rossuma027efa1997-05-05 20:56:21 +00001022 (err = PyDict_SetItemString(
Guido van Rossumaa06b0e1997-12-26 22:15:57 +00001023 f->f_builtins, "_", Py_None)) == 0) {
Guido van Rossumbe270261997-05-22 22:26:18 +00001024 err = Py_FlushLine();
Guido van Rossumc12da691997-07-17 23:12:42 +00001025 if (err == 0) {
Guido van Rossumbe270261997-05-22 22:26:18 +00001026 x = PySys_GetObject("stdout");
Guido van Rossum8f183201997-12-31 05:53:15 +00001027 if (x == NULL) {
1028 PyErr_SetString(
1029 PyExc_RuntimeError,
1030 "lost sys.stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00001031 err = -1;
Guido van Rossum8f183201997-12-31 05:53:15 +00001032 }
Guido van Rossumbe270261997-05-22 22:26:18 +00001033 }
1034 if (err == 0)
1035 err = PyFile_WriteObject(v, x, 0);
1036 if (err == 0) {
1037 PyFile_SoftSpace(x, 1);
1038 err = Py_FlushLine();
1039 }
Guido van Rossumaa06b0e1997-12-26 22:15:57 +00001040 if (err == 0) {
1041 err = PyDict_SetItemString(
1042 f->f_builtins, "_", v);
1043 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001044 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001045 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001046 break;
1047
1048 case PRINT_ITEM:
1049 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001050 w = PySys_GetObject("stdout");
Guido van Rossum8f183201997-12-31 05:53:15 +00001051 if (w == NULL) {
1052 PyErr_SetString(PyExc_RuntimeError,
1053 "lost sys.stdout");
1054 err = -1;
1055 }
1056 else if (PyFile_SoftSpace(w, 1))
Guido van Rossumbe270261997-05-22 22:26:18 +00001057 err = PyFile_WriteString(" ", w);
1058 if (err == 0)
1059 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Guido van Rossumb209a111997-04-29 18:18:01 +00001060 if (err == 0 && PyString_Check(v)) {
Guido van Rossumc6004111993-11-05 10:22:19 +00001061 /* XXX move into writeobject() ? */
Guido van Rossumb209a111997-04-29 18:18:01 +00001062 char *s = PyString_AsString(v);
1063 int len = PyString_Size(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +00001064 if (len > 0 &&
1065 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +00001066 s[len-1] != ' ')
Guido van Rossumb209a111997-04-29 18:18:01 +00001067 PyFile_SoftSpace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001068 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001069 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001070 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001071 break;
1072
1073 case PRINT_NEWLINE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001074 x = PySys_GetObject("stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001075 if (x == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00001076 PyErr_SetString(PyExc_RuntimeError,
1077 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001078 else {
Guido van Rossumbe270261997-05-22 22:26:18 +00001079 err = PyFile_WriteString("\n", x);
1080 if (err == 0)
1081 PyFile_SoftSpace(x, 0);
Guido van Rossum3165fe61992-09-25 21:59:05 +00001082 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001083 break;
1084
1085 case BREAK_LOOP:
1086 why = WHY_BREAK;
1087 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001088
Guido van Rossumf10570b1995-07-07 22:53:21 +00001089 case RAISE_VARARGS:
1090 u = v = w = NULL;
1091 switch (oparg) {
1092 case 3:
1093 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001094 /* Fallthrough */
1095 case 2:
1096 v = POP(); /* value */
1097 /* Fallthrough */
1098 case 1:
1099 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001100 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001101 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001102 break;
1103 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001104 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001105 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001106 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001107 break;
1108 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001109 break;
1110
1111 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001112 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001113 PyErr_SetString(PyExc_SystemError,
1114 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001115 break;
1116 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001117 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001118 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001119 break;
1120
1121 case RETURN_VALUE:
1122 retval = POP();
1123 why = WHY_RETURN;
1124 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001125
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001126 case EXEC_STMT:
1127 w = POP();
1128 v = POP();
1129 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001130 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001131 Py_DECREF(u);
1132 Py_DECREF(v);
1133 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001134 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001135
Guido van Rossum374a9221991-04-04 10:40:29 +00001136 case POP_BLOCK:
1137 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001138 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001139 while (STACK_LEVEL() > b->b_level) {
1140 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001141 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001142 }
1143 }
1144 break;
1145
1146 case END_FINALLY:
1147 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001148 if (PyInt_Check(v)) {
1149 why = (enum why_code) PyInt_AsLong(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001150 if (why == WHY_RETURN)
1151 retval = POP();
1152 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001153 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001154 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001155 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001156 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001157 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001158 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001159 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001160 else if (v != Py_None) {
1161 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001162 "'finally' pops bad exception");
1163 why = WHY_EXCEPTION;
1164 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001165 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001166 break;
1167
1168 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001169 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001170 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001171 w = POP();
1172 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001173 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001174 Py_DECREF(u);
1175 Py_DECREF(v);
1176 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001177 break;
1178
1179 case STORE_NAME:
1180 w = GETNAMEV(oparg);
1181 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001182 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001183 PyErr_SetString(PyExc_SystemError,
1184 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001185 break;
1186 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001187 err = PyDict_SetItem(x, w, v);
1188 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001189 break;
1190
1191 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001192 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001193 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001194 PyErr_SetString(PyExc_SystemError,
1195 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001196 break;
1197 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001198 if ((err = PyDict_DelItem(x, w)) != 0)
1199 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001200 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001201
1202#ifdef CASE_TOO_BIG
1203 default: switch (opcode) {
1204#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001205
1206 case UNPACK_TUPLE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001207 case UNPACK_LIST:
1208 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001209 if (PyTuple_Check(v)) {
1210 if (PyTuple_Size(v) != oparg) {
1211 PyErr_SetString(PyExc_ValueError,
1212 "unpack tuple of wrong size");
1213 why = WHY_EXCEPTION;
1214 }
1215 else {
1216 for (; --oparg >= 0; ) {
1217 w = PyTuple_GET_ITEM(v, oparg);
1218 Py_INCREF(w);
1219 PUSH(w);
1220 }
1221 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001222 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001223 else if (PyList_Check(v)) {
1224 if (PyList_Size(v) != oparg) {
1225 PyErr_SetString(PyExc_ValueError,
1226 "unpack list of wrong size");
1227 why = WHY_EXCEPTION;
1228 }
1229 else {
1230 for (; --oparg >= 0; ) {
1231 w = PyList_GET_ITEM(v, oparg);
1232 Py_INCREF(w);
1233 PUSH(w);
1234 }
1235 }
1236 }
1237 else if (PySequence_Check(v)) {
1238 if (unpack_sequence(v, oparg,
1239 stack_pointer + oparg))
1240 stack_pointer += oparg;
1241 else
1242 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001243 }
1244 else {
Barry Warsawe42b18f1997-08-25 22:13:04 +00001245 PyErr_SetString(PyExc_TypeError,
1246 "unpack non-sequence");
1247 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001248 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001249 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001250 break;
1251
1252 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001253 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001254 v = POP();
1255 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001256 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1257 Py_DECREF(v);
1258 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001259 break;
1260
1261 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001262 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001263 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001264 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1265 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001266 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001267 break;
1268
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001269 case STORE_GLOBAL:
1270 w = GETNAMEV(oparg);
1271 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001272 err = PyDict_SetItem(f->f_globals, w, v);
1273 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001274 break;
1275
1276 case DELETE_GLOBAL:
1277 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001278 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
1279 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001280 break;
1281
Guido van Rossum374a9221991-04-04 10:40:29 +00001282 case LOAD_CONST:
1283 x = GETCONST(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001284 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001285 PUSH(x);
1286 break;
1287
1288 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001289 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001290 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001291 PyErr_SetString(PyExc_SystemError,
1292 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001293 break;
1294 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001295 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001296 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001297 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001298 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001299 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001300 if (x == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001301 PyErr_SetObject(
1302 PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001303 break;
1304 }
1305 }
1306 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001307 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001308 PUSH(x);
1309 break;
1310
1311 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001312 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001313 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001314 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001315 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001316 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001317 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001318 break;
1319 }
1320 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001321 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001322 PUSH(x);
1323 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001324
Guido van Rossum9bfef441993-03-29 10:43:31 +00001325 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001326 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001327 if (x == NULL) {
Guido van Rossum87460821999-06-22 14:47:32 +00001328 PyErr_SetObject(PyExc_UnboundLocalError,
Guido van Rossumb209a111997-04-29 18:18:01 +00001329 PyTuple_GetItem(co->co_varnames,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001330 oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001331 break;
1332 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001333 Py_INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001334 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001335 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001336 break;
1337
1338 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001339 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001340 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001341 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001342
1343 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001344 x = GETLOCAL(oparg);
1345 if (x == NULL) {
Guido van Rossum87460821999-06-22 14:47:32 +00001346 PyErr_SetObject(PyExc_UnboundLocalError,
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001347 PyTuple_GetItem(co->co_varnames,
1348 oparg));
1349 break;
1350 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001351 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001352 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001353
1354 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001355 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001356 if (x != NULL) {
1357 for (; --oparg >= 0;) {
1358 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001359 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001360 }
1361 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001362 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001363 }
1364 break;
1365
1366 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001367 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001368 if (x != NULL) {
1369 for (; --oparg >= 0;) {
1370 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001371 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001372 }
1373 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001374 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001375 }
1376 break;
1377
1378 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001379 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001380 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001381 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001382 break;
1383
1384 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001385 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001386 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001387 x = PyObject_GetAttr(v, w);
1388 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001389 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001390 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001391 break;
1392
1393 case COMPARE_OP:
1394 w = POP();
1395 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +00001396 if (PyInt_Check(v) && PyInt_Check(w)) {
1397 /* INLINE: cmp(int, int) */
1398 register long a, b;
1399 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001400 a = PyInt_AS_LONG(v);
1401 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001402 switch (oparg) {
1403 case LT: res = a < b; break;
1404 case LE: res = a <= b; break;
1405 case EQ: res = a == b; break;
1406 case NE: res = a != b; break;
1407 case GT: res = a > b; break;
1408 case GE: res = a >= b; break;
1409 case IS: res = v == w; break;
1410 case IS_NOT: res = v != w; break;
1411 default: goto slow_compare;
1412 }
1413 x = res ? Py_True : Py_False;
1414 Py_INCREF(x);
1415 }
1416 else {
1417 slow_compare:
1418 x = cmp_outcome(oparg, v, w);
1419 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001420 Py_DECREF(v);
1421 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001422 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001423 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001424 break;
1425
1426 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001427 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001428 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001429 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001430 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001431 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001432 break;
1433 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001434 u = find_from_args(f, INSTR_OFFSET());
1435 if (u == NULL) {
1436 x = u;
1437 break;
Guido van Rossum24c13741995-02-14 09:42:43 +00001438 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001439 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001440 w,
1441 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001442 f->f_locals == NULL ?
1443 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001444 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001445 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001446 if (w == NULL) {
1447 x = NULL;
1448 break;
1449 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001450 x = PyEval_CallObject(x, w);
1451 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001452 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001453 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001454 break;
1455
1456 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001457 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001458 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001459 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001460 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001461 PyErr_SetString(PyExc_SystemError,
1462 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001463 break;
1464 }
1465 err = import_from(x, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001466 PyFrame_LocalsToFast(f, 0);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001467 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001468 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001469
Guido van Rossum374a9221991-04-04 10:40:29 +00001470 case JUMP_FORWARD:
1471 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001472 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001473
1474 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001475 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001476 if (err > 0)
1477 err = 0;
1478 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001479 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001480 else
1481 break;
1482 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001483
1484 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001485 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001486 if (err > 0) {
1487 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001488 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001489 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001490 else if (err == 0)
1491 ;
1492 else
1493 break;
1494 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001495
1496 case JUMP_ABSOLUTE:
1497 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001498 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001499
1500 case FOR_LOOP:
1501 /* for v in s: ...
1502 On entry: stack contains s, i.
1503 On exit: stack contains s, i+1, s[i];
1504 but if loop exhausted:
1505 s, i are popped, and we jump */
1506 w = POP(); /* Loop index */
1507 v = POP(); /* Sequence object */
1508 u = loop_subscript(v, w);
1509 if (u != NULL) {
1510 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001511 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001512 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001513 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001514 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001515 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001516 }
1517 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001518 Py_DECREF(v);
1519 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001520 /* A NULL can mean "s exhausted"
1521 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001522 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001523 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001524 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001525 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001526 continue;
1527 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001528 }
1529 break;
1530
1531 case SETUP_LOOP:
1532 case SETUP_EXCEPT:
1533 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001534 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Guido van Rossum374a9221991-04-04 10:40:29 +00001535 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001536 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001537
1538 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001539#ifdef LLTRACE
1540 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001541 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001542#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001543 f->f_lineno = oparg;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001544 if (f->f_trace == NULL)
1545 continue;
1546 /* Trace each line of code reached */
1547 f->f_lasti = INSTR_OFFSET();
1548 err = call_trace(&f->f_trace, &f->f_trace,
Guido van Rossumb209a111997-04-29 18:18:01 +00001549 f, "line", Py_None);
Guido van Rossum374a9221991-04-04 10:40:29 +00001550 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001551
1552 case CALL_FUNCTION:
1553 {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001554 int na = oparg & 0xff;
1555 int nk = (oparg>>8) & 0xff;
1556 int n = na + 2*nk;
Guido van Rossumb209a111997-04-29 18:18:01 +00001557 PyObject **pfunc = stack_pointer - n - 1;
1558 PyObject *func = *pfunc;
1559 PyObject *self = NULL;
1560 PyObject *class = NULL;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001561 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Guido van Rossumb209a111997-04-29 18:18:01 +00001562 if (PyMethod_Check(func)) {
1563 self = PyMethod_Self(func);
1564 class = PyMethod_Class(func);
1565 func = PyMethod_Function(func);
1566 Py_INCREF(func);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001567 if (self != NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001568 Py_INCREF(self);
1569 Py_DECREF(*pfunc);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001570 *pfunc = self;
1571 na++;
1572 n++;
1573 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001574 else {
1575 /* Unbound methods must be
1576 called with an instance of
1577 the class (or a derived
1578 class) as first argument */
1579 if (na > 0 &&
1580 (self = stack_pointer[-n])
1581 != NULL &&
Guido van Rossumb209a111997-04-29 18:18:01 +00001582 PyInstance_Check(self) &&
1583 PyClass_IsSubclass(
1584 (PyObject *)
1585 (((PyInstanceObject *)self)
Guido van Rossum681d79a1995-07-18 14:51:37 +00001586 ->in_class),
1587 class))
1588 /* Handy-dandy */ ;
1589 else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001590 PyErr_SetString(
1591 PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001592 "unbound method must be called with class instance 1st argument");
Guido van Rossum72b56e81995-12-10 04:57:42 +00001593 x = NULL;
1594 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001595 }
1596 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001597 }
1598 else
Guido van Rossumb209a111997-04-29 18:18:01 +00001599 Py_INCREF(func);
1600 if (PyFunction_Check(func)) {
1601 PyObject *co = PyFunction_GetCode(func);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001602 PyObject *globals =
1603 PyFunction_GetGlobals(func);
1604 PyObject *argdefs =
1605 PyFunction_GetDefaults(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00001606 PyObject **d;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001607 int nd;
1608 if (argdefs != NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001609 d = &PyTuple_GET_ITEM(argdefs, 0);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001610 nd = ((PyTupleObject *)argdefs) ->
1611 ob_size;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001612 }
1613 else {
1614 d = NULL;
1615 nd = 0;
1616 }
1617 x = eval_code2(
Guido van Rossumb209a111997-04-29 18:18:01 +00001618 (PyCodeObject *)co,
1619 globals, (PyObject *)NULL,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001620 stack_pointer-n, na,
1621 stack_pointer-2*nk, nk,
1622 d, nd,
1623 class);
1624 }
1625 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001626 PyObject *args = PyTuple_New(na);
1627 PyObject *kwdict = NULL;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001628 if (args == NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001629 x = NULL;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001630 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001631 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001632 if (nk > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001633 kwdict = PyDict_New();
Guido van Rossumff8b4941995-07-26 18:16:42 +00001634 if (kwdict == NULL) {
1635 x = NULL;
1636 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001637 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001638 err = 0;
1639 while (--nk >= 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001640 PyObject *value = POP();
1641 PyObject *key = POP();
1642 err = PyDict_SetItem(
Guido van Rossumff8b4941995-07-26 18:16:42 +00001643 kwdict, key, value);
Guido van Rossumb209a111997-04-29 18:18:01 +00001644 Py_DECREF(key);
1645 Py_DECREF(value);
Guido van Rossumd0eb4291997-01-27 21:30:09 +00001646 if (err)
Guido van Rossumff8b4941995-07-26 18:16:42 +00001647 break;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001648 }
1649 if (err) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001650 Py_DECREF(args);
1651 Py_DECREF(kwdict);
Guido van Rossumff8b4941995-07-26 18:16:42 +00001652 break;
1653 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001654 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001655 while (--na >= 0) {
1656 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001657 PyTuple_SET_ITEM(args, na, w);
Guido van Rossumff8b4941995-07-26 18:16:42 +00001658 }
1659 x = PyEval_CallObjectWithKeywords(
1660 func, args, kwdict);
Guido van Rossumb209a111997-04-29 18:18:01 +00001661 Py_DECREF(args);
1662 Py_XDECREF(kwdict);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001663 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001664 Py_DECREF(func);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001665 while (stack_pointer > pfunc) {
1666 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001667 Py_DECREF(w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001668 }
1669 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001670 if (x != NULL) continue;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001671 break;
1672 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001673
Guido van Rossum681d79a1995-07-18 14:51:37 +00001674 case MAKE_FUNCTION:
1675 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00001676 x = PyFunction_New(v, f->f_globals);
1677 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001678 /* XXX Maybe this should be a separate opcode? */
1679 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001680 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001681 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001682 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001683 x = NULL;
1684 break;
1685 }
1686 while (--oparg >= 0) {
1687 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001688 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001689 }
1690 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001691 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001692 }
1693 PUSH(x);
1694 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001695
1696 case BUILD_SLICE:
1697 if (oparg == 3)
1698 w = POP();
1699 else
1700 w = NULL;
1701 v = POP();
1702 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00001703 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001704 Py_DECREF(u);
1705 Py_DECREF(v);
1706 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00001707 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001708 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00001709 break;
1710
1711
Guido van Rossum374a9221991-04-04 10:40:29 +00001712 default:
1713 fprintf(stderr,
1714 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001715 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00001716 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00001717 why = WHY_EXCEPTION;
1718 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001719
1720#ifdef CASE_TOO_BIG
1721 }
1722#endif
1723
Guido van Rossum374a9221991-04-04 10:40:29 +00001724 } /* switch */
1725
1726 on_error:
1727
1728 /* Quickly continue if no error occurred */
1729
1730 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001731 if (err == 0 && x != NULL) {
1732#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00001733 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00001734 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00001735 fprintf(stderr,
1736 "XXX undetected error\n");
1737 else
1738#endif
1739 continue; /* Normal, fast path */
1740 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001741 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00001742 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00001743 err = 0;
1744 }
1745
Guido van Rossum374a9221991-04-04 10:40:29 +00001746 /* Double-check exception status */
1747
1748 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001749 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001750 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00001751 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00001752 why = WHY_EXCEPTION;
1753 }
1754 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00001755#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001756 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00001757 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00001758 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001759 fprintf(stderr,
1760 "XXX undetected error (why=%d)\n",
1761 why);
1762 why = WHY_EXCEPTION;
1763 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001764 }
1765#endif
1766
1767 /* Log traceback info if this is a real exception */
1768
1769 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001770 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001771 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001772 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00001773 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001774
Guido van Rossume59214e1994-08-30 08:01:59 +00001775 if (f->f_trace)
1776 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001777 if (tstate->sys_profilefunc)
1778 call_exc_trace(&tstate->sys_profilefunc,
1779 (PyObject**)0, f);
Guido van Rossum014518f1998-11-23 21:09:51 +00001780 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001781
1782 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1783
1784 if (why == WHY_RERAISE)
1785 why = WHY_EXCEPTION;
1786
1787 /* Unwind stacks if a (pseudo) exception occurred */
1788
1789 while (why != WHY_NOT && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001790 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001791 while (STACK_LEVEL() > b->b_level) {
1792 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001793 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001794 }
1795 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1796 why = WHY_NOT;
1797 JUMPTO(b->b_handler);
1798 break;
1799 }
1800 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00001801 (b->b_type == SETUP_EXCEPT &&
1802 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001803 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001804 PyObject *exc, *val, *tb;
1805 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001806 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001807 val = Py_None;
1808 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00001809 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001810 /* Make the raw exception data
1811 available to the handler,
1812 so a program can emulate the
1813 Python main loop. Don't do
1814 this for 'finally'. */
1815 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00001816 PyErr_NormalizeException(
1817 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001818 set_exc_info(tstate,
1819 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001820 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001821 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001822 PUSH(val);
1823 PUSH(exc);
1824 }
1825 else {
1826 if (why == WHY_RETURN)
1827 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00001828 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00001829 PUSH(v);
1830 }
1831 why = WHY_NOT;
1832 JUMPTO(b->b_handler);
1833 break;
1834 }
1835 } /* unwind stack */
1836
1837 /* End the loop if we still have an error (or return) */
1838
1839 if (why != WHY_NOT)
1840 break;
1841
1842 } /* main loop */
1843
1844 /* Pop remaining stack entries */
1845
1846 while (!EMPTY()) {
1847 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001848 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001849 }
1850
Guido van Rossum96a42c81992-01-12 02:29:51 +00001851 if (why != WHY_RETURN)
1852 retval = NULL;
1853
Guido van Rossume59214e1994-08-30 08:01:59 +00001854 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001855 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001856 if (call_trace(&f->f_trace, &f->f_trace, f,
1857 "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001858 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001859 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001860 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001861 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001862 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001863 }
1864
Guido van Rossuma027efa1997-05-05 20:56:21 +00001865 if (tstate->sys_profilefunc && why == WHY_RETURN) {
1866 if (call_trace(&tstate->sys_profilefunc, (PyObject**)0,
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001867 f, "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001868 Py_XDECREF(retval);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001869 retval = NULL;
1870 why = WHY_EXCEPTION;
1871 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001872 }
Guido van Rossuma4240131997-01-21 21:18:36 +00001873
Guido van Rossuma027efa1997-05-05 20:56:21 +00001874 reset_exc_info(tstate);
1875
1876 --tstate->recursion_depth;
Guido van Rossum8c5df061997-01-24 04:19:24 +00001877
1878 fail: /* Jump here from prelude on failure */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001879
Guido van Rossum374a9221991-04-04 10:40:29 +00001880 /* Restore previous frame and release the current one */
Guido van Rossum681d79a1995-07-18 14:51:37 +00001881
Guido van Rossuma027efa1997-05-05 20:56:21 +00001882 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +00001883 Py_DECREF(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001884
Guido van Rossum96a42c81992-01-12 02:29:51 +00001885 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001886}
1887
Guido van Rossuma027efa1997-05-05 20:56:21 +00001888static void
1889set_exc_info(tstate, type, value, tb)
1890 PyThreadState *tstate;
1891 PyObject *type;
1892 PyObject *value;
1893 PyObject *tb;
1894{
1895 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001896 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00001897
Guido van Rossuma027efa1997-05-05 20:56:21 +00001898 frame = tstate->frame;
1899 if (frame->f_exc_type == NULL) {
1900 /* This frame didn't catch an exception before */
1901 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00001902 if (tstate->exc_type == NULL) {
1903 Py_INCREF(Py_None);
1904 tstate->exc_type = Py_None;
1905 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001906 tmp_type = frame->f_exc_type;
1907 tmp_value = frame->f_exc_value;
1908 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001909 Py_XINCREF(tstate->exc_type);
1910 Py_XINCREF(tstate->exc_value);
1911 Py_XINCREF(tstate->exc_traceback);
1912 frame->f_exc_type = tstate->exc_type;
1913 frame->f_exc_value = tstate->exc_value;
1914 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001915 Py_XDECREF(tmp_type);
1916 Py_XDECREF(tmp_value);
1917 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001918 }
1919 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001920 tmp_type = tstate->exc_type;
1921 tmp_value = tstate->exc_value;
1922 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001923 Py_XINCREF(type);
1924 Py_XINCREF(value);
1925 Py_XINCREF(tb);
1926 tstate->exc_type = type;
1927 tstate->exc_value = value;
1928 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001929 Py_XDECREF(tmp_type);
1930 Py_XDECREF(tmp_value);
1931 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001932 /* For b/w compatibility */
1933 PySys_SetObject("exc_type", type);
1934 PySys_SetObject("exc_value", value);
1935 PySys_SetObject("exc_traceback", tb);
1936}
1937
1938static void
1939reset_exc_info(tstate)
1940 PyThreadState *tstate;
1941{
1942 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001943 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001944 frame = tstate->frame;
1945 if (frame->f_exc_type != NULL) {
1946 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001947 tmp_type = tstate->exc_type;
1948 tmp_value = tstate->exc_value;
1949 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001950 Py_XINCREF(frame->f_exc_type);
1951 Py_XINCREF(frame->f_exc_value);
1952 Py_XINCREF(frame->f_exc_traceback);
1953 tstate->exc_type = frame->f_exc_type;
1954 tstate->exc_value = frame->f_exc_value;
1955 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001956 Py_XDECREF(tmp_type);
1957 Py_XDECREF(tmp_value);
1958 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001959 /* For b/w compatibility */
1960 PySys_SetObject("exc_type", frame->f_exc_type);
1961 PySys_SetObject("exc_value", frame->f_exc_value);
1962 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
1963 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001964 tmp_type = frame->f_exc_type;
1965 tmp_value = frame->f_exc_value;
1966 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001967 frame->f_exc_type = NULL;
1968 frame->f_exc_value = NULL;
1969 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001970 Py_XDECREF(tmp_type);
1971 Py_XDECREF(tmp_value);
1972 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001973}
1974
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001975/* Logic for the raise statement (too complicated for inlining).
1976 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00001977static enum why_code
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001978do_raise(type, value, tb)
Guido van Rossumb209a111997-04-29 18:18:01 +00001979 PyObject *type, *value, *tb;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001980{
Guido van Rossumd295f121998-04-09 21:39:57 +00001981 if (type == NULL) {
1982 /* Reraise */
1983 PyThreadState *tstate = PyThreadState_Get();
1984 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
1985 value = tstate->exc_value;
1986 tb = tstate->exc_traceback;
1987 Py_XINCREF(type);
1988 Py_XINCREF(value);
1989 Py_XINCREF(tb);
1990 }
1991
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001992 /* We support the following forms of raise:
1993 raise <class>, <classinstance>
1994 raise <class>, <argument tuple>
1995 raise <class>, None
1996 raise <class>, <argument>
1997 raise <classinstance>, None
1998 raise <string>, <object>
1999 raise <string>, None
2000
2001 An omitted second argument is the same as None.
2002
2003 In addition, raise <tuple>, <anything> is the same as
2004 raising the tuple's first item (and it better have one!);
2005 this rule is applied recursively.
2006
2007 Finally, an optional third argument can be supplied, which
2008 gives the traceback to be substituted (useful when
2009 re-raising an exception after examining it). */
2010
2011 /* First, check the traceback argument, replacing None with
2012 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002013 if (tb == Py_None) {
2014 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002015 tb = NULL;
2016 }
2017 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002018 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002019 "raise 3rd arg must be traceback or None");
2020 goto raise_error;
2021 }
2022
2023 /* Next, replace a missing value with None */
2024 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002025 value = Py_None;
2026 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002027 }
2028
2029 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002030 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2031 PyObject *tmp = type;
2032 type = PyTuple_GET_ITEM(type, 0);
2033 Py_INCREF(type);
2034 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002035 }
2036
Barry Warsaw4249f541997-08-22 21:26:19 +00002037 if (PyString_Check(type))
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002038 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002039
2040 else if (PyClass_Check(type))
2041 PyErr_NormalizeException(&type, &value, &tb);
2042
Guido van Rossumb209a111997-04-29 18:18:01 +00002043 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002044 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002045 if (value != Py_None) {
2046 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002047 "instance exception may not have a separate value");
2048 goto raise_error;
2049 }
2050 else {
2051 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002052 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002053 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002054 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2055 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002056 }
2057 }
2058 else {
2059 /* Not something you can raise. You get an exception
2060 anyway, just not what you specified :-) */
Guido van Rossumb209a111997-04-29 18:18:01 +00002061 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002062 "exceptions must be strings, classes, or instances");
2063 goto raise_error;
2064 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002065 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002066 if (tb == NULL)
2067 return WHY_EXCEPTION;
2068 else
2069 return WHY_RERAISE;
2070 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002071 Py_XDECREF(value);
2072 Py_XDECREF(type);
2073 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002074 return WHY_EXCEPTION;
2075}
2076
Barry Warsawe42b18f1997-08-25 22:13:04 +00002077static int
2078unpack_sequence(v, argcnt, sp)
2079 PyObject *v;
2080 int argcnt;
2081 PyObject **sp;
2082{
2083 int i;
2084 PyObject *w;
2085
2086 for (i = 0; i < argcnt; i++) {
2087 if (! (w = PySequence_GetItem(v, i))) {
2088 if (PyErr_ExceptionMatches(PyExc_IndexError))
2089 PyErr_SetString(PyExc_ValueError,
2090 "unpack sequence of wrong size");
2091 goto finally;
2092 }
2093 *--sp = w;
2094 }
2095 /* we better get an IndexError now */
2096 if (PySequence_GetItem(v, i) == NULL) {
2097 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
2098 PyErr_Clear();
2099 return 1;
2100 }
2101 /* some other exception occurred. fall through to finally */
2102 }
2103 else
2104 PyErr_SetString(PyExc_ValueError,
2105 "unpack sequence of wrong size");
2106 /* fall through */
2107finally:
Barry Warsaw91010551997-08-25 22:30:51 +00002108 for (; i > 0; i--, sp++)
2109 Py_DECREF(*sp);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002110
2111 return 0;
2112}
2113
2114
Guido van Rossum96a42c81992-01-12 02:29:51 +00002115#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002116static int
2117prtrace(v, str)
Guido van Rossumb209a111997-04-29 18:18:01 +00002118 PyObject *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002119 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002120{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002121 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002122 if (PyObject_Print(v, stdout, 0) != 0)
2123 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002124 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002125}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002126#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002127
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002128static void
2129call_exc_trace(p_trace, p_newtrace, f)
Guido van Rossumb209a111997-04-29 18:18:01 +00002130 PyObject **p_trace, **p_newtrace;
2131 PyFrameObject *f;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002132{
Guido van Rossumb209a111997-04-29 18:18:01 +00002133 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002134 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002135 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002136 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002137 value = Py_None;
2138 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002139 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002140 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002141 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002142 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002143 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002144 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002145 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002146 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002147 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002148 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002149 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002150 Py_XDECREF(type);
2151 Py_XDECREF(value);
2152 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002153 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002154}
2155
2156static int
2157call_trace(p_trace, p_newtrace, f, msg, arg)
Guido van Rossumb209a111997-04-29 18:18:01 +00002158 PyObject **p_trace; /* in/out; may not be NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002159 may not point to NULL variable initially */
Guido van Rossumb209a111997-04-29 18:18:01 +00002160 PyObject **p_newtrace; /* in/out; may be NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002161 may point to NULL variable;
2162 may be same variable as p_newtrace */
Guido van Rossumb209a111997-04-29 18:18:01 +00002163 PyFrameObject *f;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002164 char *msg;
Guido van Rossumb209a111997-04-29 18:18:01 +00002165 PyObject *arg;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002166{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002167 PyThreadState *tstate = f->f_tstate;
Guido van Rossumb209a111997-04-29 18:18:01 +00002168 PyObject *args, *what;
2169 PyObject *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002170
Guido van Rossuma027efa1997-05-05 20:56:21 +00002171 if (tstate->tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002172 /* Don't do recursive traces */
2173 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002174 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002175 *p_newtrace = NULL;
2176 }
2177 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002178 }
2179
Guido van Rossumb209a111997-04-29 18:18:01 +00002180 args = PyTuple_New(3);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002181 if (args == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002182 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002183 what = PyString_FromString(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002184 if (what == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002185 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002186 Py_INCREF(f);
2187 PyTuple_SET_ITEM(args, 0, (PyObject *)f);
2188 PyTuple_SET_ITEM(args, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002189 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002190 arg = Py_None;
2191 Py_INCREF(arg);
2192 PyTuple_SET_ITEM(args, 2, arg);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002193 tstate->tracing++;
Guido van Rossumb209a111997-04-29 18:18:01 +00002194 PyFrame_FastToLocals(f);
2195 res = PyEval_CallObject(*p_trace, args); /* May clear *p_trace! */
2196 PyFrame_LocalsToFast(f, 1);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002197 tstate->tracing--;
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002198 cleanup:
Guido van Rossumb209a111997-04-29 18:18:01 +00002199 Py_XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002200 if (res == NULL) {
2201 /* The trace proc raised an exception */
Guido van Rossumb209a111997-04-29 18:18:01 +00002202 PyTraceBack_Here(f);
2203 Py_XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002204 *p_trace = NULL;
2205 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002206 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002207 *p_newtrace = NULL;
2208 }
Barry Warsawf6202631999-09-08 16:26:33 +00002209 /* to be extra double plus sure we don't get recursive
2210 * calls inf either tracefunc or profilefunc gets an
2211 * exception, zap the global variables.
2212 */
2213 Py_XDECREF(tstate->sys_tracefunc);
2214 tstate->sys_tracefunc = NULL;
2215 Py_XDECREF(tstate->sys_profilefunc);
2216 tstate->sys_profilefunc = NULL;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002217 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002218 }
2219 else {
2220 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002221 Py_XDECREF(*p_newtrace);
2222 if (res == Py_None)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002223 *p_newtrace = NULL;
2224 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002225 Py_INCREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002226 *p_newtrace = res;
2227 }
2228 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002229 Py_DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002230 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002231 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002232}
2233
Guido van Rossumb209a111997-04-29 18:18:01 +00002234PyObject *
2235PyEval_GetBuiltins()
Guido van Rossum6135a871995-01-09 17:53:26 +00002236{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002237 PyThreadState *tstate = PyThreadState_Get();
2238 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002239 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002240 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002241 else
2242 return current_frame->f_builtins;
2243}
2244
Guido van Rossumb209a111997-04-29 18:18:01 +00002245PyObject *
2246PyEval_GetLocals()
Guido van Rossum5b722181993-03-30 17:46:03 +00002247{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002248 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002249 if (current_frame == NULL)
2250 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002251 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002252 return current_frame->f_locals;
2253}
2254
Guido van Rossumb209a111997-04-29 18:18:01 +00002255PyObject *
2256PyEval_GetGlobals()
Guido van Rossum3f5da241990-12-20 15:06:42 +00002257{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002258 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002259 if (current_frame == NULL)
2260 return NULL;
2261 else
2262 return current_frame->f_globals;
2263}
2264
Guido van Rossumb209a111997-04-29 18:18:01 +00002265PyObject *
2266PyEval_GetFrame()
Guido van Rossume59214e1994-08-30 08:01:59 +00002267{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002268 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002269 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002270}
2271
Guido van Rossum6135a871995-01-09 17:53:26 +00002272int
Guido van Rossumb209a111997-04-29 18:18:01 +00002273PyEval_GetRestricted()
Guido van Rossum6135a871995-01-09 17:53:26 +00002274{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002275 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002276 return current_frame == NULL ? 0 : current_frame->f_restricted;
2277}
2278
Guido van Rossumbe270261997-05-22 22:26:18 +00002279int
Guido van Rossumb209a111997-04-29 18:18:01 +00002280Py_FlushLine()
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002281{
Guido van Rossumb209a111997-04-29 18:18:01 +00002282 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002283 if (f == NULL)
2284 return 0;
2285 if (!PyFile_SoftSpace(f, 0))
2286 return 0;
2287 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002288}
2289
Guido van Rossum3f5da241990-12-20 15:06:42 +00002290
Guido van Rossum681d79a1995-07-18 14:51:37 +00002291/* External interface to call any callable object.
2292 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002293
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002294#undef PyEval_CallObject
2295/* for backward compatibility: export this interface */
2296
Guido van Rossumb209a111997-04-29 18:18:01 +00002297PyObject *
2298PyEval_CallObject(func, arg)
2299 PyObject *func;
2300 PyObject *arg;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002301{
Guido van Rossumb209a111997-04-29 18:18:01 +00002302 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002303}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002304#define PyEval_CallObject(func,arg) \
2305 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00002306
Guido van Rossumb209a111997-04-29 18:18:01 +00002307PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002308PyEval_CallObjectWithKeywords(func, arg, kw)
Guido van Rossumb209a111997-04-29 18:18:01 +00002309 PyObject *func;
2310 PyObject *arg;
2311 PyObject *kw;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002312{
2313 ternaryfunc call;
Guido van Rossumb209a111997-04-29 18:18:01 +00002314 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002315
2316 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002317 arg = PyTuple_New(0);
2318 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002319 PyErr_SetString(PyExc_TypeError,
2320 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002321 return NULL;
2322 }
2323 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002324 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002325
Guido van Rossumb209a111997-04-29 18:18:01 +00002326 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002327 PyErr_SetString(PyExc_TypeError,
2328 "keyword list must be a dictionary");
Guido van Rossume3e61c11995-08-04 04:14:47 +00002329 return NULL;
2330 }
2331
Guido van Rossum150b2df1996-12-05 23:17:11 +00002332 if ((call = func->ob_type->tp_call) != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002333 result = (*call)(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002334 else if (PyMethod_Check(func) || PyFunction_Check(func))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002335 result = call_function(func, arg, kw);
2336 else
2337 result = call_builtin(func, arg, kw);
2338
Guido van Rossumb209a111997-04-29 18:18:01 +00002339 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002340
Guido van Rossumb209a111997-04-29 18:18:01 +00002341 if (result == NULL && !PyErr_Occurred())
2342 PyErr_SetString(PyExc_SystemError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002343 "NULL result without error in call_object");
Guido van Rossume59214e1994-08-30 08:01:59 +00002344
2345 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002346}
2347
Guido van Rossumb209a111997-04-29 18:18:01 +00002348static PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002349call_builtin(func, arg, kw)
Guido van Rossumb209a111997-04-29 18:18:01 +00002350 PyObject *func;
2351 PyObject *arg;
2352 PyObject *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002353{
Guido van Rossumb209a111997-04-29 18:18:01 +00002354 if (PyCFunction_Check(func)) {
2355 PyCFunction meth = PyCFunction_GetFunction(func);
2356 PyObject *self = PyCFunction_GetSelf(func);
2357 int flags = PyCFunction_GetFlags(func);
Guido van Rossumff8b4941995-07-26 18:16:42 +00002358 if (!(flags & METH_VARARGS)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002359 int size = PyTuple_Size(arg);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002360 if (size == 1)
Guido van Rossumb209a111997-04-29 18:18:01 +00002361 arg = PyTuple_GET_ITEM(arg, 0);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002362 else if (size == 0)
2363 arg = NULL;
2364 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002365 if (flags & METH_KEYWORDS)
2366 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002367 if (kw != NULL && PyDict_Size(kw) != 0) {
2368 PyErr_SetString(PyExc_TypeError,
Guido van Rossumff8b4941995-07-26 18:16:42 +00002369 "this function takes no keyword arguments");
2370 return NULL;
2371 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002372 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002373 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002374 if (PyClass_Check(func)) {
2375 return PyInstance_New(func, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002376 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002377 if (PyInstance_Check(func)) {
2378 PyObject *res, *call = PyObject_GetAttrString(func,"__call__");
Guido van Rossume59214e1994-08-30 08:01:59 +00002379 if (call == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002380 PyErr_Clear();
2381 PyErr_SetString(PyExc_AttributeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002382 "no __call__ method defined");
Guido van Rossume59214e1994-08-30 08:01:59 +00002383 return NULL;
2384 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002385 res = PyEval_CallObjectWithKeywords(call, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002386 Py_DECREF(call);
Guido van Rossume59214e1994-08-30 08:01:59 +00002387 return res;
2388 }
Guido van Rossumba98a421999-11-15 19:29:33 +00002389 PyErr_Format(PyExc_TypeError, "call of non-function (type %.400s)",
Guido van Rossum2d1ad391998-08-25 18:16:54 +00002390 func->ob_type->tp_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002391 return NULL;
2392}
2393
Guido van Rossumb209a111997-04-29 18:18:01 +00002394static PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002395call_function(func, arg, kw)
Guido van Rossumb209a111997-04-29 18:18:01 +00002396 PyObject *func;
2397 PyObject *arg;
2398 PyObject *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002399{
Guido van Rossumb209a111997-04-29 18:18:01 +00002400 PyObject *class = NULL; /* == owner */
2401 PyObject *argdefs;
2402 PyObject **d, **k;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002403 int nk, nd;
Guido van Rossumb209a111997-04-29 18:18:01 +00002404 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002405
Guido van Rossumb209a111997-04-29 18:18:01 +00002406 if (kw != NULL && !PyDict_Check(kw)) {
2407 PyErr_BadInternalCall();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002408 return NULL;
2409 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002410
Guido van Rossumb209a111997-04-29 18:18:01 +00002411 if (PyMethod_Check(func)) {
2412 PyObject *self = PyMethod_Self(func);
2413 class = PyMethod_Class(func);
2414 func = PyMethod_Function(func);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002415 if (self == NULL) {
2416 /* Unbound methods must be called with an instance of
2417 the class (or a derived class) as first argument */
Guido van Rossumb209a111997-04-29 18:18:01 +00002418 if (PyTuple_Size(arg) >= 1) {
2419 self = PyTuple_GET_ITEM(arg, 0);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002420 if (self != NULL &&
Guido van Rossumb209a111997-04-29 18:18:01 +00002421 PyInstance_Check(self) &&
2422 PyClass_IsSubclass((PyObject *)
2423 (((PyInstanceObject *)self)->in_class),
Guido van Rossumb3f72581993-05-21 19:56:10 +00002424 class))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002425 /* Handy-dandy */ ;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002426 else
2427 self = NULL;
2428 }
2429 if (self == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002430 PyErr_SetString(PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002431 "unbound method must be called with class instance 1st argument");
Guido van Rossumb3f72581993-05-21 19:56:10 +00002432 return NULL;
2433 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002434 Py_INCREF(arg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002435 }
2436 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002437 int argcount = PyTuple_Size(arg);
2438 PyObject *newarg = PyTuple_New(argcount + 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002439 int i;
Guido van Rossum81daa321993-05-20 14:24:46 +00002440 if (newarg == NULL)
2441 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002442 Py_INCREF(self);
2443 PyTuple_SET_ITEM(newarg, 0, self);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002444 for (i = 0; i < argcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002445 PyObject *v = PyTuple_GET_ITEM(arg, i);
2446 Py_XINCREF(v);
2447 PyTuple_SET_ITEM(newarg, i+1, v);
Guido van Rossum81daa321993-05-20 14:24:46 +00002448 }
2449 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002450 }
Guido van Rossum7859f871998-07-08 14:58:16 +00002451 if (!PyFunction_Check(func)) {
2452 result = PyEval_CallObjectWithKeywords(func, arg, kw);
2453 Py_DECREF(arg);
2454 return result;
2455 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002456 }
2457 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002458 if (!PyFunction_Check(func)) {
Guido van Rossum2d1ad391998-08-25 18:16:54 +00002459 PyErr_Format(PyExc_TypeError,
2460 "call of non-function (type %s)",
2461 func->ob_type->tp_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002462 return NULL;
2463 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002464 Py_INCREF(arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002465 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002466
2467 argdefs = PyFunction_GetDefaults(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00002468 if (argdefs != NULL && PyTuple_Check(argdefs)) {
2469 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
2470 nd = PyTuple_Size(argdefs);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002471 }
2472 else {
2473 d = NULL;
2474 nd = 0;
2475 }
2476
2477 if (kw != NULL) {
2478 int pos, i;
Guido van Rossumb209a111997-04-29 18:18:01 +00002479 nk = PyDict_Size(kw);
2480 k = PyMem_NEW(PyObject *, 2*nk);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002481 if (k == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002482 PyErr_NoMemory();
2483 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002484 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00002485 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002486 pos = i = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00002487 while (PyDict_Next(kw, &pos, &k[i], &k[i+1]))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002488 i += 2;
2489 nk = i/2;
2490 /* XXX This is broken if the caller deletes dict items! */
2491 }
2492 else {
2493 k = NULL;
2494 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00002495 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002496
Guido van Rossum681d79a1995-07-18 14:51:37 +00002497 result = eval_code2(
Guido van Rossumb209a111997-04-29 18:18:01 +00002498 (PyCodeObject *)PyFunction_GetCode(func),
2499 PyFunction_GetGlobals(func), (PyObject *)NULL,
2500 &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg),
Guido van Rossum681d79a1995-07-18 14:51:37 +00002501 k, nk,
2502 d, nd,
2503 class);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002504
Guido van Rossumb209a111997-04-29 18:18:01 +00002505 Py_DECREF(arg);
2506 PyMem_XDEL(k);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002507
Guido van Rossum681d79a1995-07-18 14:51:37 +00002508 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002509}
2510
Guido van Rossum3b9c6671996-07-30 18:40:29 +00002511#define SLICE_ERROR_MSG \
2512 "standard sequence type does not support step size other than one"
2513
Guido van Rossumb209a111997-04-29 18:18:01 +00002514static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002515loop_subscript(v, w)
Guido van Rossumb209a111997-04-29 18:18:01 +00002516 PyObject *v, *w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002517{
Guido van Rossumb209a111997-04-29 18:18:01 +00002518 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00002519 int i;
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00002520 if (sq == NULL || sq->sq_item == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002521 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002522 return NULL;
2523 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002524 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00002525 v = (*sq->sq_item)(v, i);
2526 if (v)
2527 return v;
Barry Warsaw4249f541997-08-22 21:26:19 +00002528 if (PyErr_ExceptionMatches(PyExc_IndexError))
Guido van Rossumb209a111997-04-29 18:18:01 +00002529 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00002530 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002531}
2532
2533static int
Guido van Rossuma027efa1997-05-05 20:56:21 +00002534slice_index(v, pi)
Guido van Rossumb209a111997-04-29 18:18:01 +00002535 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002536 int *pi;
2537{
2538 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002539 long x;
Guido van Rossumb209a111997-04-29 18:18:01 +00002540 if (!PyInt_Check(v)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002541 PyErr_SetString(PyExc_TypeError,
2542 "slice index must be int");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002543 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002544 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00002545 x = PyInt_AsLong(v);
2546 /* Truncate -- very long indices are truncated anyway */
2547 if (x > INT_MAX)
2548 x = INT_MAX;
2549 else if (x < -INT_MAX)
2550 x = 0;
2551 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002552 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002553 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002554}
2555
Guido van Rossumb209a111997-04-29 18:18:01 +00002556static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002557apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00002558 PyObject *u, *v, *w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002559{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002560 int ilow = 0, ihigh = INT_MAX;
2561 if (slice_index(v, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002562 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002563 if (slice_index(w, &ihigh) != 0)
Guido van Rossum04691fc1992-08-12 15:35:34 +00002564 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002565 return PySequence_GetSlice(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002566}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002567
2568static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00002569assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossumb209a111997-04-29 18:18:01 +00002570 PyObject *u, *v, *w, *x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002571{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002572 int ilow = 0, ihigh = INT_MAX;
2573 if (slice_index(v, &ilow) != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002574 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002575 if (slice_index(w, &ihigh) != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002576 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002577 if (x == NULL)
2578 return PySequence_DelSlice(u, ilow, ihigh);
2579 else
2580 return PySequence_SetSlice(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002581}
2582
Guido van Rossumb209a111997-04-29 18:18:01 +00002583static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002584cmp_outcome(op, v, w)
Guido van Rossum5b7313a1992-04-06 13:24:57 +00002585 int op;
Guido van Rossumb209a111997-04-29 18:18:01 +00002586 register PyObject *v;
2587 register PyObject *w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002588{
2589 register int cmp;
2590 register int res = 0;
2591 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002592 case IS:
2593 case IS_NOT:
2594 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002595 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002596 res = !res;
2597 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002598 case IN:
2599 case NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00002600 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002601 if (res < 0)
2602 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002603 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002604 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002605 break;
2606 case EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00002607 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002608 break;
2609 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00002610 cmp = PyObject_Compare(v, w);
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002611 if (cmp && PyErr_Occurred())
2612 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002613 switch (op) {
2614 case LT: res = cmp < 0; break;
2615 case LE: res = cmp <= 0; break;
2616 case EQ: res = cmp == 0; break;
2617 case NE: res = cmp != 0; break;
2618 case GT: res = cmp > 0; break;
2619 case GE: res = cmp >= 0; break;
2620 /* XXX no default? (res is initialized to 0 though) */
2621 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002622 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002623 v = res ? Py_True : Py_False;
2624 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002625 return v;
2626}
2627
Guido van Rossum3f5da241990-12-20 15:06:42 +00002628static int
2629import_from(locals, v, name)
Guido van Rossumb209a111997-04-29 18:18:01 +00002630 PyObject *locals;
2631 PyObject *v;
2632 PyObject *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002633{
Guido van Rossumb209a111997-04-29 18:18:01 +00002634 PyObject *w, *x;
2635 if (!PyModule_Check(v)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002636 PyErr_SetString(PyExc_TypeError,
2637 "import-from requires module object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002638 return -1;
2639 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002640 w = PyModule_GetDict(v);
2641 if (PyString_AsString(name)[0] == '*') {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002642 int pos, err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002643 PyObject *name, *value;
Guido van Rossum25831651993-05-19 14:50:45 +00002644 pos = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00002645 while (PyDict_Next(w, &pos, &name, &value)) {
2646 if (!PyString_Check(name) ||
2647 PyString_AsString(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002648 continue;
Guido van Rossumb209a111997-04-29 18:18:01 +00002649 Py_INCREF(value);
2650 err = PyDict_SetItem(locals, name, value);
2651 Py_DECREF(value);
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002652 if (err != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002653 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002654 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002655 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002656 }
2657 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002658 x = PyDict_GetItem(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002659 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00002660 char buf[250];
Guido van Rossum16dfd291992-02-05 11:17:30 +00002661 sprintf(buf, "cannot import name %.230s",
Guido van Rossumb209a111997-04-29 18:18:01 +00002662 PyString_AsString(name));
2663 PyErr_SetString(PyExc_ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002664 return -1;
2665 }
2666 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002667 return PyDict_SetItem(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002668 }
2669}
2670
Guido van Rossumb209a111997-04-29 18:18:01 +00002671static PyObject *
Guido van Rossum25831651993-05-19 14:50:45 +00002672build_class(methods, bases, name)
Guido van Rossumb209a111997-04-29 18:18:01 +00002673 PyObject *methods; /* dictionary */
2674 PyObject *bases; /* tuple containing classes */
2675 PyObject *name; /* string */
Guido van Rossume9736fc1990-11-18 17:33:06 +00002676{
Guido van Rossumcd649651997-08-22 16:56:16 +00002677 int i, n;
Guido van Rossumb209a111997-04-29 18:18:01 +00002678 if (!PyTuple_Check(bases)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002679 PyErr_SetString(PyExc_SystemError,
2680 "build_class with non-tuple bases");
Guido van Rossum25831651993-05-19 14:50:45 +00002681 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002682 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002683 if (!PyDict_Check(methods)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002684 PyErr_SetString(PyExc_SystemError,
2685 "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002686 return NULL;
2687 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002688 if (!PyString_Check(name)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002689 PyErr_SetString(PyExc_SystemError,
2690 "build_class witn non-string name");
Guido van Rossum25831651993-05-19 14:50:45 +00002691 return NULL;
2692 }
Guido van Rossumcd649651997-08-22 16:56:16 +00002693 n = PyTuple_Size(bases);
2694 for (i = 0; i < n; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002695 PyObject *base = PyTuple_GET_ITEM(bases, i);
2696 if (!PyClass_Check(base)) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002697 /* Call the base's *type*, if it is callable.
2698 This code is a hook for Donald Beaudry's
2699 and Jim Fulton's type extensions. In
2700 unexended Python it will never be triggered
Guido van Rossum55b9ab51997-07-31 03:54:02 +00002701 since its types are not callable.
2702 Ditto: call the bases's *class*, if it has
2703 one. This makes the same thing possible
2704 without writing C code. A true meta-object
2705 protocol! */
2706 PyObject *basetype = (PyObject *)base->ob_type;
2707 PyObject *callable = NULL;
2708 if (PyCallable_Check(basetype))
2709 callable = basetype;
2710 else
2711 callable = PyObject_GetAttrString(
2712 base, "__class__");
2713 if (callable) {
2714 PyObject *args;
2715 PyObject *newclass = NULL;
2716 args = Py_BuildValue(
2717 "(OOO)", name, bases, methods);
2718 if (args != NULL) {
2719 newclass = PyEval_CallObject(
2720 callable, args);
2721 Py_DECREF(args);
2722 }
Guido van Rossum730806d1998-04-10 22:27:42 +00002723 if (callable != basetype) {
Guido van Rossum55b9ab51997-07-31 03:54:02 +00002724 Py_DECREF(callable);
Guido van Rossum730806d1998-04-10 22:27:42 +00002725 }
Guido van Rossum55b9ab51997-07-31 03:54:02 +00002726 return newclass;
Guido van Rossum150b2df1996-12-05 23:17:11 +00002727 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002728 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +00002729 "base is not a class object");
2730 return NULL;
2731 }
2732 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002733 return PyClass_New(bases, methods, name);
Guido van Rossum25831651993-05-19 14:50:45 +00002734}
2735
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002736static int
Guido van Rossuma027efa1997-05-05 20:56:21 +00002737exec_statement(f, prog, globals, locals)
2738 PyFrameObject *f;
Guido van Rossumb209a111997-04-29 18:18:01 +00002739 PyObject *prog;
2740 PyObject *globals;
2741 PyObject *locals;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002742{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002743 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00002744 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002745 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002746
Guido van Rossumb209a111997-04-29 18:18:01 +00002747 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
2748 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002749 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00002750 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002751 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00002752 locals = PyTuple_GetItem(prog, 2);
2753 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002754 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002755 if (globals == Py_None) {
2756 globals = PyEval_GetGlobals();
2757 if (locals == Py_None) {
2758 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002759 plain = 1;
2760 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002761 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002762 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002763 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00002764 if (!PyString_Check(prog) &&
2765 !PyCode_Check(prog) &&
2766 !PyFile_Check(prog)) {
2767 PyErr_SetString(PyExc_TypeError,
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002768 "exec 1st arg must be string, code or file object");
2769 return -1;
2770 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002771 if (!PyDict_Check(globals) || !PyDict_Check(locals)) {
2772 PyErr_SetString(PyExc_TypeError,
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002773 "exec 2nd/3rd args must be dict or None");
2774 return -1;
2775 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002776 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002777 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00002778 if (PyCode_Check(prog)) {
Guido van Rossuma400d8a2000-01-12 22:45:54 +00002779 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002780 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00002781 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002782 FILE *fp = PyFile_AsFile(prog);
2783 char *name = PyString_AsString(PyFile_Name(prog));
Guido van Rossuma400d8a2000-01-12 22:45:54 +00002784 v = PyRun_File(fp, name, Py_file_input, globals, locals);
2785 }
2786 else {
2787 char *s = PyString_AsString(prog);
2788 if ((int)strlen(s) != PyString_Size(prog)) {
2789 PyErr_SetString(PyExc_ValueError,
2790 "embedded '\\0' in exec string");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002791 return -1;
Guido van Rossuma400d8a2000-01-12 22:45:54 +00002792 }
2793 v = PyRun_String(s, Py_file_input, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002794 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00002795 if (plain)
2796 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002797 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002798 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00002799 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002800 return 0;
2801}
Guido van Rossum24c13741995-02-14 09:42:43 +00002802
Guido van Rossum1aa14831997-01-21 05:34:20 +00002803/* Hack for ni.py */
Guido van Rossumb209a111997-04-29 18:18:01 +00002804static PyObject *
Guido van Rossum24c13741995-02-14 09:42:43 +00002805find_from_args(f, nexti)
Guido van Rossumb209a111997-04-29 18:18:01 +00002806 PyFrameObject *f;
Guido van Rossum24c13741995-02-14 09:42:43 +00002807 int nexti;
2808{
2809 int opcode;
2810 int oparg;
Guido van Rossumb209a111997-04-29 18:18:01 +00002811 PyObject *list, *name;
Guido van Rossum24c13741995-02-14 09:42:43 +00002812 unsigned char *next_instr;
2813
Guido van Rossumd076c731998-10-07 19:42:25 +00002814 _PyCode_GETCODEPTR(f->f_code, &next_instr);
2815 next_instr += nexti;
2816
Guido van Rossum24c13741995-02-14 09:42:43 +00002817 opcode = (*next_instr++);
2818 if (opcode != IMPORT_FROM) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002819 Py_INCREF(Py_None);
2820 return Py_None;
Guido van Rossum24c13741995-02-14 09:42:43 +00002821 }
2822
Guido van Rossumb209a111997-04-29 18:18:01 +00002823 list = PyList_New(0);
Guido van Rossum24c13741995-02-14 09:42:43 +00002824 if (list == NULL)
2825 return NULL;
2826
2827 do {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002828 oparg = (next_instr[1]<<8) + next_instr[0];
2829 next_instr += 2;
Guido van Rossum24c13741995-02-14 09:42:43 +00002830 name = Getnamev(f, oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002831 if (PyList_Append(list, name) < 0) {
2832 Py_DECREF(list);
Guido van Rossum24c13741995-02-14 09:42:43 +00002833 break;
2834 }
2835 opcode = (*next_instr++);
2836 } while (opcode == IMPORT_FROM);
2837
2838 return list;
2839}
Guido van Rossum950361c1997-01-24 13:49:28 +00002840
2841
2842#ifdef DYNAMIC_EXECUTION_PROFILE
2843
2844PyObject *
2845getarray(a)
2846 long a[256];
2847{
2848 int i;
2849 PyObject *l = PyList_New(256);
2850 if (l == NULL) return NULL;
2851 for (i = 0; i < 256; i++) {
2852 PyObject *x = PyInt_FromLong(a[i]);
2853 if (x == NULL) {
2854 Py_DECREF(l);
2855 return NULL;
2856 }
2857 PyList_SetItem(l, i, x);
2858 }
2859 for (i = 0; i < 256; i++)
2860 a[i] = 0;
2861 return l;
2862}
2863
2864PyObject *
2865_Py_GetDXProfile(self, args)
2866 PyObject *self, *args;
2867{
2868#ifndef DXPAIRS
2869 return getarray(dxp);
2870#else
2871 int i;
2872 PyObject *l = PyList_New(257);
2873 if (l == NULL) return NULL;
2874 for (i = 0; i < 257; i++) {
2875 PyObject *x = getarray(dxpairs[i]);
2876 if (x == NULL) {
2877 Py_DECREF(l);
2878 return NULL;
2879 }
2880 PyList_SetItem(l, i, x);
2881 }
2882 return l;
2883#endif
2884}
2885
2886#endif