1c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Execute compiled code */
3c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
4c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* XXX TO DO:
5c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   XXX speed up searching for keywords by using a dictionary
6c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   XXX document it!
7c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   */
8c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
9c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* enable more aggressive intra-module optimizations, where available */
10c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define PY_LOCAL_AGGRESSIVE
11c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
12c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#include "Python.h"
13c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
14c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#include "code.h"
15c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#include "frameobject.h"
16c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#include "eval.h"
17c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#include "opcode.h"
18c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#include "structmember.h"
19c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
20c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#include <ctype.h>
21c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
22c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifndef WITH_TSC
23c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
24c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define READ_TIMESTAMP(var)
25c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
26c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#else
27c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
28c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanieltypedef unsigned long long uint64;
29c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
30c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* PowerPC support.
31c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   "__ppc__" appears to be the preprocessor definition to detect on OS X, whereas
32c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   "__powerpc__" appears to be the correct one for Linux with GCC
33c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel*/
34c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#if defined(__ppc__) || defined (__powerpc__)
35c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
36c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define READ_TIMESTAMP(var) ppc_getcounter(&var)
37c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
38c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic void
39c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielppc_getcounter(uint64 *v)
40c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
41c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    register unsigned long tbu, tb, tbu2;
42c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
43c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel  loop:
44c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    asm volatile ("mftbu %0" : "=r" (tbu) );
45c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    asm volatile ("mftb  %0" : "=r" (tb)  );
46c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    asm volatile ("mftbu %0" : "=r" (tbu2));
47c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (__builtin_expect(tbu != tbu2, 0)) goto loop;
48c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
49c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* The slightly peculiar way of writing the next lines is
50c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       compiled better by GCC than any other way I tried. */
51c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    ((long*)(v))[0] = tbu;
52c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    ((long*)(v))[1] = tb;
53c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
54c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
55c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#elif defined(__i386__)
56c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
57c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* this is for linux/x86 (and probably any other GCC/x86 combo) */
58c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
59c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define READ_TIMESTAMP(val) \
60c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel     __asm__ __volatile__("rdtsc" : "=A" (val))
61c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
62c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#elif defined(__x86_64__)
63c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
64c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* for gcc/x86_64, the "A" constraint in DI mode means *either* rax *or* rdx;
65c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   not edx:eax as it does for i386.  Since rdtsc puts its result in edx:eax
66c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   even in 64-bit mode, we need to use "a" and "d" for the lower and upper
67c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   32-bit pieces of the result. */
68c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
69c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define READ_TIMESTAMP(val) do {                        \
70c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    unsigned int h, l;                                  \
71c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    __asm__ __volatile__("rdtsc" : "=a" (l), "=d" (h)); \
72c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    (val) = ((uint64)l) | (((uint64)h) << 32);          \
73c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    } while(0)
74c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
75c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
76c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#else
77c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
78c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#error "Don't know how to implement timestamp counter for this architecture"
79c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
80c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
81c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
82c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielvoid dump_tsc(int opcode, int ticked, uint64 inst0, uint64 inst1,
83c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel              uint64 loop0, uint64 loop1, uint64 intr0, uint64 intr1)
84c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
85c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    uint64 intr, inst, loop;
86c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyThreadState *tstate = PyThreadState_Get();
87c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!tstate->interp->tscdump)
88c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return;
89c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    intr = intr1 - intr0;
90c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    inst = inst1 - inst0 - intr;
91c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    loop = loop1 - loop0 - intr;
92c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    fprintf(stderr, "opcode=%03d t=%d inst=%06lld loop=%06lld\n",
93c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            opcode, ticked, inst, loop);
94c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
95c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
96c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
97c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
98c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Turn this on if your compiler chokes on the big switch: */
99c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* #define CASE_TOO_BIG 1 */
100c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
101c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef Py_DEBUG
102c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* For debugging the interpreter: */
103c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define LLTRACE  1      /* Low-level trace feature */
104c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define CHECKEXC 1      /* Double-check exception checking */
105c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
106c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
107c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanieltypedef PyObject *(*callproc)(PyObject *, PyObject *, PyObject *);
108c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
109c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Forward declarations */
110c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef WITH_TSC
111c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * call_function(PyObject ***, int, uint64*, uint64*);
112c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#else
113c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * call_function(PyObject ***, int);
114c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
115c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * fast_function(PyObject *, PyObject ***, int, int, int);
116c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * do_call(PyObject *, PyObject ***, int, int);
117c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * ext_do_call(PyObject *, PyObject ***, int, int, int);
118c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * update_keyword_args(PyObject *, int, PyObject ***,
119c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                      PyObject *);
120c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * update_star_args(int, int, PyObject *, PyObject ***);
121c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * load_args(PyObject ***, int);
122c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define CALL_FLAG_VAR 1
123c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define CALL_FLAG_KW 2
124c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
125c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef LLTRACE
126c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic int lltrace;
127c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic int prtrace(PyObject *, char *);
128c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
129c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic int call_trace(Py_tracefunc, PyObject *, PyFrameObject *,
130c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                      int, PyObject *);
131c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic int call_trace_protected(Py_tracefunc, PyObject *,
132c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                PyFrameObject *, int, PyObject *);
133c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic void call_exc_trace(Py_tracefunc, PyObject *, PyFrameObject *);
134c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic int maybe_call_line_trace(Py_tracefunc, PyObject *,
135c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                 PyFrameObject *, int *, int *, int *);
136c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
137c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * apply_slice(PyObject *, PyObject *, PyObject *);
138c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic int assign_slice(PyObject *, PyObject *,
139c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        PyObject *, PyObject *);
140c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * cmp_outcome(int, PyObject *, PyObject *);
141c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * import_from(PyObject *, PyObject *);
142c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic int import_all_from(PyObject *, PyObject *);
143c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * build_class(PyObject *, PyObject *, PyObject *);
144c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic int exec_statement(PyFrameObject *,
145c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                          PyObject *, PyObject *, PyObject *);
146c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic void set_exc_info(PyThreadState *, PyObject *, PyObject *, PyObject *);
147c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic void reset_exc_info(PyThreadState *);
148c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic void format_exc_check_arg(PyObject *, char *, PyObject *);
149c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * string_concatenate(PyObject *, PyObject *,
150c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                     PyFrameObject *, unsigned char *);
151c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * kwd_as_string(PyObject *);
152c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject * special_lookup(PyObject *, char *, PyObject **);
153c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
154c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define NAME_ERROR_MSG \
155c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    "name '%.200s' is not defined"
156c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define GLOBAL_NAME_ERROR_MSG \
157c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    "global name '%.200s' is not defined"
158c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define UNBOUNDLOCAL_ERROR_MSG \
159c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    "local variable '%.200s' referenced before assignment"
160c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define UNBOUNDFREE_ERROR_MSG \
161c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    "free variable '%.200s' referenced before assignment" \
162c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    " in enclosing scope"
163c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
164c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Dynamic execution profile */
165c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef DYNAMIC_EXECUTION_PROFILE
166c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef DXPAIRS
167c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic long dxpairs[257][256];
168c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define dxp dxpairs[256]
169c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#else
170c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic long dxp[256];
171c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
172c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
173c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
174c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Function call profile */
175c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef CALL_PROFILE
176c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define PCALL_NUM 11
177c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic int pcall[PCALL_NUM];
178c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
179c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define PCALL_ALL 0
180c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define PCALL_FUNCTION 1
181c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define PCALL_FAST_FUNCTION 2
182c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define PCALL_FASTER_FUNCTION 3
183c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define PCALL_METHOD 4
184c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define PCALL_BOUND_METHOD 5
185c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define PCALL_CFUNCTION 6
186c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define PCALL_TYPE 7
187c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define PCALL_GENERATOR 8
188c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define PCALL_OTHER 9
189c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define PCALL_POP 10
190c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
191c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Notes about the statistics
192c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
193c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   PCALL_FAST stats
194c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
195c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   FAST_FUNCTION means no argument tuple needs to be created.
196c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   FASTER_FUNCTION means that the fast-path frame setup code is used.
197c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
198c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   If there is a method call where the call can be optimized by changing
199c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   the argument tuple and calling the function directly, it gets recorded
200c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   twice.
201c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
202c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   As a result, the relationship among the statistics appears to be
203c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   PCALL_ALL == PCALL_FUNCTION + PCALL_METHOD - PCALL_BOUND_METHOD +
204c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PCALL_CFUNCTION + PCALL_TYPE + PCALL_GENERATOR + PCALL_OTHER
205c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   PCALL_FUNCTION > PCALL_FAST_FUNCTION > PCALL_FASTER_FUNCTION
206c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   PCALL_METHOD > PCALL_BOUND_METHOD
207c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel*/
208c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
209c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define PCALL(POS) pcall[POS]++
210c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
211c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyObject *
212c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyEval_GetCallStats(PyObject *self)
213c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
214c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return Py_BuildValue("iiiiiiiiiii",
215c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                         pcall[0], pcall[1], pcall[2], pcall[3],
216c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                         pcall[4], pcall[5], pcall[6], pcall[7],
217c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                         pcall[8], pcall[9], pcall[10]);
218c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
219c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#else
220c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define PCALL(O)
221c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
222c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyObject *
223c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyEval_GetCallStats(PyObject *self)
224c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
225c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_INCREF(Py_None);
226c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return Py_None;
227c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
228c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
229c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
230c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
231c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef WITH_THREAD
232c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
233c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef HAVE_ERRNO_H
234c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#include <errno.h>
235c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
236c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#include "pythread.h"
237c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
238c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyThread_type_lock interpreter_lock = 0; /* This is the GIL */
239c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyThread_type_lock pending_lock = 0; /* for pending calls */
240c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic long main_thread = 0;
241c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
242c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielint
243c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyEval_ThreadsInitialized(void)
244c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
245c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return interpreter_lock != 0;
246c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
247c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
248c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielvoid
249c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyEval_InitThreads(void)
250c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
251c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (interpreter_lock)
252c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return;
253c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    interpreter_lock = PyThread_allocate_lock();
254c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyThread_acquire_lock(interpreter_lock, 1);
255c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    main_thread = PyThread_get_thread_ident();
256c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
257c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
258c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielvoid
259c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyEval_AcquireLock(void)
260c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
261c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyThread_acquire_lock(interpreter_lock, 1);
262c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
263c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
264c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielvoid
265c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyEval_ReleaseLock(void)
266c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
267c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyThread_release_lock(interpreter_lock);
268c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
269c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
270c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielvoid
271c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyEval_AcquireThread(PyThreadState *tstate)
272c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
273c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (tstate == NULL)
274c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_FatalError("PyEval_AcquireThread: NULL new thread state");
275c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* Check someone has called PyEval_InitThreads() to create the lock */
276c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    assert(interpreter_lock);
277c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyThread_acquire_lock(interpreter_lock, 1);
278c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (PyThreadState_Swap(tstate) != NULL)
279c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_FatalError(
280c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            "PyEval_AcquireThread: non-NULL old thread state");
281c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
282c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
283c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielvoid
284c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyEval_ReleaseThread(PyThreadState *tstate)
285c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
286c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (tstate == NULL)
287c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_FatalError("PyEval_ReleaseThread: NULL thread state");
288c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (PyThreadState_Swap(NULL) != tstate)
289c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_FatalError("PyEval_ReleaseThread: wrong thread state");
290c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyThread_release_lock(interpreter_lock);
291c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
292c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
293c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* This function is called from PyOS_AfterFork to ensure that newly
294c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   created child processes don't hold locks referring to threads which
295c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   are not running in the child process.  (This could also be done using
296c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   pthread_atfork mechanism, at least for the pthreads implementation.) */
297c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
298c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielvoid
299c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyEval_ReInitThreads(void)
300c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
301c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *threading, *result;
302c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyThreadState *tstate;
303c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
304c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!interpreter_lock)
305c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return;
306c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /*XXX Can't use PyThread_free_lock here because it does too
307c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel      much error-checking.  Doing this cleanly would require
308c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel      adding a new function to each thread_*.h.  Instead, just
309c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel      create a new lock and waste a little bit of memory */
310c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    interpreter_lock = PyThread_allocate_lock();
311c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    pending_lock = PyThread_allocate_lock();
312c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyThread_acquire_lock(interpreter_lock, 1);
313c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    main_thread = PyThread_get_thread_ident();
314c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
315c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* Update the threading module with the new state.
316c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel     */
317c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    tstate = PyThreadState_GET();
318c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    threading = PyMapping_GetItemString(tstate->interp->modules,
319c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                        "threading");
320c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (threading == NULL) {
321c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* threading not imported */
322c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyErr_Clear();
323c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return;
324c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
325c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    result = PyObject_CallMethod(threading, "_after_fork", NULL);
326c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (result == NULL)
327c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyErr_WriteUnraisable(threading);
328c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else
329c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_DECREF(result);
330c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_DECREF(threading);
331c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
332c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
333c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
334c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Functions save_thread and restore_thread are always defined so
335c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   dynamically loaded modules needn't be compiled separately for use
336c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   with and without threads: */
337c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
338c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyThreadState *
339c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyEval_SaveThread(void)
340c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
341c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyThreadState *tstate = PyThreadState_Swap(NULL);
342c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (tstate == NULL)
343c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_FatalError("PyEval_SaveThread: NULL tstate");
344c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef WITH_THREAD
345c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (interpreter_lock)
346c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyThread_release_lock(interpreter_lock);
347c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
348c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return tstate;
349c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
350c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
351c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielvoid
352c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyEval_RestoreThread(PyThreadState *tstate)
353c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
354c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (tstate == NULL)
355c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_FatalError("PyEval_RestoreThread: NULL tstate");
356c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef WITH_THREAD
357c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (interpreter_lock) {
358c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        int err = errno;
359c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyThread_acquire_lock(interpreter_lock, 1);
360c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        errno = err;
361c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
362c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
363c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyThreadState_Swap(tstate);
364c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
365c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
366c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
367c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
368c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   signal handlers or Mac I/O completion routines) can schedule calls
369c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   to a function to be called synchronously.
370c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   The synchronous function is called with one void* argument.
371c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   It should return 0 for success or -1 for failure -- failure should
372c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   be accompanied by an exception.
373c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
374c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   If registry succeeds, the registry function returns 0; if it fails
375c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   (e.g. due to too many pending calls) it returns -1 (without setting
376c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   an exception condition).
377c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
378c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   Note that because registry may occur from within signal handlers,
379c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   or other asynchronous events, calling malloc() is unsafe!
380c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
381c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef WITH_THREAD
382c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   Any thread can schedule pending calls, but only the main thread
383c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   will execute them.
384c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   There is no facility to schedule calls to a particular thread, but
385c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   that should be easy to change, should that ever be required.  In
386c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   that case, the static variables here should go into the python
387c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   threadstate.
388c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
389c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel*/
390c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
391c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef WITH_THREAD
392c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
393c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* The WITH_THREAD implementation is thread-safe.  It allows
394c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   scheduling to be made from any thread, and even from an executing
395c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   callback.
396c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel */
397c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
398c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define NPENDINGCALLS 32
399c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic struct {
400c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int (*func)(void *);
401c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    void *arg;
402c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} pendingcalls[NPENDINGCALLS];
403c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic int pendingfirst = 0;
404c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic int pendinglast = 0;
405c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic volatile int pendingcalls_to_do = 1; /* trigger initialization of lock */
406c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic char pendingbusy = 0;
407c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
408c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielint
409c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPy_AddPendingCall(int (*func)(void *), void *arg)
410c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
411c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int i, j, result=0;
412c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyThread_type_lock lock = pending_lock;
413c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
414c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* try a few times for the lock.  Since this mechanism is used
415c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel     * for signal handling (on the main thread), there is a (slim)
416c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel     * chance that a signal is delivered on the same thread while we
417c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel     * hold the lock during the Py_MakePendingCalls() function.
418c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel     * This avoids a deadlock in that case.
419c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel     * Note that signals can be delivered on any thread.  In particular,
420c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel     * on Windows, a SIGINT is delivered on a system-created worker
421c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel     * thread.
422c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel     * We also check for lock being NULL, in the unlikely case that
423c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel     * this function is called before any bytecode evaluation takes place.
424c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel     */
425c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (lock != NULL) {
426c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        for (i = 0; i<100; i++) {
427c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (PyThread_acquire_lock(lock, NOWAIT_LOCK))
428c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                break;
429c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
430c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (i == 100)
431c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return -1;
432c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
433c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
434c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    i = pendinglast;
435c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    j = (i + 1) % NPENDINGCALLS;
436c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (j == pendingfirst) {
437c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        result = -1; /* Queue full */
438c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    } else {
439c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        pendingcalls[i].func = func;
440c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        pendingcalls[i].arg = arg;
441c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        pendinglast = j;
442c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
443c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* signal main loop */
444c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    _Py_Ticker = 0;
445c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    pendingcalls_to_do = 1;
446c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (lock != NULL)
447c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyThread_release_lock(lock);
448c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return result;
449c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
450c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
451c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielint
452c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPy_MakePendingCalls(void)
453c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
454c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int i;
455c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int r = 0;
456c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
457c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!pending_lock) {
458c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* initial allocation of the lock */
459c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        pending_lock = PyThread_allocate_lock();
460c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (pending_lock == NULL)
461c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return -1;
462c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
463c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
464c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* only service pending calls on main thread */
465c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (main_thread && PyThread_get_thread_ident() != main_thread)
466c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return 0;
467c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* don't perform recursive pending calls */
468c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (pendingbusy)
469c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return 0;
470c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    pendingbusy = 1;
471c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* perform a bounded number of calls, in case of recursion */
472c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    for (i=0; i<NPENDINGCALLS; i++) {
473c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        int j;
474c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        int (*func)(void *);
475c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        void *arg = NULL;
476c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
477c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* pop one item off the queue while holding the lock */
478c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyThread_acquire_lock(pending_lock, WAIT_LOCK);
479c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        j = pendingfirst;
480c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (j == pendinglast) {
481c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            func = NULL; /* Queue empty */
482c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        } else {
483c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            func = pendingcalls[j].func;
484c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            arg = pendingcalls[j].arg;
485c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            pendingfirst = (j + 1) % NPENDINGCALLS;
486c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
487c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        pendingcalls_to_do = pendingfirst != pendinglast;
488c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyThread_release_lock(pending_lock);
489c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* having released the lock, perform the callback */
490c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (func == NULL)
491c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
492c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        r = func(arg);
493c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (r)
494c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
495c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
496c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    pendingbusy = 0;
497c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return r;
498c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
499c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
500c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#else /* if ! defined WITH_THREAD */
501c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
502c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/*
503c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   WARNING!  ASYNCHRONOUSLY EXECUTING CODE!
504c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   This code is used for signal handling in python that isn't built
505c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   with WITH_THREAD.
506c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   Don't use this implementation when Py_AddPendingCalls() can happen
507c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   on a different thread!
508c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
509c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   There are two possible race conditions:
510c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   (1) nested asynchronous calls to Py_AddPendingCall()
511c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   (2) AddPendingCall() calls made while pending calls are being processed.
512c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
513c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   (1) is very unlikely because typically signal delivery
514c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   is blocked during signal handling.  So it should be impossible.
515c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   (2) is a real possibility.
516c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   The current code is safe against (2), but not against (1).
517c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   The safety against (2) is derived from the fact that only one
518c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   thread is present, interrupted by signals, and that the critical
519c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   section is protected with the "busy" variable.  On Windows, which
520c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   delivers SIGINT on a system thread, this does not hold and therefore
521c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   Windows really shouldn't use this version.
522c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   The two threads could theoretically wiggle around the "busy" variable.
523c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel*/
524c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
525c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define NPENDINGCALLS 32
526c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic struct {
527c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int (*func)(void *);
528c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    void *arg;
529c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} pendingcalls[NPENDINGCALLS];
530c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic volatile int pendingfirst = 0;
531c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic volatile int pendinglast = 0;
532c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic volatile int pendingcalls_to_do = 0;
533c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
534c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielint
535c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPy_AddPendingCall(int (*func)(void *), void *arg)
536c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
537c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    static volatile int busy = 0;
538c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int i, j;
539c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* XXX Begin critical section */
540c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (busy)
541c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return -1;
542c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    busy = 1;
543c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    i = pendinglast;
544c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    j = (i + 1) % NPENDINGCALLS;
545c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (j == pendingfirst) {
546c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        busy = 0;
547c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return -1; /* Queue full */
548c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
549c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    pendingcalls[i].func = func;
550c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    pendingcalls[i].arg = arg;
551c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    pendinglast = j;
552c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
553c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    _Py_Ticker = 0;
554c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    pendingcalls_to_do = 1; /* Signal main loop */
555c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    busy = 0;
556c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* XXX End critical section */
557c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return 0;
558c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
559c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
560c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielint
561c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPy_MakePendingCalls(void)
562c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
563c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    static int busy = 0;
564c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (busy)
565c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return 0;
566c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    busy = 1;
567c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    pendingcalls_to_do = 0;
568c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    for (;;) {
569c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        int i;
570c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        int (*func)(void *);
571c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        void *arg;
572c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        i = pendingfirst;
573c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (i == pendinglast)
574c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break; /* Queue empty */
575c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        func = pendingcalls[i].func;
576c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        arg = pendingcalls[i].arg;
577c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        pendingfirst = (i + 1) % NPENDINGCALLS;
578c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (func(arg) < 0) {
579c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            busy = 0;
580c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            pendingcalls_to_do = 1; /* We're not done yet */
581c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return -1;
582c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
583c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
584c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    busy = 0;
585c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return 0;
586c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
587c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
588c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif /* WITH_THREAD */
589c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
590c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
591c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* The interpreter's recursion limit */
592c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
593c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifndef Py_DEFAULT_RECURSION_LIMIT
594c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define Py_DEFAULT_RECURSION_LIMIT 1000
595c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
596c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic int recursion_limit = Py_DEFAULT_RECURSION_LIMIT;
597c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielint _Py_CheckRecursionLimit = Py_DEFAULT_RECURSION_LIMIT;
598c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
599c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielint
600c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPy_GetRecursionLimit(void)
601c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
602c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return recursion_limit;
603c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
604c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
605c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielvoid
606c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPy_SetRecursionLimit(int new_limit)
607c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
608c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    recursion_limit = new_limit;
609c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    _Py_CheckRecursionLimit = recursion_limit;
610c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
611c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
612c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* the macro Py_EnterRecursiveCall() only calls _Py_CheckRecursiveCall()
613c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   if the recursion_depth reaches _Py_CheckRecursionLimit.
614c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   If USE_STACKCHECK, the macro decrements _Py_CheckRecursionLimit
615c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   to guarantee that _Py_CheckRecursiveCall() is regularly called.
616c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   Without USE_STACKCHECK, there is no need for this. */
617c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielint
618c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel_Py_CheckRecursiveCall(char *where)
619c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
620c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyThreadState *tstate = PyThreadState_GET();
621c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
622c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef USE_STACKCHECK
623c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (PyOS_CheckStack()) {
624c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        --tstate->recursion_depth;
625c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyErr_SetString(PyExc_MemoryError, "Stack overflow");
626c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return -1;
627c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
628c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
629c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (tstate->recursion_depth > recursion_limit) {
630c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        --tstate->recursion_depth;
631c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyErr_Format(PyExc_RuntimeError,
632c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                     "maximum recursion depth exceeded%s",
633c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                     where);
634c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return -1;
635c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
636c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    _Py_CheckRecursionLimit = recursion_limit;
637c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return 0;
638c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
639c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
640c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Status code for main loop (reason for stack unwind) */
641c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielenum why_code {
642c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        WHY_NOT =       0x0001, /* No error */
643c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        WHY_EXCEPTION = 0x0002, /* Exception occurred */
644c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        WHY_RERAISE =   0x0004, /* Exception re-raised by 'finally' */
645c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        WHY_RETURN =    0x0008, /* 'return' statement */
646c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        WHY_BREAK =     0x0010, /* 'break' statement */
647c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        WHY_CONTINUE =  0x0020, /* 'continue' statement */
648c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        WHY_YIELD =     0x0040  /* 'yield' operator */
649c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel};
650c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
651c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic enum why_code do_raise(PyObject *, PyObject *, PyObject *);
652c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic int unpack_iterable(PyObject *, int, PyObject **);
653c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
654c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Records whether tracing is on for any thread.  Counts the number of
655c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   threads for which tstate->c_tracefunc is non-NULL, so if the value
656c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   is 0, we know we don't have to check this thread's c_tracefunc.
657c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   This speeds up the if statement in PyEval_EvalFrameEx() after
658c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   fast_next_opcode*/
659c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic int _Py_TracingPossible = 0;
660c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
661c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* for manipulating the thread switch and periodic "stuff" - used to be
662c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   per thread, now just a pair o' globals */
663c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielint _Py_CheckInterval = 100;
664c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielvolatile int _Py_Ticker = 0; /* so that we hit a "tick" first thing */
665c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
666c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyObject *
667c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyEval_EvalCode(PyCodeObject *co, PyObject *globals, PyObject *locals)
668c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
669c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return PyEval_EvalCodeEx(co,
670c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                      globals, locals,
671c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                      (PyObject **)NULL, 0,
672c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                      (PyObject **)NULL, 0,
673c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                      (PyObject **)NULL, 0,
674c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                      NULL);
675c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
676c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
677c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
678c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Interpreter main loop */
679c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
680c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyObject *
681c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyEval_EvalFrame(PyFrameObject *f) {
682c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* This is for backward compatibility with extension modules that
683c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       used this API; core interpreter code should call
684c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       PyEval_EvalFrameEx() */
685c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return PyEval_EvalFrameEx(f, 0);
686c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
687c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
688c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyObject *
689c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
690c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
691c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef DXPAIRS
692c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int lastopcode = 0;
693c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
694c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    register PyObject **stack_pointer;  /* Next free slot in value stack */
695c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    register unsigned char *next_instr;
696c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    register int opcode;        /* Current opcode */
697c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    register int oparg;         /* Current opcode argument, if any */
698c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    register enum why_code why; /* Reason for block stack unwind */
699c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    register int err;           /* Error status -- nonzero if error */
700c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    register PyObject *x;       /* Result object -- NULL if error */
701c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    register PyObject *v;       /* Temporary objects popped off stack */
702c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    register PyObject *w;
703c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    register PyObject *u;
704c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    register PyObject *t;
705c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    register PyObject *stream = NULL;    /* for PRINT opcodes */
706c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    register PyObject **fastlocals, **freevars;
707c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *retval = NULL;            /* Return value */
708c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyThreadState *tstate = PyThreadState_GET();
709c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyCodeObject *co;
710c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
711c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* when tracing we set things up so that
712c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
713c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel           not (instr_lb <= current_bytecode_offset < instr_ub)
714c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
715c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       is true when the line being executed has changed.  The
716c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       initial values are such as to make this false the first
717c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       time it is tested. */
718c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int instr_ub = -1, instr_lb = 0, instr_prev = -1;
719c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
720c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    unsigned char *first_instr;
721c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *names;
722c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *consts;
723c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#if defined(Py_DEBUG) || defined(LLTRACE)
724c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* Make it easier to find out where we are with a debugger */
725c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    char *filename;
726c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
727c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
728c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Tuple access macros */
729c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
730c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifndef Py_DEBUG
731c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define GETITEM(v, i) PyTuple_GET_ITEM((PyTupleObject *)(v), (i))
732c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#else
733c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define GETITEM(v, i) PyTuple_GetItem((v), (i))
734c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
735c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
736c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef WITH_TSC
737c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Use Pentium timestamp counter to mark certain events:
738c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   inst0 -- beginning of switch statement for opcode dispatch
739c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   inst1 -- end of switch statement (may be skipped)
740c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   loop0 -- the top of the mainloop
741c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   loop1 -- place where control returns again to top of mainloop
742c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            (may be skipped)
743c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   intr1 -- beginning of long interruption
744c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   intr2 -- end of long interruption
745c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
746c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   Many opcodes call out to helper C functions.  In some cases, the
747c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   time in those functions should be counted towards the time for the
748c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   opcode, but not in all cases.  For example, a CALL_FUNCTION opcode
749c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   calls another Python function; there's no point in charge all the
750c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   bytecode executed by the called function to the caller.
751c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
752c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   It's hard to make a useful judgement statically.  In the presence
753c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   of operator overloading, it's impossible to tell if a call will
754c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   execute new Python code or not.
755c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
756c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   It's a case-by-case judgement.  I'll use intr1 for the following
757c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   cases:
758c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
759c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   EXEC_STMT
760c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   IMPORT_STAR
761c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   IMPORT_FROM
762c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   CALL_FUNCTION (and friends)
763c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
764c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel */
765c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    uint64 inst0, inst1, loop0, loop1, intr0 = 0, intr1 = 0;
766c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int ticked = 0;
767c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
768c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    READ_TIMESTAMP(inst0);
769c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    READ_TIMESTAMP(inst1);
770c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    READ_TIMESTAMP(loop0);
771c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    READ_TIMESTAMP(loop1);
772c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
773c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* shut up the compiler */
774c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    opcode = 0;
775c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
776c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
777c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Code access macros */
778c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
779c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define INSTR_OFFSET()  ((int)(next_instr - first_instr))
780c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define NEXTOP()        (*next_instr++)
781c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define NEXTARG()       (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
782c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define PEEKARG()       ((next_instr[2]<<8) + next_instr[1])
783c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define JUMPTO(x)       (next_instr = first_instr + (x))
784c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define JUMPBY(x)       (next_instr += (x))
785c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
786c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* OpCode prediction macros
787c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Some opcodes tend to come in pairs thus making it possible to
788c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    predict the second code when the first is run.  For example,
789c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    GET_ITER is often followed by FOR_ITER. And FOR_ITER is often
790c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    followed by STORE_FAST or UNPACK_SEQUENCE.
791c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
792c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Verifying the prediction costs a single high-speed test of a register
793c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    variable against a constant.  If the pairing was good, then the
794c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    processor's own internal branch predication has a high likelihood of
795c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    success, resulting in a nearly zero-overhead transition to the
796c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    next opcode.  A successful prediction saves a trip through the eval-loop
797c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    including its two unpredictable branches, the HAS_ARG test and the
798c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    switch-case.  Combined with the processor's internal branch prediction,
799c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    a successful PREDICT has the effect of making the two opcodes run as if
800c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    they were a single new opcode with the bodies combined.
801c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
802c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    If collecting opcode statistics, your choices are to either keep the
803c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    predictions turned-on and interpret the results as if some opcodes
804c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    had been combined or turn-off predictions so that the opcode frequency
805c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    counter updates for both opcodes.
806c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel*/
807c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
808c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef DYNAMIC_EXECUTION_PROFILE
809c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define PREDICT(op)             if (0) goto PRED_##op
810c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#else
811c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define PREDICT(op)             if (*next_instr == op) goto PRED_##op
812c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
813c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
814c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define PREDICTED(op)           PRED_##op: next_instr++
815c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define PREDICTED_WITH_ARG(op)  PRED_##op: oparg = PEEKARG(); next_instr += 3
816c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
817c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Stack manipulation macros */
818c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
819c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* The stack can grow at most MAXINT deep, as co_nlocals and
820c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   co_stacksize are ints. */
821c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define STACK_LEVEL()     ((int)(stack_pointer - f->f_valuestack))
822c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define EMPTY()           (STACK_LEVEL() == 0)
823c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define TOP()             (stack_pointer[-1])
824c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define SECOND()          (stack_pointer[-2])
825c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define THIRD()           (stack_pointer[-3])
826c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define FOURTH()          (stack_pointer[-4])
827c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define PEEK(n)           (stack_pointer[-(n)])
828c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define SET_TOP(v)        (stack_pointer[-1] = (v))
829c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define SET_SECOND(v)     (stack_pointer[-2] = (v))
830c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define SET_THIRD(v)      (stack_pointer[-3] = (v))
831c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define SET_FOURTH(v)     (stack_pointer[-4] = (v))
832c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define SET_VALUE(n, v)   (stack_pointer[-(n)] = (v))
833c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define BASIC_STACKADJ(n) (stack_pointer += n)
834c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define BASIC_PUSH(v)     (*stack_pointer++ = (v))
835c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define BASIC_POP()       (*--stack_pointer)
836c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
837c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef LLTRACE
838c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define PUSH(v)         { (void)(BASIC_PUSH(v), \
839c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                          lltrace && prtrace(TOP(), "push")); \
840c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                          assert(STACK_LEVEL() <= co->co_stacksize); }
841c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define POP()           ((void)(lltrace && prtrace(TOP(), "pop")), \
842c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                         BASIC_POP())
843c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define STACKADJ(n)     { (void)(BASIC_STACKADJ(n), \
844c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                          lltrace && prtrace(TOP(), "stackadj")); \
845c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                          assert(STACK_LEVEL() <= co->co_stacksize); }
846c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define EXT_POP(STACK_POINTER) ((void)(lltrace && \
847c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                prtrace((STACK_POINTER)[-1], "ext_pop")), \
848c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                *--(STACK_POINTER))
849c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#else
850c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define PUSH(v)                BASIC_PUSH(v)
851c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define POP()                  BASIC_POP()
852c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define STACKADJ(n)            BASIC_STACKADJ(n)
853c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
854c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
855c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
856c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Local variable macros */
857c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
858c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define GETLOCAL(i)     (fastlocals[i])
859c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
860c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* The SETLOCAL() macro must not DECREF the local variable in-place and
861c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   then store the new value; it must copy the old value to a temporary
862c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   value, then store the new value, and then DECREF the temporary value.
863c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   This is because it is possible that during the DECREF the frame is
864c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   accessed by other code (e.g. a __del__ method or gc.collect()) and the
865c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   variable would be pointing to already-freed memory. */
866c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define SETLOCAL(i, value)      do { PyObject *tmp = GETLOCAL(i); \
867c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                     GETLOCAL(i) = value; \
868c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                     Py_XDECREF(tmp); } while (0)
869c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
870c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Start of code */
871c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
872c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (f == NULL)
873c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
874c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
875c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* push frame */
876c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (Py_EnterRecursiveCall(""))
877c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
878c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
879c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    tstate->frame = f;
880c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
881c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (tstate->use_tracing) {
882c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (tstate->c_tracefunc != NULL) {
883c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            /* tstate->c_tracefunc, if defined, is a
884c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel               function that will be called on *every* entry
885c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel               to a code block.  Its return value, if not
886c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel               None, is a function that will be called at
887c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel               the start of each executed line of code.
888c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel               (Actually, the function must return itself
889c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel               in order to continue tracing.)  The trace
890c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel               functions are called with three arguments:
891c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel               a pointer to the current frame, a string
892c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel               indicating why the function is called, and
893c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel               an argument which depends on the situation.
894c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel               The global trace function is also called
895c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel               whenever an exception is detected. */
896c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (call_trace_protected(tstate->c_tracefunc,
897c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                     tstate->c_traceobj,
898c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                     f, PyTrace_CALL, Py_None)) {
899c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                /* Trace function raised an error */
900c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                goto exit_eval_frame;
901c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
902c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
903c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (tstate->c_profilefunc != NULL) {
904c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            /* Similar for c_profilefunc, except it needn't
905c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel               return itself and isn't called for "line" events */
906c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (call_trace_protected(tstate->c_profilefunc,
907c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                     tstate->c_profileobj,
908c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                     f, PyTrace_CALL, Py_None)) {
909c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                /* Profile function raised an error */
910c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                goto exit_eval_frame;
911c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
912c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
913c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
914c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
915c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    co = f->f_code;
916c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    names = co->co_names;
917c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    consts = co->co_consts;
918c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    fastlocals = f->f_localsplus;
919c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    freevars = f->f_localsplus + co->co_nlocals;
920c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    first_instr = (unsigned char*) PyString_AS_STRING(co->co_code);
921c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* An explanation is in order for the next line.
922c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
923c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       f->f_lasti now refers to the index of the last instruction
924c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       executed.  You might think this was obvious from the name, but
925c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       this wasn't always true before 2.3!  PyFrame_New now sets
926c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       f->f_lasti to -1 (i.e. the index *before* the first instruction)
927c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       and YIELD_VALUE doesn't fiddle with f_lasti any more.  So this
928c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       does work.  Promise.
929c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
930c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       When the PREDICT() macros are enabled, some opcode pairs follow in
931c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       direct succession without updating f->f_lasti.  A successful
932c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       prediction effectively links the two codes together as if they
933c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       were a single new opcode; accordingly,f->f_lasti will point to
934c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       the first code in the pair (for instance, GET_ITER followed by
935c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       FOR_ITER is effectively a single opcode and f->f_lasti will point
936c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       at to the beginning of the combined pair.)
937c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    */
938c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    next_instr = first_instr + f->f_lasti + 1;
939c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    stack_pointer = f->f_stacktop;
940c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    assert(stack_pointer != NULL);
941c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    f->f_stacktop = NULL;       /* remains NULL unless yield suspends frame */
942c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
943c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef LLTRACE
944c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    lltrace = PyDict_GetItemString(f->f_globals, "__lltrace__") != NULL;
945c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
946c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#if defined(Py_DEBUG) || defined(LLTRACE)
947c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    filename = PyString_AsString(co->co_filename);
948c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
949c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
950c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    why = WHY_NOT;
951c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    err = 0;
952c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    x = Py_None;        /* Not a reference, just anything non-NULL */
953c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    w = NULL;
954c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
955c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (throwflag) { /* support for generator.throw() */
956c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        why = WHY_EXCEPTION;
957c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        goto on_error;
958c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
959c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
960c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    for (;;) {
961c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef WITH_TSC
962c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (inst1 == 0) {
963c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            /* Almost surely, the opcode executed a break
964c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel               or a continue, preventing inst1 from being set
965c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel               on the way out of the loop.
966c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            */
967c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            READ_TIMESTAMP(inst1);
968c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            loop1 = inst1;
969c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
970c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        dump_tsc(opcode, ticked, inst0, inst1, loop0, loop1,
971c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                 intr0, intr1);
972c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        ticked = 0;
973c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        inst1 = 0;
974c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        intr0 = 0;
975c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        intr1 = 0;
976c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        READ_TIMESTAMP(loop0);
977c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
978c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        assert(stack_pointer >= f->f_valuestack); /* else underflow */
979c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        assert(STACK_LEVEL() <= co->co_stacksize);  /* else overflow */
980c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
981c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* Do periodic things.  Doing this every time through
982c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel           the loop would add too much overhead, so we do it
983c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel           only every Nth instruction.  We also do it if
984c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel           ``pendingcalls_to_do'' is set, i.e. when an asynchronous
985c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel           event needs attention (e.g. a signal handler or
986c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel           async I/O handler); see Py_AddPendingCall() and
987c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel           Py_MakePendingCalls() above. */
988c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
989c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (--_Py_Ticker < 0) {
990c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (*next_instr == SETUP_FINALLY) {
991c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                /* Make the last opcode before
992c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                   a try: finally: block uninterruptible. */
993c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                goto fast_next_opcode;
994c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
995c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            _Py_Ticker = _Py_CheckInterval;
996c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            tstate->tick_counter++;
997c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef WITH_TSC
998c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            ticked = 1;
999c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
1000c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (pendingcalls_to_do) {
1001c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (Py_MakePendingCalls() < 0) {
1002c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    why = WHY_EXCEPTION;
1003c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    goto on_error;
1004c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                }
1005c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (pendingcalls_to_do)
1006c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    /* MakePendingCalls() didn't succeed.
1007c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                       Force early re-execution of this
1008c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                       "periodic" code, possibly after
1009c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                       a thread switch */
1010c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    _Py_Ticker = 0;
1011c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
1012c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef WITH_THREAD
1013c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (interpreter_lock) {
1014c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                /* Give another thread a chance */
1015c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1016c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (PyThreadState_Swap(NULL) != tstate)
1017c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    Py_FatalError("ceval: tstate mix-up");
1018c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PyThread_release_lock(interpreter_lock);
1019c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1020c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                /* Other threads may run now */
1021c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1022c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PyThread_acquire_lock(interpreter_lock, 1);
1023c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1024c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (PyThreadState_Swap(tstate) != NULL)
1025c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    Py_FatalError("ceval: orphan tstate");
1026c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1027c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                /* Check for thread interrupts */
1028c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1029c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (tstate->async_exc != NULL) {
1030c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    x = tstate->async_exc;
1031c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    tstate->async_exc = NULL;
1032c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    PyErr_SetNone(x);
1033c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    Py_DECREF(x);
1034c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    why = WHY_EXCEPTION;
1035c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    goto on_error;
1036c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                }
1037c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
1038c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
1039c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
1040c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1041c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    fast_next_opcode:
1042c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        f->f_lasti = INSTR_OFFSET();
1043c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1044c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* line-by-line tracing support */
1045c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1046c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (_Py_TracingPossible &&
1047c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            tstate->c_tracefunc != NULL && !tstate->tracing) {
1048c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            /* see maybe_call_line_trace
1049c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel               for expository comments */
1050c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            f->f_stacktop = stack_pointer;
1051c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1052c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            err = maybe_call_line_trace(tstate->c_tracefunc,
1053c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                        tstate->c_traceobj,
1054c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                        f, &instr_lb, &instr_ub,
1055c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                        &instr_prev);
1056c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            /* Reload possibly changed frame fields */
1057c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            JUMPTO(f->f_lasti);
1058c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (f->f_stacktop != NULL) {
1059c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                stack_pointer = f->f_stacktop;
1060c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                f->f_stacktop = NULL;
1061c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
1062c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (err) {
1063c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                /* trace function raised an exception */
1064c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                goto on_error;
1065c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
1066c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
1067c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1068c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* Extract opcode and argument */
1069c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1070c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        opcode = NEXTOP();
1071c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        oparg = 0;   /* allows oparg to be stored in a register because
1072c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            it doesn't have to be remembered across a full loop */
1073c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (HAS_ARG(opcode))
1074c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            oparg = NEXTARG();
1075c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    dispatch_opcode:
1076c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef DYNAMIC_EXECUTION_PROFILE
1077c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef DXPAIRS
1078c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        dxpairs[lastopcode][opcode]++;
1079c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        lastopcode = opcode;
1080c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
1081c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        dxp[opcode]++;
1082c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
1083c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1084c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef LLTRACE
1085c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* Instruction tracing */
1086c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1087c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (lltrace) {
1088c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (HAS_ARG(opcode)) {
1089c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                printf("%d: %d, %d\n",
1090c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                       f->f_lasti, opcode, oparg);
1091c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
1092c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            else {
1093c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                printf("%d: %d\n",
1094c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                       f->f_lasti, opcode);
1095c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
1096c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
1097c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
1098c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1099c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* Main switch on opcode */
1100c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        READ_TIMESTAMP(inst0);
1101c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1102c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        switch (opcode) {
1103c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1104c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* BEWARE!
1105c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel           It is essential that any operation that fails sets either
1106c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel           x to NULL, err to nonzero, or why to anything but WHY_NOT,
1107c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel           and that no operation that succeeds does this! */
1108c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1109c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* case STOP_CODE: this is an error! */
1110c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1111c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case NOP:
1112c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            goto fast_next_opcode;
1113c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1114c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case LOAD_FAST:
1115c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            x = GETLOCAL(oparg);
1116c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (x != NULL) {
1117c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_INCREF(x);
1118c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PUSH(x);
1119c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                goto fast_next_opcode;
1120c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
1121c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            format_exc_check_arg(PyExc_UnboundLocalError,
1122c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                UNBOUNDLOCAL_ERROR_MSG,
1123c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PyTuple_GetItem(co->co_varnames, oparg));
1124c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
1125c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1126c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case LOAD_CONST:
1127c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            x = GETITEM(consts, oparg);
1128c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_INCREF(x);
1129c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PUSH(x);
1130c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            goto fast_next_opcode;
1131c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1132c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PREDICTED_WITH_ARG(STORE_FAST);
1133c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case STORE_FAST:
1134c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            v = POP();
1135c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            SETLOCAL(oparg, v);
1136c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            goto fast_next_opcode;
1137c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1138c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case POP_TOP:
1139c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            v = POP();
1140c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(v);
1141c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            goto fast_next_opcode;
1142c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1143c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case ROT_TWO:
1144c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            v = TOP();
1145c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            w = SECOND();
1146c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            SET_TOP(w);
1147c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            SET_SECOND(v);
1148c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            goto fast_next_opcode;
1149c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1150c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case ROT_THREE:
1151c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            v = TOP();
1152c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            w = SECOND();
1153c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            x = THIRD();
1154c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            SET_TOP(w);
1155c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            SET_SECOND(x);
1156c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            SET_THIRD(v);
1157c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            goto fast_next_opcode;
1158c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1159c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case ROT_FOUR:
1160c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            u = TOP();
1161c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            v = SECOND();
1162c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            w = THIRD();
1163c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            x = FOURTH();
1164c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            SET_TOP(v);
1165c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            SET_SECOND(w);
1166c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            SET_THIRD(x);
1167c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            SET_FOURTH(u);
1168c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            goto fast_next_opcode;
1169c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1170c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case DUP_TOP:
1171c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            v = TOP();
1172c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_INCREF(v);
1173c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PUSH(v);
1174c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            goto fast_next_opcode;
1175c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1176c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case DUP_TOPX:
1177c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (oparg == 2) {
1178c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                x = TOP();
1179c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_INCREF(x);
1180c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                w = SECOND();
1181c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_INCREF(w);
1182c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                STACKADJ(2);
1183c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                SET_TOP(x);
1184c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                SET_SECOND(w);
1185c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                goto fast_next_opcode;
1186c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            } else if (oparg == 3) {
1187c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                x = TOP();
1188c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_INCREF(x);
1189c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                w = SECOND();
1190c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_INCREF(w);
1191c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                v = THIRD();
1192c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_INCREF(v);
1193c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                STACKADJ(3);
1194c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                SET_TOP(x);
1195c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                SET_SECOND(w);
1196c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                SET_THIRD(v);
1197c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                goto fast_next_opcode;
1198c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
1199c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_FatalError("invalid argument to DUP_TOPX"
1200c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                          " (bytecode corruption?)");
1201c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            /* Never returns, so don't bother to set why. */
1202c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
1203c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1204c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case UNARY_POSITIVE:
1205c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            v = TOP();
1206c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            x = PyNumber_Positive(v);
1207c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(v);
1208c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            SET_TOP(x);
1209c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (x != NULL) continue;
1210c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
1211c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1212c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case UNARY_NEGATIVE:
1213c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            v = TOP();
1214c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            x = PyNumber_Negative(v);
1215c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(v);
1216c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            SET_TOP(x);
1217c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (x != NULL) continue;
1218c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
1219c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1220c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case UNARY_NOT:
1221c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            v = TOP();
1222c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            err = PyObject_IsTrue(v);
1223c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(v);
1224c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (err == 0) {
1225c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_INCREF(Py_True);
1226c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                SET_TOP(Py_True);
1227c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                continue;
1228c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
1229c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            else if (err > 0) {
1230c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_INCREF(Py_False);
1231c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                SET_TOP(Py_False);
1232c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                err = 0;
1233c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                continue;
1234c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
1235c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            STACKADJ(-1);
1236c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
1237c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1238c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case UNARY_CONVERT:
1239c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            v = TOP();
1240c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            x = PyObject_Repr(v);
1241c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(v);
1242c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            SET_TOP(x);
1243c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (x != NULL) continue;
1244c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
1245c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1246c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case UNARY_INVERT:
1247c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            v = TOP();
1248c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            x = PyNumber_Invert(v);
1249c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(v);
1250c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            SET_TOP(x);
1251c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (x != NULL) continue;
1252c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
1253c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1254c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case BINARY_POWER:
1255c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            w = POP();
1256c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            v = TOP();
1257c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            x = PyNumber_Power(v, w, Py_None);
1258c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(v);
1259c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(w);
1260c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            SET_TOP(x);
1261c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (x != NULL) continue;
1262c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
1263c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1264c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case BINARY_MULTIPLY:
1265c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            w = POP();
1266c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            v = TOP();
1267c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            x = PyNumber_Multiply(v, w);
1268c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(v);
1269c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(w);
1270c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            SET_TOP(x);
1271c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (x != NULL) continue;
1272c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
1273c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1274c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case BINARY_DIVIDE:
1275c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (!_Py_QnewFlag) {
1276c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                w = POP();
1277c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                v = TOP();
1278c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                x = PyNumber_Divide(v, w);
1279c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_DECREF(v);
1280c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_DECREF(w);
1281c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                SET_TOP(x);
1282c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (x != NULL) continue;
1283c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                break;
1284c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
1285c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            /* -Qnew is in effect:  fall through to
1286c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel               BINARY_TRUE_DIVIDE */
1287c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case BINARY_TRUE_DIVIDE:
1288c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            w = POP();
1289c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            v = TOP();
1290c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            x = PyNumber_TrueDivide(v, w);
1291c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(v);
1292c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(w);
1293c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            SET_TOP(x);
1294c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (x != NULL) continue;
1295c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
1296c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1297c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case BINARY_FLOOR_DIVIDE:
1298c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            w = POP();
1299c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            v = TOP();
1300c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            x = PyNumber_FloorDivide(v, w);
1301c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(v);
1302c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(w);
1303c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            SET_TOP(x);
1304c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (x != NULL) continue;
1305c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
1306c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1307c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case BINARY_MODULO:
1308c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            w = POP();
1309c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            v = TOP();
1310c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (PyString_CheckExact(v))
1311c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                x = PyString_Format(v, w);
1312c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            else
1313c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                x = PyNumber_Remainder(v, w);
1314c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(v);
1315c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(w);
1316c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            SET_TOP(x);
1317c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (x != NULL) continue;
1318c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
1319c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1320c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case BINARY_ADD:
1321c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            w = POP();
1322c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            v = TOP();
1323c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
1324c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                /* INLINE: int + int */
1325c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                register long a, b, i;
1326c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                a = PyInt_AS_LONG(v);
1327c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                b = PyInt_AS_LONG(w);
1328c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                /* cast to avoid undefined behaviour
1329c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                   on overflow */
1330c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                i = (long)((unsigned long)a + b);
1331c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if ((i^a) < 0 && (i^b) < 0)
1332c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    goto slow_add;
1333c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                x = PyInt_FromLong(i);
1334c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
1335c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            else if (PyString_CheckExact(v) &&
1336c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                     PyString_CheckExact(w)) {
1337c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                x = string_concatenate(v, w, f, next_instr);
1338c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                /* string_concatenate consumed the ref to v */
1339c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                goto skip_decref_vx;
1340c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
1341c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            else {
1342c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel              slow_add:
1343c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                x = PyNumber_Add(v, w);
1344c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
1345c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(v);
1346c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel          skip_decref_vx:
1347c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(w);
1348c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            SET_TOP(x);
1349c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (x != NULL) continue;
1350c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
1351c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1352c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case BINARY_SUBTRACT:
1353c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            w = POP();
1354c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            v = TOP();
1355c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
1356c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                /* INLINE: int - int */
1357c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                register long a, b, i;
1358c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                a = PyInt_AS_LONG(v);
1359c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                b = PyInt_AS_LONG(w);
1360c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                /* cast to avoid undefined behaviour
1361c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                   on overflow */
1362c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                i = (long)((unsigned long)a - b);
1363c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if ((i^a) < 0 && (i^~b) < 0)
1364c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    goto slow_sub;
1365c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                x = PyInt_FromLong(i);
1366c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
1367c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            else {
1368c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel              slow_sub:
1369c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                x = PyNumber_Subtract(v, w);
1370c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
1371c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(v);
1372c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(w);
1373c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            SET_TOP(x);
1374c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (x != NULL) continue;
1375c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
1376c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1377c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case BINARY_SUBSCR:
1378c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            w = POP();
1379c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            v = TOP();
1380c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (PyList_CheckExact(v) && PyInt_CheckExact(w)) {
1381c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                /* INLINE: list[int] */
1382c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_ssize_t i = PyInt_AsSsize_t(w);
1383c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (i < 0)
1384c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    i += PyList_GET_SIZE(v);
1385c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (i >= 0 && i < PyList_GET_SIZE(v)) {
1386c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    x = PyList_GET_ITEM(v, i);
1387c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    Py_INCREF(x);
1388c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                }
1389c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                else
1390c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    goto slow_get;
1391c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
1392c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            else
1393c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel              slow_get:
1394c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                x = PyObject_GetItem(v, w);
1395c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(v);
1396c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(w);
1397c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            SET_TOP(x);
1398c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (x != NULL) continue;
1399c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
1400c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1401c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case BINARY_LSHIFT:
1402c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            w = POP();
1403c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            v = TOP();
1404c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            x = PyNumber_Lshift(v, w);
1405c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(v);
1406c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(w);
1407c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            SET_TOP(x);
1408c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (x != NULL) continue;
1409c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
1410c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1411c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case BINARY_RSHIFT:
1412c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            w = POP();
1413c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            v = TOP();
1414c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            x = PyNumber_Rshift(v, w);
1415c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(v);
1416c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(w);
1417c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            SET_TOP(x);
1418c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (x != NULL) continue;
1419c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
1420c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1421c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case BINARY_AND:
1422c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            w = POP();
1423c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            v = TOP();
1424c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            x = PyNumber_And(v, w);
1425c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(v);
1426c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(w);
1427c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            SET_TOP(x);
1428c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (x != NULL) continue;
1429c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
1430c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1431c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case BINARY_XOR:
1432c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            w = POP();
1433c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            v = TOP();
1434c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            x = PyNumber_Xor(v, w);
1435c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(v);
1436c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(w);
1437c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            SET_TOP(x);
1438c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (x != NULL) continue;
1439c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
1440c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1441c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case BINARY_OR:
1442c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            w = POP();
1443c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            v = TOP();
1444c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            x = PyNumber_Or(v, w);
1445c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(v);
1446c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(w);
1447c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            SET_TOP(x);
1448c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (x != NULL) continue;
1449c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
1450c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1451c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case LIST_APPEND:
1452c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            w = POP();
1453c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            v = PEEK(oparg);
1454c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            err = PyList_Append(v, w);
1455c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(w);
1456c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (err == 0) {
1457c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PREDICT(JUMP_ABSOLUTE);
1458c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                continue;
1459c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
1460c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
1461c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1462c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case SET_ADD:
1463c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            w = POP();
1464c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            v = stack_pointer[-oparg];
1465c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            err = PySet_Add(v, w);
1466c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(w);
1467c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (err == 0) {
1468c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PREDICT(JUMP_ABSOLUTE);
1469c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                continue;
1470c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
1471c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
1472c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1473c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case INPLACE_POWER:
1474c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            w = POP();
1475c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            v = TOP();
1476c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            x = PyNumber_InPlacePower(v, w, Py_None);
1477c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(v);
1478c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(w);
1479c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            SET_TOP(x);
1480c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (x != NULL) continue;
1481c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
1482c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1483c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case INPLACE_MULTIPLY:
1484c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            w = POP();
1485c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            v = TOP();
1486c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            x = PyNumber_InPlaceMultiply(v, w);
1487c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(v);
1488c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(w);
1489c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            SET_TOP(x);
1490c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (x != NULL) continue;
1491c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
1492c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1493c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case INPLACE_DIVIDE:
1494c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (!_Py_QnewFlag) {
1495c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                w = POP();
1496c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                v = TOP();
1497c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                x = PyNumber_InPlaceDivide(v, w);
1498c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_DECREF(v);
1499c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_DECREF(w);
1500c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                SET_TOP(x);
1501c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (x != NULL) continue;
1502c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                break;
1503c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
1504c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            /* -Qnew is in effect:  fall through to
1505c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel               INPLACE_TRUE_DIVIDE */
1506c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case INPLACE_TRUE_DIVIDE:
1507c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            w = POP();
1508c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            v = TOP();
1509c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            x = PyNumber_InPlaceTrueDivide(v, w);
1510c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(v);
1511c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(w);
1512c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            SET_TOP(x);
1513c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (x != NULL) continue;
1514c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
1515c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1516c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case INPLACE_FLOOR_DIVIDE:
1517c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            w = POP();
1518c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            v = TOP();
1519c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            x = PyNumber_InPlaceFloorDivide(v, w);
1520c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(v);
1521c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(w);
1522c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            SET_TOP(x);
1523c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (x != NULL) continue;
1524c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
1525c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1526c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case INPLACE_MODULO:
1527c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            w = POP();
1528c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            v = TOP();
1529c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            x = PyNumber_InPlaceRemainder(v, w);
1530c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(v);
1531c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(w);
1532c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            SET_TOP(x);
1533c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (x != NULL) continue;
1534c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
1535c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1536c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case INPLACE_ADD:
1537c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            w = POP();
1538c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            v = TOP();
1539c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
1540c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                /* INLINE: int + int */
1541c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                register long a, b, i;
1542c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                a = PyInt_AS_LONG(v);
1543c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                b = PyInt_AS_LONG(w);
1544c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                i = a + b;
1545c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if ((i^a) < 0 && (i^b) < 0)
1546c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    goto slow_iadd;
1547c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                x = PyInt_FromLong(i);
1548c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
1549c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            else if (PyString_CheckExact(v) &&
1550c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                     PyString_CheckExact(w)) {
1551c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                x = string_concatenate(v, w, f, next_instr);
1552c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                /* string_concatenate consumed the ref to v */
1553c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                goto skip_decref_v;
1554c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
1555c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            else {
1556c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel              slow_iadd:
1557c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                x = PyNumber_InPlaceAdd(v, w);
1558c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
1559c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(v);
1560c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel          skip_decref_v:
1561c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(w);
1562c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            SET_TOP(x);
1563c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (x != NULL) continue;
1564c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
1565c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1566c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case INPLACE_SUBTRACT:
1567c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            w = POP();
1568c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            v = TOP();
1569c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
1570c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                /* INLINE: int - int */
1571c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                register long a, b, i;
1572c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                a = PyInt_AS_LONG(v);
1573c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                b = PyInt_AS_LONG(w);
1574c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                i = a - b;
1575c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if ((i^a) < 0 && (i^~b) < 0)
1576c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    goto slow_isub;
1577c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                x = PyInt_FromLong(i);
1578c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
1579c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            else {
1580c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel              slow_isub:
1581c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                x = PyNumber_InPlaceSubtract(v, w);
1582c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
1583c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(v);
1584c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(w);
1585c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            SET_TOP(x);
1586c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (x != NULL) continue;
1587c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
1588c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1589c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case INPLACE_LSHIFT:
1590c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            w = POP();
1591c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            v = TOP();
1592c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            x = PyNumber_InPlaceLshift(v, w);
1593c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(v);
1594c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(w);
1595c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            SET_TOP(x);
1596c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (x != NULL) continue;
1597c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
1598c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1599c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case INPLACE_RSHIFT:
1600c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            w = POP();
1601c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            v = TOP();
1602c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            x = PyNumber_InPlaceRshift(v, w);
1603c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(v);
1604c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(w);
1605c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            SET_TOP(x);
1606c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (x != NULL) continue;
1607c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
1608c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1609c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case INPLACE_AND:
1610c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            w = POP();
1611c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            v = TOP();
1612c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            x = PyNumber_InPlaceAnd(v, w);
1613c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(v);
1614c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(w);
1615c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            SET_TOP(x);
1616c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (x != NULL) continue;
1617c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
1618c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1619c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case INPLACE_XOR:
1620c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            w = POP();
1621c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            v = TOP();
1622c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            x = PyNumber_InPlaceXor(v, w);
1623c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(v);
1624c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(w);
1625c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            SET_TOP(x);
1626c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (x != NULL) continue;
1627c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
1628c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1629c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case INPLACE_OR:
1630c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            w = POP();
1631c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            v = TOP();
1632c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            x = PyNumber_InPlaceOr(v, w);
1633c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(v);
1634c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(w);
1635c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            SET_TOP(x);
1636c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (x != NULL) continue;
1637c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
1638c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1639c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case SLICE+0:
1640c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case SLICE+1:
1641c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case SLICE+2:
1642c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case SLICE+3:
1643c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if ((opcode-SLICE) & 2)
1644c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                w = POP();
1645c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            else
1646c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                w = NULL;
1647c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if ((opcode-SLICE) & 1)
1648c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                v = POP();
1649c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            else
1650c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                v = NULL;
1651c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            u = TOP();
1652c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            x = apply_slice(u, v, w);
1653c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(u);
1654c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_XDECREF(v);
1655c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_XDECREF(w);
1656c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            SET_TOP(x);
1657c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (x != NULL) continue;
1658c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
1659c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1660c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case STORE_SLICE+0:
1661c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case STORE_SLICE+1:
1662c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case STORE_SLICE+2:
1663c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case STORE_SLICE+3:
1664c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if ((opcode-STORE_SLICE) & 2)
1665c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                w = POP();
1666c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            else
1667c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                w = NULL;
1668c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if ((opcode-STORE_SLICE) & 1)
1669c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                v = POP();
1670c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            else
1671c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                v = NULL;
1672c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            u = POP();
1673c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            t = POP();
1674c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            err = assign_slice(u, v, w, t); /* u[v:w] = t */
1675c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(t);
1676c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(u);
1677c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_XDECREF(v);
1678c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_XDECREF(w);
1679c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (err == 0) continue;
1680c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
1681c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1682c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case DELETE_SLICE+0:
1683c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case DELETE_SLICE+1:
1684c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case DELETE_SLICE+2:
1685c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case DELETE_SLICE+3:
1686c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if ((opcode-DELETE_SLICE) & 2)
1687c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                w = POP();
1688c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            else
1689c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                w = NULL;
1690c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if ((opcode-DELETE_SLICE) & 1)
1691c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                v = POP();
1692c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            else
1693c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                v = NULL;
1694c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            u = POP();
1695c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            err = assign_slice(u, v, w, (PyObject *)NULL);
1696c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                            /* del u[v:w] */
1697c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(u);
1698c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_XDECREF(v);
1699c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_XDECREF(w);
1700c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (err == 0) continue;
1701c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
1702c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1703c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case STORE_SUBSCR:
1704c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            w = TOP();
1705c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            v = SECOND();
1706c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            u = THIRD();
1707c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            STACKADJ(-3);
1708c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            /* v[w] = u */
1709c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            err = PyObject_SetItem(v, w, u);
1710c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(u);
1711c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(v);
1712c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(w);
1713c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (err == 0) continue;
1714c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
1715c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1716c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case DELETE_SUBSCR:
1717c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            w = TOP();
1718c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            v = SECOND();
1719c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            STACKADJ(-2);
1720c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            /* del v[w] */
1721c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            err = PyObject_DelItem(v, w);
1722c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(v);
1723c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(w);
1724c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (err == 0) continue;
1725c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
1726c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1727c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case PRINT_EXPR:
1728c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            v = POP();
1729c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            w = PySys_GetObject("displayhook");
1730c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (w == NULL) {
1731c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PyErr_SetString(PyExc_RuntimeError,
1732c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                "lost sys.displayhook");
1733c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                err = -1;
1734c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                x = NULL;
1735c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
1736c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (err == 0) {
1737c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                x = PyTuple_Pack(1, v);
1738c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (x == NULL)
1739c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    err = -1;
1740c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
1741c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (err == 0) {
1742c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                w = PyEval_CallObject(w, x);
1743c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_XDECREF(w);
1744c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (w == NULL)
1745c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    err = -1;
1746c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
1747c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(v);
1748c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_XDECREF(x);
1749c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
1750c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1751c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case PRINT_ITEM_TO:
1752c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            w = stream = POP();
1753c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            /* fall through to PRINT_ITEM */
1754c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1755c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case PRINT_ITEM:
1756c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            v = POP();
1757c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (stream == NULL || stream == Py_None) {
1758c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                w = PySys_GetObject("stdout");
1759c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (w == NULL) {
1760c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    PyErr_SetString(PyExc_RuntimeError,
1761c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                    "lost sys.stdout");
1762c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    err = -1;
1763c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                }
1764c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
1765c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            /* PyFile_SoftSpace() can exececute arbitrary code
1766c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel               if sys.stdout is an instance with a __getattr__.
1767c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel               If __getattr__ raises an exception, w will
1768c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel               be freed, so we need to prevent that temporarily. */
1769c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_XINCREF(w);
1770c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (w != NULL && PyFile_SoftSpace(w, 0))
1771c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                err = PyFile_WriteString(" ", w);
1772c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (err == 0)
1773c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
1774c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (err == 0) {
1775c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                /* XXX move into writeobject() ? */
1776c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (PyString_Check(v)) {
1777c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    char *s = PyString_AS_STRING(v);
1778c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    Py_ssize_t len = PyString_GET_SIZE(v);
1779c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    if (len == 0 ||
1780c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        !isspace(Py_CHARMASK(s[len-1])) ||
1781c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        s[len-1] == ' ')
1782c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        PyFile_SoftSpace(w, 1);
1783c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                }
1784c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef Py_USING_UNICODE
1785c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                else if (PyUnicode_Check(v)) {
1786c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    Py_UNICODE *s = PyUnicode_AS_UNICODE(v);
1787c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    Py_ssize_t len = PyUnicode_GET_SIZE(v);
1788c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    if (len == 0 ||
1789c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        !Py_UNICODE_ISSPACE(s[len-1]) ||
1790c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        s[len-1] == ' ')
1791c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        PyFile_SoftSpace(w, 1);
1792c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                }
1793c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
1794c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                else
1795c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    PyFile_SoftSpace(w, 1);
1796c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
1797c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_XDECREF(w);
1798c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(v);
1799c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_XDECREF(stream);
1800c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            stream = NULL;
1801c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (err == 0)
1802c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                continue;
1803c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
1804c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1805c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case PRINT_NEWLINE_TO:
1806c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            w = stream = POP();
1807c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            /* fall through to PRINT_NEWLINE */
1808c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1809c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case PRINT_NEWLINE:
1810c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (stream == NULL || stream == Py_None) {
1811c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                w = PySys_GetObject("stdout");
1812c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (w == NULL) {
1813c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    PyErr_SetString(PyExc_RuntimeError,
1814c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                    "lost sys.stdout");
1815c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    why = WHY_EXCEPTION;
1816c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                }
1817c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
1818c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (w != NULL) {
1819c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                /* w.write() may replace sys.stdout, so we
1820c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                 * have to keep our reference to it */
1821c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_INCREF(w);
1822c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                err = PyFile_WriteString("\n", w);
1823c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (err == 0)
1824c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    PyFile_SoftSpace(w, 0);
1825c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_DECREF(w);
1826c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
1827c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_XDECREF(stream);
1828c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            stream = NULL;
1829c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
1830c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1831c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1832c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef CASE_TOO_BIG
1833c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        default: switch (opcode) {
1834c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
1835c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case RAISE_VARARGS:
1836c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            u = v = w = NULL;
1837c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            switch (oparg) {
1838c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            case 3:
1839c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                u = POP(); /* traceback */
1840c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                /* Fallthrough */
1841c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            case 2:
1842c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                v = POP(); /* value */
1843c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                /* Fallthrough */
1844c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            case 1:
1845c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                w = POP(); /* exc */
1846c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            case 0: /* Fallthrough */
1847c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                why = do_raise(w, v, u);
1848c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                break;
1849c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            default:
1850c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PyErr_SetString(PyExc_SystemError,
1851c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                           "bad RAISE_VARARGS oparg");
1852c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                why = WHY_EXCEPTION;
1853c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                break;
1854c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
1855c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
1856c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1857c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case LOAD_LOCALS:
1858c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if ((x = f->f_locals) != NULL) {
1859c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_INCREF(x);
1860c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PUSH(x);
1861c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                continue;
1862c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
1863c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyErr_SetString(PyExc_SystemError, "no locals");
1864c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
1865c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1866c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case RETURN_VALUE:
1867c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            retval = POP();
1868c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            why = WHY_RETURN;
1869c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            goto fast_block_end;
1870c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1871c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case YIELD_VALUE:
1872c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            retval = POP();
1873c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            f->f_stacktop = stack_pointer;
1874c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            why = WHY_YIELD;
1875c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            goto fast_yield;
1876c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1877c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case EXEC_STMT:
1878c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            w = TOP();
1879c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            v = SECOND();
1880c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            u = THIRD();
1881c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            STACKADJ(-3);
1882c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            READ_TIMESTAMP(intr0);
1883c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            err = exec_statement(f, u, v, w);
1884c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            READ_TIMESTAMP(intr1);
1885c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(u);
1886c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(v);
1887c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(w);
1888c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
1889c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1890c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case POP_BLOCK:
1891c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            {
1892c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PyTryBlock *b = PyFrame_BlockPop(f);
1893c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                while (STACK_LEVEL() > b->b_level) {
1894c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    v = POP();
1895c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    Py_DECREF(v);
1896c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                }
1897c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
1898c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            continue;
1899c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1900c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PREDICTED(END_FINALLY);
1901c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case END_FINALLY:
1902c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            v = POP();
1903c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (PyInt_Check(v)) {
1904c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                why = (enum why_code) PyInt_AS_LONG(v);
1905c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                assert(why != WHY_YIELD);
1906c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (why == WHY_RETURN ||
1907c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    why == WHY_CONTINUE)
1908c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    retval = POP();
1909c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
1910c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            else if (PyExceptionClass_Check(v) ||
1911c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                     PyString_Check(v)) {
1912c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                w = POP();
1913c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                u = POP();
1914c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PyErr_Restore(v, w, u);
1915c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                why = WHY_RERAISE;
1916c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                break;
1917c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
1918c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            else if (v != Py_None) {
1919c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PyErr_SetString(PyExc_SystemError,
1920c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    "'finally' pops bad exception");
1921c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                why = WHY_EXCEPTION;
1922c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
1923c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(v);
1924c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
1925c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1926c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case BUILD_CLASS:
1927c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            u = TOP();
1928c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            v = SECOND();
1929c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            w = THIRD();
1930c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            STACKADJ(-2);
1931c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            x = build_class(u, v, w);
1932c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            SET_TOP(x);
1933c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(u);
1934c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(v);
1935c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(w);
1936c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
1937c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1938c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case STORE_NAME:
1939c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            w = GETITEM(names, oparg);
1940c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            v = POP();
1941c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if ((x = f->f_locals) != NULL) {
1942c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (PyDict_CheckExact(x))
1943c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    err = PyDict_SetItem(x, w, v);
1944c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                else
1945c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    err = PyObject_SetItem(x, w, v);
1946c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_DECREF(v);
1947c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (err == 0) continue;
1948c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                break;
1949c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
1950c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            t = PyObject_Repr(w);
1951c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (t == NULL)
1952c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                break;
1953c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyErr_Format(PyExc_SystemError,
1954c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                         "no locals found when storing %s",
1955c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                         PyString_AS_STRING(t));
1956c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(t);
1957c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
1958c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1959c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case DELETE_NAME:
1960c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            w = GETITEM(names, oparg);
1961c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if ((x = f->f_locals) != NULL) {
1962c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if ((err = PyObject_DelItem(x, w)) != 0)
1963c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    format_exc_check_arg(PyExc_NameError,
1964c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                         NAME_ERROR_MSG,
1965c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                         w);
1966c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                break;
1967c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
1968c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            t = PyObject_Repr(w);
1969c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (t == NULL)
1970c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                break;
1971c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyErr_Format(PyExc_SystemError,
1972c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                         "no locals when deleting %s",
1973c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                         PyString_AS_STRING(w));
1974c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(t);
1975c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
1976c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1977c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PREDICTED_WITH_ARG(UNPACK_SEQUENCE);
1978c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case UNPACK_SEQUENCE:
1979c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            v = POP();
1980c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (PyTuple_CheckExact(v) &&
1981c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PyTuple_GET_SIZE(v) == oparg) {
1982c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PyObject **items = \
1983c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    ((PyTupleObject *)v)->ob_item;
1984c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                while (oparg--) {
1985c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    w = items[oparg];
1986c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    Py_INCREF(w);
1987c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    PUSH(w);
1988c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                }
1989c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_DECREF(v);
1990c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                continue;
1991c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            } else if (PyList_CheckExact(v) &&
1992c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                       PyList_GET_SIZE(v) == oparg) {
1993c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PyObject **items = \
1994c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    ((PyListObject *)v)->ob_item;
1995c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                while (oparg--) {
1996c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    w = items[oparg];
1997c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    Py_INCREF(w);
1998c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    PUSH(w);
1999c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                }
2000c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            } else if (unpack_iterable(v, oparg,
2001c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                       stack_pointer + oparg)) {
2002c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                STACKADJ(oparg);
2003c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            } else {
2004c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                /* unpack_iterable() raised an exception */
2005c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                why = WHY_EXCEPTION;
2006c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2007c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(v);
2008c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
2009c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2010c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case STORE_ATTR:
2011c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            w = GETITEM(names, oparg);
2012c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            v = TOP();
2013c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            u = SECOND();
2014c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            STACKADJ(-2);
2015c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            err = PyObject_SetAttr(v, w, u); /* v.w = u */
2016c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(v);
2017c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(u);
2018c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (err == 0) continue;
2019c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
2020c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2021c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case DELETE_ATTR:
2022c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            w = GETITEM(names, oparg);
2023c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            v = POP();
2024c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            err = PyObject_SetAttr(v, w, (PyObject *)NULL);
2025c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                            /* del v.w */
2026c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(v);
2027c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
2028c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2029c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case STORE_GLOBAL:
2030c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            w = GETITEM(names, oparg);
2031c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            v = POP();
2032c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            err = PyDict_SetItem(f->f_globals, w, v);
2033c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(v);
2034c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (err == 0) continue;
2035c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
2036c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2037c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case DELETE_GLOBAL:
2038c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            w = GETITEM(names, oparg);
2039c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
2040c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                format_exc_check_arg(
2041c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    PyExc_NameError, GLOBAL_NAME_ERROR_MSG, w);
2042c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
2043c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2044c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case LOAD_NAME:
2045c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            w = GETITEM(names, oparg);
2046c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if ((v = f->f_locals) == NULL) {
2047c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                why = WHY_EXCEPTION;
2048c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                t = PyObject_Repr(w);
2049c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (t == NULL)
2050c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    break;
2051c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PyErr_Format(PyExc_SystemError,
2052c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                             "no locals when loading %s",
2053c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                             PyString_AS_STRING(w));
2054c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_DECREF(t);
2055c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                break;
2056c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2057c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (PyDict_CheckExact(v)) {
2058c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                x = PyDict_GetItem(v, w);
2059c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_XINCREF(x);
2060c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2061c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            else {
2062c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                x = PyObject_GetItem(v, w);
2063c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (x == NULL && PyErr_Occurred()) {
2064c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    if (!PyErr_ExceptionMatches(
2065c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                    PyExc_KeyError))
2066c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        break;
2067c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    PyErr_Clear();
2068c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                }
2069c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2070c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (x == NULL) {
2071c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                x = PyDict_GetItem(f->f_globals, w);
2072c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (x == NULL) {
2073c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    x = PyDict_GetItem(f->f_builtins, w);
2074c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    if (x == NULL) {
2075c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        format_exc_check_arg(
2076c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                    PyExc_NameError,
2077c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                    NAME_ERROR_MSG, w);
2078c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        break;
2079c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    }
2080c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                }
2081c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_INCREF(x);
2082c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2083c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PUSH(x);
2084c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            continue;
2085c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2086c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case LOAD_GLOBAL:
2087c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            w = GETITEM(names, oparg);
2088c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (PyString_CheckExact(w)) {
2089c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                /* Inline the PyDict_GetItem() calls.
2090c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                   WARNING: this is an extreme speed hack.
2091c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                   Do not try this at home. */
2092c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                long hash = ((PyStringObject *)w)->ob_shash;
2093c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (hash != -1) {
2094c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    PyDictObject *d;
2095c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    PyDictEntry *e;
2096c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    d = (PyDictObject *)(f->f_globals);
2097c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    e = d->ma_lookup(d, w, hash);
2098c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    if (e == NULL) {
2099c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        x = NULL;
2100c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        break;
2101c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    }
2102c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    x = e->me_value;
2103c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    if (x != NULL) {
2104c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        Py_INCREF(x);
2105c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        PUSH(x);
2106c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        continue;
2107c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    }
2108c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    d = (PyDictObject *)(f->f_builtins);
2109c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    e = d->ma_lookup(d, w, hash);
2110c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    if (e == NULL) {
2111c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        x = NULL;
2112c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        break;
2113c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    }
2114c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    x = e->me_value;
2115c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    if (x != NULL) {
2116c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        Py_INCREF(x);
2117c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        PUSH(x);
2118c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        continue;
2119c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    }
2120c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    goto load_global_error;
2121c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                }
2122c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2123c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            /* This is the un-inlined version of the code above */
2124c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            x = PyDict_GetItem(f->f_globals, w);
2125c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (x == NULL) {
2126c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                x = PyDict_GetItem(f->f_builtins, w);
2127c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (x == NULL) {
2128c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                  load_global_error:
2129c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    format_exc_check_arg(
2130c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                PyExc_NameError,
2131c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                GLOBAL_NAME_ERROR_MSG, w);
2132c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    break;
2133c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                }
2134c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2135c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_INCREF(x);
2136c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PUSH(x);
2137c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            continue;
2138c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2139c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case DELETE_FAST:
2140c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            x = GETLOCAL(oparg);
2141c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (x != NULL) {
2142c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                SETLOCAL(oparg, NULL);
2143c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                continue;
2144c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2145c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            format_exc_check_arg(
2146c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PyExc_UnboundLocalError,
2147c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                UNBOUNDLOCAL_ERROR_MSG,
2148c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PyTuple_GetItem(co->co_varnames, oparg)
2149c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                );
2150c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
2151c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2152c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case LOAD_CLOSURE:
2153c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            x = freevars[oparg];
2154c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_INCREF(x);
2155c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PUSH(x);
2156c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (x != NULL) continue;
2157c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
2158c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2159c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case LOAD_DEREF:
2160c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            x = freevars[oparg];
2161c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            w = PyCell_Get(x);
2162c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (w != NULL) {
2163c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PUSH(w);
2164c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                continue;
2165c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2166c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            err = -1;
2167c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            /* Don't stomp existing exception */
2168c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (PyErr_Occurred())
2169c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                break;
2170c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (oparg < PyTuple_GET_SIZE(co->co_cellvars)) {
2171c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                v = PyTuple_GET_ITEM(co->co_cellvars,
2172c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                     oparg);
2173c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                format_exc_check_arg(
2174c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                       PyExc_UnboundLocalError,
2175c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                       UNBOUNDLOCAL_ERROR_MSG,
2176c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                       v);
2177c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            } else {
2178c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                v = PyTuple_GET_ITEM(co->co_freevars, oparg -
2179c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    PyTuple_GET_SIZE(co->co_cellvars));
2180c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                format_exc_check_arg(PyExc_NameError,
2181c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                     UNBOUNDFREE_ERROR_MSG, v);
2182c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2183c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
2184c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2185c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case STORE_DEREF:
2186c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            w = POP();
2187c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            x = freevars[oparg];
2188c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyCell_Set(x, w);
2189c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(w);
2190c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            continue;
2191c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2192c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case BUILD_TUPLE:
2193c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            x = PyTuple_New(oparg);
2194c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (x != NULL) {
2195c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                for (; --oparg >= 0;) {
2196c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    w = POP();
2197c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    PyTuple_SET_ITEM(x, oparg, w);
2198c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                }
2199c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PUSH(x);
2200c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                continue;
2201c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2202c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
2203c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2204c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case BUILD_LIST:
2205c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            x =  PyList_New(oparg);
2206c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (x != NULL) {
2207c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                for (; --oparg >= 0;) {
2208c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    w = POP();
2209c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    PyList_SET_ITEM(x, oparg, w);
2210c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                }
2211c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PUSH(x);
2212c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                continue;
2213c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2214c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
2215c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2216c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case BUILD_SET:
2217c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            x = PySet_New(NULL);
2218c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (x != NULL) {
2219c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                for (; --oparg >= 0;) {
2220c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    w = POP();
2221c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    if (err == 0)
2222c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        err = PySet_Add(x, w);
2223c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    Py_DECREF(w);
2224c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                }
2225c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (err != 0) {
2226c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    Py_DECREF(x);
2227c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    break;
2228c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                }
2229c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PUSH(x);
2230c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                continue;
2231c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2232c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
2233c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2234c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2235c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case BUILD_MAP:
2236c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            x = _PyDict_NewPresized((Py_ssize_t)oparg);
2237c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PUSH(x);
2238c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (x != NULL) continue;
2239c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
2240c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2241c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case STORE_MAP:
2242c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            w = TOP();     /* key */
2243c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            u = SECOND();  /* value */
2244c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            v = THIRD();   /* dict */
2245c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            STACKADJ(-2);
2246c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            assert (PyDict_CheckExact(v));
2247c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            err = PyDict_SetItem(v, w, u);  /* v[w] = u */
2248c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(u);
2249c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(w);
2250c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (err == 0) continue;
2251c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
2252c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2253c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case MAP_ADD:
2254c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            w = TOP();     /* key */
2255c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            u = SECOND();  /* value */
2256c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            STACKADJ(-2);
2257c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            v = stack_pointer[-oparg];  /* dict */
2258c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            assert (PyDict_CheckExact(v));
2259c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            err = PyDict_SetItem(v, w, u);  /* v[w] = u */
2260c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(u);
2261c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(w);
2262c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (err == 0) {
2263c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PREDICT(JUMP_ABSOLUTE);
2264c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                continue;
2265c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2266c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
2267c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2268c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case LOAD_ATTR:
2269c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            w = GETITEM(names, oparg);
2270c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            v = TOP();
2271c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            x = PyObject_GetAttr(v, w);
2272c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(v);
2273c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            SET_TOP(x);
2274c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (x != NULL) continue;
2275c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
2276c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2277c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case COMPARE_OP:
2278c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            w = POP();
2279c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            v = TOP();
2280c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (PyInt_CheckExact(w) && PyInt_CheckExact(v)) {
2281c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                /* INLINE: cmp(int, int) */
2282c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                register long a, b;
2283c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                register int res;
2284c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                a = PyInt_AS_LONG(v);
2285c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                b = PyInt_AS_LONG(w);
2286c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                switch (oparg) {
2287c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                case PyCmp_LT: res = a <  b; break;
2288c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                case PyCmp_LE: res = a <= b; break;
2289c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                case PyCmp_EQ: res = a == b; break;
2290c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                case PyCmp_NE: res = a != b; break;
2291c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                case PyCmp_GT: res = a >  b; break;
2292c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                case PyCmp_GE: res = a >= b; break;
2293c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                case PyCmp_IS: res = v == w; break;
2294c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                case PyCmp_IS_NOT: res = v != w; break;
2295c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                default: goto slow_compare;
2296c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                }
2297c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                x = res ? Py_True : Py_False;
2298c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_INCREF(x);
2299c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2300c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            else {
2301c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel              slow_compare:
2302c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                x = cmp_outcome(oparg, v, w);
2303c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2304c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(v);
2305c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(w);
2306c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            SET_TOP(x);
2307c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (x == NULL) break;
2308c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PREDICT(POP_JUMP_IF_FALSE);
2309c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PREDICT(POP_JUMP_IF_TRUE);
2310c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            continue;
2311c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2312c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case IMPORT_NAME:
2313c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            w = GETITEM(names, oparg);
2314c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            x = PyDict_GetItemString(f->f_builtins, "__import__");
2315c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (x == NULL) {
2316c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PyErr_SetString(PyExc_ImportError,
2317c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                "__import__ not found");
2318c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                break;
2319c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2320c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_INCREF(x);
2321c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            v = POP();
2322c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            u = TOP();
2323c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (PyInt_AsLong(u) != -1 || PyErr_Occurred())
2324c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                w = PyTuple_Pack(5,
2325c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                            w,
2326c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                            f->f_globals,
2327c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                            f->f_locals == NULL ?
2328c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                  Py_None : f->f_locals,
2329c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                            v,
2330c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                            u);
2331c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            else
2332c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                w = PyTuple_Pack(4,
2333c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                            w,
2334c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                            f->f_globals,
2335c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                            f->f_locals == NULL ?
2336c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                  Py_None : f->f_locals,
2337c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                            v);
2338c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(v);
2339c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(u);
2340c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (w == NULL) {
2341c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                u = POP();
2342c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_DECREF(x);
2343c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                x = NULL;
2344c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                break;
2345c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2346c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            READ_TIMESTAMP(intr0);
2347c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            v = x;
2348c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            x = PyEval_CallObject(v, w);
2349c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(v);
2350c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            READ_TIMESTAMP(intr1);
2351c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(w);
2352c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            SET_TOP(x);
2353c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (x != NULL) continue;
2354c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
2355c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2356c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case IMPORT_STAR:
2357c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            v = POP();
2358c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyFrame_FastToLocals(f);
2359c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if ((x = f->f_locals) == NULL) {
2360c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PyErr_SetString(PyExc_SystemError,
2361c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    "no locals found during 'import *'");
2362c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                break;
2363c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2364c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            READ_TIMESTAMP(intr0);
2365c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            err = import_all_from(x, v);
2366c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            READ_TIMESTAMP(intr1);
2367c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyFrame_LocalsToFast(f, 0);
2368c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(v);
2369c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (err == 0) continue;
2370c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
2371c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2372c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case IMPORT_FROM:
2373c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            w = GETITEM(names, oparg);
2374c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            v = TOP();
2375c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            READ_TIMESTAMP(intr0);
2376c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            x = import_from(v, w);
2377c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            READ_TIMESTAMP(intr1);
2378c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PUSH(x);
2379c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (x != NULL) continue;
2380c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
2381c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2382c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case JUMP_FORWARD:
2383c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            JUMPBY(oparg);
2384c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            goto fast_next_opcode;
2385c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2386c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PREDICTED_WITH_ARG(POP_JUMP_IF_FALSE);
2387c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case POP_JUMP_IF_FALSE:
2388c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            w = POP();
2389c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (w == Py_True) {
2390c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_DECREF(w);
2391c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                goto fast_next_opcode;
2392c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2393c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (w == Py_False) {
2394c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_DECREF(w);
2395c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                JUMPTO(oparg);
2396c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                goto fast_next_opcode;
2397c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2398c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            err = PyObject_IsTrue(w);
2399c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(w);
2400c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (err > 0)
2401c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                err = 0;
2402c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            else if (err == 0)
2403c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                JUMPTO(oparg);
2404c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            else
2405c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                break;
2406c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            continue;
2407c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2408c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PREDICTED_WITH_ARG(POP_JUMP_IF_TRUE);
2409c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case POP_JUMP_IF_TRUE:
2410c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            w = POP();
2411c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (w == Py_False) {
2412c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_DECREF(w);
2413c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                goto fast_next_opcode;
2414c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2415c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (w == Py_True) {
2416c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_DECREF(w);
2417c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                JUMPTO(oparg);
2418c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                goto fast_next_opcode;
2419c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2420c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            err = PyObject_IsTrue(w);
2421c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(w);
2422c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (err > 0) {
2423c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                err = 0;
2424c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                JUMPTO(oparg);
2425c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2426c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            else if (err == 0)
2427c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                ;
2428c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            else
2429c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                break;
2430c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            continue;
2431c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2432c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case JUMP_IF_FALSE_OR_POP:
2433c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            w = TOP();
2434c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (w == Py_True) {
2435c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                STACKADJ(-1);
2436c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_DECREF(w);
2437c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                goto fast_next_opcode;
2438c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2439c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (w == Py_False) {
2440c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                JUMPTO(oparg);
2441c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                goto fast_next_opcode;
2442c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2443c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            err = PyObject_IsTrue(w);
2444c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (err > 0) {
2445c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                STACKADJ(-1);
2446c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_DECREF(w);
2447c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                err = 0;
2448c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2449c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            else if (err == 0)
2450c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                JUMPTO(oparg);
2451c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            else
2452c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                break;
2453c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            continue;
2454c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2455c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case JUMP_IF_TRUE_OR_POP:
2456c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            w = TOP();
2457c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (w == Py_False) {
2458c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                STACKADJ(-1);
2459c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_DECREF(w);
2460c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                goto fast_next_opcode;
2461c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2462c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (w == Py_True) {
2463c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                JUMPTO(oparg);
2464c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                goto fast_next_opcode;
2465c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2466c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            err = PyObject_IsTrue(w);
2467c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (err > 0) {
2468c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                err = 0;
2469c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                JUMPTO(oparg);
2470c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2471c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            else if (err == 0) {
2472c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                STACKADJ(-1);
2473c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_DECREF(w);
2474c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2475c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            else
2476c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                break;
2477c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            continue;
2478c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2479c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PREDICTED_WITH_ARG(JUMP_ABSOLUTE);
2480c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case JUMP_ABSOLUTE:
2481c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            JUMPTO(oparg);
2482c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#if FAST_LOOPS
2483c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            /* Enabling this path speeds-up all while and for-loops by bypassing
2484c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel               the per-loop checks for signals.  By default, this should be turned-off
2485c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel               because it prevents detection of a control-break in tight loops like
2486c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel               "while 1: pass".  Compile with this option turned-on when you need
2487c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel               the speed-up and do not need break checking inside tight loops (ones
2488c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel               that contain only instructions ending with goto fast_next_opcode).
2489c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            */
2490c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            goto fast_next_opcode;
2491c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#else
2492c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            continue;
2493c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
2494c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2495c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case GET_ITER:
2496c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            /* before: [obj]; after [getiter(obj)] */
2497c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            v = TOP();
2498c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            x = PyObject_GetIter(v);
2499c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(v);
2500c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (x != NULL) {
2501c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                SET_TOP(x);
2502c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PREDICT(FOR_ITER);
2503c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                continue;
2504c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2505c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            STACKADJ(-1);
2506c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
2507c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2508c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PREDICTED_WITH_ARG(FOR_ITER);
2509c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case FOR_ITER:
2510c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            /* before: [iter]; after: [iter, iter()] *or* [] */
2511c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            v = TOP();
2512c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            x = (*v->ob_type->tp_iternext)(v);
2513c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (x != NULL) {
2514c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PUSH(x);
2515c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PREDICT(STORE_FAST);
2516c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PREDICT(UNPACK_SEQUENCE);
2517c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                continue;
2518c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2519c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (PyErr_Occurred()) {
2520c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (!PyErr_ExceptionMatches(
2521c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                PyExc_StopIteration))
2522c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    break;
2523c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PyErr_Clear();
2524c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2525c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            /* iterator ended normally */
2526c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            x = v = POP();
2527c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(v);
2528c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            JUMPBY(oparg);
2529c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            continue;
2530c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2531c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case BREAK_LOOP:
2532c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            why = WHY_BREAK;
2533c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            goto fast_block_end;
2534c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2535c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case CONTINUE_LOOP:
2536c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            retval = PyInt_FromLong(oparg);
2537c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (!retval) {
2538c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                x = NULL;
2539c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                break;
2540c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2541c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            why = WHY_CONTINUE;
2542c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            goto fast_block_end;
2543c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2544c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case SETUP_LOOP:
2545c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case SETUP_EXCEPT:
2546c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case SETUP_FINALLY:
2547c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            /* NOTE: If you add any new block-setup opcodes that
2548c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel               are not try/except/finally handlers, you may need
2549c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel               to update the PyGen_NeedsFinalizing() function.
2550c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel               */
2551c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2552c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
2553c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                               STACK_LEVEL());
2554c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            continue;
2555c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2556c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case SETUP_WITH:
2557c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        {
2558c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            static PyObject *exit, *enter;
2559c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            w = TOP();
2560c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            x = special_lookup(w, "__exit__", &exit);
2561c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (!x)
2562c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                break;
2563c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            SET_TOP(x);
2564c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            u = special_lookup(w, "__enter__", &enter);
2565c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(w);
2566c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (!u) {
2567c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                x = NULL;
2568c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                break;
2569c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2570c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            x = PyObject_CallFunctionObjArgs(u, NULL);
2571c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(u);
2572c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (!x)
2573c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                break;
2574c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            /* Setup a finally block (SETUP_WITH as a block is
2575c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel               equivalent to SETUP_FINALLY except it normalizes
2576c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel               the exception) before pushing the result of
2577c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel               __enter__ on the stack. */
2578c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyFrame_BlockSetup(f, SETUP_WITH, INSTR_OFFSET() + oparg,
2579c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                               STACK_LEVEL());
2580c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2581c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PUSH(x);
2582c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            continue;
2583c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
2584c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2585c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case WITH_CLEANUP:
2586c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        {
2587c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            /* At the top of the stack are 1-3 values indicating
2588c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel               how/why we entered the finally clause:
2589c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel               - TOP = None
2590c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel               - (TOP, SECOND) = (WHY_{RETURN,CONTINUE}), retval
2591c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel               - TOP = WHY_*; no retval below it
2592c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel               - (TOP, SECOND, THIRD) = exc_info()
2593c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel               Below them is EXIT, the context.__exit__ bound method.
2594c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel               In the last case, we must call
2595c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                 EXIT(TOP, SECOND, THIRD)
2596c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel               otherwise we must call
2597c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                 EXIT(None, None, None)
2598c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2599c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel               In all cases, we remove EXIT from the stack, leaving
2600c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel               the rest in the same order.
2601c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2602c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel               In addition, if the stack represents an exception,
2603c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel               *and* the function call returns a 'true' value, we
2604c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel               "zap" this information, to prevent END_FINALLY from
2605c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel               re-raising the exception.  (But non-local gotos
2606c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel               should still be resumed.)
2607c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            */
2608c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2609c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyObject *exit_func;
2610c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2611c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            u = POP();
2612c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (u == Py_None) {
2613c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                exit_func = TOP();
2614c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                SET_TOP(u);
2615c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                v = w = Py_None;
2616c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2617c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            else if (PyInt_Check(u)) {
2618c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                switch(PyInt_AS_LONG(u)) {
2619c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                case WHY_RETURN:
2620c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                case WHY_CONTINUE:
2621c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    /* Retval in TOP. */
2622c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    exit_func = SECOND();
2623c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    SET_SECOND(TOP());
2624c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    SET_TOP(u);
2625c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    break;
2626c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                default:
2627c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    exit_func = TOP();
2628c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    SET_TOP(u);
2629c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    break;
2630c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                }
2631c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                u = v = w = Py_None;
2632c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2633c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            else {
2634c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                v = TOP();
2635c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                w = SECOND();
2636c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                exit_func = THIRD();
2637c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                SET_TOP(u);
2638c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                SET_SECOND(v);
2639c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                SET_THIRD(w);
2640c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2641c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            /* XXX Not the fastest way to call it... */
2642c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            x = PyObject_CallFunctionObjArgs(exit_func, u, v, w,
2643c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                             NULL);
2644c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(exit_func);
2645c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (x == NULL)
2646c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                break; /* Go to error exit */
2647c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2648c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (u != Py_None)
2649c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                err = PyObject_IsTrue(x);
2650c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            else
2651c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                err = 0;
2652c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(x);
2653c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2654c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (err < 0)
2655c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                break; /* Go to error exit */
2656c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            else if (err > 0) {
2657c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                err = 0;
2658c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                /* There was an exception and a true return */
2659c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                STACKADJ(-2);
2660c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_INCREF(Py_None);
2661c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                SET_TOP(Py_None);
2662c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_DECREF(u);
2663c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_DECREF(v);
2664c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_DECREF(w);
2665c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            } else {
2666c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                /* The stack was rearranged to remove EXIT
2667c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                   above. Let END_FINALLY do its thing */
2668c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2669c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PREDICT(END_FINALLY);
2670c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
2671c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
2672c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2673c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case CALL_FUNCTION:
2674c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        {
2675c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyObject **sp;
2676c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PCALL(PCALL_ALL);
2677c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            sp = stack_pointer;
2678c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef WITH_TSC
2679c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            x = call_function(&sp, oparg, &intr0, &intr1);
2680c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#else
2681c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            x = call_function(&sp, oparg);
2682c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
2683c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            stack_pointer = sp;
2684c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PUSH(x);
2685c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (x != NULL)
2686c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                continue;
2687c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
2688c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
2689c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2690c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case CALL_FUNCTION_VAR:
2691c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case CALL_FUNCTION_KW:
2692c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case CALL_FUNCTION_VAR_KW:
2693c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        {
2694c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            int na = oparg & 0xff;
2695c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            int nk = (oparg>>8) & 0xff;
2696c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            int flags = (opcode - CALL_FUNCTION) & 3;
2697c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            int n = na + 2 * nk;
2698c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyObject **pfunc, *func, **sp;
2699c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PCALL(PCALL_ALL);
2700c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (flags & CALL_FLAG_VAR)
2701c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                n++;
2702c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (flags & CALL_FLAG_KW)
2703c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                n++;
2704c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            pfunc = stack_pointer - n - 1;
2705c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            func = *pfunc;
2706c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2707c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (PyMethod_Check(func)
2708c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                && PyMethod_GET_SELF(func) != NULL) {
2709c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PyObject *self = PyMethod_GET_SELF(func);
2710c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_INCREF(self);
2711c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                func = PyMethod_GET_FUNCTION(func);
2712c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_INCREF(func);
2713c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_DECREF(*pfunc);
2714c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                *pfunc = self;
2715c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                na++;
2716c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            } else
2717c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_INCREF(func);
2718c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            sp = stack_pointer;
2719c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            READ_TIMESTAMP(intr0);
2720c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            x = ext_do_call(func, &sp, flags, na, nk);
2721c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            READ_TIMESTAMP(intr1);
2722c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            stack_pointer = sp;
2723c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(func);
2724c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2725c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            while (stack_pointer > pfunc) {
2726c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                w = POP();
2727c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_DECREF(w);
2728c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2729c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PUSH(x);
2730c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (x != NULL)
2731c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                continue;
2732c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
2733c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
2734c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2735c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case MAKE_FUNCTION:
2736c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            v = POP(); /* code object */
2737c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            x = PyFunction_New(v, f->f_globals);
2738c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(v);
2739c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            /* XXX Maybe this should be a separate opcode? */
2740c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (x != NULL && oparg > 0) {
2741c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                v = PyTuple_New(oparg);
2742c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (v == NULL) {
2743c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    Py_DECREF(x);
2744c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    x = NULL;
2745c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    break;
2746c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                }
2747c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                while (--oparg >= 0) {
2748c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    w = POP();
2749c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    PyTuple_SET_ITEM(v, oparg, w);
2750c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                }
2751c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                err = PyFunction_SetDefaults(x, v);
2752c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_DECREF(v);
2753c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2754c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PUSH(x);
2755c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
2756c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2757c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case MAKE_CLOSURE:
2758c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        {
2759c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            v = POP(); /* code object */
2760c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            x = PyFunction_New(v, f->f_globals);
2761c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(v);
2762c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (x != NULL) {
2763c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                v = POP();
2764c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (PyFunction_SetClosure(x, v) != 0) {
2765c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    /* Can't happen unless bytecode is corrupt. */
2766c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    why = WHY_EXCEPTION;
2767c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                }
2768c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_DECREF(v);
2769c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2770c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (x != NULL && oparg > 0) {
2771c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                v = PyTuple_New(oparg);
2772c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (v == NULL) {
2773c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    Py_DECREF(x);
2774c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    x = NULL;
2775c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    break;
2776c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                }
2777c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                while (--oparg >= 0) {
2778c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    w = POP();
2779c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    PyTuple_SET_ITEM(v, oparg, w);
2780c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                }
2781c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (PyFunction_SetDefaults(x, v) != 0) {
2782c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    /* Can't happen unless
2783c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                       PyFunction_SetDefaults changes. */
2784c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    why = WHY_EXCEPTION;
2785c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                }
2786c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_DECREF(v);
2787c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2788c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PUSH(x);
2789c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
2790c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
2791c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2792c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case BUILD_SLICE:
2793c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (oparg == 3)
2794c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                w = POP();
2795c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            else
2796c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                w = NULL;
2797c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            v = POP();
2798c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            u = TOP();
2799c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            x = PySlice_New(u, v, w);
2800c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(u);
2801c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(v);
2802c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_XDECREF(w);
2803c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            SET_TOP(x);
2804c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (x != NULL) continue;
2805c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
2806c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2807c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case EXTENDED_ARG:
2808c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            opcode = NEXTOP();
2809c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            oparg = oparg<<16 | NEXTARG();
2810c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            goto dispatch_opcode;
2811c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2812c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        default:
2813c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            fprintf(stderr,
2814c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                "XXX lineno: %d, opcode: %d\n",
2815c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PyFrame_GetLineNumber(f),
2816c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                opcode);
2817c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyErr_SetString(PyExc_SystemError, "unknown opcode");
2818c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            why = WHY_EXCEPTION;
2819c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
2820c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2821c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef CASE_TOO_BIG
2822c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
2823c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
2824c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2825c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        } /* switch */
2826c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2827c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        on_error:
2828c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2829c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        READ_TIMESTAMP(inst1);
2830c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2831c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* Quickly continue if no error occurred */
2832c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2833c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (why == WHY_NOT) {
2834c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (err == 0 && x != NULL) {
2835c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef CHECKEXC
2836c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                /* This check is expensive! */
2837c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (PyErr_Occurred())
2838c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    fprintf(stderr,
2839c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        "XXX undetected error\n");
2840c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                else {
2841c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
2842c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    READ_TIMESTAMP(loop1);
2843c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    continue; /* Normal, fast path */
2844c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef CHECKEXC
2845c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                }
2846c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
2847c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2848c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            why = WHY_EXCEPTION;
2849c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            x = Py_None;
2850c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            err = 0;
2851c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
2852c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2853c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* Double-check exception status */
2854c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2855c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
2856c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (!PyErr_Occurred()) {
2857c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PyErr_SetString(PyExc_SystemError,
2858c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    "error return without exception set");
2859c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                why = WHY_EXCEPTION;
2860c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2861c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
2862c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef CHECKEXC
2863c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        else {
2864c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            /* This check is expensive! */
2865c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (PyErr_Occurred()) {
2866c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                char buf[128];
2867c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                sprintf(buf, "Stack unwind with exception "
2868c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    "set and why=%d", why);
2869c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_FatalError(buf);
2870c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2871c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
2872c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
2873c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2874c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* Log traceback info if this is a real exception */
2875c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2876c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (why == WHY_EXCEPTION) {
2877c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyTraceBack_Here(f);
2878c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2879c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (tstate->c_tracefunc != NULL)
2880c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                call_exc_trace(tstate->c_tracefunc,
2881c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                               tstate->c_traceobj, f);
2882c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
2883c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2884c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
2885c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2886c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (why == WHY_RERAISE)
2887c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            why = WHY_EXCEPTION;
2888c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2889c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* Unwind stacks if a (pseudo) exception occurred */
2890c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2891c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielfast_block_end:
2892c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        while (why != WHY_NOT && f->f_iblock > 0) {
2893c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            /* Peek at the current block. */
2894c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyTryBlock *b = &f->f_blockstack[f->f_iblock - 1];
2895c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2896c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            assert(why != WHY_YIELD);
2897c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (b->b_type == SETUP_LOOP && why == WHY_CONTINUE) {
2898c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                why = WHY_NOT;
2899c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                JUMPTO(PyInt_AS_LONG(retval));
2900c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_DECREF(retval);
2901c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                break;
2902c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2903c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2904c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            /* Now we have to pop the block. */
2905c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            f->f_iblock--;
2906c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2907c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            while (STACK_LEVEL() > b->b_level) {
2908c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                v = POP();
2909c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_XDECREF(v);
2910c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2911c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2912c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                why = WHY_NOT;
2913c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                JUMPTO(b->b_handler);
2914c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                break;
2915c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2916c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (b->b_type == SETUP_FINALLY ||
2917c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                (b->b_type == SETUP_EXCEPT &&
2918c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                 why == WHY_EXCEPTION) ||
2919c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                b->b_type == SETUP_WITH) {
2920c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (why == WHY_EXCEPTION) {
2921c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    PyObject *exc, *val, *tb;
2922c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    PyErr_Fetch(&exc, &val, &tb);
2923c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    if (val == NULL) {
2924c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        val = Py_None;
2925c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        Py_INCREF(val);
2926c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    }
2927c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    /* Make the raw exception data
2928c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                       available to the handler,
2929c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                       so a program can emulate the
2930c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                       Python main loop.  Don't do
2931c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                       this for 'finally'. */
2932c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    if (b->b_type == SETUP_EXCEPT ||
2933c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        b->b_type == SETUP_WITH) {
2934c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        PyErr_NormalizeException(
2935c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                            &exc, &val, &tb);
2936c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        set_exc_info(tstate,
2937c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                     exc, val, tb);
2938c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    }
2939c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    if (tb == NULL) {
2940c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        Py_INCREF(Py_None);
2941c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        PUSH(Py_None);
2942c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    } else
2943c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        PUSH(tb);
2944c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    PUSH(val);
2945c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    PUSH(exc);
2946c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                }
2947c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                else {
2948c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    if (why & (WHY_RETURN | WHY_CONTINUE))
2949c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        PUSH(retval);
2950c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    v = PyInt_FromLong((long)why);
2951c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    PUSH(v);
2952c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                }
2953c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                why = WHY_NOT;
2954c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                JUMPTO(b->b_handler);
2955c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                break;
2956c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2957c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        } /* unwind stack */
2958c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2959c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* End the loop if we still have an error (or return) */
2960c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2961c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (why != WHY_NOT)
2962c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
2963c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        READ_TIMESTAMP(loop1);
2964c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2965c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    } /* main loop */
2966c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2967c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    assert(why != WHY_YIELD);
2968c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* Pop remaining stack entries. */
2969c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    while (!EMPTY()) {
2970c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        v = POP();
2971c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_XDECREF(v);
2972c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
2973c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2974c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (why != WHY_RETURN)
2975c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        retval = NULL;
2976c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2977c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielfast_yield:
2978c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (tstate->use_tracing) {
2979c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (tstate->c_tracefunc) {
2980c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (why == WHY_RETURN || why == WHY_YIELD) {
2981c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (call_trace(tstate->c_tracefunc,
2982c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                               tstate->c_traceobj, f,
2983c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                               PyTrace_RETURN, retval)) {
2984c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    Py_XDECREF(retval);
2985c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    retval = NULL;
2986c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    why = WHY_EXCEPTION;
2987c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                }
2988c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2989c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            else if (why == WHY_EXCEPTION) {
2990c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                call_trace_protected(tstate->c_tracefunc,
2991c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                     tstate->c_traceobj, f,
2992c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                     PyTrace_RETURN, NULL);
2993c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2994c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
2995c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (tstate->c_profilefunc) {
2996c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (why == WHY_EXCEPTION)
2997c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                call_trace_protected(tstate->c_profilefunc,
2998c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                     tstate->c_profileobj, f,
2999c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                     PyTrace_RETURN, NULL);
3000c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            else if (call_trace(tstate->c_profilefunc,
3001c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                tstate->c_profileobj, f,
3002c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                PyTrace_RETURN, retval)) {
3003c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_XDECREF(retval);
3004c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                retval = NULL;
3005c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                why = WHY_EXCEPTION;
3006c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
3007c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
3008c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
3009c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3010c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (tstate->frame->f_exc_type != NULL)
3011c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        reset_exc_info(tstate);
3012c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else {
3013c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        assert(tstate->frame->f_exc_value == NULL);
3014c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        assert(tstate->frame->f_exc_traceback == NULL);
3015c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
3016c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3017c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* pop frame */
3018c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielexit_eval_frame:
3019c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_LeaveRecursiveCall();
3020c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    tstate->frame = f->f_back;
3021c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3022c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return retval;
3023c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
3024c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3025c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* This is gonna seem *real weird*, but if you put some other code between
3026c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   PyEval_EvalFrame() and PyEval_EvalCodeEx() you will need to adjust
3027c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   the test in the if statements in Misc/gdbinit (pystack and pystackv). */
3028c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3029c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyObject *
3030c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals,
3031c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel           PyObject **args, int argcount, PyObject **kws, int kwcount,
3032c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel           PyObject **defs, int defcount, PyObject *closure)
3033c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
3034c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    register PyFrameObject *f;
3035c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    register PyObject *retval = NULL;
3036c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    register PyObject **fastlocals, **freevars;
3037c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyThreadState *tstate = PyThreadState_GET();
3038c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *x, *u;
3039c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3040c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (globals == NULL) {
3041c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyErr_SetString(PyExc_SystemError,
3042c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        "PyEval_EvalCodeEx: NULL globals");
3043c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
3044c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
3045c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3046c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    assert(tstate != NULL);
3047c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    assert(globals != NULL);
3048c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    f = PyFrame_New(tstate, co, globals, locals);
3049c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (f == NULL)
3050c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
3051c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3052c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    fastlocals = f->f_localsplus;
3053c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    freevars = f->f_localsplus + co->co_nlocals;
3054c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3055c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (co->co_argcount > 0 ||
3056c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
3057c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        int i;
3058c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        int n = argcount;
3059c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyObject *kwdict = NULL;
3060c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (co->co_flags & CO_VARKEYWORDS) {
3061c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            kwdict = PyDict_New();
3062c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (kwdict == NULL)
3063c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                goto fail;
3064c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            i = co->co_argcount;
3065c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (co->co_flags & CO_VARARGS)
3066c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                i++;
3067c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            SETLOCAL(i, kwdict);
3068c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
3069c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (argcount > co->co_argcount) {
3070c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (!(co->co_flags & CO_VARARGS)) {
3071c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PyErr_Format(PyExc_TypeError,
3072c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    "%.200s() takes %s %d "
3073c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    "argument%s (%d given)",
3074c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    PyString_AsString(co->co_name),
3075c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    defcount ? "at most" : "exactly",
3076c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    co->co_argcount,
3077c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    co->co_argcount == 1 ? "" : "s",
3078c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    argcount + kwcount);
3079c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                goto fail;
3080c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
3081c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            n = co->co_argcount;
3082c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
3083c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        for (i = 0; i < n; i++) {
3084c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            x = args[i];
3085c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_INCREF(x);
3086c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            SETLOCAL(i, x);
3087c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
3088c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (co->co_flags & CO_VARARGS) {
3089c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            u = PyTuple_New(argcount - n);
3090c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (u == NULL)
3091c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                goto fail;
3092c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            SETLOCAL(co->co_argcount, u);
3093c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            for (i = n; i < argcount; i++) {
3094c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                x = args[i];
3095c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_INCREF(x);
3096c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PyTuple_SET_ITEM(u, i-n, x);
3097c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
3098c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
3099c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        for (i = 0; i < kwcount; i++) {
3100c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyObject **co_varnames;
3101c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyObject *keyword = kws[2*i];
3102c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyObject *value = kws[2*i + 1];
3103c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            int j;
3104c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (keyword == NULL || !(PyString_Check(keyword)
3105c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef Py_USING_UNICODE
3106c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                     || PyUnicode_Check(keyword)
3107c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
3108c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        )) {
3109c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PyErr_Format(PyExc_TypeError,
3110c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    "%.200s() keywords must be strings",
3111c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    PyString_AsString(co->co_name));
3112c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                goto fail;
3113c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
3114c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            /* Speed hack: do raw pointer compares. As names are
3115c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel               normally interned this should almost always hit. */
3116c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            co_varnames = ((PyTupleObject *)(co->co_varnames))->ob_item;
3117c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            for (j = 0; j < co->co_argcount; j++) {
3118c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PyObject *nm = co_varnames[j];
3119c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (nm == keyword)
3120c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    goto kw_found;
3121c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
3122c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            /* Slow fallback, just in case */
3123c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            for (j = 0; j < co->co_argcount; j++) {
3124c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PyObject *nm = co_varnames[j];
3125c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                int cmp = PyObject_RichCompareBool(
3126c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    keyword, nm, Py_EQ);
3127c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (cmp > 0)
3128c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    goto kw_found;
3129c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                else if (cmp < 0)
3130c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    goto fail;
3131c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
3132c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (kwdict == NULL) {
3133c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PyObject *kwd_str = kwd_as_string(keyword);
3134c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (kwd_str) {
3135c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    PyErr_Format(PyExc_TypeError,
3136c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                 "%.200s() got an unexpected "
3137c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                 "keyword argument '%.400s'",
3138c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                 PyString_AsString(co->co_name),
3139c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                 PyString_AsString(kwd_str));
3140c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    Py_DECREF(kwd_str);
3141c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                }
3142c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                goto fail;
3143c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
3144c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyDict_SetItem(kwdict, keyword, value);
3145c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            continue;
3146c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel          kw_found:
3147c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (GETLOCAL(j) != NULL) {
3148c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PyObject *kwd_str = kwd_as_string(keyword);
3149c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (kwd_str) {
3150c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    PyErr_Format(PyExc_TypeError,
3151c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                 "%.200s() got multiple "
3152c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                 "values for keyword "
3153c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                 "argument '%.400s'",
3154c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                 PyString_AsString(co->co_name),
3155c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                 PyString_AsString(kwd_str));
3156c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    Py_DECREF(kwd_str);
3157c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                }
3158c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                goto fail;
3159c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
3160c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_INCREF(value);
3161c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            SETLOCAL(j, value);
3162c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
3163c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (argcount < co->co_argcount) {
3164c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            int m = co->co_argcount - defcount;
3165c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            for (i = argcount; i < m; i++) {
3166c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (GETLOCAL(i) == NULL) {
3167c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    int j, given = 0;
3168c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    for (j = 0; j < co->co_argcount; j++)
3169c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        if (GETLOCAL(j))
3170c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                            given++;
3171c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    PyErr_Format(PyExc_TypeError,
3172c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        "%.200s() takes %s %d "
3173c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        "argument%s (%d given)",
3174c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        PyString_AsString(co->co_name),
3175c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        ((co->co_flags & CO_VARARGS) ||
3176c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                         defcount) ? "at least"
3177c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                   : "exactly",
3178c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        m, m == 1 ? "" : "s", given);
3179c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    goto fail;
3180c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                }
3181c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
3182c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (n > m)
3183c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                i = n - m;
3184c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            else
3185c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                i = 0;
3186c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            for (; i < defcount; i++) {
3187c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (GETLOCAL(m+i) == NULL) {
3188c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    PyObject *def = defs[i];
3189c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    Py_INCREF(def);
3190c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    SETLOCAL(m+i, def);
3191c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                }
3192c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
3193c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
3194c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
3195c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else if (argcount > 0 || kwcount > 0) {
3196c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyErr_Format(PyExc_TypeError,
3197c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                     "%.200s() takes no arguments (%d given)",
3198c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                     PyString_AsString(co->co_name),
3199c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                     argcount + kwcount);
3200c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        goto fail;
3201c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
3202c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* Allocate and initialize storage for cell vars, and copy free
3203c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       vars into frame.  This isn't too efficient right now. */
3204c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (PyTuple_GET_SIZE(co->co_cellvars)) {
3205c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        int i, j, nargs, found;
3206c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        char *cellname, *argname;
3207c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyObject *c;
3208c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3209c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        nargs = co->co_argcount;
3210c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (co->co_flags & CO_VARARGS)
3211c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            nargs++;
3212c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (co->co_flags & CO_VARKEYWORDS)
3213c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            nargs++;
3214c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3215c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* Initialize each cell var, taking into account
3216c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel           cell vars that are initialized from arguments.
3217c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3218c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel           Should arrange for the compiler to put cellvars
3219c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel           that are arguments at the beginning of the cellvars
3220c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel           list so that we can march over it more efficiently?
3221c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        */
3222c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        for (i = 0; i < PyTuple_GET_SIZE(co->co_cellvars); ++i) {
3223c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            cellname = PyString_AS_STRING(
3224c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PyTuple_GET_ITEM(co->co_cellvars, i));
3225c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            found = 0;
3226c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            for (j = 0; j < nargs; j++) {
3227c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                argname = PyString_AS_STRING(
3228c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    PyTuple_GET_ITEM(co->co_varnames, j));
3229c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (strcmp(cellname, argname) == 0) {
3230c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    c = PyCell_New(GETLOCAL(j));
3231c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    if (c == NULL)
3232c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        goto fail;
3233c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    GETLOCAL(co->co_nlocals + i) = c;
3234c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    found = 1;
3235c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    break;
3236c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                }
3237c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
3238c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (found == 0) {
3239c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                c = PyCell_New(NULL);
3240c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (c == NULL)
3241c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    goto fail;
3242c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                SETLOCAL(co->co_nlocals + i, c);
3243c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
3244c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
3245c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
3246c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (PyTuple_GET_SIZE(co->co_freevars)) {
3247c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        int i;
3248c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        for (i = 0; i < PyTuple_GET_SIZE(co->co_freevars); ++i) {
3249c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyObject *o = PyTuple_GET_ITEM(closure, i);
3250c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_INCREF(o);
3251c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            freevars[PyTuple_GET_SIZE(co->co_cellvars) + i] = o;
3252c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
3253c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
3254c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3255c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (co->co_flags & CO_GENERATOR) {
3256c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* Don't need to keep the reference to f_back, it will be set
3257c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel         * when the generator is resumed. */
3258c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_CLEAR(f->f_back);
3259c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3260c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PCALL(PCALL_GENERATOR);
3261c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3262c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* Create a new generator that owns the ready to run frame
3263c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel         * and return that as the value. */
3264c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return PyGen_New(f);
3265c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
3266c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3267c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    retval = PyEval_EvalFrameEx(f,0);
3268c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3269c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielfail: /* Jump here from prelude on failure */
3270c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3271c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* decref'ing the frame can cause __del__ methods to get invoked,
3272c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       which can call back into Python.  While we're done with the
3273c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       current Python frame (f), the associated C stack is still in use,
3274c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       so recursion_depth must be boosted for the duration.
3275c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    */
3276c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    assert(tstate != NULL);
3277c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    ++tstate->recursion_depth;
3278c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_DECREF(f);
3279c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    --tstate->recursion_depth;
3280c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return retval;
3281c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
3282c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3283c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3284c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *
3285c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielspecial_lookup(PyObject *o, char *meth, PyObject **cache)
3286c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
3287c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *res;
3288c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (PyInstance_Check(o)) {
3289c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!*cache)
3290c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return PyObject_GetAttrString(o, meth);
3291c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        else
3292c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return PyObject_GetAttr(o, *cache);
3293c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
3294c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    res = _PyObject_LookupSpecial(o, meth, cache);
3295c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (res == NULL && !PyErr_Occurred()) {
3296c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyErr_SetObject(PyExc_AttributeError, *cache);
3297c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
3298c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
3299c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return res;
3300c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
3301c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3302c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3303c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *
3304c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielkwd_as_string(PyObject *kwd) {
3305c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef Py_USING_UNICODE
3306c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (PyString_Check(kwd)) {
3307c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#else
3308c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        assert(PyString_Check(kwd));
3309c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
3310c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_INCREF(kwd);
3311c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return kwd;
3312c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef Py_USING_UNICODE
3313c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
3314c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return _PyUnicode_AsDefaultEncodedString(kwd, "replace");
3315c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
3316c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
3317c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3318c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3319c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Implementation notes for set_exc_info() and reset_exc_info():
3320c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3321c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel- Below, 'exc_ZZZ' stands for 'exc_type', 'exc_value' and
3322c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel  'exc_traceback'.  These always travel together.
3323c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3324c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel- tstate->curexc_ZZZ is the "hot" exception that is set by
3325c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel  PyErr_SetString(), cleared by PyErr_Clear(), and so on.
3326c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3327c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel- Once an exception is caught by an except clause, it is transferred
3328c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel  from tstate->curexc_ZZZ to tstate->exc_ZZZ, from which sys.exc_info()
3329c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel  can pick it up.  This is the primary task of set_exc_info().
3330c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel  XXX That can't be right:  set_exc_info() doesn't look at tstate->curexc_ZZZ.
3331c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3332c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel- Now let me explain the complicated dance with frame->f_exc_ZZZ.
3333c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3334c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel  Long ago, when none of this existed, there were just a few globals:
3335c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel  one set corresponding to the "hot" exception, and one set
3336c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel  corresponding to sys.exc_ZZZ.  (Actually, the latter weren't C
3337c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel  globals; they were simply stored as sys.exc_ZZZ.  For backwards
3338c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel  compatibility, they still are!)  The problem was that in code like
3339c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel  this:
3340c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3341c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel     try:
3342c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    "something that may fail"
3343c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel     except "some exception":
3344c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    "do something else first"
3345c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    "print the exception from sys.exc_ZZZ."
3346c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3347c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel  if "do something else first" invoked something that raised and caught
3348c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel  an exception, sys.exc_ZZZ were overwritten.  That was a frequent
3349c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel  cause of subtle bugs.  I fixed this by changing the semantics as
3350c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel  follows:
3351c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3352c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    - Within one frame, sys.exc_ZZZ will hold the last exception caught
3353c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel      *in that frame*.
3354c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3355c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    - But initially, and as long as no exception is caught in a given
3356c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel      frame, sys.exc_ZZZ will hold the last exception caught in the
3357c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel      previous frame (or the frame before that, etc.).
3358c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3359c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel  The first bullet fixed the bug in the above example.  The second
3360c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel  bullet was for backwards compatibility: it was (and is) common to
3361c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel  have a function that is called when an exception is caught, and to
3362c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel  have that function access the caught exception via sys.exc_ZZZ.
3363c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel  (Example: traceback.print_exc()).
3364c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3365c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel  At the same time I fixed the problem that sys.exc_ZZZ weren't
3366c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel  thread-safe, by introducing sys.exc_info() which gets it from tstate;
3367c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel  but that's really a separate improvement.
3368c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3369c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel  The reset_exc_info() function in ceval.c restores the tstate->exc_ZZZ
3370c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel  variables to what they were before the current frame was called.  The
3371c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel  set_exc_info() function saves them on the frame so that
3372c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel  reset_exc_info() can restore them.  The invariant is that
3373c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel  frame->f_exc_ZZZ is NULL iff the current frame never caught an
3374c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel  exception (where "catching" an exception applies only to successful
3375c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel  except clauses); and if the current frame ever caught an exception,
3376c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel  frame->f_exc_ZZZ is the exception that was stored in tstate->exc_ZZZ
3377c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel  at the start of the current frame.
3378c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3379c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel*/
3380c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3381c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic void
3382c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielset_exc_info(PyThreadState *tstate,
3383c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel             PyObject *type, PyObject *value, PyObject *tb)
3384c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
3385c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyFrameObject *frame = tstate->frame;
3386c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *tmp_type, *tmp_value, *tmp_tb;
3387c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3388c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    assert(type != NULL);
3389c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    assert(frame != NULL);
3390c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (frame->f_exc_type == NULL) {
3391c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        assert(frame->f_exc_value == NULL);
3392c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        assert(frame->f_exc_traceback == NULL);
3393c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* This frame didn't catch an exception before. */
3394c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* Save previous exception of this thread in this frame. */
3395c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (tstate->exc_type == NULL) {
3396c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            /* XXX Why is this set to Py_None? */
3397c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_INCREF(Py_None);
3398c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            tstate->exc_type = Py_None;
3399c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
3400c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_INCREF(tstate->exc_type);
3401c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_XINCREF(tstate->exc_value);
3402c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_XINCREF(tstate->exc_traceback);
3403c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        frame->f_exc_type = tstate->exc_type;
3404c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        frame->f_exc_value = tstate->exc_value;
3405c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        frame->f_exc_traceback = tstate->exc_traceback;
3406c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
3407c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* Set new exception for this thread. */
3408c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    tmp_type = tstate->exc_type;
3409c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    tmp_value = tstate->exc_value;
3410c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    tmp_tb = tstate->exc_traceback;
3411c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_INCREF(type);
3412c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_XINCREF(value);
3413c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_XINCREF(tb);
3414c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    tstate->exc_type = type;
3415c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    tstate->exc_value = value;
3416c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    tstate->exc_traceback = tb;
3417c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_XDECREF(tmp_type);
3418c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_XDECREF(tmp_value);
3419c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_XDECREF(tmp_tb);
3420c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* For b/w compatibility */
3421c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PySys_SetObject("exc_type", type);
3422c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PySys_SetObject("exc_value", value);
3423c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PySys_SetObject("exc_traceback", tb);
3424c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
3425c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3426c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic void
3427c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielreset_exc_info(PyThreadState *tstate)
3428c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
3429c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyFrameObject *frame;
3430c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *tmp_type, *tmp_value, *tmp_tb;
3431c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3432c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* It's a precondition that the thread state's frame caught an
3433c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel     * exception -- verify in a debug build.
3434c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel     */
3435c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    assert(tstate != NULL);
3436c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    frame = tstate->frame;
3437c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    assert(frame != NULL);
3438c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    assert(frame->f_exc_type != NULL);
3439c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3440c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* Copy the frame's exception info back to the thread state. */
3441c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    tmp_type = tstate->exc_type;
3442c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    tmp_value = tstate->exc_value;
3443c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    tmp_tb = tstate->exc_traceback;
3444c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_INCREF(frame->f_exc_type);
3445c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_XINCREF(frame->f_exc_value);
3446c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_XINCREF(frame->f_exc_traceback);
3447c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    tstate->exc_type = frame->f_exc_type;
3448c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    tstate->exc_value = frame->f_exc_value;
3449c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    tstate->exc_traceback = frame->f_exc_traceback;
3450c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_XDECREF(tmp_type);
3451c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_XDECREF(tmp_value);
3452c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_XDECREF(tmp_tb);
3453c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3454c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* For b/w compatibility */
3455c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PySys_SetObject("exc_type", frame->f_exc_type);
3456c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PySys_SetObject("exc_value", frame->f_exc_value);
3457c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PySys_SetObject("exc_traceback", frame->f_exc_traceback);
3458c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3459c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* Clear the frame's exception info. */
3460c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    tmp_type = frame->f_exc_type;
3461c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    tmp_value = frame->f_exc_value;
3462c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    tmp_tb = frame->f_exc_traceback;
3463c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    frame->f_exc_type = NULL;
3464c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    frame->f_exc_value = NULL;
3465c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    frame->f_exc_traceback = NULL;
3466c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_DECREF(tmp_type);
3467c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_XDECREF(tmp_value);
3468c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_XDECREF(tmp_tb);
3469c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
3470c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3471c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Logic for the raise statement (too complicated for inlining).
3472c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   This *consumes* a reference count to each of its arguments. */
3473c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic enum why_code
3474c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanieldo_raise(PyObject *type, PyObject *value, PyObject *tb)
3475c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
3476c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (type == NULL) {
3477c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* Reraise */
3478c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyThreadState *tstate = PyThreadState_GET();
3479c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
3480c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        value = tstate->exc_value;
3481c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        tb = tstate->exc_traceback;
3482c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_XINCREF(type);
3483c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_XINCREF(value);
3484c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_XINCREF(tb);
3485c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
3486c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3487c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* We support the following forms of raise:
3488c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       raise <class>, <classinstance>
3489c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       raise <class>, <argument tuple>
3490c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       raise <class>, None
3491c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       raise <class>, <argument>
3492c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       raise <classinstance>, None
3493c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       raise <string>, <object>
3494c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       raise <string>, None
3495c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3496c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       An omitted second argument is the same as None.
3497c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3498c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       In addition, raise <tuple>, <anything> is the same as
3499c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       raising the tuple's first item (and it better have one!);
3500c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       this rule is applied recursively.
3501c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3502c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       Finally, an optional third argument can be supplied, which
3503c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       gives the traceback to be substituted (useful when
3504c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       re-raising an exception after examining it).  */
3505c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3506c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* First, check the traceback argument, replacing None with
3507c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       NULL. */
3508c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (tb == Py_None) {
3509c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_DECREF(tb);
3510c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        tb = NULL;
3511c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
3512c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else if (tb != NULL && !PyTraceBack_Check(tb)) {
3513c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyErr_SetString(PyExc_TypeError,
3514c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                   "raise: arg 3 must be a traceback or None");
3515c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        goto raise_error;
3516c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
3517c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3518c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* Next, replace a missing value with None */
3519c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (value == NULL) {
3520c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        value = Py_None;
3521c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_INCREF(value);
3522c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
3523c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3524c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* Next, repeatedly, replace a tuple exception with its first item */
3525c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
3526c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyObject *tmp = type;
3527c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        type = PyTuple_GET_ITEM(type, 0);
3528c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_INCREF(type);
3529c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_DECREF(tmp);
3530c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
3531c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3532c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (PyExceptionClass_Check(type)) {
3533c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyErr_NormalizeException(&type, &value, &tb);
3534c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!PyExceptionInstance_Check(value)) {
3535c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyErr_Format(PyExc_TypeError,
3536c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                         "calling %s() should have returned an instance of "
3537c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                         "BaseException, not '%s'",
3538c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                         ((PyTypeObject *)type)->tp_name,
3539c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                         Py_TYPE(value)->tp_name);
3540c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            goto raise_error;
3541c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
3542c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
3543c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else if (PyExceptionInstance_Check(type)) {
3544c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* Raising an instance.  The value should be a dummy. */
3545c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (value != Py_None) {
3546c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyErr_SetString(PyExc_TypeError,
3547c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel              "instance exception may not have a separate value");
3548c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            goto raise_error;
3549c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
3550c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        else {
3551c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            /* Normalize to raise <class>, <instance> */
3552c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(value);
3553c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            value = type;
3554c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            type = PyExceptionInstance_Class(type);
3555c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_INCREF(type);
3556c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
3557c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
3558c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else {
3559c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* Not something you can raise.  You get an exception
3560c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel           anyway, just not what you specified :-) */
3561c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyErr_Format(PyExc_TypeError,
3562c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                     "exceptions must be old-style classes or "
3563c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                     "derived from BaseException, not %s",
3564c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                     type->ob_type->tp_name);
3565c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        goto raise_error;
3566c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
3567c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3568c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    assert(PyExceptionClass_Check(type));
3569c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (Py_Py3kWarningFlag && PyClass_Check(type)) {
3570c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (PyErr_WarnEx(PyExc_DeprecationWarning,
3571c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        "exceptions must derive from BaseException "
3572c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        "in 3.x", 1) < 0)
3573c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            goto raise_error;
3574c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
3575c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3576c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyErr_Restore(type, value, tb);
3577c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (tb == NULL)
3578c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return WHY_EXCEPTION;
3579c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else
3580c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return WHY_RERAISE;
3581c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel raise_error:
3582c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_XDECREF(value);
3583c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_XDECREF(type);
3584c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_XDECREF(tb);
3585c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return WHY_EXCEPTION;
3586c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
3587c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3588c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Iterate v argcnt times and store the results on the stack (via decreasing
3589c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   sp).  Return 1 for success, 0 if error. */
3590c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3591c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic int
3592c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielunpack_iterable(PyObject *v, int argcnt, PyObject **sp)
3593c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
3594c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int i = 0;
3595c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *it;  /* iter(v) */
3596c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *w;
3597c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3598c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    assert(v != NULL);
3599c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3600c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    it = PyObject_GetIter(v);
3601c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (it == NULL)
3602c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        goto Error;
3603c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3604c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    for (; i < argcnt; i++) {
3605c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        w = PyIter_Next(it);
3606c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (w == NULL) {
3607c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            /* Iterator done, via error or exhaustion. */
3608c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (!PyErr_Occurred()) {
3609c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PyErr_Format(PyExc_ValueError,
3610c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    "need more than %d value%s to unpack",
3611c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    i, i == 1 ? "" : "s");
3612c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
3613c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            goto Error;
3614c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
3615c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        *--sp = w;
3616c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
3617c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3618c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* We better have exhausted the iterator now. */
3619c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    w = PyIter_Next(it);
3620c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (w == NULL) {
3621c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (PyErr_Occurred())
3622c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            goto Error;
3623c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_DECREF(it);
3624c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return 1;
3625c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
3626c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_DECREF(w);
3627c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyErr_SetString(PyExc_ValueError, "too many values to unpack");
3628c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* fall through */
3629c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielError:
3630c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    for (; i > 0; i--, sp++)
3631c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_DECREF(*sp);
3632c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_XDECREF(it);
3633c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return 0;
3634c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
3635c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3636c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3637c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef LLTRACE
3638c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic int
3639c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielprtrace(PyObject *v, char *str)
3640c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
3641c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    printf("%s ", str);
3642c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (PyObject_Print(v, stdout, 0) != 0)
3643c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyErr_Clear(); /* Don't know what else to do */
3644c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    printf("\n");
3645c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return 1;
3646c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
3647c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
3648c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3649c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic void
3650c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielcall_exc_trace(Py_tracefunc func, PyObject *self, PyFrameObject *f)
3651c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
3652c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *type, *value, *traceback, *arg;
3653c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int err;
3654c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyErr_Fetch(&type, &value, &traceback);
3655c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (value == NULL) {
3656c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        value = Py_None;
3657c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_INCREF(value);
3658c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
3659c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    arg = PyTuple_Pack(3, type, value, traceback);
3660c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (arg == NULL) {
3661c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyErr_Restore(type, value, traceback);
3662c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return;
3663c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
3664c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    err = call_trace(func, self, f, PyTrace_EXCEPTION, arg);
3665c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_DECREF(arg);
3666c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (err == 0)
3667c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyErr_Restore(type, value, traceback);
3668c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else {
3669c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_XDECREF(type);
3670c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_XDECREF(value);
3671c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_XDECREF(traceback);
3672c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
3673c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
3674c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3675c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic int
3676c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielcall_trace_protected(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
3677c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                     int what, PyObject *arg)
3678c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
3679c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *type, *value, *traceback;
3680c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int err;
3681c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyErr_Fetch(&type, &value, &traceback);
3682c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    err = call_trace(func, obj, frame, what, arg);
3683c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (err == 0)
3684c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    {
3685c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyErr_Restore(type, value, traceback);
3686c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return 0;
3687c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
3688c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else {
3689c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_XDECREF(type);
3690c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_XDECREF(value);
3691c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_XDECREF(traceback);
3692c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return -1;
3693c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
3694c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
3695c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3696c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic int
3697c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielcall_trace(Py_tracefunc func, PyObject *obj, PyFrameObject *frame,
3698c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel           int what, PyObject *arg)
3699c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
3700c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    register PyThreadState *tstate = frame->f_tstate;
3701c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int result;
3702c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (tstate->tracing)
3703c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return 0;
3704c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    tstate->tracing++;
3705c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    tstate->use_tracing = 0;
3706c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    result = func(obj, frame, what, arg);
3707c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    tstate->use_tracing = ((tstate->c_tracefunc != NULL)
3708c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                           || (tstate->c_profilefunc != NULL));
3709c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    tstate->tracing--;
3710c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return result;
3711c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
3712c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3713c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyObject *
3714c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel_PyEval_CallTracing(PyObject *func, PyObject *args)
3715c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
3716c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyFrameObject *frame = PyEval_GetFrame();
3717c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyThreadState *tstate = frame->f_tstate;
3718c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int save_tracing = tstate->tracing;
3719c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int save_use_tracing = tstate->use_tracing;
3720c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *result;
3721c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3722c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    tstate->tracing = 0;
3723c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    tstate->use_tracing = ((tstate->c_tracefunc != NULL)
3724c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                           || (tstate->c_profilefunc != NULL));
3725c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    result = PyObject_Call(func, args, NULL);
3726c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    tstate->tracing = save_tracing;
3727c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    tstate->use_tracing = save_use_tracing;
3728c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return result;
3729c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
3730c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3731c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* See Objects/lnotab_notes.txt for a description of how tracing works. */
3732c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic int
3733c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielmaybe_call_line_trace(Py_tracefunc func, PyObject *obj,
3734c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                      PyFrameObject *frame, int *instr_lb, int *instr_ub,
3735c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                      int *instr_prev)
3736c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
3737c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int result = 0;
3738c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int line = frame->f_lineno;
3739c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3740c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* If the last instruction executed isn't in the current
3741c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       instruction window, reset the window.
3742c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    */
3743c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (frame->f_lasti < *instr_lb || frame->f_lasti >= *instr_ub) {
3744c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyAddrPair bounds;
3745c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        line = _PyCode_CheckLineNumber(frame->f_code, frame->f_lasti,
3746c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                       &bounds);
3747c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        *instr_lb = bounds.ap_lower;
3748c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        *instr_ub = bounds.ap_upper;
3749c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
3750c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* If the last instruction falls at the start of a line or if
3751c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       it represents a jump backwards, update the frame's line
3752c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       number and call the trace function. */
3753c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (frame->f_lasti == *instr_lb || frame->f_lasti < *instr_prev) {
3754c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        frame->f_lineno = line;
3755c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        result = call_trace(func, obj, frame, PyTrace_LINE, Py_None);
3756c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
3757c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    *instr_prev = frame->f_lasti;
3758c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return result;
3759c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
3760c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3761c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielvoid
3762c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyEval_SetProfile(Py_tracefunc func, PyObject *arg)
3763c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
3764c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyThreadState *tstate = PyThreadState_GET();
3765c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *temp = tstate->c_profileobj;
3766c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_XINCREF(arg);
3767c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    tstate->c_profilefunc = NULL;
3768c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    tstate->c_profileobj = NULL;
3769c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* Must make sure that tracing is not ignored if 'temp' is freed */
3770c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    tstate->use_tracing = tstate->c_tracefunc != NULL;
3771c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_XDECREF(temp);
3772c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    tstate->c_profilefunc = func;
3773c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    tstate->c_profileobj = arg;
3774c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* Flag that tracing or profiling is turned on */
3775c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    tstate->use_tracing = (func != NULL) || (tstate->c_tracefunc != NULL);
3776c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
3777c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3778c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielvoid
3779c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyEval_SetTrace(Py_tracefunc func, PyObject *arg)
3780c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
3781c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyThreadState *tstate = PyThreadState_GET();
3782c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *temp = tstate->c_traceobj;
3783c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    _Py_TracingPossible += (func != NULL) - (tstate->c_tracefunc != NULL);
3784c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_XINCREF(arg);
3785c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    tstate->c_tracefunc = NULL;
3786c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    tstate->c_traceobj = NULL;
3787c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* Must make sure that profiling is not ignored if 'temp' is freed */
3788c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    tstate->use_tracing = tstate->c_profilefunc != NULL;
3789c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_XDECREF(temp);
3790c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    tstate->c_tracefunc = func;
3791c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    tstate->c_traceobj = arg;
3792c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* Flag that tracing or profiling is turned on */
3793c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    tstate->use_tracing = ((func != NULL)
3794c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                           || (tstate->c_profilefunc != NULL));
3795c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
3796c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3797c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyObject *
3798c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyEval_GetBuiltins(void)
3799c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
3800c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyFrameObject *current_frame = PyEval_GetFrame();
3801c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (current_frame == NULL)
3802c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return PyThreadState_GET()->interp->builtins;
3803c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else
3804c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return current_frame->f_builtins;
3805c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
3806c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3807c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyObject *
3808c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyEval_GetLocals(void)
3809c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
3810c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyFrameObject *current_frame = PyEval_GetFrame();
3811c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (current_frame == NULL)
3812c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
3813c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyFrame_FastToLocals(current_frame);
3814c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return current_frame->f_locals;
3815c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
3816c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3817c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyObject *
3818c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyEval_GetGlobals(void)
3819c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
3820c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyFrameObject *current_frame = PyEval_GetFrame();
3821c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (current_frame == NULL)
3822c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
3823c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else
3824c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return current_frame->f_globals;
3825c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
3826c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3827c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyFrameObject *
3828c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyEval_GetFrame(void)
3829c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
3830c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyThreadState *tstate = PyThreadState_GET();
3831c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return _PyThreadState_GetFrame(tstate);
3832c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
3833c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3834c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielint
3835c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyEval_GetRestricted(void)
3836c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
3837c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyFrameObject *current_frame = PyEval_GetFrame();
3838c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return current_frame == NULL ? 0 : PyFrame_IsRestricted(current_frame);
3839c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
3840c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3841c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielint
3842c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyEval_MergeCompilerFlags(PyCompilerFlags *cf)
3843c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
3844c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyFrameObject *current_frame = PyEval_GetFrame();
3845c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int result = cf->cf_flags != 0;
3846c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3847c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (current_frame != NULL) {
3848c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        const int codeflags = current_frame->f_code->co_flags;
3849c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        const int compilerflags = codeflags & PyCF_MASK;
3850c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (compilerflags) {
3851c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            result = 1;
3852c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            cf->cf_flags |= compilerflags;
3853c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
3854c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#if 0 /* future keyword */
3855c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (codeflags & CO_GENERATOR_ALLOWED) {
3856c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            result = 1;
3857c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            cf->cf_flags |= CO_GENERATOR_ALLOWED;
3858c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
3859c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
3860c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
3861c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return result;
3862c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
3863c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3864c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielint
3865c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPy_FlushLine(void)
3866c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
3867c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *f = PySys_GetObject("stdout");
3868c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (f == NULL)
3869c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return 0;
3870c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!PyFile_SoftSpace(f, 0))
3871c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return 0;
3872c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return PyFile_WriteString("\n", f);
3873c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
3874c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3875c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3876c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* External interface to call any callable object.
3877c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   The arg must be a tuple or NULL.  The kw must be a dict or NULL. */
3878c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3879c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyObject *
3880c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
3881c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
3882c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *result;
3883c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3884c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (arg == NULL) {
3885c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        arg = PyTuple_New(0);
3886c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (arg == NULL)
3887c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
3888c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
3889c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else if (!PyTuple_Check(arg)) {
3890c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyErr_SetString(PyExc_TypeError,
3891c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        "argument list must be a tuple");
3892c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
3893c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
3894c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else
3895c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_INCREF(arg);
3896c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3897c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (kw != NULL && !PyDict_Check(kw)) {
3898c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyErr_SetString(PyExc_TypeError,
3899c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        "keyword list must be a dictionary");
3900c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_DECREF(arg);
3901c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
3902c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
3903c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3904c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    result = PyObject_Call(func, arg, kw);
3905c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_DECREF(arg);
3906c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return result;
3907c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
3908c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3909c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielconst char *
3910c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyEval_GetFuncName(PyObject *func)
3911c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
3912c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (PyMethod_Check(func))
3913c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return PyEval_GetFuncName(PyMethod_GET_FUNCTION(func));
3914c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else if (PyFunction_Check(func))
3915c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return PyString_AsString(((PyFunctionObject*)func)->func_name);
3916c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else if (PyCFunction_Check(func))
3917c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return ((PyCFunctionObject*)func)->m_ml->ml_name;
3918c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else if (PyClass_Check(func))
3919c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return PyString_AsString(((PyClassObject*)func)->cl_name);
3920c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else if (PyInstance_Check(func)) {
3921c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return PyString_AsString(
3922c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            ((PyInstanceObject*)func)->in_class->cl_name);
3923c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    } else {
3924c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return func->ob_type->tp_name;
3925c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
3926c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
3927c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3928c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielconst char *
3929c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyEval_GetFuncDesc(PyObject *func)
3930c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
3931c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (PyMethod_Check(func))
3932c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return "()";
3933c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else if (PyFunction_Check(func))
3934c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return "()";
3935c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else if (PyCFunction_Check(func))
3936c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return "()";
3937c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else if (PyClass_Check(func))
3938c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return " constructor";
3939c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else if (PyInstance_Check(func)) {
3940c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return " instance";
3941c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    } else {
3942c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return " object";
3943c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
3944c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
3945c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3946c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic void
3947c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielerr_args(PyObject *func, int flags, int nargs)
3948c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
3949c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (flags & METH_NOARGS)
3950c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyErr_Format(PyExc_TypeError,
3951c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                     "%.200s() takes no arguments (%d given)",
3952c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                     ((PyCFunctionObject *)func)->m_ml->ml_name,
3953c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                     nargs);
3954c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else
3955c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyErr_Format(PyExc_TypeError,
3956c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                     "%.200s() takes exactly one argument (%d given)",
3957c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                     ((PyCFunctionObject *)func)->m_ml->ml_name,
3958c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                     nargs);
3959c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
3960c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3961c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define C_TRACE(x, call) \
3962c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielif (tstate->use_tracing && tstate->c_profilefunc) { \
3963c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (call_trace(tstate->c_profilefunc, \
3964c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        tstate->c_profileobj, \
3965c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        tstate->frame, PyTrace_C_CALL, \
3966c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        func)) { \
3967c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        x = NULL; \
3968c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    } \
3969c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else { \
3970c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        x = call; \
3971c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (tstate->c_profilefunc != NULL) { \
3972c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (x == NULL) { \
3973c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                call_trace_protected(tstate->c_profilefunc, \
3974c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    tstate->c_profileobj, \
3975c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    tstate->frame, PyTrace_C_EXCEPTION, \
3976c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    func); \
3977c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                /* XXX should pass (type, value, tb) */ \
3978c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            } else { \
3979c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (call_trace(tstate->c_profilefunc, \
3980c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    tstate->c_profileobj, \
3981c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    tstate->frame, PyTrace_C_RETURN, \
3982c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    func)) { \
3983c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    Py_DECREF(x); \
3984c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    x = NULL; \
3985c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                } \
3986c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            } \
3987c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        } \
3988c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    } \
3989c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} else { \
3990c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    x = call; \
3991c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
3992c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3993c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *
3994c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielcall_function(PyObject ***pp_stack, int oparg
3995c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef WITH_TSC
3996c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                , uint64* pintr0, uint64* pintr1
3997c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
3998c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                )
3999c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
4000c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int na = oparg & 0xff;
4001c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int nk = (oparg>>8) & 0xff;
4002c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int n = na + 2 * nk;
4003c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject **pfunc = (*pp_stack) - n - 1;
4004c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *func = *pfunc;
4005c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *x, *w;
4006c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
4007c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* Always dispatch PyCFunction first, because these are
4008c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       presumed to be the most frequent callable object.
4009c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    */
4010c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (PyCFunction_Check(func) && nk == 0) {
4011c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        int flags = PyCFunction_GET_FLAGS(func);
4012c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyThreadState *tstate = PyThreadState_GET();
4013c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
4014c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PCALL(PCALL_CFUNCTION);
4015c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (flags & (METH_NOARGS | METH_O)) {
4016c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyCFunction meth = PyCFunction_GET_FUNCTION(func);
4017c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyObject *self = PyCFunction_GET_SELF(func);
4018c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (flags & METH_NOARGS && na == 0) {
4019c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                C_TRACE(x, (*meth)(self,NULL));
4020c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
4021c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            else if (flags & METH_O && na == 1) {
4022c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PyObject *arg = EXT_POP(*pp_stack);
4023c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                C_TRACE(x, (*meth)(self,arg));
4024c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_DECREF(arg);
4025c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
4026c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            else {
4027c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                err_args(func, flags, na);
4028c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                x = NULL;
4029c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
4030c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
4031c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        else {
4032c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyObject *callargs;
4033c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            callargs = load_args(pp_stack, na);
4034c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            READ_TIMESTAMP(*pintr0);
4035c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            C_TRACE(x, PyCFunction_Call(func,callargs,NULL));
4036c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            READ_TIMESTAMP(*pintr1);
4037c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_XDECREF(callargs);
4038c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
4039c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    } else {
4040c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (PyMethod_Check(func) && PyMethod_GET_SELF(func) != NULL) {
4041c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            /* optimize access to bound methods */
4042c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyObject *self = PyMethod_GET_SELF(func);
4043c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PCALL(PCALL_METHOD);
4044c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PCALL(PCALL_BOUND_METHOD);
4045c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_INCREF(self);
4046c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            func = PyMethod_GET_FUNCTION(func);
4047c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_INCREF(func);
4048c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(*pfunc);
4049c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            *pfunc = self;
4050c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            na++;
4051c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            n++;
4052c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        } else
4053c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_INCREF(func);
4054c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        READ_TIMESTAMP(*pintr0);
4055c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (PyFunction_Check(func))
4056c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            x = fast_function(func, pp_stack, n, na, nk);
4057c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        else
4058c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            x = do_call(func, pp_stack, na, nk);
4059c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        READ_TIMESTAMP(*pintr1);
4060c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_DECREF(func);
4061c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
4062c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
4063c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* Clear the stack of the function object.  Also removes
4064c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       the arguments in case they weren't consumed already
4065c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       (fast_function() and err_args() leave them on the stack).
4066c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel     */
4067c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    while ((*pp_stack) > pfunc) {
4068c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        w = EXT_POP(*pp_stack);
4069c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_DECREF(w);
4070c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PCALL(PCALL_POP);
4071c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
4072c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return x;
4073c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
4074c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
4075c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* The fast_function() function optimize calls for which no argument
4076c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   tuple is necessary; the objects are passed directly from the stack.
4077c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   For the simplest case -- a function that takes only positional
4078c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   arguments and is called with only positional arguments -- it
4079c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   inlines the most primitive frame setup code from
4080c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   PyEval_EvalCodeEx(), which vastly reduces the checks that must be
4081c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   done before evaluating the frame.
4082c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel*/
4083c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
4084c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *
4085c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielfast_function(PyObject *func, PyObject ***pp_stack, int n, int na, int nk)
4086c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
4087c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func);
4088c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *globals = PyFunction_GET_GLOBALS(func);
4089c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
4090c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject **d = NULL;
4091c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int nd = 0;
4092c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
4093c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PCALL(PCALL_FUNCTION);
4094c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PCALL(PCALL_FAST_FUNCTION);
4095c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (argdefs == NULL && co->co_argcount == n && nk==0 &&
4096c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        co->co_flags == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE)) {
4097c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyFrameObject *f;
4098c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyObject *retval = NULL;
4099c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyThreadState *tstate = PyThreadState_GET();
4100c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyObject **fastlocals, **stack;
4101c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        int i;
4102c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
4103c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PCALL(PCALL_FASTER_FUNCTION);
4104c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        assert(globals != NULL);
4105c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* XXX Perhaps we should create a specialized
4106c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel           PyFrame_New() that doesn't take locals, but does
4107c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel           take builtins without sanity checking them.
4108c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        */
4109c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        assert(tstate != NULL);
4110c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        f = PyFrame_New(tstate, co, globals, NULL);
4111c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (f == NULL)
4112c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
4113c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
4114c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        fastlocals = f->f_localsplus;
4115c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        stack = (*pp_stack) - n;
4116c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
4117c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        for (i = 0; i < n; i++) {
4118c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_INCREF(*stack);
4119c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            fastlocals[i] = *stack++;
4120c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
4121c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        retval = PyEval_EvalFrameEx(f,0);
4122c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        ++tstate->recursion_depth;
4123c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_DECREF(f);
4124c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        --tstate->recursion_depth;
4125c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return retval;
4126c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
4127c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (argdefs != NULL) {
4128c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        d = &PyTuple_GET_ITEM(argdefs, 0);
4129c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        nd = Py_SIZE(argdefs);
4130c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
4131c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return PyEval_EvalCodeEx(co, globals,
4132c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                             (PyObject *)NULL, (*pp_stack)-n, na,
4133c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                             (*pp_stack)-2*nk, nk, d, nd,
4134c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                             PyFunction_GET_CLOSURE(func));
4135c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
4136c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
4137c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *
4138c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielupdate_keyword_args(PyObject *orig_kwdict, int nk, PyObject ***pp_stack,
4139c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    PyObject *func)
4140c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
4141c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *kwdict = NULL;
4142c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (orig_kwdict == NULL)
4143c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        kwdict = PyDict_New();
4144c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else {
4145c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        kwdict = PyDict_Copy(orig_kwdict);
4146c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_DECREF(orig_kwdict);
4147c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
4148c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (kwdict == NULL)
4149c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
4150c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    while (--nk >= 0) {
4151c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        int err;
4152c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyObject *value = EXT_POP(*pp_stack);
4153c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyObject *key = EXT_POP(*pp_stack);
4154c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (PyDict_GetItem(kwdict, key) != NULL) {
4155c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyErr_Format(PyExc_TypeError,
4156c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                         "%.200s%s got multiple values "
4157c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                         "for keyword argument '%.200s'",
4158c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                         PyEval_GetFuncName(func),
4159c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                         PyEval_GetFuncDesc(func),
4160c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                         PyString_AsString(key));
4161c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(key);
4162c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(value);
4163c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(kwdict);
4164c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
4165c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
4166c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        err = PyDict_SetItem(kwdict, key, value);
4167c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_DECREF(key);
4168c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_DECREF(value);
4169c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (err) {
4170c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(kwdict);
4171c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
4172c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
4173c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
4174c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return kwdict;
4175c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
4176c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
4177c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *
4178c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielupdate_star_args(int nstack, int nstar, PyObject *stararg,
4179c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                 PyObject ***pp_stack)
4180c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
4181c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *callargs, *w;
4182c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
4183c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    callargs = PyTuple_New(nstack + nstar);
4184c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (callargs == NULL) {
4185c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
4186c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
4187c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (nstar) {
4188c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        int i;
4189c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        for (i = 0; i < nstar; i++) {
4190c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyObject *a = PyTuple_GET_ITEM(stararg, i);
4191c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_INCREF(a);
4192c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyTuple_SET_ITEM(callargs, nstack + i, a);
4193c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
4194c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
4195c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    while (--nstack >= 0) {
4196c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        w = EXT_POP(*pp_stack);
4197c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyTuple_SET_ITEM(callargs, nstack, w);
4198c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
4199c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return callargs;
4200c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
4201c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
4202c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *
4203c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielload_args(PyObject ***pp_stack, int na)
4204c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
4205c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *args = PyTuple_New(na);
4206c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *w;
4207c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
4208c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (args == NULL)
4209c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
4210c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    while (--na >= 0) {
4211c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        w = EXT_POP(*pp_stack);
4212c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyTuple_SET_ITEM(args, na, w);
4213c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
4214c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return args;
4215c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
4216c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
4217c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *
4218c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanieldo_call(PyObject *func, PyObject ***pp_stack, int na, int nk)
4219c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
4220c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *callargs = NULL;
4221c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *kwdict = NULL;
4222c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *result = NULL;
4223c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
4224c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (nk > 0) {
4225c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        kwdict = update_keyword_args(NULL, nk, pp_stack, func);
4226c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (kwdict == NULL)
4227c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            goto call_fail;
4228c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
4229c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    callargs = load_args(pp_stack, na);
4230c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (callargs == NULL)
4231c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        goto call_fail;
4232c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef CALL_PROFILE
4233c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* At this point, we have to look at the type of func to
4234c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       update the call stats properly.  Do it here so as to avoid
4235c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       exposing the call stats machinery outside ceval.c
4236c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    */
4237c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (PyFunction_Check(func))
4238c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PCALL(PCALL_FUNCTION);
4239c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else if (PyMethod_Check(func))
4240c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PCALL(PCALL_METHOD);
4241c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else if (PyType_Check(func))
4242c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PCALL(PCALL_TYPE);
4243c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else if (PyCFunction_Check(func))
4244c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PCALL(PCALL_CFUNCTION);
4245c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else
4246c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PCALL(PCALL_OTHER);
4247c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
4248c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (PyCFunction_Check(func)) {
4249c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyThreadState *tstate = PyThreadState_GET();
4250c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        C_TRACE(result, PyCFunction_Call(func, callargs, kwdict));
4251c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
4252c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else
4253c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        result = PyObject_Call(func, callargs, kwdict);
4254c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel call_fail:
4255c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_XDECREF(callargs);
4256c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_XDECREF(kwdict);
4257c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return result;
4258c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
4259c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
4260c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *
4261c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)
4262c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
4263c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int nstar = 0;
4264c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *callargs = NULL;
4265c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *stararg = NULL;
4266c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *kwdict = NULL;
4267c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *result = NULL;
4268c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
4269c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (flags & CALL_FLAG_KW) {
4270c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        kwdict = EXT_POP(*pp_stack);
4271c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!PyDict_Check(kwdict)) {
4272c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyObject *d;
4273c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            d = PyDict_New();
4274c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (d == NULL)
4275c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                goto ext_call_fail;
4276c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (PyDict_Update(d, kwdict) != 0) {
4277c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_DECREF(d);
4278c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                /* PyDict_Update raises attribute
4279c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                 * error (percolated from an attempt
4280c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                 * to get 'keys' attribute) instead of
4281c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                 * a type error if its second argument
4282c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                 * is not a mapping.
4283c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                 */
4284c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
4285c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    PyErr_Format(PyExc_TypeError,
4286c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                 "%.200s%.200s argument after ** "
4287c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                 "must be a mapping, not %.200s",
4288c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                 PyEval_GetFuncName(func),
4289c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                 PyEval_GetFuncDesc(func),
4290c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                 kwdict->ob_type->tp_name);
4291c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                }
4292c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                goto ext_call_fail;
4293c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
4294c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(kwdict);
4295c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            kwdict = d;
4296c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
4297c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
4298c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (flags & CALL_FLAG_VAR) {
4299c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        stararg = EXT_POP(*pp_stack);
4300c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!PyTuple_Check(stararg)) {
4301c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyObject *t = NULL;
4302c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            t = PySequence_Tuple(stararg);
4303c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (t == NULL) {
4304c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (PyErr_ExceptionMatches(PyExc_TypeError)) {
4305c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    PyErr_Format(PyExc_TypeError,
4306c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                 "%.200s%.200s argument after * "
4307c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                 "must be a sequence, not %200s",
4308c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                 PyEval_GetFuncName(func),
4309c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                 PyEval_GetFuncDesc(func),
4310c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                 stararg->ob_type->tp_name);
4311c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                }
4312c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                goto ext_call_fail;
4313c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
4314c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(stararg);
4315c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            stararg = t;
4316c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
4317c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        nstar = PyTuple_GET_SIZE(stararg);
4318c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
4319c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (nk > 0) {
4320c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        kwdict = update_keyword_args(kwdict, nk, pp_stack, func);
4321c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (kwdict == NULL)
4322c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            goto ext_call_fail;
4323c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
4324c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    callargs = update_star_args(na, nstar, stararg, pp_stack);
4325c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (callargs == NULL)
4326c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        goto ext_call_fail;
4327c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef CALL_PROFILE
4328c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* At this point, we have to look at the type of func to
4329c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       update the call stats properly.  Do it here so as to avoid
4330c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       exposing the call stats machinery outside ceval.c
4331c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    */
4332c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (PyFunction_Check(func))
4333c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PCALL(PCALL_FUNCTION);
4334c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else if (PyMethod_Check(func))
4335c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PCALL(PCALL_METHOD);
4336c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else if (PyType_Check(func))
4337c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PCALL(PCALL_TYPE);
4338c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else if (PyCFunction_Check(func))
4339c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PCALL(PCALL_CFUNCTION);
4340c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else
4341c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PCALL(PCALL_OTHER);
4342c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
4343c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (PyCFunction_Check(func)) {
4344c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyThreadState *tstate = PyThreadState_GET();
4345c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        C_TRACE(result, PyCFunction_Call(func, callargs, kwdict));
4346c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
4347c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else
4348c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        result = PyObject_Call(func, callargs, kwdict);
4349c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielext_call_fail:
4350c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_XDECREF(callargs);
4351c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_XDECREF(kwdict);
4352c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_XDECREF(stararg);
4353c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return result;
4354c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
4355c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
4356c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Extract a slice index from a PyInt or PyLong or an object with the
4357c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   nb_index slot defined, and store in *pi.
4358c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   Silently reduce values larger than PY_SSIZE_T_MAX to PY_SSIZE_T_MAX,
4359c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   and silently boost values less than -PY_SSIZE_T_MAX-1 to -PY_SSIZE_T_MAX-1.
4360c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   Return 0 on error, 1 on success.
4361c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel*/
4362c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Note:  If v is NULL, return success without storing into *pi.  This
4363c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   is because_PyEval_SliceIndex() is called by apply_slice(), which can be
4364c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   called by the SLICE opcode with v and/or w equal to NULL.
4365c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel*/
4366c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielint
4367c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel_PyEval_SliceIndex(PyObject *v, Py_ssize_t *pi)
4368c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
4369c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (v != NULL) {
4370c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_ssize_t x;
4371c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (PyInt_Check(v)) {
4372c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            /* XXX(nnorwitz): I think PyInt_AS_LONG is correct,
4373c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel               however, it looks like it should be AsSsize_t.
4374c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel               There should be a comment here explaining why.
4375c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            */
4376c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            x = PyInt_AS_LONG(v);
4377c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
4378c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        else if (PyIndex_Check(v)) {
4379c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            x = PyNumber_AsSsize_t(v, NULL);
4380c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (x == -1 && PyErr_Occurred())
4381c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return 0;
4382c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
4383c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        else {
4384c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyErr_SetString(PyExc_TypeError,
4385c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                            "slice indices must be integers or "
4386c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                            "None or have an __index__ method");
4387c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return 0;
4388c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
4389c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        *pi = x;
4390c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
4391c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return 1;
4392c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
4393c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
4394c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#undef ISINDEX
4395c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define ISINDEX(x) ((x) == NULL || \
4396c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    PyInt_Check(x) || PyLong_Check(x) || PyIndex_Check(x))
4397c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
4398c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *
4399c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielapply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
4400c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
4401c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyTypeObject *tp = u->ob_type;
4402c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PySequenceMethods *sq = tp->tp_as_sequence;
4403c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
4404c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (sq && sq->sq_slice && ISINDEX(v) && ISINDEX(w)) {
4405c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_ssize_t ilow = 0, ihigh = PY_SSIZE_T_MAX;
4406c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!_PyEval_SliceIndex(v, &ilow))
4407c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
4408c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!_PyEval_SliceIndex(w, &ihigh))
4409c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
4410c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return PySequence_GetSlice(u, ilow, ihigh);
4411c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
4412c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else {
4413c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyObject *slice = PySlice_New(v, w, NULL);
4414c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (slice != NULL) {
4415c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyObject *res = PyObject_GetItem(u, slice);
4416c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(slice);
4417c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return res;
4418c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
4419c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        else
4420c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
4421c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
4422c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
4423c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
4424c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic int
4425c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielassign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x)
4426c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* u[v:w] = x */
4427c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
4428c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyTypeObject *tp = u->ob_type;
4429c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PySequenceMethods *sq = tp->tp_as_sequence;
4430c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
4431c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (sq && sq->sq_ass_slice && ISINDEX(v) && ISINDEX(w)) {
4432c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_ssize_t ilow = 0, ihigh = PY_SSIZE_T_MAX;
4433c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!_PyEval_SliceIndex(v, &ilow))
4434c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return -1;
4435c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!_PyEval_SliceIndex(w, &ihigh))
4436c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return -1;
4437c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (x == NULL)
4438c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return PySequence_DelSlice(u, ilow, ihigh);
4439c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        else
4440c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return PySequence_SetSlice(u, ilow, ihigh, x);
4441c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
4442c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else {
4443c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyObject *slice = PySlice_New(v, w, NULL);
4444c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (slice != NULL) {
4445c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            int res;
4446c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (x != NULL)
4447c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                res = PyObject_SetItem(u, slice, x);
4448c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            else
4449c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                res = PyObject_DelItem(u, slice);
4450c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(slice);
4451c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return res;
4452c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
4453c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        else
4454c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return -1;
4455c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
4456c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
4457c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
4458c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define Py3kExceptionClass_Check(x)     \
4459c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    (PyType_Check((x)) &&               \
4460c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel     PyType_FastSubclass((PyTypeObject*)(x), Py_TPFLAGS_BASE_EXC_SUBCLASS))
4461c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
4462c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define CANNOT_CATCH_MSG "catching classes that don't inherit from " \
4463c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                         "BaseException is not allowed in 3.x"
4464c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
4465c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *
4466c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielcmp_outcome(int op, register PyObject *v, register PyObject *w)
4467c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
4468c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int res = 0;
4469c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    switch (op) {
4470c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    case PyCmp_IS:
4471c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        res = (v == w);
4472c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        break;
4473c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    case PyCmp_IS_NOT:
4474c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        res = (v != w);
4475c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        break;
4476c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    case PyCmp_IN:
4477c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        res = PySequence_Contains(w, v);
4478c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (res < 0)
4479c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
4480c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        break;
4481c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    case PyCmp_NOT_IN:
4482c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        res = PySequence_Contains(w, v);
4483c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (res < 0)
4484c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
4485c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        res = !res;
4486c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        break;
4487c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    case PyCmp_EXC_MATCH:
4488c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (PyTuple_Check(w)) {
4489c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_ssize_t i, length;
4490c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            length = PyTuple_Size(w);
4491c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            for (i = 0; i < length; i += 1) {
4492c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PyObject *exc = PyTuple_GET_ITEM(w, i);
4493c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (PyString_Check(exc)) {
4494c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    int ret_val;
4495c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    ret_val = PyErr_WarnEx(
4496c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        PyExc_DeprecationWarning,
4497c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        "catching of string "
4498c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        "exceptions is deprecated", 1);
4499c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    if (ret_val < 0)
4500c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        return NULL;
4501c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                }
4502c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                else if (Py_Py3kWarningFlag  &&
4503c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                         !PyTuple_Check(exc) &&
4504c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                         !Py3kExceptionClass_Check(exc))
4505c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                {
4506c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    int ret_val;
4507c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    ret_val = PyErr_WarnEx(
4508c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        PyExc_DeprecationWarning,
4509c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        CANNOT_CATCH_MSG, 1);
4510c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    if (ret_val < 0)
4511c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        return NULL;
4512c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                }
4513c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
4514c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
4515c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        else {
4516c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (PyString_Check(w)) {
4517c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                int ret_val;
4518c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                ret_val = PyErr_WarnEx(
4519c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                PyExc_DeprecationWarning,
4520c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                "catching of string "
4521c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                "exceptions is deprecated", 1);
4522c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (ret_val < 0)
4523c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    return NULL;
4524c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
4525c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            else if (Py_Py3kWarningFlag  &&
4526c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                     !PyTuple_Check(w) &&
4527c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                     !Py3kExceptionClass_Check(w))
4528c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            {
4529c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                int ret_val;
4530c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                ret_val = PyErr_WarnEx(
4531c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    PyExc_DeprecationWarning,
4532c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    CANNOT_CATCH_MSG, 1);
4533c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (ret_val < 0)
4534c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    return NULL;
4535c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
4536c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
4537c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        res = PyErr_GivenExceptionMatches(v, w);
4538c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        break;
4539c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    default:
4540c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return PyObject_RichCompare(v, w, op);
4541c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
4542c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    v = res ? Py_True : Py_False;
4543c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_INCREF(v);
4544c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return v;
4545c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
4546c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
4547c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *
4548c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielimport_from(PyObject *v, PyObject *name)
4549c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
4550c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *x;
4551c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
4552c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    x = PyObject_GetAttr(v, name);
4553c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (x == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
4554c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyErr_Format(PyExc_ImportError,
4555c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                     "cannot import name %.230s",
4556c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                     PyString_AsString(name));
4557c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
4558c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return x;
4559c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
4560c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
4561c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic int
4562c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielimport_all_from(PyObject *locals, PyObject *v)
4563c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
4564c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *all = PyObject_GetAttrString(v, "__all__");
4565c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *dict, *name, *value;
4566c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int skip_leading_underscores = 0;
4567c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int pos, err;
4568c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
4569c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (all == NULL) {
4570c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!PyErr_ExceptionMatches(PyExc_AttributeError))
4571c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return -1; /* Unexpected error */
4572c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyErr_Clear();
4573c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        dict = PyObject_GetAttrString(v, "__dict__");
4574c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (dict == NULL) {
4575c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (!PyErr_ExceptionMatches(PyExc_AttributeError))
4576c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return -1;
4577c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyErr_SetString(PyExc_ImportError,
4578c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            "from-import-* object has no __dict__ and no __all__");
4579c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return -1;
4580c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
4581c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        all = PyMapping_Keys(dict);
4582c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_DECREF(dict);
4583c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (all == NULL)
4584c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return -1;
4585c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        skip_leading_underscores = 1;
4586c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
4587c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
4588c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    for (pos = 0, err = 0; ; pos++) {
4589c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        name = PySequence_GetItem(all, pos);
4590c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (name == NULL) {
4591c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (!PyErr_ExceptionMatches(PyExc_IndexError))
4592c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                err = -1;
4593c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            else
4594c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PyErr_Clear();
4595c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
4596c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
4597c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (skip_leading_underscores &&
4598c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyString_Check(name) &&
4599c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyString_AS_STRING(name)[0] == '_')
4600c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        {
4601c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(name);
4602c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            continue;
4603c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
4604c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        value = PyObject_GetAttr(v, name);
4605c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (value == NULL)
4606c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            err = -1;
4607c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        else if (PyDict_CheckExact(locals))
4608c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            err = PyDict_SetItem(locals, name, value);
4609c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        else
4610c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            err = PyObject_SetItem(locals, name, value);
4611c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_DECREF(name);
4612c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_XDECREF(value);
4613c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (err != 0)
4614c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
4615c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
4616c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_DECREF(all);
4617c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return err;
4618c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
4619c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
4620c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *
4621c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuild_class(PyObject *methods, PyObject *bases, PyObject *name)
4622c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
4623c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *metaclass = NULL, *result, *base;
4624c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
4625c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (PyDict_Check(methods))
4626c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        metaclass = PyDict_GetItemString(methods, "__metaclass__");
4627c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (metaclass != NULL)
4628c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_INCREF(metaclass);
4629c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else if (PyTuple_Check(bases) && PyTuple_GET_SIZE(bases) > 0) {
4630c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        base = PyTuple_GET_ITEM(bases, 0);
4631c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        metaclass = PyObject_GetAttrString(base, "__class__");
4632c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (metaclass == NULL) {
4633c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyErr_Clear();
4634c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            metaclass = (PyObject *)base->ob_type;
4635c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_INCREF(metaclass);
4636c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
4637c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
4638c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else {
4639c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyObject *g = PyEval_GetGlobals();
4640c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (g != NULL && PyDict_Check(g))
4641c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            metaclass = PyDict_GetItemString(g, "__metaclass__");
4642c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (metaclass == NULL)
4643c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            metaclass = (PyObject *) &PyClass_Type;
4644c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_INCREF(metaclass);
4645c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
4646c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    result = PyObject_CallFunctionObjArgs(metaclass, name, bases, methods,
4647c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                          NULL);
4648c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_DECREF(metaclass);
4649c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (result == NULL && PyErr_ExceptionMatches(PyExc_TypeError)) {
4650c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* A type error here likely means that the user passed
4651c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel           in a base that was not a class (such the random module
4652c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel           instead of the random.random type).  Help them out with
4653c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel           by augmenting the error message with more information.*/
4654c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
4655c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyObject *ptype, *pvalue, *ptraceback;
4656c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
4657c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyErr_Fetch(&ptype, &pvalue, &ptraceback);
4658c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (PyString_Check(pvalue)) {
4659c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyObject *newmsg;
4660c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            newmsg = PyString_FromFormat(
4661c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                "Error when calling the metaclass bases\n"
4662c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                "    %s",
4663c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PyString_AS_STRING(pvalue));
4664c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (newmsg != NULL) {
4665c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_DECREF(pvalue);
4666c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                pvalue = newmsg;
4667c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
4668c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
4669c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyErr_Restore(ptype, pvalue, ptraceback);
4670c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
4671c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return result;
4672c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
4673c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
4674c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic int
4675c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielexec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
4676c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel               PyObject *locals)
4677c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
4678c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int n;
4679c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *v;
4680c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int plain = 0;
4681c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
4682c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
4683c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
4684c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* Backward compatibility hack */
4685c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        globals = PyTuple_GetItem(prog, 1);
4686c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (n == 3)
4687c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            locals = PyTuple_GetItem(prog, 2);
4688c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        prog = PyTuple_GetItem(prog, 0);
4689c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
4690c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (globals == Py_None) {
4691c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        globals = PyEval_GetGlobals();
4692c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (locals == Py_None) {
4693c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            locals = PyEval_GetLocals();
4694c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            plain = 1;
4695c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
4696c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!globals || !locals) {
4697c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyErr_SetString(PyExc_SystemError,
4698c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                            "globals and locals cannot be NULL");
4699c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return -1;
4700c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
4701c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
4702c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else if (locals == Py_None)
4703c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        locals = globals;
4704c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!PyString_Check(prog) &&
4705c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef Py_USING_UNICODE
4706c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        !PyUnicode_Check(prog) &&
4707c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
4708c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        !PyCode_Check(prog) &&
4709c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        !PyFile_Check(prog)) {
4710c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyErr_SetString(PyExc_TypeError,
4711c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            "exec: arg 1 must be a string, file, or code object");
4712c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return -1;
4713c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
4714c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!PyDict_Check(globals)) {
4715c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyErr_SetString(PyExc_TypeError,
4716c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            "exec: arg 2 must be a dictionary or None");
4717c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return -1;
4718c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
4719c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!PyMapping_Check(locals)) {
4720c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyErr_SetString(PyExc_TypeError,
4721c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            "exec: arg 3 must be a mapping or None");
4722c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return -1;
4723c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
4724c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (PyDict_GetItemString(globals, "__builtins__") == NULL)
4725c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
4726c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (PyCode_Check(prog)) {
4727c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (PyCode_GetNumFree((PyCodeObject *)prog) > 0) {
4728c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyErr_SetString(PyExc_TypeError,
4729c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        "code object passed to exec may not contain free variables");
4730c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return -1;
4731c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
4732c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
4733c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
4734c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else if (PyFile_Check(prog)) {
4735c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        FILE *fp = PyFile_AsFile(prog);
4736c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        char *name = PyString_AsString(PyFile_Name(prog));
4737c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyCompilerFlags cf;
4738c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (name == NULL)
4739c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return -1;
4740c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        cf.cf_flags = 0;
4741c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (PyEval_MergeCompilerFlags(&cf))
4742c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            v = PyRun_FileFlags(fp, name, Py_file_input, globals,
4743c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                locals, &cf);
4744c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        else
4745c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            v = PyRun_File(fp, name, Py_file_input, globals,
4746c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                           locals);
4747c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
4748c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else {
4749c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyObject *tmp = NULL;
4750c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        char *str;
4751c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyCompilerFlags cf;
4752c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        cf.cf_flags = 0;
4753c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef Py_USING_UNICODE
4754c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (PyUnicode_Check(prog)) {
4755c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            tmp = PyUnicode_AsUTF8String(prog);
4756c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (tmp == NULL)
4757c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return -1;
4758c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            prog = tmp;
4759c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            cf.cf_flags |= PyCF_SOURCE_IS_UTF8;
4760c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
4761c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
4762c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (PyString_AsStringAndSize(prog, &str, NULL))
4763c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return -1;
4764c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (PyEval_MergeCompilerFlags(&cf))
4765c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            v = PyRun_StringFlags(str, Py_file_input, globals,
4766c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                  locals, &cf);
4767c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        else
4768c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            v = PyRun_String(str, Py_file_input, globals, locals);
4769c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_XDECREF(tmp);
4770c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
4771c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (plain)
4772c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyFrame_LocalsToFast(f, 0);
4773c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (v == NULL)
4774c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return -1;
4775c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_DECREF(v);
4776c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return 0;
4777c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
4778c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
4779c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic void
4780c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielformat_exc_check_arg(PyObject *exc, char *format_str, PyObject *obj)
4781c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
4782c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    char *obj_str;
4783c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
4784c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!obj)
4785c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return;
4786c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
4787c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    obj_str = PyString_AsString(obj);
4788c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!obj_str)
4789c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return;
4790c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
4791c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyErr_Format(exc, format_str, obj_str);
4792c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
4793c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
4794c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *
4795c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstring_concatenate(PyObject *v, PyObject *w,
4796c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                   PyFrameObject *f, unsigned char *next_instr)
4797c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
4798c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* This function implements 'variable += expr' when both arguments
4799c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       are strings. */
4800c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_ssize_t v_len = PyString_GET_SIZE(v);
4801c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_ssize_t w_len = PyString_GET_SIZE(w);
4802c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_ssize_t new_len = v_len + w_len;
4803c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (new_len < 0) {
4804c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyErr_SetString(PyExc_OverflowError,
4805c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        "strings are too large to concat");
4806c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
4807c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
4808c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
4809c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (v->ob_refcnt == 2) {
4810c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* In the common case, there are 2 references to the value
4811c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel         * stored in 'variable' when the += is performed: one on the
4812c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel         * value stack (in 'v') and one still stored in the
4813c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel         * 'variable'.  We try to delete the variable now to reduce
4814c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel         * the refcnt to 1.
4815c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel         */
4816c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        switch (*next_instr) {
4817c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case STORE_FAST:
4818c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        {
4819c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            int oparg = PEEKARG();
4820c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyObject **fastlocals = f->f_localsplus;
4821c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (GETLOCAL(oparg) == v)
4822c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                SETLOCAL(oparg, NULL);
4823c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
4824c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
4825c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case STORE_DEREF:
4826c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        {
4827c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyObject **freevars = (f->f_localsplus +
4828c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                   f->f_code->co_nlocals);
4829c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyObject *c = freevars[PEEKARG()];
4830c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (PyCell_GET(c) == v)
4831c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PyCell_Set(c, NULL);
4832c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
4833c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
4834c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        case STORE_NAME:
4835c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        {
4836c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyObject *names = f->f_code->co_names;
4837c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyObject *name = GETITEM(names, PEEKARG());
4838c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyObject *locals = f->f_locals;
4839c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (PyDict_CheckExact(locals) &&
4840c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PyDict_GetItem(locals, name) == v) {
4841c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (PyDict_DelItem(locals, name) != 0) {
4842c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    PyErr_Clear();
4843c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                }
4844c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
4845c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
4846c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
4847c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
4848c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
4849c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
4850c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (v->ob_refcnt == 1 && !PyString_CHECK_INTERNED(v)) {
4851c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* Now we own the last reference to 'v', so we can resize it
4852c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel         * in-place.
4853c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel         */
4854c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (_PyString_Resize(&v, new_len) != 0) {
4855c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            /* XXX if _PyString_Resize() fails, 'v' has been
4856c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel             * deallocated so it cannot be put back into
4857c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel             * 'variable'.  The MemoryError is raised when there
4858c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel             * is no value in 'variable', which might (very
4859c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel             * remotely) be a cause of incompatibilities.
4860c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel             */
4861c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
4862c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
4863c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* copy 'w' into the newly allocated area of 'v' */
4864c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        memcpy(PyString_AS_STRING(v) + v_len,
4865c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel               PyString_AS_STRING(w), w_len);
4866c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return v;
4867c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
4868c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else {
4869c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* When in-place resizing is not an option. */
4870c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyString_Concat(&v, w);
4871c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return v;
4872c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
4873c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
4874c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
4875c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef DYNAMIC_EXECUTION_PROFILE
4876c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
4877c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *
4878c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielgetarray(long a[256])
4879c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
4880c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int i;
4881c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *l = PyList_New(256);
4882c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (l == NULL) return NULL;
4883c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    for (i = 0; i < 256; i++) {
4884c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyObject *x = PyInt_FromLong(a[i]);
4885c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (x == NULL) {
4886c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(l);
4887c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
4888c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
4889c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyList_SetItem(l, i, x);
4890c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
4891c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    for (i = 0; i < 256; i++)
4892c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        a[i] = 0;
4893c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return l;
4894c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
4895c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
4896c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyObject *
4897c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel_Py_GetDXProfile(PyObject *self, PyObject *args)
4898c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
4899c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifndef DXPAIRS
4900c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return getarray(dxp);
4901c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#else
4902c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int i;
4903c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *l = PyList_New(257);
4904c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (l == NULL) return NULL;
4905c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    for (i = 0; i < 257; i++) {
4906c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyObject *x = getarray(dxpairs[i]);
4907c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (x == NULL) {
4908c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(l);
4909c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
4910c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
4911c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyList_SetItem(l, i, x);
4912c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
4913c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return l;
4914c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
4915c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
4916c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
4917c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
4918