blob: 46a60f1173c9961447a92a9d152fe497016131e4 [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 Rossumb209a111997-04-29 18:18:01 +0000316PyObject *
317PyEval_EvalCode(co, globals, locals)
318 PyCodeObject *co;
319 PyObject *globals;
320 PyObject *locals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000321{
322 return eval_code2(co,
323 globals, locals,
Guido van Rossumb209a111997-04-29 18:18:01 +0000324 (PyObject **)NULL, 0,
325 (PyObject **)NULL, 0,
326 (PyObject **)NULL, 0,
327 (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000328}
329
330
331/* Interpreter main loop */
332
Guido van Rossum8861b741996-07-30 16:49:37 +0000333#ifndef MAX_RECURSION_DEPTH
334#define MAX_RECURSION_DEPTH 10000
335#endif
336
Guido van Rossumb209a111997-04-29 18:18:01 +0000337static PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +0000338eval_code2(co, globals, locals,
339 args, argcount, kws, kwcount, defs, defcount, owner)
Guido van Rossumb209a111997-04-29 18:18:01 +0000340 PyCodeObject *co;
341 PyObject *globals;
342 PyObject *locals;
343 PyObject **args;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000344 int argcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000345 PyObject **kws; /* length: 2*kwcount */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000346 int kwcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000347 PyObject **defs;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000348 int defcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000349 PyObject *owner;
Guido van Rossum374a9221991-04-04 10:40:29 +0000350{
Guido van Rossum950361c1997-01-24 13:49:28 +0000351#ifdef DXPAIRS
352 int lastopcode = 0;
353#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000354 register unsigned char *next_instr;
Guido van Rossum50cd3481998-11-17 17:02:51 +0000355 register int opcode; /* Current opcode */
356 register int oparg; /* Current opcode argument, if any */
Guido van Rossumb209a111997-04-29 18:18:01 +0000357 register PyObject **stack_pointer;
Guido van Rossum374a9221991-04-04 10:40:29 +0000358 register enum why_code why; /* Reason for block stack unwind */
359 register int err; /* Error status -- nonzero if error */
Guido van Rossumb209a111997-04-29 18:18:01 +0000360 register PyObject *x; /* Result object -- NULL if error */
361 register PyObject *v; /* Temporary objects popped off stack */
362 register PyObject *w;
363 register PyObject *u;
364 register PyObject *t;
365 register PyFrameObject *f; /* Current frame */
Guido van Rossum50cd3481998-11-17 17:02:51 +0000366 register PyObject **fastlocals;
Guido van Rossum014518f1998-11-23 21:09:51 +0000367 PyObject *retval = NULL; /* Return value */
Guido van Rossum885553e1998-12-21 18:33:30 +0000368 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossumd076c731998-10-07 19:42:25 +0000369 unsigned char *first_instr;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000370#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000371 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000372#endif
Guido van Rossum408027e1996-12-30 16:17:54 +0000373#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000374 /* Make it easier to find out where we are with a debugger */
Guido van Rossumb209a111997-04-29 18:18:01 +0000375 char *filename = PyString_AsString(co->co_filename);
Guido van Rossum99bec951992-09-03 20:29:45 +0000376#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000377
378/* Code access macros */
379
380#define GETCONST(i) Getconst(f, i)
381#define GETNAME(i) Getname(f, i)
382#define GETNAMEV(i) Getnamev(f, i)
Guido van Rossumd076c731998-10-07 19:42:25 +0000383#define INSTR_OFFSET() (next_instr - first_instr)
Guido van Rossum374a9221991-04-04 10:40:29 +0000384#define NEXTOP() (*next_instr++)
385#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossumd076c731998-10-07 19:42:25 +0000386#define JUMPTO(x) (next_instr = first_instr + (x))
Guido van Rossum374a9221991-04-04 10:40:29 +0000387#define JUMPBY(x) (next_instr += (x))
388
389/* Stack manipulation macros */
390
391#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
392#define EMPTY() (STACK_LEVEL() == 0)
393#define TOP() (stack_pointer[-1])
394#define BASIC_PUSH(v) (*stack_pointer++ = (v))
395#define BASIC_POP() (*--stack_pointer)
396
Guido van Rossum96a42c81992-01-12 02:29:51 +0000397#ifdef LLTRACE
398#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
399#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000400#else
401#define PUSH(v) BASIC_PUSH(v)
402#define POP() BASIC_POP()
403#endif
404
Guido van Rossum681d79a1995-07-18 14:51:37 +0000405/* Local variable macros */
406
407#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumb209a111997-04-29 18:18:01 +0000408#define SETLOCAL(i, value) do { Py_XDECREF(GETLOCAL(i)); \
Guido van Rossum681d79a1995-07-18 14:51:37 +0000409 GETLOCAL(i) = value; } while (0)
410
Guido van Rossuma027efa1997-05-05 20:56:21 +0000411/* Start of code */
412
Guido van Rossum8861b741996-07-30 16:49:37 +0000413#ifdef USE_STACKCHECK
Guido van Rossuma027efa1997-05-05 20:56:21 +0000414 if (tstate->recursion_depth%10 == 0 && PyOS_CheckStack()) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000415 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
Guido van Rossum8861b741996-07-30 16:49:37 +0000416 return NULL;
417 }
418#endif
419
Guido van Rossum681d79a1995-07-18 14:51:37 +0000420 if (globals == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000421 PyErr_SetString(PyExc_SystemError, "eval_code2: NULL globals");
Guido van Rossum6135a871995-01-09 17:53:26 +0000422 return NULL;
Guido van Rossum5b722181993-03-30 17:46:03 +0000423 }
424
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000425#ifdef LLTRACE
Guido van Rossumb209a111997-04-29 18:18:01 +0000426 lltrace = PyDict_GetItemString(globals, "__lltrace__") != NULL;
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000427#endif
428
Guido van Rossumb209a111997-04-29 18:18:01 +0000429 f = PyFrame_New(
Guido van Rossuma027efa1997-05-05 20:56:21 +0000430 tstate, /*back*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000431 co, /*code*/
432 globals, /*globals*/
Guido van Rossum76836021997-01-20 04:26:20 +0000433 locals); /*locals*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000434 if (f == NULL)
435 return NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000436
Guido van Rossuma027efa1997-05-05 20:56:21 +0000437 tstate->frame = f;
Guido van Rossumdeb0c5e1997-01-27 23:42:36 +0000438 fastlocals = f->f_localsplus;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000439
440 if (co->co_argcount > 0 ||
441 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
442 int i;
443 int n = argcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000444 PyObject *kwdict = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000445 if (co->co_flags & CO_VARKEYWORDS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000446 kwdict = PyDict_New();
Guido van Rossum681d79a1995-07-18 14:51:37 +0000447 if (kwdict == NULL)
448 goto fail;
Guido van Rossum8c5df061997-01-24 04:19:24 +0000449 i = co->co_argcount;
450 if (co->co_flags & CO_VARARGS)
451 i++;
452 SETLOCAL(i, kwdict);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000453 }
454 if (argcount > co->co_argcount) {
455 if (!(co->co_flags & CO_VARARGS)) {
Guido van Rossumdf9db1e1997-11-19 16:05:40 +0000456 PyErr_Format(PyExc_TypeError,
457 "too many arguments; expected %d, got %d",
458 co->co_argcount, argcount);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000459 goto fail;
460 }
461 n = co->co_argcount;
462 }
463 for (i = 0; i < n; i++) {
464 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000465 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000466 SETLOCAL(i, x);
467 }
468 if (co->co_flags & CO_VARARGS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000469 u = PyTuple_New(argcount - n);
Guido van Rossum8c5df061997-01-24 04:19:24 +0000470 if (u == NULL)
471 goto fail;
472 SETLOCAL(co->co_argcount, u);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000473 for (i = n; i < argcount; i++) {
474 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000475 Py_INCREF(x);
476 PyTuple_SET_ITEM(u, i-n, x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000477 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000478 }
479 for (i = 0; i < kwcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000480 PyObject *keyword = kws[2*i];
481 PyObject *value = kws[2*i + 1];
Guido van Rossum681d79a1995-07-18 14:51:37 +0000482 int j;
Guido van Rossum25da5be1999-10-26 00:12:20 +0000483 if (keyword == NULL || !PyString_Check(keyword)) {
484 PyErr_SetString(PyExc_TypeError,
485 "keywords must be strings");
486 goto fail;
487 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000488 /* XXX slow -- speed up using dictionary? */
489 for (j = 0; j < co->co_argcount; j++) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000490 PyObject *nm = PyTuple_GET_ITEM(
491 co->co_varnames, j);
Guido van Rossumb209a111997-04-29 18:18:01 +0000492 if (PyObject_Compare(keyword, nm) == 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000493 break;
494 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000495 /* Check errors from Compare */
496 if (PyErr_Occurred())
497 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000498 if (j >= co->co_argcount) {
499 if (kwdict == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000500 PyErr_Format(PyExc_TypeError,
Guido van Rossuma027efa1997-05-05 20:56:21 +0000501 "unexpected keyword argument: %.400s",
502 PyString_AsString(keyword));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000503 goto fail;
504 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000505 PyDict_SetItem(kwdict, keyword, value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000506 }
507 else {
508 if (GETLOCAL(j) != NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000509 PyErr_SetString(PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +0000510 "keyword parameter redefined");
511 goto fail;
512 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000513 Py_INCREF(value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000514 SETLOCAL(j, value);
515 }
516 }
517 if (argcount < co->co_argcount) {
518 int m = co->co_argcount - defcount;
519 for (i = argcount; i < m; i++) {
520 if (GETLOCAL(i) == NULL) {
Guido van Rossumdf9db1e1997-11-19 16:05:40 +0000521 PyErr_Format(PyExc_TypeError,
522 "not enough arguments; expected %d, got %d",
523 m, i);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000524 goto fail;
525 }
526 }
527 if (n > m)
528 i = n - m;
529 else
530 i = 0;
531 for (; i < defcount; i++) {
532 if (GETLOCAL(m+i) == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000533 PyObject *def = defs[i];
534 Py_INCREF(def);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000535 SETLOCAL(m+i, def);
536 }
537 }
538 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000539 }
540 else {
541 if (argcount > 0 || kwcount > 0) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000542 PyErr_SetString(PyExc_TypeError,
543 "no arguments expected");
Guido van Rossum8c5df061997-01-24 04:19:24 +0000544 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000545 }
546 }
547
Guido van Rossuma027efa1997-05-05 20:56:21 +0000548 if (tstate->sys_tracefunc != NULL) {
549 /* tstate->sys_tracefunc, if defined, is a function that
550 will be called on *every* entry to a code block.
Guido van Rossum96a42c81992-01-12 02:29:51 +0000551 Its return value, if not None, is a function that
552 will be called at the start of each executed line
553 of code. (Actually, the function must return
554 itself in order to continue tracing.)
555 The trace functions are called with three arguments:
556 a pointer to the current frame, a string indicating
557 why the function is called, and an argument which
558 depends on the situation. The global trace function
559 (sys.trace) is also called whenever an exception
560 is detected. */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000561 if (call_trace(&tstate->sys_tracefunc,
562 &f->f_trace, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000563 Py_None/*XXX how to compute arguments now?*/)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000564 /* Trace function raised an error */
Guido van Rossum8c5df061997-01-24 04:19:24 +0000565 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000566 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000567 }
568
Guido van Rossuma027efa1997-05-05 20:56:21 +0000569 if (tstate->sys_profilefunc != NULL) {
570 /* Similar for sys_profilefunc, except it needn't return
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000571 itself and isn't called for "line" events */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000572 if (call_trace(&tstate->sys_profilefunc,
573 (PyObject**)0, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000574 Py_None/*XXX*/)) {
Guido van Rossum8c5df061997-01-24 04:19:24 +0000575 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000576 }
577 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000578
Guido van Rossuma027efa1997-05-05 20:56:21 +0000579 if (++tstate->recursion_depth > MAX_RECURSION_DEPTH) {
580 --tstate->recursion_depth;
581 PyErr_SetString(PyExc_RuntimeError,
582 "Maximum recursion depth exceeded");
583 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +0000584 Py_DECREF(f);
Guido van Rossum8861b741996-07-30 16:49:37 +0000585 return NULL;
586 }
587
Guido van Rossumd076c731998-10-07 19:42:25 +0000588 _PyCode_GETCODEPTR(co, &first_instr);
589 next_instr = first_instr;
Guido van Rossum374a9221991-04-04 10:40:29 +0000590 stack_pointer = f->f_valuestack;
591
Guido van Rossum374a9221991-04-04 10:40:29 +0000592 why = WHY_NOT;
593 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000594 x = Py_None; /* Not a reference, just anything non-NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000595
596 for (;;) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000597 /* Do periodic things. Doing this every time through
598 the loop would add too much overhead, so we do it
599 only every Nth instruction. We also do it if
600 ``things_to_do'' is set, i.e. when an asynchronous
601 event needs attention (e.g. a signal handler or
602 async I/O handler); see Py_AddPendingCall() and
603 Py_MakePendingCalls() above. */
Guido van Rossuma9672091994-09-14 13:31:22 +0000604
Guido van Rossuma027efa1997-05-05 20:56:21 +0000605 if (things_to_do || --tstate->ticker < 0) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000606 tstate->ticker = tstate->interp->checkinterval;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000607 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000608 if (Py_MakePendingCalls() < 0) {
609 why = WHY_EXCEPTION;
610 goto on_error;
611 }
612 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000613#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000614 /* If we have true signals, the signal handler
615 will call Py_AddPendingCall() so we don't
616 have to call sigcheck(). On the Mac and
617 DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000618 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000619 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000620 goto on_error;
621 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000622#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000623
Guido van Rossume59214e1994-08-30 08:01:59 +0000624#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000625 if (interpreter_lock) {
626 /* Give another thread a chance */
627
Guido van Rossum25ce5661997-08-02 03:10:38 +0000628 if (PyThreadState_Swap(NULL) != tstate)
629 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000630 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000631
632 /* Other threads may run now */
633
Guido van Rossum65d5b571998-12-21 19:32:43 +0000634 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000635 if (PyThreadState_Swap(tstate) != NULL)
636 Py_FatalError("ceval: orphan tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000637 }
638#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000639 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000640
Guido van Rossum374a9221991-04-04 10:40:29 +0000641 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000642
Guido van Rossum408027e1996-12-30 16:17:54 +0000643#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000644 f->f_lasti = INSTR_OFFSET();
645#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000646
647 opcode = NEXTOP();
648 if (HAS_ARG(opcode))
649 oparg = NEXTARG();
Guido van Rossum950361c1997-01-24 13:49:28 +0000650#ifdef DYNAMIC_EXECUTION_PROFILE
651#ifdef DXPAIRS
652 dxpairs[lastopcode][opcode]++;
653 lastopcode = opcode;
654#endif
655 dxp[opcode]++;
656#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000657
Guido van Rossum96a42c81992-01-12 02:29:51 +0000658#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000659 /* Instruction tracing */
660
Guido van Rossum96a42c81992-01-12 02:29:51 +0000661 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000662 if (HAS_ARG(opcode)) {
663 printf("%d: %d, %d\n",
664 (int) (INSTR_OFFSET() - 3),
665 opcode, oparg);
666 }
667 else {
668 printf("%d: %d\n",
669 (int) (INSTR_OFFSET() - 1), opcode);
670 }
671 }
672#endif
673
674 /* Main switch on opcode */
675
676 switch (opcode) {
677
678 /* BEWARE!
679 It is essential that any operation that fails sets either
680 x to NULL, err to nonzero, or why to anything but WHY_NOT,
681 and that no operation that succeeds does this! */
682
683 /* case STOP_CODE: this is an error! */
684
685 case POP_TOP:
686 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000687 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000688 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000689
690 case ROT_TWO:
691 v = POP();
692 w = POP();
693 PUSH(v);
694 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000695 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000696
697 case ROT_THREE:
698 v = POP();
699 w = POP();
700 x = POP();
701 PUSH(v);
702 PUSH(x);
703 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000704 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000705
706 case DUP_TOP:
707 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000708 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000709 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000710 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000711
712 case UNARY_POSITIVE:
713 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000714 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000715 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000716 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000717 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000718 break;
719
720 case UNARY_NEGATIVE:
721 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000722 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000723 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000724 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000725 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000726 break;
727
728 case UNARY_NOT:
729 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000730 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000731 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000732 if (err == 0) {
733 Py_INCREF(Py_True);
734 PUSH(Py_True);
735 continue;
736 }
737 else if (err > 0) {
738 Py_INCREF(Py_False);
739 PUSH(Py_False);
740 err = 0;
741 continue;
742 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000743 break;
744
745 case UNARY_CONVERT:
746 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000747 x = PyObject_Repr(v);
748 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000749 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000750 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000751 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000752
753 case UNARY_INVERT:
754 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000755 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000756 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000757 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000758 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000759 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000760
Guido van Rossum50564e81996-01-12 01:13:16 +0000761 case BINARY_POWER:
762 w = POP();
763 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000764 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000765 Py_DECREF(v);
766 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000767 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000768 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000769 break;
770
Guido van Rossum374a9221991-04-04 10:40:29 +0000771 case BINARY_MULTIPLY:
772 w = POP();
773 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000774 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000775 Py_DECREF(v);
776 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000777 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000778 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000779 break;
780
781 case BINARY_DIVIDE:
782 w = POP();
783 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000784 x = PyNumber_Divide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000785 Py_DECREF(v);
786 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000787 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000788 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000789 break;
790
791 case BINARY_MODULO:
792 w = POP();
793 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000794 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000795 Py_DECREF(v);
796 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000797 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000798 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000799 break;
800
801 case BINARY_ADD:
802 w = POP();
803 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000804 if (PyInt_Check(v) && PyInt_Check(w)) {
805 /* INLINE: int + int */
806 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000807 a = PyInt_AS_LONG(v);
808 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000809 i = a + b;
810 if ((i^a) < 0 && (i^b) < 0) {
811 PyErr_SetString(PyExc_OverflowError,
812 "integer addition");
813 x = NULL;
814 }
815 else
816 x = PyInt_FromLong(i);
817 }
818 else
819 x = PyNumber_Add(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000820 Py_DECREF(v);
821 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000822 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000823 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000824 break;
825
826 case BINARY_SUBTRACT:
827 w = POP();
828 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000829 if (PyInt_Check(v) && PyInt_Check(w)) {
830 /* INLINE: int - int */
831 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000832 a = PyInt_AS_LONG(v);
833 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000834 i = a - b;
835 if ((i^a) < 0 && (i^~b) < 0) {
836 PyErr_SetString(PyExc_OverflowError,
837 "integer subtraction");
838 x = NULL;
839 }
840 else
841 x = PyInt_FromLong(i);
842 }
843 else
844 x = PyNumber_Subtract(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000845 Py_DECREF(v);
846 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000847 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000848 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000849 break;
850
851 case BINARY_SUBSCR:
852 w = POP();
853 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000854 if (PyList_Check(v) && PyInt_Check(w)) {
855 /* INLINE: list[int] */
856 long i = PyInt_AsLong(w);
857 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +0000858 i += PyList_GET_SIZE(v);
Guido van Rossumc12da691997-07-17 23:12:42 +0000859 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 PyErr_SetString(PyExc_IndexError,
862 "list index out of range");
863 x = NULL;
864 }
865 else {
Guido van Rossumfa00e951998-07-08 15:02:37 +0000866 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +0000867 Py_INCREF(x);
868 }
869 }
870 else
871 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000872 Py_DECREF(v);
873 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000874 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000875 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000876 break;
877
Guido van Rossum7928cd71991-10-24 14:59:31 +0000878 case BINARY_LSHIFT:
879 w = POP();
880 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000881 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000882 Py_DECREF(v);
883 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000884 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000885 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000886 break;
887
888 case BINARY_RSHIFT:
889 w = POP();
890 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000891 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000892 Py_DECREF(v);
893 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000894 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000895 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000896 break;
897
898 case BINARY_AND:
899 w = POP();
900 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000901 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000902 Py_DECREF(v);
903 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000904 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000905 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000906 break;
907
908 case BINARY_XOR:
909 w = POP();
910 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000911 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000912 Py_DECREF(v);
913 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000914 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000915 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000916 break;
917
918 case BINARY_OR:
919 w = POP();
920 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000921 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000922 Py_DECREF(v);
923 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000924 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000925 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000926 break;
927
Guido van Rossum374a9221991-04-04 10:40:29 +0000928 case SLICE+0:
929 case SLICE+1:
930 case SLICE+2:
931 case SLICE+3:
932 if ((opcode-SLICE) & 2)
933 w = POP();
934 else
935 w = NULL;
936 if ((opcode-SLICE) & 1)
937 v = POP();
938 else
939 v = NULL;
940 u = POP();
941 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000942 Py_DECREF(u);
943 Py_XDECREF(v);
944 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000945 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000946 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000947 break;
948
949 case STORE_SLICE+0:
950 case STORE_SLICE+1:
951 case STORE_SLICE+2:
952 case STORE_SLICE+3:
953 if ((opcode-STORE_SLICE) & 2)
954 w = POP();
955 else
956 w = NULL;
957 if ((opcode-STORE_SLICE) & 1)
958 v = POP();
959 else
960 v = NULL;
961 u = POP();
962 t = POP();
963 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +0000964 Py_DECREF(t);
965 Py_DECREF(u);
966 Py_XDECREF(v);
967 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000968 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000969 break;
970
971 case DELETE_SLICE+0:
972 case DELETE_SLICE+1:
973 case DELETE_SLICE+2:
974 case DELETE_SLICE+3:
975 if ((opcode-DELETE_SLICE) & 2)
976 w = POP();
977 else
978 w = NULL;
979 if ((opcode-DELETE_SLICE) & 1)
980 v = POP();
981 else
982 v = NULL;
983 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000984 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +0000985 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +0000986 Py_DECREF(u);
987 Py_XDECREF(v);
988 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000989 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000990 break;
991
992 case STORE_SUBSCR:
993 w = POP();
994 v = POP();
995 u = POP();
996 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +0000997 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +0000998 Py_DECREF(u);
999 Py_DECREF(v);
1000 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001001 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001002 break;
1003
1004 case DELETE_SUBSCR:
1005 w = POP();
1006 v = POP();
1007 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001008 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001009 Py_DECREF(v);
1010 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001011 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001012 break;
1013
1014 case PRINT_EXPR:
1015 v = POP();
Guido van Rossumaa06b0e1997-12-26 22:15:57 +00001016 /* Print value except if None */
1017 /* After printing, also assign to '_' */
1018 /* Before, set '_' to None to avoid recursion */
Guido van Rossumb209a111997-04-29 18:18:01 +00001019 if (v != Py_None &&
Guido van Rossuma027efa1997-05-05 20:56:21 +00001020 (err = PyDict_SetItemString(
Guido van Rossumaa06b0e1997-12-26 22:15:57 +00001021 f->f_builtins, "_", Py_None)) == 0) {
Guido van Rossumbe270261997-05-22 22:26:18 +00001022 err = Py_FlushLine();
Guido van Rossumc12da691997-07-17 23:12:42 +00001023 if (err == 0) {
Guido van Rossumbe270261997-05-22 22:26:18 +00001024 x = PySys_GetObject("stdout");
Guido van Rossum8f183201997-12-31 05:53:15 +00001025 if (x == NULL) {
1026 PyErr_SetString(
1027 PyExc_RuntimeError,
1028 "lost sys.stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00001029 err = -1;
Guido van Rossum8f183201997-12-31 05:53:15 +00001030 }
Guido van Rossumbe270261997-05-22 22:26:18 +00001031 }
1032 if (err == 0)
1033 err = PyFile_WriteObject(v, x, 0);
1034 if (err == 0) {
1035 PyFile_SoftSpace(x, 1);
1036 err = Py_FlushLine();
1037 }
Guido van Rossumaa06b0e1997-12-26 22:15:57 +00001038 if (err == 0) {
1039 err = PyDict_SetItemString(
1040 f->f_builtins, "_", v);
1041 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001042 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001043 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001044 break;
1045
1046 case PRINT_ITEM:
1047 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001048 w = PySys_GetObject("stdout");
Guido van Rossum8f183201997-12-31 05:53:15 +00001049 if (w == NULL) {
1050 PyErr_SetString(PyExc_RuntimeError,
1051 "lost sys.stdout");
1052 err = -1;
1053 }
1054 else if (PyFile_SoftSpace(w, 1))
Guido van Rossumbe270261997-05-22 22:26:18 +00001055 err = PyFile_WriteString(" ", w);
1056 if (err == 0)
1057 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Guido van Rossumb209a111997-04-29 18:18:01 +00001058 if (err == 0 && PyString_Check(v)) {
Guido van Rossumc6004111993-11-05 10:22:19 +00001059 /* XXX move into writeobject() ? */
Guido van Rossumb209a111997-04-29 18:18:01 +00001060 char *s = PyString_AsString(v);
1061 int len = PyString_Size(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +00001062 if (len > 0 &&
1063 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +00001064 s[len-1] != ' ')
Guido van Rossumb209a111997-04-29 18:18:01 +00001065 PyFile_SoftSpace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001066 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001067 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001068 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001069 break;
1070
1071 case PRINT_NEWLINE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001072 x = PySys_GetObject("stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001073 if (x == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00001074 PyErr_SetString(PyExc_RuntimeError,
1075 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001076 else {
Guido van Rossumbe270261997-05-22 22:26:18 +00001077 err = PyFile_WriteString("\n", x);
1078 if (err == 0)
1079 PyFile_SoftSpace(x, 0);
Guido van Rossum3165fe61992-09-25 21:59:05 +00001080 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001081 break;
1082
1083 case BREAK_LOOP:
1084 why = WHY_BREAK;
1085 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001086
Guido van Rossumf10570b1995-07-07 22:53:21 +00001087 case RAISE_VARARGS:
1088 u = v = w = NULL;
1089 switch (oparg) {
1090 case 3:
1091 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001092 /* Fallthrough */
1093 case 2:
1094 v = POP(); /* value */
1095 /* Fallthrough */
1096 case 1:
1097 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001098 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001099 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001100 break;
1101 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001102 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001103 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001104 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001105 break;
1106 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001107 break;
1108
1109 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001110 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001111 PyErr_SetString(PyExc_SystemError,
1112 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001113 break;
1114 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001115 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001116 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001117 break;
1118
1119 case RETURN_VALUE:
1120 retval = POP();
1121 why = WHY_RETURN;
1122 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001123
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001124 case EXEC_STMT:
1125 w = POP();
1126 v = POP();
1127 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001128 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001129 Py_DECREF(u);
1130 Py_DECREF(v);
1131 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001132 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001133
Guido van Rossum374a9221991-04-04 10:40:29 +00001134 case POP_BLOCK:
1135 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001136 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001137 while (STACK_LEVEL() > b->b_level) {
1138 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001139 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001140 }
1141 }
1142 break;
1143
1144 case END_FINALLY:
1145 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001146 if (PyInt_Check(v)) {
1147 why = (enum why_code) PyInt_AsLong(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001148 if (why == WHY_RETURN)
1149 retval = POP();
1150 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001151 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001152 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001153 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001154 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001155 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001156 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001157 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001158 else if (v != Py_None) {
1159 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001160 "'finally' pops bad exception");
1161 why = WHY_EXCEPTION;
1162 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001163 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001164 break;
1165
1166 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001167 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001168 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001169 w = POP();
1170 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001171 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001172 Py_DECREF(u);
1173 Py_DECREF(v);
1174 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001175 break;
1176
1177 case STORE_NAME:
1178 w = GETNAMEV(oparg);
1179 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001180 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001181 PyErr_SetString(PyExc_SystemError,
1182 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001183 break;
1184 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001185 err = PyDict_SetItem(x, w, v);
1186 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001187 break;
1188
1189 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001190 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001191 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001192 PyErr_SetString(PyExc_SystemError,
1193 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001194 break;
1195 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001196 if ((err = PyDict_DelItem(x, w)) != 0)
1197 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001198 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001199
1200#ifdef CASE_TOO_BIG
1201 default: switch (opcode) {
1202#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001203
1204 case UNPACK_TUPLE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001205 case UNPACK_LIST:
1206 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001207 if (PyTuple_Check(v)) {
1208 if (PyTuple_Size(v) != oparg) {
1209 PyErr_SetString(PyExc_ValueError,
1210 "unpack tuple of wrong size");
1211 why = WHY_EXCEPTION;
1212 }
1213 else {
1214 for (; --oparg >= 0; ) {
1215 w = PyTuple_GET_ITEM(v, oparg);
1216 Py_INCREF(w);
1217 PUSH(w);
1218 }
1219 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001220 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001221 else if (PyList_Check(v)) {
1222 if (PyList_Size(v) != oparg) {
1223 PyErr_SetString(PyExc_ValueError,
1224 "unpack list of wrong size");
1225 why = WHY_EXCEPTION;
1226 }
1227 else {
1228 for (; --oparg >= 0; ) {
1229 w = PyList_GET_ITEM(v, oparg);
1230 Py_INCREF(w);
1231 PUSH(w);
1232 }
1233 }
1234 }
1235 else if (PySequence_Check(v)) {
1236 if (unpack_sequence(v, oparg,
1237 stack_pointer + oparg))
1238 stack_pointer += oparg;
1239 else
1240 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001241 }
1242 else {
Barry Warsawe42b18f1997-08-25 22:13:04 +00001243 PyErr_SetString(PyExc_TypeError,
1244 "unpack non-sequence");
1245 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001246 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001247 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001248 break;
1249
1250 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001251 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001252 v = POP();
1253 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001254 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1255 Py_DECREF(v);
1256 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001257 break;
1258
1259 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001260 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001261 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001262 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1263 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001264 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001265 break;
1266
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001267 case STORE_GLOBAL:
1268 w = GETNAMEV(oparg);
1269 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001270 err = PyDict_SetItem(f->f_globals, w, v);
1271 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001272 break;
1273
1274 case DELETE_GLOBAL:
1275 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001276 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
1277 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001278 break;
1279
Guido van Rossum374a9221991-04-04 10:40:29 +00001280 case LOAD_CONST:
1281 x = GETCONST(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001282 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001283 PUSH(x);
1284 break;
1285
1286 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001287 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001288 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001289 PyErr_SetString(PyExc_SystemError,
1290 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001291 break;
1292 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001293 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001294 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001295 x = PyDict_GetItem(f->f_globals, 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_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001298 if (x == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001299 PyErr_SetObject(
1300 PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001301 break;
1302 }
1303 }
1304 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001305 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001306 PUSH(x);
1307 break;
1308
1309 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001310 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001311 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001312 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001313 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001314 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001315 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001316 break;
1317 }
1318 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001319 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001320 PUSH(x);
1321 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001322
Guido van Rossum9bfef441993-03-29 10:43:31 +00001323 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001324 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001325 if (x == NULL) {
Guido van Rossum87460821999-06-22 14:47:32 +00001326 PyErr_SetObject(PyExc_UnboundLocalError,
Guido van Rossumb209a111997-04-29 18:18:01 +00001327 PyTuple_GetItem(co->co_varnames,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001328 oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001329 break;
1330 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001331 Py_INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001332 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001333 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001334 break;
1335
1336 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001337 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001338 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001339 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001340
1341 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001342 x = GETLOCAL(oparg);
1343 if (x == NULL) {
Guido van Rossum87460821999-06-22 14:47:32 +00001344 PyErr_SetObject(PyExc_UnboundLocalError,
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001345 PyTuple_GetItem(co->co_varnames,
1346 oparg));
1347 break;
1348 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001349 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001350 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001351
1352 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001353 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001354 if (x != NULL) {
1355 for (; --oparg >= 0;) {
1356 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001357 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001358 }
1359 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001360 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001361 }
1362 break;
1363
1364 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001365 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001366 if (x != NULL) {
1367 for (; --oparg >= 0;) {
1368 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001369 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001370 }
1371 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001372 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001373 }
1374 break;
1375
1376 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001377 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001378 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001379 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001380 break;
1381
1382 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001383 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001384 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001385 x = PyObject_GetAttr(v, w);
1386 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001387 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001388 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001389 break;
1390
1391 case COMPARE_OP:
1392 w = POP();
1393 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +00001394 if (PyInt_Check(v) && PyInt_Check(w)) {
1395 /* INLINE: cmp(int, int) */
1396 register long a, b;
1397 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001398 a = PyInt_AS_LONG(v);
1399 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001400 switch (oparg) {
1401 case LT: res = a < b; break;
1402 case LE: res = a <= b; break;
1403 case EQ: res = a == b; break;
1404 case NE: res = a != b; break;
1405 case GT: res = a > b; break;
1406 case GE: res = a >= b; break;
1407 case IS: res = v == w; break;
1408 case IS_NOT: res = v != w; break;
1409 default: goto slow_compare;
1410 }
1411 x = res ? Py_True : Py_False;
1412 Py_INCREF(x);
1413 }
1414 else {
1415 slow_compare:
1416 x = cmp_outcome(oparg, v, w);
1417 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001418 Py_DECREF(v);
1419 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001420 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001421 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001422 break;
1423
1424 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001425 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001426 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001427 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001428 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001429 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001430 break;
1431 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001432 u = find_from_args(f, INSTR_OFFSET());
1433 if (u == NULL) {
1434 x = u;
1435 break;
Guido van Rossum24c13741995-02-14 09:42:43 +00001436 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001437 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001438 w,
1439 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001440 f->f_locals == NULL ?
1441 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001442 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001443 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001444 if (w == NULL) {
1445 x = NULL;
1446 break;
1447 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001448 x = PyEval_CallObject(x, w);
1449 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001450 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001451 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001452 break;
1453
1454 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001455 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001456 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001457 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001458 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001459 PyErr_SetString(PyExc_SystemError,
1460 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001461 break;
1462 }
1463 err = import_from(x, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001464 PyFrame_LocalsToFast(f, 0);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001465 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001466 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001467
Guido van Rossum374a9221991-04-04 10:40:29 +00001468 case JUMP_FORWARD:
1469 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001470 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001471
1472 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001473 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001474 if (err > 0)
1475 err = 0;
1476 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001477 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001478 else
1479 break;
1480 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001481
1482 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001483 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001484 if (err > 0) {
1485 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001486 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001487 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001488 else if (err == 0)
1489 ;
1490 else
1491 break;
1492 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001493
1494 case JUMP_ABSOLUTE:
1495 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001496 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001497
1498 case FOR_LOOP:
1499 /* for v in s: ...
1500 On entry: stack contains s, i.
1501 On exit: stack contains s, i+1, s[i];
1502 but if loop exhausted:
1503 s, i are popped, and we jump */
1504 w = POP(); /* Loop index */
1505 v = POP(); /* Sequence object */
1506 u = loop_subscript(v, w);
1507 if (u != NULL) {
1508 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001509 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001510 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001511 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001512 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001513 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001514 }
1515 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001516 Py_DECREF(v);
1517 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001518 /* A NULL can mean "s exhausted"
1519 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001520 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001521 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001522 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001523 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001524 continue;
1525 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001526 }
1527 break;
1528
1529 case SETUP_LOOP:
1530 case SETUP_EXCEPT:
1531 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001532 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Guido van Rossum374a9221991-04-04 10:40:29 +00001533 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001534 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001535
1536 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001537#ifdef LLTRACE
1538 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001539 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001540#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001541 f->f_lineno = oparg;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001542 if (f->f_trace == NULL)
1543 continue;
1544 /* Trace each line of code reached */
1545 f->f_lasti = INSTR_OFFSET();
1546 err = call_trace(&f->f_trace, &f->f_trace,
Guido van Rossumb209a111997-04-29 18:18:01 +00001547 f, "line", Py_None);
Guido van Rossum374a9221991-04-04 10:40:29 +00001548 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001549
1550 case CALL_FUNCTION:
1551 {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001552 int na = oparg & 0xff;
1553 int nk = (oparg>>8) & 0xff;
1554 int n = na + 2*nk;
Guido van Rossumb209a111997-04-29 18:18:01 +00001555 PyObject **pfunc = stack_pointer - n - 1;
1556 PyObject *func = *pfunc;
1557 PyObject *self = NULL;
1558 PyObject *class = NULL;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001559 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Guido van Rossumb209a111997-04-29 18:18:01 +00001560 if (PyMethod_Check(func)) {
1561 self = PyMethod_Self(func);
1562 class = PyMethod_Class(func);
1563 func = PyMethod_Function(func);
1564 Py_INCREF(func);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001565 if (self != NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001566 Py_INCREF(self);
1567 Py_DECREF(*pfunc);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001568 *pfunc = self;
1569 na++;
1570 n++;
1571 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001572 else {
1573 /* Unbound methods must be
1574 called with an instance of
1575 the class (or a derived
1576 class) as first argument */
1577 if (na > 0 &&
1578 (self = stack_pointer[-n])
1579 != NULL &&
Guido van Rossumb209a111997-04-29 18:18:01 +00001580 PyInstance_Check(self) &&
1581 PyClass_IsSubclass(
1582 (PyObject *)
1583 (((PyInstanceObject *)self)
Guido van Rossum681d79a1995-07-18 14:51:37 +00001584 ->in_class),
1585 class))
1586 /* Handy-dandy */ ;
1587 else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001588 PyErr_SetString(
1589 PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001590 "unbound method must be called with class instance 1st argument");
Guido van Rossum72b56e81995-12-10 04:57:42 +00001591 x = NULL;
1592 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001593 }
1594 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001595 }
1596 else
Guido van Rossumb209a111997-04-29 18:18:01 +00001597 Py_INCREF(func);
1598 if (PyFunction_Check(func)) {
1599 PyObject *co = PyFunction_GetCode(func);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001600 PyObject *globals =
1601 PyFunction_GetGlobals(func);
1602 PyObject *argdefs =
1603 PyFunction_GetDefaults(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00001604 PyObject **d;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001605 int nd;
1606 if (argdefs != NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001607 d = &PyTuple_GET_ITEM(argdefs, 0);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001608 nd = ((PyTupleObject *)argdefs) ->
1609 ob_size;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001610 }
1611 else {
1612 d = NULL;
1613 nd = 0;
1614 }
1615 x = eval_code2(
Guido van Rossumb209a111997-04-29 18:18:01 +00001616 (PyCodeObject *)co,
1617 globals, (PyObject *)NULL,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001618 stack_pointer-n, na,
1619 stack_pointer-2*nk, nk,
1620 d, nd,
1621 class);
1622 }
1623 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001624 PyObject *args = PyTuple_New(na);
1625 PyObject *kwdict = NULL;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001626 if (args == NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001627 x = NULL;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001628 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001629 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001630 if (nk > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001631 kwdict = PyDict_New();
Guido van Rossumff8b4941995-07-26 18:16:42 +00001632 if (kwdict == NULL) {
1633 x = NULL;
1634 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001635 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001636 err = 0;
1637 while (--nk >= 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001638 PyObject *value = POP();
1639 PyObject *key = POP();
1640 err = PyDict_SetItem(
Guido van Rossumff8b4941995-07-26 18:16:42 +00001641 kwdict, key, value);
Guido van Rossumb209a111997-04-29 18:18:01 +00001642 Py_DECREF(key);
1643 Py_DECREF(value);
Guido van Rossumd0eb4291997-01-27 21:30:09 +00001644 if (err)
Guido van Rossumff8b4941995-07-26 18:16:42 +00001645 break;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001646 }
1647 if (err) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001648 Py_DECREF(args);
1649 Py_DECREF(kwdict);
Guido van Rossumff8b4941995-07-26 18:16:42 +00001650 break;
1651 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001652 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001653 while (--na >= 0) {
1654 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001655 PyTuple_SET_ITEM(args, na, w);
Guido van Rossumff8b4941995-07-26 18:16:42 +00001656 }
1657 x = PyEval_CallObjectWithKeywords(
1658 func, args, kwdict);
Guido van Rossumb209a111997-04-29 18:18:01 +00001659 Py_DECREF(args);
1660 Py_XDECREF(kwdict);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001661 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001662 Py_DECREF(func);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001663 while (stack_pointer > pfunc) {
1664 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001665 Py_DECREF(w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001666 }
1667 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001668 if (x != NULL) continue;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001669 break;
1670 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001671
Guido van Rossum681d79a1995-07-18 14:51:37 +00001672 case MAKE_FUNCTION:
1673 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00001674 x = PyFunction_New(v, f->f_globals);
1675 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001676 /* XXX Maybe this should be a separate opcode? */
1677 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001678 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001679 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001680 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001681 x = NULL;
1682 break;
1683 }
1684 while (--oparg >= 0) {
1685 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001686 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001687 }
1688 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001689 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001690 }
1691 PUSH(x);
1692 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001693
1694 case BUILD_SLICE:
1695 if (oparg == 3)
1696 w = POP();
1697 else
1698 w = NULL;
1699 v = POP();
1700 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00001701 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001702 Py_DECREF(u);
1703 Py_DECREF(v);
1704 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00001705 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001706 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00001707 break;
1708
1709
Guido van Rossum374a9221991-04-04 10:40:29 +00001710 default:
1711 fprintf(stderr,
1712 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001713 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00001714 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00001715 why = WHY_EXCEPTION;
1716 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001717
1718#ifdef CASE_TOO_BIG
1719 }
1720#endif
1721
Guido van Rossum374a9221991-04-04 10:40:29 +00001722 } /* switch */
1723
1724 on_error:
1725
1726 /* Quickly continue if no error occurred */
1727
1728 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001729 if (err == 0 && x != NULL) {
1730#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00001731 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00001732 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00001733 fprintf(stderr,
1734 "XXX undetected error\n");
1735 else
1736#endif
1737 continue; /* Normal, fast path */
1738 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001739 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00001740 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00001741 err = 0;
1742 }
1743
Guido van Rossum374a9221991-04-04 10:40:29 +00001744 /* Double-check exception status */
1745
1746 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001747 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001748 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00001749 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00001750 why = WHY_EXCEPTION;
1751 }
1752 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00001753#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001754 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00001755 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00001756 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001757 fprintf(stderr,
1758 "XXX undetected error (why=%d)\n",
1759 why);
1760 why = WHY_EXCEPTION;
1761 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001762 }
1763#endif
1764
1765 /* Log traceback info if this is a real exception */
1766
1767 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001768 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001769 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001770 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00001771 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001772
Guido van Rossume59214e1994-08-30 08:01:59 +00001773 if (f->f_trace)
1774 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001775 if (tstate->sys_profilefunc)
1776 call_exc_trace(&tstate->sys_profilefunc,
1777 (PyObject**)0, f);
Guido van Rossum014518f1998-11-23 21:09:51 +00001778 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001779
1780 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1781
1782 if (why == WHY_RERAISE)
1783 why = WHY_EXCEPTION;
1784
1785 /* Unwind stacks if a (pseudo) exception occurred */
1786
1787 while (why != WHY_NOT && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001788 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001789 while (STACK_LEVEL() > b->b_level) {
1790 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001791 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001792 }
1793 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1794 why = WHY_NOT;
1795 JUMPTO(b->b_handler);
1796 break;
1797 }
1798 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00001799 (b->b_type == SETUP_EXCEPT &&
1800 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001801 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001802 PyObject *exc, *val, *tb;
1803 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001804 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001805 val = Py_None;
1806 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00001807 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001808 /* Make the raw exception data
1809 available to the handler,
1810 so a program can emulate the
1811 Python main loop. Don't do
1812 this for 'finally'. */
1813 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00001814 PyErr_NormalizeException(
1815 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001816 set_exc_info(tstate,
1817 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001818 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001819 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001820 PUSH(val);
1821 PUSH(exc);
1822 }
1823 else {
1824 if (why == WHY_RETURN)
1825 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00001826 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00001827 PUSH(v);
1828 }
1829 why = WHY_NOT;
1830 JUMPTO(b->b_handler);
1831 break;
1832 }
1833 } /* unwind stack */
1834
1835 /* End the loop if we still have an error (or return) */
1836
1837 if (why != WHY_NOT)
1838 break;
1839
1840 } /* main loop */
1841
1842 /* Pop remaining stack entries */
1843
1844 while (!EMPTY()) {
1845 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001846 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001847 }
1848
Guido van Rossum96a42c81992-01-12 02:29:51 +00001849 if (why != WHY_RETURN)
1850 retval = NULL;
1851
Guido van Rossume59214e1994-08-30 08:01:59 +00001852 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001853 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001854 if (call_trace(&f->f_trace, &f->f_trace, f,
1855 "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001856 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001857 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001858 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001859 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001860 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001861 }
1862
Guido van Rossuma027efa1997-05-05 20:56:21 +00001863 if (tstate->sys_profilefunc && why == WHY_RETURN) {
1864 if (call_trace(&tstate->sys_profilefunc, (PyObject**)0,
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001865 f, "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001866 Py_XDECREF(retval);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001867 retval = NULL;
1868 why = WHY_EXCEPTION;
1869 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001870 }
Guido van Rossuma4240131997-01-21 21:18:36 +00001871
Guido van Rossuma027efa1997-05-05 20:56:21 +00001872 reset_exc_info(tstate);
1873
1874 --tstate->recursion_depth;
Guido van Rossum8c5df061997-01-24 04:19:24 +00001875
1876 fail: /* Jump here from prelude on failure */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001877
Guido van Rossum374a9221991-04-04 10:40:29 +00001878 /* Restore previous frame and release the current one */
Guido van Rossum681d79a1995-07-18 14:51:37 +00001879
Guido van Rossuma027efa1997-05-05 20:56:21 +00001880 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +00001881 Py_DECREF(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001882
Guido van Rossum96a42c81992-01-12 02:29:51 +00001883 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001884}
1885
Guido van Rossuma027efa1997-05-05 20:56:21 +00001886static void
1887set_exc_info(tstate, type, value, tb)
1888 PyThreadState *tstate;
1889 PyObject *type;
1890 PyObject *value;
1891 PyObject *tb;
1892{
1893 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001894 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00001895
Guido van Rossuma027efa1997-05-05 20:56:21 +00001896 frame = tstate->frame;
1897 if (frame->f_exc_type == NULL) {
1898 /* This frame didn't catch an exception before */
1899 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00001900 if (tstate->exc_type == NULL) {
1901 Py_INCREF(Py_None);
1902 tstate->exc_type = Py_None;
1903 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001904 tmp_type = frame->f_exc_type;
1905 tmp_value = frame->f_exc_value;
1906 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001907 Py_XINCREF(tstate->exc_type);
1908 Py_XINCREF(tstate->exc_value);
1909 Py_XINCREF(tstate->exc_traceback);
1910 frame->f_exc_type = tstate->exc_type;
1911 frame->f_exc_value = tstate->exc_value;
1912 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001913 Py_XDECREF(tmp_type);
1914 Py_XDECREF(tmp_value);
1915 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001916 }
1917 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001918 tmp_type = tstate->exc_type;
1919 tmp_value = tstate->exc_value;
1920 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001921 Py_XINCREF(type);
1922 Py_XINCREF(value);
1923 Py_XINCREF(tb);
1924 tstate->exc_type = type;
1925 tstate->exc_value = value;
1926 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001927 Py_XDECREF(tmp_type);
1928 Py_XDECREF(tmp_value);
1929 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001930 /* For b/w compatibility */
1931 PySys_SetObject("exc_type", type);
1932 PySys_SetObject("exc_value", value);
1933 PySys_SetObject("exc_traceback", tb);
1934}
1935
1936static void
1937reset_exc_info(tstate)
1938 PyThreadState *tstate;
1939{
1940 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001941 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001942 frame = tstate->frame;
1943 if (frame->f_exc_type != NULL) {
1944 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001945 tmp_type = tstate->exc_type;
1946 tmp_value = tstate->exc_value;
1947 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001948 Py_XINCREF(frame->f_exc_type);
1949 Py_XINCREF(frame->f_exc_value);
1950 Py_XINCREF(frame->f_exc_traceback);
1951 tstate->exc_type = frame->f_exc_type;
1952 tstate->exc_value = frame->f_exc_value;
1953 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001954 Py_XDECREF(tmp_type);
1955 Py_XDECREF(tmp_value);
1956 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001957 /* For b/w compatibility */
1958 PySys_SetObject("exc_type", frame->f_exc_type);
1959 PySys_SetObject("exc_value", frame->f_exc_value);
1960 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
1961 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001962 tmp_type = frame->f_exc_type;
1963 tmp_value = frame->f_exc_value;
1964 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001965 frame->f_exc_type = NULL;
1966 frame->f_exc_value = NULL;
1967 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001968 Py_XDECREF(tmp_type);
1969 Py_XDECREF(tmp_value);
1970 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001971}
1972
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001973/* Logic for the raise statement (too complicated for inlining).
1974 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00001975static enum why_code
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001976do_raise(type, value, tb)
Guido van Rossumb209a111997-04-29 18:18:01 +00001977 PyObject *type, *value, *tb;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001978{
Guido van Rossumd295f121998-04-09 21:39:57 +00001979 if (type == NULL) {
1980 /* Reraise */
1981 PyThreadState *tstate = PyThreadState_Get();
1982 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
1983 value = tstate->exc_value;
1984 tb = tstate->exc_traceback;
1985 Py_XINCREF(type);
1986 Py_XINCREF(value);
1987 Py_XINCREF(tb);
1988 }
1989
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001990 /* We support the following forms of raise:
1991 raise <class>, <classinstance>
1992 raise <class>, <argument tuple>
1993 raise <class>, None
1994 raise <class>, <argument>
1995 raise <classinstance>, None
1996 raise <string>, <object>
1997 raise <string>, None
1998
1999 An omitted second argument is the same as None.
2000
2001 In addition, raise <tuple>, <anything> is the same as
2002 raising the tuple's first item (and it better have one!);
2003 this rule is applied recursively.
2004
2005 Finally, an optional third argument can be supplied, which
2006 gives the traceback to be substituted (useful when
2007 re-raising an exception after examining it). */
2008
2009 /* First, check the traceback argument, replacing None with
2010 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002011 if (tb == Py_None) {
2012 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002013 tb = NULL;
2014 }
2015 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002016 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002017 "raise 3rd arg must be traceback or None");
2018 goto raise_error;
2019 }
2020
2021 /* Next, replace a missing value with None */
2022 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002023 value = Py_None;
2024 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002025 }
2026
2027 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002028 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2029 PyObject *tmp = type;
2030 type = PyTuple_GET_ITEM(type, 0);
2031 Py_INCREF(type);
2032 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002033 }
2034
Barry Warsaw4249f541997-08-22 21:26:19 +00002035 if (PyString_Check(type))
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002036 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002037
2038 else if (PyClass_Check(type))
2039 PyErr_NormalizeException(&type, &value, &tb);
2040
Guido van Rossumb209a111997-04-29 18:18:01 +00002041 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002042 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002043 if (value != Py_None) {
2044 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002045 "instance exception may not have a separate value");
2046 goto raise_error;
2047 }
2048 else {
2049 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002050 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002051 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002052 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2053 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002054 }
2055 }
2056 else {
2057 /* Not something you can raise. You get an exception
2058 anyway, just not what you specified :-) */
Guido van Rossumb209a111997-04-29 18:18:01 +00002059 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002060 "exceptions must be strings, classes, or instances");
2061 goto raise_error;
2062 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002063 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002064 if (tb == NULL)
2065 return WHY_EXCEPTION;
2066 else
2067 return WHY_RERAISE;
2068 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002069 Py_XDECREF(value);
2070 Py_XDECREF(type);
2071 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002072 return WHY_EXCEPTION;
2073}
2074
Barry Warsawe42b18f1997-08-25 22:13:04 +00002075static int
2076unpack_sequence(v, argcnt, sp)
2077 PyObject *v;
2078 int argcnt;
2079 PyObject **sp;
2080{
2081 int i;
2082 PyObject *w;
2083
2084 for (i = 0; i < argcnt; i++) {
2085 if (! (w = PySequence_GetItem(v, i))) {
2086 if (PyErr_ExceptionMatches(PyExc_IndexError))
2087 PyErr_SetString(PyExc_ValueError,
2088 "unpack sequence of wrong size");
2089 goto finally;
2090 }
2091 *--sp = w;
2092 }
2093 /* we better get an IndexError now */
2094 if (PySequence_GetItem(v, i) == NULL) {
2095 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
2096 PyErr_Clear();
2097 return 1;
2098 }
2099 /* some other exception occurred. fall through to finally */
2100 }
2101 else
2102 PyErr_SetString(PyExc_ValueError,
2103 "unpack sequence of wrong size");
2104 /* fall through */
2105finally:
Barry Warsaw91010551997-08-25 22:30:51 +00002106 for (; i > 0; i--, sp++)
2107 Py_DECREF(*sp);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002108
2109 return 0;
2110}
2111
2112
Guido van Rossum96a42c81992-01-12 02:29:51 +00002113#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002114static int
2115prtrace(v, str)
Guido van Rossumb209a111997-04-29 18:18:01 +00002116 PyObject *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002117 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002118{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002119 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002120 if (PyObject_Print(v, stdout, 0) != 0)
2121 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002122 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002123}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002124#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002125
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002126static void
2127call_exc_trace(p_trace, p_newtrace, f)
Guido van Rossumb209a111997-04-29 18:18:01 +00002128 PyObject **p_trace, **p_newtrace;
2129 PyFrameObject *f;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002130{
Guido van Rossumb209a111997-04-29 18:18:01 +00002131 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002132 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002133 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002134 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002135 value = Py_None;
2136 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002137 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002138 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002139 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002140 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002141 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002142 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002143 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002144 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002145 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002146 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002147 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002148 Py_XDECREF(type);
2149 Py_XDECREF(value);
2150 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002151 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002152}
2153
2154static int
2155call_trace(p_trace, p_newtrace, f, msg, arg)
Guido van Rossumb209a111997-04-29 18:18:01 +00002156 PyObject **p_trace; /* in/out; may not be NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002157 may not point to NULL variable initially */
Guido van Rossumb209a111997-04-29 18:18:01 +00002158 PyObject **p_newtrace; /* in/out; may be NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002159 may point to NULL variable;
2160 may be same variable as p_newtrace */
Guido van Rossumb209a111997-04-29 18:18:01 +00002161 PyFrameObject *f;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002162 char *msg;
Guido van Rossumb209a111997-04-29 18:18:01 +00002163 PyObject *arg;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002164{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002165 PyThreadState *tstate = f->f_tstate;
Guido van Rossumb209a111997-04-29 18:18:01 +00002166 PyObject *args, *what;
2167 PyObject *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002168
Guido van Rossuma027efa1997-05-05 20:56:21 +00002169 if (tstate->tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002170 /* Don't do recursive traces */
2171 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002172 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002173 *p_newtrace = NULL;
2174 }
2175 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002176 }
2177
Guido van Rossumb209a111997-04-29 18:18:01 +00002178 args = PyTuple_New(3);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002179 if (args == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002180 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002181 what = PyString_FromString(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002182 if (what == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002183 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002184 Py_INCREF(f);
2185 PyTuple_SET_ITEM(args, 0, (PyObject *)f);
2186 PyTuple_SET_ITEM(args, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002187 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002188 arg = Py_None;
2189 Py_INCREF(arg);
2190 PyTuple_SET_ITEM(args, 2, arg);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002191 tstate->tracing++;
Guido van Rossumb209a111997-04-29 18:18:01 +00002192 PyFrame_FastToLocals(f);
2193 res = PyEval_CallObject(*p_trace, args); /* May clear *p_trace! */
2194 PyFrame_LocalsToFast(f, 1);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002195 tstate->tracing--;
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002196 cleanup:
Guido van Rossumb209a111997-04-29 18:18:01 +00002197 Py_XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002198 if (res == NULL) {
2199 /* The trace proc raised an exception */
Guido van Rossumb209a111997-04-29 18:18:01 +00002200 PyTraceBack_Here(f);
2201 Py_XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002202 *p_trace = NULL;
2203 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002204 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002205 *p_newtrace = NULL;
2206 }
Barry Warsawf6202631999-09-08 16:26:33 +00002207 /* to be extra double plus sure we don't get recursive
2208 * calls inf either tracefunc or profilefunc gets an
2209 * exception, zap the global variables.
2210 */
2211 Py_XDECREF(tstate->sys_tracefunc);
2212 tstate->sys_tracefunc = NULL;
2213 Py_XDECREF(tstate->sys_profilefunc);
2214 tstate->sys_profilefunc = NULL;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002215 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002216 }
2217 else {
2218 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002219 Py_XDECREF(*p_newtrace);
2220 if (res == Py_None)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002221 *p_newtrace = NULL;
2222 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002223 Py_INCREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002224 *p_newtrace = res;
2225 }
2226 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002227 Py_DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002228 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002229 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002230}
2231
Guido van Rossumb209a111997-04-29 18:18:01 +00002232PyObject *
2233PyEval_GetBuiltins()
Guido van Rossum6135a871995-01-09 17:53:26 +00002234{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002235 PyThreadState *tstate = PyThreadState_Get();
2236 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002237 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002238 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002239 else
2240 return current_frame->f_builtins;
2241}
2242
Guido van Rossumb209a111997-04-29 18:18:01 +00002243PyObject *
2244PyEval_GetLocals()
Guido van Rossum5b722181993-03-30 17:46:03 +00002245{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002246 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002247 if (current_frame == NULL)
2248 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002249 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002250 return current_frame->f_locals;
2251}
2252
Guido van Rossumb209a111997-04-29 18:18:01 +00002253PyObject *
2254PyEval_GetGlobals()
Guido van Rossum3f5da241990-12-20 15:06:42 +00002255{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002256 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002257 if (current_frame == NULL)
2258 return NULL;
2259 else
2260 return current_frame->f_globals;
2261}
2262
Guido van Rossumb209a111997-04-29 18:18:01 +00002263PyObject *
2264PyEval_GetFrame()
Guido van Rossume59214e1994-08-30 08:01:59 +00002265{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002266 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002267 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002268}
2269
Guido van Rossum6135a871995-01-09 17:53:26 +00002270int
Guido van Rossumb209a111997-04-29 18:18:01 +00002271PyEval_GetRestricted()
Guido van Rossum6135a871995-01-09 17:53:26 +00002272{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002273 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002274 return current_frame == NULL ? 0 : current_frame->f_restricted;
2275}
2276
Guido van Rossumbe270261997-05-22 22:26:18 +00002277int
Guido van Rossumb209a111997-04-29 18:18:01 +00002278Py_FlushLine()
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002279{
Guido van Rossumb209a111997-04-29 18:18:01 +00002280 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002281 if (f == NULL)
2282 return 0;
2283 if (!PyFile_SoftSpace(f, 0))
2284 return 0;
2285 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002286}
2287
Guido van Rossum3f5da241990-12-20 15:06:42 +00002288
Guido van Rossum681d79a1995-07-18 14:51:37 +00002289/* External interface to call any callable object.
2290 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002291
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002292#undef PyEval_CallObject
2293/* for backward compatibility: export this interface */
2294
Guido van Rossumb209a111997-04-29 18:18:01 +00002295PyObject *
2296PyEval_CallObject(func, arg)
2297 PyObject *func;
2298 PyObject *arg;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002299{
Guido van Rossumb209a111997-04-29 18:18:01 +00002300 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002301}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002302#define PyEval_CallObject(func,arg) \
2303 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00002304
Guido van Rossumb209a111997-04-29 18:18:01 +00002305PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002306PyEval_CallObjectWithKeywords(func, arg, kw)
Guido van Rossumb209a111997-04-29 18:18:01 +00002307 PyObject *func;
2308 PyObject *arg;
2309 PyObject *kw;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002310{
2311 ternaryfunc call;
Guido van Rossumb209a111997-04-29 18:18:01 +00002312 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002313
2314 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002315 arg = PyTuple_New(0);
2316 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002317 PyErr_SetString(PyExc_TypeError,
2318 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002319 return NULL;
2320 }
2321 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002322 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002323
Guido van Rossumb209a111997-04-29 18:18:01 +00002324 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002325 PyErr_SetString(PyExc_TypeError,
2326 "keyword list must be a dictionary");
Guido van Rossume3e61c11995-08-04 04:14:47 +00002327 return NULL;
2328 }
2329
Guido van Rossum150b2df1996-12-05 23:17:11 +00002330 if ((call = func->ob_type->tp_call) != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002331 result = (*call)(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002332 else if (PyMethod_Check(func) || PyFunction_Check(func))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002333 result = call_function(func, arg, kw);
2334 else
2335 result = call_builtin(func, arg, kw);
2336
Guido van Rossumb209a111997-04-29 18:18:01 +00002337 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002338
Guido van Rossumb209a111997-04-29 18:18:01 +00002339 if (result == NULL && !PyErr_Occurred())
2340 PyErr_SetString(PyExc_SystemError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002341 "NULL result without error in call_object");
Guido van Rossume59214e1994-08-30 08:01:59 +00002342
2343 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002344}
2345
Guido van Rossumb209a111997-04-29 18:18:01 +00002346static PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002347call_builtin(func, arg, kw)
Guido van Rossumb209a111997-04-29 18:18:01 +00002348 PyObject *func;
2349 PyObject *arg;
2350 PyObject *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002351{
Guido van Rossumb209a111997-04-29 18:18:01 +00002352 if (PyCFunction_Check(func)) {
2353 PyCFunction meth = PyCFunction_GetFunction(func);
2354 PyObject *self = PyCFunction_GetSelf(func);
2355 int flags = PyCFunction_GetFlags(func);
Guido van Rossumff8b4941995-07-26 18:16:42 +00002356 if (!(flags & METH_VARARGS)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002357 int size = PyTuple_Size(arg);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002358 if (size == 1)
Guido van Rossumb209a111997-04-29 18:18:01 +00002359 arg = PyTuple_GET_ITEM(arg, 0);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002360 else if (size == 0)
2361 arg = NULL;
2362 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002363 if (flags & METH_KEYWORDS)
2364 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002365 if (kw != NULL && PyDict_Size(kw) != 0) {
2366 PyErr_SetString(PyExc_TypeError,
Guido van Rossumff8b4941995-07-26 18:16:42 +00002367 "this function takes no keyword arguments");
2368 return NULL;
2369 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002370 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002371 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002372 if (PyClass_Check(func)) {
2373 return PyInstance_New(func, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002374 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002375 if (PyInstance_Check(func)) {
2376 PyObject *res, *call = PyObject_GetAttrString(func,"__call__");
Guido van Rossume59214e1994-08-30 08:01:59 +00002377 if (call == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002378 PyErr_Clear();
2379 PyErr_SetString(PyExc_AttributeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002380 "no __call__ method defined");
Guido van Rossume59214e1994-08-30 08:01:59 +00002381 return NULL;
2382 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002383 res = PyEval_CallObjectWithKeywords(call, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002384 Py_DECREF(call);
Guido van Rossume59214e1994-08-30 08:01:59 +00002385 return res;
2386 }
Guido van Rossumba98a421999-11-15 19:29:33 +00002387 PyErr_Format(PyExc_TypeError, "call of non-function (type %.400s)",
Guido van Rossum2d1ad391998-08-25 18:16:54 +00002388 func->ob_type->tp_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002389 return NULL;
2390}
2391
Guido van Rossumb209a111997-04-29 18:18:01 +00002392static PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002393call_function(func, arg, kw)
Guido van Rossumb209a111997-04-29 18:18:01 +00002394 PyObject *func;
2395 PyObject *arg;
2396 PyObject *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002397{
Guido van Rossumb209a111997-04-29 18:18:01 +00002398 PyObject *class = NULL; /* == owner */
2399 PyObject *argdefs;
2400 PyObject **d, **k;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002401 int nk, nd;
Guido van Rossumb209a111997-04-29 18:18:01 +00002402 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002403
Guido van Rossumb209a111997-04-29 18:18:01 +00002404 if (kw != NULL && !PyDict_Check(kw)) {
2405 PyErr_BadInternalCall();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002406 return NULL;
2407 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002408
Guido van Rossumb209a111997-04-29 18:18:01 +00002409 if (PyMethod_Check(func)) {
2410 PyObject *self = PyMethod_Self(func);
2411 class = PyMethod_Class(func);
2412 func = PyMethod_Function(func);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002413 if (self == NULL) {
2414 /* Unbound methods must be called with an instance of
2415 the class (or a derived class) as first argument */
Guido van Rossumb209a111997-04-29 18:18:01 +00002416 if (PyTuple_Size(arg) >= 1) {
2417 self = PyTuple_GET_ITEM(arg, 0);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002418 if (self != NULL &&
Guido van Rossumb209a111997-04-29 18:18:01 +00002419 PyInstance_Check(self) &&
2420 PyClass_IsSubclass((PyObject *)
2421 (((PyInstanceObject *)self)->in_class),
Guido van Rossumb3f72581993-05-21 19:56:10 +00002422 class))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002423 /* Handy-dandy */ ;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002424 else
2425 self = NULL;
2426 }
2427 if (self == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002428 PyErr_SetString(PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002429 "unbound method must be called with class instance 1st argument");
Guido van Rossumb3f72581993-05-21 19:56:10 +00002430 return NULL;
2431 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002432 Py_INCREF(arg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002433 }
2434 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002435 int argcount = PyTuple_Size(arg);
2436 PyObject *newarg = PyTuple_New(argcount + 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002437 int i;
Guido van Rossum81daa321993-05-20 14:24:46 +00002438 if (newarg == NULL)
2439 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002440 Py_INCREF(self);
2441 PyTuple_SET_ITEM(newarg, 0, self);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002442 for (i = 0; i < argcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002443 PyObject *v = PyTuple_GET_ITEM(arg, i);
2444 Py_XINCREF(v);
2445 PyTuple_SET_ITEM(newarg, i+1, v);
Guido van Rossum81daa321993-05-20 14:24:46 +00002446 }
2447 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002448 }
Guido van Rossum7859f871998-07-08 14:58:16 +00002449 if (!PyFunction_Check(func)) {
2450 result = PyEval_CallObjectWithKeywords(func, arg, kw);
2451 Py_DECREF(arg);
2452 return result;
2453 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002454 }
2455 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002456 if (!PyFunction_Check(func)) {
Guido van Rossum2d1ad391998-08-25 18:16:54 +00002457 PyErr_Format(PyExc_TypeError,
2458 "call of non-function (type %s)",
2459 func->ob_type->tp_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002460 return NULL;
2461 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002462 Py_INCREF(arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002463 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002464
2465 argdefs = PyFunction_GetDefaults(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00002466 if (argdefs != NULL && PyTuple_Check(argdefs)) {
2467 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
2468 nd = PyTuple_Size(argdefs);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002469 }
2470 else {
2471 d = NULL;
2472 nd = 0;
2473 }
2474
2475 if (kw != NULL) {
2476 int pos, i;
Guido van Rossumb209a111997-04-29 18:18:01 +00002477 nk = PyDict_Size(kw);
2478 k = PyMem_NEW(PyObject *, 2*nk);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002479 if (k == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002480 PyErr_NoMemory();
2481 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002482 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00002483 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002484 pos = i = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00002485 while (PyDict_Next(kw, &pos, &k[i], &k[i+1]))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002486 i += 2;
2487 nk = i/2;
2488 /* XXX This is broken if the caller deletes dict items! */
2489 }
2490 else {
2491 k = NULL;
2492 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00002493 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002494
Guido van Rossum681d79a1995-07-18 14:51:37 +00002495 result = eval_code2(
Guido van Rossumb209a111997-04-29 18:18:01 +00002496 (PyCodeObject *)PyFunction_GetCode(func),
2497 PyFunction_GetGlobals(func), (PyObject *)NULL,
2498 &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg),
Guido van Rossum681d79a1995-07-18 14:51:37 +00002499 k, nk,
2500 d, nd,
2501 class);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002502
Guido van Rossumb209a111997-04-29 18:18:01 +00002503 Py_DECREF(arg);
2504 PyMem_XDEL(k);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002505
Guido van Rossum681d79a1995-07-18 14:51:37 +00002506 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002507}
2508
Guido van Rossum3b9c6671996-07-30 18:40:29 +00002509#define SLICE_ERROR_MSG \
2510 "standard sequence type does not support step size other than one"
2511
Guido van Rossumb209a111997-04-29 18:18:01 +00002512static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002513loop_subscript(v, w)
Guido van Rossumb209a111997-04-29 18:18:01 +00002514 PyObject *v, *w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002515{
Guido van Rossumb209a111997-04-29 18:18:01 +00002516 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00002517 int i;
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00002518 if (sq == NULL || sq->sq_item == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002519 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002520 return NULL;
2521 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002522 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00002523 v = (*sq->sq_item)(v, i);
2524 if (v)
2525 return v;
Barry Warsaw4249f541997-08-22 21:26:19 +00002526 if (PyErr_ExceptionMatches(PyExc_IndexError))
Guido van Rossumb209a111997-04-29 18:18:01 +00002527 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00002528 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002529}
2530
2531static int
Guido van Rossuma027efa1997-05-05 20:56:21 +00002532slice_index(v, pi)
Guido van Rossumb209a111997-04-29 18:18:01 +00002533 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002534 int *pi;
2535{
2536 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002537 long x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00002538 if (PyInt_Check(v)) {
2539 x = PyInt_AsLong(v);
2540 } else if (PyLong_Check(v)) {
2541 x = PyLong_AsLong(v);
2542 if (x==-1 && PyErr_Occurred()) {
2543 PyObject *long_zero;
2544
2545 if (!PyErr_ExceptionMatches( PyExc_OverflowError ) ) {
2546 /* It's not an overflow error, so just
2547 signal an error */
2548 return -1;
2549 }
2550
2551 /* It's an overflow error, so we need to
2552 check the sign of the long integer,
2553 set the value to INT_MAX or 0, and clear
2554 the error. */
2555
2556 /* Create a long integer with a value of 0 */
2557 long_zero = PyLong_FromLong( 0L );
2558 if (long_zero == NULL) return -1;
2559
2560 /* Check sign */
2561 if (PyObject_Compare(long_zero, v) < 0)
2562 x = INT_MAX;
2563 else
2564 x = 0;
2565
2566 /* Free the long integer we created, and clear the
2567 OverflowError */
2568 Py_DECREF(long_zero);
2569 PyErr_Clear();
2570 }
2571 } else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002572 PyErr_SetString(PyExc_TypeError,
2573 "slice index must be int");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002574 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002575 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00002576 /* Truncate -- very long indices are truncated anyway */
2577 if (x > INT_MAX)
2578 x = INT_MAX;
2579 else if (x < -INT_MAX)
2580 x = 0;
2581 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002582 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002583 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002584}
2585
Guido van Rossumb209a111997-04-29 18:18:01 +00002586static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002587apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00002588 PyObject *u, *v, *w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002589{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002590 int ilow = 0, ihigh = INT_MAX;
2591 if (slice_index(v, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002592 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002593 if (slice_index(w, &ihigh) != 0)
Guido van Rossum04691fc1992-08-12 15:35:34 +00002594 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002595 return PySequence_GetSlice(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002596}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002597
2598static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00002599assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossumb209a111997-04-29 18:18:01 +00002600 PyObject *u, *v, *w, *x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002601{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002602 int ilow = 0, ihigh = INT_MAX;
2603 if (slice_index(v, &ilow) != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002604 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002605 if (slice_index(w, &ihigh) != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002606 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002607 if (x == NULL)
2608 return PySequence_DelSlice(u, ilow, ihigh);
2609 else
2610 return PySequence_SetSlice(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002611}
2612
Guido van Rossumb209a111997-04-29 18:18:01 +00002613static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002614cmp_outcome(op, v, w)
Guido van Rossum5b7313a1992-04-06 13:24:57 +00002615 int op;
Guido van Rossumb209a111997-04-29 18:18:01 +00002616 register PyObject *v;
2617 register PyObject *w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002618{
2619 register int cmp;
2620 register int res = 0;
2621 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002622 case IS:
2623 case IS_NOT:
2624 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002625 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002626 res = !res;
2627 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002628 case IN:
2629 case NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00002630 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002631 if (res < 0)
2632 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002633 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002634 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002635 break;
2636 case EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00002637 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002638 break;
2639 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00002640 cmp = PyObject_Compare(v, w);
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002641 if (cmp && PyErr_Occurred())
2642 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002643 switch (op) {
2644 case LT: res = cmp < 0; break;
2645 case LE: res = cmp <= 0; break;
2646 case EQ: res = cmp == 0; break;
2647 case NE: res = cmp != 0; break;
2648 case GT: res = cmp > 0; break;
2649 case GE: res = cmp >= 0; break;
2650 /* XXX no default? (res is initialized to 0 though) */
2651 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002652 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002653 v = res ? Py_True : Py_False;
2654 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002655 return v;
2656}
2657
Guido van Rossum3f5da241990-12-20 15:06:42 +00002658static int
2659import_from(locals, v, name)
Guido van Rossumb209a111997-04-29 18:18:01 +00002660 PyObject *locals;
2661 PyObject *v;
2662 PyObject *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002663{
Guido van Rossumb209a111997-04-29 18:18:01 +00002664 PyObject *w, *x;
2665 if (!PyModule_Check(v)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002666 PyErr_SetString(PyExc_TypeError,
2667 "import-from requires module object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002668 return -1;
2669 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002670 w = PyModule_GetDict(v);
2671 if (PyString_AsString(name)[0] == '*') {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002672 int pos, err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002673 PyObject *name, *value;
Guido van Rossum25831651993-05-19 14:50:45 +00002674 pos = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00002675 while (PyDict_Next(w, &pos, &name, &value)) {
2676 if (!PyString_Check(name) ||
2677 PyString_AsString(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002678 continue;
Guido van Rossumb209a111997-04-29 18:18:01 +00002679 Py_INCREF(value);
2680 err = PyDict_SetItem(locals, name, value);
2681 Py_DECREF(value);
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002682 if (err != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002683 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002684 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002685 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002686 }
2687 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002688 x = PyDict_GetItem(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002689 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00002690 char buf[250];
Guido van Rossum16dfd291992-02-05 11:17:30 +00002691 sprintf(buf, "cannot import name %.230s",
Guido van Rossumb209a111997-04-29 18:18:01 +00002692 PyString_AsString(name));
2693 PyErr_SetString(PyExc_ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002694 return -1;
2695 }
2696 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002697 return PyDict_SetItem(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002698 }
2699}
2700
Guido van Rossumb209a111997-04-29 18:18:01 +00002701static PyObject *
Guido van Rossum25831651993-05-19 14:50:45 +00002702build_class(methods, bases, name)
Guido van Rossumb209a111997-04-29 18:18:01 +00002703 PyObject *methods; /* dictionary */
2704 PyObject *bases; /* tuple containing classes */
2705 PyObject *name; /* string */
Guido van Rossume9736fc1990-11-18 17:33:06 +00002706{
Guido van Rossumcd649651997-08-22 16:56:16 +00002707 int i, n;
Guido van Rossumb209a111997-04-29 18:18:01 +00002708 if (!PyTuple_Check(bases)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002709 PyErr_SetString(PyExc_SystemError,
2710 "build_class with non-tuple bases");
Guido van Rossum25831651993-05-19 14:50:45 +00002711 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002712 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002713 if (!PyDict_Check(methods)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002714 PyErr_SetString(PyExc_SystemError,
2715 "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002716 return NULL;
2717 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002718 if (!PyString_Check(name)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002719 PyErr_SetString(PyExc_SystemError,
2720 "build_class witn non-string name");
Guido van Rossum25831651993-05-19 14:50:45 +00002721 return NULL;
2722 }
Guido van Rossumcd649651997-08-22 16:56:16 +00002723 n = PyTuple_Size(bases);
2724 for (i = 0; i < n; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002725 PyObject *base = PyTuple_GET_ITEM(bases, i);
2726 if (!PyClass_Check(base)) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002727 /* Call the base's *type*, if it is callable.
2728 This code is a hook for Donald Beaudry's
2729 and Jim Fulton's type extensions. In
2730 unexended Python it will never be triggered
Guido van Rossum55b9ab51997-07-31 03:54:02 +00002731 since its types are not callable.
2732 Ditto: call the bases's *class*, if it has
2733 one. This makes the same thing possible
2734 without writing C code. A true meta-object
2735 protocol! */
2736 PyObject *basetype = (PyObject *)base->ob_type;
2737 PyObject *callable = NULL;
2738 if (PyCallable_Check(basetype))
2739 callable = basetype;
2740 else
2741 callable = PyObject_GetAttrString(
2742 base, "__class__");
2743 if (callable) {
2744 PyObject *args;
2745 PyObject *newclass = NULL;
2746 args = Py_BuildValue(
2747 "(OOO)", name, bases, methods);
2748 if (args != NULL) {
2749 newclass = PyEval_CallObject(
2750 callable, args);
2751 Py_DECREF(args);
2752 }
Guido van Rossum730806d1998-04-10 22:27:42 +00002753 if (callable != basetype) {
Guido van Rossum55b9ab51997-07-31 03:54:02 +00002754 Py_DECREF(callable);
Guido van Rossum730806d1998-04-10 22:27:42 +00002755 }
Guido van Rossum55b9ab51997-07-31 03:54:02 +00002756 return newclass;
Guido van Rossum150b2df1996-12-05 23:17:11 +00002757 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002758 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +00002759 "base is not a class object");
2760 return NULL;
2761 }
2762 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002763 return PyClass_New(bases, methods, name);
Guido van Rossum25831651993-05-19 14:50:45 +00002764}
2765
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002766static int
Guido van Rossuma027efa1997-05-05 20:56:21 +00002767exec_statement(f, prog, globals, locals)
2768 PyFrameObject *f;
Guido van Rossumb209a111997-04-29 18:18:01 +00002769 PyObject *prog;
2770 PyObject *globals;
2771 PyObject *locals;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002772{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002773 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00002774 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002775 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002776
Guido van Rossumb209a111997-04-29 18:18:01 +00002777 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
2778 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002779 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00002780 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002781 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00002782 locals = PyTuple_GetItem(prog, 2);
2783 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002784 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002785 if (globals == Py_None) {
2786 globals = PyEval_GetGlobals();
2787 if (locals == Py_None) {
2788 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002789 plain = 1;
2790 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002791 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002792 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002793 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00002794 if (!PyString_Check(prog) &&
2795 !PyCode_Check(prog) &&
2796 !PyFile_Check(prog)) {
2797 PyErr_SetString(PyExc_TypeError,
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002798 "exec 1st arg must be string, code or file object");
2799 return -1;
2800 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002801 if (!PyDict_Check(globals) || !PyDict_Check(locals)) {
2802 PyErr_SetString(PyExc_TypeError,
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002803 "exec 2nd/3rd args must be dict or None");
2804 return -1;
2805 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002806 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002807 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00002808 if (PyCode_Check(prog)) {
Guido van Rossuma400d8a2000-01-12 22:45:54 +00002809 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002810 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00002811 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002812 FILE *fp = PyFile_AsFile(prog);
2813 char *name = PyString_AsString(PyFile_Name(prog));
Guido van Rossuma400d8a2000-01-12 22:45:54 +00002814 v = PyRun_File(fp, name, Py_file_input, globals, locals);
2815 }
2816 else {
2817 char *s = PyString_AsString(prog);
2818 if ((int)strlen(s) != PyString_Size(prog)) {
2819 PyErr_SetString(PyExc_ValueError,
2820 "embedded '\\0' in exec string");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002821 return -1;
Guido van Rossuma400d8a2000-01-12 22:45:54 +00002822 }
2823 v = PyRun_String(s, Py_file_input, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002824 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00002825 if (plain)
2826 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002827 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002828 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00002829 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002830 return 0;
2831}
Guido van Rossum24c13741995-02-14 09:42:43 +00002832
Guido van Rossum1aa14831997-01-21 05:34:20 +00002833/* Hack for ni.py */
Guido van Rossumb209a111997-04-29 18:18:01 +00002834static PyObject *
Guido van Rossum24c13741995-02-14 09:42:43 +00002835find_from_args(f, nexti)
Guido van Rossumb209a111997-04-29 18:18:01 +00002836 PyFrameObject *f;
Guido van Rossum24c13741995-02-14 09:42:43 +00002837 int nexti;
2838{
2839 int opcode;
2840 int oparg;
Guido van Rossumb209a111997-04-29 18:18:01 +00002841 PyObject *list, *name;
Guido van Rossum24c13741995-02-14 09:42:43 +00002842 unsigned char *next_instr;
2843
Guido van Rossumd076c731998-10-07 19:42:25 +00002844 _PyCode_GETCODEPTR(f->f_code, &next_instr);
2845 next_instr += nexti;
2846
Guido van Rossum24c13741995-02-14 09:42:43 +00002847 opcode = (*next_instr++);
2848 if (opcode != IMPORT_FROM) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002849 Py_INCREF(Py_None);
2850 return Py_None;
Guido van Rossum24c13741995-02-14 09:42:43 +00002851 }
2852
Guido van Rossumb209a111997-04-29 18:18:01 +00002853 list = PyList_New(0);
Guido van Rossum24c13741995-02-14 09:42:43 +00002854 if (list == NULL)
2855 return NULL;
2856
2857 do {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002858 oparg = (next_instr[1]<<8) + next_instr[0];
2859 next_instr += 2;
Guido van Rossum24c13741995-02-14 09:42:43 +00002860 name = Getnamev(f, oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002861 if (PyList_Append(list, name) < 0) {
2862 Py_DECREF(list);
Guido van Rossum24c13741995-02-14 09:42:43 +00002863 break;
2864 }
2865 opcode = (*next_instr++);
2866 } while (opcode == IMPORT_FROM);
2867
2868 return list;
2869}
Guido van Rossum950361c1997-01-24 13:49:28 +00002870
2871
2872#ifdef DYNAMIC_EXECUTION_PROFILE
2873
2874PyObject *
2875getarray(a)
2876 long a[256];
2877{
2878 int i;
2879 PyObject *l = PyList_New(256);
2880 if (l == NULL) return NULL;
2881 for (i = 0; i < 256; i++) {
2882 PyObject *x = PyInt_FromLong(a[i]);
2883 if (x == NULL) {
2884 Py_DECREF(l);
2885 return NULL;
2886 }
2887 PyList_SetItem(l, i, x);
2888 }
2889 for (i = 0; i < 256; i++)
2890 a[i] = 0;
2891 return l;
2892}
2893
2894PyObject *
2895_Py_GetDXProfile(self, args)
2896 PyObject *self, *args;
2897{
2898#ifndef DXPAIRS
2899 return getarray(dxp);
2900#else
2901 int i;
2902 PyObject *l = PyList_New(257);
2903 if (l == NULL) return NULL;
2904 for (i = 0; i < 257; i++) {
2905 PyObject *x = getarray(dxpairs[i]);
2906 if (x == NULL) {
2907 Py_DECREF(l);
2908 return NULL;
2909 }
2910 PyList_SetItem(l, i, x);
2911 }
2912 return l;
2913#endif
2914}
2915
2916#endif