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