ceval.c 149 KB
Newer Older
Guido van Rossum's avatar
Guido van Rossum committed
1

Guido van Rossum's avatar
Guido van Rossum committed
2
/* Execute compiled code */
Guido van Rossum's avatar
Guido van Rossum committed
3

4 5 6 7 8
/* XXX TO DO:
   XXX speed up searching for keywords by using a dictionary
   XXX document it!
   */

9 10 11
/* enable more aggressive intra-module optimizations, where available */
#define PY_LOCAL_AGGRESSIVE

Guido van Rossum's avatar
Guido van Rossum committed
12
#include "Python.h"
Guido van Rossum's avatar
Guido van Rossum committed
13

Jeremy Hylton's avatar
Jeremy Hylton committed
14
#include "code.h"
Guido van Rossum's avatar
Guido van Rossum committed
15
#include "frameobject.h"
Guido van Rossum's avatar
Guido van Rossum committed
16
#include "opcode.h"
17
#include "structmember.h"
Guido van Rossum's avatar
Guido van Rossum committed
18

19 20
#include <ctype.h>

21
#ifndef WITH_TSC
22 23 24 25

#define READ_TIMESTAMP(var)

#else
26 27 28

typedef unsigned long long uint64;

29
/* PowerPC support.
30 31 32 33
   "__ppc__" appears to be the preprocessor definition to detect on OS X, whereas
   "__powerpc__" appears to be the correct one for Linux with GCC
*/
#if defined(__ppc__) || defined (__powerpc__)
Michael W. Hudson's avatar
Michael W. Hudson committed
34

35
#define READ_TIMESTAMP(var) ppc_getcounter(&var)
Michael W. Hudson's avatar
Michael W. Hudson committed
36 37 38 39

static void
ppc_getcounter(uint64 *v)
{
40
    unsigned long tbu, tb, tbu2;
Michael W. Hudson's avatar
Michael W. Hudson committed
41 42

  loop:
43 44 45 46 47 48 49 50 51
    asm volatile ("mftbu %0" : "=r" (tbu) );
    asm volatile ("mftb  %0" : "=r" (tb)  );
    asm volatile ("mftbu %0" : "=r" (tbu2));
    if (__builtin_expect(tbu != tbu2, 0)) goto loop;

    /* The slightly peculiar way of writing the next lines is
       compiled better by GCC than any other way I tried. */
    ((long*)(v))[0] = tbu;
    ((long*)(v))[1] = tb;
Michael W. Hudson's avatar
Michael W. Hudson committed
52 53
}

54 55 56
#elif defined(__i386__)

/* this is for linux/x86 (and probably any other GCC/x86 combo) */
Michael W. Hudson's avatar
Michael W. Hudson committed
57

58 59
#define READ_TIMESTAMP(val) \
     __asm__ __volatile__("rdtsc" : "=A" (val))
Michael W. Hudson's avatar
Michael W. Hudson committed
60

61 62 63 64 65 66 67
#elif defined(__x86_64__)

/* for gcc/x86_64, the "A" constraint in DI mode means *either* rax *or* rdx;
   not edx:eax as it does for i386.  Since rdtsc puts its result in edx:eax
   even in 64-bit mode, we need to use "a" and "d" for the lower and upper
   32-bit pieces of the result. */

68 69 70 71 72
#define READ_TIMESTAMP(val) do {                        \
    unsigned int h, l;                                  \
    __asm__ __volatile__("rdtsc" : "=a" (l), "=d" (h)); \
    (val) = ((uint64)l) | (((uint64)h) << 32);          \
    } while(0)
73 74 75 76 77 78


#else

#error "Don't know how to implement timestamp counter for this architecture"

Michael W. Hudson's avatar
Michael W. Hudson committed
79 80
#endif

81
void dump_tsc(int opcode, int ticked, uint64 inst0, uint64 inst1,
82
              uint64 loop0, uint64 loop1, uint64 intr0, uint64 intr1)
83
{
84 85 86 87 88 89 90 91
    uint64 intr, inst, loop;
    PyThreadState *tstate = PyThreadState_Get();
    if (!tstate->interp->tscdump)
        return;
    intr = intr1 - intr0;
    inst = inst1 - inst0 - intr;
    loop = loop1 - loop0 - intr;
    fprintf(stderr, "opcode=%03d t=%d inst=%06lld loop=%06lld\n",
92
            opcode, ticked, inst, loop);
93
}
Michael W. Hudson's avatar
Michael W. Hudson committed
94

95 96
#endif

97
/* Turn this on if your compiler chokes on the big switch: */
98
/* #define CASE_TOO_BIG 1 */
99

100
#ifdef Py_DEBUG
Guido van Rossum's avatar
Guido van Rossum committed
101
/* For debugging the interpreter: */
102 103
#define LLTRACE  1      /* Low-level trace feature */
#define CHECKEXC 1      /* Double-check exception checking */
Guido van Rossum's avatar
Guido van Rossum committed
104 105
#endif

106
typedef PyObject *(*callproc)(PyObject *, PyObject *, PyObject *);
107

108
/* Forward declarations */
109
#ifdef WITH_TSC
110
static PyObject * call_function(PyObject ***, int, uint64*, uint64*);
111
#else
112
static PyObject * call_function(PyObject ***, int);
113
#endif
114 115 116
static PyObject * fast_function(PyObject *, PyObject ***, int, int, int);
static PyObject * do_call(PyObject *, PyObject ***, int, int);
static PyObject * ext_do_call(PyObject *, PyObject ***, int, int, int);
117
static PyObject * update_keyword_args(PyObject *, int, PyObject ***,
118
                                      PyObject *);
119 120
static PyObject * update_star_args(int, int, PyObject *, PyObject ***);
static PyObject * load_args(PyObject ***, int);
121 122 123
#define CALL_FLAG_VAR 1
#define CALL_FLAG_KW 2

124
#ifdef LLTRACE
125
static int lltrace;
126
static int prtrace(PyObject *, char *);
127
#endif
128 129
static int call_trace(Py_tracefunc, PyObject *,
                      PyThreadState *, PyFrameObject *,
130
                      int, PyObject *);
131
static int call_trace_protected(Py_tracefunc, PyObject *,
132 133 134 135
                                PyThreadState *, PyFrameObject *,
                                int, PyObject *);
static void call_exc_trace(Py_tracefunc, PyObject *,
                           PyThreadState *, PyFrameObject *);
136
static int maybe_call_line_trace(Py_tracefunc, PyObject *,
137
                                 PyThreadState *, PyFrameObject *, int *, int *, int *);
Michael W. Hudson's avatar
Michael W. Hudson committed
138

139 140
static PyObject * cmp_outcome(int, PyObject *, PyObject *);
static PyObject * import_from(PyObject *, PyObject *);
141
static int import_all_from(PyObject *, PyObject *);
Neal Norwitz's avatar
Neal Norwitz committed
142
static void format_exc_check_arg(PyObject *, const char *, PyObject *);
143
static void format_exc_unbound(PyCodeObject *co, int oparg);
144 145
static PyObject * unicode_concatenate(PyObject *, PyObject *,
                                      PyFrameObject *, unsigned char *);
146
static PyObject * special_lookup(PyObject *, _Py_Identifier *);
147

148
#define NAME_ERROR_MSG \
149
    "name '%.200s' is not defined"
150
#define UNBOUNDLOCAL_ERROR_MSG \
151
    "local variable '%.200s' referenced before assignment"
152
#define UNBOUNDFREE_ERROR_MSG \
153 154
    "free variable '%.200s' referenced before assignment" \
    " in enclosing scope"
Guido van Rossum's avatar
Guido van Rossum committed
155

156 157 158 159 160 161 162 163 164 165
/* Dynamic execution profile */
#ifdef DYNAMIC_EXECUTION_PROFILE
#ifdef DXPAIRS
static long dxpairs[257][256];
#define dxp dxpairs[256]
#else
static long dxp[256];
#endif
#endif

166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205
/* Function call profile */
#ifdef CALL_PROFILE
#define PCALL_NUM 11
static int pcall[PCALL_NUM];

#define PCALL_ALL 0
#define PCALL_FUNCTION 1
#define PCALL_FAST_FUNCTION 2
#define PCALL_FASTER_FUNCTION 3
#define PCALL_METHOD 4
#define PCALL_BOUND_METHOD 5
#define PCALL_CFUNCTION 6
#define PCALL_TYPE 7
#define PCALL_GENERATOR 8
#define PCALL_OTHER 9
#define PCALL_POP 10

/* Notes about the statistics

   PCALL_FAST stats

   FAST_FUNCTION means no argument tuple needs to be created.
   FASTER_FUNCTION means that the fast-path frame setup code is used.

   If there is a method call where the call can be optimized by changing
   the argument tuple and calling the function directly, it gets recorded
   twice.

   As a result, the relationship among the statistics appears to be
   PCALL_ALL == PCALL_FUNCTION + PCALL_METHOD - PCALL_BOUND_METHOD +
                PCALL_CFUNCTION + PCALL_TYPE + PCALL_GENERATOR + PCALL_OTHER
   PCALL_FUNCTION > PCALL_FAST_FUNCTION > PCALL_FASTER_FUNCTION
   PCALL_METHOD > PCALL_BOUND_METHOD
*/

#define PCALL(POS) pcall[POS]++

PyObject *
PyEval_GetCallStats(PyObject *self)
{
206 207 208 209
    return Py_BuildValue("iiiiiiiiiii",
                         pcall[0], pcall[1], pcall[2], pcall[3],
                         pcall[4], pcall[5], pcall[6], pcall[7],
                         pcall[8], pcall[9], pcall[10]);
210 211 212 213 214 215 216
}
#else
#define PCALL(O)

PyObject *
PyEval_GetCallStats(PyObject *self)
{
217 218
    Py_INCREF(Py_None);
    return Py_None;
219 220 221
}
#endif

222

223 224 225 226 227 228
#ifdef WITH_THREAD
#define GIL_REQUEST _Py_atomic_load_relaxed(&gil_drop_request)
#else
#define GIL_REQUEST 0
#endif

229 230 231
/* This can set eval_breaker to 0 even though gil_drop_request became
   1.  We believe this is all right because the eval loop will release
   the GIL eventually anyway. */
Antoine Pitrou's avatar
Antoine Pitrou committed
232
#define COMPUTE_EVAL_BREAKER() \
233 234
    _Py_atomic_store_relaxed( \
        &eval_breaker, \
235
        GIL_REQUEST | \
236 237
        _Py_atomic_load_relaxed(&pendingcalls_to_do) | \
        pending_async_exc)
Antoine Pitrou's avatar
Antoine Pitrou committed
238

239 240
#ifdef WITH_THREAD

Antoine Pitrou's avatar
Antoine Pitrou committed
241
#define SET_GIL_DROP_REQUEST() \
242 243 244 245
    do { \
        _Py_atomic_store_relaxed(&gil_drop_request, 1); \
        _Py_atomic_store_relaxed(&eval_breaker, 1); \
    } while (0)
Antoine Pitrou's avatar
Antoine Pitrou committed
246 247

#define RESET_GIL_DROP_REQUEST() \
248 249 250 251
    do { \
        _Py_atomic_store_relaxed(&gil_drop_request, 0); \
        COMPUTE_EVAL_BREAKER(); \
    } while (0)
Antoine Pitrou's avatar
Antoine Pitrou committed
252

253 254
#endif

255
/* Pending calls are only modified under pending_lock */
Antoine Pitrou's avatar
Antoine Pitrou committed
256
#define SIGNAL_PENDING_CALLS() \
257 258 259 260
    do { \
        _Py_atomic_store_relaxed(&pendingcalls_to_do, 1); \
        _Py_atomic_store_relaxed(&eval_breaker, 1); \
    } while (0)
Antoine Pitrou's avatar
Antoine Pitrou committed
261 262

#define UNSIGNAL_PENDING_CALLS() \
263 264 265 266
    do { \
        _Py_atomic_store_relaxed(&pendingcalls_to_do, 0); \
        COMPUTE_EVAL_BREAKER(); \
    } while (0)
Antoine Pitrou's avatar
Antoine Pitrou committed
267 268

#define SIGNAL_ASYNC_EXC() \
269 270 271 272
    do { \
        pending_async_exc = 1; \
        _Py_atomic_store_relaxed(&eval_breaker, 1); \
    } while (0)
Antoine Pitrou's avatar
Antoine Pitrou committed
273 274

#define UNSIGNAL_ASYNC_EXC() \
275
    do { pending_async_exc = 0; COMPUTE_EVAL_BREAKER(); } while (0)
Antoine Pitrou's avatar
Antoine Pitrou committed
276 277


278
#ifdef WITH_THREAD
Guido van Rossum's avatar
Guido van Rossum committed
279

280
#ifdef HAVE_ERRNO_H
281
#include <errno.h>
282
#endif
283
#include "pythread.h"
Guido van Rossum's avatar
Guido van Rossum committed
284

285
static PyThread_type_lock pending_lock = 0; /* for pending calls */
286
static long main_thread = 0;
Antoine Pitrou's avatar
Antoine Pitrou committed
287 288
/* This single variable consolidates all requests to break out of the fast path
   in the eval loop. */
289 290 291 292 293 294 295 296
static _Py_atomic_int eval_breaker = {0};
/* Request for dropping the GIL */
static _Py_atomic_int gil_drop_request = {0};
/* Request for running pending calls. */
static _Py_atomic_int pendingcalls_to_do = {0};
/* Request for looking at the `async_exc` field of the current thread state.
   Guarded by the GIL. */
static int pending_async_exc = 0;
Antoine Pitrou's avatar
Antoine Pitrou committed
297 298

#include "ceval_gil.h"
299

300 301 302
int
PyEval_ThreadsInitialized(void)
{
303
    return gil_created();
304 305
}

306
void
307
PyEval_InitThreads(void)
308
{
309 310 311 312 313 314 315
    if (gil_created())
        return;
    create_gil();
    take_gil(PyThreadState_GET());
    main_thread = PyThread_get_thread_ident();
    if (!pending_lock)
        pending_lock = PyThread_allocate_lock();
316
}
Guido van Rossum's avatar
Guido van Rossum committed
317

318 319 320 321 322 323 324 325 326
void
_PyEval_FiniThreads(void)
{
    if (!gil_created())
        return;
    destroy_gil();
    assert(!gil_created());
}

327
void
328
PyEval_AcquireLock(void)
329
{
330 331 332 333
    PyThreadState *tstate = PyThreadState_GET();
    if (tstate == NULL)
        Py_FatalError("PyEval_AcquireLock: current thread state is NULL");
    take_gil(tstate);
334 335 336
}

void
337
PyEval_ReleaseLock(void)
338
{
339 340 341 342 343 344
    /* This function must succeed when the current thread state is NULL.
       We therefore avoid PyThreadState_GET() which dumps a fatal error
       in debug mode.
    */
    drop_gil((PyThreadState*)_Py_atomic_load_relaxed(
        &_PyThreadState_Current));
345 346
}

347
void
348
PyEval_AcquireThread(PyThreadState *tstate)
349
{
350 351 352 353 354 355 356 357
    if (tstate == NULL)
        Py_FatalError("PyEval_AcquireThread: NULL new thread state");
    /* Check someone has called PyEval_InitThreads() to create the lock */
    assert(gil_created());
    take_gil(tstate);
    if (PyThreadState_Swap(tstate) != NULL)
        Py_FatalError(
            "PyEval_AcquireThread: non-NULL old thread state");
358 359 360
}

void
361
PyEval_ReleaseThread(PyThreadState *tstate)
362
{
363 364 365 366 367
    if (tstate == NULL)
        Py_FatalError("PyEval_ReleaseThread: NULL thread state");
    if (PyThreadState_Swap(NULL) != tstate)
        Py_FatalError("PyEval_ReleaseThread: wrong thread state");
    drop_gil(tstate);
368
}
369

370 371 372 373
/* This function is called from PyOS_AfterFork to destroy all threads which are
 * not running in the child process, and clear internal locks which might be
 * held by those threads. (This could also be done using pthread_atfork
 * mechanism, at least for the pthreads implementation.) */
374 375 376 377

void
PyEval_ReInitThreads(void)
{
378
    _Py_IDENTIFIER(_after_fork);
379
    PyObject *threading, *result;
380
    PyThreadState *current_tstate = PyThreadState_GET();
381 382 383 384 385

    if (!gil_created())
        return;
    recreate_gil();
    pending_lock = PyThread_allocate_lock();
386
    take_gil(current_tstate);
387 388 389 390
    main_thread = PyThread_get_thread_ident();

    /* Update the threading module with the new state.
     */
391
    threading = PyMapping_GetItemString(current_tstate->interp->modules,
392 393 394 395 396 397
                                        "threading");
    if (threading == NULL) {
        /* threading not imported */
        PyErr_Clear();
        return;
    }
398
    result = _PyObject_CallMethodId(threading, &PyId__after_fork, NULL);
399 400 401 402 403
    if (result == NULL)
        PyErr_WriteUnraisable(threading);
    else
        Py_DECREF(result);
    Py_DECREF(threading);
404 405 406

    /* Destroy all threads except the current one */
    _PyThreadState_DeleteExcept(current_tstate);
407
}
Antoine Pitrou's avatar
Antoine Pitrou committed
408 409

#else
410
static _Py_atomic_int eval_breaker = {0};
Antoine Pitrou's avatar
Antoine Pitrou committed
411 412 413 414 415 416 417 418 419
static int pending_async_exc = 0;
#endif /* WITH_THREAD */

/* This function is used to signal that async exceptions are waiting to be
   raised, therefore it is also useful in non-threaded builds. */

void
_PyEval_SignalAsyncExc(void)
{
420
    SIGNAL_ASYNC_EXC();
Antoine Pitrou's avatar
Antoine Pitrou committed
421
}
422

Guido van Rossum's avatar
Guido van Rossum committed
423 424 425 426
/* Functions save_thread and restore_thread are always defined so
   dynamically loaded modules needn't be compiled separately for use
   with and without threads: */

427
PyThreadState *
428
PyEval_SaveThread(void)
429
{
430 431 432
    PyThreadState *tstate = PyThreadState_Swap(NULL);
    if (tstate == NULL)
        Py_FatalError("PyEval_SaveThread: NULL tstate");
433
#ifdef WITH_THREAD
434 435
    if (gil_created())
        drop_gil(tstate);
436
#endif
437
    return tstate;
438 439 440
}

void
441
PyEval_RestoreThread(PyThreadState *tstate)
442
{
443 444
    if (tstate == NULL)
        Py_FatalError("PyEval_RestoreThread: NULL tstate");
445
#ifdef WITH_THREAD
446 447 448
    if (gil_created()) {
        int err = errno;
        take_gil(tstate);
449 450 451 452 453 454
        /* _Py_Finalizing is protected by the GIL */
        if (_Py_Finalizing && tstate != _Py_Finalizing) {
            drop_gil(tstate);
            PyThread_exit_thread();
            assert(0);  /* unreachable */
        }
455 456
        errno = err;
    }
457
#endif
458
    PyThreadState_Swap(tstate);
459 460 461
}


462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478
/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
   signal handlers or Mac I/O completion routines) can schedule calls
   to a function to be called synchronously.
   The synchronous function is called with one void* argument.
   It should return 0 for success or -1 for failure -- failure should
   be accompanied by an exception.

   If registry succeeds, the registry function returns 0; if it fails
   (e.g. due to too many pending calls) it returns -1 (without setting
   an exception condition).

   Note that because registry may occur from within signal handlers,
   or other asynchronous events, calling malloc() is unsafe!

#ifdef WITH_THREAD
   Any thread can schedule pending calls, but only the main thread
   will execute them.
479 480 481 482
   There is no facility to schedule calls to a particular thread, but
   that should be easy to change, should that ever be required.  In
   that case, the static variables here should go into the python
   threadstate.
483
#endif
484 485 486 487 488 489 490 491 492 493 494
*/

#ifdef WITH_THREAD

/* The WITH_THREAD implementation is thread-safe.  It allows
   scheduling to be made from any thread, and even from an executing
   callback.
 */

#define NPENDINGCALLS 32
static struct {
495 496
    int (*func)(void *);
    void *arg;
497 498 499 500 501 502 503
} pendingcalls[NPENDINGCALLS];
static int pendingfirst = 0;
static int pendinglast = 0;

int
Py_AddPendingCall(int (*func)(void *), void *arg)
{
504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540
    int i, j, result=0;
    PyThread_type_lock lock = pending_lock;

    /* try a few times for the lock.  Since this mechanism is used
     * for signal handling (on the main thread), there is a (slim)
     * chance that a signal is delivered on the same thread while we
     * hold the lock during the Py_MakePendingCalls() function.
     * This avoids a deadlock in that case.
     * Note that signals can be delivered on any thread.  In particular,
     * on Windows, a SIGINT is delivered on a system-created worker
     * thread.
     * We also check for lock being NULL, in the unlikely case that
     * this function is called before any bytecode evaluation takes place.
     */
    if (lock != NULL) {
        for (i = 0; i<100; i++) {
            if (PyThread_acquire_lock(lock, NOWAIT_LOCK))
                break;
        }
        if (i == 100)
            return -1;
    }

    i = pendinglast;
    j = (i + 1) % NPENDINGCALLS;
    if (j == pendingfirst) {
        result = -1; /* Queue full */
    } else {
        pendingcalls[i].func = func;
        pendingcalls[i].arg = arg;
        pendinglast = j;
    }
    /* signal main loop */
    SIGNAL_PENDING_CALLS();
    if (lock != NULL)
        PyThread_release_lock(lock);
    return result;
541 542 543 544 545
}

int
Py_MakePendingCalls(void)
{
546
    static int busy = 0;
547 548 549 550 551 552 553 554 555 556 557 558 559 560
    int i;
    int r = 0;

    if (!pending_lock) {
        /* initial allocation of the lock */
        pending_lock = PyThread_allocate_lock();
        if (pending_lock == NULL)
            return -1;
    }

    /* only service pending calls on main thread */
    if (main_thread && PyThread_get_thread_ident() != main_thread)
        return 0;
    /* don't perform recursive pending calls */
561
    if (busy)
562
        return 0;
563
    busy = 1;
564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591
    /* perform a bounded number of calls, in case of recursion */
    for (i=0; i<NPENDINGCALLS; i++) {
        int j;
        int (*func)(void *);
        void *arg = NULL;

        /* pop one item off the queue while holding the lock */
        PyThread_acquire_lock(pending_lock, WAIT_LOCK);
        j = pendingfirst;
        if (j == pendinglast) {
            func = NULL; /* Queue empty */
        } else {
            func = pendingcalls[j].func;
            arg = pendingcalls[j].arg;
            pendingfirst = (j + 1) % NPENDINGCALLS;
        }
        if (pendingfirst != pendinglast)
            SIGNAL_PENDING_CALLS();
        else
            UNSIGNAL_PENDING_CALLS();
        PyThread_release_lock(pending_lock);
        /* having released the lock, perform the callback */
        if (func == NULL)
            break;
        r = func(arg);
        if (r)
            break;
    }
592
    busy = 0;
593
    return r;
594 595 596
}

#else /* if ! defined WITH_THREAD */
597

598 599 600 601 602 603
/*
   WARNING!  ASYNCHRONOUSLY EXECUTING CODE!
   This code is used for signal handling in python that isn't built
   with WITH_THREAD.
   Don't use this implementation when Py_AddPendingCalls() can happen
   on a different thread!
604

605
   There are two possible race conditions:
606 607
   (1) nested asynchronous calls to Py_AddPendingCall()
   (2) AddPendingCall() calls made while pending calls are being processed.
608

609 610 611
   (1) is very unlikely because typically signal delivery
   is blocked during signal handling.  So it should be impossible.
   (2) is a real possibility.
612 613
   The current code is safe against (2), but not against (1).
   The safety against (2) is derived from the fact that only one
614 615 616 617 618
   thread is present, interrupted by signals, and that the critical
   section is protected with the "busy" variable.  On Windows, which
   delivers SIGINT on a system thread, this does not hold and therefore
   Windows really shouldn't use this version.
   The two threads could theoretically wiggle around the "busy" variable.
619
*/
620

621 622
#define NPENDINGCALLS 32
static struct {
623 624
    int (*func)(void *);
    void *arg;
625 626 627
} pendingcalls[NPENDINGCALLS];
static volatile int pendingfirst = 0;
static volatile int pendinglast = 0;
628
static _Py_atomic_int pendingcalls_to_do = {0};
629 630

int
631
Py_AddPendingCall(int (*func)(void *), void *arg)
632
{
633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652
    static volatile int busy = 0;
    int i, j;
    /* XXX Begin critical section */
    if (busy)
        return -1;
    busy = 1;
    i = pendinglast;
    j = (i + 1) % NPENDINGCALLS;
    if (j == pendingfirst) {
        busy = 0;
        return -1; /* Queue full */
    }
    pendingcalls[i].func = func;
    pendingcalls[i].arg = arg;
    pendinglast = j;

    SIGNAL_PENDING_CALLS();
    busy = 0;
    /* XXX End critical section */
    return 0;
653 654
}

655
int
656
Py_MakePendingCalls(void)
657
{
658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680
    static int busy = 0;
    if (busy)
        return 0;
    busy = 1;
    UNSIGNAL_PENDING_CALLS();
    for (;;) {
        int i;
        int (*func)(void *);
        void *arg;
        i = pendingfirst;
        if (i == pendinglast)
            break; /* Queue empty */
        func = pendingcalls[i].func;
        arg = pendingcalls[i].arg;
        pendingfirst = (i + 1) % NPENDINGCALLS;
        if (func(arg) < 0) {
            busy = 0;
            SIGNAL_PENDING_CALLS(); /* We're not done yet */
            return -1;
        }
    }
    busy = 0;
    return 0;
681 682
}

683 684
#endif /* WITH_THREAD */

685

686 687
/* The interpreter's recursion limit */

688 689 690 691 692
#ifndef Py_DEFAULT_RECURSION_LIMIT
#define Py_DEFAULT_RECURSION_LIMIT 1000
#endif
static int recursion_limit = Py_DEFAULT_RECURSION_LIMIT;
int _Py_CheckRecursionLimit = Py_DEFAULT_RECURSION_LIMIT;
693

694 695
int
Py_GetRecursionLimit(void)
696
{
697
    return recursion_limit;
698 699
}

700 701
void
Py_SetRecursionLimit(int new_limit)
702
{
703 704
    recursion_limit = new_limit;
    _Py_CheckRecursionLimit = recursion_limit;
705 706
}

707 708 709 710 711 712 713 714
/* the macro Py_EnterRecursiveCall() only calls _Py_CheckRecursiveCall()
   if the recursion_depth reaches _Py_CheckRecursionLimit.
   If USE_STACKCHECK, the macro decrements _Py_CheckRecursionLimit
   to guarantee that _Py_CheckRecursiveCall() is regularly called.
   Without USE_STACKCHECK, there is no need for this. */
int
_Py_CheckRecursiveCall(char *where)
{
715
    PyThreadState *tstate = PyThreadState_GET();
716 717

#ifdef USE_STACKCHECK
718 719 720 721 722
    if (PyOS_CheckStack()) {
        --tstate->recursion_depth;
        PyErr_SetString(PyExc_MemoryError, "Stack overflow");
        return -1;
    }
723
#endif
724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743
    _Py_CheckRecursionLimit = recursion_limit;
    if (tstate->recursion_critical)
        /* Somebody asked that we don't check for recursion. */
        return 0;
    if (tstate->overflowed) {
        if (tstate->recursion_depth > recursion_limit + 50) {
            /* Overflowing while handling an overflow. Give up. */
            Py_FatalError("Cannot recover from stack overflow.");
        }
        return 0;
    }
    if (tstate->recursion_depth > recursion_limit) {
        --tstate->recursion_depth;
        tstate->overflowed = 1;
        PyErr_Format(PyExc_RuntimeError,
                     "maximum recursion depth exceeded%s",
                     where);
        return -1;
    }
    return 0;
744 745
}

746
/* Status code for main loop (reason for stack unwind) */
747
enum why_code {
748 749 750 751 752 753 754
        WHY_NOT =       0x0001, /* No error */
        WHY_EXCEPTION = 0x0002, /* Exception occurred */
        WHY_RETURN =    0x0008, /* 'return' statement */
        WHY_BREAK =     0x0010, /* 'break' statement */
        WHY_CONTINUE =  0x0020, /* 'continue' statement */
        WHY_YIELD =     0x0040, /* 'yield' operator */
        WHY_SILENCED =  0x0080  /* Exception silenced by 'with' */
755 756
};

757 758 759
static void save_exc_state(PyThreadState *, PyFrameObject *);
static void swap_exc_state(PyThreadState *, PyFrameObject *);
static void restore_and_clear_exc_state(PyThreadState *, PyFrameObject *);
Benjamin Peterson's avatar
Benjamin Peterson committed
760
static int do_raise(PyObject *, PyObject *);
761
static int unpack_iterable(PyObject *, int, int, PyObject **);
Guido van Rossum's avatar
Guido van Rossum committed
762

763 764 765 766 767 768 769
/* Records whether tracing is on for any thread.  Counts the number of
   threads for which tstate->c_tracefunc is non-NULL, so if the value
   is 0, we know we don't have to check this thread's c_tracefunc.
   This speeds up the if statement in PyEval_EvalFrameEx() after
   fast_next_opcode*/
static int _Py_TracingPossible = 0;

Antoine Pitrou's avatar
Antoine Pitrou committed
770

Guido van Rossum's avatar
Guido van Rossum committed
771

Guido van Rossum's avatar
Guido van Rossum committed
772
PyObject *
Martin v. Löwis's avatar
Martin v. Löwis committed
773
PyEval_EvalCode(PyObject *co, PyObject *globals, PyObject *locals)
774
{
775 776 777 778 779 780
    return PyEval_EvalCodeEx(co,
                      globals, locals,
                      (PyObject **)NULL, 0,
                      (PyObject **)NULL, 0,
                      (PyObject **)NULL, 0,
                      NULL, NULL);
781 782 783 784 785
}


/* Interpreter main loop */

786
PyObject *
787
PyEval_EvalFrame(PyFrameObject *f) {
788 789 790 791
    /* This is for backward compatibility with extension modules that
       used this API; core interpreter code should call
       PyEval_EvalFrameEx() */
    return PyEval_EvalFrameEx(f, 0);
792 793 794
}

PyObject *
795
PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
Guido van Rossum's avatar
Guido van Rossum committed
796
{
797
#ifdef DXPAIRS
798
    int lastopcode = 0;
799
#endif
800 801 802 803 804 805
    PyObject **stack_pointer;  /* Next free slot in value stack */
    unsigned char *next_instr;
    int opcode;        /* Current opcode */
    int oparg;         /* Current opcode argument, if any */
    enum why_code why; /* Reason for block stack unwind */
    PyObject **fastlocals, **freevars;
806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821
    PyObject *retval = NULL;            /* Return value */
    PyThreadState *tstate = PyThreadState_GET();
    PyCodeObject *co;

    /* when tracing we set things up so that

           not (instr_lb <= current_bytecode_offset < instr_ub)

       is true when the line being executed has changed.  The
       initial values are such as to make this false the first
       time it is tested. */
    int instr_ub = -1, instr_lb = 0, instr_prev = -1;

    unsigned char *first_instr;
    PyObject *names;
    PyObject *consts;
Guido van Rossum's avatar
Guido van Rossum committed
822

823
#ifdef LLTRACE
824
    _Py_IDENTIFIER(__ltrace__);
825
#endif
826

827 828 829 830 831 832
/* Computed GOTOs, or
       the-optimization-commonly-but-improperly-known-as-"threaded code"
   using gcc's labels-as-values extension
   (http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html).

   The traditional bytecode evaluation loop uses a "switch" statement, which
833
   decent compilers will optimize as a single indirect branch instruction
834 835 836 837 838 839 840 841 842 843 844 845 846 847
   combined with a lookup table of jump addresses. However, since the
   indirect jump instruction is shared by all opcodes, the CPU will have a
   hard time making the right prediction for where to jump next (actually,
   it will be always wrong except in the uncommon case of a sequence of
   several identical opcodes).

   "Threaded code" in contrast, uses an explicit jump table and an explicit
   indirect jump instruction at the end of each opcode. Since the jump
   instruction is at a different address for each opcode, the CPU will make a
   separate prediction for each of these instructions, which is equivalent to
   predicting the second opcode of each opcode pair. These predictions have
   a much better chance to turn out valid, especially in small bytecode loops.

   A mispredicted branch on a modern CPU flushes the whole pipeline and
848
   can cost several CPU cycles (depending on the pipeline depth),
849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865
   and potentially many more instructions (depending on the pipeline width).
   A correctly predicted branch, however, is nearly free.

   At the time of this writing, the "threaded code" version is up to 15-20%
   faster than the normal "switch" version, depending on the compiler and the
   CPU architecture.

   We disable the optimization if DYNAMIC_EXECUTION_PROFILE is defined,
   because it would render the measurements invalid.


   NOTE: care must be taken that the compiler doesn't try to "optimize" the
   indirect jumps by sharing them between all opcodes. Such optimizations
   can be disabled on gcc by using the -fno-gcse flag (or possibly
   -fno-crossjumping).
*/

866
#ifdef DYNAMIC_EXECUTION_PROFILE
867
#undef USE_COMPUTED_GOTOS
868 869 870 871 872 873 874 875 876 877 878 879 880
#define USE_COMPUTED_GOTOS 0
#endif

#ifdef HAVE_COMPUTED_GOTOS
    #ifndef USE_COMPUTED_GOTOS
    #define USE_COMPUTED_GOTOS 1
    #endif
#else
    #if defined(USE_COMPUTED_GOTOS) && USE_COMPUTED_GOTOS
    #error "Computed gotos are not supported on this compiler."
    #endif
    #undef USE_COMPUTED_GOTOS
    #define USE_COMPUTED_GOTOS 0
881 882
#endif

883
#if USE_COMPUTED_GOTOS
884 885 886 887 888 889
/* Import the static jump table */
#include "opcode_targets.h"

/* This macro is used when several opcodes defer to the same implementation
   (e.g. SETUP_LOOP, SETUP_FINALLY) */
#define TARGET_WITH_IMPL(op, impl) \
890 891 892 893 894 895
    TARGET_##op: \
        opcode = op; \
        if (HAS_ARG(op)) \
            oparg = NEXTARG(); \
    case op: \
        goto impl; \
896 897

#define TARGET(op) \
898 899 900 901 902
    TARGET_##op: \
        opcode = op; \
        if (HAS_ARG(op)) \
            oparg = NEXTARG(); \
    case op:
903 904 905


#define DISPATCH() \
906 907 908 909 910 911
    { \
        if (!_Py_atomic_load_relaxed(&eval_breaker)) {      \
                    FAST_DISPATCH(); \
        } \
        continue; \
    }
912 913 914

#ifdef LLTRACE
#define FAST_DISPATCH() \
915 916 917 918 919 920 921
    { \
        if (!lltrace && !_Py_TracingPossible) { \
            f->f_lasti = INSTR_OFFSET(); \
            goto *opcode_targets[*next_instr++]; \
        } \
        goto fast_next_opcode; \
    }
922 923
#else
#define FAST_DISPATCH() \
924 925 926 927 928 929 930
    { \
        if (!_Py_TracingPossible) { \
            f->f_lasti = INSTR_OFFSET(); \
            goto *opcode_targets[*next_instr++]; \
        } \
        goto fast_next_opcode; \
    }
931 932 933 934
#endif

#else
#define TARGET(op) \
935
    case op:
936
#define TARGET_WITH_IMPL(op, impl) \
937 938 939
    /* silence compiler warnings about `impl` unused */ \
    if (0) goto impl; \
    case op:
940 941 942 943 944
#define DISPATCH() continue
#define FAST_DISPATCH() goto fast_next_opcode
#endif


945 946 947 948 949 950 951 952
/* Tuple access macros */

#ifndef Py_DEBUG
#define GETITEM(v, i) PyTuple_GET_ITEM((PyTupleObject *)(v), (i))
#else
#define GETITEM(v, i) PyTuple_GetItem((v), (i))
#endif

953 954 955 956 957
#ifdef WITH_TSC
/* Use Pentium timestamp counter to mark certain events:
   inst0 -- beginning of switch statement for opcode dispatch
   inst1 -- end of switch statement (may be skipped)
   loop0 -- the top of the mainloop
958
   loop1 -- place where control returns again to top of mainloop
959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980
            (may be skipped)
   intr1 -- beginning of long interruption
   intr2 -- end of long interruption

   Many opcodes call out to helper C functions.  In some cases, the
   time in those functions should be counted towards the time for the
   opcode, but not in all cases.  For example, a CALL_FUNCTION opcode
   calls another Python function; there's no point in charge all the
   bytecode executed by the called function to the caller.

   It's hard to make a useful judgement statically.  In the presence
   of operator overloading, it's impossible to tell if a call will
   execute new Python code or not.

   It's a case-by-case judgement.  I'll use intr1 for the following
   cases:

   IMPORT_STAR
   IMPORT_FROM
   CALL_FUNCTION (and friends)

 */
981 982
    uint64 inst0, inst1, loop0, loop1, intr0 = 0, intr1 = 0;
    int ticked = 0;
983

984 985 986 987
    READ_TIMESTAMP(inst0);
    READ_TIMESTAMP(inst1);
    READ_TIMESTAMP(loop0);
    READ_TIMESTAMP(loop1);
Michael W. Hudson's avatar
Michael W. Hudson committed
988

989 990
    /* shut up the compiler */
    opcode = 0;
991 992
#endif

993
/* Code access macros */
Guido van Rossum's avatar
Guido van Rossum committed
994

995 996 997 998 999 1000
#define INSTR_OFFSET()  ((int)(next_instr - first_instr))
#define NEXTOP()        (*next_instr++)
#define NEXTARG()       (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
#define PEEKARG()       ((next_instr[2]<<8) + next_instr[1])
#define JUMPTO(x)       (next_instr = first_instr + (x))
#define JUMPBY(x)       (next_instr += (x))
Guido van Rossum's avatar
Guido van Rossum committed
1001

1002
/* OpCode prediction macros
1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016
    Some opcodes tend to come in pairs thus making it possible to
    predict the second code when the first is run.  For example,
    COMPARE_OP is often followed by JUMP_IF_FALSE or JUMP_IF_TRUE.  And,
    those opcodes are often followed by a POP_TOP.

    Verifying the prediction costs a single high-speed test of a register
    variable against a constant.  If the pairing was good, then the
    processor's own internal branch predication has a high likelihood of
    success, resulting in a nearly zero-overhead transition to the
    next opcode.  A successful prediction saves a trip through the eval-loop
    including its two unpredictable branches, the HAS_ARG test and the
    switch-case.  Combined with the processor's internal branch prediction,
    a successful PREDICT has the effect of making the two opcodes run as if
    they were a single new opcode with the bodies combined.
Georg Brandl's avatar
Georg Brandl committed
1017 1018

    If collecting opcode statistics, your choices are to either keep the
1019 1020 1021
    predictions turned-on and interpret the results as if some opcodes
    had been combined or turn-off predictions so that the opcode frequency
    counter updates for both opcodes.
1022 1023

    Opcode prediction is disabled with threaded code, since the latter allows
1024 1025
    the CPU to record separate branch prediction information for each
    opcode.
1026

1027 1028
*/

1029
#if defined(DYNAMIC_EXECUTION_PROFILE) || USE_COMPUTED_GOTOS
1030 1031 1032
#define PREDICT(op)             if (0) goto PRED_##op
#define PREDICTED(op)           PRED_##op:
#define PREDICTED_WITH_ARG(op)  PRED_##op:
1033
#else
1034 1035 1036
#define PREDICT(op)             if (*next_instr == op) goto PRED_##op
#define PREDICTED(op)           PRED_##op: next_instr++
#define PREDICTED_WITH_ARG(op)  PRED_##op: oparg = PEEKARG(); next_instr += 3
1037 1038
#endif

1039

1040
/* Stack manipulation macros */
Guido van Rossum's avatar
Guido van Rossum committed
1041

Martin v. Löwis's avatar
Martin v. Löwis committed
1042 1043
/* The stack can grow at most MAXINT deep, as co_nlocals and
   co_stacksize are ints. */
1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058
#define STACK_LEVEL()     ((int)(stack_pointer - f->f_valuestack))
#define EMPTY()           (STACK_LEVEL() == 0)
#define TOP()             (stack_pointer[-1])
#define SECOND()          (stack_pointer[-2])
#define THIRD()           (stack_pointer[-3])
#define FOURTH()          (stack_pointer[-4])
#define PEEK(n)           (stack_pointer[-(n)])
#define SET_TOP(v)        (stack_pointer[-1] = (v))
#define SET_SECOND(v)     (stack_pointer[-2] = (v))
#define SET_THIRD(v)      (stack_pointer[-3] = (v))
#define SET_FOURTH(v)     (stack_pointer[-4] = (v))
#define SET_VALUE(n, v)   (stack_pointer[-(n)] = (v))
#define BASIC_STACKADJ(n) (stack_pointer += n)
#define BASIC_PUSH(v)     (*stack_pointer++ = (v))
#define BASIC_POP()       (*--stack_pointer)
Guido van Rossum's avatar
Guido van Rossum committed
1059

Guido van Rossum's avatar
Guido van Rossum committed
1060
#ifdef LLTRACE
1061
#define PUSH(v)         { (void)(BASIC_PUSH(v), \
1062 1063
                          lltrace && prtrace(TOP(), "push")); \
                          assert(STACK_LEVEL() <= co->co_stacksize); }
1064
#define POP()           ((void)(lltrace && prtrace(TOP(), "pop")), \
1065
                         BASIC_POP())
1066
#define STACKADJ(n)     { (void)(BASIC_STACKADJ(n), \
1067 1068
                          lltrace && prtrace(TOP(), "stackadj")); \
                          assert(STACK_LEVEL() <= co->co_stacksize); }
1069
#define EXT_POP(STACK_POINTER) ((void)(lltrace && \
1070 1071
                                prtrace((STACK_POINTER)[-1], "ext_pop")), \
                                *--(STACK_POINTER))
1072
#else
1073 1074 1075
#define PUSH(v)                BASIC_PUSH(v)
#define POP()                  BASIC_POP()
#define STACKADJ(n)            BASIC_STACKADJ(n)
1076
#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
1077
#endif
Guido van Rossum's avatar
Guido van Rossum committed
1078

1079 1080
/* Local variable macros */

1081
#define GETLOCAL(i)     (fastlocals[i])
1082 1083 1084 1085 1086 1087 1088

/* The SETLOCAL() macro must not DECREF the local variable in-place and
   then store the new value; it must copy the old value to a temporary
   value, then store the new value, and then DECREF the temporary value.
   This is because it is possible that during the DECREF the frame is
   accessed by other code (e.g. a __del__ method or gc.collect()) and the
   variable would be pointing to already-freed memory. */
1089
#define SETLOCAL(i, value)      do { PyObject *tmp = GETLOCAL(i); \
1090 1091
                                     GETLOCAL(i) = value; \
                                     Py_XDECREF(tmp); } while (0)
1092

1093 1094

#define UNWIND_BLOCK(b) \
1095 1096 1097 1098
    while (STACK_LEVEL() > (b)->b_level) { \
        PyObject *v = POP(); \
        Py_XDECREF(v); \
    }
1099 1100

#define UNWIND_EXCEPT_HANDLER(b) \
1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117
    { \
        PyObject *type, *value, *traceback; \
        assert(STACK_LEVEL() >= (b)->b_level + 3); \
        while (STACK_LEVEL() > (b)->b_level + 3) { \
            value = POP(); \
            Py_XDECREF(value); \
        } \
        type = tstate->exc_type; \
        value = tstate->exc_value; \
        traceback = tstate->exc_traceback; \
        tstate->exc_type = POP(); \
        tstate->exc_value = POP(); \
        tstate->exc_traceback = POP(); \
        Py_XDECREF(type); \
        Py_XDECREF(value); \
        Py_XDECREF(traceback); \
    }
1118

1119 1120
/* Start of code */

1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143
    /* push frame */
    if (Py_EnterRecursiveCall(""))
        return NULL;

    tstate->frame = f;

    if (tstate->use_tracing) {
        if (tstate->c_tracefunc != NULL) {
            /* tstate->c_tracefunc, if defined, is a
               function that will be called on *every* entry
               to a code block.  Its return value, if not
               None, is a function that will be called at
               the start of each executed line of code.
               (Actually, the function must return itself
               in order to continue tracing.)  The trace
               functions are called with three arguments:
               a pointer to the current frame, a string
               indicating why the function is called, and
               an argument which depends on the situation.
               The global trace function is also called
               whenever an exception is detected. */
            if (call_trace_protected(tstate->c_tracefunc,
                                     tstate->c_traceobj,
1144
                                     tstate, f, PyTrace_CALL, Py_None)) {
1145 1146 1147 1148 1149 1150 1151 1152 1153
                /* Trace function raised an error */
                goto exit_eval_frame;
            }
        }
        if (tstate->c_profilefunc != NULL) {
            /* Similar for c_profilefunc, except it needn't
               return itself and isn't called for "line" events */
            if (call_trace_protected(tstate->c_profilefunc,
                                     tstate->c_profileobj,
1154
                                     tstate, f, PyTrace_CALL, Py_None)) {
1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174
                /* Profile function raised an error */
                goto exit_eval_frame;
            }
        }
    }

    co = f->f_code;
    names = co->co_names;
    consts = co->co_consts;
    fastlocals = f->f_localsplus;
    freevars = f->f_localsplus + co->co_nlocals;
    first_instr = (unsigned char*) PyBytes_AS_STRING(co->co_code);
    /* An explanation is in order for the next line.

       f->f_lasti now refers to the index of the last instruction
       executed.  You might think this was obvious from the name, but
       this wasn't always true before 2.3!  PyFrame_New now sets
       f->f_lasti to -1 (i.e. the index *before* the first instruction)
       and YIELD_VALUE doesn't fiddle with f_lasti any more.  So this
       does work.  Promise.
1175 1176
       YIELD_FROM sets f_lasti to itself, in order to repeated yield
       multiple values.
1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189

       When the PREDICT() macros are enabled, some opcode pairs follow in
       direct succession without updating f->f_lasti.  A successful
       prediction effectively links the two codes together as if they
       were a single new opcode; accordingly,f->f_lasti will point to
       the first code in the pair (for instance, GET_ITER followed by
       FOR_ITER is effectively a single opcode and f->f_lasti will point
       at to the beginning of the combined pair.)
    */
    next_instr = first_instr + f->f_lasti + 1;
    stack_pointer = f->f_stacktop;
    assert(stack_pointer != NULL);
    f->f_stacktop = NULL;       /* remains NULL unless yield suspends frame */
1190
    f->f_executing = 1;
1191

1192 1193
    if (co->co_flags & CO_GENERATOR) {
        if (!throwflag && f->f_exc_type != NULL && f->f_exc_type != Py_None) {
1194 1195 1196
            /* We were in an except handler when we left,
               restore the exception state which was put aside
               (see YIELD_VALUE). */
1197
            swap_exc_state(tstate, f);
1198
        }
1199 1200
        else
            save_exc_state(tstate, f);
1201
    }
1202

1203
#ifdef LLTRACE
1204
    lltrace = _PyDict_GetItemId(f->f_globals, &PyId___ltrace__) != NULL;
1205
#endif
Guido van Rossum's avatar
Guido van Rossum committed
1206

1207
    why = WHY_NOT;
Guido van Rossum's avatar
Guido van Rossum committed
1208

Benjamin Peterson's avatar
Benjamin Peterson committed
1209 1210
    if (throwflag) /* support for generator.throw() */
        goto error;
1211

1212 1213 1214 1215 1216 1217 1218
#ifdef Py_DEBUG
    /* PyEval_EvalFrameEx() must not be called with an exception set,
       because it may clear it (directly or indirectly) and so the
       caller looses its exception */
    assert(!PyErr_Occurred());
#endif

1219
    for (;;) {
1220
#ifdef WITH_TSC
1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235
        if (inst1 == 0) {
            /* Almost surely, the opcode executed a break
               or a continue, preventing inst1 from being set
               on the way out of the loop.
            */
            READ_TIMESTAMP(inst1);
            loop1 = inst1;
        }
        dump_tsc(opcode, ticked, inst0, inst1, loop0, loop1,
                 intr0, intr1);
        ticked = 0;
        inst1 = 0;
        intr0 = 0;
        intr1 = 0;
        READ_TIMESTAMP(loop0);
1236
#endif
1237 1238
        assert(stack_pointer >= f->f_valuestack); /* else underflow */
        assert(STACK_LEVEL() <= co->co_stacksize);  /* else overflow */
1239
        assert(!PyErr_Occurred());
1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251

        /* Do periodic things.  Doing this every time through
           the loop would add too much overhead, so we do it
           only every Nth instruction.  We also do it if
           ``pendingcalls_to_do'' is set, i.e. when an asynchronous
           event needs attention (e.g. a signal handler or
           async I/O handler); see Py_AddPendingCall() and
           Py_MakePendingCalls() above. */

        if (_Py_atomic_load_relaxed(&eval_breaker)) {
            if (*next_instr == SETUP_FINALLY) {
                /* Make the last opcode before
1252
                   a try: finally: block uninterruptible. */
1253 1254
                goto fast_next_opcode;
            }
1255
#ifdef WITH_TSC
1256
            ticked = 1;
1257
#endif
1258
            if (_Py_atomic_load_relaxed(&pendingcalls_to_do)) {
Benjamin Peterson's avatar
Benjamin Peterson committed
1259 1260
                if (Py_MakePendingCalls() < 0)
                    goto error;
1261
            }
1262
#ifdef WITH_THREAD
1263
            if (_Py_atomic_load_relaxed(&gil_drop_request)) {
1264 1265 1266 1267 1268 1269 1270 1271
                /* Give another thread a chance */
                if (PyThreadState_Swap(NULL) != tstate)
                    Py_FatalError("ceval: tstate mix-up");
                drop_gil(tstate);

                /* Other threads may run now */

                take_gil(tstate);
1272 1273 1274 1275 1276 1277 1278

                /* Check if we should make a quick exit. */
                if (_Py_Finalizing && _Py_Finalizing != tstate) {
                    drop_gil(tstate);
                    PyThread_exit_thread();
                }

1279 1280 1281
                if (PyThreadState_Swap(tstate) != NULL)
                    Py_FatalError("ceval: orphan tstate");
            }
1282
#endif
1283 1284
            /* Check for asynchronous exceptions. */
            if (tstate->async_exc != NULL) {
Benjamin Peterson's avatar
Benjamin Peterson committed
1285
                PyObject *exc = tstate->async_exc;
1286 1287
                tstate->async_exc = NULL;
                UNSIGNAL_ASYNC_EXC();
Benjamin Peterson's avatar
Benjamin Peterson committed
1288 1289 1290
                PyErr_SetNone(exc);
                Py_DECREF(exc);
                goto error;
1291 1292 1293 1294 1295 1296 1297 1298 1299
            }
        }

    fast_next_opcode:
        f->f_lasti = INSTR_OFFSET();

        /* line-by-line tracing support */

        if (_Py_TracingPossible &&
1300
            tstate->c_tracefunc != NULL && !tstate->tracing) {
Benjamin Peterson's avatar
Benjamin Peterson committed
1301
            int err;
1302 1303 1304 1305 1306 1307
            /* see maybe_call_line_trace
               for expository comments */
            f->f_stacktop = stack_pointer;

            err = maybe_call_line_trace(tstate->c_tracefunc,
                                        tstate->c_traceobj,
1308 1309
                                        tstate, f,
                                        &instr_lb, &instr_ub, &instr_prev);
1310 1311 1312 1313 1314 1315
            /* Reload possibly changed frame fields */
            JUMPTO(f->f_lasti);
            if (f->f_stacktop != NULL) {
                stack_pointer = f->f_stacktop;
                f->f_stacktop = NULL;
            }
Benjamin Peterson's avatar
Benjamin Peterson committed
1316
            if (err)
1317
                /* trace function raised an exception */
Benjamin Peterson's avatar
Benjamin Peterson committed
1318
                goto error;
1319 1320 1321 1322 1323 1324 1325 1326 1327
        }

        /* Extract opcode and argument */

        opcode = NEXTOP();
        oparg = 0;   /* allows oparg to be stored in a register because
            it doesn't have to be remembered across a full loop */
        if (HAS_ARG(opcode))
            oparg = NEXTARG();
1328
    dispatch_opcode:
1329 1330
#ifdef DYNAMIC_EXECUTION_PROFILE
#ifdef DXPAIRS
1331 1332
        dxpairs[lastopcode][opcode]++;
        lastopcode = opcode;
1333
#endif
1334
        dxp[opcode]++;
1335
#endif
Guido van Rossum's avatar
Guido van Rossum committed
1336

Guido van Rossum's avatar
Guido van Rossum committed
1337
#ifdef LLTRACE
1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349
        /* Instruction tracing */

        if (lltrace) {
            if (HAS_ARG(opcode)) {
                printf("%d: %d, %d\n",
                       f->f_lasti, opcode, oparg);
            }
            else {
                printf("%d: %d\n",
                       f->f_lasti, opcode);
            }
        }
1350
#endif
Michael W. Hudson's avatar
Michael W. Hudson committed
1351

1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364
        /* Main switch on opcode */
        READ_TIMESTAMP(inst0);

        switch (opcode) {

        /* BEWARE!
           It is essential that any operation that fails sets either
           x to NULL, err to nonzero, or why to anything but WHY_NOT,
           and that no operation that succeeds does this! */

        TARGET(NOP)
            FAST_DISPATCH();

Benjamin Peterson's avatar
Benjamin Peterson committed
1365 1366 1367 1368 1369 1370 1371
        TARGET(LOAD_FAST) {
            PyObject *value = GETLOCAL(oparg);
            if (value == NULL) {
                format_exc_check_arg(PyExc_UnboundLocalError,
                                     UNBOUNDLOCAL_ERROR_MSG,
                                     PyTuple_GetItem(co->co_varnames, oparg));
                goto error;
1372
            }
Benjamin Peterson's avatar
Benjamin Peterson committed
1373 1374 1375 1376
            Py_INCREF(value);
            PUSH(value);
            FAST_DISPATCH();
        }
1377

Benjamin Peterson's avatar
Benjamin Peterson committed
1378 1379 1380 1381
        TARGET(LOAD_CONST) {
            PyObject *value = GETITEM(consts, oparg);
            Py_INCREF(value);
            PUSH(value);
1382
            FAST_DISPATCH();
Benjamin Peterson's avatar
Benjamin Peterson committed
1383
        }
1384 1385

        PREDICTED_WITH_ARG(STORE_FAST);
Benjamin Peterson's avatar
Benjamin Peterson committed
1386 1387 1388
        TARGET(STORE_FAST) {
            PyObject *value = POP();
            SETLOCAL(oparg, value);
1389
            FAST_DISPATCH();
Benjamin Peterson's avatar
Benjamin Peterson committed
1390
        }
1391

Benjamin Peterson's avatar
Benjamin Peterson committed
1392 1393 1394
        TARGET(POP_TOP) {
            PyObject *value = POP();
            Py_DECREF(value);
1395
            FAST_DISPATCH();
Benjamin Peterson's avatar
Benjamin Peterson committed
1396
        }
1397

Benjamin Peterson's avatar
Benjamin Peterson committed
1398 1399 1400 1401 1402
        TARGET(ROT_TWO) {
            PyObject *top = TOP();
            PyObject *second = SECOND();
            SET_TOP(second);
            SET_SECOND(top);
1403
            FAST_DISPATCH();
Benjamin Peterson's avatar
Benjamin Peterson committed
1404
        }
1405

Benjamin Peterson's avatar
Benjamin Peterson committed
1406 1407 1408 1409 1410 1411 1412
        TARGET(ROT_THREE) {
            PyObject *top = TOP();
            PyObject *second = SECOND();
            PyObject *third = THIRD();
            SET_TOP(second);
            SET_SECOND(third);
            SET_THIRD(top);
1413
            FAST_DISPATCH();
Benjamin Peterson's avatar
Benjamin Peterson committed
1414
        }
1415

Benjamin Peterson's avatar
Benjamin Peterson committed
1416 1417 1418 1419
        TARGET(DUP_TOP) {
            PyObject *top = TOP();
            Py_INCREF(top);
            PUSH(top);
1420
            FAST_DISPATCH();
Benjamin Peterson's avatar
Benjamin Peterson committed
1421
        }
1422

Benjamin Peterson's avatar
Benjamin Peterson committed
1423 1424 1425
        TARGET(DUP_TOP_TWO) {
            PyObject *top = TOP();
            PyObject *second = SECOND();
1426
            Py_INCREF(top);
Benjamin Peterson's avatar
Benjamin Peterson committed
1427
            Py_INCREF(second);
1428
            STACKADJ(2);
Benjamin Peterson's avatar
Benjamin Peterson committed
1429 1430
            SET_TOP(top);
            SET_SECOND(second);
1431
            FAST_DISPATCH();
Benjamin Peterson's avatar
Benjamin Peterson committed
1432
        }
1433

Benjamin Peterson's avatar
Benjamin Peterson committed
1434 1435 1436 1437 1438 1439 1440 1441 1442
        TARGET(UNARY_POSITIVE) {
            PyObject *value = TOP();
            PyObject *res = PyNumber_Positive(value);
            Py_DECREF(value);
            SET_TOP(res);
            if (res == NULL)
                goto error;
            DISPATCH();
        }
1443

Benjamin Peterson's avatar
Benjamin Peterson committed
1444 1445 1446 1447 1448 1449 1450 1451 1452
        TARGET(UNARY_NEGATIVE) {
            PyObject *value = TOP();
            PyObject *res = PyNumber_Negative(value);
            Py_DECREF(value);
            SET_TOP(res);
            if (res == NULL)
                goto error;
            DISPATCH();
        }
1453

Benjamin Peterson's avatar
Benjamin Peterson committed
1454 1455 1456 1457
        TARGET(UNARY_NOT) {
            PyObject *value = TOP();
            int err = PyObject_IsTrue(value);
            Py_DECREF(value);
1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469
            if (err == 0) {
                Py_INCREF(Py_True);
                SET_TOP(Py_True);
                DISPATCH();
            }
            else if (err > 0) {
                Py_INCREF(Py_False);
                SET_TOP(Py_False);
                err = 0;
                DISPATCH();
            }
            STACKADJ(-1);
Benjamin Peterson's avatar
Benjamin Peterson committed
1470 1471
            goto error;
        }
1472

Benjamin Peterson's avatar
Benjamin Peterson committed
1473 1474 1475 1476 1477 1478 1479 1480 1481
        TARGET(UNARY_INVERT) {
            PyObject *value = TOP();
            PyObject *res = PyNumber_Invert(value);
            Py_DECREF(value);
            SET_TOP(res);
            if (res == NULL)
                goto error;
            DISPATCH();
        }
1482

Benjamin Peterson's avatar
Benjamin Peterson committed
1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493
        TARGET(BINARY_POWER) {
            PyObject *exp = POP();
            PyObject *base = TOP();
            PyObject *res = PyNumber_Power(base, exp, Py_None);
            Py_DECREF(base);
            Py_DECREF(exp);
            SET_TOP(res);
            if (res == NULL)
                goto error;
            DISPATCH();
        }
1494

Benjamin Peterson's avatar
Benjamin Peterson committed
1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505
        TARGET(BINARY_MULTIPLY) {
            PyObject *right = POP();
            PyObject *left = TOP();
            PyObject *res = PyNumber_Multiply(left, right);
            Py_DECREF(left);
            Py_DECREF(right);
            SET_TOP(res);
            if (res == NULL)
                goto error;
            DISPATCH();
        }
1506

1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518
        TARGET(BINARY_MATRIX_MULTIPLY) {
            PyObject *right = POP();
            PyObject *left = TOP();
            PyObject *res = PyNumber_MatrixMultiply(left, right);
            Py_DECREF(left);
            Py_DECREF(right);
            SET_TOP(res);
            if (res == NULL)
                goto error;
            DISPATCH();
        }

Benjamin Peterson's avatar
Benjamin Peterson committed
1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529
        TARGET(BINARY_TRUE_DIVIDE) {
            PyObject *divisor = POP();
            PyObject *dividend = TOP();
            PyObject *quotient = PyNumber_TrueDivide(dividend, divisor);
            Py_DECREF(dividend);
            Py_DECREF(divisor);
            SET_TOP(quotient);
            if (quotient == NULL)
                goto error;
            DISPATCH();
        }
1530

Benjamin Peterson's avatar
Benjamin Peterson committed
1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541
        TARGET(BINARY_FLOOR_DIVIDE) {
            PyObject *divisor = POP();
            PyObject *dividend = TOP();
            PyObject *quotient = PyNumber_FloorDivide(dividend, divisor);
            Py_DECREF(dividend);
            Py_DECREF(divisor);
            SET_TOP(quotient);
            if (quotient == NULL)
                goto error;
            DISPATCH();
        }
1542

Benjamin Peterson's avatar
Benjamin Peterson committed
1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555
        TARGET(BINARY_MODULO) {
            PyObject *divisor = POP();
            PyObject *dividend = TOP();
            PyObject *res = PyUnicode_CheckExact(dividend) ?
                PyUnicode_Format(dividend, divisor) :
                PyNumber_Remainder(dividend, divisor);
            Py_DECREF(divisor);
            Py_DECREF(dividend);
            SET_TOP(res);
            if (res == NULL)
                goto error;
            DISPATCH();
        }
1556

Benjamin Peterson's avatar
Benjamin Peterson committed
1557 1558 1559 1560 1561 1562 1563
        TARGET(BINARY_ADD) {
            PyObject *right = POP();
            PyObject *left = TOP();
            PyObject *sum;
            if (PyUnicode_CheckExact(left) &&
                     PyUnicode_CheckExact(right)) {
                sum = unicode_concatenate(left, right, f, next_instr);
1564 1565 1566
                /* unicode_concatenate consumed the ref to v */
            }
            else {
Benjamin Peterson's avatar
Benjamin Peterson committed
1567 1568
                sum = PyNumber_Add(left, right);
                Py_DECREF(left);
1569
            }
Benjamin Peterson's avatar
Benjamin Peterson committed
1570 1571 1572 1573 1574 1575
            Py_DECREF(right);
            SET_TOP(sum);
            if (sum == NULL)
                goto error;
            DISPATCH();
        }
1576

Benjamin Peterson's avatar
Benjamin Peterson committed
1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587
        TARGET(BINARY_SUBTRACT) {
            PyObject *right = POP();
            PyObject *left = TOP();
            PyObject *diff = PyNumber_Subtract(left, right);
            Py_DECREF(right);
            Py_DECREF(left);
            SET_TOP(diff);
            if (diff == NULL)
                goto error;
            DISPATCH();
        }
1588

Benjamin Peterson's avatar
Benjamin Peterson committed
1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599
        TARGET(BINARY_SUBSCR) {
            PyObject *sub = POP();
            PyObject *container = TOP();
            PyObject *res = PyObject_GetItem(container, sub);
            Py_DECREF(container);
            Py_DECREF(sub);
            SET_TOP(res);
            if (res == NULL)
                goto error;
            DISPATCH();
        }
1600

Benjamin Peterson's avatar
Benjamin Peterson committed
1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611
        TARGET(BINARY_LSHIFT) {
            PyObject *right = POP();
            PyObject *left = TOP();
            PyObject *res = PyNumber_Lshift(left, right);
            Py_DECREF(left);
            Py_DECREF(right);
            SET_TOP(res);
            if (res == NULL)
                goto error;
            DISPATCH();
        }
1612

Benjamin Peterson's avatar
Benjamin Peterson committed
1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623
        TARGET(BINARY_RSHIFT) {
            PyObject *right = POP();
            PyObject *left = TOP();
            PyObject *res = PyNumber_Rshift(left, right);
            Py_DECREF(left);
            Py_DECREF(right);
            SET_TOP(res);
            if (res == NULL)
                goto error;
            DISPATCH();
        }
1624

Benjamin Peterson's avatar
Benjamin Peterson committed
1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635
        TARGET(BINARY_AND) {
            PyObject *right = POP();
            PyObject *left = TOP();
            PyObject *res = PyNumber_And(left, right);
            Py_DECREF(left);
            Py_DECREF(right);
            SET_TOP(res);
            if (res == NULL)
                goto error;
            DISPATCH();
        }
1636

Benjamin Peterson's avatar
Benjamin Peterson committed
1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647
        TARGET(BINARY_XOR) {
            PyObject *right = POP();
            PyObject *left = TOP();
            PyObject *res = PyNumber_Xor(left, right);
            Py_DECREF(left);
            Py_DECREF(right);
            SET_TOP(res);
            if (res == NULL)
                goto error;
            DISPATCH();
        }
1648

Benjamin Peterson's avatar
Benjamin Peterson committed
1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659
        TARGET(BINARY_OR) {
            PyObject *right = POP();
            PyObject *left = TOP();
            PyObject *res = PyNumber_Or(left, right);
            Py_DECREF(left);
            Py_DECREF(right);
            SET_TOP(res);
            if (res == NULL)
                goto error;
            DISPATCH();
        }
1660

Benjamin Peterson's avatar
Benjamin Peterson committed
1661 1662 1663 1664 1665
        TARGET(LIST_APPEND) {
            PyObject *v = POP();
            PyObject *list = PEEK(oparg);
            int err;
            err = PyList_Append(list, v);
1666
            Py_DECREF(v);
Benjamin Peterson's avatar
Benjamin Peterson committed
1667 1668 1669 1670 1671
            if (err != 0)
                goto error;
            PREDICT(JUMP_ABSOLUTE);
            DISPATCH();
        }
1672

Benjamin Peterson's avatar
Benjamin Peterson committed
1673 1674 1675 1676 1677
        TARGET(SET_ADD) {
            PyObject *v = POP();
            PyObject *set = stack_pointer[-oparg];
            int err;
            err = PySet_Add(set, v);
1678
            Py_DECREF(v);
Benjamin Peterson's avatar
Benjamin Peterson committed
1679 1680 1681 1682 1683
            if (err != 0)
                goto error;
            PREDICT(JUMP_ABSOLUTE);
            DISPATCH();
        }
1684

Benjamin Peterson's avatar
Benjamin Peterson committed
1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695
        TARGET(INPLACE_POWER) {
            PyObject *exp = POP();
            PyObject *base = TOP();
            PyObject *res = PyNumber_InPlacePower(base, exp, Py_None);
            Py_DECREF(base);
            Py_DECREF(exp);
            SET_TOP(res);
            if (res == NULL)
                goto error;
            DISPATCH();
        }
1696

Benjamin Peterson's avatar
Benjamin Peterson committed
1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707
        TARGET(INPLACE_MULTIPLY) {
            PyObject *right = POP();
            PyObject *left = TOP();
            PyObject *res = PyNumber_InPlaceMultiply(left, right);
            Py_DECREF(left);
            Py_DECREF(right);
            SET_TOP(res);
            if (res == NULL)
                goto error;
            DISPATCH();
        }
1708

1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720
        TARGET(INPLACE_MATRIX_MULTIPLY) {
            PyObject *right = POP();
            PyObject *left = TOP();
            PyObject *res = PyNumber_InPlaceMatrixMultiply(left, right);
            Py_DECREF(left);
            Py_DECREF(right);
            SET_TOP(res);
            if (res == NULL)
                goto error;
            DISPATCH();
        }

Benjamin Peterson's avatar
Benjamin Peterson committed
1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755
        TARGET(INPLACE_TRUE_DIVIDE) {
            PyObject *divisor = POP();
            PyObject *dividend = TOP();
            PyObject *quotient = PyNumber_InPlaceTrueDivide(dividend, divisor);
            Py_DECREF(dividend);
            Py_DECREF(divisor);
            SET_TOP(quotient);
            if (quotient == NULL)
                goto error;
            DISPATCH();
        }

        TARGET(INPLACE_FLOOR_DIVIDE) {
            PyObject *divisor = POP();
            PyObject *dividend = TOP();
            PyObject *quotient = PyNumber_InPlaceFloorDivide(dividend, divisor);
            Py_DECREF(dividend);
            Py_DECREF(divisor);
            SET_TOP(quotient);
            if (quotient == NULL)
                goto error;
            DISPATCH();
        }

        TARGET(INPLACE_MODULO) {
            PyObject *right = POP();
            PyObject *left = TOP();
            PyObject *mod = PyNumber_InPlaceRemainder(left, right);
            Py_DECREF(left);
            Py_DECREF(right);
            SET_TOP(mod);
            if (mod == NULL)
                goto error;
            DISPATCH();
        }
1756

Benjamin Peterson's avatar
Benjamin Peterson committed
1757 1758 1759 1760 1761 1762
        TARGET(INPLACE_ADD) {
            PyObject *right = POP();
            PyObject *left = TOP();
            PyObject *sum;
            if (PyUnicode_CheckExact(left) && PyUnicode_CheckExact(right)) {
                sum = unicode_concatenate(left, right, f, next_instr);
1763 1764 1765
                /* unicode_concatenate consumed the ref to v */
            }
            else {
Benjamin Peterson's avatar
Benjamin Peterson committed
1766 1767
                sum = PyNumber_InPlaceAdd(left, right);
                Py_DECREF(left);
1768
            }
Benjamin Peterson's avatar
Benjamin Peterson committed
1769 1770 1771 1772 1773 1774
            Py_DECREF(right);
            SET_TOP(sum);
            if (sum == NULL)
                goto error;
            DISPATCH();
        }
1775

Benjamin Peterson's avatar
Benjamin Peterson committed
1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786
        TARGET(INPLACE_SUBTRACT) {
            PyObject *right = POP();
            PyObject *left = TOP();
            PyObject *diff = PyNumber_InPlaceSubtract(left, right);
            Py_DECREF(left);
            Py_DECREF(right);
            SET_TOP(diff);
            if (diff == NULL)
                goto error;
            DISPATCH();
        }
1787

Benjamin Peterson's avatar
Benjamin Peterson committed
1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798
        TARGET(INPLACE_LSHIFT) {
            PyObject *right = POP();
            PyObject *left = TOP();
            PyObject *res = PyNumber_InPlaceLshift(left, right);
            Py_DECREF(left);
            Py_DECREF(right);
            SET_TOP(res);
            if (res == NULL)
                goto error;
            DISPATCH();
        }
1799

Benjamin Peterson's avatar
Benjamin Peterson committed
1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810
        TARGET(INPLACE_RSHIFT) {
            PyObject *right = POP();
            PyObject *left = TOP();
            PyObject *res = PyNumber_InPlaceRshift(left, right);
            Py_DECREF(left);
            Py_DECREF(right);
            SET_TOP(res);
            if (res == NULL)
                goto error;
            DISPATCH();
        }
1811

Benjamin Peterson's avatar
Benjamin Peterson committed
1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822
        TARGET(INPLACE_AND) {
            PyObject *right = POP();
            PyObject *left = TOP();
            PyObject *res = PyNumber_InPlaceAnd(left, right);
            Py_DECREF(left);
            Py_DECREF(right);
            SET_TOP(res);
            if (res == NULL)
                goto error;
            DISPATCH();
        }
1823

Benjamin Peterson's avatar
Benjamin Peterson committed
1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834
        TARGET(INPLACE_XOR) {
            PyObject *right = POP();
            PyObject *left = TOP();
            PyObject *res = PyNumber_InPlaceXor(left, right);
            Py_DECREF(left);
            Py_DECREF(right);
            SET_TOP(res);
            if (res == NULL)
                goto error;
            DISPATCH();
        }
1835

Benjamin Peterson's avatar
Benjamin Peterson committed
1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846
        TARGET(INPLACE_OR) {
            PyObject *right = POP();
            PyObject *left = TOP();
            PyObject *res = PyNumber_InPlaceOr(left, right);
            Py_DECREF(left);
            Py_DECREF(right);
            SET_TOP(res);
            if (res == NULL)
                goto error;
            DISPATCH();
        }
1847

Benjamin Peterson's avatar
Benjamin Peterson committed
1848 1849 1850 1851 1852
        TARGET(STORE_SUBSCR) {
            PyObject *sub = TOP();
            PyObject *container = SECOND();
            PyObject *v = THIRD();
            int err;
1853 1854
            STACKADJ(-3);
            /* v[w] = u */
Benjamin Peterson's avatar
Benjamin Peterson committed
1855
            err = PyObject_SetItem(container, sub, v);
1856
            Py_DECREF(v);
Benjamin Peterson's avatar
Benjamin Peterson committed
1857 1858 1859 1860 1861 1862
            Py_DECREF(container);
            Py_DECREF(sub);
            if (err != 0)
                goto error;
            DISPATCH();
        }
1863

Benjamin Peterson's avatar
Benjamin Peterson committed
1864 1865 1866 1867
        TARGET(DELETE_SUBSCR) {
            PyObject *sub = TOP();
            PyObject *container = SECOND();
            int err;
1868 1869
            STACKADJ(-2);
            /* del v[w] */
Benjamin Peterson's avatar
Benjamin Peterson committed
1870 1871 1872 1873 1874 1875 1876
            err = PyObject_DelItem(container, sub);
            Py_DECREF(container);
            Py_DECREF(sub);
            if (err != 0)
                goto error;
            DISPATCH();
        }
1877

Benjamin Peterson's avatar
Benjamin Peterson committed
1878
        TARGET(PRINT_EXPR) {
1879
            _Py_IDENTIFIER(displayhook);
Benjamin Peterson's avatar
Benjamin Peterson committed
1880
            PyObject *value = POP();
1881
            PyObject *hook = _PySys_GetObjectId(&PyId_displayhook);
1882
            PyObject *res;
Benjamin Peterson's avatar
Benjamin Peterson committed
1883
            if (hook == NULL) {
1884 1885
                PyErr_SetString(PyExc_RuntimeError,
                                "lost sys.displayhook");
Benjamin Peterson's avatar
Benjamin Peterson committed
1886 1887 1888
                Py_DECREF(value);
                goto error;
            }
1889
            res = PyObject_CallFunctionObjArgs(hook, value, NULL);
Benjamin Peterson's avatar
Benjamin Peterson committed
1890 1891 1892 1893 1894 1895
            Py_DECREF(value);
            if (res == NULL)
                goto error;
            Py_DECREF(res);
            DISPATCH();
        }
Moshe Zadka's avatar
Moshe Zadka committed
1896

1897
#ifdef CASE_TOO_BIG
1898
        default: switch (opcode) {
1899
#endif
Benjamin Peterson's avatar
Benjamin Peterson committed
1900 1901
        TARGET(RAISE_VARARGS) {
            PyObject *cause = NULL, *exc = NULL;
1902 1903
            switch (oparg) {
            case 2:
Benjamin Peterson's avatar
Benjamin Peterson committed
1904
                cause = POP(); /* cause */
1905
            case 1:
Benjamin Peterson's avatar
Benjamin Peterson committed
1906
                exc = POP(); /* exc */
1907
            case 0: /* Fallthrough */
Benjamin Peterson's avatar
Benjamin Peterson committed
1908 1909 1910 1911
                if (do_raise(exc, cause)) {
                    why = WHY_EXCEPTION;
                    goto fast_block_end;
                }
1912 1913 1914 1915 1916 1917
                break;
            default:
                PyErr_SetString(PyExc_SystemError,
                           "bad RAISE_VARARGS oparg");
                break;
            }
Benjamin Peterson's avatar
Benjamin Peterson committed
1918 1919
            goto error;
        }
1920

Benjamin Peterson's avatar
Benjamin Peterson committed
1921
        TARGET(RETURN_VALUE) {
1922 1923 1924
            retval = POP();
            why = WHY_RETURN;
            goto fast_block_end;
Benjamin Peterson's avatar
Benjamin Peterson committed
1925
        }
1926

Benjamin Peterson's avatar
Benjamin Peterson committed
1927 1928 1929 1930 1931 1932
        TARGET(YIELD_FROM) {
            PyObject *v = POP();
            PyObject *reciever = TOP();
            int err;
            if (PyGen_CheckExact(reciever)) {
                retval = _PyGen_Send((PyGenObject *)reciever, v);
1933
            } else {
Benjamin Peterson's avatar
Benjamin Peterson committed
1934
                _Py_IDENTIFIER(send);
Benjamin Peterson's avatar
Benjamin Peterson committed
1935 1936
                if (v == Py_None)
                    retval = Py_TYPE(reciever)->tp_iternext(reciever);
1937
                else
1938
                    retval = _PyObject_CallMethodIdObjArgs(reciever, &PyId_send, v, NULL);
1939
            }
Benjamin Peterson's avatar
Benjamin Peterson committed
1940 1941
            Py_DECREF(v);
            if (retval == NULL) {
1942
                PyObject *val;
1943 1944
                if (tstate->c_tracefunc != NULL
                        && PyErr_ExceptionMatches(PyExc_StopIteration))
1945
                    call_exc_trace(tstate->c_tracefunc, tstate->c_traceobj, tstate, f);
1946
                err = _PyGen_FetchStopIterationValue(&val);
Benjamin Peterson's avatar
Benjamin Peterson committed
1947 1948 1949 1950 1951
                if (err < 0)
                    goto error;
                Py_DECREF(reciever);
                SET_TOP(val);
                DISPATCH();
1952
            }
1953
            /* x remains on stack, retval is value to be yielded */
1954 1955
            f->f_stacktop = stack_pointer;
            why = WHY_YIELD;
1956 1957
            /* and repeat... */
            f->f_lasti--;
1958
            goto fast_yield;
Benjamin Peterson's avatar
Benjamin Peterson committed
1959
        }
1960

Benjamin Peterson's avatar
Benjamin Peterson committed
1961
        TARGET(YIELD_VALUE) {
1962 1963 1964 1965
            retval = POP();
            f->f_stacktop = stack_pointer;
            why = WHY_YIELD;
            goto fast_yield;
Benjamin Peterson's avatar
Benjamin Peterson committed
1966
        }
1967

Benjamin Peterson's avatar
Benjamin Peterson committed
1968 1969 1970 1971 1972 1973
        TARGET(POP_EXCEPT) {
            PyTryBlock *b = PyFrame_BlockPop(f);
            if (b->b_type != EXCEPT_HANDLER) {
                PyErr_SetString(PyExc_SystemError,
                                "popped block is not an except handler");
                goto error;
1974
            }
Benjamin Peterson's avatar
Benjamin Peterson committed
1975
            UNWIND_EXCEPT_HANDLER(b);
1976
            DISPATCH();
Benjamin Peterson's avatar
Benjamin Peterson committed
1977
        }
1978

Benjamin Peterson's avatar
Benjamin Peterson committed
1979 1980 1981
        TARGET(POP_BLOCK) {
            PyTryBlock *b = PyFrame_BlockPop(f);
            UNWIND_BLOCK(b);
1982
            DISPATCH();
Benjamin Peterson's avatar
Benjamin Peterson committed
1983
        }
1984 1985

        PREDICTED(END_FINALLY);
Benjamin Peterson's avatar
Benjamin Peterson committed
1986 1987 1988 1989 1990
        TARGET(END_FINALLY) {
            PyObject *status = POP();
            if (PyLong_Check(status)) {
                why = (enum why_code) PyLong_AS_LONG(status);
                assert(why != WHY_YIELD && why != WHY_EXCEPTION);
1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002
                if (why == WHY_RETURN ||
                    why == WHY_CONTINUE)
                    retval = POP();
                if (why == WHY_SILENCED) {
                    /* An exception was silenced by 'with', we must
                    manually unwind the EXCEPT_HANDLER block which was
                    created when the exception was caught, otherwise
                    the stack will be in an inconsistent state. */
                    PyTryBlock *b = PyFrame_BlockPop(f);
                    assert(b->b_type == EXCEPT_HANDLER);
                    UNWIND_EXCEPT_HANDLER(b);
                    why = WHY_NOT;
Benjamin Peterson's avatar
Benjamin Peterson committed
2003 2004
                    Py_DECREF(status);
                    DISPATCH();
2005
                }
Benjamin Peterson's avatar
Benjamin Peterson committed
2006 2007
                Py_DECREF(status);
                goto fast_block_end;
2008
            }
Benjamin Peterson's avatar
Benjamin Peterson committed
2009 2010 2011 2012 2013 2014
            else if (PyExceptionClass_Check(status)) {
                PyObject *exc = POP();
                PyObject *tb = POP();
                PyErr_Restore(status, exc, tb);
                why = WHY_EXCEPTION;
                goto fast_block_end;
2015
            }
Benjamin Peterson's avatar
Benjamin Peterson committed
2016
            else if (status != Py_None) {
2017 2018
                PyErr_SetString(PyExc_SystemError,
                    "'finally' pops bad exception");
Benjamin Peterson's avatar
Benjamin Peterson committed
2019 2020
                Py_DECREF(status);
                goto error;
2021
            }
Benjamin Peterson's avatar
Benjamin Peterson committed
2022 2023 2024
            Py_DECREF(status);
            DISPATCH();
        }
2025

Benjamin Peterson's avatar
Benjamin Peterson committed
2026
        TARGET(LOAD_BUILD_CLASS) {
2027
            _Py_IDENTIFIER(__build_class__);
2028

Benjamin Peterson's avatar
Benjamin Peterson committed
2029
            PyObject *bc;
2030
            if (PyDict_CheckExact(f->f_builtins)) {
Benjamin Peterson's avatar
Benjamin Peterson committed
2031 2032
                bc = _PyDict_GetItemId(f->f_builtins, &PyId___build_class__);
                if (bc == NULL) {
2033 2034
                    PyErr_SetString(PyExc_NameError,
                                    "__build_class__ not found");
Benjamin Peterson's avatar
Benjamin Peterson committed
2035
                    goto error;
2036
                }
Benjamin Peterson's avatar
Benjamin Peterson committed
2037
                Py_INCREF(bc);
2038 2039 2040 2041 2042
            }
            else {
                PyObject *build_class_str = _PyUnicode_FromId(&PyId___build_class__);
                if (build_class_str == NULL)
                    break;
Benjamin Peterson's avatar
Benjamin Peterson committed
2043 2044
                bc = PyObject_GetItem(f->f_builtins, build_class_str);
                if (bc == NULL) {
2045 2046 2047
                    if (PyErr_ExceptionMatches(PyExc_KeyError))
                        PyErr_SetString(PyExc_NameError,
                                        "__build_class__ not found");
Benjamin Peterson's avatar
Benjamin Peterson committed
2048
                    goto error;
2049
                }
2050
            }
Benjamin Peterson's avatar
Benjamin Peterson committed
2051
            PUSH(bc);
2052
            DISPATCH();
2053
        }
2054

Benjamin Peterson's avatar
Benjamin Peterson committed
2055 2056 2057 2058 2059 2060 2061 2062
        TARGET(STORE_NAME) {
            PyObject *name = GETITEM(names, oparg);
            PyObject *v = POP();
            PyObject *ns = f->f_locals;
            int err;
            if (ns == NULL) {
                PyErr_Format(PyExc_SystemError,
                             "no locals found when storing %R", name);
2063
                Py_DECREF(v);
Benjamin Peterson's avatar
Benjamin Peterson committed
2064
                goto error;
2065
            }
Benjamin Peterson's avatar
Benjamin Peterson committed
2066 2067 2068 2069 2070 2071 2072 2073 2074
            if (PyDict_CheckExact(ns))
                err = PyDict_SetItem(ns, name, v);
            else
                err = PyObject_SetItem(ns, name, v);
            Py_DECREF(v);
            if (err != 0)
                goto error;
            DISPATCH();
        }
2075

Benjamin Peterson's avatar
Benjamin Peterson committed
2076 2077 2078 2079 2080 2081 2082 2083
        TARGET(DELETE_NAME) {
            PyObject *name = GETITEM(names, oparg);
            PyObject *ns = f->f_locals;
            int err;
            if (ns == NULL) {
                PyErr_Format(PyExc_SystemError,
                             "no locals when deleting %R", name);
                goto error;
2084
            }
Benjamin Peterson's avatar
Benjamin Peterson committed
2085 2086 2087 2088 2089 2090 2091 2092 2093
            err = PyObject_DelItem(ns, name);
            if (err != 0) {
                format_exc_check_arg(PyExc_NameError,
                                     NAME_ERROR_MSG,
                                     name);
                goto error;
            }
            DISPATCH();
        }
2094 2095

        PREDICTED_WITH_ARG(UNPACK_SEQUENCE);
Benjamin Peterson's avatar
Benjamin Peterson committed
2096 2097 2098 2099 2100
        TARGET(UNPACK_SEQUENCE) {
            PyObject *seq = POP(), *item, **items;
            if (PyTuple_CheckExact(seq) &&
                PyTuple_GET_SIZE(seq) == oparg) {
                items = ((PyTupleObject *)seq)->ob_item;
2101
                while (oparg--) {
Benjamin Peterson's avatar
Benjamin Peterson committed
2102 2103 2104
                    item = items[oparg];
                    Py_INCREF(item);
                    PUSH(item);
2105
                }
Benjamin Peterson's avatar
Benjamin Peterson committed
2106 2107 2108
            } else if (PyList_CheckExact(seq) &&
                       PyList_GET_SIZE(seq) == oparg) {
                items = ((PyListObject *)seq)->ob_item;
2109
                while (oparg--) {
Benjamin Peterson's avatar
Benjamin Peterson committed
2110 2111 2112
                    item = items[oparg];
                    Py_INCREF(item);
                    PUSH(item);
2113
                }
Benjamin Peterson's avatar
Benjamin Peterson committed
2114
            } else if (unpack_iterable(seq, oparg, -1,
2115 2116 2117 2118
                                       stack_pointer + oparg)) {
                STACKADJ(oparg);
            } else {
                /* unpack_iterable() raised an exception */
Benjamin Peterson's avatar
Benjamin Peterson committed
2119 2120
                Py_DECREF(seq);
                goto error;
2121
            }
Benjamin Peterson's avatar
Benjamin Peterson committed
2122
            Py_DECREF(seq);
2123
            DISPATCH();
Benjamin Peterson's avatar
Benjamin Peterson committed
2124
        }
2125

Benjamin Peterson's avatar
Benjamin Peterson committed
2126
        TARGET(UNPACK_EX) {
2127
            int totalargs = 1 + (oparg & 0xFF) + (oparg >> 8);
Benjamin Peterson's avatar
Benjamin Peterson committed
2128
            PyObject *seq = POP();
2129

Benjamin Peterson's avatar
Benjamin Peterson committed
2130
            if (unpack_iterable(seq, oparg & 0xFF, oparg >> 8,
2131 2132 2133
                                stack_pointer + totalargs)) {
                stack_pointer += totalargs;
            } else {
Benjamin Peterson's avatar
Benjamin Peterson committed
2134 2135
                Py_DECREF(seq);
                goto error;
2136
            }
Benjamin Peterson's avatar
Benjamin Peterson committed
2137
            Py_DECREF(seq);
2138
            DISPATCH();
2139 2140
        }

Benjamin Peterson's avatar
Benjamin Peterson committed
2141 2142 2143 2144 2145
        TARGET(STORE_ATTR) {
            PyObject *name = GETITEM(names, oparg);
            PyObject *owner = TOP();
            PyObject *v = SECOND();
            int err;
2146
            STACKADJ(-2);
Benjamin Peterson's avatar
Benjamin Peterson committed
2147
            err = PyObject_SetAttr(owner, name, v);
2148
            Py_DECREF(v);
Benjamin Peterson's avatar
Benjamin Peterson committed
2149 2150 2151 2152 2153
            Py_DECREF(owner);
            if (err != 0)
                goto error;
            DISPATCH();
        }
2154

Benjamin Peterson's avatar
Benjamin Peterson committed
2155 2156 2157 2158 2159 2160 2161 2162 2163 2164
        TARGET(DELETE_ATTR) {
            PyObject *name = GETITEM(names, oparg);
            PyObject *owner = POP();
            int err;
            err = PyObject_SetAttr(owner, name, (PyObject *)NULL);
            Py_DECREF(owner);
            if (err != 0)
                goto error;
            DISPATCH();
        }
2165

Benjamin Peterson's avatar
Benjamin Peterson committed
2166 2167 2168 2169 2170
        TARGET(STORE_GLOBAL) {
            PyObject *name = GETITEM(names, oparg);
            PyObject *v = POP();
            int err;
            err = PyDict_SetItem(f->f_globals, name, v);
2171
            Py_DECREF(v);
Benjamin Peterson's avatar
Benjamin Peterson committed
2172 2173 2174 2175
            if (err != 0)
                goto error;
            DISPATCH();
        }
2176

Benjamin Peterson's avatar
Benjamin Peterson committed
2177 2178 2179 2180 2181
        TARGET(DELETE_GLOBAL) {
            PyObject *name = GETITEM(names, oparg);
            int err;
            err = PyDict_DelItem(f->f_globals, name);
            if (err != 0) {
2182
                format_exc_check_arg(
2183
                    PyExc_NameError, NAME_ERROR_MSG, name);
Benjamin Peterson's avatar
Benjamin Peterson committed
2184
                goto error;
2185 2186
            }
            DISPATCH();
Benjamin Peterson's avatar
Benjamin Peterson committed
2187
        }
2188

Benjamin Peterson's avatar
Benjamin Peterson committed
2189 2190 2191 2192 2193
        TARGET(LOAD_NAME) {
            PyObject *name = GETITEM(names, oparg);
            PyObject *locals = f->f_locals;
            PyObject *v;
            if (locals == NULL) {
2194
                PyErr_Format(PyExc_SystemError,
Benjamin Peterson's avatar
Benjamin Peterson committed
2195 2196
                             "no locals when loading %R", name);
                goto error;
2197
            }
Benjamin Peterson's avatar
Benjamin Peterson committed
2198 2199 2200
            if (PyDict_CheckExact(locals)) {
                v = PyDict_GetItem(locals, name);
                Py_XINCREF(v);
2201 2202
            }
            else {
Benjamin Peterson's avatar
Benjamin Peterson committed
2203
                v = PyObject_GetItem(locals, name);
2204
                if (v == NULL && _PyErr_OCCURRED()) {
2205 2206
                    if (!PyErr_ExceptionMatches(PyExc_KeyError))
                        goto error;
2207 2208 2209
                    PyErr_Clear();
                }
            }
Benjamin Peterson's avatar
Benjamin Peterson committed
2210 2211 2212 2213
            if (v == NULL) {
                v = PyDict_GetItem(f->f_globals, name);
                Py_XINCREF(v);
                if (v == NULL) {
2214
                    if (PyDict_CheckExact(f->f_builtins)) {
Benjamin Peterson's avatar
Benjamin Peterson committed
2215 2216
                        v = PyDict_GetItem(f->f_builtins, name);
                        if (v == NULL) {
2217 2218
                            format_exc_check_arg(
                                        PyExc_NameError,
Benjamin Peterson's avatar
Benjamin Peterson committed
2219 2220
                                        NAME_ERROR_MSG, name);
                            goto error;
2221
                        }
Benjamin Peterson's avatar
Benjamin Peterson committed
2222
                        Py_INCREF(v);
2223 2224
                    }
                    else {
Benjamin Peterson's avatar
Benjamin Peterson committed
2225 2226
                        v = PyObject_GetItem(f->f_builtins, name);
                        if (v == NULL) {
2227 2228 2229
                            if (PyErr_ExceptionMatches(PyExc_KeyError))
                                format_exc_check_arg(
                                            PyExc_NameError,
Benjamin Peterson's avatar
Benjamin Peterson committed
2230 2231
                                            NAME_ERROR_MSG, name);
                            goto error;
2232
                        }
Benjamin Peterson's avatar
Benjamin Peterson committed
2233
                    }
2234 2235
                }
            }
Benjamin Peterson's avatar
Benjamin Peterson committed
2236
            PUSH(v);
2237
            DISPATCH();
Benjamin Peterson's avatar
Benjamin Peterson committed
2238
        }
2239

Benjamin Peterson's avatar
Benjamin Peterson committed
2240 2241 2242
        TARGET(LOAD_GLOBAL) {
            PyObject *name = GETITEM(names, oparg);
            PyObject *v;
2243 2244
            if (PyDict_CheckExact(f->f_globals)
                && PyDict_CheckExact(f->f_builtins)) {
Benjamin Peterson's avatar
Benjamin Peterson committed
2245
                v = _PyDict_LoadGlobal((PyDictObject *)f->f_globals,
2246
                                       (PyDictObject *)f->f_builtins,
Benjamin Peterson's avatar
Benjamin Peterson committed
2247 2248
                                       name);
                if (v == NULL) {
2249
                    if (!_PyErr_OCCURRED())
2250
                        format_exc_check_arg(PyExc_NameError,
2251
                                             NAME_ERROR_MSG, name);
Benjamin Peterson's avatar
Benjamin Peterson committed
2252
                    goto error;
2253
                }
Benjamin Peterson's avatar
Benjamin Peterson committed
2254
                Py_INCREF(v);
2255 2256 2257
            }
            else {
                /* Slow-path if globals or builtins is not a dict */
Benjamin Peterson's avatar
Benjamin Peterson committed
2258 2259 2260 2261
                v = PyObject_GetItem(f->f_globals, name);
                if (v == NULL) {
                    v = PyObject_GetItem(f->f_builtins, name);
                    if (v == NULL) {
2262 2263 2264
                        if (PyErr_ExceptionMatches(PyExc_KeyError))
                            format_exc_check_arg(
                                        PyExc_NameError,
2265
                                        NAME_ERROR_MSG, name);
Benjamin Peterson's avatar
Benjamin Peterson committed
2266
                        goto error;
2267 2268 2269
                    }
                }
            }
Benjamin Peterson's avatar
Benjamin Peterson committed
2270
            PUSH(v);
2271
            DISPATCH();
Benjamin Peterson's avatar
Benjamin Peterson committed
2272
        }
2273

Benjamin Peterson's avatar
Benjamin Peterson committed
2274 2275 2276
        TARGET(DELETE_FAST) {
            PyObject *v = GETLOCAL(oparg);
            if (v != NULL) {
2277 2278 2279 2280 2281 2282 2283 2284
                SETLOCAL(oparg, NULL);
                DISPATCH();
            }
            format_exc_check_arg(
                PyExc_UnboundLocalError,
                UNBOUNDLOCAL_ERROR_MSG,
                PyTuple_GetItem(co->co_varnames, oparg)
                );
Benjamin Peterson's avatar
Benjamin Peterson committed
2285 2286
            goto error;
        }
2287

Benjamin Peterson's avatar
Benjamin Peterson committed
2288 2289 2290 2291
        TARGET(DELETE_DEREF) {
            PyObject *cell = freevars[oparg];
            if (PyCell_GET(cell) != NULL) {
                PyCell_Set(cell, NULL);
2292
                DISPATCH();
2293 2294
            }
            format_exc_unbound(co, oparg);
Benjamin Peterson's avatar
Benjamin Peterson committed
2295 2296
            goto error;
        }
2297

Benjamin Peterson's avatar
Benjamin Peterson committed
2298 2299 2300 2301 2302 2303
        TARGET(LOAD_CLOSURE) {
            PyObject *cell = freevars[oparg];
            Py_INCREF(cell);
            PUSH(cell);
            DISPATCH();
        }
2304

2305 2306
        TARGET(LOAD_CLASSDEREF) {
            PyObject *name, *value, *locals = f->f_locals;
2307
            Py_ssize_t idx;
2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337
            assert(locals);
            assert(oparg >= PyTuple_GET_SIZE(co->co_cellvars));
            idx = oparg - PyTuple_GET_SIZE(co->co_cellvars);
            assert(idx >= 0 && idx < PyTuple_GET_SIZE(co->co_freevars));
            name = PyTuple_GET_ITEM(co->co_freevars, idx);
            if (PyDict_CheckExact(locals)) {
                value = PyDict_GetItem(locals, name);
                Py_XINCREF(value);
            }
            else {
                value = PyObject_GetItem(locals, name);
                if (value == NULL && PyErr_Occurred()) {
                    if (!PyErr_ExceptionMatches(PyExc_KeyError))
                        goto error;
                    PyErr_Clear();
                }
            }
            if (!value) {
                PyObject *cell = freevars[oparg];
                value = PyCell_GET(cell);
                if (value == NULL) {
                    format_exc_unbound(co, oparg);
                    goto error;
                }
                Py_INCREF(value);
            }
            PUSH(value);
            DISPATCH();
        }

Benjamin Peterson's avatar
Benjamin Peterson committed
2338 2339 2340 2341 2342 2343
        TARGET(LOAD_DEREF) {
            PyObject *cell = freevars[oparg];
            PyObject *value = PyCell_GET(cell);
            if (value == NULL) {
                format_exc_unbound(co, oparg);
                goto error;
2344
            }
Benjamin Peterson's avatar
Benjamin Peterson committed
2345 2346 2347 2348
            Py_INCREF(value);
            PUSH(value);
            DISPATCH();
        }
2349

Benjamin Peterson's avatar
Benjamin Peterson committed
2350 2351 2352 2353 2354
        TARGET(STORE_DEREF) {
            PyObject *v = POP();
            PyObject *cell = freevars[oparg];
            PyCell_Set(cell, v);
            Py_DECREF(v);
2355
            DISPATCH();
Benjamin Peterson's avatar
Benjamin Peterson committed
2356
        }
2357

Benjamin Peterson's avatar
Benjamin Peterson committed
2358 2359 2360 2361 2362 2363 2364
        TARGET(BUILD_TUPLE) {
            PyObject *tup = PyTuple_New(oparg);
            if (tup == NULL)
                goto error;
            while (--oparg >= 0) {
                PyObject *item = POP();
                PyTuple_SET_ITEM(tup, oparg, item);
2365
            }
Benjamin Peterson's avatar
Benjamin Peterson committed
2366 2367 2368
            PUSH(tup);
            DISPATCH();
        }
2369

Benjamin Peterson's avatar
Benjamin Peterson committed
2370 2371 2372 2373 2374 2375 2376
        TARGET(BUILD_LIST) {
            PyObject *list =  PyList_New(oparg);
            if (list == NULL)
                goto error;
            while (--oparg >= 0) {
                PyObject *item = POP();
                PyList_SET_ITEM(list, oparg, item);
2377
            }
Benjamin Peterson's avatar
Benjamin Peterson committed
2378 2379 2380
            PUSH(list);
            DISPATCH();
        }
2381

Benjamin Peterson's avatar
Benjamin Peterson committed
2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399
        TARGET(BUILD_SET) {
            PyObject *set = PySet_New(NULL);
            int err = 0;
            if (set == NULL)
                goto error;
            while (--oparg >= 0) {
                PyObject *item = POP();
                if (err == 0)
                    err = PySet_Add(set, item);
                Py_DECREF(item);
            }
            if (err != 0) {
                Py_DECREF(set);
                goto error;
            }
            PUSH(set);
            DISPATCH();
        }
2400

Benjamin Peterson's avatar
Benjamin Peterson committed
2401 2402 2403 2404 2405 2406 2407
        TARGET(BUILD_MAP) {
            PyObject *map = _PyDict_NewPresized((Py_ssize_t)oparg);
            if (map == NULL)
                goto error;
            PUSH(map);
            DISPATCH();
        }
2408

Benjamin Peterson's avatar
Benjamin Peterson committed
2409 2410 2411 2412 2413
        TARGET(STORE_MAP) {
            PyObject *key = TOP();
            PyObject *value = SECOND();
            PyObject *map = THIRD();
            int err;
2414
            STACKADJ(-2);
Benjamin Peterson's avatar
Benjamin Peterson committed
2415 2416 2417 2418 2419 2420 2421 2422
            assert(PyDict_CheckExact(map));
            err = PyDict_SetItem(map, key, value);
            Py_DECREF(value);
            Py_DECREF(key);
            if (err != 0)
                goto error;
            DISPATCH();
        }
2423

Benjamin Peterson's avatar
Benjamin Peterson committed
2424 2425 2426 2427 2428
        TARGET(MAP_ADD) {
            PyObject *key = TOP();
            PyObject *value = SECOND();
            PyObject *map;
            int err;
2429
            STACKADJ(-2);
Benjamin Peterson's avatar
Benjamin Peterson committed
2430 2431 2432 2433 2434 2435 2436 2437 2438 2439
            map = stack_pointer[-oparg];  /* dict */
            assert(PyDict_CheckExact(map));
            err = PyDict_SetItem(map, key, value);  /* v[w] = u */
            Py_DECREF(value);
            Py_DECREF(key);
            if (err != 0)
                goto error;
            PREDICT(JUMP_ABSOLUTE);
            DISPATCH();
        }
2440

Benjamin Peterson's avatar
Benjamin Peterson committed
2441 2442 2443 2444 2445 2446 2447 2448 2449 2450
        TARGET(LOAD_ATTR) {
            PyObject *name = GETITEM(names, oparg);
            PyObject *owner = TOP();
            PyObject *res = PyObject_GetAttr(owner, name);
            Py_DECREF(owner);
            SET_TOP(res);
            if (res == NULL)
                goto error;
            DISPATCH();
        }
2451

Benjamin Peterson's avatar
Benjamin Peterson committed
2452 2453 2454 2455 2456 2457 2458 2459 2460
        TARGET(COMPARE_OP) {
            PyObject *right = POP();
            PyObject *left = TOP();
            PyObject *res = cmp_outcome(oparg, left, right);
            Py_DECREF(left);
            Py_DECREF(right);
            SET_TOP(res);
            if (res == NULL)
                goto error;
2461 2462 2463
            PREDICT(POP_JUMP_IF_FALSE);
            PREDICT(POP_JUMP_IF_TRUE);
            DISPATCH();
Benjamin Peterson's avatar
Benjamin Peterson committed
2464
        }
2465

Benjamin Peterson's avatar
Benjamin Peterson committed
2466
        TARGET(IMPORT_NAME) {
2467
            _Py_IDENTIFIER(__import__);
Benjamin Peterson's avatar
Benjamin Peterson committed
2468 2469
            PyObject *name = GETITEM(names, oparg);
            PyObject *func = _PyDict_GetItemId(f->f_builtins, &PyId___import__);
2470
            PyObject *from, *level, *args, *res;
Benjamin Peterson's avatar
Benjamin Peterson committed
2471
            if (func == NULL) {
2472 2473
                PyErr_SetString(PyExc_ImportError,
                                "__import__ not found");
Benjamin Peterson's avatar
Benjamin Peterson committed
2474 2475 2476 2477 2478 2479 2480 2481
                goto error;
            }
            Py_INCREF(func);
            from = POP();
            level = TOP();
            if (PyLong_AsLong(level) != -1 || PyErr_Occurred())
                args = PyTuple_Pack(5,
                            name,
2482 2483 2484
                            f->f_globals,
                            f->f_locals == NULL ?
                                  Py_None : f->f_locals,
Benjamin Peterson's avatar
Benjamin Peterson committed
2485 2486
                            from,
                            level);
2487
            else
Benjamin Peterson's avatar
Benjamin Peterson committed
2488 2489
                args = PyTuple_Pack(4,
                            name,
2490 2491 2492
                            f->f_globals,
                            f->f_locals == NULL ?
                                  Py_None : f->f_locals,
Benjamin Peterson's avatar
Benjamin Peterson committed
2493 2494 2495 2496 2497 2498 2499
                            from);
            Py_DECREF(level);
            Py_DECREF(from);
            if (args == NULL) {
                Py_DECREF(func);
                STACKADJ(-1);
                goto error;
2500 2501
            }
            READ_TIMESTAMP(intr0);
2502
            res = PyEval_CallObject(func, args);
2503
            READ_TIMESTAMP(intr1);
Benjamin Peterson's avatar
Benjamin Peterson committed
2504 2505 2506 2507 2508 2509
            Py_DECREF(args);
            Py_DECREF(func);
            SET_TOP(res);
            if (res == NULL)
                goto error;
            DISPATCH();
2510
        }
2511

Benjamin Peterson's avatar
Benjamin Peterson committed
2512 2513 2514
        TARGET(IMPORT_STAR) {
            PyObject *from = POP(), *locals;
            int err;
2515 2516 2517
            if (PyFrame_FastToLocalsWithError(f) < 0)
                goto error;

Benjamin Peterson's avatar
Benjamin Peterson committed
2518 2519
            locals = f->f_locals;
            if (locals == NULL) {
2520 2521
                PyErr_SetString(PyExc_SystemError,
                    "no locals found during 'import *'");
Benjamin Peterson's avatar
Benjamin Peterson committed
2522
                goto error;
2523 2524
            }
            READ_TIMESTAMP(intr0);
Benjamin Peterson's avatar
Benjamin Peterson committed
2525
            err = import_all_from(locals, from);
2526 2527
            READ_TIMESTAMP(intr1);
            PyFrame_LocalsToFast(f, 0);
Benjamin Peterson's avatar
Benjamin Peterson committed
2528 2529 2530 2531 2532
            Py_DECREF(from);
            if (err != 0)
                goto error;
            DISPATCH();
        }
2533

Benjamin Peterson's avatar
Benjamin Peterson committed
2534 2535 2536 2537
        TARGET(IMPORT_FROM) {
            PyObject *name = GETITEM(names, oparg);
            PyObject *from = TOP();
            PyObject *res;
2538
            READ_TIMESTAMP(intr0);
Benjamin Peterson's avatar
Benjamin Peterson committed
2539
            res = import_from(from, name);
2540
            READ_TIMESTAMP(intr1);
Benjamin Peterson's avatar
Benjamin Peterson committed
2541 2542 2543 2544 2545
            PUSH(res);
            if (res == NULL)
                goto error;
            DISPATCH();
        }
2546

Benjamin Peterson's avatar
Benjamin Peterson committed
2547
        TARGET(JUMP_FORWARD) {
2548 2549
            JUMPBY(oparg);
            FAST_DISPATCH();
Benjamin Peterson's avatar
Benjamin Peterson committed
2550
        }
2551 2552

        PREDICTED_WITH_ARG(POP_JUMP_IF_FALSE);
Benjamin Peterson's avatar
Benjamin Peterson committed
2553 2554 2555 2556 2557
        TARGET(POP_JUMP_IF_FALSE) {
            PyObject *cond = POP();
            int err;
            if (cond == Py_True) {
                Py_DECREF(cond);
2558 2559
                FAST_DISPATCH();
            }
Benjamin Peterson's avatar
Benjamin Peterson committed
2560 2561
            if (cond == Py_False) {
                Py_DECREF(cond);
2562 2563 2564
                JUMPTO(oparg);
                FAST_DISPATCH();
            }
Benjamin Peterson's avatar
Benjamin Peterson committed
2565 2566
            err = PyObject_IsTrue(cond);
            Py_DECREF(cond);
2567 2568 2569 2570 2571
            if (err > 0)
                err = 0;
            else if (err == 0)
                JUMPTO(oparg);
            else
Benjamin Peterson's avatar
Benjamin Peterson committed
2572
                goto error;
2573
            DISPATCH();
Benjamin Peterson's avatar
Benjamin Peterson committed
2574
        }
2575 2576

        PREDICTED_WITH_ARG(POP_JUMP_IF_TRUE);
Benjamin Peterson's avatar
Benjamin Peterson committed
2577 2578 2579 2580 2581
        TARGET(POP_JUMP_IF_TRUE) {
            PyObject *cond = POP();
            int err;
            if (cond == Py_False) {
                Py_DECREF(cond);
2582 2583
                FAST_DISPATCH();
            }
Benjamin Peterson's avatar
Benjamin Peterson committed
2584 2585
            if (cond == Py_True) {
                Py_DECREF(cond);
2586 2587 2588
                JUMPTO(oparg);
                FAST_DISPATCH();
            }
Benjamin Peterson's avatar
Benjamin Peterson committed
2589 2590
            err = PyObject_IsTrue(cond);
            Py_DECREF(cond);
2591 2592 2593 2594 2595 2596 2597
            if (err > 0) {
                err = 0;
                JUMPTO(oparg);
            }
            else if (err == 0)
                ;
            else
Benjamin Peterson's avatar
Benjamin Peterson committed
2598
                goto error;
2599
            DISPATCH();
Benjamin Peterson's avatar
Benjamin Peterson committed
2600
        }
2601

Benjamin Peterson's avatar
Benjamin Peterson committed
2602 2603 2604 2605
        TARGET(JUMP_IF_FALSE_OR_POP) {
            PyObject *cond = TOP();
            int err;
            if (cond == Py_True) {
2606
                STACKADJ(-1);
Benjamin Peterson's avatar
Benjamin Peterson committed
2607
                Py_DECREF(cond);
2608 2609
                FAST_DISPATCH();
            }
Benjamin Peterson's avatar
Benjamin Peterson committed
2610
            if (cond == Py_False) {
2611 2612 2613
                JUMPTO(oparg);
                FAST_DISPATCH();
            }
Benjamin Peterson's avatar
Benjamin Peterson committed
2614
            err = PyObject_IsTrue(cond);
2615 2616
            if (err > 0) {
                STACKADJ(-1);
Benjamin Peterson's avatar
Benjamin Peterson committed
2617
                Py_DECREF(cond);
2618 2619 2620 2621 2622
                err = 0;
            }
            else if (err == 0)
                JUMPTO(oparg);
            else
Benjamin Peterson's avatar
Benjamin Peterson committed
2623
                goto error;
2624
            DISPATCH();
Benjamin Peterson's avatar
Benjamin Peterson committed
2625
        }
2626

Benjamin Peterson's avatar
Benjamin Peterson committed
2627 2628 2629 2630
        TARGET(JUMP_IF_TRUE_OR_POP) {
            PyObject *cond = TOP();
            int err;
            if (cond == Py_False) {
2631
                STACKADJ(-1);
Benjamin Peterson's avatar
Benjamin Peterson committed
2632
                Py_DECREF(cond);
2633 2634
                FAST_DISPATCH();
            }
Benjamin Peterson's avatar
Benjamin Peterson committed
2635
            if (cond == Py_True) {
2636 2637 2638
                JUMPTO(oparg);
                FAST_DISPATCH();
            }
Benjamin Peterson's avatar
Benjamin Peterson committed
2639
            err = PyObject_IsTrue(cond);
2640 2641 2642 2643 2644 2645
            if (err > 0) {
                err = 0;
                JUMPTO(oparg);
            }
            else if (err == 0) {
                STACKADJ(-1);
Benjamin Peterson's avatar
Benjamin Peterson committed
2646
                Py_DECREF(cond);
2647 2648
            }
            else
Benjamin Peterson's avatar
Benjamin Peterson committed
2649
                goto error;
2650
            DISPATCH();
Benjamin Peterson's avatar
Benjamin Peterson committed
2651
        }
2652 2653

        PREDICTED_WITH_ARG(JUMP_ABSOLUTE);
Benjamin Peterson's avatar
Benjamin Peterson committed
2654
        TARGET(JUMP_ABSOLUTE) {
2655
            JUMPTO(oparg);
2656
#if FAST_LOOPS
2657 2658 2659 2660 2661 2662 2663 2664
            /* Enabling this path speeds-up all while and for-loops by bypassing
               the per-loop checks for signals.  By default, this should be turned-off
               because it prevents detection of a control-break in tight loops like
               "while 1: pass".  Compile with this option turned-on when you need
               the speed-up and do not need break checking inside tight loops (ones
               that contain only instructions ending with FAST_DISPATCH).
            */
            FAST_DISPATCH();
2665
#else
2666
            DISPATCH();
2667
#endif
Benjamin Peterson's avatar
Benjamin Peterson committed
2668
        }
Guido van Rossum's avatar
Guido van Rossum committed
2669

Benjamin Peterson's avatar
Benjamin Peterson committed
2670
        TARGET(GET_ITER) {
2671
            /* before: [obj]; after [getiter(obj)] */
Benjamin Peterson's avatar
Benjamin Peterson committed
2672 2673 2674 2675 2676 2677 2678 2679 2680
            PyObject *iterable = TOP();
            PyObject *iter = PyObject_GetIter(iterable);
            Py_DECREF(iterable);
            SET_TOP(iter);
            if (iter == NULL)
                goto error;
            PREDICT(FOR_ITER);
            DISPATCH();
        }
2681 2682

        PREDICTED_WITH_ARG(FOR_ITER);
Benjamin Peterson's avatar
Benjamin Peterson committed
2683
        TARGET(FOR_ITER) {
2684
            /* before: [iter]; after: [iter, iter()] *or* [] */
Benjamin Peterson's avatar
Benjamin Peterson committed
2685 2686 2687 2688
            PyObject *iter = TOP();
            PyObject *next = (*iter->ob_type->tp_iternext)(iter);
            if (next != NULL) {
                PUSH(next);
2689 2690 2691 2692 2693
                PREDICT(STORE_FAST);
                PREDICT(UNPACK_SEQUENCE);
                DISPATCH();
            }
            if (PyErr_Occurred()) {
Benjamin Peterson's avatar
Benjamin Peterson committed
2694 2695
                if (!PyErr_ExceptionMatches(PyExc_StopIteration))
                    goto error;
2696
                else if (tstate->c_tracefunc != NULL)
2697
                    call_exc_trace(tstate->c_tracefunc, tstate->c_traceobj, tstate, f);
2698 2699 2700
                PyErr_Clear();
            }
            /* iterator ended normally */
Benjamin Peterson's avatar
Benjamin Peterson committed
2701 2702
            STACKADJ(-1);
            Py_DECREF(iter);
2703 2704
            JUMPBY(oparg);
            DISPATCH();
Benjamin Peterson's avatar
Benjamin Peterson committed
2705
        }
2706

Benjamin Peterson's avatar
Benjamin Peterson committed
2707
        TARGET(BREAK_LOOP) {
2708 2709
            why = WHY_BREAK;
            goto fast_block_end;
Benjamin Peterson's avatar
Benjamin Peterson committed
2710
        }
2711

Benjamin Peterson's avatar
Benjamin Peterson committed
2712
        TARGET(CONTINUE_LOOP) {
2713
            retval = PyLong_FromLong(oparg);
Benjamin Peterson's avatar
Benjamin Peterson committed
2714 2715
            if (retval == NULL)
                goto error;
2716 2717
            why = WHY_CONTINUE;
            goto fast_block_end;
Benjamin Peterson's avatar
Benjamin Peterson committed
2718
        }
2719 2720 2721 2722

        TARGET_WITH_IMPL(SETUP_LOOP, _setup_finally)
        TARGET_WITH_IMPL(SETUP_EXCEPT, _setup_finally)
        TARGET(SETUP_FINALLY)
Benjamin Peterson's avatar
Benjamin Peterson committed
2723
        _setup_finally: {
2724 2725 2726 2727 2728 2729 2730 2731
            /* NOTE: If you add any new block-setup opcodes that
               are not try/except/finally handlers, you may need
               to update the PyGen_NeedsFinalizing() function.
               */

            PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
                               STACK_LEVEL());
            DISPATCH();
Benjamin Peterson's avatar
Benjamin Peterson committed
2732
        }
2733

Benjamin Peterson's avatar
Benjamin Peterson committed
2734
        TARGET(SETUP_WITH) {
2735 2736
            _Py_IDENTIFIER(__exit__);
            _Py_IDENTIFIER(__enter__);
Benjamin Peterson's avatar
Benjamin Peterson committed
2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750
            PyObject *mgr = TOP();
            PyObject *exit = special_lookup(mgr, &PyId___exit__), *enter;
            PyObject *res;
            if (exit == NULL)
                goto error;
            SET_TOP(exit);
            enter = special_lookup(mgr, &PyId___enter__);
            Py_DECREF(mgr);
            if (enter == NULL)
                goto error;
            res = PyObject_CallFunctionObjArgs(enter, NULL);
            Py_DECREF(enter);
            if (res == NULL)
                goto error;
2751 2752 2753 2754 2755
            /* Setup the finally block before pushing the result
               of __enter__ on the stack. */
            PyFrame_BlockSetup(f, SETUP_FINALLY, INSTR_OFFSET() + oparg,
                               STACK_LEVEL());

Benjamin Peterson's avatar
Benjamin Peterson committed
2756
            PUSH(res);
2757 2758 2759
            DISPATCH();
        }

Benjamin Peterson's avatar
Benjamin Peterson committed
2760
        TARGET(WITH_CLEANUP) {
Benjamin Peterson's avatar
Benjamin Peterson committed
2761
            /* At the top of the stack are 1-6 values indicating
2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773
               how/why we entered the finally clause:
               - TOP = None
               - (TOP, SECOND) = (WHY_{RETURN,CONTINUE}), retval
               - TOP = WHY_*; no retval below it
               - (TOP, SECOND, THIRD) = exc_info()
                 (FOURTH, FITH, SIXTH) = previous exception for EXCEPT_HANDLER
               Below them is EXIT, the context.__exit__ bound method.
               In the last case, we must call
                 EXIT(TOP, SECOND, THIRD)
               otherwise we must call
                 EXIT(None, None, None)

Benjamin Peterson's avatar
Benjamin Peterson committed
2774
               In the first three cases, we remove EXIT from the
2775
               stack, leaving the rest in the same order.  In the
Benjamin Peterson's avatar
Benjamin Peterson committed
2776
               fourth case, we shift the bottom 3 values of the
2777 2778 2779 2780 2781 2782 2783 2784 2785 2786
               stack down, and replace the empty spot with NULL.

               In addition, if the stack represents an exception,
               *and* the function call returns a 'true' value, we
               push WHY_SILENCED onto the stack.  END_FINALLY will
               then not re-raise the exception.  (But non-local
               gotos should still be resumed.)
            */

            PyObject *exit_func;
Benjamin Peterson's avatar
Benjamin Peterson committed
2787 2788 2789
            PyObject *exc = TOP(), *val = Py_None, *tb = Py_None, *res;
            int err;
            if (exc == Py_None) {
2790 2791
                (void)POP();
                exit_func = TOP();
Benjamin Peterson's avatar
Benjamin Peterson committed
2792
                SET_TOP(exc);
2793
            }
Benjamin Peterson's avatar
Benjamin Peterson committed
2794 2795 2796
            else if (PyLong_Check(exc)) {
                STACKADJ(-1);
                switch (PyLong_AsLong(exc)) {
2797 2798 2799 2800 2801
                case WHY_RETURN:
                case WHY_CONTINUE:
                    /* Retval in TOP. */
                    exit_func = SECOND();
                    SET_SECOND(TOP());
Benjamin Peterson's avatar
Benjamin Peterson committed
2802
                    SET_TOP(exc);
2803 2804 2805
                    break;
                default:
                    exit_func = TOP();
Benjamin Peterson's avatar
Benjamin Peterson committed
2806
                    SET_TOP(exc);
2807 2808
                    break;
                }
Benjamin Peterson's avatar
Benjamin Peterson committed
2809
                exc = Py_None;
2810 2811
            }
            else {
Benjamin Peterson's avatar
Benjamin Peterson committed
2812
                PyObject *tp2, *exc2, *tb2;
2813
                PyTryBlock *block;
Benjamin Peterson's avatar
Benjamin Peterson committed
2814 2815 2816 2817 2818
                val = SECOND();
                tb = THIRD();
                tp2 = FOURTH();
                exc2 = PEEK(5);
                tb2 = PEEK(6);
2819
                exit_func = PEEK(7);
Benjamin Peterson's avatar
Benjamin Peterson committed
2820 2821 2822
                SET_VALUE(7, tb2);
                SET_VALUE(6, exc2);
                SET_VALUE(5, tp2);
2823 2824 2825 2826 2827 2828 2829 2830 2831 2832
                /* UNWIND_EXCEPT_HANDLER will pop this off. */
                SET_FOURTH(NULL);
                /* We just shifted the stack down, so we have
                   to tell the except handler block that the
                   values are lower than it expects. */
                block = &f->f_blockstack[f->f_iblock - 1];
                assert(block->b_type == EXCEPT_HANDLER);
                block->b_level--;
            }
            /* XXX Not the fastest way to call it... */
Benjamin Peterson's avatar
Benjamin Peterson committed
2833
            res = PyObject_CallFunctionObjArgs(exit_func, exc, val, tb, NULL);
2834
            Py_DECREF(exit_func);
Benjamin Peterson's avatar
Benjamin Peterson committed
2835 2836
            if (res == NULL)
                goto error;
2837

Benjamin Peterson's avatar
Benjamin Peterson committed
2838 2839
            if (exc != Py_None)
                err = PyObject_IsTrue(res);
2840 2841
            else
                err = 0;
Benjamin Peterson's avatar
Benjamin Peterson committed
2842
            Py_DECREF(res);
2843 2844

            if (err < 0)
Benjamin Peterson's avatar
Benjamin Peterson committed
2845
                goto error;
2846 2847 2848 2849 2850 2851
            else if (err > 0) {
                err = 0;
                /* There was an exception and a True return */
                PUSH(PyLong_FromLong((long) WHY_SILENCED));
            }
            PREDICT(END_FINALLY);
Benjamin Peterson's avatar
Benjamin Peterson committed
2852
            DISPATCH();
2853 2854
        }

Benjamin Peterson's avatar
Benjamin Peterson committed
2855 2856
        TARGET(CALL_FUNCTION) {
            PyObject **sp, *res;
2857 2858
            PCALL(PCALL_ALL);
            sp = stack_pointer;
2859
#ifdef WITH_TSC
Benjamin Peterson's avatar
Benjamin Peterson committed
2860
            res = call_function(&sp, oparg, &intr0, &intr1);
2861
#else
Benjamin Peterson's avatar
Benjamin Peterson committed
2862
            res = call_function(&sp, oparg);
2863
#endif
2864
            stack_pointer = sp;
Benjamin Peterson's avatar
Benjamin Peterson committed
2865 2866 2867 2868
            PUSH(res);
            if (res == NULL)
                goto error;
            DISPATCH();
2869 2870 2871 2872 2873
        }

        TARGET_WITH_IMPL(CALL_FUNCTION_VAR, _call_function_var_kw)
        TARGET_WITH_IMPL(CALL_FUNCTION_KW, _call_function_var_kw)
        TARGET(CALL_FUNCTION_VAR_KW)
Benjamin Peterson's avatar
Benjamin Peterson committed
2874
        _call_function_var_kw: {
2875 2876 2877 2878
            int na = oparg & 0xff;
            int nk = (oparg>>8) & 0xff;
            int flags = (opcode - CALL_FUNCTION) & 3;
            int n = na + 2 * nk;
Benjamin Peterson's avatar
Benjamin Peterson committed
2879
            PyObject **pfunc, *func, **sp, *res;
2880 2881 2882 2883 2884 2885 2886 2887 2888
            PCALL(PCALL_ALL);
            if (flags & CALL_FLAG_VAR)
                n++;
            if (flags & CALL_FLAG_KW)
                n++;
            pfunc = stack_pointer - n - 1;
            func = *pfunc;

            if (PyMethod_Check(func)
2889
                && PyMethod_GET_SELF(func) != NULL) {
2890 2891 2892 2893 2894 2895 2896
                PyObject *self = PyMethod_GET_SELF(func);
                Py_INCREF(self);
                func = PyMethod_GET_FUNCTION(func);
                Py_INCREF(func);
                Py_DECREF(*pfunc);
                *pfunc = self;
                na++;
2897
                /* n++; */
2898 2899 2900 2901
            } else
                Py_INCREF(func);
            sp = stack_pointer;
            READ_TIMESTAMP(intr0);
Benjamin Peterson's avatar
Benjamin Peterson committed
2902
            res = ext_do_call(func, &sp, flags, na, nk);
2903 2904 2905 2906 2907
            READ_TIMESTAMP(intr1);
            stack_pointer = sp;
            Py_DECREF(func);

            while (stack_pointer > pfunc) {
Benjamin Peterson's avatar
Benjamin Peterson committed
2908 2909
                PyObject *o = POP();
                Py_DECREF(o);
2910
            }
Benjamin Peterson's avatar
Benjamin Peterson committed
2911 2912 2913 2914
            PUSH(res);
            if (res == NULL)
                goto error;
            DISPATCH();
2915 2916 2917 2918
        }

        TARGET_WITH_IMPL(MAKE_CLOSURE, _make_function)
        TARGET(MAKE_FUNCTION)
Benjamin Peterson's avatar
Benjamin Peterson committed
2919
        _make_function: {
2920 2921 2922 2923
            int posdefaults = oparg & 0xff;
            int kwdefaults = (oparg>>8) & 0xff;
            int num_annotations = (oparg >> 16) & 0x7fff;

Benjamin Peterson's avatar
Benjamin Peterson committed
2924 2925 2926 2927 2928 2929 2930 2931
            PyObject *qualname = POP(); /* qualname */
            PyObject *code = POP(); /* code object */
            PyObject *func = PyFunction_NewWithQualName(code, f->f_globals, qualname);
            Py_DECREF(code);
            Py_DECREF(qualname);

            if (func == NULL)
                goto error;
2932

Benjamin Peterson's avatar
Benjamin Peterson committed
2933 2934 2935
            if (opcode == MAKE_CLOSURE) {
                PyObject *closure = POP();
                if (PyFunction_SetClosure(func, closure) != 0) {
2936
                    /* Can't happen unless bytecode is corrupt. */
Benjamin Peterson's avatar
Benjamin Peterson committed
2937 2938 2939
                    Py_DECREF(func);
                    Py_DECREF(closure);
                    goto error;
2940
                }
Benjamin Peterson's avatar
Benjamin Peterson committed
2941
                Py_DECREF(closure);
2942 2943
            }

Benjamin Peterson's avatar
Benjamin Peterson committed
2944
            if (num_annotations > 0) {
2945
                Py_ssize_t name_ix;
Benjamin Peterson's avatar
Benjamin Peterson committed
2946 2947 2948 2949 2950
                PyObject *names = POP(); /* names of args with annotations */
                PyObject *anns = PyDict_New();
                if (anns == NULL) {
                    Py_DECREF(func);
                    goto error;
2951
                }
Benjamin Peterson's avatar
Benjamin Peterson committed
2952
                name_ix = PyTuple_Size(names);
2953 2954
                assert(num_annotations == name_ix+1);
                while (name_ix > 0) {
Benjamin Peterson's avatar
Benjamin Peterson committed
2955 2956
                    PyObject *name, *value;
                    int err;
2957
                    --name_ix;
Benjamin Peterson's avatar
Benjamin Peterson committed
2958 2959 2960 2961 2962 2963 2964 2965 2966
                    name = PyTuple_GET_ITEM(names, name_ix);
                    value = POP();
                    err = PyDict_SetItem(anns, name, value);
                    Py_DECREF(value);
                    if (err != 0) {
                        Py_DECREF(anns);
                        Py_DECREF(func);
                        goto error;
                    }
2967 2968
                }

Benjamin Peterson's avatar
Benjamin Peterson committed
2969
                if (PyFunction_SetAnnotations(func, anns) != 0) {
2970 2971
                    /* Can't happen unless
                       PyFunction_SetAnnotations changes. */
Benjamin Peterson's avatar
Benjamin Peterson committed
2972 2973 2974
                    Py_DECREF(anns);
                    Py_DECREF(func);
                    goto error;
2975
                }
Benjamin Peterson's avatar
Benjamin Peterson committed
2976 2977
                Py_DECREF(anns);
                Py_DECREF(names);
2978 2979 2980
            }

            /* XXX Maybe this should be a separate opcode? */
Benjamin Peterson's avatar
Benjamin Peterson committed
2981 2982 2983 2984 2985
            if (kwdefaults > 0) {
                PyObject *defs = PyDict_New();
                if (defs == NULL) {
                    Py_DECREF(func);
                    goto error;
2986 2987
                }
                while (--kwdefaults >= 0) {
Benjamin Peterson's avatar
Benjamin Peterson committed
2988 2989 2990 2991 2992 2993 2994 2995 2996 2997
                    PyObject *v = POP(); /* default value */
                    PyObject *key = POP(); /* kw only arg name */
                    int err = PyDict_SetItem(defs, key, v);
                    Py_DECREF(v);
                    Py_DECREF(key);
                    if (err != 0) {
                        Py_DECREF(defs);
                        Py_DECREF(func);
                        goto error;
                    }
2998
                }
Benjamin Peterson's avatar
Benjamin Peterson committed
2999
                if (PyFunction_SetKwDefaults(func, defs) != 0) {
3000 3001
                    /* Can't happen unless
                       PyFunction_SetKwDefaults changes. */
Benjamin Peterson's avatar
Benjamin Peterson committed
3002 3003 3004
                    Py_DECREF(func);
                    Py_DECREF(defs);
                    goto error;
3005
                }
Benjamin Peterson's avatar
Benjamin Peterson committed
3006
                Py_DECREF(defs);
3007
            }
3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024
            if (posdefaults > 0) {
                PyObject *defs = PyTuple_New(posdefaults);
                if (defs == NULL) {
                    Py_DECREF(func);
                    goto error;
                }
                while (--posdefaults >= 0)
                    PyTuple_SET_ITEM(defs, posdefaults, POP());
                if (PyFunction_SetDefaults(func, defs) != 0) {
                    /* Can't happen unless
                       PyFunction_SetDefaults changes. */
                    Py_DECREF(defs);
                    Py_DECREF(func);
                    goto error;
                }
                Py_DECREF(defs);
            }
Benjamin Peterson's avatar
Benjamin Peterson committed
3025 3026
            PUSH(func);
            DISPATCH();
3027 3028
        }

Benjamin Peterson's avatar
Benjamin Peterson committed
3029 3030
        TARGET(BUILD_SLICE) {
            PyObject *start, *stop, *step, *slice;
3031
            if (oparg == 3)
Benjamin Peterson's avatar
Benjamin Peterson committed
3032
                step = POP();
3033
            else
Benjamin Peterson's avatar
Benjamin Peterson committed
3034 3035 3036 3037 3038 3039 3040 3041 3042 3043 3044 3045
                step = NULL;
            stop = POP();
            start = TOP();
            slice = PySlice_New(start, stop, step);
            Py_DECREF(start);
            Py_DECREF(stop);
            Py_XDECREF(step);
            SET_TOP(slice);
            if (slice == NULL)
                goto error;
            DISPATCH();
        }
3046

Benjamin Peterson's avatar
Benjamin Peterson committed
3047
        TARGET(EXTENDED_ARG) {
3048 3049 3050
            opcode = NEXTOP();
            oparg = oparg<<16 | NEXTARG();
            goto dispatch_opcode;
Benjamin Peterson's avatar
Benjamin Peterson committed
3051
        }
3052

3053
#if USE_COMPUTED_GOTOS
3054
        _unknown_opcode:
3055
#endif
3056 3057 3058 3059 3060 3061
        default:
            fprintf(stderr,
                "XXX lineno: %d, opcode: %d\n",
                PyFrame_GetLineNumber(f),
                opcode);
            PyErr_SetString(PyExc_SystemError, "unknown opcode");
Benjamin Peterson's avatar
Benjamin Peterson committed
3062
            goto error;
3063 3064

#ifdef CASE_TOO_BIG
3065
        }
3066 3067
#endif

3068
        } /* switch */
Guido van Rossum's avatar
Guido van Rossum committed
3069

Benjamin Peterson's avatar
Benjamin Peterson committed
3070 3071 3072
        /* This should never be reached. Every opcode should end with DISPATCH()
           or goto error. */
        assert(0);
Guido van Rossum's avatar
Guido van Rossum committed
3073

Benjamin Peterson's avatar
Benjamin Peterson committed
3074
error:
3075
        READ_TIMESTAMP(inst1);
3076

Benjamin Peterson's avatar
Benjamin Peterson committed
3077 3078
        assert(why == WHY_NOT);
        why = WHY_EXCEPTION;
Guido van Rossum's avatar
Guido van Rossum committed
3079

Benjamin Peterson's avatar
Benjamin Peterson committed
3080
        /* Double-check exception status. */
3081
#ifdef NDEBUG
Benjamin Peterson's avatar
Benjamin Peterson committed
3082 3083 3084
        if (!PyErr_Occurred())
            PyErr_SetString(PyExc_SystemError,
                            "error return without exception set");
3085 3086 3087
#else
        assert(PyErr_Occurred());
#endif
Guido van Rossum's avatar
Guido van Rossum committed
3088

Benjamin Peterson's avatar
Benjamin Peterson committed
3089 3090
        /* Log traceback info. */
        PyTraceBack_Here(f);
Guido van Rossum's avatar
Guido van Rossum committed
3091

3092
        if (tstate->c_tracefunc != NULL)
3093 3094
            call_exc_trace(tstate->c_tracefunc, tstate->c_traceobj,
                           tstate, f);
Guido van Rossum's avatar
Guido van Rossum committed
3095

Benjamin Peterson's avatar
Benjamin Peterson committed
3096 3097
fast_block_end:
        assert(why != WHY_NOT);
3098

3099 3100 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119 3120 3121 3122 3123 3124 3125 3126 3127 3128 3129 3130 3131 3132 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145
        /* Unwind stacks if a (pseudo) exception occurred */
        while (why != WHY_NOT && f->f_iblock > 0) {
            /* Peek at the current block. */
            PyTryBlock *b = &f->f_blockstack[f->f_iblock - 1];

            assert(why != WHY_YIELD);
            if (b->b_type == SETUP_LOOP && why == WHY_CONTINUE) {
                why = WHY_NOT;
                JUMPTO(PyLong_AS_LONG(retval));
                Py_DECREF(retval);
                break;
            }
            /* Now we have to pop the block. */
            f->f_iblock--;

            if (b->b_type == EXCEPT_HANDLER) {
                UNWIND_EXCEPT_HANDLER(b);
                continue;
            }
            UNWIND_BLOCK(b);
            if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
                why = WHY_NOT;
                JUMPTO(b->b_handler);
                break;
            }
            if (why == WHY_EXCEPTION && (b->b_type == SETUP_EXCEPT
                || b->b_type == SETUP_FINALLY)) {
                PyObject *exc, *val, *tb;
                int handler = b->b_handler;
                /* Beware, this invalidates all b->b_* fields */
                PyFrame_BlockSetup(f, EXCEPT_HANDLER, -1, STACK_LEVEL());
                PUSH(tstate->exc_traceback);
                PUSH(tstate->exc_value);
                if (tstate->exc_type != NULL) {
                    PUSH(tstate->exc_type);
                }
                else {
                    Py_INCREF(Py_None);
                    PUSH(Py_None);
                }
                PyErr_Fetch(&exc, &val, &tb);
                /* Make the raw exception data
                   available to the handler,
                   so a program can emulate the
                   Python main loop. */
                PyErr_NormalizeException(
                    &exc, &val, &tb);
3146 3147 3148 3149
                if (tb != NULL)
                    PyException_SetTraceback(val, tb);
                else
                    PyException_SetTraceback(val, Py_None);
3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 3160 3161 3162 3163 3164 3165 3166 3167 3168 3169 3170 3171 3172 3173 3174 3175 3176 3177 3178 3179 3180
                Py_INCREF(exc);
                tstate->exc_type = exc;
                Py_INCREF(val);
                tstate->exc_value = val;
                tstate->exc_traceback = tb;
                if (tb == NULL)
                    tb = Py_None;
                Py_INCREF(tb);
                PUSH(tb);
                PUSH(val);
                PUSH(exc);
                why = WHY_NOT;
                JUMPTO(handler);
                break;
            }
            if (b->b_type == SETUP_FINALLY) {
                if (why & (WHY_RETURN | WHY_CONTINUE))
                    PUSH(retval);
                PUSH(PyLong_FromLong((long)why));
                why = WHY_NOT;
                JUMPTO(b->b_handler);
                break;
            }
        } /* unwind stack */

        /* End the loop if we still have an error (or return) */

        if (why != WHY_NOT)
            break;
        READ_TIMESTAMP(loop1);

3181 3182
        assert(!PyErr_Occurred());

3183 3184 3185 3186 3187
    } /* main loop */

    assert(why != WHY_YIELD);
    /* Pop remaining stack entries. */
    while (!EMPTY()) {
Benjamin Peterson's avatar
Benjamin Peterson committed
3188 3189
        PyObject *o = POP();
        Py_XDECREF(o);
3190 3191 3192 3193
    }

    if (why != WHY_RETURN)
        retval = NULL;
Guido van Rossum's avatar
Guido van Rossum committed
3194

3195
    assert((retval != NULL) ^ (PyErr_Occurred() != NULL));
3196

3197
fast_yield:
3198 3199
    if (co->co_flags & CO_GENERATOR) {

3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213
        /* The purpose of this block is to put aside the generator's exception
           state and restore that of the calling frame. If the current
           exception state is from the caller, we clear the exception values
           on the generator frame, so they are not swapped back in latter. The
           origin of the current exception state is determined by checking for
           except handler blocks, which we must be in iff a new exception
           state came into existence in this frame. (An uncaught exception
           would have why == WHY_EXCEPTION, and we wouldn't be here). */
        int i;
        for (i = 0; i < f->f_iblock; i++)
            if (f->f_blockstack[i].b_type == EXCEPT_HANDLER)
                break;
        if (i == f->f_iblock)
            /* We did not create this exception. */
3214
            restore_and_clear_exc_state(tstate, f);
3215
        else
3216
            swap_exc_state(tstate, f);
3217
    }
3218

3219
    if (tstate->use_tracing) {
3220
        if (tstate->c_tracefunc) {
3221
            if (why == WHY_RETURN || why == WHY_YIELD) {
3222 3223
                if (call_trace(tstate->c_tracefunc, tstate->c_traceobj,
                               tstate, f,
3224
                               PyTrace_RETURN, retval)) {
3225
                    Py_CLEAR(retval);
3226 3227 3228 3229
                    why = WHY_EXCEPTION;
                }
            }
            else if (why == WHY_EXCEPTION) {
3230 3231
                call_trace_protected(tstate->c_tracefunc, tstate->c_traceobj,
                                     tstate, f,
3232 3233 3234 3235 3236 3237
                                     PyTrace_RETURN, NULL);
            }
        }
        if (tstate->c_profilefunc) {
            if (why == WHY_EXCEPTION)
                call_trace_protected(tstate->c_profilefunc,
3238 3239
                                     tstate->c_profileobj,
                                     tstate, f,
3240
                                     PyTrace_RETURN, NULL);
3241 3242
            else if (call_trace(tstate->c_profilefunc, tstate->c_profileobj,
                                tstate, f,
3243
                                PyTrace_RETURN, retval)) {
3244
                Py_CLEAR(retval);
3245
                /* why = WHY_EXCEPTION; */
3246 3247 3248 3249 3250
            }
        }
    }

    /* pop frame */
3251
exit_eval_frame:
3252
    Py_LeaveRecursiveCall();
3253
    f->f_executing = 0;
3254
    tstate->frame = f->f_back;
3255

3256
    return _Py_CheckFunctionResult(retval, "PyEval_EvalFrameEx");
3257 3258
}

3259
static void
3260 3261 3262 3263 3264 3265 3266 3267 3268 3269 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279 3280 3281 3282
format_missing(const char *kind, PyCodeObject *co, PyObject *names)
{
    int err;
    Py_ssize_t len = PyList_GET_SIZE(names);
    PyObject *name_str, *comma, *tail, *tmp;

    assert(PyList_CheckExact(names));
    assert(len >= 1);
    /* Deal with the joys of natural language. */
    switch (len) {
    case 1:
        name_str = PyList_GET_ITEM(names, 0);
        Py_INCREF(name_str);
        break;
    case 2:
        name_str = PyUnicode_FromFormat("%U and %U",
                                        PyList_GET_ITEM(names, len - 2),
                                        PyList_GET_ITEM(names, len - 1));
        break;
    default:
        tail = PyUnicode_FromFormat(", %U, and %U",
                                    PyList_GET_ITEM(names, len - 2),
                                    PyList_GET_ITEM(names, len - 1));
Benjamin Peterson's avatar
Benjamin Peterson committed
3283 3284
        if (tail == NULL)
            return;
3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 3295 3296 3297 3298 3299 3300 3301 3302 3303 3304 3305 3306 3307 3308 3309 3310 3311 3312 3313 3314 3315 3316 3317 3318 3319 3320 3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333 3334 3335 3336 3337 3338 3339 3340 3341 3342 3343 3344 3345 3346 3347 3348 3349 3350 3351 3352 3353 3354 3355 3356 3357 3358 3359 3360
        /* Chop off the last two objects in the list. This shouldn't actually
           fail, but we can't be too careful. */
        err = PyList_SetSlice(names, len - 2, len, NULL);
        if (err == -1) {
            Py_DECREF(tail);
            return;
        }
        /* Stitch everything up into a nice comma-separated list. */
        comma = PyUnicode_FromString(", ");
        if (comma == NULL) {
            Py_DECREF(tail);
            return;
        }
        tmp = PyUnicode_Join(comma, names);
        Py_DECREF(comma);
        if (tmp == NULL) {
            Py_DECREF(tail);
            return;
        }
        name_str = PyUnicode_Concat(tmp, tail);
        Py_DECREF(tmp);
        Py_DECREF(tail);
        break;
    }
    if (name_str == NULL)
        return;
    PyErr_Format(PyExc_TypeError,
                 "%U() missing %i required %s argument%s: %U",
                 co->co_name,
                 len,
                 kind,
                 len == 1 ? "" : "s",
                 name_str);
    Py_DECREF(name_str);
}

static void
missing_arguments(PyCodeObject *co, int missing, int defcount,
                  PyObject **fastlocals)
{
    int i, j = 0;
    int start, end;
    int positional = defcount != -1;
    const char *kind = positional ? "positional" : "keyword-only";
    PyObject *missing_names;

    /* Compute the names of the arguments that are missing. */
    missing_names = PyList_New(missing);
    if (missing_names == NULL)
        return;
    if (positional) {
        start = 0;
        end = co->co_argcount - defcount;
    }
    else {
        start = co->co_argcount;
        end = start + co->co_kwonlyargcount;
    }
    for (i = start; i < end; i++) {
        if (GETLOCAL(i) == NULL) {
            PyObject *raw = PyTuple_GET_ITEM(co->co_varnames, i);
            PyObject *name = PyObject_Repr(raw);
            if (name == NULL) {
                Py_DECREF(missing_names);
                return;
            }
            PyList_SET_ITEM(missing_names, j++, name);
        }
    }
    assert(j == missing);
    format_missing(kind, co, missing_names);
    Py_DECREF(missing_names);
}

static void
too_many_positional(PyCodeObject *co, int given, int defcount, PyObject **fastlocals)
3361 3362 3363 3364 3365 3366
{
    int plural;
    int kwonly_given = 0;
    int i;
    PyObject *sig, *kwonly_sig;

3367 3368
    assert((co->co_flags & CO_VARARGS) == 0);
    /* Count missing keyword-only args. */
3369
    for (i = co->co_argcount; i < co->co_argcount + co->co_kwonlyargcount; i++)
3370
        if (GETLOCAL(i) != NULL)
3371
            kwonly_given++;
3372 3373
    if (defcount) {
        int atleast = co->co_argcount - defcount;
3374 3375 3376 3377 3378 3379 3380 3381 3382 3383 3384 3385 3386 3387 3388 3389 3390 3391 3392 3393 3394
        plural = 1;
        sig = PyUnicode_FromFormat("from %d to %d", atleast, co->co_argcount);
    }
    else {
        plural = co->co_argcount != 1;
        sig = PyUnicode_FromFormat("%d", co->co_argcount);
    }
    if (sig == NULL)
        return;
    if (kwonly_given) {
        const char *format = " positional argument%s (and %d keyword-only argument%s)";
        kwonly_sig = PyUnicode_FromFormat(format, given != 1 ? "s" : "", kwonly_given,
                                              kwonly_given != 1 ? "s" : "");
        if (kwonly_sig == NULL) {
            Py_DECREF(sig);
            return;
        }
    }
    else {
        /* This will not fail. */
        kwonly_sig = PyUnicode_FromString("");
3395
        assert(kwonly_sig != NULL);
3396 3397 3398 3399 3400 3401 3402 3403 3404 3405 3406 3407 3408
    }
    PyErr_Format(PyExc_TypeError,
                 "%U() takes %U positional argument%s but %d%U %s given",
                 co->co_name,
                 sig,
                 plural ? "s" : "",
                 given,
                 kwonly_sig,
                 given == 1 && !kwonly_given ? "was" : "were");
    Py_DECREF(sig);
    Py_DECREF(kwonly_sig);
}

3409
/* This is gonna seem *real weird*, but if you put some other code between
3410
   PyEval_EvalFrame() and PyEval_EvalCodeEx() you will need to adjust
3411
   the test in the if statements in Misc/gdbinit (pystack and pystackv). */
3412

3413 3414
static PyObject *
_PyEval_EvalCodeWithName(PyObject *_co, PyObject *globals, PyObject *locals,
3415
           PyObject **args, int argcount, PyObject **kws, int kwcount,
3416 3417
           PyObject **defs, int defcount, PyObject *kwdefs, PyObject *closure,
           PyObject *name, PyObject *qualname)
3418
{
Martin v. Löwis's avatar
Martin v. Löwis committed
3419
    PyCodeObject* co = (PyCodeObject*)_co;
3420 3421 3422
    PyFrameObject *f;
    PyObject *retval = NULL;
    PyObject **fastlocals, **freevars;
3423 3424 3425
    PyThreadState *tstate = PyThreadState_GET();
    PyObject *x, *u;
    int total_args = co->co_argcount + co->co_kwonlyargcount;
3426 3427 3428
    int i;
    int n = argcount;
    PyObject *kwdict = NULL;
3429 3430 3431 3432 3433 3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444

    if (globals == NULL) {
        PyErr_SetString(PyExc_SystemError,
                        "PyEval_EvalCodeEx: NULL globals");
        return NULL;
    }

    assert(tstate != NULL);
    assert(globals != NULL);
    f = PyFrame_New(tstate, co, globals, locals);
    if (f == NULL)
        return NULL;

    fastlocals = f->f_localsplus;
    freevars = f->f_localsplus + co->co_nlocals;

3445 3446 3447 3448 3449 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462 3463 3464 3465 3466 3467
    /* Parse arguments. */
    if (co->co_flags & CO_VARKEYWORDS) {
        kwdict = PyDict_New();
        if (kwdict == NULL)
            goto fail;
        i = total_args;
        if (co->co_flags & CO_VARARGS)
            i++;
        SETLOCAL(i, kwdict);
    }
    if (argcount > co->co_argcount)
        n = co->co_argcount;
    for (i = 0; i < n; i++) {
        x = args[i];
        Py_INCREF(x);
        SETLOCAL(i, x);
    }
    if (co->co_flags & CO_VARARGS) {
        u = PyTuple_New(argcount - n);
        if (u == NULL)
            goto fail;
        SETLOCAL(total_args, u);
        for (i = n; i < argcount; i++) {
3468 3469
            x = args[i];
            Py_INCREF(x);
3470
            PyTuple_SET_ITEM(u, i-n, x);
3471
        }
3472 3473 3474 3475 3476 3477 3478 3479 3480 3481 3482
    }
    for (i = 0; i < kwcount; i++) {
        PyObject **co_varnames;
        PyObject *keyword = kws[2*i];
        PyObject *value = kws[2*i + 1];
        int j;
        if (keyword == NULL || !PyUnicode_Check(keyword)) {
            PyErr_Format(PyExc_TypeError,
                         "%U() keywords must be strings",
                         co->co_name);
            goto fail;
3483
        }
3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494 3495 3496 3497 3498 3499
        /* Speed hack: do raw pointer compares. As names are
           normally interned this should almost always hit. */
        co_varnames = ((PyTupleObject *)(co->co_varnames))->ob_item;
        for (j = 0; j < total_args; j++) {
            PyObject *nm = co_varnames[j];
            if (nm == keyword)
                goto kw_found;
        }
        /* Slow fallback, just in case */
        for (j = 0; j < total_args; j++) {
            PyObject *nm = co_varnames[j];
            int cmp = PyObject_RichCompareBool(
                keyword, nm, Py_EQ);
            if (cmp > 0)
                goto kw_found;
            else if (cmp < 0)
3500
                goto fail;
3501 3502 3503 3504 3505 3506 3507 3508 3509
        }
        if (j >= total_args && kwdict == NULL) {
            PyErr_Format(PyExc_TypeError,
                         "%U() got an unexpected "
                         "keyword argument '%S'",
                         co->co_name,
                         keyword);
            goto fail;
        }
3510 3511 3512
        if (PyDict_SetItem(kwdict, keyword, value) == -1) {
            goto fail;
        }
3513 3514 3515 3516
        continue;
      kw_found:
        if (GETLOCAL(j) != NULL) {
            PyErr_Format(PyExc_TypeError,
3517
                         "%U() got multiple "
3518
                         "values for argument '%S'",
3519 3520
                         co->co_name,
                         keyword);
3521
            goto fail;
3522
        }
3523 3524 3525 3526
        Py_INCREF(value);
        SETLOCAL(j, value);
    }
    if (argcount > co->co_argcount && !(co->co_flags & CO_VARARGS)) {
3527
        too_many_positional(co, argcount, defcount, fastlocals);
3528 3529 3530 3531
        goto fail;
    }
    if (argcount < co->co_argcount) {
        int m = co->co_argcount - defcount;
3532 3533 3534 3535 3536 3537 3538
        int missing = 0;
        for (i = argcount; i < m; i++)
            if (GETLOCAL(i) == NULL)
                missing++;
        if (missing) {
            missing_arguments(co, missing, defcount, fastlocals);
            goto fail;
3539
        }
3540 3541 3542 3543 3544 3545 3546 3547 3548
        if (n > m)
            i = n - m;
        else
            i = 0;
        for (; i < defcount; i++) {
            if (GETLOCAL(m+i) == NULL) {
                PyObject *def = defs[i];
                Py_INCREF(def);
                SETLOCAL(m+i, def);
3549
            }
3550 3551 3552
        }
    }
    if (co->co_kwonlyargcount > 0) {
3553
        int missing = 0;
3554 3555 3556 3557 3558 3559 3560 3561
        for (i = co->co_argcount; i < total_args; i++) {
            PyObject *name;
            if (GETLOCAL(i) != NULL)
                continue;
            name = PyTuple_GET_ITEM(co->co_varnames, i);
            if (kwdefs != NULL) {
                PyObject *def = PyDict_GetItem(kwdefs, name);
                if (def) {
3562
                    Py_INCREF(def);
3563 3564
                    SETLOCAL(i, def);
                    continue;
3565 3566
                }
            }
3567 3568 3569 3570
            missing++;
        }
        if (missing) {
            missing_arguments(co, missing, -1, fastlocals);
3571
            goto fail;
3572 3573
        }
    }
3574

3575
    /* Allocate and initialize storage for cell vars, and copy free
3576 3577
       vars into frame. */
    for (i = 0; i < PyTuple_GET_SIZE(co->co_cellvars); ++i) {
3578
        PyObject *c;
3579 3580 3581
        int arg;
        /* Possibly account for the cell variable being an argument. */
        if (co->co_cell2arg != NULL &&
3582
            (arg = co->co_cell2arg[i]) != CO_CELL_NOT_AN_ARG) {
3583
            c = PyCell_New(GETLOCAL(arg));
3584 3585
            /* Clear the local copy. */
            SETLOCAL(arg, NULL);
3586 3587
        }
        else {
3588
            c = PyCell_New(NULL);
3589
        }
3590 3591
        if (c == NULL)
            goto fail;
3592
        SETLOCAL(co->co_nlocals + i, c);
3593
    }
3594 3595 3596 3597
    for (i = 0; i < PyTuple_GET_SIZE(co->co_freevars); ++i) {
        PyObject *o = PyTuple_GET_ITEM(closure, i);
        Py_INCREF(o);
        freevars[PyTuple_GET_SIZE(co->co_cellvars) + i] = o;
3598 3599 3600 3601 3602
    }

    if (co->co_flags & CO_GENERATOR) {
        /* Don't need to keep the reference to f_back, it will be set
         * when the generator is resumed. */
3603
        Py_CLEAR(f->f_back);
3604 3605 3606 3607 3608

        PCALL(PCALL_GENERATOR);

        /* Create a new generator that owns the ready to run frame
         * and return that as the value. */
3609
        return PyGen_NewWithQualName(f, name, qualname);
3610 3611 3612
    }

    retval = PyEval_EvalFrameEx(f,0);
Guido van Rossum's avatar
Guido van Rossum committed
3613

3614
fail: /* Jump here from prelude on failure */
3615

3616 3617 3618 3619 3620 3621 3622 3623 3624 3625
    /* decref'ing the frame can cause __del__ methods to get invoked,
       which can call back into Python.  While we're done with the
       current Python frame (f), the associated C stack is still in use,
       so recursion_depth must be boosted for the duration.
    */
    assert(tstate != NULL);
    ++tstate->recursion_depth;
    Py_DECREF(f);
    --tstate->recursion_depth;
    return retval;
3626 3627
}

3628 3629 3630 3631 3632 3633 3634 3635 3636 3637
PyObject *
PyEval_EvalCodeEx(PyObject *_co, PyObject *globals, PyObject *locals,
           PyObject **args, int argcount, PyObject **kws, int kwcount,
           PyObject **defs, int defcount, PyObject *kwdefs, PyObject *closure)
{
    return _PyEval_EvalCodeWithName(_co, globals, locals,
                                    args, argcount, kws, kwcount,
                                    defs, defcount, kwdefs, closure,
                                    NULL, NULL);
}
3638

3639
static PyObject *
3640
special_lookup(PyObject *o, _Py_Identifier *id)
3641
{
3642
    PyObject *res;
3643
    res = _PyObject_LookupSpecial(o, id);
3644
    if (res == NULL && !PyErr_Occurred()) {
3645
        PyErr_SetObject(PyExc_AttributeError, id->object);
3646 3647 3648
        return NULL;
    }
    return res;
3649 3650 3651
}


3652 3653 3654 3655 3656 3657 3658 3659 3660 3661 3662 3663 3664 3665 3666 3667 3668
/* These 3 functions deal with the exception state of generators. */

static void
save_exc_state(PyThreadState *tstate, PyFrameObject *f)
{
    PyObject *type, *value, *traceback;
    Py_XINCREF(tstate->exc_type);
    Py_XINCREF(tstate->exc_value);
    Py_XINCREF(tstate->exc_traceback);
    type = f->f_exc_type;
    value = f->f_exc_value;
    traceback = f->f_exc_traceback;
    f->f_exc_type = tstate->exc_type;
    f->f_exc_value = tstate->exc_value;
    f->f_exc_traceback = tstate->exc_traceback;
    Py_XDECREF(type);
    Py_XDECREF(value);
3669
    Py_XDECREF(traceback);
3670 3671 3672 3673 3674 3675 3676 3677 3678 3679 3680 3681 3682 3683 3684 3685 3686 3687 3688 3689 3690 3691 3692 3693 3694 3695 3696 3697 3698 3699 3700 3701 3702 3703 3704 3705
}

static void
swap_exc_state(PyThreadState *tstate, PyFrameObject *f)
{
    PyObject *tmp;
    tmp = tstate->exc_type;
    tstate->exc_type = f->f_exc_type;
    f->f_exc_type = tmp;
    tmp = tstate->exc_value;
    tstate->exc_value = f->f_exc_value;
    f->f_exc_value = tmp;
    tmp = tstate->exc_traceback;
    tstate->exc_traceback = f->f_exc_traceback;
    f->f_exc_traceback = tmp;
}

static void
restore_and_clear_exc_state(PyThreadState *tstate, PyFrameObject *f)
{
    PyObject *type, *value, *tb;
    type = tstate->exc_type;
    value = tstate->exc_value;
    tb = tstate->exc_traceback;
    tstate->exc_type = f->f_exc_type;
    tstate->exc_value = f->f_exc_value;
    tstate->exc_traceback = f->f_exc_traceback;
    f->f_exc_type = NULL;
    f->f_exc_value = NULL;
    f->f_exc_traceback = NULL;
    Py_XDECREF(type);
    Py_XDECREF(value);
    Py_XDECREF(tb);
}


3706 3707
/* Logic for the raise statement (too complicated for inlining).
   This *consumes* a reference count to each of its arguments. */
Benjamin Peterson's avatar
Benjamin Peterson committed
3708
static int
3709
do_raise(PyObject *exc, PyObject *cause)
3710
{
3711 3712 3713 3714 3715 3716 3717 3718 3719 3720 3721 3722
    PyObject *type = NULL, *value = NULL;

    if (exc == NULL) {
        /* Reraise */
        PyThreadState *tstate = PyThreadState_GET();
        PyObject *tb;
        type = tstate->exc_type;
        value = tstate->exc_value;
        tb = tstate->exc_traceback;
        if (type == Py_None) {
            PyErr_SetString(PyExc_RuntimeError,
                            "No active exception to reraise");
Benjamin Peterson's avatar
Benjamin Peterson committed
3723 3724
            return 0;
        }
3725 3726 3727 3728
        Py_XINCREF(type);
        Py_XINCREF(value);
        Py_XINCREF(tb);
        PyErr_Restore(type, value, tb);
Benjamin Peterson's avatar
Benjamin Peterson committed
3729
        return 1;
3730 3731 3732 3733
    }

    /* We support the following forms of raise:
       raise
3734 3735 3736
       raise <instance>
       raise <type> */

3737 3738 3739 3740 3741
    if (PyExceptionClass_Check(exc)) {
        type = exc;
        value = PyObject_CallObject(exc, NULL);
        if (value == NULL)
            goto raise_error;
3742 3743 3744 3745 3746 3747 3748
        if (!PyExceptionInstance_Check(value)) {
            PyErr_Format(PyExc_TypeError,
                         "calling %R should have returned an instance of "
                         "BaseException, not %R",
                         type, Py_TYPE(value));
            goto raise_error;
        }
3749 3750 3751 3752 3753 3754 3755 3756 3757 3758 3759 3760 3761 3762 3763 3764 3765 3766 3767 3768 3769
    }
    else if (PyExceptionInstance_Check(exc)) {
        value = exc;
        type = PyExceptionInstance_Class(exc);
        Py_INCREF(type);
    }
    else {
        /* Not something you can raise.  You get an exception
           anyway, just not what you specified :-) */
        Py_DECREF(exc);
        PyErr_SetString(PyExc_TypeError,
                        "exceptions must derive from BaseException");
        goto raise_error;
    }

    if (cause) {
        PyObject *fixed_cause;
        if (PyExceptionClass_Check(cause)) {
            fixed_cause = PyObject_CallObject(cause, NULL);
            if (fixed_cause == NULL)
                goto raise_error;
3770 3771 3772
            Py_DECREF(cause);
        }
        else if (PyExceptionInstance_Check(cause)) {
3773 3774
            fixed_cause = cause;
        }
3775 3776 3777 3778 3779 3780 3781 3782
        else if (cause == Py_None) {
            Py_DECREF(cause);
            fixed_cause = NULL;
        }
        else {
            PyErr_SetString(PyExc_TypeError,
                            "exception causes must derive from "
                            "BaseException");
3783 3784
            goto raise_error;
        }
3785
        PyException_SetCause(value, fixed_cause);
3786 3787 3788 3789 3790 3791
    }

    PyErr_SetObject(type, value);
    /* PyErr_SetObject incref's its arguments */
    Py_XDECREF(value);
    Py_XDECREF(type);
Benjamin Peterson's avatar
Benjamin Peterson committed
3792
    return 0;
3793 3794

raise_error:
3795 3796 3797
    Py_XDECREF(value);
    Py_XDECREF(type);
    Py_XDECREF(cause);
Benjamin Peterson's avatar
Benjamin Peterson committed
3798
    return 0;
3799 3800
}

3801
/* Iterate v argcnt times and store the results on the stack (via decreasing
3802
   sp).  Return 1 for success, 0 if error.
3803

3804 3805 3806
   If argcntafter == -1, do a simple unpack. If it is >= 0, do an unpack
   with a variable target.
*/
3807

3808
static int
3809
unpack_iterable(PyObject *v, int argcnt, int argcntafter, PyObject **sp)
3810
{
3811 3812 3813 3814 3815 3816 3817 3818 3819 3820 3821 3822 3823 3824 3825 3826 3827 3828 3829 3830 3831 3832 3833 3834 3835 3836 3837 3838 3839 3840 3841 3842 3843 3844 3845 3846
    int i = 0, j = 0;
    Py_ssize_t ll = 0;
    PyObject *it;  /* iter(v) */
    PyObject *w;
    PyObject *l = NULL; /* variable list */

    assert(v != NULL);

    it = PyObject_GetIter(v);
    if (it == NULL)
        goto Error;

    for (; i < argcnt; i++) {
        w = PyIter_Next(it);
        if (w == NULL) {
            /* Iterator done, via error or exhaustion. */
            if (!PyErr_Occurred()) {
                PyErr_Format(PyExc_ValueError,
                    "need more than %d value%s to unpack",
                    i, i == 1 ? "" : "s");
            }
            goto Error;
        }
        *--sp = w;
    }

    if (argcntafter == -1) {
        /* We better have exhausted the iterator now. */
        w = PyIter_Next(it);
        if (w == NULL) {
            if (PyErr_Occurred())
                goto Error;
            Py_DECREF(it);
            return 1;
        }
        Py_DECREF(w);
3847 3848
        PyErr_Format(PyExc_ValueError, "too many values to unpack "
                     "(expected %d)", argcnt);
3849 3850 3851 3852 3853 3854 3855 3856 3857 3858 3859 3860 3861 3862 3863 3864 3865 3866 3867 3868 3869 3870 3871 3872
        goto Error;
    }

    l = PySequence_List(it);
    if (l == NULL)
        goto Error;
    *--sp = l;
    i++;

    ll = PyList_GET_SIZE(l);
    if (ll < argcntafter) {
        PyErr_Format(PyExc_ValueError, "need more than %zd values to unpack",
                     argcnt + ll);
        goto Error;
    }

    /* Pop the "after-variable" args off the list. */
    for (j = argcntafter; j > 0; j--, i++) {
        *--sp = PyList_GET_ITEM(l, ll - j);
    }
    /* Resize the list. */
    Py_SIZE(l) = ll - argcntafter;
    Py_DECREF(it);
    return 1;
3873

3874
Error:
3875 3876 3877 3878
    for (; i > 0; i--, sp++)
        Py_DECREF(*sp);
    Py_XDECREF(it);
    return 0;
3879 3880 3881
}


Guido van Rossum's avatar
Guido van Rossum committed
3882
#ifdef LLTRACE
3883
static int
3884
prtrace(PyObject *v, char *str)
3885
{
3886 3887 3888 3889 3890
    printf("%s ", str);
    if (PyObject_Print(v, stdout, 0) != 0)
        PyErr_Clear(); /* Don't know what else to do */
    printf("\n");
    return 1;
3891 3892 3893
}
#endif

3894
static void
3895 3896
call_exc_trace(Py_tracefunc func, PyObject *self,
               PyThreadState *tstate, PyFrameObject *f)
3897
{
3898
    PyObject *type, *value, *traceback, *orig_traceback, *arg;
3899
    int err;
3900
    PyErr_Fetch(&type, &value, &orig_traceback);
3901 3902 3903 3904
    if (value == NULL) {
        value = Py_None;
        Py_INCREF(value);
    }
3905 3906
    PyErr_NormalizeException(&type, &value, &orig_traceback);
    traceback = (orig_traceback != NULL) ? orig_traceback : Py_None;
3907 3908
    arg = PyTuple_Pack(3, type, value, traceback);
    if (arg == NULL) {
3909
        PyErr_Restore(type, value, orig_traceback);
3910 3911
        return;
    }
3912
    err = call_trace(func, self, tstate, f, PyTrace_EXCEPTION, arg);
3913 3914
    Py_DECREF(arg);
    if (err == 0)
3915
        PyErr_Restore(type, value, orig_traceback);
3916 3917 3918
    else {
        Py_XDECREF(type);
        Py_XDECREF(value);
3919
        Py_XDECREF(orig_traceback);
3920
    }
3921 3922
}

3923
static int
3924 3925
call_trace_protected(Py_tracefunc func, PyObject *obj,
                     PyThreadState *tstate, PyFrameObject *frame,
3926
                     int what, PyObject *arg)
3927
{
3928 3929 3930
    PyObject *type, *value, *traceback;
    int err;
    PyErr_Fetch(&type, &value, &traceback);
3931
    err = call_trace(func, obj, tstate, frame, what, arg);
3932 3933 3934 3935 3936 3937 3938 3939 3940 3941 3942
    if (err == 0)
    {
        PyErr_Restore(type, value, traceback);
        return 0;
    }
    else {
        Py_XDECREF(type);
        Py_XDECREF(value);
        Py_XDECREF(traceback);
        return -1;
    }
3943 3944
}

3945
static int
3946 3947
call_trace(Py_tracefunc func, PyObject *obj,
           PyThreadState *tstate, PyFrameObject *frame,
3948
           int what, PyObject *arg)
Guido van Rossum's avatar
Guido van Rossum committed
3949
{
3950 3951 3952 3953 3954 3955 3956 3957 3958 3959
    int result;
    if (tstate->tracing)
        return 0;
    tstate->tracing++;
    tstate->use_tracing = 0;
    result = func(obj, frame, what, arg);
    tstate->use_tracing = ((tstate->c_tracefunc != NULL)
                           || (tstate->c_profilefunc != NULL));
    tstate->tracing--;
    return result;
Guido van Rossum's avatar
Guido van Rossum committed
3960 3961
}

3962 3963 3964
PyObject *
_PyEval_CallTracing(PyObject *func, PyObject *args)
{
3965
    PyThreadState *tstate = PyThreadState_GET();
3966 3967 3968 3969 3970 3971 3972 3973 3974 3975 3976
    int save_tracing = tstate->tracing;
    int save_use_tracing = tstate->use_tracing;
    PyObject *result;

    tstate->tracing = 0;
    tstate->use_tracing = ((tstate->c_tracefunc != NULL)
                           || (tstate->c_profilefunc != NULL));
    result = PyObject_Call(func, args, NULL);
    tstate->tracing = save_tracing;
    tstate->use_tracing = save_use_tracing;
    return result;
3977 3978
}

3979
/* See Objects/lnotab_notes.txt for a description of how tracing works. */
3980
static int
3981
maybe_call_line_trace(Py_tracefunc func, PyObject *obj,
3982 3983
                      PyThreadState *tstate, PyFrameObject *frame,
                      int *instr_lb, int *instr_ub, int *instr_prev)
Michael W. Hudson's avatar
Michael W. Hudson committed
3984
{
3985 3986 3987 3988 3989 3990 3991 3992 3993 3994 3995 3996 3997 3998 3999 4000 4001 4002
    int result = 0;
    int line = frame->f_lineno;

    /* If the last instruction executed isn't in the current
       instruction window, reset the window.
    */
    if (frame->f_lasti < *instr_lb || frame->f_lasti >= *instr_ub) {
        PyAddrPair bounds;
        line = _PyCode_CheckLineNumber(frame->f_code, frame->f_lasti,
                                       &bounds);
        *instr_lb = bounds.ap_lower;
        *instr_ub = bounds.ap_upper;
    }
    /* If the last instruction falls at the start of a line or if
       it represents a jump backwards, update the frame's line
       number and call the trace function. */
    if (frame->f_lasti == *instr_lb || frame->f_lasti < *instr_prev) {
        frame->f_lineno = line;
4003
        result = call_trace(func, obj, tstate, frame, PyTrace_LINE, Py_None);
4004 4005 4006
    }
    *instr_prev = frame->f_lasti;
    return result;
Michael W. Hudson's avatar
Michael W. Hudson committed
4007 4008
}

4009 4010
void
PyEval_SetProfile(Py_tracefunc func, PyObject *arg)
4011
{
4012 4013 4014 4015 4016 4017 4018 4019 4020 4021 4022 4023
    PyThreadState *tstate = PyThreadState_GET();
    PyObject *temp = tstate->c_profileobj;
    Py_XINCREF(arg);
    tstate->c_profilefunc = NULL;
    tstate->c_profileobj = NULL;
    /* Must make sure that tracing is not ignored if 'temp' is freed */
    tstate->use_tracing = tstate->c_tracefunc != NULL;
    Py_XDECREF(temp);
    tstate->c_profilefunc = func;
    tstate->c_profileobj = arg;
    /* Flag that tracing or profiling is turned on */
    tstate->use_tracing = (func != NULL) || (tstate->c_tracefunc != NULL);
4024 4025 4026 4027 4028
}

void
PyEval_SetTrace(Py_tracefunc func, PyObject *arg)
{
4029 4030 4031 4032 4033 4034 4035 4036 4037 4038 4039 4040 4041 4042
    PyThreadState *tstate = PyThreadState_GET();
    PyObject *temp = tstate->c_traceobj;
    _Py_TracingPossible += (func != NULL) - (tstate->c_tracefunc != NULL);
    Py_XINCREF(arg);
    tstate->c_tracefunc = NULL;
    tstate->c_traceobj = NULL;
    /* Must make sure that profiling is not ignored if 'temp' is freed */
    tstate->use_tracing = tstate->c_profilefunc != NULL;
    Py_XDECREF(temp);
    tstate->c_tracefunc = func;
    tstate->c_traceobj = arg;
    /* Flag that tracing or profiling is turned on */
    tstate->use_tracing = ((func != NULL)
                           || (tstate->c_profilefunc != NULL));
4043 4044
}

Guido van Rossum's avatar
Guido van Rossum committed
4045
PyObject *
4046
PyEval_GetBuiltins(void)
4047
{
4048 4049 4050 4051 4052
    PyFrameObject *current_frame = PyEval_GetFrame();
    if (current_frame == NULL)
        return PyThreadState_GET()->interp->builtins;
    else
        return current_frame->f_builtins;
4053 4054
}

Guido van Rossum's avatar
Guido van Rossum committed
4055
PyObject *
4056
PyEval_GetLocals(void)
4057
{
4058
    PyFrameObject *current_frame = PyEval_GetFrame();
4059 4060
    if (current_frame == NULL) {
        PyErr_SetString(PyExc_SystemError, "frame does not exist");
4061
        return NULL;
4062 4063 4064 4065 4066 4067
    }

    if (PyFrame_FastToLocalsWithError(current_frame) < 0)
        return NULL;

    assert(current_frame->f_locals != NULL);
4068
    return current_frame->f_locals;
4069 4070
}

Guido van Rossum's avatar
Guido van Rossum committed
4071
PyObject *
4072
PyEval_GetGlobals(void)
4073
{
4074 4075 4076
    PyFrameObject *current_frame = PyEval_GetFrame();
    if (current_frame == NULL)
        return NULL;
4077 4078 4079

    assert(current_frame->f_globals != NULL);
    return current_frame->f_globals;
4080 4081
}

4082
PyFrameObject *
4083
PyEval_GetFrame(void)
4084
{
4085 4086
    PyThreadState *tstate = PyThreadState_GET();
    return _PyThreadState_GetFrame(tstate);
4087 4088
}

4089
int
4090
PyEval_MergeCompilerFlags(PyCompilerFlags *cf)
4091
{
4092 4093 4094 4095 4096 4097 4098 4099 4100 4101
    PyFrameObject *current_frame = PyEval_GetFrame();
    int result = cf->cf_flags != 0;

    if (current_frame != NULL) {
        const int codeflags = current_frame->f_code->co_flags;
        const int compilerflags = codeflags & PyCF_MASK;
        if (compilerflags) {
            result = 1;
            cf->cf_flags |= compilerflags;
        }
4102
#if 0 /* future keyword */
4103 4104 4105 4106
        if (codeflags & CO_GENERATOR_ALLOWED) {
            result = 1;
            cf->cf_flags |= CO_GENERATOR_ALLOWED;
        }
4107
#endif
4108 4109
    }
    return result;
4110 4111
}

4112

4113
/* External interface to call any callable object.
4114
   The arg must be a tuple or NULL.  The kw must be a dict or NULL. */
4115

Guido van Rossum's avatar
Guido van Rossum committed
4116
PyObject *
4117
PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
4118
{
4119 4120
    PyObject *result;

4121 4122 4123 4124 4125 4126 4127
#ifdef Py_DEBUG
    /* PyEval_CallObjectWithKeywords() must not be called with an exception
       set. It raises a new exception if parameters are invalid or if
       PyTuple_New() fails, and so the original exception is lost. */
    assert(!PyErr_Occurred());
#endif

4128 4129 4130 4131 4132 4133 4134 4135 4136 4137 4138 4139 4140 4141 4142 4143 4144 4145 4146 4147 4148 4149
    if (arg == NULL) {
        arg = PyTuple_New(0);
        if (arg == NULL)
            return NULL;
    }
    else if (!PyTuple_Check(arg)) {
        PyErr_SetString(PyExc_TypeError,
                        "argument list must be a tuple");
        return NULL;
    }
    else
        Py_INCREF(arg);

    if (kw != NULL && !PyDict_Check(kw)) {
        PyErr_SetString(PyExc_TypeError,
                        "keyword list must be a dictionary");
        Py_DECREF(arg);
        return NULL;
    }

    result = PyObject_Call(func, arg, kw);
    Py_DECREF(arg);
4150

4151
    return result;
4152 4153
}

4154
const char *
4155
PyEval_GetFuncName(PyObject *func)
4156
{
4157 4158 4159 4160 4161 4162 4163 4164
    if (PyMethod_Check(func))
        return PyEval_GetFuncName(PyMethod_GET_FUNCTION(func));
    else if (PyFunction_Check(func))
        return _PyUnicode_AsString(((PyFunctionObject*)func)->func_name);
    else if (PyCFunction_Check(func))
        return ((PyCFunctionObject*)func)->m_ml->ml_name;
    else
        return func->ob_type->tp_name;
4165 4166
}

4167
const char *
4168
PyEval_GetFuncDesc(PyObject *func)
4169
{
4170 4171 4172 4173 4174 4175 4176 4177
    if (PyMethod_Check(func))
        return "()";
    else if (PyFunction_Check(func))
        return "()";
    else if (PyCFunction_Check(func))
        return "()";
    else
        return " object";
4178 4179
}

4180
static void
4181 4182
err_args(PyObject *func, int flags, int nargs)
{
4183 4184 4185 4186 4187 4188 4189 4190 4191 4192
    if (flags & METH_NOARGS)
        PyErr_Format(PyExc_TypeError,
                     "%.200s() takes no arguments (%d given)",
                     ((PyCFunctionObject *)func)->m_ml->ml_name,
                     nargs);
    else
        PyErr_Format(PyExc_TypeError,
                     "%.200s() takes exactly one argument (%d given)",
                     ((PyCFunctionObject *)func)->m_ml->ml_name,
                     nargs);
4193 4194
}

4195
#define C_TRACE(x, call) \
4196
if (tstate->use_tracing && tstate->c_profilefunc) { \
4197 4198 4199
    if (call_trace(tstate->c_profilefunc, tstate->c_profileobj, \
        tstate, tstate->frame, \
        PyTrace_C_CALL, func)) { \
4200 4201 4202 4203 4204 4205 4206 4207
        x = NULL; \
    } \
    else { \
        x = call; \
        if (tstate->c_profilefunc != NULL) { \
            if (x == NULL) { \
                call_trace_protected(tstate->c_profilefunc, \
                    tstate->c_profileobj, \
4208 4209
                    tstate, tstate->frame, \
                    PyTrace_C_EXCEPTION, func); \
4210 4211 4212 4213
                /* XXX should pass (type, value, tb) */ \
            } else { \
                if (call_trace(tstate->c_profilefunc, \
                    tstate->c_profileobj, \
4214 4215
                    tstate, tstate->frame, \
                    PyTrace_C_RETURN, func)) { \
4216 4217 4218 4219 4220 4221
                    Py_DECREF(x); \
                    x = NULL; \
                } \
            } \
        } \
    } \
4222
} else { \
4223 4224
    x = call; \
    }
4225

4226
static PyObject *
4227 4228
call_function(PyObject ***pp_stack, int oparg
#ifdef WITH_TSC
4229
                , uint64* pintr0, uint64* pintr1
4230
#endif
4231
                )
4232
{
4233 4234 4235 4236 4237 4238 4239 4240 4241 4242 4243 4244 4245 4246 4247 4248 4249 4250 4251 4252
    int na = oparg & 0xff;
    int nk = (oparg>>8) & 0xff;
    int n = na + 2 * nk;
    PyObject **pfunc = (*pp_stack) - n - 1;
    PyObject *func = *pfunc;
    PyObject *x, *w;

    /* Always dispatch PyCFunction first, because these are
       presumed to be the most frequent callable object.
    */
    if (PyCFunction_Check(func) && nk == 0) {
        int flags = PyCFunction_GET_FLAGS(func);
        PyThreadState *tstate = PyThreadState_GET();

        PCALL(PCALL_CFUNCTION);
        if (flags & (METH_NOARGS | METH_O)) {
            PyCFunction meth = PyCFunction_GET_FUNCTION(func);
            PyObject *self = PyCFunction_GET_SELF(func);
            if (flags & METH_NOARGS && na == 0) {
                C_TRACE(x, (*meth)(self,NULL));
4253 4254

                x = _Py_CheckFunctionResult(x, "call_function");
4255 4256 4257 4258 4259
            }
            else if (flags & METH_O && na == 1) {
                PyObject *arg = EXT_POP(*pp_stack);
                C_TRACE(x, (*meth)(self,arg));
                Py_DECREF(arg);
4260 4261

                x = _Py_CheckFunctionResult(x, "call_function");
4262 4263 4264 4265 4266 4267 4268 4269 4270
            }
            else {
                err_args(func, flags, na);
                x = NULL;
            }
        }
        else {
            PyObject *callargs;
            callargs = load_args(pp_stack, na);
4271 4272 4273 4274 4275 4276 4277 4278 4279
            if (callargs != NULL) {
                READ_TIMESTAMP(*pintr0);
                C_TRACE(x, PyCFunction_Call(func,callargs,NULL));
                READ_TIMESTAMP(*pintr1);
                Py_XDECREF(callargs);
            }
            else {
                x = NULL;
            }
4280
        }
4281 4282
    }
    else {
4283 4284 4285 4286 4287 4288 4289 4290 4291 4292 4293 4294 4295 4296 4297 4298 4299 4300 4301 4302 4303
        if (PyMethod_Check(func) && PyMethod_GET_SELF(func) != NULL) {
            /* optimize access to bound methods */
            PyObject *self = PyMethod_GET_SELF(func);
            PCALL(PCALL_METHOD);
            PCALL(PCALL_BOUND_METHOD);
            Py_INCREF(self);
            func = PyMethod_GET_FUNCTION(func);
            Py_INCREF(func);
            Py_DECREF(*pfunc);
            *pfunc = self;
            na++;
            n++;
        } else
            Py_INCREF(func);
        READ_TIMESTAMP(*pintr0);
        if (PyFunction_Check(func))
            x = fast_function(func, pp_stack, n, na, nk);
        else
            x = do_call(func, pp_stack, na, nk);
        READ_TIMESTAMP(*pintr1);
        Py_DECREF(func);
4304 4305

        assert((x != NULL) ^ (PyErr_Occurred() != NULL));
4306 4307 4308 4309 4310 4311 4312 4313 4314 4315 4316
    }

    /* Clear the stack of the function object.  Also removes
       the arguments in case they weren't consumed already
       (fast_function() and err_args() leave them on the stack).
     */
    while ((*pp_stack) > pfunc) {
        w = EXT_POP(*pp_stack);
        Py_DECREF(w);
        PCALL(PCALL_POP);
    }
4317

4318
    assert((x != NULL) ^ (PyErr_Occurred() != NULL));
4319
    return x;
4320 4321
}

4322
/* The fast_function() function optimize calls for which no argument
4323
   tuple is necessary; the objects are passed directly from the stack.
4324 4325 4326 4327 4328
   For the simplest case -- a function that takes only positional
   arguments and is called with only positional arguments -- it
   inlines the most primitive frame setup code from
   PyEval_EvalCodeEx(), which vastly reduces the checks that must be
   done before evaluating the frame.
4329 4330 4331
*/

static PyObject *
Guido van Rossum's avatar
Guido van Rossum committed
4332
fast_function(PyObject *func, PyObject ***pp_stack, int n, int na, int nk)
4333
{
4334 4335 4336 4337
    PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func);
    PyObject *globals = PyFunction_GET_GLOBALS(func);
    PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
    PyObject *kwdefs = PyFunction_GET_KW_DEFAULTS(func);
4338 4339
    PyObject *name = ((PyFunctionObject *)func) -> func_name;
    PyObject *qualname = ((PyFunctionObject *)func) -> func_qualname;
4340 4341 4342 4343 4344 4345 4346 4347 4348 4349 4350 4351 4352 4353 4354 4355 4356 4357 4358 4359 4360 4361 4362 4363 4364 4365 4366 4367 4368 4369 4370 4371 4372 4373 4374 4375 4376 4377 4378 4379 4380 4381
    PyObject **d = NULL;
    int nd = 0;

    PCALL(PCALL_FUNCTION);
    PCALL(PCALL_FAST_FUNCTION);
    if (argdefs == NULL && co->co_argcount == n &&
        co->co_kwonlyargcount == 0 && nk==0 &&
        co->co_flags == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE)) {
        PyFrameObject *f;
        PyObject *retval = NULL;
        PyThreadState *tstate = PyThreadState_GET();
        PyObject **fastlocals, **stack;
        int i;

        PCALL(PCALL_FASTER_FUNCTION);
        assert(globals != NULL);
        /* XXX Perhaps we should create a specialized
           PyFrame_New() that doesn't take locals, but does
           take builtins without sanity checking them.
        */
        assert(tstate != NULL);
        f = PyFrame_New(tstate, co, globals, NULL);
        if (f == NULL)
            return NULL;

        fastlocals = f->f_localsplus;
        stack = (*pp_stack) - n;

        for (i = 0; i < n; i++) {
            Py_INCREF(*stack);
            fastlocals[i] = *stack++;
        }
        retval = PyEval_EvalFrameEx(f,0);
        ++tstate->recursion_depth;
        Py_DECREF(f);
        --tstate->recursion_depth;
        return retval;
    }
    if (argdefs != NULL) {
        d = &PyTuple_GET_ITEM(argdefs, 0);
        nd = Py_SIZE(argdefs);
    }
4382 4383 4384 4385 4386
    return _PyEval_EvalCodeWithName((PyObject*)co, globals,
                                    (PyObject *)NULL, (*pp_stack)-n, na,
                                    (*pp_stack)-2*nk, nk, d, nd, kwdefs,
                                    PyFunction_GET_CLOSURE(func),
                                    name, qualname);
4387 4388 4389
}

static PyObject *
4390 4391
update_keyword_args(PyObject *orig_kwdict, int nk, PyObject ***pp_stack,
                    PyObject *func)
4392
{
4393 4394 4395 4396 4397 4398 4399 4400 4401 4402 4403 4404 4405 4406 4407 4408 4409 4410 4411 4412 4413 4414 4415 4416 4417 4418 4419 4420 4421 4422 4423 4424 4425 4426
    PyObject *kwdict = NULL;
    if (orig_kwdict == NULL)
        kwdict = PyDict_New();
    else {
        kwdict = PyDict_Copy(orig_kwdict);
        Py_DECREF(orig_kwdict);
    }
    if (kwdict == NULL)
        return NULL;
    while (--nk >= 0) {
        int err;
        PyObject *value = EXT_POP(*pp_stack);
        PyObject *key = EXT_POP(*pp_stack);
        if (PyDict_GetItem(kwdict, key) != NULL) {
            PyErr_Format(PyExc_TypeError,
                         "%.200s%s got multiple values "
                         "for keyword argument '%U'",
                         PyEval_GetFuncName(func),
                         PyEval_GetFuncDesc(func),
                         key);
            Py_DECREF(key);
            Py_DECREF(value);
            Py_DECREF(kwdict);
            return NULL;
        }
        err = PyDict_SetItem(kwdict, key, value);
        Py_DECREF(key);
        Py_DECREF(value);
        if (err) {
            Py_DECREF(kwdict);
            return NULL;
        }
    }
    return kwdict;
4427 4428 4429 4430
}

static PyObject *
update_star_args(int nstack, int nstar, PyObject *stararg,
4431
                 PyObject ***pp_stack)
4432
{
4433 4434 4435 4436 4437 4438 4439 4440 4441 4442 4443 4444 4445 4446 4447 4448 4449 4450 4451
    PyObject *callargs, *w;

    callargs = PyTuple_New(nstack + nstar);
    if (callargs == NULL) {
        return NULL;
    }
    if (nstar) {
        int i;
        for (i = 0; i < nstar; i++) {
            PyObject *a = PyTuple_GET_ITEM(stararg, i);
            Py_INCREF(a);
            PyTuple_SET_ITEM(callargs, nstack + i, a);
        }
    }
    while (--nstack >= 0) {
        w = EXT_POP(*pp_stack);
        PyTuple_SET_ITEM(callargs, nstack, w);
    }
    return callargs;
4452 4453 4454 4455 4456
}

static PyObject *
load_args(PyObject ***pp_stack, int na)
{
4457 4458 4459 4460 4461 4462 4463 4464 4465 4466
    PyObject *args = PyTuple_New(na);
    PyObject *w;

    if (args == NULL)
        return NULL;
    while (--na >= 0) {
        w = EXT_POP(*pp_stack);
        PyTuple_SET_ITEM(args, na, w);
    }
    return args;
4467 4468 4469 4470 4471
}

static PyObject *
do_call(PyObject *func, PyObject ***pp_stack, int na, int nk)
{
4472 4473 4474 4475 4476 4477 4478 4479 4480 4481 4482 4483
    PyObject *callargs = NULL;
    PyObject *kwdict = NULL;
    PyObject *result = NULL;

    if (nk > 0) {
        kwdict = update_keyword_args(NULL, nk, pp_stack, func);
        if (kwdict == NULL)
            goto call_fail;
    }
    callargs = load_args(pp_stack, na);
    if (callargs == NULL)
        goto call_fail;
4484
#ifdef CALL_PROFILE
4485 4486 4487 4488 4489 4490 4491 4492 4493 4494 4495 4496 4497 4498
    /* At this point, we have to look at the type of func to
       update the call stats properly.  Do it here so as to avoid
       exposing the call stats machinery outside ceval.c
    */
    if (PyFunction_Check(func))
        PCALL(PCALL_FUNCTION);
    else if (PyMethod_Check(func))
        PCALL(PCALL_METHOD);
    else if (PyType_Check(func))
        PCALL(PCALL_TYPE);
    else if (PyCFunction_Check(func))
        PCALL(PCALL_CFUNCTION);
    else
        PCALL(PCALL_OTHER);
4499
#endif
4500 4501 4502 4503 4504 4505
    if (PyCFunction_Check(func)) {
        PyThreadState *tstate = PyThreadState_GET();
        C_TRACE(result, PyCFunction_Call(func, callargs, kwdict));
    }
    else
        result = PyObject_Call(func, callargs, kwdict);
Thomas Wouters's avatar
Thomas Wouters committed
4506
call_fail:
4507 4508 4509
    Py_XDECREF(callargs);
    Py_XDECREF(kwdict);
    return result;
4510 4511 4512 4513 4514
}

static PyObject *
ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)
{
4515 4516 4517 4518 4519 4520 4521 4522 4523 4524 4525 4526 4527 4528 4529 4530 4531 4532 4533 4534 4535 4536 4537 4538 4539 4540 4541 4542 4543 4544 4545 4546 4547 4548 4549 4550 4551 4552 4553 4554 4555 4556 4557 4558
    int nstar = 0;
    PyObject *callargs = NULL;
    PyObject *stararg = NULL;
    PyObject *kwdict = NULL;
    PyObject *result = NULL;

    if (flags & CALL_FLAG_KW) {
        kwdict = EXT_POP(*pp_stack);
        if (!PyDict_Check(kwdict)) {
            PyObject *d;
            d = PyDict_New();
            if (d == NULL)
                goto ext_call_fail;
            if (PyDict_Update(d, kwdict) != 0) {
                Py_DECREF(d);
                /* PyDict_Update raises attribute
                 * error (percolated from an attempt
                 * to get 'keys' attribute) instead of
                 * a type error if its second argument
                 * is not a mapping.
                 */
                if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
                    PyErr_Format(PyExc_TypeError,
                                 "%.200s%.200s argument after ** "
                                 "must be a mapping, not %.200s",
                                 PyEval_GetFuncName(func),
                                 PyEval_GetFuncDesc(func),
                                 kwdict->ob_type->tp_name);
                }
                goto ext_call_fail;
            }
            Py_DECREF(kwdict);
            kwdict = d;
        }
    }
    if (flags & CALL_FLAG_VAR) {
        stararg = EXT_POP(*pp_stack);
        if (!PyTuple_Check(stararg)) {
            PyObject *t = NULL;
            t = PySequence_Tuple(stararg);
            if (t == NULL) {
                if (PyErr_ExceptionMatches(PyExc_TypeError)) {
                    PyErr_Format(PyExc_TypeError,
                                 "%.200s%.200s argument after * "
4559
                                 "must be a sequence, not %.200s",
4560 4561 4562 4563 4564 4565 4566 4567 4568 4569 4570 4571 4572 4573 4574 4575 4576 4577 4578
                                 PyEval_GetFuncName(func),
                                 PyEval_GetFuncDesc(func),
                                 stararg->ob_type->tp_name);
                }
                goto ext_call_fail;
            }
            Py_DECREF(stararg);
            stararg = t;
        }
        nstar = PyTuple_GET_SIZE(stararg);
    }
    if (nk > 0) {
        kwdict = update_keyword_args(kwdict, nk, pp_stack, func);
        if (kwdict == NULL)
            goto ext_call_fail;
    }
    callargs = update_star_args(na, nstar, stararg, pp_stack);
    if (callargs == NULL)
        goto ext_call_fail;
4579
#ifdef CALL_PROFILE
4580 4581 4582 4583 4584 4585 4586 4587 4588 4589 4590 4591 4592 4593
    /* At this point, we have to look at the type of func to
       update the call stats properly.  Do it here so as to avoid
       exposing the call stats machinery outside ceval.c
    */
    if (PyFunction_Check(func))
        PCALL(PCALL_FUNCTION);
    else if (PyMethod_Check(func))
        PCALL(PCALL_METHOD);
    else if (PyType_Check(func))
        PCALL(PCALL_TYPE);
    else if (PyCFunction_Check(func))
        PCALL(PCALL_CFUNCTION);
    else
        PCALL(PCALL_OTHER);
4594
#endif
4595 4596 4597 4598 4599 4600
    if (PyCFunction_Check(func)) {
        PyThreadState *tstate = PyThreadState_GET();
        C_TRACE(result, PyCFunction_Call(func, callargs, kwdict));
    }
    else
        result = PyObject_Call(func, callargs, kwdict);
4601
ext_call_fail:
4602 4603 4604 4605
    Py_XDECREF(callargs);
    Py_XDECREF(kwdict);
    Py_XDECREF(stararg);
    return result;
4606 4607
}

4608
/* Extract a slice index from a PyLong or an object with the
4609 4610 4611
   nb_index slot defined, and store in *pi.
   Silently reduce values larger than PY_SSIZE_T_MAX to PY_SSIZE_T_MAX,
   and silently boost values less than -PY_SSIZE_T_MAX-1 to -PY_SSIZE_T_MAX-1.
4612
   Return 0 on error, 1 on success.
4613
*/
4614 4615 4616
/* Note:  If v is NULL, return success without storing into *pi.  This
   is because_PyEval_SliceIndex() is called by apply_slice(), which can be
   called by the SLICE opcode with v and/or w equal to NULL.
4617
*/
Guido van Rossum's avatar
Guido van Rossum committed
4618
int
Martin v. Löwis's avatar
Martin v. Löwis committed
4619
_PyEval_SliceIndex(PyObject *v, Py_ssize_t *pi)
4620
{
4621 4622 4623 4624 4625 4626 4627 4628 4629 4630 4631 4632 4633 4634 4635 4636
    if (v != NULL) {
        Py_ssize_t x;
        if (PyIndex_Check(v)) {
            x = PyNumber_AsSsize_t(v, NULL);
            if (x == -1 && PyErr_Occurred())
                return 0;
        }
        else {
            PyErr_SetString(PyExc_TypeError,
                            "slice indices must be integers or "
                            "None or have an __index__ method");
            return 0;
        }
        *pi = x;
    }
    return 1;
4637 4638
}

4639
#define CANNOT_CATCH_MSG "catching classes that do not inherit from "\
4640
                         "BaseException is not allowed"
4641

Guido van Rossum's avatar
Guido van Rossum committed
4642
static PyObject *
4643
cmp_outcome(int op, PyObject *v, PyObject *w)
4644
{
4645 4646 4647 4648 4649 4650 4651 4652 4653 4654 4655 4656 4657 4658 4659 4660 4661 4662 4663 4664 4665 4666 4667 4668 4669 4670 4671 4672 4673 4674 4675 4676 4677 4678 4679 4680 4681 4682 4683 4684 4685 4686 4687 4688 4689 4690 4691
    int res = 0;
    switch (op) {
    case PyCmp_IS:
        res = (v == w);
        break;
    case PyCmp_IS_NOT:
        res = (v != w);
        break;
    case PyCmp_IN:
        res = PySequence_Contains(w, v);
        if (res < 0)
            return NULL;
        break;
    case PyCmp_NOT_IN:
        res = PySequence_Contains(w, v);
        if (res < 0)
            return NULL;
        res = !res;
        break;
    case PyCmp_EXC_MATCH:
        if (PyTuple_Check(w)) {
            Py_ssize_t i, length;
            length = PyTuple_Size(w);
            for (i = 0; i < length; i += 1) {
                PyObject *exc = PyTuple_GET_ITEM(w, i);
                if (!PyExceptionClass_Check(exc)) {
                    PyErr_SetString(PyExc_TypeError,
                                    CANNOT_CATCH_MSG);
                    return NULL;
                }
            }
        }
        else {
            if (!PyExceptionClass_Check(w)) {
                PyErr_SetString(PyExc_TypeError,
                                CANNOT_CATCH_MSG);
                return NULL;
            }
        }
        res = PyErr_GivenExceptionMatches(v, w);
        break;
    default:
        return PyObject_RichCompare(v, w, op);
    }
    v = res ? Py_True : Py_False;
    Py_INCREF(v);
    return v;
4692
}
Guido van Rossum's avatar
Guido van Rossum committed
4693

4694 4695
static PyObject *
import_from(PyObject *v, PyObject *name)
4696
{
4697
    PyObject *x;
4698 4699
    _Py_IDENTIFIER(__name__);
    PyObject *fullmodname, *pkgname;
4700

4701
    x = PyObject_GetAttr(v, name);
4702 4703 4704 4705 4706 4707 4708 4709 4710 4711 4712 4713 4714 4715 4716
    if (x != NULL || !PyErr_ExceptionMatches(PyExc_AttributeError))
        return x;
    /* Issue #17636: in case this failed because of a circular relative
       import, try to fallback on reading the module directly from
       sys.modules. */
    PyErr_Clear();
    pkgname = _PyObject_GetAttrId(v, &PyId___name__);
    if (pkgname == NULL)
        return NULL;
    fullmodname = PyUnicode_FromFormat("%U.%U", pkgname, name);
    Py_DECREF(pkgname);
    if (fullmodname == NULL)
        return NULL;
    x = PyDict_GetItem(PyImport_GetModuleDict(), fullmodname);
    if (x == NULL)
4717
        PyErr_Format(PyExc_ImportError, "cannot import name %R", name);
4718 4719 4720
    else
        Py_INCREF(x);
    Py_DECREF(fullmodname);
4721
    return x;
4722
}
Guido van Rossum's avatar
Guido van Rossum committed
4723

4724 4725 4726
static int
import_all_from(PyObject *locals, PyObject *v)
{
4727 4728 4729
    _Py_IDENTIFIER(__all__);
    _Py_IDENTIFIER(__dict__);
    PyObject *all = _PyObject_GetAttrId(v, &PyId___all__);
4730 4731 4732 4733 4734 4735 4736 4737
    PyObject *dict, *name, *value;
    int skip_leading_underscores = 0;
    int pos, err;

    if (all == NULL) {
        if (!PyErr_ExceptionMatches(PyExc_AttributeError))
            return -1; /* Unexpected error */
        PyErr_Clear();
4738
        dict = _PyObject_GetAttrId(v, &PyId___dict__);
4739 4740 4741 4742 4743 4744 4745 4746 4747 4748 4749 4750 4751 4752 4753 4754 4755 4756 4757 4758 4759 4760 4761 4762 4763
        if (dict == NULL) {
            if (!PyErr_ExceptionMatches(PyExc_AttributeError))
                return -1;
            PyErr_SetString(PyExc_ImportError,
            "from-import-* object has no __dict__ and no __all__");
            return -1;
        }
        all = PyMapping_Keys(dict);
        Py_DECREF(dict);
        if (all == NULL)
            return -1;
        skip_leading_underscores = 1;
    }

    for (pos = 0, err = 0; ; pos++) {
        name = PySequence_GetItem(all, pos);
        if (name == NULL) {
            if (!PyErr_ExceptionMatches(PyExc_IndexError))
                err = -1;
            else
                PyErr_Clear();
            break;
        }
        if (skip_leading_underscores &&
            PyUnicode_Check(name) &&
Martin v. Löwis's avatar
Martin v. Löwis committed
4764 4765
            PyUnicode_READY(name) != -1 &&
            PyUnicode_READ_CHAR(name, 0) == '_')
4766 4767 4768 4769 4770 4771 4772 4773 4774 4775 4776 4777 4778 4779 4780 4781 4782 4783
        {
            Py_DECREF(name);
            continue;
        }
        value = PyObject_GetAttr(v, name);
        if (value == NULL)
            err = -1;
        else if (PyDict_CheckExact(locals))
            err = PyDict_SetItem(locals, name, value);
        else
            err = PyObject_SetItem(locals, name, value);
        Py_DECREF(name);
        Py_XDECREF(value);
        if (err != 0)
            break;
    }
    Py_DECREF(all);
    return err;
4784
}
Guido van Rossum's avatar
Guido van Rossum committed
4785

Guido van Rossum's avatar
Guido van Rossum committed
4786
static void
Neal Norwitz's avatar
Neal Norwitz committed
4787
format_exc_check_arg(PyObject *exc, const char *format_str, PyObject *obj)
4788
{
4789
    const char *obj_str;
4790

4791 4792
    if (!obj)
        return;
4793

4794 4795 4796
    obj_str = _PyUnicode_AsString(obj);
    if (!obj_str)
        return;
4797

4798
    PyErr_Format(exc, format_str, obj_str);
4799
}
4800

4801 4802 4803 4804 4805 4806 4807 4808 4809 4810 4811 4812 4813 4814 4815 4816 4817 4818 4819 4820 4821 4822
static void
format_exc_unbound(PyCodeObject *co, int oparg)
{
    PyObject *name;
    /* Don't stomp existing exception */
    if (PyErr_Occurred())
        return;
    if (oparg < PyTuple_GET_SIZE(co->co_cellvars)) {
        name = PyTuple_GET_ITEM(co->co_cellvars,
                                oparg);
        format_exc_check_arg(
            PyExc_UnboundLocalError,
            UNBOUNDLOCAL_ERROR_MSG,
            name);
    } else {
        name = PyTuple_GET_ITEM(co->co_freevars, oparg -
                                PyTuple_GET_SIZE(co->co_cellvars));
        format_exc_check_arg(PyExc_NameError,
                             UNBOUNDFREE_ERROR_MSG, name);
    }
}

4823 4824 4825 4826 4827 4828 4829 4830 4831 4832 4833 4834 4835 4836 4837 4838 4839 4840 4841 4842 4843 4844 4845 4846 4847 4848 4849 4850 4851 4852 4853 4854 4855 4856 4857 4858 4859 4860 4861 4862 4863 4864 4865 4866 4867 4868 4869 4870 4871 4872
static PyObject *
unicode_concatenate(PyObject *v, PyObject *w,
                    PyFrameObject *f, unsigned char *next_instr)
{
    PyObject *res;
    if (Py_REFCNT(v) == 2) {
        /* In the common case, there are 2 references to the value
         * stored in 'variable' when the += is performed: one on the
         * value stack (in 'v') and one still stored in the
         * 'variable'.  We try to delete the variable now to reduce
         * the refcnt to 1.
         */
        switch (*next_instr) {
        case STORE_FAST:
        {
            int oparg = PEEKARG();
            PyObject **fastlocals = f->f_localsplus;
            if (GETLOCAL(oparg) == v)
                SETLOCAL(oparg, NULL);
            break;
        }
        case STORE_DEREF:
        {
            PyObject **freevars = (f->f_localsplus +
                                   f->f_code->co_nlocals);
            PyObject *c = freevars[PEEKARG()];
            if (PyCell_GET(c) == v)
                PyCell_Set(c, NULL);
            break;
        }
        case STORE_NAME:
        {
            PyObject *names = f->f_code->co_names;
            PyObject *name = GETITEM(names, PEEKARG());
            PyObject *locals = f->f_locals;
            if (PyDict_CheckExact(locals) &&
                PyDict_GetItem(locals, name) == v) {
                if (PyDict_DelItem(locals, name) != 0) {
                    PyErr_Clear();
                }
            }
            break;
        }
        }
    }
    res = v;
    PyUnicode_Append(&res, w);
    return res;
}

4873 4874
#ifdef DYNAMIC_EXECUTION_PROFILE

4875
static PyObject *
4876
getarray(long a[256])
4877
{
4878 4879 4880 4881 4882 4883 4884 4885 4886 4887 4888 4889 4890 4891
    int i;
    PyObject *l = PyList_New(256);
    if (l == NULL) return NULL;
    for (i = 0; i < 256; i++) {
        PyObject *x = PyLong_FromLong(a[i]);
        if (x == NULL) {
            Py_DECREF(l);
            return NULL;
        }
        PyList_SetItem(l, i, x);
    }
    for (i = 0; i < 256; i++)
        a[i] = 0;
    return l;
4892 4893 4894
}

PyObject *
4895
_Py_GetDXProfile(PyObject *self, PyObject *args)
4896 4897
{
#ifndef DXPAIRS
4898
    return getarray(dxp);
4899
#else
4900 4901 4902 4903 4904 4905 4906 4907 4908 4909 4910 4911
    int i;
    PyObject *l = PyList_New(257);
    if (l == NULL) return NULL;
    for (i = 0; i < 257; i++) {
        PyObject *x = getarray(dxpairs[i]);
        if (x == NULL) {
            Py_DECREF(l);
            return NULL;
        }
        PyList_SetItem(l, i, x);
    }
    return l;
4912 4913 4914 4915
#endif
}

#endif