xref: /third_party/python/Python/compile.c (revision 7db96d56)
1/*
2 * This file compiles an abstract syntax tree (AST) into Python bytecode.
3 *
4 * The primary entry point is _PyAST_Compile(), which returns a
5 * PyCodeObject.  The compiler makes several passes to build the code
6 * object:
7 *   1. Checks for future statements.  See future.c
8 *   2. Builds a symbol table.  See symtable.c.
9 *   3. Generate code for basic blocks.  See compiler_mod() in this file.
10 *   4. Assemble the basic blocks into final code.  See assemble() in
11 *      this file.
12 *   5. Optimize the byte code (peephole optimizations).
13 *
14 * Note that compiler_mod() suggests module, but the module ast type
15 * (mod_ty) has cases for expressions and interactive statements.
16 *
17 * CAUTION: The VISIT_* macros abort the current function when they
18 * encounter a problem. So don't invoke them when there is memory
19 * which needs to be released. Code blocks are OK, as the compiler
20 * structure takes care of releasing those.  Use the arena to manage
21 * objects.
22 */
23
24#include <stdbool.h>
25
26// Need _PyOpcode_RelativeJump of pycore_opcode.h
27#define NEED_OPCODE_TABLES
28
29#include "Python.h"
30#include "pycore_ast.h"           // _PyAST_GetDocString()
31#include "pycore_code.h"          // _PyCode_New()
32#include "pycore_compile.h"       // _PyFuture_FromAST()
33#include "pycore_long.h"          // _PyLong_GetZero()
34#include "pycore_opcode.h"        // _PyOpcode_Caches
35#include "pycore_pymem.h"         // _PyMem_IsPtrFreed()
36#include "pycore_symtable.h"      // PySTEntryObject
37
38
39#define DEFAULT_BLOCK_SIZE 16
40#define DEFAULT_CODE_SIZE 128
41#define DEFAULT_LNOTAB_SIZE 16
42#define DEFAULT_CNOTAB_SIZE 32
43
44#define COMP_GENEXP   0
45#define COMP_LISTCOMP 1
46#define COMP_SETCOMP  2
47#define COMP_DICTCOMP 3
48
49/* A soft limit for stack use, to avoid excessive
50 * memory use for large constants, etc.
51 *
52 * The value 30 is plucked out of thin air.
53 * Code that could use more stack than this is
54 * rare, so the exact value is unimportant.
55 */
56#define STACK_USE_GUIDELINE 30
57
58/* If we exceed this limit, it should
59 * be considered a compiler bug.
60 * Currently it should be impossible
61 * to exceed STACK_USE_GUIDELINE * 100,
62 * as 100 is the maximum parse depth.
63 * For performance reasons we will
64 * want to reduce this to a
65 * few hundred in the future.
66 *
67 * NOTE: Whatever MAX_ALLOWED_STACK_USE is
68 * set to, it should never restrict what Python
69 * we can write, just how we compile it.
70 */
71#define MAX_ALLOWED_STACK_USE (STACK_USE_GUIDELINE * 100)
72
73
74/* Pseudo-instructions used in the compiler,
75 * but turned into NOPs or other instructions
76 * by the assembler. */
77#define SETUP_FINALLY -1
78#define SETUP_CLEANUP -2
79#define SETUP_WITH -3
80#define POP_BLOCK -4
81#define JUMP -5
82#define JUMP_NO_INTERRUPT -6
83#define POP_JUMP_IF_FALSE -7
84#define POP_JUMP_IF_TRUE -8
85#define POP_JUMP_IF_NONE -9
86#define POP_JUMP_IF_NOT_NONE -10
87
88#define MIN_VIRTUAL_OPCODE -10
89#define MAX_ALLOWED_OPCODE 254
90
91#define IS_WITHIN_OPCODE_RANGE(opcode) \
92        ((opcode) >= MIN_VIRTUAL_OPCODE && (opcode) <= MAX_ALLOWED_OPCODE)
93
94#define IS_VIRTUAL_OPCODE(opcode) ((opcode) < 0)
95
96#define IS_VIRTUAL_JUMP_OPCODE(opcode) \
97        ((opcode) == JUMP || \
98         (opcode) == JUMP_NO_INTERRUPT || \
99         (opcode) == POP_JUMP_IF_NONE || \
100         (opcode) == POP_JUMP_IF_NOT_NONE || \
101         (opcode) == POP_JUMP_IF_FALSE || \
102         (opcode) == POP_JUMP_IF_TRUE)
103
104/* opcodes which are not emitted in codegen stage, only by the assembler */
105#define IS_ASSEMBLER_OPCODE(opcode) \
106        ((opcode) == JUMP_FORWARD || \
107         (opcode) == JUMP_BACKWARD || \
108         (opcode) == JUMP_BACKWARD_NO_INTERRUPT || \
109         (opcode) == POP_JUMP_FORWARD_IF_NONE || \
110         (opcode) == POP_JUMP_BACKWARD_IF_NONE || \
111         (opcode) == POP_JUMP_FORWARD_IF_NOT_NONE || \
112         (opcode) == POP_JUMP_BACKWARD_IF_NOT_NONE || \
113         (opcode) == POP_JUMP_FORWARD_IF_TRUE || \
114         (opcode) == POP_JUMP_BACKWARD_IF_TRUE || \
115         (opcode) == POP_JUMP_FORWARD_IF_FALSE || \
116         (opcode) == POP_JUMP_BACKWARD_IF_FALSE)
117
118
119#define IS_BACKWARDS_JUMP_OPCODE(opcode) \
120        ((opcode) == JUMP_BACKWARD || \
121         (opcode) == JUMP_BACKWARD_NO_INTERRUPT || \
122         (opcode) == POP_JUMP_BACKWARD_IF_NONE || \
123         (opcode) == POP_JUMP_BACKWARD_IF_NOT_NONE || \
124         (opcode) == POP_JUMP_BACKWARD_IF_TRUE || \
125         (opcode) == POP_JUMP_BACKWARD_IF_FALSE)
126
127
128#define IS_TOP_LEVEL_AWAIT(c) ( \
129        (c->c_flags->cf_flags & PyCF_ALLOW_TOP_LEVEL_AWAIT) \
130        && (c->u->u_ste->ste_type == ModuleBlock))
131
132struct instr {
133    int i_opcode;
134    int i_oparg;
135    /* target block (if jump instruction) */
136    struct basicblock_ *i_target;
137     /* target block when exception is raised, should not be set by front-end. */
138    struct basicblock_ *i_except;
139    int i_lineno;
140    int i_end_lineno;
141    int i_col_offset;
142    int i_end_col_offset;
143};
144
145typedef struct excepthandler {
146    struct instr *setup;
147    int offset;
148} ExceptHandler;
149
150typedef struct exceptstack {
151    struct basicblock_ *handlers[CO_MAXBLOCKS+1];
152    int depth;
153} ExceptStack;
154
155#define LOG_BITS_PER_INT 5
156#define MASK_LOW_LOG_BITS 31
157
158static inline int
159is_bit_set_in_table(const uint32_t *table, int bitindex) {
160    /* Is the relevant bit set in the relevant word? */
161    /* 256 bits fit into 8 32-bits words.
162     * Word is indexed by (bitindex>>ln(size of int in bits)).
163     * Bit within word is the low bits of bitindex.
164     */
165    if (bitindex >= 0 && bitindex < 256) {
166        uint32_t word = table[bitindex >> LOG_BITS_PER_INT];
167        return (word >> (bitindex & MASK_LOW_LOG_BITS)) & 1;
168    }
169    else {
170        return 0;
171    }
172}
173
174static inline int
175is_relative_jump(struct instr *i)
176{
177    return is_bit_set_in_table(_PyOpcode_RelativeJump, i->i_opcode);
178}
179
180static inline int
181is_block_push(struct instr *instr)
182{
183    int opcode = instr->i_opcode;
184    return opcode == SETUP_FINALLY || opcode == SETUP_WITH || opcode == SETUP_CLEANUP;
185}
186
187static inline int
188is_jump(struct instr *i)
189{
190    return IS_VIRTUAL_JUMP_OPCODE(i->i_opcode) ||
191           is_bit_set_in_table(_PyOpcode_Jump, i->i_opcode);
192}
193
194static int
195instr_size(struct instr *instruction)
196{
197    int opcode = instruction->i_opcode;
198    assert(!IS_VIRTUAL_OPCODE(opcode));
199    int oparg = HAS_ARG(opcode) ? instruction->i_oparg : 0;
200    int extended_args = (0xFFFFFF < oparg) + (0xFFFF < oparg) + (0xFF < oparg);
201    int caches = _PyOpcode_Caches[opcode];
202    return extended_args + 1 + caches;
203}
204
205static void
206write_instr(_Py_CODEUNIT *codestr, struct instr *instruction, int ilen)
207{
208    int opcode = instruction->i_opcode;
209    assert(!IS_VIRTUAL_OPCODE(opcode));
210    int oparg = HAS_ARG(opcode) ? instruction->i_oparg : 0;
211    int caches = _PyOpcode_Caches[opcode];
212    switch (ilen - caches) {
213        case 4:
214            *codestr++ = _Py_MAKECODEUNIT(EXTENDED_ARG, (oparg >> 24) & 0xFF);
215            /* fall through */
216        case 3:
217            *codestr++ = _Py_MAKECODEUNIT(EXTENDED_ARG, (oparg >> 16) & 0xFF);
218            /* fall through */
219        case 2:
220            *codestr++ = _Py_MAKECODEUNIT(EXTENDED_ARG, (oparg >> 8) & 0xFF);
221            /* fall through */
222        case 1:
223            *codestr++ = _Py_MAKECODEUNIT(opcode, oparg & 0xFF);
224            break;
225        default:
226            Py_UNREACHABLE();
227    }
228    while (caches--) {
229        *codestr++ = _Py_MAKECODEUNIT(CACHE, 0);
230    }
231}
232
233typedef struct basicblock_ {
234    /* Each basicblock in a compilation unit is linked via b_list in the
235       reverse order that the block are allocated.  b_list points to the next
236       block, not to be confused with b_next, which is next by control flow. */
237    struct basicblock_ *b_list;
238    /* Exception stack at start of block, used by assembler to create the exception handling table */
239    ExceptStack *b_exceptstack;
240    /* pointer to an array of instructions, initially NULL */
241    struct instr *b_instr;
242    /* If b_next is non-NULL, it is a pointer to the next
243       block reached by normal control flow. */
244    struct basicblock_ *b_next;
245    /* number of instructions used */
246    int b_iused;
247    /* length of instruction array (b_instr) */
248    int b_ialloc;
249    /* Number of predecssors that a block has. */
250    int b_predecessors;
251    /* depth of stack upon entry of block, computed by stackdepth() */
252    int b_startdepth;
253    /* instruction offset for block, computed by assemble_jump_offsets() */
254    int b_offset;
255    /* Basic block has no fall through (it ends with a return, raise or jump) */
256    unsigned b_nofallthrough : 1;
257    /* Basic block is an exception handler that preserves lasti */
258    unsigned b_preserve_lasti : 1;
259    /* Used by compiler passes to mark whether they have visited a basic block. */
260    unsigned b_visited : 1;
261    /* Basic block exits scope (it ends with a return or raise) */
262    unsigned b_exit : 1;
263    /* b_return is true if a RETURN_VALUE opcode is inserted. */
264    unsigned b_return : 1;
265} basicblock;
266
267/* fblockinfo tracks the current frame block.
268
269A frame block is used to handle loops, try/except, and try/finally.
270It's called a frame block to distinguish it from a basic block in the
271compiler IR.
272*/
273
274enum fblocktype { WHILE_LOOP, FOR_LOOP, TRY_EXCEPT, FINALLY_TRY, FINALLY_END,
275                  WITH, ASYNC_WITH, HANDLER_CLEANUP, POP_VALUE, EXCEPTION_HANDLER,
276                  EXCEPTION_GROUP_HANDLER, ASYNC_COMPREHENSION_GENERATOR };
277
278struct fblockinfo {
279    enum fblocktype fb_type;
280    basicblock *fb_block;
281    /* (optional) type-specific exit or cleanup block */
282    basicblock *fb_exit;
283    /* (optional) additional information required for unwinding */
284    void *fb_datum;
285};
286
287enum {
288    COMPILER_SCOPE_MODULE,
289    COMPILER_SCOPE_CLASS,
290    COMPILER_SCOPE_FUNCTION,
291    COMPILER_SCOPE_ASYNC_FUNCTION,
292    COMPILER_SCOPE_LAMBDA,
293    COMPILER_SCOPE_COMPREHENSION,
294};
295
296/* The following items change on entry and exit of code blocks.
297   They must be saved and restored when returning to a block.
298*/
299struct compiler_unit {
300    PySTEntryObject *u_ste;
301
302    PyObject *u_name;
303    PyObject *u_qualname;  /* dot-separated qualified name (lazy) */
304    int u_scope_type;
305
306    /* The following fields are dicts that map objects to
307       the index of them in co_XXX.      The index is used as
308       the argument for opcodes that refer to those collections.
309    */
310    PyObject *u_consts;    /* all constants */
311    PyObject *u_names;     /* all names */
312    PyObject *u_varnames;  /* local variables */
313    PyObject *u_cellvars;  /* cell variables */
314    PyObject *u_freevars;  /* free variables */
315
316    PyObject *u_private;        /* for private name mangling */
317
318    Py_ssize_t u_argcount;        /* number of arguments for block */
319    Py_ssize_t u_posonlyargcount;        /* number of positional only arguments for block */
320    Py_ssize_t u_kwonlyargcount; /* number of keyword only arguments for block */
321    /* Pointer to the most recently allocated block.  By following b_list
322       members, you can reach all early allocated blocks. */
323    basicblock *u_blocks;
324    basicblock *u_curblock; /* pointer to current block */
325
326    int u_nfblocks;
327    struct fblockinfo u_fblock[CO_MAXBLOCKS];
328
329    int u_firstlineno; /* the first lineno of the block */
330    int u_lineno;          /* the lineno for the current stmt */
331    int u_col_offset;      /* the offset of the current stmt */
332    int u_end_lineno;      /* the end line of the current stmt */
333    int u_end_col_offset;  /* the end offset of the current stmt */
334
335    /* true if we need to create an implicit basicblock before the next instr */
336    int u_need_new_implicit_block;
337};
338
339/* This struct captures the global state of a compilation.
340
341The u pointer points to the current compilation unit, while units
342for enclosing blocks are stored in c_stack.     The u and c_stack are
343managed by compiler_enter_scope() and compiler_exit_scope().
344
345Note that we don't track recursion levels during compilation - the
346task of detecting and rejecting excessive levels of nesting is
347handled by the symbol analysis pass.
348
349*/
350
351struct compiler {
352    PyObject *c_filename;
353    struct symtable *c_st;
354    PyFutureFeatures *c_future; /* pointer to module's __future__ */
355    PyCompilerFlags *c_flags;
356
357    int c_optimize;              /* optimization level */
358    int c_interactive;           /* true if in interactive mode */
359    int c_nestlevel;
360    PyObject *c_const_cache;     /* Python dict holding all constants,
361                                    including names tuple */
362    struct compiler_unit *u; /* compiler state for current block */
363    PyObject *c_stack;           /* Python list holding compiler_unit ptrs */
364    PyArena *c_arena;            /* pointer to memory allocation arena */
365};
366
367typedef struct {
368    // A list of strings corresponding to name captures. It is used to track:
369    // - Repeated name assignments in the same pattern.
370    // - Different name assignments in alternatives.
371    // - The order of name assignments in alternatives.
372    PyObject *stores;
373    // If 0, any name captures against our subject will raise.
374    int allow_irrefutable;
375    // An array of blocks to jump to on failure. Jumping to fail_pop[i] will pop
376    // i items off of the stack. The end result looks like this (with each block
377    // falling through to the next):
378    // fail_pop[4]: POP_TOP
379    // fail_pop[3]: POP_TOP
380    // fail_pop[2]: POP_TOP
381    // fail_pop[1]: POP_TOP
382    // fail_pop[0]: NOP
383    basicblock **fail_pop;
384    // The current length of fail_pop.
385    Py_ssize_t fail_pop_size;
386    // The number of items on top of the stack that need to *stay* on top of the
387    // stack. Variable captures go beneath these. All of them will be popped on
388    // failure.
389    Py_ssize_t on_top;
390} pattern_context;
391
392static int compiler_enter_scope(struct compiler *, identifier, int, void *, int);
393static void compiler_free(struct compiler *);
394static basicblock *compiler_new_block(struct compiler *);
395static int compiler_next_instr(basicblock *);
396static int compiler_addop(struct compiler *, int);
397static int compiler_addop_i(struct compiler *, int, Py_ssize_t);
398static int compiler_addop_j(struct compiler *, int, basicblock *);
399static int compiler_addop_j_noline(struct compiler *, int, basicblock *);
400static int compiler_error(struct compiler *, const char *, ...);
401static int compiler_warn(struct compiler *, const char *, ...);
402static int compiler_nameop(struct compiler *, identifier, expr_context_ty);
403
404static PyCodeObject *compiler_mod(struct compiler *, mod_ty);
405static int compiler_visit_stmt(struct compiler *, stmt_ty);
406static int compiler_visit_keyword(struct compiler *, keyword_ty);
407static int compiler_visit_expr(struct compiler *, expr_ty);
408static int compiler_augassign(struct compiler *, stmt_ty);
409static int compiler_annassign(struct compiler *, stmt_ty);
410static int compiler_subscript(struct compiler *, expr_ty);
411static int compiler_slice(struct compiler *, expr_ty);
412
413static int are_all_items_const(asdl_expr_seq *, Py_ssize_t, Py_ssize_t);
414
415
416static int compiler_with(struct compiler *, stmt_ty, int);
417static int compiler_async_with(struct compiler *, stmt_ty, int);
418static int compiler_async_for(struct compiler *, stmt_ty);
419static int validate_keywords(struct compiler *c, asdl_keyword_seq *keywords);
420static int compiler_call_simple_kw_helper(struct compiler *c,
421                                          asdl_keyword_seq *keywords,
422                                          Py_ssize_t nkwelts);
423static int compiler_call_helper(struct compiler *c, int n,
424                                asdl_expr_seq *args,
425                                asdl_keyword_seq *keywords);
426static int compiler_try_except(struct compiler *, stmt_ty);
427static int compiler_try_star_except(struct compiler *, stmt_ty);
428static int compiler_set_qualname(struct compiler *);
429
430static int compiler_sync_comprehension_generator(
431                                      struct compiler *c,
432                                      asdl_comprehension_seq *generators, int gen_index,
433                                      int depth,
434                                      expr_ty elt, expr_ty val, int type);
435
436static int compiler_async_comprehension_generator(
437                                      struct compiler *c,
438                                      asdl_comprehension_seq *generators, int gen_index,
439                                      int depth,
440                                      expr_ty elt, expr_ty val, int type);
441
442static int compiler_pattern(struct compiler *, pattern_ty, pattern_context *);
443static int compiler_match(struct compiler *, stmt_ty);
444static int compiler_pattern_subpattern(struct compiler *, pattern_ty,
445                                       pattern_context *);
446
447static void clean_basic_block(basicblock *bb);
448
449static PyCodeObject *assemble(struct compiler *, int addNone);
450
451#define CAPSULE_NAME "compile.c compiler unit"
452
453PyObject *
454_Py_Mangle(PyObject *privateobj, PyObject *ident)
455{
456    /* Name mangling: __private becomes _classname__private.
457       This is independent from how the name is used. */
458    PyObject *result;
459    size_t nlen, plen, ipriv;
460    Py_UCS4 maxchar;
461    if (privateobj == NULL || !PyUnicode_Check(privateobj) ||
462        PyUnicode_READ_CHAR(ident, 0) != '_' ||
463        PyUnicode_READ_CHAR(ident, 1) != '_') {
464        Py_INCREF(ident);
465        return ident;
466    }
467    nlen = PyUnicode_GET_LENGTH(ident);
468    plen = PyUnicode_GET_LENGTH(privateobj);
469    /* Don't mangle __id__ or names with dots.
470
471       The only time a name with a dot can occur is when
472       we are compiling an import statement that has a
473       package name.
474
475       TODO(jhylton): Decide whether we want to support
476       mangling of the module name, e.g. __M.X.
477    */
478    if ((PyUnicode_READ_CHAR(ident, nlen-1) == '_' &&
479         PyUnicode_READ_CHAR(ident, nlen-2) == '_') ||
480        PyUnicode_FindChar(ident, '.', 0, nlen, 1) != -1) {
481        Py_INCREF(ident);
482        return ident; /* Don't mangle __whatever__ */
483    }
484    /* Strip leading underscores from class name */
485    ipriv = 0;
486    while (PyUnicode_READ_CHAR(privateobj, ipriv) == '_')
487        ipriv++;
488    if (ipriv == plen) {
489        Py_INCREF(ident);
490        return ident; /* Don't mangle if class is just underscores */
491    }
492    plen -= ipriv;
493
494    if (plen + nlen >= PY_SSIZE_T_MAX - 1) {
495        PyErr_SetString(PyExc_OverflowError,
496                        "private identifier too large to be mangled");
497        return NULL;
498    }
499
500    maxchar = PyUnicode_MAX_CHAR_VALUE(ident);
501    if (PyUnicode_MAX_CHAR_VALUE(privateobj) > maxchar)
502        maxchar = PyUnicode_MAX_CHAR_VALUE(privateobj);
503
504    result = PyUnicode_New(1 + nlen + plen, maxchar);
505    if (!result)
506        return 0;
507    /* ident = "_" + priv[ipriv:] + ident # i.e. 1+plen+nlen bytes */
508    PyUnicode_WRITE(PyUnicode_KIND(result), PyUnicode_DATA(result), 0, '_');
509    if (PyUnicode_CopyCharacters(result, 1, privateobj, ipriv, plen) < 0) {
510        Py_DECREF(result);
511        return NULL;
512    }
513    if (PyUnicode_CopyCharacters(result, plen+1, ident, 0, nlen) < 0) {
514        Py_DECREF(result);
515        return NULL;
516    }
517    assert(_PyUnicode_CheckConsistency(result, 1));
518    return result;
519}
520
521static int
522compiler_init(struct compiler *c)
523{
524    memset(c, 0, sizeof(struct compiler));
525
526    c->c_const_cache = PyDict_New();
527    if (!c->c_const_cache) {
528        return 0;
529    }
530
531    c->c_stack = PyList_New(0);
532    if (!c->c_stack) {
533        Py_CLEAR(c->c_const_cache);
534        return 0;
535    }
536
537    return 1;
538}
539
540PyCodeObject *
541_PyAST_Compile(mod_ty mod, PyObject *filename, PyCompilerFlags *flags,
542               int optimize, PyArena *arena)
543{
544    struct compiler c;
545    PyCodeObject *co = NULL;
546    PyCompilerFlags local_flags = _PyCompilerFlags_INIT;
547    int merged;
548    if (!compiler_init(&c))
549        return NULL;
550    Py_INCREF(filename);
551    c.c_filename = filename;
552    c.c_arena = arena;
553    c.c_future = _PyFuture_FromAST(mod, filename);
554    if (c.c_future == NULL)
555        goto finally;
556    if (!flags) {
557        flags = &local_flags;
558    }
559    merged = c.c_future->ff_features | flags->cf_flags;
560    c.c_future->ff_features = merged;
561    flags->cf_flags = merged;
562    c.c_flags = flags;
563    c.c_optimize = (optimize == -1) ? _Py_GetConfig()->optimization_level : optimize;
564    c.c_nestlevel = 0;
565
566    _PyASTOptimizeState state;
567    state.optimize = c.c_optimize;
568    state.ff_features = merged;
569
570    if (!_PyAST_Optimize(mod, arena, &state)) {
571        goto finally;
572    }
573
574    c.c_st = _PySymtable_Build(mod, filename, c.c_future);
575    if (c.c_st == NULL) {
576        if (!PyErr_Occurred())
577            PyErr_SetString(PyExc_SystemError, "no symtable");
578        goto finally;
579    }
580
581    co = compiler_mod(&c, mod);
582
583 finally:
584    compiler_free(&c);
585    assert(co || PyErr_Occurred());
586    return co;
587}
588
589static void
590compiler_free(struct compiler *c)
591{
592    if (c->c_st)
593        _PySymtable_Free(c->c_st);
594    if (c->c_future)
595        PyObject_Free(c->c_future);
596    Py_XDECREF(c->c_filename);
597    Py_DECREF(c->c_const_cache);
598    Py_DECREF(c->c_stack);
599}
600
601static PyObject *
602list2dict(PyObject *list)
603{
604    Py_ssize_t i, n;
605    PyObject *v, *k;
606    PyObject *dict = PyDict_New();
607    if (!dict) return NULL;
608
609    n = PyList_Size(list);
610    for (i = 0; i < n; i++) {
611        v = PyLong_FromSsize_t(i);
612        if (!v) {
613            Py_DECREF(dict);
614            return NULL;
615        }
616        k = PyList_GET_ITEM(list, i);
617        if (PyDict_SetItem(dict, k, v) < 0) {
618            Py_DECREF(v);
619            Py_DECREF(dict);
620            return NULL;
621        }
622        Py_DECREF(v);
623    }
624    return dict;
625}
626
627/* Return new dict containing names from src that match scope(s).
628
629src is a symbol table dictionary.  If the scope of a name matches
630either scope_type or flag is set, insert it into the new dict.  The
631values are integers, starting at offset and increasing by one for
632each key.
633*/
634
635static PyObject *
636dictbytype(PyObject *src, int scope_type, int flag, Py_ssize_t offset)
637{
638    Py_ssize_t i = offset, scope, num_keys, key_i;
639    PyObject *k, *v, *dest = PyDict_New();
640    PyObject *sorted_keys;
641
642    assert(offset >= 0);
643    if (dest == NULL)
644        return NULL;
645
646    /* Sort the keys so that we have a deterministic order on the indexes
647       saved in the returned dictionary.  These indexes are used as indexes
648       into the free and cell var storage.  Therefore if they aren't
649       deterministic, then the generated bytecode is not deterministic.
650    */
651    sorted_keys = PyDict_Keys(src);
652    if (sorted_keys == NULL)
653        return NULL;
654    if (PyList_Sort(sorted_keys) != 0) {
655        Py_DECREF(sorted_keys);
656        return NULL;
657    }
658    num_keys = PyList_GET_SIZE(sorted_keys);
659
660    for (key_i = 0; key_i < num_keys; key_i++) {
661        /* XXX this should probably be a macro in symtable.h */
662        long vi;
663        k = PyList_GET_ITEM(sorted_keys, key_i);
664        v = PyDict_GetItemWithError(src, k);
665        assert(v && PyLong_Check(v));
666        vi = PyLong_AS_LONG(v);
667        scope = (vi >> SCOPE_OFFSET) & SCOPE_MASK;
668
669        if (scope == scope_type || vi & flag) {
670            PyObject *item = PyLong_FromSsize_t(i);
671            if (item == NULL) {
672                Py_DECREF(sorted_keys);
673                Py_DECREF(dest);
674                return NULL;
675            }
676            i++;
677            if (PyDict_SetItem(dest, k, item) < 0) {
678                Py_DECREF(sorted_keys);
679                Py_DECREF(item);
680                Py_DECREF(dest);
681                return NULL;
682            }
683            Py_DECREF(item);
684        }
685    }
686    Py_DECREF(sorted_keys);
687    return dest;
688}
689
690static void
691compiler_unit_check(struct compiler_unit *u)
692{
693    basicblock *block;
694    for (block = u->u_blocks; block != NULL; block = block->b_list) {
695        assert(!_PyMem_IsPtrFreed(block));
696        if (block->b_instr != NULL) {
697            assert(block->b_ialloc > 0);
698            assert(block->b_iused >= 0);
699            assert(block->b_ialloc >= block->b_iused);
700        }
701        else {
702            assert (block->b_iused == 0);
703            assert (block->b_ialloc == 0);
704        }
705    }
706}
707
708static void
709compiler_unit_free(struct compiler_unit *u)
710{
711    basicblock *b, *next;
712
713    compiler_unit_check(u);
714    b = u->u_blocks;
715    while (b != NULL) {
716        if (b->b_instr)
717            PyObject_Free((void *)b->b_instr);
718        next = b->b_list;
719        PyObject_Free((void *)b);
720        b = next;
721    }
722    Py_CLEAR(u->u_ste);
723    Py_CLEAR(u->u_name);
724    Py_CLEAR(u->u_qualname);
725    Py_CLEAR(u->u_consts);
726    Py_CLEAR(u->u_names);
727    Py_CLEAR(u->u_varnames);
728    Py_CLEAR(u->u_freevars);
729    Py_CLEAR(u->u_cellvars);
730    Py_CLEAR(u->u_private);
731    PyObject_Free(u);
732}
733
734static int
735compiler_set_qualname(struct compiler *c)
736{
737    Py_ssize_t stack_size;
738    struct compiler_unit *u = c->u;
739    PyObject *name, *base;
740
741    base = NULL;
742    stack_size = PyList_GET_SIZE(c->c_stack);
743    assert(stack_size >= 1);
744    if (stack_size > 1) {
745        int scope, force_global = 0;
746        struct compiler_unit *parent;
747        PyObject *mangled, *capsule;
748
749        capsule = PyList_GET_ITEM(c->c_stack, stack_size - 1);
750        parent = (struct compiler_unit *)PyCapsule_GetPointer(capsule, CAPSULE_NAME);
751        assert(parent);
752
753        if (u->u_scope_type == COMPILER_SCOPE_FUNCTION
754            || u->u_scope_type == COMPILER_SCOPE_ASYNC_FUNCTION
755            || u->u_scope_type == COMPILER_SCOPE_CLASS) {
756            assert(u->u_name);
757            mangled = _Py_Mangle(parent->u_private, u->u_name);
758            if (!mangled)
759                return 0;
760            scope = _PyST_GetScope(parent->u_ste, mangled);
761            Py_DECREF(mangled);
762            assert(scope != GLOBAL_IMPLICIT);
763            if (scope == GLOBAL_EXPLICIT)
764                force_global = 1;
765        }
766
767        if (!force_global) {
768            if (parent->u_scope_type == COMPILER_SCOPE_FUNCTION
769                || parent->u_scope_type == COMPILER_SCOPE_ASYNC_FUNCTION
770                || parent->u_scope_type == COMPILER_SCOPE_LAMBDA)
771            {
772                _Py_DECLARE_STR(dot_locals, ".<locals>");
773                base = PyUnicode_Concat(parent->u_qualname,
774                                        &_Py_STR(dot_locals));
775                if (base == NULL)
776                    return 0;
777            }
778            else {
779                Py_INCREF(parent->u_qualname);
780                base = parent->u_qualname;
781            }
782        }
783    }
784
785    if (base != NULL) {
786        _Py_DECLARE_STR(dot, ".");
787        name = PyUnicode_Concat(base, &_Py_STR(dot));
788        Py_DECREF(base);
789        if (name == NULL)
790            return 0;
791        PyUnicode_Append(&name, u->u_name);
792        if (name == NULL)
793            return 0;
794    }
795    else {
796        Py_INCREF(u->u_name);
797        name = u->u_name;
798    }
799    u->u_qualname = name;
800
801    return 1;
802}
803
804
805/* Allocate a new block and return a pointer to it.
806   Returns NULL on error.
807*/
808
809static basicblock *
810compiler_new_block(struct compiler *c)
811{
812    basicblock *b;
813    struct compiler_unit *u;
814
815    u = c->u;
816    b = (basicblock *)PyObject_Calloc(1, sizeof(basicblock));
817    if (b == NULL) {
818        PyErr_NoMemory();
819        return NULL;
820    }
821    /* Extend the singly linked list of blocks with new block. */
822    b->b_list = u->u_blocks;
823    u->u_blocks = b;
824    return b;
825}
826
827static basicblock *
828compiler_use_next_block(struct compiler *c, basicblock *block)
829{
830    assert(block != NULL);
831    c->u->u_curblock->b_next = block;
832    c->u->u_curblock = block;
833    c->u->u_need_new_implicit_block = 0;
834    return block;
835}
836
837static basicblock *
838compiler_copy_block(struct compiler *c, basicblock *block)
839{
840    /* Cannot copy a block if it has a fallthrough, since
841     * a block can only have one fallthrough predecessor.
842     */
843    assert(block->b_nofallthrough);
844    basicblock *result = compiler_new_block(c);
845    if (result == NULL) {
846        return NULL;
847    }
848    for (int i = 0; i < block->b_iused; i++) {
849        int n = compiler_next_instr(result);
850        if (n < 0) {
851            return NULL;
852        }
853        result->b_instr[n] = block->b_instr[i];
854    }
855    result->b_exit = block->b_exit;
856    result->b_nofallthrough = 1;
857    return result;
858}
859
860/* Returns the offset of the next instruction in the current block's
861   b_instr array.  Resizes the b_instr as necessary.
862   Returns -1 on failure.
863*/
864
865static int
866compiler_next_instr(basicblock *b)
867{
868    assert(b != NULL);
869    if (b->b_instr == NULL) {
870        b->b_instr = (struct instr *)PyObject_Calloc(
871                         DEFAULT_BLOCK_SIZE, sizeof(struct instr));
872        if (b->b_instr == NULL) {
873            PyErr_NoMemory();
874            return -1;
875        }
876        b->b_ialloc = DEFAULT_BLOCK_SIZE;
877    }
878    else if (b->b_iused == b->b_ialloc) {
879        struct instr *tmp;
880        size_t oldsize, newsize;
881        oldsize = b->b_ialloc * sizeof(struct instr);
882        newsize = oldsize << 1;
883
884        if (oldsize > (SIZE_MAX >> 1)) {
885            PyErr_NoMemory();
886            return -1;
887        }
888
889        if (newsize == 0) {
890            PyErr_NoMemory();
891            return -1;
892        }
893        b->b_ialloc <<= 1;
894        tmp = (struct instr *)PyObject_Realloc(
895                                        (void *)b->b_instr, newsize);
896        if (tmp == NULL) {
897            PyErr_NoMemory();
898            return -1;
899        }
900        b->b_instr = tmp;
901        memset((char *)b->b_instr + oldsize, 0, newsize - oldsize);
902    }
903    return b->b_iused++;
904}
905
906/* Set the line number and column offset for the following instructions.
907
908   The line number is reset in the following cases:
909   - when entering a new scope
910   - on each statement
911   - on each expression and sub-expression
912   - before the "except" and "finally" clauses
913*/
914
915#define SET_LOC(c, x)                           \
916    (c)->u->u_lineno = (x)->lineno;             \
917    (c)->u->u_col_offset = (x)->col_offset;     \
918    (c)->u->u_end_lineno = (x)->end_lineno;     \
919    (c)->u->u_end_col_offset = (x)->end_col_offset;
920
921// Artificial instructions
922#define UNSET_LOC(c)                            \
923    (c)->u->u_lineno = -1;                      \
924    (c)->u->u_col_offset = -1;                  \
925    (c)->u->u_end_lineno = -1;                  \
926    (c)->u->u_end_col_offset = -1;
927
928#define COPY_INSTR_LOC(old, new)                         \
929    (new).i_lineno = (old).i_lineno;                     \
930    (new).i_col_offset = (old).i_col_offset;             \
931    (new).i_end_lineno = (old).i_end_lineno;             \
932    (new).i_end_col_offset = (old).i_end_col_offset;
933
934/* Return the stack effect of opcode with argument oparg.
935
936   Some opcodes have different stack effect when jump to the target and
937   when not jump. The 'jump' parameter specifies the case:
938
939   * 0 -- when not jump
940   * 1 -- when jump
941   * -1 -- maximal
942 */
943static int
944stack_effect(int opcode, int oparg, int jump)
945{
946    switch (opcode) {
947        case NOP:
948        case EXTENDED_ARG:
949        case RESUME:
950        case CACHE:
951            return 0;
952
953        /* Stack manipulation */
954        case POP_TOP:
955            return -1;
956        case SWAP:
957            return 0;
958
959        /* Unary operators */
960        case UNARY_POSITIVE:
961        case UNARY_NEGATIVE:
962        case UNARY_NOT:
963        case UNARY_INVERT:
964            return 0;
965
966        case SET_ADD:
967        case LIST_APPEND:
968            return -1;
969        case MAP_ADD:
970            return -2;
971
972        case BINARY_SUBSCR:
973            return -1;
974        case STORE_SUBSCR:
975            return -3;
976        case DELETE_SUBSCR:
977            return -2;
978
979        case GET_ITER:
980            return 0;
981
982        case PRINT_EXPR:
983            return -1;
984        case LOAD_BUILD_CLASS:
985            return 1;
986
987        case RETURN_VALUE:
988            return -1;
989        case IMPORT_STAR:
990            return -1;
991        case SETUP_ANNOTATIONS:
992            return 0;
993        case ASYNC_GEN_WRAP:
994        case YIELD_VALUE:
995            return 0;
996        case POP_BLOCK:
997            return 0;
998        case POP_EXCEPT:
999            return -1;
1000
1001        case STORE_NAME:
1002            return -1;
1003        case DELETE_NAME:
1004            return 0;
1005        case UNPACK_SEQUENCE:
1006            return oparg-1;
1007        case UNPACK_EX:
1008            return (oparg&0xFF) + (oparg>>8);
1009        case FOR_ITER:
1010            /* -1 at end of iterator, 1 if continue iterating. */
1011            return jump > 0 ? -1 : 1;
1012        case SEND:
1013            return jump > 0 ? -1 : 0;
1014        case STORE_ATTR:
1015            return -2;
1016        case DELETE_ATTR:
1017            return -1;
1018        case STORE_GLOBAL:
1019            return -1;
1020        case DELETE_GLOBAL:
1021            return 0;
1022        case LOAD_CONST:
1023            return 1;
1024        case LOAD_NAME:
1025            return 1;
1026        case BUILD_TUPLE:
1027        case BUILD_LIST:
1028        case BUILD_SET:
1029        case BUILD_STRING:
1030            return 1-oparg;
1031        case BUILD_MAP:
1032            return 1 - 2*oparg;
1033        case BUILD_CONST_KEY_MAP:
1034            return -oparg;
1035        case LOAD_ATTR:
1036            return 0;
1037        case COMPARE_OP:
1038        case IS_OP:
1039        case CONTAINS_OP:
1040            return -1;
1041        case CHECK_EXC_MATCH:
1042            return 0;
1043        case CHECK_EG_MATCH:
1044            return 0;
1045        case IMPORT_NAME:
1046            return -1;
1047        case IMPORT_FROM:
1048            return 1;
1049
1050        /* Jumps */
1051        case JUMP_FORWARD:
1052        case JUMP_BACKWARD:
1053        case JUMP:
1054        case JUMP_BACKWARD_NO_INTERRUPT:
1055        case JUMP_NO_INTERRUPT:
1056            return 0;
1057
1058        case JUMP_IF_TRUE_OR_POP:
1059        case JUMP_IF_FALSE_OR_POP:
1060            return jump ? 0 : -1;
1061
1062        case POP_JUMP_BACKWARD_IF_NONE:
1063        case POP_JUMP_FORWARD_IF_NONE:
1064        case POP_JUMP_IF_NONE:
1065        case POP_JUMP_BACKWARD_IF_NOT_NONE:
1066        case POP_JUMP_FORWARD_IF_NOT_NONE:
1067        case POP_JUMP_IF_NOT_NONE:
1068        case POP_JUMP_FORWARD_IF_FALSE:
1069        case POP_JUMP_BACKWARD_IF_FALSE:
1070        case POP_JUMP_IF_FALSE:
1071        case POP_JUMP_FORWARD_IF_TRUE:
1072        case POP_JUMP_BACKWARD_IF_TRUE:
1073        case POP_JUMP_IF_TRUE:
1074            return -1;
1075
1076        case LOAD_GLOBAL:
1077            return (oparg & 1) + 1;
1078
1079        /* Exception handling pseudo-instructions */
1080        case SETUP_FINALLY:
1081            /* 0 in the normal flow.
1082             * Restore the stack position and push 1 value before jumping to
1083             * the handler if an exception be raised. */
1084            return jump ? 1 : 0;
1085        case SETUP_CLEANUP:
1086            /* As SETUP_FINALLY, but pushes lasti as well */
1087            return jump ? 2 : 0;
1088        case SETUP_WITH:
1089            /* 0 in the normal flow.
1090             * Restore the stack position to the position before the result
1091             * of __(a)enter__ and push 2 values before jumping to the handler
1092             * if an exception be raised. */
1093            return jump ? 1 : 0;
1094
1095        case PREP_RERAISE_STAR:
1096             return -1;
1097        case RERAISE:
1098            return -1;
1099        case PUSH_EXC_INFO:
1100            return 1;
1101
1102        case WITH_EXCEPT_START:
1103            return 1;
1104
1105        case LOAD_FAST:
1106            return 1;
1107        case STORE_FAST:
1108            return -1;
1109        case DELETE_FAST:
1110            return 0;
1111
1112        case RETURN_GENERATOR:
1113            return 0;
1114
1115        case RAISE_VARARGS:
1116            return -oparg;
1117
1118        /* Functions and calls */
1119        case PRECALL:
1120            return -oparg;
1121        case KW_NAMES:
1122            return 0;
1123        case CALL:
1124            return -1;
1125
1126        case CALL_FUNCTION_EX:
1127            return -2 - ((oparg & 0x01) != 0);
1128        case MAKE_FUNCTION:
1129            return 0 - ((oparg & 0x01) != 0) - ((oparg & 0x02) != 0) -
1130                ((oparg & 0x04) != 0) - ((oparg & 0x08) != 0);
1131        case BUILD_SLICE:
1132            if (oparg == 3)
1133                return -2;
1134            else
1135                return -1;
1136
1137        /* Closures */
1138        case MAKE_CELL:
1139        case COPY_FREE_VARS:
1140            return 0;
1141        case LOAD_CLOSURE:
1142            return 1;
1143        case LOAD_DEREF:
1144        case LOAD_CLASSDEREF:
1145            return 1;
1146        case STORE_DEREF:
1147            return -1;
1148        case DELETE_DEREF:
1149            return 0;
1150
1151        /* Iterators and generators */
1152        case GET_AWAITABLE:
1153            return 0;
1154
1155        case BEFORE_ASYNC_WITH:
1156        case BEFORE_WITH:
1157            return 1;
1158        case GET_AITER:
1159            return 0;
1160        case GET_ANEXT:
1161            return 1;
1162        case GET_YIELD_FROM_ITER:
1163            return 0;
1164        case END_ASYNC_FOR:
1165            return -2;
1166        case FORMAT_VALUE:
1167            /* If there's a fmt_spec on the stack, we go from 2->1,
1168               else 1->1. */
1169            return (oparg & FVS_MASK) == FVS_HAVE_SPEC ? -1 : 0;
1170        case LOAD_METHOD:
1171            return 1;
1172        case LOAD_ASSERTION_ERROR:
1173            return 1;
1174        case LIST_TO_TUPLE:
1175            return 0;
1176        case LIST_EXTEND:
1177        case SET_UPDATE:
1178        case DICT_MERGE:
1179        case DICT_UPDATE:
1180            return -1;
1181        case MATCH_CLASS:
1182            return -2;
1183        case GET_LEN:
1184        case MATCH_MAPPING:
1185        case MATCH_SEQUENCE:
1186        case MATCH_KEYS:
1187            return 1;
1188        case COPY:
1189        case PUSH_NULL:
1190            return 1;
1191        case BINARY_OP:
1192            return -1;
1193        default:
1194            return PY_INVALID_STACK_EFFECT;
1195    }
1196    return PY_INVALID_STACK_EFFECT; /* not reachable */
1197}
1198
1199int
1200PyCompile_OpcodeStackEffectWithJump(int opcode, int oparg, int jump)
1201{
1202    return stack_effect(opcode, oparg, jump);
1203}
1204
1205int
1206PyCompile_OpcodeStackEffect(int opcode, int oparg)
1207{
1208    return stack_effect(opcode, oparg, -1);
1209}
1210
1211static int is_end_of_basic_block(struct instr *instr)
1212{
1213    int opcode = instr->i_opcode;
1214
1215    return is_jump(instr) ||
1216        opcode == RETURN_VALUE ||
1217        opcode == RAISE_VARARGS ||
1218        opcode == RERAISE;
1219}
1220
1221static int
1222compiler_use_new_implicit_block_if_needed(struct compiler *c)
1223{
1224    if (c->u->u_need_new_implicit_block) {
1225        basicblock *b = compiler_new_block(c);
1226        if (b == NULL) {
1227            return -1;
1228        }
1229        compiler_use_next_block(c, b);
1230    }
1231    return 0;
1232}
1233
1234static void
1235compiler_check_if_end_of_block(struct compiler *c, struct instr *instr)
1236{
1237    if (is_end_of_basic_block(instr)) {
1238        c->u->u_need_new_implicit_block = 1;
1239    }
1240}
1241
1242/* Add an opcode with no argument.
1243   Returns 0 on failure, 1 on success.
1244*/
1245
1246static int
1247compiler_addop_line(struct compiler *c, int opcode, int line,
1248                    int end_line, int col_offset, int end_col_offset)
1249{
1250    assert(IS_WITHIN_OPCODE_RANGE(opcode));
1251    assert(!IS_ASSEMBLER_OPCODE(opcode));
1252    assert(!HAS_ARG(opcode) || IS_ARTIFICIAL(opcode));
1253
1254    if (compiler_use_new_implicit_block_if_needed(c) < 0) {
1255        return -1;
1256    }
1257
1258    basicblock *b = c->u->u_curblock;
1259    int off = compiler_next_instr(b);
1260    if (off < 0) {
1261        return 0;
1262    }
1263    struct instr *i = &b->b_instr[off];
1264    i->i_opcode = opcode;
1265    i->i_oparg = 0;
1266    if (opcode == RETURN_VALUE) {
1267        b->b_return = 1;
1268    }
1269    i->i_lineno = line;
1270    i->i_end_lineno = end_line;
1271    i->i_col_offset = col_offset;
1272    i->i_end_col_offset = end_col_offset;
1273
1274    compiler_check_if_end_of_block(c, i);
1275    return 1;
1276}
1277
1278static int
1279compiler_addop(struct compiler *c, int opcode)
1280{
1281    return compiler_addop_line(c, opcode, c->u->u_lineno, c->u->u_end_lineno,
1282                               c->u->u_col_offset, c->u->u_end_col_offset);
1283}
1284
1285static int
1286compiler_addop_noline(struct compiler *c, int opcode)
1287{
1288    return compiler_addop_line(c, opcode, -1, 0, 0, 0);
1289}
1290
1291
1292static Py_ssize_t
1293compiler_add_o(PyObject *dict, PyObject *o)
1294{
1295    PyObject *v;
1296    Py_ssize_t arg;
1297
1298    v = PyDict_GetItemWithError(dict, o);
1299    if (!v) {
1300        if (PyErr_Occurred()) {
1301            return -1;
1302        }
1303        arg = PyDict_GET_SIZE(dict);
1304        v = PyLong_FromSsize_t(arg);
1305        if (!v) {
1306            return -1;
1307        }
1308        if (PyDict_SetItem(dict, o, v) < 0) {
1309            Py_DECREF(v);
1310            return -1;
1311        }
1312        Py_DECREF(v);
1313    }
1314    else
1315        arg = PyLong_AsLong(v);
1316    return arg;
1317}
1318
1319// Merge const *o* recursively and return constant key object.
1320static PyObject*
1321merge_consts_recursive(struct compiler *c, PyObject *o)
1322{
1323    // None and Ellipsis are singleton, and key is the singleton.
1324    // No need to merge object and key.
1325    if (o == Py_None || o == Py_Ellipsis) {
1326        Py_INCREF(o);
1327        return o;
1328    }
1329
1330    PyObject *key = _PyCode_ConstantKey(o);
1331    if (key == NULL) {
1332        return NULL;
1333    }
1334
1335    // t is borrowed reference
1336    PyObject *t = PyDict_SetDefault(c->c_const_cache, key, key);
1337    if (t != key) {
1338        // o is registered in c_const_cache.  Just use it.
1339        Py_XINCREF(t);
1340        Py_DECREF(key);
1341        return t;
1342    }
1343
1344    // We registered o in c_const_cache.
1345    // When o is a tuple or frozenset, we want to merge its
1346    // items too.
1347    if (PyTuple_CheckExact(o)) {
1348        Py_ssize_t len = PyTuple_GET_SIZE(o);
1349        for (Py_ssize_t i = 0; i < len; i++) {
1350            PyObject *item = PyTuple_GET_ITEM(o, i);
1351            PyObject *u = merge_consts_recursive(c, item);
1352            if (u == NULL) {
1353                Py_DECREF(key);
1354                return NULL;
1355            }
1356
1357            // See _PyCode_ConstantKey()
1358            PyObject *v;  // borrowed
1359            if (PyTuple_CheckExact(u)) {
1360                v = PyTuple_GET_ITEM(u, 1);
1361            }
1362            else {
1363                v = u;
1364            }
1365            if (v != item) {
1366                Py_INCREF(v);
1367                PyTuple_SET_ITEM(o, i, v);
1368                Py_DECREF(item);
1369            }
1370
1371            Py_DECREF(u);
1372        }
1373    }
1374    else if (PyFrozenSet_CheckExact(o)) {
1375        // *key* is tuple. And its first item is frozenset of
1376        // constant keys.
1377        // See _PyCode_ConstantKey() for detail.
1378        assert(PyTuple_CheckExact(key));
1379        assert(PyTuple_GET_SIZE(key) == 2);
1380
1381        Py_ssize_t len = PySet_GET_SIZE(o);
1382        if (len == 0) {  // empty frozenset should not be re-created.
1383            return key;
1384        }
1385        PyObject *tuple = PyTuple_New(len);
1386        if (tuple == NULL) {
1387            Py_DECREF(key);
1388            return NULL;
1389        }
1390        Py_ssize_t i = 0, pos = 0;
1391        PyObject *item;
1392        Py_hash_t hash;
1393        while (_PySet_NextEntry(o, &pos, &item, &hash)) {
1394            PyObject *k = merge_consts_recursive(c, item);
1395            if (k == NULL) {
1396                Py_DECREF(tuple);
1397                Py_DECREF(key);
1398                return NULL;
1399            }
1400            PyObject *u;
1401            if (PyTuple_CheckExact(k)) {
1402                u = PyTuple_GET_ITEM(k, 1);
1403                Py_INCREF(u);
1404                Py_DECREF(k);
1405            }
1406            else {
1407                u = k;
1408            }
1409            PyTuple_SET_ITEM(tuple, i, u);  // Steals reference of u.
1410            i++;
1411        }
1412
1413        // Instead of rewriting o, we create new frozenset and embed in the
1414        // key tuple.  Caller should get merged frozenset from the key tuple.
1415        PyObject *new = PyFrozenSet_New(tuple);
1416        Py_DECREF(tuple);
1417        if (new == NULL) {
1418            Py_DECREF(key);
1419            return NULL;
1420        }
1421        assert(PyTuple_GET_ITEM(key, 1) == o);
1422        Py_DECREF(o);
1423        PyTuple_SET_ITEM(key, 1, new);
1424    }
1425
1426    return key;
1427}
1428
1429static Py_ssize_t
1430compiler_add_const(struct compiler *c, PyObject *o)
1431{
1432    PyObject *key = merge_consts_recursive(c, o);
1433    if (key == NULL) {
1434        return -1;
1435    }
1436
1437    Py_ssize_t arg = compiler_add_o(c->u->u_consts, key);
1438    Py_DECREF(key);
1439    return arg;
1440}
1441
1442static int
1443compiler_addop_load_const(struct compiler *c, PyObject *o)
1444{
1445    Py_ssize_t arg = compiler_add_const(c, o);
1446    if (arg < 0)
1447        return 0;
1448    return compiler_addop_i(c, LOAD_CONST, arg);
1449}
1450
1451static int
1452compiler_addop_o(struct compiler *c, int opcode, PyObject *dict,
1453                     PyObject *o)
1454{
1455    Py_ssize_t arg = compiler_add_o(dict, o);
1456    if (arg < 0)
1457        return 0;
1458    return compiler_addop_i(c, opcode, arg);
1459}
1460
1461static int
1462compiler_addop_name(struct compiler *c, int opcode, PyObject *dict,
1463                    PyObject *o)
1464{
1465    Py_ssize_t arg;
1466
1467    PyObject *mangled = _Py_Mangle(c->u->u_private, o);
1468    if (!mangled)
1469        return 0;
1470    arg = compiler_add_o(dict, mangled);
1471    Py_DECREF(mangled);
1472    if (arg < 0)
1473        return 0;
1474    return compiler_addop_i(c, opcode, arg);
1475}
1476
1477/* Add an opcode with an integer argument.
1478   Returns 0 on failure, 1 on success.
1479*/
1480
1481static int
1482compiler_addop_i_line(struct compiler *c, int opcode, Py_ssize_t oparg,
1483                      int lineno, int end_lineno,
1484                      int col_offset, int end_col_offset)
1485{
1486    /* oparg value is unsigned, but a signed C int is usually used to store
1487       it in the C code (like Python/ceval.c).
1488
1489       Limit to 32-bit signed C int (rather than INT_MAX) for portability.
1490
1491       The argument of a concrete bytecode instruction is limited to 8-bit.
1492       EXTENDED_ARG is used for 16, 24, and 32-bit arguments. */
1493
1494    assert(IS_WITHIN_OPCODE_RANGE(opcode));
1495    assert(!IS_ASSEMBLER_OPCODE(opcode));
1496    assert(HAS_ARG(opcode));
1497    assert(0 <= oparg && oparg <= 2147483647);
1498
1499    if (compiler_use_new_implicit_block_if_needed(c) < 0) {
1500        return -1;
1501    }
1502
1503    basicblock *b = c->u->u_curblock;
1504    int off = compiler_next_instr(b);
1505    if (off < 0) {
1506        return 0;
1507    }
1508    struct instr *i = &b->b_instr[off];
1509    i->i_opcode = opcode;
1510    i->i_oparg = Py_SAFE_DOWNCAST(oparg, Py_ssize_t, int);
1511    i->i_lineno = lineno;
1512    i->i_end_lineno = end_lineno;
1513    i->i_col_offset = col_offset;
1514    i->i_end_col_offset = end_col_offset;
1515
1516    compiler_check_if_end_of_block(c, i);
1517    return 1;
1518}
1519
1520static int
1521compiler_addop_i(struct compiler *c, int opcode, Py_ssize_t oparg)
1522{
1523    return compiler_addop_i_line(c, opcode, oparg,
1524                                 c->u->u_lineno, c->u->u_end_lineno,
1525                                 c->u->u_col_offset, c->u->u_end_col_offset);
1526}
1527
1528static int
1529compiler_addop_i_noline(struct compiler *c, int opcode, Py_ssize_t oparg)
1530{
1531    return compiler_addop_i_line(c, opcode, oparg, -1, 0, 0, 0);
1532}
1533
1534static int add_jump_to_block(struct compiler *c, int opcode,
1535                             int lineno, int end_lineno,
1536                             int col_offset, int end_col_offset,
1537                             basicblock *target)
1538{
1539    assert(IS_WITHIN_OPCODE_RANGE(opcode));
1540    assert(!IS_ASSEMBLER_OPCODE(opcode));
1541    assert(HAS_ARG(opcode) || IS_VIRTUAL_OPCODE(opcode));
1542    assert(target != NULL);
1543
1544    if (compiler_use_new_implicit_block_if_needed(c) < 0) {
1545        return -1;
1546    }
1547
1548    basicblock *b = c->u->u_curblock;
1549    int off = compiler_next_instr(b);
1550    struct instr *i = &b->b_instr[off];
1551    if (off < 0) {
1552        return 0;
1553    }
1554    i->i_opcode = opcode;
1555    i->i_target = target;
1556    i->i_lineno = lineno;
1557    i->i_end_lineno = end_lineno;
1558    i->i_col_offset = col_offset;
1559    i->i_end_col_offset = end_col_offset;
1560
1561    compiler_check_if_end_of_block(c, i);
1562    return 1;
1563}
1564
1565static int
1566compiler_addop_j(struct compiler *c, int opcode, basicblock *b)
1567{
1568    return add_jump_to_block(c, opcode, c->u->u_lineno,
1569                             c->u->u_end_lineno, c->u->u_col_offset,
1570                             c->u->u_end_col_offset, b);
1571}
1572
1573static int
1574compiler_addop_j_noline(struct compiler *c, int opcode, basicblock *b)
1575{
1576    return add_jump_to_block(c, opcode, -1, 0, 0, 0, b);
1577}
1578
1579#define ADDOP(C, OP) { \
1580    if (!compiler_addop((C), (OP))) \
1581        return 0; \
1582}
1583
1584#define ADDOP_NOLINE(C, OP) { \
1585    if (!compiler_addop_noline((C), (OP))) \
1586        return 0; \
1587}
1588
1589#define ADDOP_IN_SCOPE(C, OP) { \
1590    if (!compiler_addop((C), (OP))) { \
1591        compiler_exit_scope(c); \
1592        return 0; \
1593    } \
1594}
1595
1596#define ADDOP_LOAD_CONST(C, O) { \
1597    if (!compiler_addop_load_const((C), (O))) \
1598        return 0; \
1599}
1600
1601/* Same as ADDOP_LOAD_CONST, but steals a reference. */
1602#define ADDOP_LOAD_CONST_NEW(C, O) { \
1603    PyObject *__new_const = (O); \
1604    if (__new_const == NULL) { \
1605        return 0; \
1606    } \
1607    if (!compiler_addop_load_const((C), __new_const)) { \
1608        Py_DECREF(__new_const); \
1609        return 0; \
1610    } \
1611    Py_DECREF(__new_const); \
1612}
1613
1614#define ADDOP_N(C, OP, O, TYPE) { \
1615    assert(!HAS_CONST(OP)); /* use ADDOP_LOAD_CONST_NEW */ \
1616    if (!compiler_addop_o((C), (OP), (C)->u->u_ ## TYPE, (O))) { \
1617        Py_DECREF((O)); \
1618        return 0; \
1619    } \
1620    Py_DECREF((O)); \
1621}
1622
1623#define ADDOP_NAME(C, OP, O, TYPE) { \
1624    if (!compiler_addop_name((C), (OP), (C)->u->u_ ## TYPE, (O))) \
1625        return 0; \
1626}
1627
1628#define ADDOP_I(C, OP, O) { \
1629    if (!compiler_addop_i((C), (OP), (O))) \
1630        return 0; \
1631}
1632
1633#define ADDOP_I_NOLINE(C, OP, O) { \
1634    if (!compiler_addop_i_noline((C), (OP), (O))) \
1635        return 0; \
1636}
1637
1638#define ADDOP_JUMP(C, OP, O) { \
1639    if (!compiler_addop_j((C), (OP), (O))) \
1640        return 0; \
1641}
1642
1643/* Add a jump with no line number.
1644 * Used for artificial jumps that have no corresponding
1645 * token in the source code. */
1646#define ADDOP_JUMP_NOLINE(C, OP, O) { \
1647    if (!compiler_addop_j_noline((C), (OP), (O))) \
1648        return 0; \
1649}
1650
1651#define ADDOP_COMPARE(C, CMP) { \
1652    if (!compiler_addcompare((C), (cmpop_ty)(CMP))) \
1653        return 0; \
1654}
1655
1656#define ADDOP_BINARY(C, BINOP) \
1657    RETURN_IF_FALSE(addop_binary((C), (BINOP), false))
1658
1659#define ADDOP_INPLACE(C, BINOP) \
1660    RETURN_IF_FALSE(addop_binary((C), (BINOP), true))
1661
1662/* VISIT and VISIT_SEQ takes an ASDL type as their second argument.  They use
1663   the ASDL name to synthesize the name of the C type and the visit function.
1664*/
1665
1666#define ADD_YIELD_FROM(C, await) \
1667    RETURN_IF_FALSE(compiler_add_yield_from((C), (await)))
1668
1669#define POP_EXCEPT_AND_RERAISE(C) \
1670    RETURN_IF_FALSE(compiler_pop_except_and_reraise((C)))
1671
1672#define ADDOP_YIELD(C) \
1673    RETURN_IF_FALSE(addop_yield(C))
1674
1675#define VISIT(C, TYPE, V) {\
1676    if (!compiler_visit_ ## TYPE((C), (V))) \
1677        return 0; \
1678}
1679
1680#define VISIT_IN_SCOPE(C, TYPE, V) {\
1681    if (!compiler_visit_ ## TYPE((C), (V))) { \
1682        compiler_exit_scope(c); \
1683        return 0; \
1684    } \
1685}
1686
1687#define VISIT_SEQ(C, TYPE, SEQ) { \
1688    int _i; \
1689    asdl_ ## TYPE ## _seq *seq = (SEQ); /* avoid variable capture */ \
1690    for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \
1691        TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \
1692        if (!compiler_visit_ ## TYPE((C), elt)) \
1693            return 0; \
1694    } \
1695}
1696
1697#define VISIT_SEQ_IN_SCOPE(C, TYPE, SEQ) { \
1698    int _i; \
1699    asdl_ ## TYPE ## _seq *seq = (SEQ); /* avoid variable capture */ \
1700    for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \
1701        TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \
1702        if (!compiler_visit_ ## TYPE((C), elt)) { \
1703            compiler_exit_scope(c); \
1704            return 0; \
1705        } \
1706    } \
1707}
1708
1709#define RETURN_IF_FALSE(X)  \
1710    if (!(X)) {             \
1711        return 0;           \
1712    }
1713
1714static int
1715compiler_enter_scope(struct compiler *c, identifier name,
1716                     int scope_type, void *key, int lineno)
1717{
1718    struct compiler_unit *u;
1719    basicblock *block;
1720
1721    u = (struct compiler_unit *)PyObject_Calloc(1, sizeof(
1722                                            struct compiler_unit));
1723    if (!u) {
1724        PyErr_NoMemory();
1725        return 0;
1726    }
1727    u->u_scope_type = scope_type;
1728    u->u_argcount = 0;
1729    u->u_posonlyargcount = 0;
1730    u->u_kwonlyargcount = 0;
1731    u->u_ste = PySymtable_Lookup(c->c_st, key);
1732    if (!u->u_ste) {
1733        compiler_unit_free(u);
1734        return 0;
1735    }
1736    Py_INCREF(name);
1737    u->u_name = name;
1738    u->u_varnames = list2dict(u->u_ste->ste_varnames);
1739    u->u_cellvars = dictbytype(u->u_ste->ste_symbols, CELL, 0, 0);
1740    if (!u->u_varnames || !u->u_cellvars) {
1741        compiler_unit_free(u);
1742        return 0;
1743    }
1744    if (u->u_ste->ste_needs_class_closure) {
1745        /* Cook up an implicit __class__ cell. */
1746        int res;
1747        assert(u->u_scope_type == COMPILER_SCOPE_CLASS);
1748        assert(PyDict_GET_SIZE(u->u_cellvars) == 0);
1749        res = PyDict_SetItem(u->u_cellvars, &_Py_ID(__class__),
1750                             _PyLong_GetZero());
1751        if (res < 0) {
1752            compiler_unit_free(u);
1753            return 0;
1754        }
1755    }
1756
1757    u->u_freevars = dictbytype(u->u_ste->ste_symbols, FREE, DEF_FREE_CLASS,
1758                               PyDict_GET_SIZE(u->u_cellvars));
1759    if (!u->u_freevars) {
1760        compiler_unit_free(u);
1761        return 0;
1762    }
1763
1764    u->u_blocks = NULL;
1765    u->u_nfblocks = 0;
1766    u->u_firstlineno = lineno;
1767    u->u_lineno = lineno;
1768    u->u_col_offset = 0;
1769    u->u_end_lineno = lineno;
1770    u->u_end_col_offset = 0;
1771    u->u_consts = PyDict_New();
1772    if (!u->u_consts) {
1773        compiler_unit_free(u);
1774        return 0;
1775    }
1776    u->u_names = PyDict_New();
1777    if (!u->u_names) {
1778        compiler_unit_free(u);
1779        return 0;
1780    }
1781
1782    u->u_private = NULL;
1783
1784    /* Push the old compiler_unit on the stack. */
1785    if (c->u) {
1786        PyObject *capsule = PyCapsule_New(c->u, CAPSULE_NAME, NULL);
1787        if (!capsule || PyList_Append(c->c_stack, capsule) < 0) {
1788            Py_XDECREF(capsule);
1789            compiler_unit_free(u);
1790            return 0;
1791        }
1792        Py_DECREF(capsule);
1793        u->u_private = c->u->u_private;
1794        Py_XINCREF(u->u_private);
1795    }
1796    c->u = u;
1797
1798    c->c_nestlevel++;
1799
1800    block = compiler_new_block(c);
1801    if (block == NULL)
1802        return 0;
1803    c->u->u_curblock = block;
1804
1805    if (u->u_scope_type == COMPILER_SCOPE_MODULE) {
1806        c->u->u_lineno = 0;
1807    }
1808    else {
1809        if (!compiler_set_qualname(c))
1810            return 0;
1811    }
1812    ADDOP_I(c, RESUME, 0);
1813
1814    if (u->u_scope_type == COMPILER_SCOPE_MODULE) {
1815        c->u->u_lineno = -1;
1816    }
1817    return 1;
1818}
1819
1820static void
1821compiler_exit_scope(struct compiler *c)
1822{
1823    // Don't call PySequence_DelItem() with an exception raised
1824    PyObject *exc_type, *exc_val, *exc_tb;
1825    PyErr_Fetch(&exc_type, &exc_val, &exc_tb);
1826
1827    c->c_nestlevel--;
1828    compiler_unit_free(c->u);
1829    /* Restore c->u to the parent unit. */
1830    Py_ssize_t n = PyList_GET_SIZE(c->c_stack) - 1;
1831    if (n >= 0) {
1832        PyObject *capsule = PyList_GET_ITEM(c->c_stack, n);
1833        c->u = (struct compiler_unit *)PyCapsule_GetPointer(capsule, CAPSULE_NAME);
1834        assert(c->u);
1835        /* we are deleting from a list so this really shouldn't fail */
1836        if (PySequence_DelItem(c->c_stack, n) < 0) {
1837            _PyErr_WriteUnraisableMsg("on removing the last compiler "
1838                                      "stack item", NULL);
1839        }
1840        compiler_unit_check(c->u);
1841    }
1842    else {
1843        c->u = NULL;
1844    }
1845
1846    PyErr_Restore(exc_type, exc_val, exc_tb);
1847}
1848
1849/* Search if variable annotations are present statically in a block. */
1850
1851static int
1852find_ann(asdl_stmt_seq *stmts)
1853{
1854    int i, j, res = 0;
1855    stmt_ty st;
1856
1857    for (i = 0; i < asdl_seq_LEN(stmts); i++) {
1858        st = (stmt_ty)asdl_seq_GET(stmts, i);
1859        switch (st->kind) {
1860        case AnnAssign_kind:
1861            return 1;
1862        case For_kind:
1863            res = find_ann(st->v.For.body) ||
1864                  find_ann(st->v.For.orelse);
1865            break;
1866        case AsyncFor_kind:
1867            res = find_ann(st->v.AsyncFor.body) ||
1868                  find_ann(st->v.AsyncFor.orelse);
1869            break;
1870        case While_kind:
1871            res = find_ann(st->v.While.body) ||
1872                  find_ann(st->v.While.orelse);
1873            break;
1874        case If_kind:
1875            res = find_ann(st->v.If.body) ||
1876                  find_ann(st->v.If.orelse);
1877            break;
1878        case With_kind:
1879            res = find_ann(st->v.With.body);
1880            break;
1881        case AsyncWith_kind:
1882            res = find_ann(st->v.AsyncWith.body);
1883            break;
1884        case Try_kind:
1885            for (j = 0; j < asdl_seq_LEN(st->v.Try.handlers); j++) {
1886                excepthandler_ty handler = (excepthandler_ty)asdl_seq_GET(
1887                    st->v.Try.handlers, j);
1888                if (find_ann(handler->v.ExceptHandler.body)) {
1889                    return 1;
1890                }
1891            }
1892            res = find_ann(st->v.Try.body) ||
1893                  find_ann(st->v.Try.finalbody) ||
1894                  find_ann(st->v.Try.orelse);
1895            break;
1896        case TryStar_kind:
1897            for (j = 0; j < asdl_seq_LEN(st->v.TryStar.handlers); j++) {
1898                excepthandler_ty handler = (excepthandler_ty)asdl_seq_GET(
1899                    st->v.TryStar.handlers, j);
1900                if (find_ann(handler->v.ExceptHandler.body)) {
1901                    return 1;
1902                }
1903            }
1904            res = find_ann(st->v.TryStar.body) ||
1905                  find_ann(st->v.TryStar.finalbody) ||
1906                  find_ann(st->v.TryStar.orelse);
1907            break;
1908        case Match_kind:
1909            for (j = 0; j < asdl_seq_LEN(st->v.Match.cases); j++) {
1910                match_case_ty match_case = (match_case_ty)asdl_seq_GET(
1911                    st->v.Match.cases, j);
1912                if (find_ann(match_case->body)) {
1913                    return true;
1914                }
1915            }
1916            break;
1917        default:
1918            res = 0;
1919        }
1920        if (res) {
1921            break;
1922        }
1923    }
1924    return res;
1925}
1926
1927/*
1928 * Frame block handling functions
1929 */
1930
1931static int
1932compiler_push_fblock(struct compiler *c, enum fblocktype t, basicblock *b,
1933                     basicblock *exit, void *datum)
1934{
1935    struct fblockinfo *f;
1936    if (c->u->u_nfblocks >= CO_MAXBLOCKS) {
1937        return compiler_error(c, "too many statically nested blocks");
1938    }
1939    f = &c->u->u_fblock[c->u->u_nfblocks++];
1940    f->fb_type = t;
1941    f->fb_block = b;
1942    f->fb_exit = exit;
1943    f->fb_datum = datum;
1944    return 1;
1945}
1946
1947static void
1948compiler_pop_fblock(struct compiler *c, enum fblocktype t, basicblock *b)
1949{
1950    struct compiler_unit *u = c->u;
1951    assert(u->u_nfblocks > 0);
1952    u->u_nfblocks--;
1953    assert(u->u_fblock[u->u_nfblocks].fb_type == t);
1954    assert(u->u_fblock[u->u_nfblocks].fb_block == b);
1955}
1956
1957static int
1958compiler_call_exit_with_nones(struct compiler *c) {
1959    ADDOP_LOAD_CONST(c, Py_None);
1960    ADDOP_LOAD_CONST(c, Py_None);
1961    ADDOP_LOAD_CONST(c, Py_None);
1962    ADDOP_I(c, PRECALL, 2);
1963    ADDOP_I(c, CALL, 2);
1964    return 1;
1965}
1966
1967static int
1968compiler_add_yield_from(struct compiler *c, int await)
1969{
1970    basicblock *start, *resume, *exit;
1971    start = compiler_new_block(c);
1972    resume = compiler_new_block(c);
1973    exit = compiler_new_block(c);
1974    if (start == NULL || resume == NULL || exit == NULL) {
1975        return 0;
1976    }
1977    compiler_use_next_block(c, start);
1978    ADDOP_JUMP(c, SEND, exit);
1979    compiler_use_next_block(c, resume);
1980    ADDOP(c, YIELD_VALUE);
1981    ADDOP_I(c, RESUME, await ? 3 : 2);
1982    ADDOP_JUMP(c, JUMP_NO_INTERRUPT, start);
1983    compiler_use_next_block(c, exit);
1984    return 1;
1985}
1986
1987static int
1988compiler_pop_except_and_reraise(struct compiler *c)
1989{
1990    /* Stack contents
1991     * [exc_info, lasti, exc]            COPY        3
1992     * [exc_info, lasti, exc, exc_info]  POP_EXCEPT
1993     * [exc_info, lasti, exc]            RERAISE      1
1994     * (exception_unwind clears the stack)
1995     */
1996
1997    ADDOP_I(c, COPY, 3);
1998    ADDOP(c, POP_EXCEPT);
1999    ADDOP_I(c, RERAISE, 1);
2000    return 1;
2001}
2002
2003/* Unwind a frame block.  If preserve_tos is true, the TOS before
2004 * popping the blocks will be restored afterwards, unless another
2005 * return, break or continue is found. In which case, the TOS will
2006 * be popped.
2007 */
2008static int
2009compiler_unwind_fblock(struct compiler *c, struct fblockinfo *info,
2010                       int preserve_tos)
2011{
2012    switch (info->fb_type) {
2013        case WHILE_LOOP:
2014        case EXCEPTION_HANDLER:
2015        case EXCEPTION_GROUP_HANDLER:
2016        case ASYNC_COMPREHENSION_GENERATOR:
2017            return 1;
2018
2019        case FOR_LOOP:
2020            /* Pop the iterator */
2021            if (preserve_tos) {
2022                ADDOP_I(c, SWAP, 2);
2023            }
2024            ADDOP(c, POP_TOP);
2025            return 1;
2026
2027        case TRY_EXCEPT:
2028            ADDOP(c, POP_BLOCK);
2029            return 1;
2030
2031        case FINALLY_TRY:
2032            /* This POP_BLOCK gets the line number of the unwinding statement */
2033            ADDOP(c, POP_BLOCK);
2034            if (preserve_tos) {
2035                if (!compiler_push_fblock(c, POP_VALUE, NULL, NULL, NULL)) {
2036                    return 0;
2037                }
2038            }
2039            /* Emit the finally block */
2040            VISIT_SEQ(c, stmt, info->fb_datum);
2041            if (preserve_tos) {
2042                compiler_pop_fblock(c, POP_VALUE, NULL);
2043            }
2044            /* The finally block should appear to execute after the
2045             * statement causing the unwinding, so make the unwinding
2046             * instruction artificial */
2047            UNSET_LOC(c);
2048            return 1;
2049
2050        case FINALLY_END:
2051            if (preserve_tos) {
2052                ADDOP_I(c, SWAP, 2);
2053            }
2054            ADDOP(c, POP_TOP); /* exc_value */
2055            if (preserve_tos) {
2056                ADDOP_I(c, SWAP, 2);
2057            }
2058            ADDOP(c, POP_BLOCK);
2059            ADDOP(c, POP_EXCEPT);
2060            return 1;
2061
2062        case WITH:
2063        case ASYNC_WITH:
2064            SET_LOC(c, (stmt_ty)info->fb_datum);
2065            ADDOP(c, POP_BLOCK);
2066            if (preserve_tos) {
2067                ADDOP_I(c, SWAP, 2);
2068            }
2069            if(!compiler_call_exit_with_nones(c)) {
2070                return 0;
2071            }
2072            if (info->fb_type == ASYNC_WITH) {
2073                ADDOP_I(c, GET_AWAITABLE, 2);
2074                ADDOP_LOAD_CONST(c, Py_None);
2075                ADD_YIELD_FROM(c, 1);
2076            }
2077            ADDOP(c, POP_TOP);
2078            /* The exit block should appear to execute after the
2079             * statement causing the unwinding, so make the unwinding
2080             * instruction artificial */
2081            UNSET_LOC(c);
2082            return 1;
2083
2084        case HANDLER_CLEANUP:
2085            if (info->fb_datum) {
2086                ADDOP(c, POP_BLOCK);
2087            }
2088            if (preserve_tos) {
2089                ADDOP_I(c, SWAP, 2);
2090            }
2091            ADDOP(c, POP_BLOCK);
2092            ADDOP(c, POP_EXCEPT);
2093            if (info->fb_datum) {
2094                ADDOP_LOAD_CONST(c, Py_None);
2095                compiler_nameop(c, info->fb_datum, Store);
2096                compiler_nameop(c, info->fb_datum, Del);
2097            }
2098            return 1;
2099
2100        case POP_VALUE:
2101            if (preserve_tos) {
2102                ADDOP_I(c, SWAP, 2);
2103            }
2104            ADDOP(c, POP_TOP);
2105            return 1;
2106    }
2107    Py_UNREACHABLE();
2108}
2109
2110/** Unwind block stack. If loop is not NULL, then stop when the first loop is encountered. */
2111static int
2112compiler_unwind_fblock_stack(struct compiler *c, int preserve_tos, struct fblockinfo **loop) {
2113    if (c->u->u_nfblocks == 0) {
2114        return 1;
2115    }
2116    struct fblockinfo *top = &c->u->u_fblock[c->u->u_nfblocks-1];
2117    if (top->fb_type == EXCEPTION_GROUP_HANDLER) {
2118        return compiler_error(
2119            c, "'break', 'continue' and 'return' cannot appear in an except* block");
2120    }
2121    if (loop != NULL && (top->fb_type == WHILE_LOOP || top->fb_type == FOR_LOOP)) {
2122        *loop = top;
2123        return 1;
2124    }
2125    struct fblockinfo copy = *top;
2126    c->u->u_nfblocks--;
2127    if (!compiler_unwind_fblock(c, &copy, preserve_tos)) {
2128        return 0;
2129    }
2130    if (!compiler_unwind_fblock_stack(c, preserve_tos, loop)) {
2131        return 0;
2132    }
2133    c->u->u_fblock[c->u->u_nfblocks] = copy;
2134    c->u->u_nfblocks++;
2135    return 1;
2136}
2137
2138/* Compile a sequence of statements, checking for a docstring
2139   and for annotations. */
2140
2141static int
2142compiler_body(struct compiler *c, asdl_stmt_seq *stmts)
2143{
2144    int i = 0;
2145    stmt_ty st;
2146    PyObject *docstring;
2147
2148    /* Set current line number to the line number of first statement.
2149       This way line number for SETUP_ANNOTATIONS will always
2150       coincide with the line number of first "real" statement in module.
2151       If body is empty, then lineno will be set later in assemble. */
2152    if (c->u->u_scope_type == COMPILER_SCOPE_MODULE && asdl_seq_LEN(stmts)) {
2153        st = (stmt_ty)asdl_seq_GET(stmts, 0);
2154        SET_LOC(c, st);
2155    }
2156    /* Every annotated class and module should have __annotations__. */
2157    if (find_ann(stmts)) {
2158        ADDOP(c, SETUP_ANNOTATIONS);
2159    }
2160    if (!asdl_seq_LEN(stmts))
2161        return 1;
2162    /* if not -OO mode, set docstring */
2163    if (c->c_optimize < 2) {
2164        docstring = _PyAST_GetDocString(stmts);
2165        if (docstring) {
2166            i = 1;
2167            st = (stmt_ty)asdl_seq_GET(stmts, 0);
2168            assert(st->kind == Expr_kind);
2169            VISIT(c, expr, st->v.Expr.value);
2170            UNSET_LOC(c);
2171            if (!compiler_nameop(c, &_Py_ID(__doc__), Store))
2172                return 0;
2173        }
2174    }
2175    for (; i < asdl_seq_LEN(stmts); i++)
2176        VISIT(c, stmt, (stmt_ty)asdl_seq_GET(stmts, i));
2177    return 1;
2178}
2179
2180static PyCodeObject *
2181compiler_mod(struct compiler *c, mod_ty mod)
2182{
2183    PyCodeObject *co;
2184    int addNone = 1;
2185    _Py_DECLARE_STR(anon_module, "<module>");
2186    if (!compiler_enter_scope(c, &_Py_STR(anon_module), COMPILER_SCOPE_MODULE,
2187                              mod, 1)) {
2188        return NULL;
2189    }
2190    c->u->u_lineno = 1;
2191    switch (mod->kind) {
2192    case Module_kind:
2193        if (!compiler_body(c, mod->v.Module.body)) {
2194            compiler_exit_scope(c);
2195            return 0;
2196        }
2197        break;
2198    case Interactive_kind:
2199        if (find_ann(mod->v.Interactive.body)) {
2200            ADDOP(c, SETUP_ANNOTATIONS);
2201        }
2202        c->c_interactive = 1;
2203        VISIT_SEQ_IN_SCOPE(c, stmt, mod->v.Interactive.body);
2204        break;
2205    case Expression_kind:
2206        VISIT_IN_SCOPE(c, expr, mod->v.Expression.body);
2207        addNone = 0;
2208        break;
2209    default:
2210        PyErr_Format(PyExc_SystemError,
2211                     "module kind %d should not be possible",
2212                     mod->kind);
2213        return 0;
2214    }
2215    co = assemble(c, addNone);
2216    compiler_exit_scope(c);
2217    return co;
2218}
2219
2220/* The test for LOCAL must come before the test for FREE in order to
2221   handle classes where name is both local and free.  The local var is
2222   a method and the free var is a free var referenced within a method.
2223*/
2224
2225static int
2226get_ref_type(struct compiler *c, PyObject *name)
2227{
2228    int scope;
2229    if (c->u->u_scope_type == COMPILER_SCOPE_CLASS &&
2230        _PyUnicode_EqualToASCIIString(name, "__class__"))
2231        return CELL;
2232    scope = _PyST_GetScope(c->u->u_ste, name);
2233    if (scope == 0) {
2234        PyErr_Format(PyExc_SystemError,
2235                     "_PyST_GetScope(name=%R) failed: "
2236                     "unknown scope in unit %S (%R); "
2237                     "symbols: %R; locals: %R; globals: %R",
2238                     name,
2239                     c->u->u_name, c->u->u_ste->ste_id,
2240                     c->u->u_ste->ste_symbols, c->u->u_varnames, c->u->u_names);
2241        return -1;
2242    }
2243    return scope;
2244}
2245
2246static int
2247compiler_lookup_arg(PyObject *dict, PyObject *name)
2248{
2249    PyObject *v;
2250    v = PyDict_GetItemWithError(dict, name);
2251    if (v == NULL)
2252        return -1;
2253    return PyLong_AS_LONG(v);
2254}
2255
2256static int
2257compiler_make_closure(struct compiler *c, PyCodeObject *co, Py_ssize_t flags,
2258                      PyObject *qualname)
2259{
2260    if (qualname == NULL)
2261        qualname = co->co_name;
2262
2263    if (co->co_nfreevars) {
2264        int i = co->co_nlocals + co->co_nplaincellvars;
2265        for (; i < co->co_nlocalsplus; ++i) {
2266            /* Bypass com_addop_varname because it will generate
2267               LOAD_DEREF but LOAD_CLOSURE is needed.
2268            */
2269            PyObject *name = PyTuple_GET_ITEM(co->co_localsplusnames, i);
2270
2271            /* Special case: If a class contains a method with a
2272               free variable that has the same name as a method,
2273               the name will be considered free *and* local in the
2274               class.  It should be handled by the closure, as
2275               well as by the normal name lookup logic.
2276            */
2277            int reftype = get_ref_type(c, name);
2278            if (reftype == -1) {
2279                return 0;
2280            }
2281            int arg;
2282            if (reftype == CELL) {
2283                arg = compiler_lookup_arg(c->u->u_cellvars, name);
2284            }
2285            else {
2286                arg = compiler_lookup_arg(c->u->u_freevars, name);
2287            }
2288            if (arg == -1) {
2289                PyObject *freevars = _PyCode_GetFreevars(co);
2290                if (freevars == NULL) {
2291                    PyErr_Clear();
2292                }
2293                PyErr_Format(PyExc_SystemError,
2294                    "compiler_lookup_arg(name=%R) with reftype=%d failed in %S; "
2295                    "freevars of code %S: %R",
2296                    name,
2297                    reftype,
2298                    c->u->u_name,
2299                    co->co_name,
2300                    freevars);
2301                Py_DECREF(freevars);
2302                return 0;
2303            }
2304            ADDOP_I(c, LOAD_CLOSURE, arg);
2305        }
2306        flags |= 0x08;
2307        ADDOP_I(c, BUILD_TUPLE, co->co_nfreevars);
2308    }
2309    ADDOP_LOAD_CONST(c, (PyObject*)co);
2310    ADDOP_I(c, MAKE_FUNCTION, flags);
2311    return 1;
2312}
2313
2314static int
2315compiler_decorators(struct compiler *c, asdl_expr_seq* decos)
2316{
2317    int i;
2318
2319    if (!decos)
2320        return 1;
2321
2322    for (i = 0; i < asdl_seq_LEN(decos); i++) {
2323        VISIT(c, expr, (expr_ty)asdl_seq_GET(decos, i));
2324    }
2325    return 1;
2326}
2327
2328static int
2329compiler_apply_decorators(struct compiler *c, asdl_expr_seq* decos)
2330{
2331    if (!decos)
2332        return 1;
2333
2334    int old_lineno = c->u->u_lineno;
2335    int old_end_lineno = c->u->u_end_lineno;
2336    int old_col_offset = c->u->u_col_offset;
2337    int old_end_col_offset = c->u->u_end_col_offset;
2338    for (Py_ssize_t i = asdl_seq_LEN(decos) - 1; i > -1; i--) {
2339        SET_LOC(c, (expr_ty)asdl_seq_GET(decos, i));
2340        ADDOP_I(c, PRECALL, 0);
2341        ADDOP_I(c, CALL, 0);
2342    }
2343    c->u->u_lineno = old_lineno;
2344    c->u->u_end_lineno = old_end_lineno;
2345    c->u->u_col_offset = old_col_offset;
2346    c->u->u_end_col_offset = old_end_col_offset;
2347    return 1;
2348}
2349
2350static int
2351compiler_visit_kwonlydefaults(struct compiler *c, asdl_arg_seq *kwonlyargs,
2352                              asdl_expr_seq *kw_defaults)
2353{
2354    /* Push a dict of keyword-only default values.
2355
2356       Return 0 on error, -1 if no dict pushed, 1 if a dict is pushed.
2357       */
2358    int i;
2359    PyObject *keys = NULL;
2360
2361    for (i = 0; i < asdl_seq_LEN(kwonlyargs); i++) {
2362        arg_ty arg = asdl_seq_GET(kwonlyargs, i);
2363        expr_ty default_ = asdl_seq_GET(kw_defaults, i);
2364        if (default_) {
2365            PyObject *mangled = _Py_Mangle(c->u->u_private, arg->arg);
2366            if (!mangled) {
2367                goto error;
2368            }
2369            if (keys == NULL) {
2370                keys = PyList_New(1);
2371                if (keys == NULL) {
2372                    Py_DECREF(mangled);
2373                    return 0;
2374                }
2375                PyList_SET_ITEM(keys, 0, mangled);
2376            }
2377            else {
2378                int res = PyList_Append(keys, mangled);
2379                Py_DECREF(mangled);
2380                if (res == -1) {
2381                    goto error;
2382                }
2383            }
2384            if (!compiler_visit_expr(c, default_)) {
2385                goto error;
2386            }
2387        }
2388    }
2389    if (keys != NULL) {
2390        Py_ssize_t default_count = PyList_GET_SIZE(keys);
2391        PyObject *keys_tuple = PyList_AsTuple(keys);
2392        Py_DECREF(keys);
2393        ADDOP_LOAD_CONST_NEW(c, keys_tuple);
2394        ADDOP_I(c, BUILD_CONST_KEY_MAP, default_count);
2395        assert(default_count > 0);
2396        return 1;
2397    }
2398    else {
2399        return -1;
2400    }
2401
2402error:
2403    Py_XDECREF(keys);
2404    return 0;
2405}
2406
2407static int
2408compiler_visit_annexpr(struct compiler *c, expr_ty annotation)
2409{
2410    ADDOP_LOAD_CONST_NEW(c, _PyAST_ExprAsUnicode(annotation));
2411    return 1;
2412}
2413
2414static int
2415compiler_visit_argannotation(struct compiler *c, identifier id,
2416    expr_ty annotation, Py_ssize_t *annotations_len)
2417{
2418    if (!annotation) {
2419        return 1;
2420    }
2421
2422    PyObject *mangled = _Py_Mangle(c->u->u_private, id);
2423    if (!mangled) {
2424        return 0;
2425    }
2426    ADDOP_LOAD_CONST(c, mangled);
2427    Py_DECREF(mangled);
2428
2429    if (c->c_future->ff_features & CO_FUTURE_ANNOTATIONS) {
2430        VISIT(c, annexpr, annotation);
2431    }
2432    else {
2433        if (annotation->kind == Starred_kind) {
2434            // *args: *Ts (where Ts is a TypeVarTuple).
2435            // Do [annotation_value] = [*Ts].
2436            // (Note that in theory we could end up here even for an argument
2437            // other than *args, but in practice the grammar doesn't allow it.)
2438            VISIT(c, expr, annotation->v.Starred.value);
2439            ADDOP_I(c, UNPACK_SEQUENCE, (Py_ssize_t) 1);
2440        }
2441        else {
2442            VISIT(c, expr, annotation);
2443        }
2444    }
2445    *annotations_len += 2;
2446    return 1;
2447}
2448
2449static int
2450compiler_visit_argannotations(struct compiler *c, asdl_arg_seq* args,
2451                              Py_ssize_t *annotations_len)
2452{
2453    int i;
2454    for (i = 0; i < asdl_seq_LEN(args); i++) {
2455        arg_ty arg = (arg_ty)asdl_seq_GET(args, i);
2456        if (!compiler_visit_argannotation(
2457                        c,
2458                        arg->arg,
2459                        arg->annotation,
2460                        annotations_len))
2461            return 0;
2462    }
2463    return 1;
2464}
2465
2466static int
2467compiler_visit_annotations(struct compiler *c, arguments_ty args,
2468                           expr_ty returns)
2469{
2470    /* Push arg annotation names and values.
2471       The expressions are evaluated out-of-order wrt the source code.
2472
2473       Return 0 on error, -1 if no annotations pushed, 1 if a annotations is pushed.
2474       */
2475    Py_ssize_t annotations_len = 0;
2476
2477    if (!compiler_visit_argannotations(c, args->args, &annotations_len))
2478        return 0;
2479    if (!compiler_visit_argannotations(c, args->posonlyargs, &annotations_len))
2480        return 0;
2481    if (args->vararg && args->vararg->annotation &&
2482        !compiler_visit_argannotation(c, args->vararg->arg,
2483                                     args->vararg->annotation, &annotations_len))
2484        return 0;
2485    if (!compiler_visit_argannotations(c, args->kwonlyargs, &annotations_len))
2486        return 0;
2487    if (args->kwarg && args->kwarg->annotation &&
2488        !compiler_visit_argannotation(c, args->kwarg->arg,
2489                                     args->kwarg->annotation, &annotations_len))
2490        return 0;
2491
2492    if (!compiler_visit_argannotation(c, &_Py_ID(return), returns,
2493                                      &annotations_len)) {
2494        return 0;
2495    }
2496
2497    if (annotations_len) {
2498        ADDOP_I(c, BUILD_TUPLE, annotations_len);
2499        return 1;
2500    }
2501
2502    return -1;
2503}
2504
2505static int
2506compiler_visit_defaults(struct compiler *c, arguments_ty args)
2507{
2508    VISIT_SEQ(c, expr, args->defaults);
2509    ADDOP_I(c, BUILD_TUPLE, asdl_seq_LEN(args->defaults));
2510    return 1;
2511}
2512
2513static Py_ssize_t
2514compiler_default_arguments(struct compiler *c, arguments_ty args)
2515{
2516    Py_ssize_t funcflags = 0;
2517    if (args->defaults && asdl_seq_LEN(args->defaults) > 0) {
2518        if (!compiler_visit_defaults(c, args))
2519            return -1;
2520        funcflags |= 0x01;
2521    }
2522    if (args->kwonlyargs) {
2523        int res = compiler_visit_kwonlydefaults(c, args->kwonlyargs,
2524                                                args->kw_defaults);
2525        if (res == 0) {
2526            return -1;
2527        }
2528        else if (res > 0) {
2529            funcflags |= 0x02;
2530        }
2531    }
2532    return funcflags;
2533}
2534
2535static int
2536forbidden_name(struct compiler *c, identifier name, expr_context_ty ctx)
2537{
2538
2539    if (ctx == Store && _PyUnicode_EqualToASCIIString(name, "__debug__")) {
2540        compiler_error(c, "cannot assign to __debug__");
2541        return 1;
2542    }
2543    if (ctx == Del && _PyUnicode_EqualToASCIIString(name, "__debug__")) {
2544        compiler_error(c, "cannot delete __debug__");
2545        return 1;
2546    }
2547    return 0;
2548}
2549
2550static int
2551compiler_check_debug_one_arg(struct compiler *c, arg_ty arg)
2552{
2553    if (arg != NULL) {
2554        if (forbidden_name(c, arg->arg, Store))
2555            return 0;
2556    }
2557    return 1;
2558}
2559
2560static int
2561compiler_check_debug_args_seq(struct compiler *c, asdl_arg_seq *args)
2562{
2563    if (args != NULL) {
2564        for (Py_ssize_t i = 0, n = asdl_seq_LEN(args); i < n; i++) {
2565            if (!compiler_check_debug_one_arg(c, asdl_seq_GET(args, i)))
2566                return 0;
2567        }
2568    }
2569    return 1;
2570}
2571
2572static int
2573compiler_check_debug_args(struct compiler *c, arguments_ty args)
2574{
2575    if (!compiler_check_debug_args_seq(c, args->posonlyargs))
2576        return 0;
2577    if (!compiler_check_debug_args_seq(c, args->args))
2578        return 0;
2579    if (!compiler_check_debug_one_arg(c, args->vararg))
2580        return 0;
2581    if (!compiler_check_debug_args_seq(c, args->kwonlyargs))
2582        return 0;
2583    if (!compiler_check_debug_one_arg(c, args->kwarg))
2584        return 0;
2585    return 1;
2586}
2587
2588static int
2589compiler_function(struct compiler *c, stmt_ty s, int is_async)
2590{
2591    PyCodeObject *co;
2592    PyObject *qualname, *docstring = NULL;
2593    arguments_ty args;
2594    expr_ty returns;
2595    identifier name;
2596    asdl_expr_seq* decos;
2597    asdl_stmt_seq *body;
2598    Py_ssize_t i, funcflags;
2599    int annotations;
2600    int scope_type;
2601    int firstlineno;
2602
2603    if (is_async) {
2604        assert(s->kind == AsyncFunctionDef_kind);
2605
2606        args = s->v.AsyncFunctionDef.args;
2607        returns = s->v.AsyncFunctionDef.returns;
2608        decos = s->v.AsyncFunctionDef.decorator_list;
2609        name = s->v.AsyncFunctionDef.name;
2610        body = s->v.AsyncFunctionDef.body;
2611
2612        scope_type = COMPILER_SCOPE_ASYNC_FUNCTION;
2613    } else {
2614        assert(s->kind == FunctionDef_kind);
2615
2616        args = s->v.FunctionDef.args;
2617        returns = s->v.FunctionDef.returns;
2618        decos = s->v.FunctionDef.decorator_list;
2619        name = s->v.FunctionDef.name;
2620        body = s->v.FunctionDef.body;
2621
2622        scope_type = COMPILER_SCOPE_FUNCTION;
2623    }
2624
2625    if (!compiler_check_debug_args(c, args))
2626        return 0;
2627
2628    if (!compiler_decorators(c, decos))
2629        return 0;
2630
2631    firstlineno = s->lineno;
2632    if (asdl_seq_LEN(decos)) {
2633        firstlineno = ((expr_ty)asdl_seq_GET(decos, 0))->lineno;
2634    }
2635
2636    funcflags = compiler_default_arguments(c, args);
2637    if (funcflags == -1) {
2638        return 0;
2639    }
2640
2641    annotations = compiler_visit_annotations(c, args, returns);
2642    if (annotations == 0) {
2643        return 0;
2644    }
2645    else if (annotations > 0) {
2646        funcflags |= 0x04;
2647    }
2648
2649    if (!compiler_enter_scope(c, name, scope_type, (void *)s, firstlineno)) {
2650        return 0;
2651    }
2652
2653    /* if not -OO mode, add docstring */
2654    if (c->c_optimize < 2) {
2655        docstring = _PyAST_GetDocString(body);
2656    }
2657    if (compiler_add_const(c, docstring ? docstring : Py_None) < 0) {
2658        compiler_exit_scope(c);
2659        return 0;
2660    }
2661
2662    c->u->u_argcount = asdl_seq_LEN(args->args);
2663    c->u->u_posonlyargcount = asdl_seq_LEN(args->posonlyargs);
2664    c->u->u_kwonlyargcount = asdl_seq_LEN(args->kwonlyargs);
2665    for (i = docstring ? 1 : 0; i < asdl_seq_LEN(body); i++) {
2666        VISIT_IN_SCOPE(c, stmt, (stmt_ty)asdl_seq_GET(body, i));
2667    }
2668    co = assemble(c, 1);
2669    qualname = c->u->u_qualname;
2670    Py_INCREF(qualname);
2671    compiler_exit_scope(c);
2672    if (co == NULL) {
2673        Py_XDECREF(qualname);
2674        Py_XDECREF(co);
2675        return 0;
2676    }
2677
2678    if (!compiler_make_closure(c, co, funcflags, qualname)) {
2679        Py_DECREF(qualname);
2680        Py_DECREF(co);
2681        return 0;
2682    }
2683    Py_DECREF(qualname);
2684    Py_DECREF(co);
2685
2686    if (!compiler_apply_decorators(c, decos))
2687        return 0;
2688    return compiler_nameop(c, name, Store);
2689}
2690
2691static int
2692compiler_class(struct compiler *c, stmt_ty s)
2693{
2694    PyCodeObject *co;
2695    int i, firstlineno;
2696    asdl_expr_seq *decos = s->v.ClassDef.decorator_list;
2697
2698    if (!compiler_decorators(c, decos))
2699        return 0;
2700
2701    firstlineno = s->lineno;
2702    if (asdl_seq_LEN(decos)) {
2703        firstlineno = ((expr_ty)asdl_seq_GET(decos, 0))->lineno;
2704    }
2705
2706    /* ultimately generate code for:
2707         <name> = __build_class__(<func>, <name>, *<bases>, **<keywords>)
2708       where:
2709         <func> is a zero arg function/closure created from the class body.
2710            It mutates its locals to build the class namespace.
2711         <name> is the class name
2712         <bases> is the positional arguments and *varargs argument
2713         <keywords> is the keyword arguments and **kwds argument
2714       This borrows from compiler_call.
2715    */
2716
2717    /* 1. compile the class body into a code object */
2718    if (!compiler_enter_scope(c, s->v.ClassDef.name,
2719                              COMPILER_SCOPE_CLASS, (void *)s, firstlineno)) {
2720        return 0;
2721    }
2722    /* this block represents what we do in the new scope */
2723    {
2724        /* use the class name for name mangling */
2725        Py_INCREF(s->v.ClassDef.name);
2726        Py_XSETREF(c->u->u_private, s->v.ClassDef.name);
2727        /* load (global) __name__ ... */
2728        if (!compiler_nameop(c, &_Py_ID(__name__), Load)) {
2729            compiler_exit_scope(c);
2730            return 0;
2731        }
2732        /* ... and store it as __module__ */
2733        if (!compiler_nameop(c, &_Py_ID(__module__), Store)) {
2734            compiler_exit_scope(c);
2735            return 0;
2736        }
2737        assert(c->u->u_qualname);
2738        ADDOP_LOAD_CONST(c, c->u->u_qualname);
2739        if (!compiler_nameop(c, &_Py_ID(__qualname__), Store)) {
2740            compiler_exit_scope(c);
2741            return 0;
2742        }
2743        /* compile the body proper */
2744        if (!compiler_body(c, s->v.ClassDef.body)) {
2745            compiler_exit_scope(c);
2746            return 0;
2747        }
2748        /* The following code is artificial */
2749        UNSET_LOC(c);
2750        /* Return __classcell__ if it is referenced, otherwise return None */
2751        if (c->u->u_ste->ste_needs_class_closure) {
2752            /* Store __classcell__ into class namespace & return it */
2753            i = compiler_lookup_arg(c->u->u_cellvars, &_Py_ID(__class__));
2754            if (i < 0) {
2755                compiler_exit_scope(c);
2756                return 0;
2757            }
2758            assert(i == 0);
2759
2760            ADDOP_I(c, LOAD_CLOSURE, i);
2761            ADDOP_I(c, COPY, 1);
2762            if (!compiler_nameop(c, &_Py_ID(__classcell__), Store)) {
2763                compiler_exit_scope(c);
2764                return 0;
2765            }
2766        }
2767        else {
2768            /* No methods referenced __class__, so just return None */
2769            assert(PyDict_GET_SIZE(c->u->u_cellvars) == 0);
2770            ADDOP_LOAD_CONST(c, Py_None);
2771        }
2772        ADDOP_IN_SCOPE(c, RETURN_VALUE);
2773        /* create the code object */
2774        co = assemble(c, 1);
2775    }
2776    /* leave the new scope */
2777    compiler_exit_scope(c);
2778    if (co == NULL)
2779        return 0;
2780
2781    /* 2. load the 'build_class' function */
2782    ADDOP(c, PUSH_NULL);
2783    ADDOP(c, LOAD_BUILD_CLASS);
2784
2785    /* 3. load a function (or closure) made from the code object */
2786    if (!compiler_make_closure(c, co, 0, NULL)) {
2787        Py_DECREF(co);
2788        return 0;
2789    }
2790    Py_DECREF(co);
2791
2792    /* 4. load class name */
2793    ADDOP_LOAD_CONST(c, s->v.ClassDef.name);
2794
2795    /* 5. generate the rest of the code for the call */
2796    if (!compiler_call_helper(c, 2, s->v.ClassDef.bases, s->v.ClassDef.keywords))
2797        return 0;
2798    /* 6. apply decorators */
2799    if (!compiler_apply_decorators(c, decos))
2800        return 0;
2801
2802    /* 7. store into <name> */
2803    if (!compiler_nameop(c, s->v.ClassDef.name, Store))
2804        return 0;
2805    return 1;
2806}
2807
2808/* Return 0 if the expression is a constant value except named singletons.
2809   Return 1 otherwise. */
2810static int
2811check_is_arg(expr_ty e)
2812{
2813    if (e->kind != Constant_kind) {
2814        return 1;
2815    }
2816    PyObject *value = e->v.Constant.value;
2817    return (value == Py_None
2818         || value == Py_False
2819         || value == Py_True
2820         || value == Py_Ellipsis);
2821}
2822
2823/* Check operands of identity chacks ("is" and "is not").
2824   Emit a warning if any operand is a constant except named singletons.
2825   Return 0 on error.
2826 */
2827static int
2828check_compare(struct compiler *c, expr_ty e)
2829{
2830    Py_ssize_t i, n;
2831    int left = check_is_arg(e->v.Compare.left);
2832    n = asdl_seq_LEN(e->v.Compare.ops);
2833    for (i = 0; i < n; i++) {
2834        cmpop_ty op = (cmpop_ty)asdl_seq_GET(e->v.Compare.ops, i);
2835        int right = check_is_arg((expr_ty)asdl_seq_GET(e->v.Compare.comparators, i));
2836        if (op == Is || op == IsNot) {
2837            if (!right || !left) {
2838                const char *msg = (op == Is)
2839                        ? "\"is\" with a literal. Did you mean \"==\"?"
2840                        : "\"is not\" with a literal. Did you mean \"!=\"?";
2841                return compiler_warn(c, msg);
2842            }
2843        }
2844        left = right;
2845    }
2846    return 1;
2847}
2848
2849static int compiler_addcompare(struct compiler *c, cmpop_ty op)
2850{
2851    int cmp;
2852    switch (op) {
2853    case Eq:
2854        cmp = Py_EQ;
2855        break;
2856    case NotEq:
2857        cmp = Py_NE;
2858        break;
2859    case Lt:
2860        cmp = Py_LT;
2861        break;
2862    case LtE:
2863        cmp = Py_LE;
2864        break;
2865    case Gt:
2866        cmp = Py_GT;
2867        break;
2868    case GtE:
2869        cmp = Py_GE;
2870        break;
2871    case Is:
2872        ADDOP_I(c, IS_OP, 0);
2873        return 1;
2874    case IsNot:
2875        ADDOP_I(c, IS_OP, 1);
2876        return 1;
2877    case In:
2878        ADDOP_I(c, CONTAINS_OP, 0);
2879        return 1;
2880    case NotIn:
2881        ADDOP_I(c, CONTAINS_OP, 1);
2882        return 1;
2883    default:
2884        Py_UNREACHABLE();
2885    }
2886    ADDOP_I(c, COMPARE_OP, cmp);
2887    return 1;
2888}
2889
2890
2891
2892static int
2893compiler_jump_if(struct compiler *c, expr_ty e, basicblock *next, int cond)
2894{
2895    switch (e->kind) {
2896    case UnaryOp_kind:
2897        if (e->v.UnaryOp.op == Not)
2898            return compiler_jump_if(c, e->v.UnaryOp.operand, next, !cond);
2899        /* fallback to general implementation */
2900        break;
2901    case BoolOp_kind: {
2902        asdl_expr_seq *s = e->v.BoolOp.values;
2903        Py_ssize_t i, n = asdl_seq_LEN(s) - 1;
2904        assert(n >= 0);
2905        int cond2 = e->v.BoolOp.op == Or;
2906        basicblock *next2 = next;
2907        if (!cond2 != !cond) {
2908            next2 = compiler_new_block(c);
2909            if (next2 == NULL)
2910                return 0;
2911        }
2912        for (i = 0; i < n; ++i) {
2913            if (!compiler_jump_if(c, (expr_ty)asdl_seq_GET(s, i), next2, cond2))
2914                return 0;
2915        }
2916        if (!compiler_jump_if(c, (expr_ty)asdl_seq_GET(s, n), next, cond))
2917            return 0;
2918        if (next2 != next)
2919            compiler_use_next_block(c, next2);
2920        return 1;
2921    }
2922    case IfExp_kind: {
2923        basicblock *end, *next2;
2924        end = compiler_new_block(c);
2925        if (end == NULL)
2926            return 0;
2927        next2 = compiler_new_block(c);
2928        if (next2 == NULL)
2929            return 0;
2930        if (!compiler_jump_if(c, e->v.IfExp.test, next2, 0))
2931            return 0;
2932        if (!compiler_jump_if(c, e->v.IfExp.body, next, cond))
2933            return 0;
2934        ADDOP_JUMP_NOLINE(c, JUMP, end);
2935        compiler_use_next_block(c, next2);
2936        if (!compiler_jump_if(c, e->v.IfExp.orelse, next, cond))
2937            return 0;
2938        compiler_use_next_block(c, end);
2939        return 1;
2940    }
2941    case Compare_kind: {
2942        SET_LOC(c, e);
2943        Py_ssize_t i, n = asdl_seq_LEN(e->v.Compare.ops) - 1;
2944        if (n > 0) {
2945            if (!check_compare(c, e)) {
2946                return 0;
2947            }
2948            basicblock *cleanup = compiler_new_block(c);
2949            if (cleanup == NULL)
2950                return 0;
2951            VISIT(c, expr, e->v.Compare.left);
2952            for (i = 0; i < n; i++) {
2953                VISIT(c, expr,
2954                    (expr_ty)asdl_seq_GET(e->v.Compare.comparators, i));
2955                ADDOP_I(c, SWAP, 2);
2956                ADDOP_I(c, COPY, 2);
2957                ADDOP_COMPARE(c, asdl_seq_GET(e->v.Compare.ops, i));
2958                ADDOP_JUMP(c, POP_JUMP_IF_FALSE, cleanup);
2959            }
2960            VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, n));
2961            ADDOP_COMPARE(c, asdl_seq_GET(e->v.Compare.ops, n));
2962            ADDOP_JUMP(c, cond ? POP_JUMP_IF_TRUE : POP_JUMP_IF_FALSE, next);
2963            basicblock *end = compiler_new_block(c);
2964            if (end == NULL)
2965                return 0;
2966            ADDOP_JUMP_NOLINE(c, JUMP, end);
2967            compiler_use_next_block(c, cleanup);
2968            ADDOP(c, POP_TOP);
2969            if (!cond) {
2970                ADDOP_JUMP_NOLINE(c, JUMP, next);
2971            }
2972            compiler_use_next_block(c, end);
2973            return 1;
2974        }
2975        /* fallback to general implementation */
2976        break;
2977    }
2978    default:
2979        /* fallback to general implementation */
2980        break;
2981    }
2982
2983    /* general implementation */
2984    VISIT(c, expr, e);
2985    ADDOP_JUMP(c, cond ? POP_JUMP_IF_TRUE : POP_JUMP_IF_FALSE, next);
2986    return 1;
2987}
2988
2989static int
2990compiler_ifexp(struct compiler *c, expr_ty e)
2991{
2992    basicblock *end, *next;
2993
2994    assert(e->kind == IfExp_kind);
2995    end = compiler_new_block(c);
2996    if (end == NULL)
2997        return 0;
2998    next = compiler_new_block(c);
2999    if (next == NULL)
3000        return 0;
3001    if (!compiler_jump_if(c, e->v.IfExp.test, next, 0))
3002        return 0;
3003    VISIT(c, expr, e->v.IfExp.body);
3004    ADDOP_JUMP_NOLINE(c, JUMP, end);
3005    compiler_use_next_block(c, next);
3006    VISIT(c, expr, e->v.IfExp.orelse);
3007    compiler_use_next_block(c, end);
3008    return 1;
3009}
3010
3011static int
3012compiler_lambda(struct compiler *c, expr_ty e)
3013{
3014    PyCodeObject *co;
3015    PyObject *qualname;
3016    Py_ssize_t funcflags;
3017    arguments_ty args = e->v.Lambda.args;
3018    assert(e->kind == Lambda_kind);
3019
3020    if (!compiler_check_debug_args(c, args))
3021        return 0;
3022
3023    funcflags = compiler_default_arguments(c, args);
3024    if (funcflags == -1) {
3025        return 0;
3026    }
3027
3028    _Py_DECLARE_STR(anon_lambda, "<lambda>");
3029    if (!compiler_enter_scope(c, &_Py_STR(anon_lambda), COMPILER_SCOPE_LAMBDA,
3030                              (void *)e, e->lineno)) {
3031        return 0;
3032    }
3033    /* Make None the first constant, so the lambda can't have a
3034       docstring. */
3035    if (compiler_add_const(c, Py_None) < 0)
3036        return 0;
3037
3038    c->u->u_argcount = asdl_seq_LEN(args->args);
3039    c->u->u_posonlyargcount = asdl_seq_LEN(args->posonlyargs);
3040    c->u->u_kwonlyargcount = asdl_seq_LEN(args->kwonlyargs);
3041    VISIT_IN_SCOPE(c, expr, e->v.Lambda.body);
3042    if (c->u->u_ste->ste_generator) {
3043        co = assemble(c, 0);
3044    }
3045    else {
3046        ADDOP_IN_SCOPE(c, RETURN_VALUE);
3047        co = assemble(c, 1);
3048    }
3049    qualname = c->u->u_qualname;
3050    Py_INCREF(qualname);
3051    compiler_exit_scope(c);
3052    if (co == NULL) {
3053        Py_DECREF(qualname);
3054        return 0;
3055    }
3056
3057    if (!compiler_make_closure(c, co, funcflags, qualname)) {
3058        Py_DECREF(qualname);
3059        Py_DECREF(co);
3060        return 0;
3061    }
3062    Py_DECREF(qualname);
3063    Py_DECREF(co);
3064
3065    return 1;
3066}
3067
3068static int
3069compiler_if(struct compiler *c, stmt_ty s)
3070{
3071    basicblock *end, *next;
3072    assert(s->kind == If_kind);
3073    end = compiler_new_block(c);
3074    if (end == NULL) {
3075        return 0;
3076    }
3077    if (asdl_seq_LEN(s->v.If.orelse)) {
3078        next = compiler_new_block(c);
3079        if (next == NULL) {
3080            return 0;
3081        }
3082    }
3083    else {
3084        next = end;
3085    }
3086    if (!compiler_jump_if(c, s->v.If.test, next, 0)) {
3087        return 0;
3088    }
3089    VISIT_SEQ(c, stmt, s->v.If.body);
3090    if (asdl_seq_LEN(s->v.If.orelse)) {
3091        ADDOP_JUMP_NOLINE(c, JUMP, end);
3092        compiler_use_next_block(c, next);
3093        VISIT_SEQ(c, stmt, s->v.If.orelse);
3094    }
3095    compiler_use_next_block(c, end);
3096    return 1;
3097}
3098
3099static int
3100compiler_for(struct compiler *c, stmt_ty s)
3101{
3102    basicblock *start, *body, *cleanup, *end;
3103
3104    start = compiler_new_block(c);
3105    body = compiler_new_block(c);
3106    cleanup = compiler_new_block(c);
3107    end = compiler_new_block(c);
3108    if (start == NULL || body == NULL || end == NULL || cleanup == NULL) {
3109        return 0;
3110    }
3111    if (!compiler_push_fblock(c, FOR_LOOP, start, end, NULL)) {
3112        return 0;
3113    }
3114    VISIT(c, expr, s->v.For.iter);
3115    ADDOP(c, GET_ITER);
3116    compiler_use_next_block(c, start);
3117    ADDOP_JUMP(c, FOR_ITER, cleanup);
3118    compiler_use_next_block(c, body);
3119    VISIT(c, expr, s->v.For.target);
3120    VISIT_SEQ(c, stmt, s->v.For.body);
3121    /* Mark jump as artificial */
3122    UNSET_LOC(c);
3123    ADDOP_JUMP(c, JUMP, start);
3124    compiler_use_next_block(c, cleanup);
3125
3126    compiler_pop_fblock(c, FOR_LOOP, start);
3127
3128    VISIT_SEQ(c, stmt, s->v.For.orelse);
3129    compiler_use_next_block(c, end);
3130    return 1;
3131}
3132
3133
3134static int
3135compiler_async_for(struct compiler *c, stmt_ty s)
3136{
3137    basicblock *start, *except, *end;
3138    if (IS_TOP_LEVEL_AWAIT(c)){
3139        c->u->u_ste->ste_coroutine = 1;
3140    } else if (c->u->u_scope_type != COMPILER_SCOPE_ASYNC_FUNCTION) {
3141        return compiler_error(c, "'async for' outside async function");
3142    }
3143
3144    start = compiler_new_block(c);
3145    except = compiler_new_block(c);
3146    end = compiler_new_block(c);
3147
3148    if (start == NULL || except == NULL || end == NULL) {
3149        return 0;
3150    }
3151    VISIT(c, expr, s->v.AsyncFor.iter);
3152    ADDOP(c, GET_AITER);
3153
3154    compiler_use_next_block(c, start);
3155    if (!compiler_push_fblock(c, FOR_LOOP, start, end, NULL)) {
3156        return 0;
3157    }
3158    /* SETUP_FINALLY to guard the __anext__ call */
3159    ADDOP_JUMP(c, SETUP_FINALLY, except);
3160    ADDOP(c, GET_ANEXT);
3161    ADDOP_LOAD_CONST(c, Py_None);
3162    ADD_YIELD_FROM(c, 1);
3163    ADDOP(c, POP_BLOCK);  /* for SETUP_FINALLY */
3164
3165    /* Success block for __anext__ */
3166    VISIT(c, expr, s->v.AsyncFor.target);
3167    VISIT_SEQ(c, stmt, s->v.AsyncFor.body);
3168    /* Mark jump as artificial */
3169    UNSET_LOC(c);
3170    ADDOP_JUMP(c, JUMP, start);
3171
3172    compiler_pop_fblock(c, FOR_LOOP, start);
3173
3174    /* Except block for __anext__ */
3175    compiler_use_next_block(c, except);
3176
3177    /* Use same line number as the iterator,
3178     * as the END_ASYNC_FOR succeeds the `for`, not the body. */
3179    SET_LOC(c, s->v.AsyncFor.iter);
3180    ADDOP(c, END_ASYNC_FOR);
3181
3182    /* `else` block */
3183    VISIT_SEQ(c, stmt, s->v.For.orelse);
3184
3185    compiler_use_next_block(c, end);
3186
3187    return 1;
3188}
3189
3190static int
3191compiler_while(struct compiler *c, stmt_ty s)
3192{
3193    basicblock *loop, *body, *end, *anchor = NULL;
3194    loop = compiler_new_block(c);
3195    body = compiler_new_block(c);
3196    anchor = compiler_new_block(c);
3197    end = compiler_new_block(c);
3198    if (loop == NULL || body == NULL || anchor == NULL || end == NULL) {
3199        return 0;
3200    }
3201    compiler_use_next_block(c, loop);
3202    if (!compiler_push_fblock(c, WHILE_LOOP, loop, end, NULL)) {
3203        return 0;
3204    }
3205    if (!compiler_jump_if(c, s->v.While.test, anchor, 0)) {
3206        return 0;
3207    }
3208
3209    compiler_use_next_block(c, body);
3210    VISIT_SEQ(c, stmt, s->v.While.body);
3211    SET_LOC(c, s);
3212    if (!compiler_jump_if(c, s->v.While.test, body, 1)) {
3213        return 0;
3214    }
3215
3216    compiler_pop_fblock(c, WHILE_LOOP, loop);
3217
3218    compiler_use_next_block(c, anchor);
3219    if (s->v.While.orelse) {
3220        VISIT_SEQ(c, stmt, s->v.While.orelse);
3221    }
3222    compiler_use_next_block(c, end);
3223
3224    return 1;
3225}
3226
3227static int
3228compiler_return(struct compiler *c, stmt_ty s)
3229{
3230    int preserve_tos = ((s->v.Return.value != NULL) &&
3231                        (s->v.Return.value->kind != Constant_kind));
3232    if (c->u->u_ste->ste_type != FunctionBlock)
3233        return compiler_error(c, "'return' outside function");
3234    if (s->v.Return.value != NULL &&
3235        c->u->u_ste->ste_coroutine && c->u->u_ste->ste_generator)
3236    {
3237            return compiler_error(
3238                c, "'return' with value in async generator");
3239    }
3240    if (preserve_tos) {
3241        VISIT(c, expr, s->v.Return.value);
3242    } else {
3243        /* Emit instruction with line number for return value */
3244        if (s->v.Return.value != NULL) {
3245            SET_LOC(c, s->v.Return.value);
3246            ADDOP(c, NOP);
3247        }
3248    }
3249    if (s->v.Return.value == NULL || s->v.Return.value->lineno != s->lineno) {
3250        SET_LOC(c, s);
3251        ADDOP(c, NOP);
3252    }
3253
3254    if (!compiler_unwind_fblock_stack(c, preserve_tos, NULL))
3255        return 0;
3256    if (s->v.Return.value == NULL) {
3257        ADDOP_LOAD_CONST(c, Py_None);
3258    }
3259    else if (!preserve_tos) {
3260        ADDOP_LOAD_CONST(c, s->v.Return.value->v.Constant.value);
3261    }
3262    ADDOP(c, RETURN_VALUE);
3263
3264    return 1;
3265}
3266
3267static int
3268compiler_break(struct compiler *c)
3269{
3270    struct fblockinfo *loop = NULL;
3271    int u_lineno = c->u->u_lineno;
3272    int u_col_offset = c->u->u_col_offset;
3273    int u_end_lineno = c->u->u_end_lineno;
3274    int u_end_col_offset = c->u->u_end_col_offset;
3275    /* Emit instruction with line number */
3276    ADDOP(c, NOP);
3277    if (!compiler_unwind_fblock_stack(c, 0, &loop)) {
3278        return 0;
3279    }
3280    if (loop == NULL) {
3281        c->u->u_lineno = u_lineno;
3282        c->u->u_col_offset = u_col_offset;
3283        c->u->u_end_lineno = u_end_lineno;
3284        c->u->u_end_col_offset = u_end_col_offset;
3285        return compiler_error(c, "'break' outside loop");
3286    }
3287    if (!compiler_unwind_fblock(c, loop, 0)) {
3288        return 0;
3289    }
3290    ADDOP_JUMP(c, JUMP, loop->fb_exit);
3291    return 1;
3292}
3293
3294static int
3295compiler_continue(struct compiler *c)
3296{
3297    struct fblockinfo *loop = NULL;
3298    int u_lineno = c->u->u_lineno;
3299    int u_col_offset = c->u->u_col_offset;
3300    int u_end_lineno = c->u->u_end_lineno;
3301    int u_end_col_offset = c->u->u_end_col_offset;
3302    /* Emit instruction with line number */
3303    ADDOP(c, NOP);
3304    if (!compiler_unwind_fblock_stack(c, 0, &loop)) {
3305        return 0;
3306    }
3307    if (loop == NULL) {
3308        c->u->u_lineno = u_lineno;
3309        c->u->u_col_offset = u_col_offset;
3310        c->u->u_end_lineno = u_end_lineno;
3311        c->u->u_end_col_offset = u_end_col_offset;
3312        return compiler_error(c, "'continue' not properly in loop");
3313    }
3314    ADDOP_JUMP(c, JUMP, loop->fb_block);
3315    return 1;
3316}
3317
3318
3319/* Code generated for "try: <body> finally: <finalbody>" is as follows:
3320
3321        SETUP_FINALLY           L
3322        <code for body>
3323        POP_BLOCK
3324        <code for finalbody>
3325        JUMP E
3326    L:
3327        <code for finalbody>
3328    E:
3329
3330   The special instructions use the block stack.  Each block
3331   stack entry contains the instruction that created it (here
3332   SETUP_FINALLY), the level of the value stack at the time the
3333   block stack entry was created, and a label (here L).
3334
3335   SETUP_FINALLY:
3336    Pushes the current value stack level and the label
3337    onto the block stack.
3338   POP_BLOCK:
3339    Pops en entry from the block stack.
3340
3341   The block stack is unwound when an exception is raised:
3342   when a SETUP_FINALLY entry is found, the raised and the caught
3343   exceptions are pushed onto the value stack (and the exception
3344   condition is cleared), and the interpreter jumps to the label
3345   gotten from the block stack.
3346*/
3347
3348static int
3349compiler_try_finally(struct compiler *c, stmt_ty s)
3350{
3351    basicblock *body, *end, *exit, *cleanup;
3352
3353    body = compiler_new_block(c);
3354    end = compiler_new_block(c);
3355    exit = compiler_new_block(c);
3356    cleanup = compiler_new_block(c);
3357    if (body == NULL || end == NULL || exit == NULL || cleanup == NULL) {
3358        return 0;
3359    }
3360    /* `try` block */
3361    ADDOP_JUMP(c, SETUP_FINALLY, end);
3362    compiler_use_next_block(c, body);
3363    if (!compiler_push_fblock(c, FINALLY_TRY, body, end, s->v.Try.finalbody))
3364        return 0;
3365    if (s->v.Try.handlers && asdl_seq_LEN(s->v.Try.handlers)) {
3366        if (!compiler_try_except(c, s))
3367            return 0;
3368    }
3369    else {
3370        VISIT_SEQ(c, stmt, s->v.Try.body);
3371    }
3372    ADDOP_NOLINE(c, POP_BLOCK);
3373    compiler_pop_fblock(c, FINALLY_TRY, body);
3374    VISIT_SEQ(c, stmt, s->v.Try.finalbody);
3375    ADDOP_JUMP_NOLINE(c, JUMP, exit);
3376    /* `finally` block */
3377    compiler_use_next_block(c, end);
3378
3379    UNSET_LOC(c);
3380    ADDOP_JUMP(c, SETUP_CLEANUP, cleanup);
3381    ADDOP(c, PUSH_EXC_INFO);
3382    if (!compiler_push_fblock(c, FINALLY_END, end, NULL, NULL))
3383        return 0;
3384    VISIT_SEQ(c, stmt, s->v.Try.finalbody);
3385    compiler_pop_fblock(c, FINALLY_END, end);
3386    ADDOP_I(c, RERAISE, 0);
3387    compiler_use_next_block(c, cleanup);
3388    POP_EXCEPT_AND_RERAISE(c);
3389    compiler_use_next_block(c, exit);
3390    return 1;
3391}
3392
3393static int
3394compiler_try_star_finally(struct compiler *c, stmt_ty s)
3395{
3396    basicblock *body = compiler_new_block(c);
3397    if (body == NULL) {
3398        return 0;
3399    }
3400    basicblock *end = compiler_new_block(c);
3401    if (!end) {
3402        return 0;
3403    }
3404    basicblock *exit = compiler_new_block(c);
3405    if (!exit) {
3406        return 0;
3407    }
3408    basicblock *cleanup = compiler_new_block(c);
3409    if (!cleanup) {
3410        return 0;
3411    }
3412    /* `try` block */
3413    ADDOP_JUMP(c, SETUP_FINALLY, end);
3414    compiler_use_next_block(c, body);
3415    if (!compiler_push_fblock(c, FINALLY_TRY, body, end, s->v.TryStar.finalbody)) {
3416        return 0;
3417    }
3418    if (s->v.TryStar.handlers && asdl_seq_LEN(s->v.TryStar.handlers)) {
3419        if (!compiler_try_star_except(c, s)) {
3420            return 0;
3421        }
3422    }
3423    else {
3424        VISIT_SEQ(c, stmt, s->v.TryStar.body);
3425    }
3426    ADDOP_NOLINE(c, POP_BLOCK);
3427    compiler_pop_fblock(c, FINALLY_TRY, body);
3428    VISIT_SEQ(c, stmt, s->v.TryStar.finalbody);
3429    ADDOP_JUMP_NOLINE(c, JUMP, exit);
3430    /* `finally` block */
3431    compiler_use_next_block(c, end);
3432
3433    UNSET_LOC(c);
3434    ADDOP_JUMP(c, SETUP_CLEANUP, cleanup);
3435    ADDOP(c, PUSH_EXC_INFO);
3436    if (!compiler_push_fblock(c, FINALLY_END, end, NULL, NULL)) {
3437        return 0;
3438    }
3439    VISIT_SEQ(c, stmt, s->v.TryStar.finalbody);
3440    compiler_pop_fblock(c, FINALLY_END, end);
3441    ADDOP_I(c, RERAISE, 0);
3442    compiler_use_next_block(c, cleanup);
3443    POP_EXCEPT_AND_RERAISE(c);
3444    compiler_use_next_block(c, exit);
3445    return 1;
3446}
3447
3448
3449/*
3450   Code generated for "try: S except E1 as V1: S1 except E2 as V2: S2 ...":
3451   (The contents of the value stack is shown in [], with the top
3452   at the right; 'tb' is trace-back info, 'val' the exception's
3453   associated value, and 'exc' the exception.)
3454
3455   Value stack          Label   Instruction     Argument
3456   []                           SETUP_FINALLY   L1
3457   []                           <code for S>
3458   []                           POP_BLOCK
3459   []                           JUMP            L0
3460
3461   [exc]                L1:     <evaluate E1>           )
3462   [exc, E1]                    CHECK_EXC_MATCH         )
3463   [exc, bool]                  POP_JUMP_IF_FALSE L2    ) only if E1
3464   [exc]                        <assign to V1>  (or POP if no V1)
3465   []                           <code for S1>
3466                                JUMP            L0
3467
3468   [exc]                L2:     <evaluate E2>
3469   .............................etc.......................
3470
3471   [exc]                Ln+1:   RERAISE     # re-raise exception
3472
3473   []                   L0:     <next statement>
3474
3475   Of course, parts are not generated if Vi or Ei is not present.
3476*/
3477static int
3478compiler_try_except(struct compiler *c, stmt_ty s)
3479{
3480    basicblock *body, *except, *end, *cleanup;
3481    Py_ssize_t i, n;
3482
3483    body = compiler_new_block(c);
3484    except = compiler_new_block(c);
3485    end = compiler_new_block(c);
3486    cleanup = compiler_new_block(c);
3487    if (body == NULL || except == NULL || end == NULL || cleanup == NULL)
3488        return 0;
3489    ADDOP_JUMP(c, SETUP_FINALLY, except);
3490    compiler_use_next_block(c, body);
3491    if (!compiler_push_fblock(c, TRY_EXCEPT, body, NULL, NULL))
3492        return 0;
3493    VISIT_SEQ(c, stmt, s->v.Try.body);
3494    compiler_pop_fblock(c, TRY_EXCEPT, body);
3495    ADDOP_NOLINE(c, POP_BLOCK);
3496    if (s->v.Try.orelse && asdl_seq_LEN(s->v.Try.orelse)) {
3497        VISIT_SEQ(c, stmt, s->v.Try.orelse);
3498    }
3499    ADDOP_JUMP_NOLINE(c, JUMP, end);
3500    n = asdl_seq_LEN(s->v.Try.handlers);
3501    compiler_use_next_block(c, except);
3502
3503    UNSET_LOC(c);
3504    ADDOP_JUMP(c, SETUP_CLEANUP, cleanup);
3505    ADDOP(c, PUSH_EXC_INFO);
3506    /* Runtime will push a block here, so we need to account for that */
3507    if (!compiler_push_fblock(c, EXCEPTION_HANDLER, NULL, NULL, NULL))
3508        return 0;
3509    for (i = 0; i < n; i++) {
3510        excepthandler_ty handler = (excepthandler_ty)asdl_seq_GET(
3511            s->v.Try.handlers, i);
3512        SET_LOC(c, handler);
3513        if (!handler->v.ExceptHandler.type && i < n-1) {
3514            return compiler_error(c, "default 'except:' must be last");
3515        }
3516        except = compiler_new_block(c);
3517        if (except == NULL)
3518            return 0;
3519        if (handler->v.ExceptHandler.type) {
3520            VISIT(c, expr, handler->v.ExceptHandler.type);
3521            ADDOP(c, CHECK_EXC_MATCH);
3522            ADDOP_JUMP(c, POP_JUMP_IF_FALSE, except);
3523        }
3524        if (handler->v.ExceptHandler.name) {
3525            basicblock *cleanup_end, *cleanup_body;
3526
3527            cleanup_end = compiler_new_block(c);
3528            cleanup_body = compiler_new_block(c);
3529            if (cleanup_end == NULL || cleanup_body == NULL) {
3530                return 0;
3531            }
3532
3533            compiler_nameop(c, handler->v.ExceptHandler.name, Store);
3534
3535            /*
3536              try:
3537                  # body
3538              except type as name:
3539                  try:
3540                      # body
3541                  finally:
3542                      name = None # in case body contains "del name"
3543                      del name
3544            */
3545
3546            /* second try: */
3547            ADDOP_JUMP(c, SETUP_CLEANUP, cleanup_end);
3548            compiler_use_next_block(c, cleanup_body);
3549            if (!compiler_push_fblock(c, HANDLER_CLEANUP, cleanup_body, NULL, handler->v.ExceptHandler.name))
3550                return 0;
3551
3552            /* second # body */
3553            VISIT_SEQ(c, stmt, handler->v.ExceptHandler.body);
3554            compiler_pop_fblock(c, HANDLER_CLEANUP, cleanup_body);
3555            /* name = None; del name; # Mark as artificial */
3556            UNSET_LOC(c);
3557            ADDOP(c, POP_BLOCK);
3558            ADDOP(c, POP_BLOCK);
3559            ADDOP(c, POP_EXCEPT);
3560            ADDOP_LOAD_CONST(c, Py_None);
3561            compiler_nameop(c, handler->v.ExceptHandler.name, Store);
3562            compiler_nameop(c, handler->v.ExceptHandler.name, Del);
3563            ADDOP_JUMP(c, JUMP, end);
3564
3565            /* except: */
3566            compiler_use_next_block(c, cleanup_end);
3567
3568            /* name = None; del name; # Mark as artificial */
3569            UNSET_LOC(c);
3570
3571            ADDOP_LOAD_CONST(c, Py_None);
3572            compiler_nameop(c, handler->v.ExceptHandler.name, Store);
3573            compiler_nameop(c, handler->v.ExceptHandler.name, Del);
3574
3575            ADDOP_I(c, RERAISE, 1);
3576        }
3577        else {
3578            basicblock *cleanup_body;
3579
3580            cleanup_body = compiler_new_block(c);
3581            if (!cleanup_body)
3582                return 0;
3583
3584            ADDOP(c, POP_TOP); /* exc_value */
3585            compiler_use_next_block(c, cleanup_body);
3586            if (!compiler_push_fblock(c, HANDLER_CLEANUP, cleanup_body, NULL, NULL))
3587                return 0;
3588            VISIT_SEQ(c, stmt, handler->v.ExceptHandler.body);
3589            compiler_pop_fblock(c, HANDLER_CLEANUP, cleanup_body);
3590            UNSET_LOC(c);
3591            ADDOP(c, POP_BLOCK);
3592            ADDOP(c, POP_EXCEPT);
3593            ADDOP_JUMP(c, JUMP, end);
3594        }
3595        compiler_use_next_block(c, except);
3596    }
3597    /* Mark as artificial */
3598    UNSET_LOC(c);
3599    compiler_pop_fblock(c, EXCEPTION_HANDLER, NULL);
3600    ADDOP_I(c, RERAISE, 0);
3601    compiler_use_next_block(c, cleanup);
3602    POP_EXCEPT_AND_RERAISE(c);
3603    compiler_use_next_block(c, end);
3604    return 1;
3605}
3606
3607/*
3608   Code generated for "try: S except* E1 as V1: S1 except* E2 as V2: S2 ...":
3609   (The contents of the value stack is shown in [], with the top
3610   at the right; 'tb' is trace-back info, 'val' the exception instance,
3611   and 'typ' the exception's type.)
3612
3613   Value stack                   Label         Instruction     Argument
3614   []                                         SETUP_FINALLY         L1
3615   []                                         <code for S>
3616   []                                         POP_BLOCK
3617   []                                         JUMP                  L0
3618
3619   [exc]                            L1:       COPY 1       )  save copy of the original exception
3620   [orig, exc]                                BUILD_LIST   )  list for raised/reraised excs ("result")
3621   [orig, exc, res]                           SWAP 2
3622
3623   [orig, res, exc]                           <evaluate E1>
3624   [orig, res, exc, E1]                       CHECK_EG_MATCH
3625   [orig, res, rest/exc, match?]              COPY 1
3626   [orig, res, rest/exc, match?, match?]      POP_JUMP_IF_NONE      C1
3627
3628   [orig, res, rest, match]                   <assign to V1>  (or POP if no V1)
3629
3630   [orig, res, rest]                          SETUP_FINALLY         R1
3631   [orig, res, rest]                          <code for S1>
3632   [orig, res, rest]                          JUMP                  L2
3633
3634   [orig, res, rest, i, v]          R1:       LIST_APPEND   3 ) exc raised in except* body - add to res
3635   [orig, res, rest, i]                       POP
3636   [orig, res, rest]                          JUMP                  LE2
3637
3638   [orig, res, rest]                L2:       NOP  ) for lineno
3639   [orig, res, rest]                          JUMP                  LE2
3640
3641   [orig, res, rest/exc, None]      C1:       POP
3642
3643   [orig, res, rest]               LE2:       <evaluate E2>
3644   .............................etc.......................
3645
3646   [orig, res, rest]                Ln+1:     LIST_APPEND 1  ) add unhandled exc to res (could be None)
3647
3648   [orig, res]                                PREP_RERAISE_STAR
3649   [exc]                                      COPY 1
3650   [exc, exc]                                 POP_JUMP_IF_NOT_NONE  RER
3651   [exc]                                      POP_TOP
3652   []                                         JUMP                  L0
3653
3654   [exc]                            RER:      SWAP 2
3655   [exc, prev_exc_info]                       POP_EXCEPT
3656   [exc]                                      RERAISE               0
3657
3658   []                               L0:       <next statement>
3659*/
3660static int
3661compiler_try_star_except(struct compiler *c, stmt_ty s)
3662{
3663    basicblock *body = compiler_new_block(c);
3664    if (body == NULL) {
3665        return 0;
3666    }
3667    basicblock *except = compiler_new_block(c);
3668    if (except == NULL) {
3669        return 0;
3670    }
3671    basicblock *orelse = compiler_new_block(c);
3672     if (orelse == NULL) {
3673        return 0;
3674    }
3675    basicblock *end = compiler_new_block(c);
3676    if (end == NULL) {
3677        return 0;
3678    }
3679    basicblock *cleanup = compiler_new_block(c);
3680    if (cleanup == NULL) {
3681        return 0;
3682    }
3683    basicblock *reraise_star = compiler_new_block(c);
3684    if (reraise_star == NULL) {
3685        return 0;
3686    }
3687
3688    ADDOP_JUMP(c, SETUP_FINALLY, except);
3689    compiler_use_next_block(c, body);
3690    if (!compiler_push_fblock(c, TRY_EXCEPT, body, NULL, NULL)) {
3691        return 0;
3692    }
3693    VISIT_SEQ(c, stmt, s->v.TryStar.body);
3694    compiler_pop_fblock(c, TRY_EXCEPT, body);
3695    ADDOP_NOLINE(c, POP_BLOCK);
3696    ADDOP_JUMP_NOLINE(c, JUMP, orelse);
3697    Py_ssize_t n = asdl_seq_LEN(s->v.TryStar.handlers);
3698    compiler_use_next_block(c, except);
3699
3700    UNSET_LOC(c);
3701    ADDOP_JUMP(c, SETUP_CLEANUP, cleanup);
3702    ADDOP(c, PUSH_EXC_INFO);
3703    /* Runtime will push a block here, so we need to account for that */
3704    if (!compiler_push_fblock(c, EXCEPTION_GROUP_HANDLER,
3705                                 NULL, NULL, "except handler")) {
3706        return 0;
3707    }
3708    for (Py_ssize_t i = 0; i < n; i++) {
3709        excepthandler_ty handler = (excepthandler_ty)asdl_seq_GET(
3710            s->v.TryStar.handlers, i);
3711        SET_LOC(c, handler);
3712        except = compiler_new_block(c);
3713        if (except == NULL) {
3714            return 0;
3715        }
3716        basicblock *except_with_error = compiler_new_block(c);
3717        if (except_with_error == NULL) {
3718            return 0;
3719        }
3720        basicblock *no_match = compiler_new_block(c);
3721        if (no_match == NULL) {
3722            return 0;
3723        }
3724        if (i == 0) {
3725            /* Push the original EG into the stack */
3726            /*
3727               [exc]            COPY 1
3728               [orig, exc]
3729            */
3730            ADDOP_I(c, COPY, 1);
3731
3732            /* create empty list for exceptions raised/reraise in the except* blocks */
3733            /*
3734               [orig, exc]       BUILD_LIST
3735               [orig, exc, []]   SWAP 2
3736               [orig, [], exc]
3737            */
3738            ADDOP_I(c, BUILD_LIST, 0);
3739            ADDOP_I(c, SWAP, 2);
3740        }
3741        if (handler->v.ExceptHandler.type) {
3742            VISIT(c, expr, handler->v.ExceptHandler.type);
3743            ADDOP(c, CHECK_EG_MATCH);
3744            ADDOP_I(c, COPY, 1);
3745            ADDOP_JUMP(c, POP_JUMP_IF_NONE, no_match);
3746        }
3747
3748        basicblock *cleanup_end = compiler_new_block(c);
3749        if (cleanup_end == NULL) {
3750            return 0;
3751        }
3752        basicblock *cleanup_body = compiler_new_block(c);
3753        if (cleanup_body == NULL) {
3754            return 0;
3755        }
3756
3757        if (handler->v.ExceptHandler.name) {
3758            compiler_nameop(c, handler->v.ExceptHandler.name, Store);
3759        }
3760        else {
3761            ADDOP(c, POP_TOP);  // match
3762        }
3763
3764        /*
3765          try:
3766              # body
3767          except type as name:
3768              try:
3769                  # body
3770              finally:
3771                  name = None # in case body contains "del name"
3772                  del name
3773        */
3774        /* second try: */
3775        ADDOP_JUMP(c, SETUP_CLEANUP, cleanup_end);
3776        compiler_use_next_block(c, cleanup_body);
3777        if (!compiler_push_fblock(c, HANDLER_CLEANUP, cleanup_body, NULL, handler->v.ExceptHandler.name))
3778            return 0;
3779
3780        /* second # body */
3781        VISIT_SEQ(c, stmt, handler->v.ExceptHandler.body);
3782        compiler_pop_fblock(c, HANDLER_CLEANUP, cleanup_body);
3783        /* name = None; del name; # Mark as artificial */
3784        UNSET_LOC(c);
3785        ADDOP(c, POP_BLOCK);
3786        if (handler->v.ExceptHandler.name) {
3787            ADDOP_LOAD_CONST(c, Py_None);
3788            compiler_nameop(c, handler->v.ExceptHandler.name, Store);
3789            compiler_nameop(c, handler->v.ExceptHandler.name, Del);
3790        }
3791        ADDOP_JUMP(c, JUMP, except);
3792
3793        /* except: */
3794        compiler_use_next_block(c, cleanup_end);
3795
3796        /* name = None; del name; # Mark as artificial */
3797        UNSET_LOC(c);
3798
3799        if (handler->v.ExceptHandler.name) {
3800            ADDOP_LOAD_CONST(c, Py_None);
3801            compiler_nameop(c, handler->v.ExceptHandler.name, Store);
3802            compiler_nameop(c, handler->v.ExceptHandler.name, Del);
3803        }
3804
3805        /* add exception raised to the res list */
3806        ADDOP_I(c, LIST_APPEND, 3); // exc
3807        ADDOP(c, POP_TOP); // lasti
3808
3809        ADDOP_JUMP(c, JUMP, except_with_error);
3810        compiler_use_next_block(c, except);
3811        ADDOP(c, NOP);  // to hold a propagated location info
3812        ADDOP_JUMP(c, JUMP, except_with_error);
3813        compiler_use_next_block(c, no_match);
3814        ADDOP(c, POP_TOP);  // match (None)
3815
3816        compiler_use_next_block(c, except_with_error);
3817
3818        if (i == n - 1) {
3819            /* Add exc to the list (if not None it's the unhandled part of the EG) */
3820            ADDOP_I(c, LIST_APPEND, 1);
3821            ADDOP_JUMP(c, JUMP, reraise_star);
3822        }
3823    }
3824    /* Mark as artificial */
3825    UNSET_LOC(c);
3826    compiler_pop_fblock(c, EXCEPTION_GROUP_HANDLER, NULL);
3827    basicblock *reraise = compiler_new_block(c);
3828    if (!reraise) {
3829        return 0;
3830    }
3831
3832    compiler_use_next_block(c, reraise_star);
3833    ADDOP(c, PREP_RERAISE_STAR);
3834    ADDOP_I(c, COPY, 1);
3835    ADDOP_JUMP(c, POP_JUMP_IF_NOT_NONE, reraise);
3836
3837    /* Nothing to reraise */
3838    ADDOP(c, POP_TOP);
3839    ADDOP(c, POP_BLOCK);
3840    ADDOP(c, POP_EXCEPT);
3841    ADDOP_JUMP(c, JUMP, end);
3842    compiler_use_next_block(c, reraise);
3843    ADDOP(c, POP_BLOCK);
3844    ADDOP_I(c, SWAP, 2);
3845    ADDOP(c, POP_EXCEPT);
3846    ADDOP_I(c, RERAISE, 0);
3847    compiler_use_next_block(c, cleanup);
3848    POP_EXCEPT_AND_RERAISE(c);
3849    compiler_use_next_block(c, orelse);
3850    VISIT_SEQ(c, stmt, s->v.TryStar.orelse);
3851    compiler_use_next_block(c, end);
3852    return 1;
3853}
3854
3855static int
3856compiler_try(struct compiler *c, stmt_ty s) {
3857    if (s->v.Try.finalbody && asdl_seq_LEN(s->v.Try.finalbody))
3858        return compiler_try_finally(c, s);
3859    else
3860        return compiler_try_except(c, s);
3861}
3862
3863static int
3864compiler_try_star(struct compiler *c, stmt_ty s)
3865{
3866    if (s->v.TryStar.finalbody && asdl_seq_LEN(s->v.TryStar.finalbody)) {
3867        return compiler_try_star_finally(c, s);
3868    }
3869    else {
3870        return compiler_try_star_except(c, s);
3871    }
3872}
3873
3874static int
3875compiler_import_as(struct compiler *c, identifier name, identifier asname)
3876{
3877    /* The IMPORT_NAME opcode was already generated.  This function
3878       merely needs to bind the result to a name.
3879
3880       If there is a dot in name, we need to split it and emit a
3881       IMPORT_FROM for each name.
3882    */
3883    Py_ssize_t len = PyUnicode_GET_LENGTH(name);
3884    Py_ssize_t dot = PyUnicode_FindChar(name, '.', 0, len, 1);
3885    if (dot == -2)
3886        return 0;
3887    if (dot != -1) {
3888        /* Consume the base module name to get the first attribute */
3889        while (1) {
3890            Py_ssize_t pos = dot + 1;
3891            PyObject *attr;
3892            dot = PyUnicode_FindChar(name, '.', pos, len, 1);
3893            if (dot == -2)
3894                return 0;
3895            attr = PyUnicode_Substring(name, pos, (dot != -1) ? dot : len);
3896            if (!attr)
3897                return 0;
3898            ADDOP_N(c, IMPORT_FROM, attr, names);
3899            if (dot == -1) {
3900                break;
3901            }
3902            ADDOP_I(c, SWAP, 2);
3903            ADDOP(c, POP_TOP);
3904        }
3905        if (!compiler_nameop(c, asname, Store)) {
3906            return 0;
3907        }
3908        ADDOP(c, POP_TOP);
3909        return 1;
3910    }
3911    return compiler_nameop(c, asname, Store);
3912}
3913
3914static int
3915compiler_import(struct compiler *c, stmt_ty s)
3916{
3917    /* The Import node stores a module name like a.b.c as a single
3918       string.  This is convenient for all cases except
3919         import a.b.c as d
3920       where we need to parse that string to extract the individual
3921       module names.
3922       XXX Perhaps change the representation to make this case simpler?
3923     */
3924    Py_ssize_t i, n = asdl_seq_LEN(s->v.Import.names);
3925
3926    PyObject *zero = _PyLong_GetZero();  // borrowed reference
3927    for (i = 0; i < n; i++) {
3928        alias_ty alias = (alias_ty)asdl_seq_GET(s->v.Import.names, i);
3929        int r;
3930
3931        ADDOP_LOAD_CONST(c, zero);
3932        ADDOP_LOAD_CONST(c, Py_None);
3933        ADDOP_NAME(c, IMPORT_NAME, alias->name, names);
3934
3935        if (alias->asname) {
3936            r = compiler_import_as(c, alias->name, alias->asname);
3937            if (!r)
3938                return r;
3939        }
3940        else {
3941            identifier tmp = alias->name;
3942            Py_ssize_t dot = PyUnicode_FindChar(
3943                alias->name, '.', 0, PyUnicode_GET_LENGTH(alias->name), 1);
3944            if (dot != -1) {
3945                tmp = PyUnicode_Substring(alias->name, 0, dot);
3946                if (tmp == NULL)
3947                    return 0;
3948            }
3949            r = compiler_nameop(c, tmp, Store);
3950            if (dot != -1) {
3951                Py_DECREF(tmp);
3952            }
3953            if (!r)
3954                return r;
3955        }
3956    }
3957    return 1;
3958}
3959
3960static int
3961compiler_from_import(struct compiler *c, stmt_ty s)
3962{
3963    Py_ssize_t i, n = asdl_seq_LEN(s->v.ImportFrom.names);
3964    PyObject *names;
3965
3966    ADDOP_LOAD_CONST_NEW(c, PyLong_FromLong(s->v.ImportFrom.level));
3967
3968    names = PyTuple_New(n);
3969    if (!names)
3970        return 0;
3971
3972    /* build up the names */
3973    for (i = 0; i < n; i++) {
3974        alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);
3975        Py_INCREF(alias->name);
3976        PyTuple_SET_ITEM(names, i, alias->name);
3977    }
3978
3979    if (s->lineno > c->c_future->ff_lineno && s->v.ImportFrom.module &&
3980        _PyUnicode_EqualToASCIIString(s->v.ImportFrom.module, "__future__")) {
3981        Py_DECREF(names);
3982        return compiler_error(c, "from __future__ imports must occur "
3983                              "at the beginning of the file");
3984    }
3985    ADDOP_LOAD_CONST_NEW(c, names);
3986
3987    if (s->v.ImportFrom.module) {
3988        ADDOP_NAME(c, IMPORT_NAME, s->v.ImportFrom.module, names);
3989    }
3990    else {
3991        _Py_DECLARE_STR(empty, "");
3992        ADDOP_NAME(c, IMPORT_NAME, &_Py_STR(empty), names);
3993    }
3994    for (i = 0; i < n; i++) {
3995        alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);
3996        identifier store_name;
3997
3998        if (i == 0 && PyUnicode_READ_CHAR(alias->name, 0) == '*') {
3999            assert(n == 1);
4000            ADDOP(c, IMPORT_STAR);
4001            return 1;
4002        }
4003
4004        ADDOP_NAME(c, IMPORT_FROM, alias->name, names);
4005        store_name = alias->name;
4006        if (alias->asname)
4007            store_name = alias->asname;
4008
4009        if (!compiler_nameop(c, store_name, Store)) {
4010            return 0;
4011        }
4012    }
4013    /* remove imported module */
4014    ADDOP(c, POP_TOP);
4015    return 1;
4016}
4017
4018static int
4019compiler_assert(struct compiler *c, stmt_ty s)
4020{
4021    basicblock *end;
4022
4023    /* Always emit a warning if the test is a non-zero length tuple */
4024    if ((s->v.Assert.test->kind == Tuple_kind &&
4025        asdl_seq_LEN(s->v.Assert.test->v.Tuple.elts) > 0) ||
4026        (s->v.Assert.test->kind == Constant_kind &&
4027         PyTuple_Check(s->v.Assert.test->v.Constant.value) &&
4028         PyTuple_Size(s->v.Assert.test->v.Constant.value) > 0))
4029    {
4030        if (!compiler_warn(c, "assertion is always true, "
4031                              "perhaps remove parentheses?"))
4032        {
4033            return 0;
4034        }
4035    }
4036    if (c->c_optimize)
4037        return 1;
4038    end = compiler_new_block(c);
4039    if (end == NULL)
4040        return 0;
4041    if (!compiler_jump_if(c, s->v.Assert.test, end, 1))
4042        return 0;
4043    ADDOP(c, LOAD_ASSERTION_ERROR);
4044    if (s->v.Assert.msg) {
4045        VISIT(c, expr, s->v.Assert.msg);
4046        ADDOP_I(c, PRECALL, 0);
4047        ADDOP_I(c, CALL, 0);
4048    }
4049    ADDOP_I(c, RAISE_VARARGS, 1);
4050    compiler_use_next_block(c, end);
4051    return 1;
4052}
4053
4054static int
4055compiler_visit_stmt_expr(struct compiler *c, expr_ty value)
4056{
4057    if (c->c_interactive && c->c_nestlevel <= 1) {
4058        VISIT(c, expr, value);
4059        ADDOP(c, PRINT_EXPR);
4060        return 1;
4061    }
4062
4063    if (value->kind == Constant_kind) {
4064        /* ignore constant statement */
4065        ADDOP(c, NOP);
4066        return 1;
4067    }
4068
4069    VISIT(c, expr, value);
4070    /* Mark POP_TOP as artificial */
4071    UNSET_LOC(c);
4072    ADDOP(c, POP_TOP);
4073    return 1;
4074}
4075
4076static int
4077compiler_visit_stmt(struct compiler *c, stmt_ty s)
4078{
4079    Py_ssize_t i, n;
4080
4081    /* Always assign a lineno to the next instruction for a stmt. */
4082    SET_LOC(c, s);
4083
4084    switch (s->kind) {
4085    case FunctionDef_kind:
4086        return compiler_function(c, s, 0);
4087    case ClassDef_kind:
4088        return compiler_class(c, s);
4089    case Return_kind:
4090        return compiler_return(c, s);
4091    case Delete_kind:
4092        VISIT_SEQ(c, expr, s->v.Delete.targets)
4093        break;
4094    case Assign_kind:
4095        n = asdl_seq_LEN(s->v.Assign.targets);
4096        VISIT(c, expr, s->v.Assign.value);
4097        for (i = 0; i < n; i++) {
4098            if (i < n - 1) {
4099                ADDOP_I(c, COPY, 1);
4100            }
4101            VISIT(c, expr,
4102                  (expr_ty)asdl_seq_GET(s->v.Assign.targets, i));
4103        }
4104        break;
4105    case AugAssign_kind:
4106        return compiler_augassign(c, s);
4107    case AnnAssign_kind:
4108        return compiler_annassign(c, s);
4109    case For_kind:
4110        return compiler_for(c, s);
4111    case While_kind:
4112        return compiler_while(c, s);
4113    case If_kind:
4114        return compiler_if(c, s);
4115    case Match_kind:
4116        return compiler_match(c, s);
4117    case Raise_kind:
4118        n = 0;
4119        if (s->v.Raise.exc) {
4120            VISIT(c, expr, s->v.Raise.exc);
4121            n++;
4122            if (s->v.Raise.cause) {
4123                VISIT(c, expr, s->v.Raise.cause);
4124                n++;
4125            }
4126        }
4127        ADDOP_I(c, RAISE_VARARGS, (int)n);
4128        break;
4129    case Try_kind:
4130        return compiler_try(c, s);
4131    case TryStar_kind:
4132        return compiler_try_star(c, s);
4133    case Assert_kind:
4134        return compiler_assert(c, s);
4135    case Import_kind:
4136        return compiler_import(c, s);
4137    case ImportFrom_kind:
4138        return compiler_from_import(c, s);
4139    case Global_kind:
4140    case Nonlocal_kind:
4141        break;
4142    case Expr_kind:
4143        return compiler_visit_stmt_expr(c, s->v.Expr.value);
4144    case Pass_kind:
4145        ADDOP(c, NOP);
4146        break;
4147    case Break_kind:
4148        return compiler_break(c);
4149    case Continue_kind:
4150        return compiler_continue(c);
4151    case With_kind:
4152        return compiler_with(c, s, 0);
4153    case AsyncFunctionDef_kind:
4154        return compiler_function(c, s, 1);
4155    case AsyncWith_kind:
4156        return compiler_async_with(c, s, 0);
4157    case AsyncFor_kind:
4158        return compiler_async_for(c, s);
4159    }
4160
4161    return 1;
4162}
4163
4164static int
4165unaryop(unaryop_ty op)
4166{
4167    switch (op) {
4168    case Invert:
4169        return UNARY_INVERT;
4170    case Not:
4171        return UNARY_NOT;
4172    case UAdd:
4173        return UNARY_POSITIVE;
4174    case USub:
4175        return UNARY_NEGATIVE;
4176    default:
4177        PyErr_Format(PyExc_SystemError,
4178            "unary op %d should not be possible", op);
4179        return 0;
4180    }
4181}
4182
4183static int
4184addop_binary(struct compiler *c, operator_ty binop, bool inplace)
4185{
4186    int oparg;
4187    switch (binop) {
4188        case Add:
4189            oparg = inplace ? NB_INPLACE_ADD : NB_ADD;
4190            break;
4191        case Sub:
4192            oparg = inplace ? NB_INPLACE_SUBTRACT : NB_SUBTRACT;
4193            break;
4194        case Mult:
4195            oparg = inplace ? NB_INPLACE_MULTIPLY : NB_MULTIPLY;
4196            break;
4197        case MatMult:
4198            oparg = inplace ? NB_INPLACE_MATRIX_MULTIPLY : NB_MATRIX_MULTIPLY;
4199            break;
4200        case Div:
4201            oparg = inplace ? NB_INPLACE_TRUE_DIVIDE : NB_TRUE_DIVIDE;
4202            break;
4203        case Mod:
4204            oparg = inplace ? NB_INPLACE_REMAINDER : NB_REMAINDER;
4205            break;
4206        case Pow:
4207            oparg = inplace ? NB_INPLACE_POWER : NB_POWER;
4208            break;
4209        case LShift:
4210            oparg = inplace ? NB_INPLACE_LSHIFT : NB_LSHIFT;
4211            break;
4212        case RShift:
4213            oparg = inplace ? NB_INPLACE_RSHIFT : NB_RSHIFT;
4214            break;
4215        case BitOr:
4216            oparg = inplace ? NB_INPLACE_OR : NB_OR;
4217            break;
4218        case BitXor:
4219            oparg = inplace ? NB_INPLACE_XOR : NB_XOR;
4220            break;
4221        case BitAnd:
4222            oparg = inplace ? NB_INPLACE_AND : NB_AND;
4223            break;
4224        case FloorDiv:
4225            oparg = inplace ? NB_INPLACE_FLOOR_DIVIDE : NB_FLOOR_DIVIDE;
4226            break;
4227        default:
4228            PyErr_Format(PyExc_SystemError, "%s op %d should not be possible",
4229                         inplace ? "inplace" : "binary", binop);
4230            return 0;
4231    }
4232    ADDOP_I(c, BINARY_OP, oparg);
4233    return 1;
4234}
4235
4236
4237static int
4238addop_yield(struct compiler *c) {
4239    if (c->u->u_ste->ste_generator && c->u->u_ste->ste_coroutine) {
4240        ADDOP(c, ASYNC_GEN_WRAP);
4241    }
4242    ADDOP(c, YIELD_VALUE);
4243    ADDOP_I(c, RESUME, 1);
4244    return 1;
4245}
4246
4247static int
4248compiler_nameop(struct compiler *c, identifier name, expr_context_ty ctx)
4249{
4250    int op, scope;
4251    Py_ssize_t arg;
4252    enum { OP_FAST, OP_GLOBAL, OP_DEREF, OP_NAME } optype;
4253
4254    PyObject *dict = c->u->u_names;
4255    PyObject *mangled;
4256
4257    assert(!_PyUnicode_EqualToASCIIString(name, "None") &&
4258           !_PyUnicode_EqualToASCIIString(name, "True") &&
4259           !_PyUnicode_EqualToASCIIString(name, "False"));
4260
4261    if (forbidden_name(c, name, ctx))
4262        return 0;
4263
4264    mangled = _Py_Mangle(c->u->u_private, name);
4265    if (!mangled)
4266        return 0;
4267
4268    op = 0;
4269    optype = OP_NAME;
4270    scope = _PyST_GetScope(c->u->u_ste, mangled);
4271    switch (scope) {
4272    case FREE:
4273        dict = c->u->u_freevars;
4274        optype = OP_DEREF;
4275        break;
4276    case CELL:
4277        dict = c->u->u_cellvars;
4278        optype = OP_DEREF;
4279        break;
4280    case LOCAL:
4281        if (c->u->u_ste->ste_type == FunctionBlock)
4282            optype = OP_FAST;
4283        break;
4284    case GLOBAL_IMPLICIT:
4285        if (c->u->u_ste->ste_type == FunctionBlock)
4286            optype = OP_GLOBAL;
4287        break;
4288    case GLOBAL_EXPLICIT:
4289        optype = OP_GLOBAL;
4290        break;
4291    default:
4292        /* scope can be 0 */
4293        break;
4294    }
4295
4296    /* XXX Leave assert here, but handle __doc__ and the like better */
4297    assert(scope || PyUnicode_READ_CHAR(name, 0) == '_');
4298
4299    switch (optype) {
4300    case OP_DEREF:
4301        switch (ctx) {
4302        case Load:
4303            op = (c->u->u_ste->ste_type == ClassBlock) ? LOAD_CLASSDEREF : LOAD_DEREF;
4304            break;
4305        case Store: op = STORE_DEREF; break;
4306        case Del: op = DELETE_DEREF; break;
4307        }
4308        break;
4309    case OP_FAST:
4310        switch (ctx) {
4311        case Load: op = LOAD_FAST; break;
4312        case Store: op = STORE_FAST; break;
4313        case Del: op = DELETE_FAST; break;
4314        }
4315        ADDOP_N(c, op, mangled, varnames);
4316        return 1;
4317    case OP_GLOBAL:
4318        switch (ctx) {
4319        case Load: op = LOAD_GLOBAL; break;
4320        case Store: op = STORE_GLOBAL; break;
4321        case Del: op = DELETE_GLOBAL; break;
4322        }
4323        break;
4324    case OP_NAME:
4325        switch (ctx) {
4326        case Load: op = LOAD_NAME; break;
4327        case Store: op = STORE_NAME; break;
4328        case Del: op = DELETE_NAME; break;
4329        }
4330        break;
4331    }
4332
4333    assert(op);
4334    arg = compiler_add_o(dict, mangled);
4335    Py_DECREF(mangled);
4336    if (arg < 0) {
4337        return 0;
4338    }
4339    if (op == LOAD_GLOBAL) {
4340        arg <<= 1;
4341    }
4342    return compiler_addop_i(c, op, arg);
4343}
4344
4345static int
4346compiler_boolop(struct compiler *c, expr_ty e)
4347{
4348    basicblock *end;
4349    int jumpi;
4350    Py_ssize_t i, n;
4351    asdl_expr_seq *s;
4352
4353    assert(e->kind == BoolOp_kind);
4354    if (e->v.BoolOp.op == And)
4355        jumpi = JUMP_IF_FALSE_OR_POP;
4356    else
4357        jumpi = JUMP_IF_TRUE_OR_POP;
4358    end = compiler_new_block(c);
4359    if (end == NULL)
4360        return 0;
4361    s = e->v.BoolOp.values;
4362    n = asdl_seq_LEN(s) - 1;
4363    assert(n >= 0);
4364    for (i = 0; i < n; ++i) {
4365        VISIT(c, expr, (expr_ty)asdl_seq_GET(s, i));
4366        ADDOP_JUMP(c, jumpi, end);
4367        basicblock *next = compiler_new_block(c);
4368        if (next == NULL) {
4369            return 0;
4370        }
4371        compiler_use_next_block(c, next);
4372    }
4373    VISIT(c, expr, (expr_ty)asdl_seq_GET(s, n));
4374    compiler_use_next_block(c, end);
4375    return 1;
4376}
4377
4378static int
4379starunpack_helper(struct compiler *c, asdl_expr_seq *elts, int pushed,
4380                  int build, int add, int extend, int tuple)
4381{
4382    Py_ssize_t n = asdl_seq_LEN(elts);
4383    if (n > 2 && are_all_items_const(elts, 0, n)) {
4384        PyObject *folded = PyTuple_New(n);
4385        if (folded == NULL) {
4386            return 0;
4387        }
4388        PyObject *val;
4389        for (Py_ssize_t i = 0; i < n; i++) {
4390            val = ((expr_ty)asdl_seq_GET(elts, i))->v.Constant.value;
4391            Py_INCREF(val);
4392            PyTuple_SET_ITEM(folded, i, val);
4393        }
4394        if (tuple && !pushed) {
4395            ADDOP_LOAD_CONST_NEW(c, folded);
4396        } else {
4397            if (add == SET_ADD) {
4398                Py_SETREF(folded, PyFrozenSet_New(folded));
4399                if (folded == NULL) {
4400                    return 0;
4401                }
4402            }
4403            ADDOP_I(c, build, pushed);
4404            ADDOP_LOAD_CONST_NEW(c, folded);
4405            ADDOP_I(c, extend, 1);
4406            if (tuple) {
4407                ADDOP(c, LIST_TO_TUPLE);
4408            }
4409        }
4410        return 1;
4411    }
4412
4413    int big = n+pushed > STACK_USE_GUIDELINE;
4414    int seen_star = 0;
4415    for (Py_ssize_t i = 0; i < n; i++) {
4416        expr_ty elt = asdl_seq_GET(elts, i);
4417        if (elt->kind == Starred_kind) {
4418            seen_star = 1;
4419        }
4420    }
4421    if (!seen_star && !big) {
4422        for (Py_ssize_t i = 0; i < n; i++) {
4423            expr_ty elt = asdl_seq_GET(elts, i);
4424            VISIT(c, expr, elt);
4425        }
4426        if (tuple) {
4427            ADDOP_I(c, BUILD_TUPLE, n+pushed);
4428        } else {
4429            ADDOP_I(c, build, n+pushed);
4430        }
4431        return 1;
4432    }
4433    int sequence_built = 0;
4434    if (big) {
4435        ADDOP_I(c, build, pushed);
4436        sequence_built = 1;
4437    }
4438    for (Py_ssize_t i = 0; i < n; i++) {
4439        expr_ty elt = asdl_seq_GET(elts, i);
4440        if (elt->kind == Starred_kind) {
4441            if (sequence_built == 0) {
4442                ADDOP_I(c, build, i+pushed);
4443                sequence_built = 1;
4444            }
4445            VISIT(c, expr, elt->v.Starred.value);
4446            ADDOP_I(c, extend, 1);
4447        }
4448        else {
4449            VISIT(c, expr, elt);
4450            if (sequence_built) {
4451                ADDOP_I(c, add, 1);
4452            }
4453        }
4454    }
4455    assert(sequence_built);
4456    if (tuple) {
4457        ADDOP(c, LIST_TO_TUPLE);
4458    }
4459    return 1;
4460}
4461
4462static int
4463unpack_helper(struct compiler *c, asdl_expr_seq *elts)
4464{
4465    Py_ssize_t n = asdl_seq_LEN(elts);
4466    int seen_star = 0;
4467    for (Py_ssize_t i = 0; i < n; i++) {
4468        expr_ty elt = asdl_seq_GET(elts, i);
4469        if (elt->kind == Starred_kind && !seen_star) {
4470            if ((i >= (1 << 8)) ||
4471                (n-i-1 >= (INT_MAX >> 8)))
4472                return compiler_error(c,
4473                    "too many expressions in "
4474                    "star-unpacking assignment");
4475            ADDOP_I(c, UNPACK_EX, (i + ((n-i-1) << 8)));
4476            seen_star = 1;
4477        }
4478        else if (elt->kind == Starred_kind) {
4479            return compiler_error(c,
4480                "multiple starred expressions in assignment");
4481        }
4482    }
4483    if (!seen_star) {
4484        ADDOP_I(c, UNPACK_SEQUENCE, n);
4485    }
4486    return 1;
4487}
4488
4489static int
4490assignment_helper(struct compiler *c, asdl_expr_seq *elts)
4491{
4492    Py_ssize_t n = asdl_seq_LEN(elts);
4493    RETURN_IF_FALSE(unpack_helper(c, elts));
4494    for (Py_ssize_t i = 0; i < n; i++) {
4495        expr_ty elt = asdl_seq_GET(elts, i);
4496        VISIT(c, expr, elt->kind != Starred_kind ? elt : elt->v.Starred.value);
4497    }
4498    return 1;
4499}
4500
4501static int
4502compiler_list(struct compiler *c, expr_ty e)
4503{
4504    asdl_expr_seq *elts = e->v.List.elts;
4505    if (e->v.List.ctx == Store) {
4506        return assignment_helper(c, elts);
4507    }
4508    else if (e->v.List.ctx == Load) {
4509        return starunpack_helper(c, elts, 0, BUILD_LIST,
4510                                 LIST_APPEND, LIST_EXTEND, 0);
4511    }
4512    else
4513        VISIT_SEQ(c, expr, elts);
4514    return 1;
4515}
4516
4517static int
4518compiler_tuple(struct compiler *c, expr_ty e)
4519{
4520    asdl_expr_seq *elts = e->v.Tuple.elts;
4521    if (e->v.Tuple.ctx == Store) {
4522        return assignment_helper(c, elts);
4523    }
4524    else if (e->v.Tuple.ctx == Load) {
4525        return starunpack_helper(c, elts, 0, BUILD_LIST,
4526                                 LIST_APPEND, LIST_EXTEND, 1);
4527    }
4528    else
4529        VISIT_SEQ(c, expr, elts);
4530    return 1;
4531}
4532
4533static int
4534compiler_set(struct compiler *c, expr_ty e)
4535{
4536    return starunpack_helper(c, e->v.Set.elts, 0, BUILD_SET,
4537                             SET_ADD, SET_UPDATE, 0);
4538}
4539
4540static int
4541are_all_items_const(asdl_expr_seq *seq, Py_ssize_t begin, Py_ssize_t end)
4542{
4543    Py_ssize_t i;
4544    for (i = begin; i < end; i++) {
4545        expr_ty key = (expr_ty)asdl_seq_GET(seq, i);
4546        if (key == NULL || key->kind != Constant_kind)
4547            return 0;
4548    }
4549    return 1;
4550}
4551
4552static int
4553compiler_subdict(struct compiler *c, expr_ty e, Py_ssize_t begin, Py_ssize_t end)
4554{
4555    Py_ssize_t i, n = end - begin;
4556    PyObject *keys, *key;
4557    int big = n*2 > STACK_USE_GUIDELINE;
4558    if (n > 1 && !big && are_all_items_const(e->v.Dict.keys, begin, end)) {
4559        for (i = begin; i < end; i++) {
4560            VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Dict.values, i));
4561        }
4562        keys = PyTuple_New(n);
4563        if (keys == NULL) {
4564            return 0;
4565        }
4566        for (i = begin; i < end; i++) {
4567            key = ((expr_ty)asdl_seq_GET(e->v.Dict.keys, i))->v.Constant.value;
4568            Py_INCREF(key);
4569            PyTuple_SET_ITEM(keys, i - begin, key);
4570        }
4571        ADDOP_LOAD_CONST_NEW(c, keys);
4572        ADDOP_I(c, BUILD_CONST_KEY_MAP, n);
4573        return 1;
4574    }
4575    if (big) {
4576        ADDOP_I(c, BUILD_MAP, 0);
4577    }
4578    for (i = begin; i < end; i++) {
4579        VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Dict.keys, i));
4580        VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Dict.values, i));
4581        if (big) {
4582            ADDOP_I(c, MAP_ADD, 1);
4583        }
4584    }
4585    if (!big) {
4586        ADDOP_I(c, BUILD_MAP, n);
4587    }
4588    return 1;
4589}
4590
4591static int
4592compiler_dict(struct compiler *c, expr_ty e)
4593{
4594    Py_ssize_t i, n, elements;
4595    int have_dict;
4596    int is_unpacking = 0;
4597    n = asdl_seq_LEN(e->v.Dict.values);
4598    have_dict = 0;
4599    elements = 0;
4600    for (i = 0; i < n; i++) {
4601        is_unpacking = (expr_ty)asdl_seq_GET(e->v.Dict.keys, i) == NULL;
4602        if (is_unpacking) {
4603            if (elements) {
4604                if (!compiler_subdict(c, e, i - elements, i)) {
4605                    return 0;
4606                }
4607                if (have_dict) {
4608                    ADDOP_I(c, DICT_UPDATE, 1);
4609                }
4610                have_dict = 1;
4611                elements = 0;
4612            }
4613            if (have_dict == 0) {
4614                ADDOP_I(c, BUILD_MAP, 0);
4615                have_dict = 1;
4616            }
4617            VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Dict.values, i));
4618            ADDOP_I(c, DICT_UPDATE, 1);
4619        }
4620        else {
4621            if (elements*2 > STACK_USE_GUIDELINE) {
4622                if (!compiler_subdict(c, e, i - elements, i + 1)) {
4623                    return 0;
4624                }
4625                if (have_dict) {
4626                    ADDOP_I(c, DICT_UPDATE, 1);
4627                }
4628                have_dict = 1;
4629                elements = 0;
4630            }
4631            else {
4632                elements++;
4633            }
4634        }
4635    }
4636    if (elements) {
4637        if (!compiler_subdict(c, e, n - elements, n)) {
4638            return 0;
4639        }
4640        if (have_dict) {
4641            ADDOP_I(c, DICT_UPDATE, 1);
4642        }
4643        have_dict = 1;
4644    }
4645    if (!have_dict) {
4646        ADDOP_I(c, BUILD_MAP, 0);
4647    }
4648    return 1;
4649}
4650
4651static int
4652compiler_compare(struct compiler *c, expr_ty e)
4653{
4654    Py_ssize_t i, n;
4655
4656    if (!check_compare(c, e)) {
4657        return 0;
4658    }
4659    VISIT(c, expr, e->v.Compare.left);
4660    assert(asdl_seq_LEN(e->v.Compare.ops) > 0);
4661    n = asdl_seq_LEN(e->v.Compare.ops) - 1;
4662    if (n == 0) {
4663        VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, 0));
4664        ADDOP_COMPARE(c, asdl_seq_GET(e->v.Compare.ops, 0));
4665    }
4666    else {
4667        basicblock *cleanup = compiler_new_block(c);
4668        if (cleanup == NULL)
4669            return 0;
4670        for (i = 0; i < n; i++) {
4671            VISIT(c, expr,
4672                (expr_ty)asdl_seq_GET(e->v.Compare.comparators, i));
4673            ADDOP_I(c, SWAP, 2);
4674            ADDOP_I(c, COPY, 2);
4675            ADDOP_COMPARE(c, asdl_seq_GET(e->v.Compare.ops, i));
4676            ADDOP_JUMP(c, JUMP_IF_FALSE_OR_POP, cleanup);
4677        }
4678        VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, n));
4679        ADDOP_COMPARE(c, asdl_seq_GET(e->v.Compare.ops, n));
4680        basicblock *end = compiler_new_block(c);
4681        if (end == NULL)
4682            return 0;
4683        ADDOP_JUMP_NOLINE(c, JUMP, end);
4684        compiler_use_next_block(c, cleanup);
4685        ADDOP_I(c, SWAP, 2);
4686        ADDOP(c, POP_TOP);
4687        compiler_use_next_block(c, end);
4688    }
4689    return 1;
4690}
4691
4692static PyTypeObject *
4693infer_type(expr_ty e)
4694{
4695    switch (e->kind) {
4696    case Tuple_kind:
4697        return &PyTuple_Type;
4698    case List_kind:
4699    case ListComp_kind:
4700        return &PyList_Type;
4701    case Dict_kind:
4702    case DictComp_kind:
4703        return &PyDict_Type;
4704    case Set_kind:
4705    case SetComp_kind:
4706        return &PySet_Type;
4707    case GeneratorExp_kind:
4708        return &PyGen_Type;
4709    case Lambda_kind:
4710        return &PyFunction_Type;
4711    case JoinedStr_kind:
4712    case FormattedValue_kind:
4713        return &PyUnicode_Type;
4714    case Constant_kind:
4715        return Py_TYPE(e->v.Constant.value);
4716    default:
4717        return NULL;
4718    }
4719}
4720
4721static int
4722check_caller(struct compiler *c, expr_ty e)
4723{
4724    switch (e->kind) {
4725    case Constant_kind:
4726    case Tuple_kind:
4727    case List_kind:
4728    case ListComp_kind:
4729    case Dict_kind:
4730    case DictComp_kind:
4731    case Set_kind:
4732    case SetComp_kind:
4733    case GeneratorExp_kind:
4734    case JoinedStr_kind:
4735    case FormattedValue_kind:
4736        return compiler_warn(c, "'%.200s' object is not callable; "
4737                                "perhaps you missed a comma?",
4738                                infer_type(e)->tp_name);
4739    default:
4740        return 1;
4741    }
4742}
4743
4744static int
4745check_subscripter(struct compiler *c, expr_ty e)
4746{
4747    PyObject *v;
4748
4749    switch (e->kind) {
4750    case Constant_kind:
4751        v = e->v.Constant.value;
4752        if (!(v == Py_None || v == Py_Ellipsis ||
4753              PyLong_Check(v) || PyFloat_Check(v) || PyComplex_Check(v) ||
4754              PyAnySet_Check(v)))
4755        {
4756            return 1;
4757        }
4758        /* fall through */
4759    case Set_kind:
4760    case SetComp_kind:
4761    case GeneratorExp_kind:
4762    case Lambda_kind:
4763        return compiler_warn(c, "'%.200s' object is not subscriptable; "
4764                                "perhaps you missed a comma?",
4765                                infer_type(e)->tp_name);
4766    default:
4767        return 1;
4768    }
4769}
4770
4771static int
4772check_index(struct compiler *c, expr_ty e, expr_ty s)
4773{
4774    PyObject *v;
4775
4776    PyTypeObject *index_type = infer_type(s);
4777    if (index_type == NULL
4778        || PyType_FastSubclass(index_type, Py_TPFLAGS_LONG_SUBCLASS)
4779        || index_type == &PySlice_Type) {
4780        return 1;
4781    }
4782
4783    switch (e->kind) {
4784    case Constant_kind:
4785        v = e->v.Constant.value;
4786        if (!(PyUnicode_Check(v) || PyBytes_Check(v) || PyTuple_Check(v))) {
4787            return 1;
4788        }
4789        /* fall through */
4790    case Tuple_kind:
4791    case List_kind:
4792    case ListComp_kind:
4793    case JoinedStr_kind:
4794    case FormattedValue_kind:
4795        return compiler_warn(c, "%.200s indices must be integers or slices, "
4796                                "not %.200s; "
4797                                "perhaps you missed a comma?",
4798                                infer_type(e)->tp_name,
4799                                index_type->tp_name);
4800    default:
4801        return 1;
4802    }
4803}
4804
4805static int
4806is_import_originated(struct compiler *c, expr_ty e)
4807{
4808    /* Check whether the global scope has an import named
4809     e, if it is a Name object. For not traversing all the
4810     scope stack every time this function is called, it will
4811     only check the global scope to determine whether something
4812     is imported or not. */
4813
4814    if (e->kind != Name_kind) {
4815        return 0;
4816    }
4817
4818    long flags = _PyST_GetSymbol(c->c_st->st_top, e->v.Name.id);
4819    return flags & DEF_IMPORT;
4820}
4821
4822// If an attribute access spans multiple lines, update the current start
4823// location to point to the attribute name.
4824static void
4825update_start_location_to_match_attr(struct compiler *c, expr_ty attr)
4826{
4827    assert(attr->kind == Attribute_kind);
4828    if (c->u->u_lineno != attr->end_lineno) {
4829        c->u->u_lineno = attr->end_lineno;
4830        int len = (int)PyUnicode_GET_LENGTH(attr->v.Attribute.attr);
4831        if (len <= attr->end_col_offset) {
4832            c->u->u_col_offset = attr->end_col_offset - len;
4833        }
4834        else {
4835            // GH-94694: Somebody's compiling weird ASTs. Just drop the columns:
4836            c->u->u_col_offset = -1;
4837            c->u->u_end_col_offset = -1;
4838        }
4839        // Make sure the end position still follows the start position, even for
4840        // weird ASTs:
4841        c->u->u_end_lineno = Py_MAX(c->u->u_lineno, c->u->u_end_lineno);
4842        if (c->u->u_lineno == c->u->u_end_lineno) {
4843            c->u->u_end_col_offset = Py_MAX(c->u->u_col_offset,
4844                                            c->u->u_end_col_offset);
4845        }
4846    }
4847}
4848
4849// Return 1 if the method call was optimized, -1 if not, and 0 on error.
4850static int
4851maybe_optimize_method_call(struct compiler *c, expr_ty e)
4852{
4853    Py_ssize_t argsl, i, kwdsl;
4854    expr_ty meth = e->v.Call.func;
4855    asdl_expr_seq *args = e->v.Call.args;
4856    asdl_keyword_seq *kwds = e->v.Call.keywords;
4857
4858    /* Check that the call node is an attribute access */
4859    if (meth->kind != Attribute_kind || meth->v.Attribute.ctx != Load) {
4860        return -1;
4861    }
4862
4863    /* Check that the base object is not something that is imported */
4864    if (is_import_originated(c, meth->v.Attribute.value)) {
4865        return -1;
4866    }
4867
4868    /* Check that there aren't too many arguments */
4869    argsl = asdl_seq_LEN(args);
4870    kwdsl = asdl_seq_LEN(kwds);
4871    if (argsl + kwdsl + (kwdsl != 0) >= STACK_USE_GUIDELINE) {
4872        return -1;
4873    }
4874    /* Check that there are no *varargs types of arguments. */
4875    for (i = 0; i < argsl; i++) {
4876        expr_ty elt = asdl_seq_GET(args, i);
4877        if (elt->kind == Starred_kind) {
4878            return -1;
4879        }
4880    }
4881
4882    for (i = 0; i < kwdsl; i++) {
4883        keyword_ty kw = asdl_seq_GET(kwds, i);
4884        if (kw->arg == NULL) {
4885            return -1;
4886        }
4887    }
4888    /* Alright, we can optimize the code. */
4889    VISIT(c, expr, meth->v.Attribute.value);
4890    SET_LOC(c, meth);
4891    update_start_location_to_match_attr(c, meth);
4892    ADDOP_NAME(c, LOAD_METHOD, meth->v.Attribute.attr, names);
4893    VISIT_SEQ(c, expr, e->v.Call.args);
4894
4895    if (kwdsl) {
4896        VISIT_SEQ(c, keyword, kwds);
4897        if (!compiler_call_simple_kw_helper(c, kwds, kwdsl)) {
4898            return 0;
4899        };
4900    }
4901    SET_LOC(c, e);
4902    update_start_location_to_match_attr(c, meth);
4903    ADDOP_I(c, PRECALL, argsl + kwdsl);
4904    ADDOP_I(c, CALL, argsl + kwdsl);
4905    return 1;
4906}
4907
4908static int
4909validate_keywords(struct compiler *c, asdl_keyword_seq *keywords)
4910{
4911    Py_ssize_t nkeywords = asdl_seq_LEN(keywords);
4912    for (Py_ssize_t i = 0; i < nkeywords; i++) {
4913        keyword_ty key = ((keyword_ty)asdl_seq_GET(keywords, i));
4914        if (key->arg == NULL) {
4915            continue;
4916        }
4917        if (forbidden_name(c, key->arg, Store)) {
4918            return -1;
4919        }
4920        for (Py_ssize_t j = i + 1; j < nkeywords; j++) {
4921            keyword_ty other = ((keyword_ty)asdl_seq_GET(keywords, j));
4922            if (other->arg && !PyUnicode_Compare(key->arg, other->arg)) {
4923                SET_LOC(c, other);
4924                compiler_error(c, "keyword argument repeated: %U", key->arg);
4925                return -1;
4926            }
4927        }
4928    }
4929    return 0;
4930}
4931
4932static int
4933compiler_call(struct compiler *c, expr_ty e)
4934{
4935    if (validate_keywords(c, e->v.Call.keywords) == -1) {
4936        return 0;
4937    }
4938    int ret = maybe_optimize_method_call(c, e);
4939    if (ret >= 0) {
4940        return ret;
4941    }
4942    if (!check_caller(c, e->v.Call.func)) {
4943        return 0;
4944    }
4945    SET_LOC(c, e->v.Call.func);
4946    ADDOP(c, PUSH_NULL);
4947    SET_LOC(c, e);
4948    VISIT(c, expr, e->v.Call.func);
4949    return compiler_call_helper(c, 0,
4950                                e->v.Call.args,
4951                                e->v.Call.keywords);
4952}
4953
4954static int
4955compiler_joined_str(struct compiler *c, expr_ty e)
4956{
4957
4958    Py_ssize_t value_count = asdl_seq_LEN(e->v.JoinedStr.values);
4959    if (value_count > STACK_USE_GUIDELINE) {
4960        _Py_DECLARE_STR(empty, "");
4961        ADDOP_LOAD_CONST_NEW(c, Py_NewRef(&_Py_STR(empty)));
4962        ADDOP_NAME(c, LOAD_METHOD, &_Py_ID(join), names);
4963        ADDOP_I(c, BUILD_LIST, 0);
4964        for (Py_ssize_t i = 0; i < asdl_seq_LEN(e->v.JoinedStr.values); i++) {
4965            VISIT(c, expr, asdl_seq_GET(e->v.JoinedStr.values, i));
4966            ADDOP_I(c, LIST_APPEND, 1);
4967        }
4968        ADDOP_I(c, PRECALL, 1);
4969        ADDOP_I(c, CALL, 1);
4970    }
4971    else {
4972        VISIT_SEQ(c, expr, e->v.JoinedStr.values);
4973        if (asdl_seq_LEN(e->v.JoinedStr.values) != 1) {
4974            ADDOP_I(c, BUILD_STRING, asdl_seq_LEN(e->v.JoinedStr.values));
4975        }
4976    }
4977    return 1;
4978}
4979
4980/* Used to implement f-strings. Format a single value. */
4981static int
4982compiler_formatted_value(struct compiler *c, expr_ty e)
4983{
4984    /* Our oparg encodes 2 pieces of information: the conversion
4985       character, and whether or not a format_spec was provided.
4986
4987       Convert the conversion char to 3 bits:
4988           : 000  0x0  FVC_NONE   The default if nothing specified.
4989       !s  : 001  0x1  FVC_STR
4990       !r  : 010  0x2  FVC_REPR
4991       !a  : 011  0x3  FVC_ASCII
4992
4993       next bit is whether or not we have a format spec:
4994       yes : 100  0x4
4995       no  : 000  0x0
4996    */
4997
4998    int conversion = e->v.FormattedValue.conversion;
4999    int oparg;
5000
5001    /* The expression to be formatted. */
5002    VISIT(c, expr, e->v.FormattedValue.value);
5003
5004    switch (conversion) {
5005    case 's': oparg = FVC_STR;   break;
5006    case 'r': oparg = FVC_REPR;  break;
5007    case 'a': oparg = FVC_ASCII; break;
5008    case -1:  oparg = FVC_NONE;  break;
5009    default:
5010        PyErr_Format(PyExc_SystemError,
5011                     "Unrecognized conversion character %d", conversion);
5012        return 0;
5013    }
5014    if (e->v.FormattedValue.format_spec) {
5015        /* Evaluate the format spec, and update our opcode arg. */
5016        VISIT(c, expr, e->v.FormattedValue.format_spec);
5017        oparg |= FVS_HAVE_SPEC;
5018    }
5019
5020    /* And push our opcode and oparg */
5021    ADDOP_I(c, FORMAT_VALUE, oparg);
5022
5023    return 1;
5024}
5025
5026static int
5027compiler_subkwargs(struct compiler *c, asdl_keyword_seq *keywords, Py_ssize_t begin, Py_ssize_t end)
5028{
5029    Py_ssize_t i, n = end - begin;
5030    keyword_ty kw;
5031    PyObject *keys, *key;
5032    assert(n > 0);
5033    int big = n*2 > STACK_USE_GUIDELINE;
5034    if (n > 1 && !big) {
5035        for (i = begin; i < end; i++) {
5036            kw = asdl_seq_GET(keywords, i);
5037            VISIT(c, expr, kw->value);
5038        }
5039        keys = PyTuple_New(n);
5040        if (keys == NULL) {
5041            return 0;
5042        }
5043        for (i = begin; i < end; i++) {
5044            key = ((keyword_ty) asdl_seq_GET(keywords, i))->arg;
5045            Py_INCREF(key);
5046            PyTuple_SET_ITEM(keys, i - begin, key);
5047        }
5048        ADDOP_LOAD_CONST_NEW(c, keys);
5049        ADDOP_I(c, BUILD_CONST_KEY_MAP, n);
5050        return 1;
5051    }
5052    if (big) {
5053        ADDOP_I_NOLINE(c, BUILD_MAP, 0);
5054    }
5055    for (i = begin; i < end; i++) {
5056        kw = asdl_seq_GET(keywords, i);
5057        ADDOP_LOAD_CONST(c, kw->arg);
5058        VISIT(c, expr, kw->value);
5059        if (big) {
5060            ADDOP_I_NOLINE(c, MAP_ADD, 1);
5061        }
5062    }
5063    if (!big) {
5064        ADDOP_I(c, BUILD_MAP, n);
5065    }
5066    return 1;
5067}
5068
5069/* Used by compiler_call_helper and maybe_optimize_method_call to emit
5070 * KW_NAMES before CALL.
5071 * Returns 1 on success, 0 on error.
5072 */
5073static int
5074compiler_call_simple_kw_helper(struct compiler *c,
5075                               asdl_keyword_seq *keywords,
5076                               Py_ssize_t nkwelts)
5077{
5078    PyObject *names;
5079    names = PyTuple_New(nkwelts);
5080    if (names == NULL) {
5081        return 0;
5082    }
5083    for (int i = 0; i < nkwelts; i++) {
5084        keyword_ty kw = asdl_seq_GET(keywords, i);
5085        Py_INCREF(kw->arg);
5086        PyTuple_SET_ITEM(names, i, kw->arg);
5087    }
5088    Py_ssize_t arg = compiler_add_const(c, names);
5089    if (arg < 0) {
5090        return 0;
5091    }
5092    Py_DECREF(names);
5093    ADDOP_I(c, KW_NAMES, arg);
5094    return 1;
5095}
5096
5097
5098/* shared code between compiler_call and compiler_class */
5099static int
5100compiler_call_helper(struct compiler *c,
5101                     int n, /* Args already pushed */
5102                     asdl_expr_seq *args,
5103                     asdl_keyword_seq *keywords)
5104{
5105    Py_ssize_t i, nseen, nelts, nkwelts;
5106
5107    if (validate_keywords(c, keywords) == -1) {
5108        return 0;
5109    }
5110
5111    nelts = asdl_seq_LEN(args);
5112    nkwelts = asdl_seq_LEN(keywords);
5113
5114    if (nelts + nkwelts*2 > STACK_USE_GUIDELINE) {
5115         goto ex_call;
5116    }
5117    for (i = 0; i < nelts; i++) {
5118        expr_ty elt = asdl_seq_GET(args, i);
5119        if (elt->kind == Starred_kind) {
5120            goto ex_call;
5121        }
5122    }
5123    for (i = 0; i < nkwelts; i++) {
5124        keyword_ty kw = asdl_seq_GET(keywords, i);
5125        if (kw->arg == NULL) {
5126            goto ex_call;
5127        }
5128    }
5129
5130    /* No * or ** args, so can use faster calling sequence */
5131    for (i = 0; i < nelts; i++) {
5132        expr_ty elt = asdl_seq_GET(args, i);
5133        assert(elt->kind != Starred_kind);
5134        VISIT(c, expr, elt);
5135    }
5136    if (nkwelts) {
5137        VISIT_SEQ(c, keyword, keywords);
5138        if (!compiler_call_simple_kw_helper(c, keywords, nkwelts)) {
5139            return 0;
5140        };
5141    }
5142    ADDOP_I(c, PRECALL, n + nelts + nkwelts);
5143    ADDOP_I(c, CALL, n + nelts + nkwelts);
5144    return 1;
5145
5146ex_call:
5147
5148    /* Do positional arguments. */
5149    if (n ==0 && nelts == 1 && ((expr_ty)asdl_seq_GET(args, 0))->kind == Starred_kind) {
5150        VISIT(c, expr, ((expr_ty)asdl_seq_GET(args, 0))->v.Starred.value);
5151    }
5152    else if (starunpack_helper(c, args, n, BUILD_LIST,
5153                                 LIST_APPEND, LIST_EXTEND, 1) == 0) {
5154        return 0;
5155    }
5156    /* Then keyword arguments */
5157    if (nkwelts) {
5158        /* Has a new dict been pushed */
5159        int have_dict = 0;
5160
5161        nseen = 0;  /* the number of keyword arguments on the stack following */
5162        for (i = 0; i < nkwelts; i++) {
5163            keyword_ty kw = asdl_seq_GET(keywords, i);
5164            if (kw->arg == NULL) {
5165                /* A keyword argument unpacking. */
5166                if (nseen) {
5167                    if (!compiler_subkwargs(c, keywords, i - nseen, i)) {
5168                        return 0;
5169                    }
5170                    if (have_dict) {
5171                        ADDOP_I(c, DICT_MERGE, 1);
5172                    }
5173                    have_dict = 1;
5174                    nseen = 0;
5175                }
5176                if (!have_dict) {
5177                    ADDOP_I(c, BUILD_MAP, 0);
5178                    have_dict = 1;
5179                }
5180                VISIT(c, expr, kw->value);
5181                ADDOP_I(c, DICT_MERGE, 1);
5182            }
5183            else {
5184                nseen++;
5185            }
5186        }
5187        if (nseen) {
5188            /* Pack up any trailing keyword arguments. */
5189            if (!compiler_subkwargs(c, keywords, nkwelts - nseen, nkwelts)) {
5190                return 0;
5191            }
5192            if (have_dict) {
5193                ADDOP_I(c, DICT_MERGE, 1);
5194            }
5195            have_dict = 1;
5196        }
5197        assert(have_dict);
5198    }
5199    ADDOP_I(c, CALL_FUNCTION_EX, nkwelts > 0);
5200    return 1;
5201}
5202
5203
5204/* List and set comprehensions and generator expressions work by creating a
5205  nested function to perform the actual iteration. This means that the
5206  iteration variables don't leak into the current scope.
5207  The defined function is called immediately following its definition, with the
5208  result of that call being the result of the expression.
5209  The LC/SC version returns the populated container, while the GE version is
5210  flagged in symtable.c as a generator, so it returns the generator object
5211  when the function is called.
5212
5213  Possible cleanups:
5214    - iterate over the generator sequence instead of using recursion
5215*/
5216
5217
5218static int
5219compiler_comprehension_generator(struct compiler *c,
5220                                 asdl_comprehension_seq *generators, int gen_index,
5221                                 int depth,
5222                                 expr_ty elt, expr_ty val, int type)
5223{
5224    comprehension_ty gen;
5225    gen = (comprehension_ty)asdl_seq_GET(generators, gen_index);
5226    if (gen->is_async) {
5227        return compiler_async_comprehension_generator(
5228            c, generators, gen_index, depth, elt, val, type);
5229    } else {
5230        return compiler_sync_comprehension_generator(
5231            c, generators, gen_index, depth, elt, val, type);
5232    }
5233}
5234
5235static int
5236compiler_sync_comprehension_generator(struct compiler *c,
5237                                      asdl_comprehension_seq *generators, int gen_index,
5238                                      int depth,
5239                                      expr_ty elt, expr_ty val, int type)
5240{
5241    /* generate code for the iterator, then each of the ifs,
5242       and then write to the element */
5243
5244    comprehension_ty gen;
5245    basicblock *start, *anchor, *if_cleanup;
5246    Py_ssize_t i, n;
5247
5248    start = compiler_new_block(c);
5249    if_cleanup = compiler_new_block(c);
5250    anchor = compiler_new_block(c);
5251
5252    if (start == NULL || if_cleanup == NULL || anchor == NULL) {
5253        return 0;
5254    }
5255
5256    gen = (comprehension_ty)asdl_seq_GET(generators, gen_index);
5257
5258    if (gen_index == 0) {
5259        /* Receive outermost iter as an implicit argument */
5260        c->u->u_argcount = 1;
5261        ADDOP_I(c, LOAD_FAST, 0);
5262    }
5263    else {
5264        /* Sub-iter - calculate on the fly */
5265        /* Fast path for the temporary variable assignment idiom:
5266             for y in [f(x)]
5267         */
5268        asdl_expr_seq *elts;
5269        switch (gen->iter->kind) {
5270            case List_kind:
5271                elts = gen->iter->v.List.elts;
5272                break;
5273            case Tuple_kind:
5274                elts = gen->iter->v.Tuple.elts;
5275                break;
5276            default:
5277                elts = NULL;
5278        }
5279        if (asdl_seq_LEN(elts) == 1) {
5280            expr_ty elt = asdl_seq_GET(elts, 0);
5281            if (elt->kind != Starred_kind) {
5282                VISIT(c, expr, elt);
5283                start = NULL;
5284            }
5285        }
5286        if (start) {
5287            VISIT(c, expr, gen->iter);
5288            ADDOP(c, GET_ITER);
5289        }
5290    }
5291    if (start) {
5292        depth++;
5293        compiler_use_next_block(c, start);
5294        ADDOP_JUMP(c, FOR_ITER, anchor);
5295    }
5296    VISIT(c, expr, gen->target);
5297
5298    /* XXX this needs to be cleaned up...a lot! */
5299    n = asdl_seq_LEN(gen->ifs);
5300    for (i = 0; i < n; i++) {
5301        expr_ty e = (expr_ty)asdl_seq_GET(gen->ifs, i);
5302        if (!compiler_jump_if(c, e, if_cleanup, 0))
5303            return 0;
5304    }
5305
5306    if (++gen_index < asdl_seq_LEN(generators))
5307        if (!compiler_comprehension_generator(c,
5308                                              generators, gen_index, depth,
5309                                              elt, val, type))
5310        return 0;
5311
5312    /* only append after the last for generator */
5313    if (gen_index >= asdl_seq_LEN(generators)) {
5314        /* comprehension specific code */
5315        switch (type) {
5316        case COMP_GENEXP:
5317            VISIT(c, expr, elt);
5318            ADDOP_YIELD(c);
5319            ADDOP(c, POP_TOP);
5320            break;
5321        case COMP_LISTCOMP:
5322            VISIT(c, expr, elt);
5323            ADDOP_I(c, LIST_APPEND, depth + 1);
5324            break;
5325        case COMP_SETCOMP:
5326            VISIT(c, expr, elt);
5327            ADDOP_I(c, SET_ADD, depth + 1);
5328            break;
5329        case COMP_DICTCOMP:
5330            /* With '{k: v}', k is evaluated before v, so we do
5331               the same. */
5332            VISIT(c, expr, elt);
5333            VISIT(c, expr, val);
5334            ADDOP_I(c, MAP_ADD, depth + 1);
5335            break;
5336        default:
5337            return 0;
5338        }
5339    }
5340    compiler_use_next_block(c, if_cleanup);
5341    if (start) {
5342        ADDOP_JUMP(c, JUMP, start);
5343        compiler_use_next_block(c, anchor);
5344    }
5345
5346    return 1;
5347}
5348
5349static int
5350compiler_async_comprehension_generator(struct compiler *c,
5351                                      asdl_comprehension_seq *generators, int gen_index,
5352                                      int depth,
5353                                      expr_ty elt, expr_ty val, int type)
5354{
5355    comprehension_ty gen;
5356    basicblock *start, *if_cleanup, *except;
5357    Py_ssize_t i, n;
5358    start = compiler_new_block(c);
5359    except = compiler_new_block(c);
5360    if_cleanup = compiler_new_block(c);
5361
5362    if (start == NULL || if_cleanup == NULL || except == NULL) {
5363        return 0;
5364    }
5365
5366    gen = (comprehension_ty)asdl_seq_GET(generators, gen_index);
5367
5368    if (gen_index == 0) {
5369        /* Receive outermost iter as an implicit argument */
5370        c->u->u_argcount = 1;
5371        ADDOP_I(c, LOAD_FAST, 0);
5372    }
5373    else {
5374        /* Sub-iter - calculate on the fly */
5375        VISIT(c, expr, gen->iter);
5376        ADDOP(c, GET_AITER);
5377    }
5378
5379    compiler_use_next_block(c, start);
5380    /* Runtime will push a block here, so we need to account for that */
5381    if (!compiler_push_fblock(c, ASYNC_COMPREHENSION_GENERATOR, start,
5382                              NULL, NULL)) {
5383        return 0;
5384    }
5385
5386    ADDOP_JUMP(c, SETUP_FINALLY, except);
5387    ADDOP(c, GET_ANEXT);
5388    ADDOP_LOAD_CONST(c, Py_None);
5389    ADD_YIELD_FROM(c, 1);
5390    ADDOP(c, POP_BLOCK);
5391    VISIT(c, expr, gen->target);
5392
5393    n = asdl_seq_LEN(gen->ifs);
5394    for (i = 0; i < n; i++) {
5395        expr_ty e = (expr_ty)asdl_seq_GET(gen->ifs, i);
5396        if (!compiler_jump_if(c, e, if_cleanup, 0))
5397            return 0;
5398    }
5399
5400    depth++;
5401    if (++gen_index < asdl_seq_LEN(generators))
5402        if (!compiler_comprehension_generator(c,
5403                                              generators, gen_index, depth,
5404                                              elt, val, type))
5405        return 0;
5406
5407    /* only append after the last for generator */
5408    if (gen_index >= asdl_seq_LEN(generators)) {
5409        /* comprehension specific code */
5410        switch (type) {
5411        case COMP_GENEXP:
5412            VISIT(c, expr, elt);
5413            ADDOP_YIELD(c);
5414            ADDOP(c, POP_TOP);
5415            break;
5416        case COMP_LISTCOMP:
5417            VISIT(c, expr, elt);
5418            ADDOP_I(c, LIST_APPEND, depth + 1);
5419            break;
5420        case COMP_SETCOMP:
5421            VISIT(c, expr, elt);
5422            ADDOP_I(c, SET_ADD, depth + 1);
5423            break;
5424        case COMP_DICTCOMP:
5425            /* With '{k: v}', k is evaluated before v, so we do
5426               the same. */
5427            VISIT(c, expr, elt);
5428            VISIT(c, expr, val);
5429            ADDOP_I(c, MAP_ADD, depth + 1);
5430            break;
5431        default:
5432            return 0;
5433        }
5434    }
5435    compiler_use_next_block(c, if_cleanup);
5436    ADDOP_JUMP(c, JUMP, start);
5437
5438    compiler_pop_fblock(c, ASYNC_COMPREHENSION_GENERATOR, start);
5439
5440    compiler_use_next_block(c, except);
5441    //UNSET_LOC(c);
5442
5443    ADDOP(c, END_ASYNC_FOR);
5444
5445    return 1;
5446}
5447
5448static int
5449compiler_comprehension(struct compiler *c, expr_ty e, int type,
5450                       identifier name, asdl_comprehension_seq *generators, expr_ty elt,
5451                       expr_ty val)
5452{
5453    PyCodeObject *co = NULL;
5454    comprehension_ty outermost;
5455    PyObject *qualname = NULL;
5456    int scope_type = c->u->u_scope_type;
5457    int is_async_generator = 0;
5458    int is_top_level_await = IS_TOP_LEVEL_AWAIT(c);
5459
5460    outermost = (comprehension_ty) asdl_seq_GET(generators, 0);
5461    if (!compiler_enter_scope(c, name, COMPILER_SCOPE_COMPREHENSION,
5462                              (void *)e, e->lineno))
5463    {
5464        goto error;
5465    }
5466    SET_LOC(c, e);
5467
5468    is_async_generator = c->u->u_ste->ste_coroutine;
5469
5470    if (is_async_generator && type != COMP_GENEXP &&
5471        scope_type != COMPILER_SCOPE_ASYNC_FUNCTION &&
5472        scope_type != COMPILER_SCOPE_COMPREHENSION &&
5473        !is_top_level_await)
5474    {
5475        compiler_error(c, "asynchronous comprehension outside of "
5476                          "an asynchronous function");
5477        goto error_in_scope;
5478    }
5479
5480    if (type != COMP_GENEXP) {
5481        int op;
5482        switch (type) {
5483        case COMP_LISTCOMP:
5484            op = BUILD_LIST;
5485            break;
5486        case COMP_SETCOMP:
5487            op = BUILD_SET;
5488            break;
5489        case COMP_DICTCOMP:
5490            op = BUILD_MAP;
5491            break;
5492        default:
5493            PyErr_Format(PyExc_SystemError,
5494                         "unknown comprehension type %d", type);
5495            goto error_in_scope;
5496        }
5497
5498        ADDOP_I(c, op, 0);
5499    }
5500
5501    if (!compiler_comprehension_generator(c, generators, 0, 0, elt,
5502                                          val, type))
5503        goto error_in_scope;
5504
5505    if (type != COMP_GENEXP) {
5506        ADDOP(c, RETURN_VALUE);
5507    }
5508
5509    co = assemble(c, 1);
5510    qualname = c->u->u_qualname;
5511    Py_INCREF(qualname);
5512    compiler_exit_scope(c);
5513    if (is_top_level_await && is_async_generator){
5514        c->u->u_ste->ste_coroutine = 1;
5515    }
5516    if (co == NULL)
5517        goto error;
5518
5519    if (!compiler_make_closure(c, co, 0, qualname)) {
5520        goto error;
5521    }
5522    Py_DECREF(qualname);
5523    Py_DECREF(co);
5524
5525    VISIT(c, expr, outermost->iter);
5526
5527    if (outermost->is_async) {
5528        ADDOP(c, GET_AITER);
5529    } else {
5530        ADDOP(c, GET_ITER);
5531    }
5532
5533    ADDOP_I(c, PRECALL, 0);
5534    ADDOP_I(c, CALL, 0);
5535
5536    if (is_async_generator && type != COMP_GENEXP) {
5537        ADDOP_I(c, GET_AWAITABLE, 0);
5538        ADDOP_LOAD_CONST(c, Py_None);
5539        ADD_YIELD_FROM(c, 1);
5540    }
5541
5542    return 1;
5543error_in_scope:
5544    compiler_exit_scope(c);
5545error:
5546    Py_XDECREF(qualname);
5547    Py_XDECREF(co);
5548    return 0;
5549}
5550
5551static int
5552compiler_genexp(struct compiler *c, expr_ty e)
5553{
5554    assert(e->kind == GeneratorExp_kind);
5555    _Py_DECLARE_STR(anon_genexpr, "<genexpr>");
5556    return compiler_comprehension(c, e, COMP_GENEXP, &_Py_STR(anon_genexpr),
5557                                  e->v.GeneratorExp.generators,
5558                                  e->v.GeneratorExp.elt, NULL);
5559}
5560
5561static int
5562compiler_listcomp(struct compiler *c, expr_ty e)
5563{
5564    assert(e->kind == ListComp_kind);
5565    _Py_DECLARE_STR(anon_listcomp, "<listcomp>");
5566    return compiler_comprehension(c, e, COMP_LISTCOMP, &_Py_STR(anon_listcomp),
5567                                  e->v.ListComp.generators,
5568                                  e->v.ListComp.elt, NULL);
5569}
5570
5571static int
5572compiler_setcomp(struct compiler *c, expr_ty e)
5573{
5574    assert(e->kind == SetComp_kind);
5575    _Py_DECLARE_STR(anon_setcomp, "<setcomp>");
5576    return compiler_comprehension(c, e, COMP_SETCOMP, &_Py_STR(anon_setcomp),
5577                                  e->v.SetComp.generators,
5578                                  e->v.SetComp.elt, NULL);
5579}
5580
5581
5582static int
5583compiler_dictcomp(struct compiler *c, expr_ty e)
5584{
5585    assert(e->kind == DictComp_kind);
5586    _Py_DECLARE_STR(anon_dictcomp, "<dictcomp>");
5587    return compiler_comprehension(c, e, COMP_DICTCOMP, &_Py_STR(anon_dictcomp),
5588                                  e->v.DictComp.generators,
5589                                  e->v.DictComp.key, e->v.DictComp.value);
5590}
5591
5592
5593static int
5594compiler_visit_keyword(struct compiler *c, keyword_ty k)
5595{
5596    VISIT(c, expr, k->value);
5597    return 1;
5598}
5599
5600
5601static int
5602compiler_with_except_finish(struct compiler *c, basicblock * cleanup) {
5603    UNSET_LOC(c);
5604    basicblock *exit;
5605    exit = compiler_new_block(c);
5606    if (exit == NULL)
5607        return 0;
5608    ADDOP_JUMP(c, POP_JUMP_IF_TRUE, exit);
5609    ADDOP_I(c, RERAISE, 2);
5610    compiler_use_next_block(c, cleanup);
5611    POP_EXCEPT_AND_RERAISE(c);
5612    compiler_use_next_block(c, exit);
5613    ADDOP(c, POP_TOP); /* exc_value */
5614    ADDOP(c, POP_BLOCK);
5615    ADDOP(c, POP_EXCEPT);
5616    ADDOP(c, POP_TOP);
5617    ADDOP(c, POP_TOP);
5618    return 1;
5619}
5620
5621/*
5622   Implements the async with statement.
5623
5624   The semantics outlined in that PEP are as follows:
5625
5626   async with EXPR as VAR:
5627       BLOCK
5628
5629   It is implemented roughly as:
5630
5631   context = EXPR
5632   exit = context.__aexit__  # not calling it
5633   value = await context.__aenter__()
5634   try:
5635       VAR = value  # if VAR present in the syntax
5636       BLOCK
5637   finally:
5638       if an exception was raised:
5639           exc = copy of (exception, instance, traceback)
5640       else:
5641           exc = (None, None, None)
5642       if not (await exit(*exc)):
5643           raise
5644 */
5645static int
5646compiler_async_with(struct compiler *c, stmt_ty s, int pos)
5647{
5648    basicblock *block, *final, *exit, *cleanup;
5649    withitem_ty item = asdl_seq_GET(s->v.AsyncWith.items, pos);
5650
5651    assert(s->kind == AsyncWith_kind);
5652    if (IS_TOP_LEVEL_AWAIT(c)){
5653        c->u->u_ste->ste_coroutine = 1;
5654    } else if (c->u->u_scope_type != COMPILER_SCOPE_ASYNC_FUNCTION){
5655        return compiler_error(c, "'async with' outside async function");
5656    }
5657
5658    block = compiler_new_block(c);
5659    final = compiler_new_block(c);
5660    exit = compiler_new_block(c);
5661    cleanup = compiler_new_block(c);
5662    if (!block || !final || !exit || !cleanup)
5663        return 0;
5664
5665    /* Evaluate EXPR */
5666    VISIT(c, expr, item->context_expr);
5667
5668    ADDOP(c, BEFORE_ASYNC_WITH);
5669    ADDOP_I(c, GET_AWAITABLE, 1);
5670    ADDOP_LOAD_CONST(c, Py_None);
5671    ADD_YIELD_FROM(c, 1);
5672
5673    ADDOP_JUMP(c, SETUP_WITH, final);
5674
5675    /* SETUP_WITH pushes a finally block. */
5676    compiler_use_next_block(c, block);
5677    if (!compiler_push_fblock(c, ASYNC_WITH, block, final, s)) {
5678        return 0;
5679    }
5680
5681    if (item->optional_vars) {
5682        VISIT(c, expr, item->optional_vars);
5683    }
5684    else {
5685    /* Discard result from context.__aenter__() */
5686        ADDOP(c, POP_TOP);
5687    }
5688
5689    pos++;
5690    if (pos == asdl_seq_LEN(s->v.AsyncWith.items))
5691        /* BLOCK code */
5692        VISIT_SEQ(c, stmt, s->v.AsyncWith.body)
5693    else if (!compiler_async_with(c, s, pos))
5694            return 0;
5695
5696    compiler_pop_fblock(c, ASYNC_WITH, block);
5697    ADDOP(c, POP_BLOCK);
5698    /* End of body; start the cleanup */
5699
5700    /* For successful outcome:
5701     * call __exit__(None, None, None)
5702     */
5703    SET_LOC(c, s);
5704    if(!compiler_call_exit_with_nones(c))
5705        return 0;
5706    ADDOP_I(c, GET_AWAITABLE, 2);
5707    ADDOP_LOAD_CONST(c, Py_None);
5708    ADD_YIELD_FROM(c, 1);
5709
5710    ADDOP(c, POP_TOP);
5711
5712    ADDOP_JUMP(c, JUMP, exit);
5713
5714    /* For exceptional outcome: */
5715    compiler_use_next_block(c, final);
5716
5717    ADDOP_JUMP(c, SETUP_CLEANUP, cleanup);
5718    ADDOP(c, PUSH_EXC_INFO);
5719    ADDOP(c, WITH_EXCEPT_START);
5720    ADDOP_I(c, GET_AWAITABLE, 2);
5721    ADDOP_LOAD_CONST(c, Py_None);
5722    ADD_YIELD_FROM(c, 1);
5723    compiler_with_except_finish(c, cleanup);
5724
5725    compiler_use_next_block(c, exit);
5726    return 1;
5727}
5728
5729
5730/*
5731   Implements the with statement from PEP 343.
5732   with EXPR as VAR:
5733       BLOCK
5734   is implemented as:
5735        <code for EXPR>
5736        SETUP_WITH  E
5737        <code to store to VAR> or POP_TOP
5738        <code for BLOCK>
5739        LOAD_CONST (None, None, None)
5740        CALL_FUNCTION_EX 0
5741        JUMP  EXIT
5742    E:  WITH_EXCEPT_START (calls EXPR.__exit__)
5743        POP_JUMP_IF_TRUE T:
5744        RERAISE
5745    T:  POP_TOP (remove exception from stack)
5746        POP_EXCEPT
5747        POP_TOP
5748    EXIT:
5749 */
5750
5751static int
5752compiler_with(struct compiler *c, stmt_ty s, int pos)
5753{
5754    basicblock *block, *final, *exit, *cleanup;
5755    withitem_ty item = asdl_seq_GET(s->v.With.items, pos);
5756
5757    assert(s->kind == With_kind);
5758
5759    block = compiler_new_block(c);
5760    final = compiler_new_block(c);
5761    exit = compiler_new_block(c);
5762    cleanup = compiler_new_block(c);
5763    if (!block || !final || !exit || !cleanup)
5764        return 0;
5765
5766    /* Evaluate EXPR */
5767    VISIT(c, expr, item->context_expr);
5768    /* Will push bound __exit__ */
5769    ADDOP(c, BEFORE_WITH);
5770    ADDOP_JUMP(c, SETUP_WITH, final);
5771
5772    /* SETUP_WITH pushes a finally block. */
5773    compiler_use_next_block(c, block);
5774    if (!compiler_push_fblock(c, WITH, block, final, s)) {
5775        return 0;
5776    }
5777
5778    if (item->optional_vars) {
5779        VISIT(c, expr, item->optional_vars);
5780    }
5781    else {
5782    /* Discard result from context.__enter__() */
5783        ADDOP(c, POP_TOP);
5784    }
5785
5786    pos++;
5787    if (pos == asdl_seq_LEN(s->v.With.items))
5788        /* BLOCK code */
5789        VISIT_SEQ(c, stmt, s->v.With.body)
5790    else if (!compiler_with(c, s, pos))
5791            return 0;
5792
5793
5794    /* Mark all following code as artificial */
5795    UNSET_LOC(c);
5796    ADDOP(c, POP_BLOCK);
5797    compiler_pop_fblock(c, WITH, block);
5798
5799    /* End of body; start the cleanup. */
5800
5801    /* For successful outcome:
5802     * call __exit__(None, None, None)
5803     */
5804    SET_LOC(c, s);
5805    if (!compiler_call_exit_with_nones(c))
5806        return 0;
5807    ADDOP(c, POP_TOP);
5808    ADDOP_JUMP(c, JUMP, exit);
5809
5810    /* For exceptional outcome: */
5811    compiler_use_next_block(c, final);
5812
5813    ADDOP_JUMP(c, SETUP_CLEANUP, cleanup);
5814    ADDOP(c, PUSH_EXC_INFO);
5815    ADDOP(c, WITH_EXCEPT_START);
5816    compiler_with_except_finish(c, cleanup);
5817
5818    compiler_use_next_block(c, exit);
5819    return 1;
5820}
5821
5822static int
5823compiler_visit_expr1(struct compiler *c, expr_ty e)
5824{
5825    switch (e->kind) {
5826    case NamedExpr_kind:
5827        VISIT(c, expr, e->v.NamedExpr.value);
5828        ADDOP_I(c, COPY, 1);
5829        VISIT(c, expr, e->v.NamedExpr.target);
5830        break;
5831    case BoolOp_kind:
5832        return compiler_boolop(c, e);
5833    case BinOp_kind:
5834        VISIT(c, expr, e->v.BinOp.left);
5835        VISIT(c, expr, e->v.BinOp.right);
5836        ADDOP_BINARY(c, e->v.BinOp.op);
5837        break;
5838    case UnaryOp_kind:
5839        VISIT(c, expr, e->v.UnaryOp.operand);
5840        ADDOP(c, unaryop(e->v.UnaryOp.op));
5841        break;
5842    case Lambda_kind:
5843        return compiler_lambda(c, e);
5844    case IfExp_kind:
5845        return compiler_ifexp(c, e);
5846    case Dict_kind:
5847        return compiler_dict(c, e);
5848    case Set_kind:
5849        return compiler_set(c, e);
5850    case GeneratorExp_kind:
5851        return compiler_genexp(c, e);
5852    case ListComp_kind:
5853        return compiler_listcomp(c, e);
5854    case SetComp_kind:
5855        return compiler_setcomp(c, e);
5856    case DictComp_kind:
5857        return compiler_dictcomp(c, e);
5858    case Yield_kind:
5859        if (c->u->u_ste->ste_type != FunctionBlock)
5860            return compiler_error(c, "'yield' outside function");
5861        if (e->v.Yield.value) {
5862            VISIT(c, expr, e->v.Yield.value);
5863        }
5864        else {
5865            ADDOP_LOAD_CONST(c, Py_None);
5866        }
5867        ADDOP_YIELD(c);
5868        break;
5869    case YieldFrom_kind:
5870        if (c->u->u_ste->ste_type != FunctionBlock)
5871            return compiler_error(c, "'yield' outside function");
5872
5873        if (c->u->u_scope_type == COMPILER_SCOPE_ASYNC_FUNCTION)
5874            return compiler_error(c, "'yield from' inside async function");
5875
5876        VISIT(c, expr, e->v.YieldFrom.value);
5877        ADDOP(c, GET_YIELD_FROM_ITER);
5878        ADDOP_LOAD_CONST(c, Py_None);
5879        ADD_YIELD_FROM(c, 0);
5880        break;
5881    case Await_kind:
5882        if (!IS_TOP_LEVEL_AWAIT(c)){
5883            if (c->u->u_ste->ste_type != FunctionBlock){
5884                return compiler_error(c, "'await' outside function");
5885            }
5886
5887            if (c->u->u_scope_type != COMPILER_SCOPE_ASYNC_FUNCTION &&
5888                    c->u->u_scope_type != COMPILER_SCOPE_COMPREHENSION){
5889                return compiler_error(c, "'await' outside async function");
5890            }
5891        }
5892
5893        VISIT(c, expr, e->v.Await.value);
5894        ADDOP_I(c, GET_AWAITABLE, 0);
5895        ADDOP_LOAD_CONST(c, Py_None);
5896        ADD_YIELD_FROM(c, 1);
5897        break;
5898    case Compare_kind:
5899        return compiler_compare(c, e);
5900    case Call_kind:
5901        return compiler_call(c, e);
5902    case Constant_kind:
5903        ADDOP_LOAD_CONST(c, e->v.Constant.value);
5904        break;
5905    case JoinedStr_kind:
5906        return compiler_joined_str(c, e);
5907    case FormattedValue_kind:
5908        return compiler_formatted_value(c, e);
5909    /* The following exprs can be assignment targets. */
5910    case Attribute_kind:
5911        VISIT(c, expr, e->v.Attribute.value);
5912        update_start_location_to_match_attr(c, e);
5913        switch (e->v.Attribute.ctx) {
5914        case Load:
5915        {
5916            ADDOP_NAME(c, LOAD_ATTR, e->v.Attribute.attr, names);
5917            break;
5918        }
5919        case Store:
5920            if (forbidden_name(c, e->v.Attribute.attr, e->v.Attribute.ctx)) {
5921                return 0;
5922            }
5923            ADDOP_NAME(c, STORE_ATTR, e->v.Attribute.attr, names);
5924            break;
5925        case Del:
5926            ADDOP_NAME(c, DELETE_ATTR, e->v.Attribute.attr, names);
5927            break;
5928        }
5929        break;
5930    case Subscript_kind:
5931        return compiler_subscript(c, e);
5932    case Starred_kind:
5933        switch (e->v.Starred.ctx) {
5934        case Store:
5935            /* In all legitimate cases, the Starred node was already replaced
5936             * by compiler_list/compiler_tuple. XXX: is that okay? */
5937            return compiler_error(c,
5938                "starred assignment target must be in a list or tuple");
5939        default:
5940            return compiler_error(c,
5941                "can't use starred expression here");
5942        }
5943        break;
5944    case Slice_kind:
5945        return compiler_slice(c, e);
5946    case Name_kind:
5947        return compiler_nameop(c, e->v.Name.id, e->v.Name.ctx);
5948    /* child nodes of List and Tuple will have expr_context set */
5949    case List_kind:
5950        return compiler_list(c, e);
5951    case Tuple_kind:
5952        return compiler_tuple(c, e);
5953    }
5954    return 1;
5955}
5956
5957static int
5958compiler_visit_expr(struct compiler *c, expr_ty e)
5959{
5960    int old_lineno = c->u->u_lineno;
5961    int old_end_lineno = c->u->u_end_lineno;
5962    int old_col_offset = c->u->u_col_offset;
5963    int old_end_col_offset = c->u->u_end_col_offset;
5964    SET_LOC(c, e);
5965    int res = compiler_visit_expr1(c, e);
5966    c->u->u_lineno = old_lineno;
5967    c->u->u_end_lineno = old_end_lineno;
5968    c->u->u_col_offset = old_col_offset;
5969    c->u->u_end_col_offset = old_end_col_offset;
5970    return res;
5971}
5972
5973static int
5974compiler_augassign(struct compiler *c, stmt_ty s)
5975{
5976    assert(s->kind == AugAssign_kind);
5977    expr_ty e = s->v.AugAssign.target;
5978
5979    int old_lineno = c->u->u_lineno;
5980    int old_end_lineno = c->u->u_end_lineno;
5981    int old_col_offset = c->u->u_col_offset;
5982    int old_end_col_offset = c->u->u_end_col_offset;
5983    SET_LOC(c, e);
5984
5985    switch (e->kind) {
5986    case Attribute_kind:
5987        VISIT(c, expr, e->v.Attribute.value);
5988        ADDOP_I(c, COPY, 1);
5989        update_start_location_to_match_attr(c, e);
5990        ADDOP_NAME(c, LOAD_ATTR, e->v.Attribute.attr, names);
5991        break;
5992    case Subscript_kind:
5993        VISIT(c, expr, e->v.Subscript.value);
5994        VISIT(c, expr, e->v.Subscript.slice);
5995        ADDOP_I(c, COPY, 2);
5996        ADDOP_I(c, COPY, 2);
5997        ADDOP(c, BINARY_SUBSCR);
5998        break;
5999    case Name_kind:
6000        if (!compiler_nameop(c, e->v.Name.id, Load))
6001            return 0;
6002        break;
6003    default:
6004        PyErr_Format(PyExc_SystemError,
6005            "invalid node type (%d) for augmented assignment",
6006            e->kind);
6007        return 0;
6008    }
6009
6010    c->u->u_lineno = old_lineno;
6011    c->u->u_end_lineno = old_end_lineno;
6012    c->u->u_col_offset = old_col_offset;
6013    c->u->u_end_col_offset = old_end_col_offset;
6014
6015    VISIT(c, expr, s->v.AugAssign.value);
6016    ADDOP_INPLACE(c, s->v.AugAssign.op);
6017
6018    SET_LOC(c, e);
6019
6020    switch (e->kind) {
6021    case Attribute_kind:
6022        update_start_location_to_match_attr(c, e);
6023        ADDOP_I(c, SWAP, 2);
6024        ADDOP_NAME(c, STORE_ATTR, e->v.Attribute.attr, names);
6025        break;
6026    case Subscript_kind:
6027        ADDOP_I(c, SWAP, 3);
6028        ADDOP_I(c, SWAP, 2);
6029        ADDOP(c, STORE_SUBSCR);
6030        break;
6031    case Name_kind:
6032        return compiler_nameop(c, e->v.Name.id, Store);
6033    default:
6034        Py_UNREACHABLE();
6035    }
6036    return 1;
6037}
6038
6039static int
6040check_ann_expr(struct compiler *c, expr_ty e)
6041{
6042    VISIT(c, expr, e);
6043    ADDOP(c, POP_TOP);
6044    return 1;
6045}
6046
6047static int
6048check_annotation(struct compiler *c, stmt_ty s)
6049{
6050    /* Annotations of complex targets does not produce anything
6051       under annotations future */
6052    if (c->c_future->ff_features & CO_FUTURE_ANNOTATIONS) {
6053        return 1;
6054    }
6055
6056    /* Annotations are only evaluated in a module or class. */
6057    if (c->u->u_scope_type == COMPILER_SCOPE_MODULE ||
6058        c->u->u_scope_type == COMPILER_SCOPE_CLASS) {
6059        return check_ann_expr(c, s->v.AnnAssign.annotation);
6060    }
6061    return 1;
6062}
6063
6064static int
6065check_ann_subscr(struct compiler *c, expr_ty e)
6066{
6067    /* We check that everything in a subscript is defined at runtime. */
6068    switch (e->kind) {
6069    case Slice_kind:
6070        if (e->v.Slice.lower && !check_ann_expr(c, e->v.Slice.lower)) {
6071            return 0;
6072        }
6073        if (e->v.Slice.upper && !check_ann_expr(c, e->v.Slice.upper)) {
6074            return 0;
6075        }
6076        if (e->v.Slice.step && !check_ann_expr(c, e->v.Slice.step)) {
6077            return 0;
6078        }
6079        return 1;
6080    case Tuple_kind: {
6081        /* extended slice */
6082        asdl_expr_seq *elts = e->v.Tuple.elts;
6083        Py_ssize_t i, n = asdl_seq_LEN(elts);
6084        for (i = 0; i < n; i++) {
6085            if (!check_ann_subscr(c, asdl_seq_GET(elts, i))) {
6086                return 0;
6087            }
6088        }
6089        return 1;
6090    }
6091    default:
6092        return check_ann_expr(c, e);
6093    }
6094}
6095
6096static int
6097compiler_annassign(struct compiler *c, stmt_ty s)
6098{
6099    expr_ty targ = s->v.AnnAssign.target;
6100    PyObject* mangled;
6101
6102    assert(s->kind == AnnAssign_kind);
6103
6104    /* We perform the actual assignment first. */
6105    if (s->v.AnnAssign.value) {
6106        VISIT(c, expr, s->v.AnnAssign.value);
6107        VISIT(c, expr, targ);
6108    }
6109    switch (targ->kind) {
6110    case Name_kind:
6111        if (forbidden_name(c, targ->v.Name.id, Store))
6112            return 0;
6113        /* If we have a simple name in a module or class, store annotation. */
6114        if (s->v.AnnAssign.simple &&
6115            (c->u->u_scope_type == COMPILER_SCOPE_MODULE ||
6116             c->u->u_scope_type == COMPILER_SCOPE_CLASS)) {
6117            if (c->c_future->ff_features & CO_FUTURE_ANNOTATIONS) {
6118                VISIT(c, annexpr, s->v.AnnAssign.annotation)
6119            }
6120            else {
6121                VISIT(c, expr, s->v.AnnAssign.annotation);
6122            }
6123            ADDOP_NAME(c, LOAD_NAME, &_Py_ID(__annotations__), names);
6124            mangled = _Py_Mangle(c->u->u_private, targ->v.Name.id);
6125            ADDOP_LOAD_CONST_NEW(c, mangled);
6126            ADDOP(c, STORE_SUBSCR);
6127        }
6128        break;
6129    case Attribute_kind:
6130        if (forbidden_name(c, targ->v.Attribute.attr, Store))
6131            return 0;
6132        if (!s->v.AnnAssign.value &&
6133            !check_ann_expr(c, targ->v.Attribute.value)) {
6134            return 0;
6135        }
6136        break;
6137    case Subscript_kind:
6138        if (!s->v.AnnAssign.value &&
6139            (!check_ann_expr(c, targ->v.Subscript.value) ||
6140             !check_ann_subscr(c, targ->v.Subscript.slice))) {
6141                return 0;
6142        }
6143        break;
6144    default:
6145        PyErr_Format(PyExc_SystemError,
6146                     "invalid node type (%d) for annotated assignment",
6147                     targ->kind);
6148            return 0;
6149    }
6150    /* Annotation is evaluated last. */
6151    if (!s->v.AnnAssign.simple && !check_annotation(c, s)) {
6152        return 0;
6153    }
6154    return 1;
6155}
6156
6157/* Raises a SyntaxError and returns 0.
6158   If something goes wrong, a different exception may be raised.
6159*/
6160
6161static int
6162compiler_error(struct compiler *c, const char *format, ...)
6163{
6164    va_list vargs;
6165#ifdef HAVE_STDARG_PROTOTYPES
6166    va_start(vargs, format);
6167#else
6168    va_start(vargs);
6169#endif
6170    PyObject *msg = PyUnicode_FromFormatV(format, vargs);
6171    va_end(vargs);
6172    if (msg == NULL) {
6173        return 0;
6174    }
6175    PyObject *loc = PyErr_ProgramTextObject(c->c_filename, c->u->u_lineno);
6176    if (loc == NULL) {
6177        Py_INCREF(Py_None);
6178        loc = Py_None;
6179    }
6180    PyObject *args = Py_BuildValue("O(OiiOii)", msg, c->c_filename,
6181                                   c->u->u_lineno, c->u->u_col_offset + 1, loc,
6182                                   c->u->u_end_lineno, c->u->u_end_col_offset + 1);
6183    Py_DECREF(msg);
6184    if (args == NULL) {
6185        goto exit;
6186    }
6187    PyErr_SetObject(PyExc_SyntaxError, args);
6188 exit:
6189    Py_DECREF(loc);
6190    Py_XDECREF(args);
6191    return 0;
6192}
6193
6194/* Emits a SyntaxWarning and returns 1 on success.
6195   If a SyntaxWarning raised as error, replaces it with a SyntaxError
6196   and returns 0.
6197*/
6198static int
6199compiler_warn(struct compiler *c, const char *format, ...)
6200{
6201    va_list vargs;
6202#ifdef HAVE_STDARG_PROTOTYPES
6203    va_start(vargs, format);
6204#else
6205    va_start(vargs);
6206#endif
6207    PyObject *msg = PyUnicode_FromFormatV(format, vargs);
6208    va_end(vargs);
6209    if (msg == NULL) {
6210        return 0;
6211    }
6212    if (PyErr_WarnExplicitObject(PyExc_SyntaxWarning, msg, c->c_filename,
6213                                 c->u->u_lineno, NULL, NULL) < 0)
6214    {
6215        if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
6216            /* Replace the SyntaxWarning exception with a SyntaxError
6217               to get a more accurate error report */
6218            PyErr_Clear();
6219            assert(PyUnicode_AsUTF8(msg) != NULL);
6220            compiler_error(c, PyUnicode_AsUTF8(msg));
6221        }
6222        Py_DECREF(msg);
6223        return 0;
6224    }
6225    Py_DECREF(msg);
6226    return 1;
6227}
6228
6229static int
6230compiler_subscript(struct compiler *c, expr_ty e)
6231{
6232    expr_context_ty ctx = e->v.Subscript.ctx;
6233    int op = 0;
6234
6235    if (ctx == Load) {
6236        if (!check_subscripter(c, e->v.Subscript.value)) {
6237            return 0;
6238        }
6239        if (!check_index(c, e->v.Subscript.value, e->v.Subscript.slice)) {
6240            return 0;
6241        }
6242    }
6243
6244    switch (ctx) {
6245        case Load:    op = BINARY_SUBSCR; break;
6246        case Store:   op = STORE_SUBSCR; break;
6247        case Del:     op = DELETE_SUBSCR; break;
6248    }
6249    assert(op);
6250    VISIT(c, expr, e->v.Subscript.value);
6251    VISIT(c, expr, e->v.Subscript.slice);
6252    ADDOP(c, op);
6253    return 1;
6254}
6255
6256static int
6257compiler_slice(struct compiler *c, expr_ty s)
6258{
6259    int n = 2;
6260    assert(s->kind == Slice_kind);
6261
6262    /* only handles the cases where BUILD_SLICE is emitted */
6263    if (s->v.Slice.lower) {
6264        VISIT(c, expr, s->v.Slice.lower);
6265    }
6266    else {
6267        ADDOP_LOAD_CONST(c, Py_None);
6268    }
6269
6270    if (s->v.Slice.upper) {
6271        VISIT(c, expr, s->v.Slice.upper);
6272    }
6273    else {
6274        ADDOP_LOAD_CONST(c, Py_None);
6275    }
6276
6277    if (s->v.Slice.step) {
6278        n++;
6279        VISIT(c, expr, s->v.Slice.step);
6280    }
6281    ADDOP_I(c, BUILD_SLICE, n);
6282    return 1;
6283}
6284
6285
6286// PEP 634: Structural Pattern Matching
6287
6288// To keep things simple, all compiler_pattern_* and pattern_helper_* routines
6289// follow the convention of consuming TOS (the subject for the given pattern)
6290// and calling jump_to_fail_pop on failure (no match).
6291
6292// When calling into these routines, it's important that pc->on_top be kept
6293// updated to reflect the current number of items that we are using on the top
6294// of the stack: they will be popped on failure, and any name captures will be
6295// stored *underneath* them on success. This lets us defer all names stores
6296// until the *entire* pattern matches.
6297
6298#define WILDCARD_CHECK(N) \
6299    ((N)->kind == MatchAs_kind && !(N)->v.MatchAs.name)
6300
6301#define WILDCARD_STAR_CHECK(N) \
6302    ((N)->kind == MatchStar_kind && !(N)->v.MatchStar.name)
6303
6304// Limit permitted subexpressions, even if the parser & AST validator let them through
6305#define MATCH_VALUE_EXPR(N) \
6306    ((N)->kind == Constant_kind || (N)->kind == Attribute_kind)
6307
6308// Allocate or resize pc->fail_pop to allow for n items to be popped on failure.
6309static int
6310ensure_fail_pop(struct compiler *c, pattern_context *pc, Py_ssize_t n)
6311{
6312    Py_ssize_t size = n + 1;
6313    if (size <= pc->fail_pop_size) {
6314        return 1;
6315    }
6316    Py_ssize_t needed = sizeof(basicblock*) * size;
6317    basicblock **resized = PyObject_Realloc(pc->fail_pop, needed);
6318    if (resized == NULL) {
6319        PyErr_NoMemory();
6320        return 0;
6321    }
6322    pc->fail_pop = resized;
6323    while (pc->fail_pop_size < size) {
6324        basicblock *new_block;
6325        RETURN_IF_FALSE(new_block = compiler_new_block(c));
6326        pc->fail_pop[pc->fail_pop_size++] = new_block;
6327    }
6328    return 1;
6329}
6330
6331// Use op to jump to the correct fail_pop block.
6332static int
6333jump_to_fail_pop(struct compiler *c, pattern_context *pc, int op)
6334{
6335    // Pop any items on the top of the stack, plus any objects we were going to
6336    // capture on success:
6337    Py_ssize_t pops = pc->on_top + PyList_GET_SIZE(pc->stores);
6338    RETURN_IF_FALSE(ensure_fail_pop(c, pc, pops));
6339    ADDOP_JUMP(c, op, pc->fail_pop[pops]);
6340    return 1;
6341}
6342
6343// Build all of the fail_pop blocks and reset fail_pop.
6344static int
6345emit_and_reset_fail_pop(struct compiler *c, pattern_context *pc)
6346{
6347    if (!pc->fail_pop_size) {
6348        assert(pc->fail_pop == NULL);
6349        return 1;
6350    }
6351    while (--pc->fail_pop_size) {
6352        compiler_use_next_block(c, pc->fail_pop[pc->fail_pop_size]);
6353        if (!compiler_addop(c, POP_TOP)) {
6354            pc->fail_pop_size = 0;
6355            PyObject_Free(pc->fail_pop);
6356            pc->fail_pop = NULL;
6357            return 0;
6358        }
6359    }
6360    compiler_use_next_block(c, pc->fail_pop[0]);
6361    PyObject_Free(pc->fail_pop);
6362    pc->fail_pop = NULL;
6363    return 1;
6364}
6365
6366static int
6367compiler_error_duplicate_store(struct compiler *c, identifier n)
6368{
6369    return compiler_error(c, "multiple assignments to name %R in pattern", n);
6370}
6371
6372// Duplicate the effect of 3.10's ROT_* instructions using SWAPs.
6373static int
6374pattern_helper_rotate(struct compiler *c, Py_ssize_t count)
6375{
6376    while (1 < count) {
6377        ADDOP_I(c, SWAP, count--);
6378    }
6379    return 1;
6380}
6381
6382static int
6383pattern_helper_store_name(struct compiler *c, identifier n, pattern_context *pc)
6384{
6385    if (n == NULL) {
6386        ADDOP(c, POP_TOP);
6387        return 1;
6388    }
6389    if (forbidden_name(c, n, Store)) {
6390        return 0;
6391    }
6392    // Can't assign to the same name twice:
6393    int duplicate = PySequence_Contains(pc->stores, n);
6394    if (duplicate < 0) {
6395        return 0;
6396    }
6397    if (duplicate) {
6398        return compiler_error_duplicate_store(c, n);
6399    }
6400    // Rotate this object underneath any items we need to preserve:
6401    Py_ssize_t rotations = pc->on_top + PyList_GET_SIZE(pc->stores) + 1;
6402    RETURN_IF_FALSE(pattern_helper_rotate(c, rotations));
6403    return !PyList_Append(pc->stores, n);
6404}
6405
6406
6407static int
6408pattern_unpack_helper(struct compiler *c, asdl_pattern_seq *elts)
6409{
6410    Py_ssize_t n = asdl_seq_LEN(elts);
6411    int seen_star = 0;
6412    for (Py_ssize_t i = 0; i < n; i++) {
6413        pattern_ty elt = asdl_seq_GET(elts, i);
6414        if (elt->kind == MatchStar_kind && !seen_star) {
6415            if ((i >= (1 << 8)) ||
6416                (n-i-1 >= (INT_MAX >> 8)))
6417                return compiler_error(c,
6418                    "too many expressions in "
6419                    "star-unpacking sequence pattern");
6420            ADDOP_I(c, UNPACK_EX, (i + ((n-i-1) << 8)));
6421            seen_star = 1;
6422        }
6423        else if (elt->kind == MatchStar_kind) {
6424            return compiler_error(c,
6425                "multiple starred expressions in sequence pattern");
6426        }
6427    }
6428    if (!seen_star) {
6429        ADDOP_I(c, UNPACK_SEQUENCE, n);
6430    }
6431    return 1;
6432}
6433
6434static int
6435pattern_helper_sequence_unpack(struct compiler *c, asdl_pattern_seq *patterns,
6436                               Py_ssize_t star, pattern_context *pc)
6437{
6438    RETURN_IF_FALSE(pattern_unpack_helper(c, patterns));
6439    Py_ssize_t size = asdl_seq_LEN(patterns);
6440    // We've now got a bunch of new subjects on the stack. They need to remain
6441    // there after each subpattern match:
6442    pc->on_top += size;
6443    for (Py_ssize_t i = 0; i < size; i++) {
6444        // One less item to keep track of each time we loop through:
6445        pc->on_top--;
6446        pattern_ty pattern = asdl_seq_GET(patterns, i);
6447        RETURN_IF_FALSE(compiler_pattern_subpattern(c, pattern, pc));
6448    }
6449    return 1;
6450}
6451
6452// Like pattern_helper_sequence_unpack, but uses BINARY_SUBSCR instead of
6453// UNPACK_SEQUENCE / UNPACK_EX. This is more efficient for patterns with a
6454// starred wildcard like [first, *_] / [first, *_, last] / [*_, last] / etc.
6455static int
6456pattern_helper_sequence_subscr(struct compiler *c, asdl_pattern_seq *patterns,
6457                               Py_ssize_t star, pattern_context *pc)
6458{
6459    // We need to keep the subject around for extracting elements:
6460    pc->on_top++;
6461    Py_ssize_t size = asdl_seq_LEN(patterns);
6462    for (Py_ssize_t i = 0; i < size; i++) {
6463        pattern_ty pattern = asdl_seq_GET(patterns, i);
6464        if (WILDCARD_CHECK(pattern)) {
6465            continue;
6466        }
6467        if (i == star) {
6468            assert(WILDCARD_STAR_CHECK(pattern));
6469            continue;
6470        }
6471        ADDOP_I(c, COPY, 1);
6472        if (i < star) {
6473            ADDOP_LOAD_CONST_NEW(c, PyLong_FromSsize_t(i));
6474        }
6475        else {
6476            // The subject may not support negative indexing! Compute a
6477            // nonnegative index:
6478            ADDOP(c, GET_LEN);
6479            ADDOP_LOAD_CONST_NEW(c, PyLong_FromSsize_t(size - i));
6480            ADDOP_BINARY(c, Sub);
6481        }
6482        ADDOP(c, BINARY_SUBSCR);
6483        RETURN_IF_FALSE(compiler_pattern_subpattern(c, pattern, pc));
6484    }
6485    // Pop the subject, we're done with it:
6486    pc->on_top--;
6487    ADDOP(c, POP_TOP);
6488    return 1;
6489}
6490
6491// Like compiler_pattern, but turn off checks for irrefutability.
6492static int
6493compiler_pattern_subpattern(struct compiler *c, pattern_ty p, pattern_context *pc)
6494{
6495    int allow_irrefutable = pc->allow_irrefutable;
6496    pc->allow_irrefutable = 1;
6497    RETURN_IF_FALSE(compiler_pattern(c, p, pc));
6498    pc->allow_irrefutable = allow_irrefutable;
6499    return 1;
6500}
6501
6502static int
6503compiler_pattern_as(struct compiler *c, pattern_ty p, pattern_context *pc)
6504{
6505    assert(p->kind == MatchAs_kind);
6506    if (p->v.MatchAs.pattern == NULL) {
6507        // An irrefutable match:
6508        if (!pc->allow_irrefutable) {
6509            if (p->v.MatchAs.name) {
6510                const char *e = "name capture %R makes remaining patterns unreachable";
6511                return compiler_error(c, e, p->v.MatchAs.name);
6512            }
6513            const char *e = "wildcard makes remaining patterns unreachable";
6514            return compiler_error(c, e);
6515        }
6516        return pattern_helper_store_name(c, p->v.MatchAs.name, pc);
6517    }
6518    // Need to make a copy for (possibly) storing later:
6519    pc->on_top++;
6520    ADDOP_I(c, COPY, 1);
6521    RETURN_IF_FALSE(compiler_pattern(c, p->v.MatchAs.pattern, pc));
6522    // Success! Store it:
6523    pc->on_top--;
6524    RETURN_IF_FALSE(pattern_helper_store_name(c, p->v.MatchAs.name, pc));
6525    return 1;
6526}
6527
6528static int
6529compiler_pattern_star(struct compiler *c, pattern_ty p, pattern_context *pc)
6530{
6531    assert(p->kind == MatchStar_kind);
6532    RETURN_IF_FALSE(pattern_helper_store_name(c, p->v.MatchStar.name, pc));
6533    return 1;
6534}
6535
6536static int
6537validate_kwd_attrs(struct compiler *c, asdl_identifier_seq *attrs, asdl_pattern_seq* patterns)
6538{
6539    // Any errors will point to the pattern rather than the arg name as the
6540    // parser is only supplying identifiers rather than Name or keyword nodes
6541    Py_ssize_t nattrs = asdl_seq_LEN(attrs);
6542    for (Py_ssize_t i = 0; i < nattrs; i++) {
6543        identifier attr = ((identifier)asdl_seq_GET(attrs, i));
6544        SET_LOC(c, ((pattern_ty) asdl_seq_GET(patterns, i)));
6545        if (forbidden_name(c, attr, Store)) {
6546            return -1;
6547        }
6548        for (Py_ssize_t j = i + 1; j < nattrs; j++) {
6549            identifier other = ((identifier)asdl_seq_GET(attrs, j));
6550            if (!PyUnicode_Compare(attr, other)) {
6551                SET_LOC(c, ((pattern_ty) asdl_seq_GET(patterns, j)));
6552                compiler_error(c, "attribute name repeated in class pattern: %U", attr);
6553                return -1;
6554            }
6555        }
6556    }
6557    return 0;
6558}
6559
6560static int
6561compiler_pattern_class(struct compiler *c, pattern_ty p, pattern_context *pc)
6562{
6563    assert(p->kind == MatchClass_kind);
6564    asdl_pattern_seq *patterns = p->v.MatchClass.patterns;
6565    asdl_identifier_seq *kwd_attrs = p->v.MatchClass.kwd_attrs;
6566    asdl_pattern_seq *kwd_patterns = p->v.MatchClass.kwd_patterns;
6567    Py_ssize_t nargs = asdl_seq_LEN(patterns);
6568    Py_ssize_t nattrs = asdl_seq_LEN(kwd_attrs);
6569    Py_ssize_t nkwd_patterns = asdl_seq_LEN(kwd_patterns);
6570    if (nattrs != nkwd_patterns) {
6571        // AST validator shouldn't let this happen, but if it does,
6572        // just fail, don't crash out of the interpreter
6573        const char * e = "kwd_attrs (%d) / kwd_patterns (%d) length mismatch in class pattern";
6574        return compiler_error(c, e, nattrs, nkwd_patterns);
6575    }
6576    if (INT_MAX < nargs || INT_MAX < nargs + nattrs - 1) {
6577        const char *e = "too many sub-patterns in class pattern %R";
6578        return compiler_error(c, e, p->v.MatchClass.cls);
6579    }
6580    if (nattrs) {
6581        RETURN_IF_FALSE(!validate_kwd_attrs(c, kwd_attrs, kwd_patterns));
6582        SET_LOC(c, p);
6583    }
6584    VISIT(c, expr, p->v.MatchClass.cls);
6585    PyObject *attr_names;
6586    RETURN_IF_FALSE(attr_names = PyTuple_New(nattrs));
6587    Py_ssize_t i;
6588    for (i = 0; i < nattrs; i++) {
6589        PyObject *name = asdl_seq_GET(kwd_attrs, i);
6590        Py_INCREF(name);
6591        PyTuple_SET_ITEM(attr_names, i, name);
6592    }
6593    ADDOP_LOAD_CONST_NEW(c, attr_names);
6594    ADDOP_I(c, MATCH_CLASS, nargs);
6595    ADDOP_I(c, COPY, 1);
6596    ADDOP_LOAD_CONST(c, Py_None);
6597    ADDOP_I(c, IS_OP, 1);
6598    // TOS is now a tuple of (nargs + nattrs) attributes (or None):
6599    pc->on_top++;
6600    RETURN_IF_FALSE(jump_to_fail_pop(c, pc, POP_JUMP_IF_FALSE));
6601    ADDOP_I(c, UNPACK_SEQUENCE, nargs + nattrs);
6602    pc->on_top += nargs + nattrs - 1;
6603    for (i = 0; i < nargs + nattrs; i++) {
6604        pc->on_top--;
6605        pattern_ty pattern;
6606        if (i < nargs) {
6607            // Positional:
6608            pattern = asdl_seq_GET(patterns, i);
6609        }
6610        else {
6611            // Keyword:
6612            pattern = asdl_seq_GET(kwd_patterns, i - nargs);
6613        }
6614        if (WILDCARD_CHECK(pattern)) {
6615            ADDOP(c, POP_TOP);
6616            continue;
6617        }
6618        RETURN_IF_FALSE(compiler_pattern_subpattern(c, pattern, pc));
6619    }
6620    // Success! Pop the tuple of attributes:
6621    return 1;
6622}
6623
6624static int
6625compiler_pattern_mapping(struct compiler *c, pattern_ty p, pattern_context *pc)
6626{
6627    assert(p->kind == MatchMapping_kind);
6628    asdl_expr_seq *keys = p->v.MatchMapping.keys;
6629    asdl_pattern_seq *patterns = p->v.MatchMapping.patterns;
6630    Py_ssize_t size = asdl_seq_LEN(keys);
6631    Py_ssize_t npatterns = asdl_seq_LEN(patterns);
6632    if (size != npatterns) {
6633        // AST validator shouldn't let this happen, but if it does,
6634        // just fail, don't crash out of the interpreter
6635        const char * e = "keys (%d) / patterns (%d) length mismatch in mapping pattern";
6636        return compiler_error(c, e, size, npatterns);
6637    }
6638    // We have a double-star target if "rest" is set
6639    PyObject *star_target = p->v.MatchMapping.rest;
6640    // We need to keep the subject on top during the mapping and length checks:
6641    pc->on_top++;
6642    ADDOP(c, MATCH_MAPPING);
6643    RETURN_IF_FALSE(jump_to_fail_pop(c, pc, POP_JUMP_IF_FALSE));
6644    if (!size && !star_target) {
6645        // If the pattern is just "{}", we're done! Pop the subject:
6646        pc->on_top--;
6647        ADDOP(c, POP_TOP);
6648        return 1;
6649    }
6650    if (size) {
6651        // If the pattern has any keys in it, perform a length check:
6652        ADDOP(c, GET_LEN);
6653        ADDOP_LOAD_CONST_NEW(c, PyLong_FromSsize_t(size));
6654        ADDOP_COMPARE(c, GtE);
6655        RETURN_IF_FALSE(jump_to_fail_pop(c, pc, POP_JUMP_IF_FALSE));
6656    }
6657    if (INT_MAX < size - 1) {
6658        return compiler_error(c, "too many sub-patterns in mapping pattern");
6659    }
6660    // Collect all of the keys into a tuple for MATCH_KEYS and
6661    // **rest. They can either be dotted names or literals:
6662
6663    // Maintaining a set of Constant_kind kind keys allows us to raise a
6664    // SyntaxError in the case of duplicates.
6665    PyObject *seen = PySet_New(NULL);
6666    if (seen == NULL) {
6667        return 0;
6668    }
6669
6670    // NOTE: goto error on failure in the loop below to avoid leaking `seen`
6671    for (Py_ssize_t i = 0; i < size; i++) {
6672        expr_ty key = asdl_seq_GET(keys, i);
6673        if (key == NULL) {
6674            const char *e = "can't use NULL keys in MatchMapping "
6675                            "(set 'rest' parameter instead)";
6676            SET_LOC(c, ((pattern_ty) asdl_seq_GET(patterns, i)));
6677            compiler_error(c, e);
6678            goto error;
6679        }
6680
6681        if (key->kind == Constant_kind) {
6682            int in_seen = PySet_Contains(seen, key->v.Constant.value);
6683            if (in_seen < 0) {
6684                goto error;
6685            }
6686            if (in_seen) {
6687                const char *e = "mapping pattern checks duplicate key (%R)";
6688                compiler_error(c, e, key->v.Constant.value);
6689                goto error;
6690            }
6691            if (PySet_Add(seen, key->v.Constant.value)) {
6692                goto error;
6693            }
6694        }
6695
6696        else if (key->kind != Attribute_kind) {
6697            const char *e = "mapping pattern keys may only match literals and attribute lookups";
6698            compiler_error(c, e);
6699            goto error;
6700        }
6701        if (!compiler_visit_expr(c, key)) {
6702            goto error;
6703        }
6704    }
6705
6706    // all keys have been checked; there are no duplicates
6707    Py_DECREF(seen);
6708
6709    ADDOP_I(c, BUILD_TUPLE, size);
6710    ADDOP(c, MATCH_KEYS);
6711    // There's now a tuple of keys and a tuple of values on top of the subject:
6712    pc->on_top += 2;
6713    ADDOP_I(c, COPY, 1);
6714    ADDOP_LOAD_CONST(c, Py_None);
6715    ADDOP_I(c, IS_OP, 1);
6716    RETURN_IF_FALSE(jump_to_fail_pop(c, pc, POP_JUMP_IF_FALSE));
6717    // So far so good. Use that tuple of values on the stack to match
6718    // sub-patterns against:
6719    ADDOP_I(c, UNPACK_SEQUENCE, size);
6720    pc->on_top += size - 1;
6721    for (Py_ssize_t i = 0; i < size; i++) {
6722        pc->on_top--;
6723        pattern_ty pattern = asdl_seq_GET(patterns, i);
6724        RETURN_IF_FALSE(compiler_pattern_subpattern(c, pattern, pc));
6725    }
6726    // If we get this far, it's a match! Whatever happens next should consume
6727    // the tuple of keys and the subject:
6728    pc->on_top -= 2;
6729    if (star_target) {
6730        // If we have a starred name, bind a dict of remaining items to it (this may
6731        // seem a bit inefficient, but keys is rarely big enough to actually impact
6732        // runtime):
6733        // rest = dict(TOS1)
6734        // for key in TOS:
6735        //     del rest[key]
6736        ADDOP_I(c, BUILD_MAP, 0);           // [subject, keys, empty]
6737        ADDOP_I(c, SWAP, 3);                // [empty, keys, subject]
6738        ADDOP_I(c, DICT_UPDATE, 2);         // [copy, keys]
6739        ADDOP_I(c, UNPACK_SEQUENCE, size);  // [copy, keys...]
6740        while (size) {
6741            ADDOP_I(c, COPY, 1 + size--);   // [copy, keys..., copy]
6742            ADDOP_I(c, SWAP, 2);            // [copy, keys..., copy, key]
6743            ADDOP(c, DELETE_SUBSCR);        // [copy, keys...]
6744        }
6745        RETURN_IF_FALSE(pattern_helper_store_name(c, star_target, pc));
6746    }
6747    else {
6748        ADDOP(c, POP_TOP);  // Tuple of keys.
6749        ADDOP(c, POP_TOP);  // Subject.
6750    }
6751    return 1;
6752
6753error:
6754    Py_DECREF(seen);
6755    return 0;
6756}
6757
6758static int
6759compiler_pattern_or(struct compiler *c, pattern_ty p, pattern_context *pc)
6760{
6761    assert(p->kind == MatchOr_kind);
6762    basicblock *end;
6763    RETURN_IF_FALSE(end = compiler_new_block(c));
6764    Py_ssize_t size = asdl_seq_LEN(p->v.MatchOr.patterns);
6765    assert(size > 1);
6766    // We're going to be messing with pc. Keep the original info handy:
6767    pattern_context old_pc = *pc;
6768    Py_INCREF(pc->stores);
6769    // control is the list of names bound by the first alternative. It is used
6770    // for checking different name bindings in alternatives, and for correcting
6771    // the order in which extracted elements are placed on the stack.
6772    PyObject *control = NULL;
6773    // NOTE: We can't use returning macros anymore! goto error on error.
6774    for (Py_ssize_t i = 0; i < size; i++) {
6775        pattern_ty alt = asdl_seq_GET(p->v.MatchOr.patterns, i);
6776        SET_LOC(c, alt);
6777        PyObject *pc_stores = PyList_New(0);
6778        if (pc_stores == NULL) {
6779            goto error;
6780        }
6781        Py_SETREF(pc->stores, pc_stores);
6782        // An irrefutable sub-pattern must be last, if it is allowed at all:
6783        pc->allow_irrefutable = (i == size - 1) && old_pc.allow_irrefutable;
6784        pc->fail_pop = NULL;
6785        pc->fail_pop_size = 0;
6786        pc->on_top = 0;
6787        if (!compiler_addop_i(c, COPY, 1) || !compiler_pattern(c, alt, pc)) {
6788            goto error;
6789        }
6790        // Success!
6791        Py_ssize_t nstores = PyList_GET_SIZE(pc->stores);
6792        if (!i) {
6793            // This is the first alternative, so save its stores as a "control"
6794            // for the others (they can't bind a different set of names, and
6795            // might need to be reordered):
6796            assert(control == NULL);
6797            control = pc->stores;
6798            Py_INCREF(control);
6799        }
6800        else if (nstores != PyList_GET_SIZE(control)) {
6801            goto diff;
6802        }
6803        else if (nstores) {
6804            // There were captures. Check to see if we differ from control:
6805            Py_ssize_t icontrol = nstores;
6806            while (icontrol--) {
6807                PyObject *name = PyList_GET_ITEM(control, icontrol);
6808                Py_ssize_t istores = PySequence_Index(pc->stores, name);
6809                if (istores < 0) {
6810                    PyErr_Clear();
6811                    goto diff;
6812                }
6813                if (icontrol != istores) {
6814                    // Reorder the names on the stack to match the order of the
6815                    // names in control. There's probably a better way of doing
6816                    // this; the current solution is potentially very
6817                    // inefficient when each alternative subpattern binds lots
6818                    // of names in different orders. It's fine for reasonable
6819                    // cases, though, and the peephole optimizer will ensure
6820                    // that the final code is as efficient as possible.
6821                    assert(istores < icontrol);
6822                    Py_ssize_t rotations = istores + 1;
6823                    // Perform the same rotation on pc->stores:
6824                    PyObject *rotated = PyList_GetSlice(pc->stores, 0,
6825                                                        rotations);
6826                    if (rotated == NULL ||
6827                        PyList_SetSlice(pc->stores, 0, rotations, NULL) ||
6828                        PyList_SetSlice(pc->stores, icontrol - istores,
6829                                        icontrol - istores, rotated))
6830                    {
6831                        Py_XDECREF(rotated);
6832                        goto error;
6833                    }
6834                    Py_DECREF(rotated);
6835                    // That just did:
6836                    // rotated = pc_stores[:rotations]
6837                    // del pc_stores[:rotations]
6838                    // pc_stores[icontrol-istores:icontrol-istores] = rotated
6839                    // Do the same thing to the stack, using several
6840                    // rotations:
6841                    while (rotations--) {
6842                        if (!pattern_helper_rotate(c, icontrol + 1)){
6843                            goto error;
6844                        }
6845                    }
6846                }
6847            }
6848        }
6849        assert(control);
6850        if (!compiler_addop_j(c, JUMP, end) ||
6851            !emit_and_reset_fail_pop(c, pc))
6852        {
6853            goto error;
6854        }
6855    }
6856    Py_DECREF(pc->stores);
6857    *pc = old_pc;
6858    Py_INCREF(pc->stores);
6859    // Need to NULL this for the PyObject_Free call in the error block.
6860    old_pc.fail_pop = NULL;
6861    // No match. Pop the remaining copy of the subject and fail:
6862    if (!compiler_addop(c, POP_TOP) || !jump_to_fail_pop(c, pc, JUMP)) {
6863        goto error;
6864    }
6865    compiler_use_next_block(c, end);
6866    Py_ssize_t nstores = PyList_GET_SIZE(control);
6867    // There's a bunch of stuff on the stack between where the new stores
6868    // are and where they need to be:
6869    // - The other stores.
6870    // - A copy of the subject.
6871    // - Anything else that may be on top of the stack.
6872    // - Any previous stores we've already stashed away on the stack.
6873    Py_ssize_t nrots = nstores + 1 + pc->on_top + PyList_GET_SIZE(pc->stores);
6874    for (Py_ssize_t i = 0; i < nstores; i++) {
6875        // Rotate this capture to its proper place on the stack:
6876        if (!pattern_helper_rotate(c, nrots)) {
6877            goto error;
6878        }
6879        // Update the list of previous stores with this new name, checking for
6880        // duplicates:
6881        PyObject *name = PyList_GET_ITEM(control, i);
6882        int dupe = PySequence_Contains(pc->stores, name);
6883        if (dupe < 0) {
6884            goto error;
6885        }
6886        if (dupe) {
6887            compiler_error_duplicate_store(c, name);
6888            goto error;
6889        }
6890        if (PyList_Append(pc->stores, name)) {
6891            goto error;
6892        }
6893    }
6894    Py_DECREF(old_pc.stores);
6895    Py_DECREF(control);
6896    // NOTE: Returning macros are safe again.
6897    // Pop the copy of the subject:
6898    ADDOP(c, POP_TOP);
6899    return 1;
6900diff:
6901    compiler_error(c, "alternative patterns bind different names");
6902error:
6903    PyObject_Free(old_pc.fail_pop);
6904    Py_DECREF(old_pc.stores);
6905    Py_XDECREF(control);
6906    return 0;
6907}
6908
6909
6910static int
6911compiler_pattern_sequence(struct compiler *c, pattern_ty p, pattern_context *pc)
6912{
6913    assert(p->kind == MatchSequence_kind);
6914    asdl_pattern_seq *patterns = p->v.MatchSequence.patterns;
6915    Py_ssize_t size = asdl_seq_LEN(patterns);
6916    Py_ssize_t star = -1;
6917    int only_wildcard = 1;
6918    int star_wildcard = 0;
6919    // Find a starred name, if it exists. There may be at most one:
6920    for (Py_ssize_t i = 0; i < size; i++) {
6921        pattern_ty pattern = asdl_seq_GET(patterns, i);
6922        if (pattern->kind == MatchStar_kind) {
6923            if (star >= 0) {
6924                const char *e = "multiple starred names in sequence pattern";
6925                return compiler_error(c, e);
6926            }
6927            star_wildcard = WILDCARD_STAR_CHECK(pattern);
6928            only_wildcard &= star_wildcard;
6929            star = i;
6930            continue;
6931        }
6932        only_wildcard &= WILDCARD_CHECK(pattern);
6933    }
6934    // We need to keep the subject on top during the sequence and length checks:
6935    pc->on_top++;
6936    ADDOP(c, MATCH_SEQUENCE);
6937    RETURN_IF_FALSE(jump_to_fail_pop(c, pc, POP_JUMP_IF_FALSE));
6938    if (star < 0) {
6939        // No star: len(subject) == size
6940        ADDOP(c, GET_LEN);
6941        ADDOP_LOAD_CONST_NEW(c, PyLong_FromSsize_t(size));
6942        ADDOP_COMPARE(c, Eq);
6943        RETURN_IF_FALSE(jump_to_fail_pop(c, pc, POP_JUMP_IF_FALSE));
6944    }
6945    else if (size > 1) {
6946        // Star: len(subject) >= size - 1
6947        ADDOP(c, GET_LEN);
6948        ADDOP_LOAD_CONST_NEW(c, PyLong_FromSsize_t(size - 1));
6949        ADDOP_COMPARE(c, GtE);
6950        RETURN_IF_FALSE(jump_to_fail_pop(c, pc, POP_JUMP_IF_FALSE));
6951    }
6952    // Whatever comes next should consume the subject:
6953    pc->on_top--;
6954    if (only_wildcard) {
6955        // Patterns like: [] / [_] / [_, _] / [*_] / [_, *_] / [_, _, *_] / etc.
6956        ADDOP(c, POP_TOP);
6957    }
6958    else if (star_wildcard) {
6959        RETURN_IF_FALSE(pattern_helper_sequence_subscr(c, patterns, star, pc));
6960    }
6961    else {
6962        RETURN_IF_FALSE(pattern_helper_sequence_unpack(c, patterns, star, pc));
6963    }
6964    return 1;
6965}
6966
6967static int
6968compiler_pattern_value(struct compiler *c, pattern_ty p, pattern_context *pc)
6969{
6970    assert(p->kind == MatchValue_kind);
6971    expr_ty value = p->v.MatchValue.value;
6972    if (!MATCH_VALUE_EXPR(value)) {
6973        const char *e = "patterns may only match literals and attribute lookups";
6974        return compiler_error(c, e);
6975    }
6976    VISIT(c, expr, value);
6977    ADDOP_COMPARE(c, Eq);
6978    RETURN_IF_FALSE(jump_to_fail_pop(c, pc, POP_JUMP_IF_FALSE));
6979    return 1;
6980}
6981
6982static int
6983compiler_pattern_singleton(struct compiler *c, pattern_ty p, pattern_context *pc)
6984{
6985    assert(p->kind == MatchSingleton_kind);
6986    ADDOP_LOAD_CONST(c, p->v.MatchSingleton.value);
6987    ADDOP_COMPARE(c, Is);
6988    RETURN_IF_FALSE(jump_to_fail_pop(c, pc, POP_JUMP_IF_FALSE));
6989    return 1;
6990}
6991
6992static int
6993compiler_pattern(struct compiler *c, pattern_ty p, pattern_context *pc)
6994{
6995    SET_LOC(c, p);
6996    switch (p->kind) {
6997        case MatchValue_kind:
6998            return compiler_pattern_value(c, p, pc);
6999        case MatchSingleton_kind:
7000            return compiler_pattern_singleton(c, p, pc);
7001        case MatchSequence_kind:
7002            return compiler_pattern_sequence(c, p, pc);
7003        case MatchMapping_kind:
7004            return compiler_pattern_mapping(c, p, pc);
7005        case MatchClass_kind:
7006            return compiler_pattern_class(c, p, pc);
7007        case MatchStar_kind:
7008            return compiler_pattern_star(c, p, pc);
7009        case MatchAs_kind:
7010            return compiler_pattern_as(c, p, pc);
7011        case MatchOr_kind:
7012            return compiler_pattern_or(c, p, pc);
7013    }
7014    // AST validator shouldn't let this happen, but if it does,
7015    // just fail, don't crash out of the interpreter
7016    const char *e = "invalid match pattern node in AST (kind=%d)";
7017    return compiler_error(c, e, p->kind);
7018}
7019
7020static int
7021compiler_match_inner(struct compiler *c, stmt_ty s, pattern_context *pc)
7022{
7023    VISIT(c, expr, s->v.Match.subject);
7024    basicblock *end;
7025    RETURN_IF_FALSE(end = compiler_new_block(c));
7026    Py_ssize_t cases = asdl_seq_LEN(s->v.Match.cases);
7027    assert(cases > 0);
7028    match_case_ty m = asdl_seq_GET(s->v.Match.cases, cases - 1);
7029    int has_default = WILDCARD_CHECK(m->pattern) && 1 < cases;
7030    for (Py_ssize_t i = 0; i < cases - has_default; i++) {
7031        m = asdl_seq_GET(s->v.Match.cases, i);
7032        SET_LOC(c, m->pattern);
7033        // Only copy the subject if we're *not* on the last case:
7034        if (i != cases - has_default - 1) {
7035            ADDOP_I(c, COPY, 1);
7036        }
7037        RETURN_IF_FALSE(pc->stores = PyList_New(0));
7038        // Irrefutable cases must be either guarded, last, or both:
7039        pc->allow_irrefutable = m->guard != NULL || i == cases - 1;
7040        pc->fail_pop = NULL;
7041        pc->fail_pop_size = 0;
7042        pc->on_top = 0;
7043        // NOTE: Can't use returning macros here (they'll leak pc->stores)!
7044        if (!compiler_pattern(c, m->pattern, pc)) {
7045            Py_DECREF(pc->stores);
7046            return 0;
7047        }
7048        assert(!pc->on_top);
7049        // It's a match! Store all of the captured names (they're on the stack).
7050        Py_ssize_t nstores = PyList_GET_SIZE(pc->stores);
7051        for (Py_ssize_t n = 0; n < nstores; n++) {
7052            PyObject *name = PyList_GET_ITEM(pc->stores, n);
7053            if (!compiler_nameop(c, name, Store)) {
7054                Py_DECREF(pc->stores);
7055                return 0;
7056            }
7057        }
7058        Py_DECREF(pc->stores);
7059        // NOTE: Returning macros are safe again.
7060        if (m->guard) {
7061            RETURN_IF_FALSE(ensure_fail_pop(c, pc, 0));
7062            RETURN_IF_FALSE(compiler_jump_if(c, m->guard, pc->fail_pop[0], 0));
7063        }
7064        // Success! Pop the subject off, we're done with it:
7065        if (i != cases - has_default - 1) {
7066            ADDOP(c, POP_TOP);
7067        }
7068        VISIT_SEQ(c, stmt, m->body);
7069        UNSET_LOC(c);
7070        ADDOP_JUMP(c, JUMP, end);
7071        // If the pattern fails to match, we want the line number of the
7072        // cleanup to be associated with the failed pattern, not the last line
7073        // of the body
7074        SET_LOC(c, m->pattern);
7075        RETURN_IF_FALSE(emit_and_reset_fail_pop(c, pc));
7076    }
7077    if (has_default) {
7078        // A trailing "case _" is common, and lets us save a bit of redundant
7079        // pushing and popping in the loop above:
7080        m = asdl_seq_GET(s->v.Match.cases, cases - 1);
7081        SET_LOC(c, m->pattern);
7082        if (cases == 1) {
7083            // No matches. Done with the subject:
7084            ADDOP(c, POP_TOP);
7085        }
7086        else {
7087            // Show line coverage for default case (it doesn't create bytecode)
7088            ADDOP(c, NOP);
7089        }
7090        if (m->guard) {
7091            RETURN_IF_FALSE(compiler_jump_if(c, m->guard, end, 0));
7092        }
7093        VISIT_SEQ(c, stmt, m->body);
7094        UNSET_LOC(c);
7095    }
7096    compiler_use_next_block(c, end);
7097    return 1;
7098}
7099
7100static int
7101compiler_match(struct compiler *c, stmt_ty s)
7102{
7103    pattern_context pc;
7104    pc.fail_pop = NULL;
7105    int result = compiler_match_inner(c, s, &pc);
7106    PyObject_Free(pc.fail_pop);
7107    return result;
7108}
7109
7110#undef WILDCARD_CHECK
7111#undef WILDCARD_STAR_CHECK
7112
7113/* End of the compiler section, beginning of the assembler section */
7114
7115/* do depth-first search of basic block graph, starting with block.
7116   post records the block indices in post-order.
7117
7118   XXX must handle implicit jumps from one block to next
7119*/
7120
7121
7122struct assembler {
7123    PyObject *a_bytecode;  /* bytes containing bytecode */
7124    PyObject *a_except_table;  /* bytes containing exception table */
7125    basicblock *a_entry;
7126    int a_offset;              /* offset into bytecode */
7127    int a_nblocks;             /* number of reachable blocks */
7128    int a_except_table_off;    /* offset into exception table */
7129    int a_prevlineno;     /* lineno of last emitted line in line table */
7130    int a_prev_end_lineno; /* end_lineno of last emitted line in line table */
7131    int a_lineno;          /* lineno of last emitted instruction */
7132    int a_end_lineno;      /* end_lineno of last emitted instruction */
7133    int a_lineno_start;    /* bytecode start offset of current lineno */
7134    int a_end_lineno_start; /* bytecode start offset of current end_lineno */
7135    /* Location Info */
7136    PyObject* a_linetable; /* bytes containing location info */
7137    int a_location_off;    /* offset of last written location info frame */
7138};
7139
7140Py_LOCAL_INLINE(void)
7141stackdepth_push(basicblock ***sp, basicblock *b, int depth)
7142{
7143    assert(b->b_startdepth < 0 || b->b_startdepth == depth);
7144    if (b->b_startdepth < depth && b->b_startdepth < 100) {
7145        assert(b->b_startdepth < 0);
7146        b->b_startdepth = depth;
7147        *(*sp)++ = b;
7148    }
7149}
7150
7151/* Find the flow path that needs the largest stack.  We assume that
7152 * cycles in the flow graph have no net effect on the stack depth.
7153 */
7154static int
7155stackdepth(struct compiler *c)
7156{
7157    basicblock *b, *entryblock = NULL;
7158    basicblock **stack, **sp;
7159    int nblocks = 0, maxdepth = 0;
7160    for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
7161        b->b_startdepth = INT_MIN;
7162        entryblock = b;
7163        nblocks++;
7164    }
7165    assert(entryblock!= NULL);
7166    stack = (basicblock **)PyObject_Malloc(sizeof(basicblock *) * nblocks);
7167    if (!stack) {
7168        PyErr_NoMemory();
7169        return -1;
7170    }
7171
7172    sp = stack;
7173    if (c->u->u_ste->ste_generator || c->u->u_ste->ste_coroutine) {
7174        stackdepth_push(&sp, entryblock, 1);
7175    } else {
7176        stackdepth_push(&sp, entryblock, 0);
7177    }
7178    while (sp != stack) {
7179        b = *--sp;
7180        int depth = b->b_startdepth;
7181        assert(depth >= 0);
7182        basicblock *next = b->b_next;
7183        for (int i = 0; i < b->b_iused; i++) {
7184            struct instr *instr = &b->b_instr[i];
7185            int effect = stack_effect(instr->i_opcode, instr->i_oparg, 0);
7186            if (effect == PY_INVALID_STACK_EFFECT) {
7187                PyErr_Format(PyExc_SystemError,
7188                             "compiler stack_effect(opcode=%d, arg=%i) failed",
7189                             instr->i_opcode, instr->i_oparg);
7190                return -1;
7191            }
7192            int new_depth = depth + effect;
7193            if (new_depth > maxdepth) {
7194                maxdepth = new_depth;
7195            }
7196            assert(depth >= 0); /* invalid code or bug in stackdepth() */
7197            if (is_jump(instr) || is_block_push(instr)) {
7198                effect = stack_effect(instr->i_opcode, instr->i_oparg, 1);
7199                assert(effect != PY_INVALID_STACK_EFFECT);
7200                int target_depth = depth + effect;
7201                if (target_depth > maxdepth) {
7202                    maxdepth = target_depth;
7203                }
7204                assert(target_depth >= 0); /* invalid code or bug in stackdepth() */
7205                stackdepth_push(&sp, instr->i_target, target_depth);
7206            }
7207            depth = new_depth;
7208            assert(!IS_ASSEMBLER_OPCODE(instr->i_opcode));
7209            if (instr->i_opcode == JUMP_NO_INTERRUPT ||
7210                instr->i_opcode == JUMP ||
7211                instr->i_opcode == RETURN_VALUE ||
7212                instr->i_opcode == RAISE_VARARGS ||
7213                instr->i_opcode == RERAISE)
7214            {
7215                /* remaining code is dead */
7216                next = NULL;
7217                break;
7218            }
7219        }
7220        if (next != NULL) {
7221            assert(b->b_nofallthrough == 0);
7222            stackdepth_push(&sp, next, depth);
7223        }
7224    }
7225    PyObject_Free(stack);
7226    return maxdepth;
7227}
7228
7229static int
7230assemble_init(struct assembler *a, int nblocks, int firstlineno)
7231{
7232    memset(a, 0, sizeof(struct assembler));
7233    a->a_prevlineno = a->a_lineno = firstlineno;
7234    a->a_prev_end_lineno = a->a_end_lineno = firstlineno;
7235    a->a_linetable = NULL;
7236    a->a_location_off = 0;
7237    a->a_except_table = NULL;
7238    a->a_bytecode = PyBytes_FromStringAndSize(NULL, DEFAULT_CODE_SIZE);
7239    if (a->a_bytecode == NULL) {
7240        goto error;
7241    }
7242    a->a_linetable = PyBytes_FromStringAndSize(NULL, DEFAULT_CNOTAB_SIZE);
7243    if (a->a_linetable == NULL) {
7244        goto error;
7245    }
7246    a->a_except_table = PyBytes_FromStringAndSize(NULL, DEFAULT_LNOTAB_SIZE);
7247    if (a->a_except_table == NULL) {
7248        goto error;
7249    }
7250    if ((size_t)nblocks > SIZE_MAX / sizeof(basicblock *)) {
7251        PyErr_NoMemory();
7252        goto error;
7253    }
7254    return 1;
7255error:
7256    Py_XDECREF(a->a_bytecode);
7257    Py_XDECREF(a->a_linetable);
7258    Py_XDECREF(a->a_except_table);
7259    return 0;
7260}
7261
7262static void
7263assemble_free(struct assembler *a)
7264{
7265    Py_XDECREF(a->a_bytecode);
7266    Py_XDECREF(a->a_linetable);
7267    Py_XDECREF(a->a_except_table);
7268}
7269
7270static int
7271blocksize(basicblock *b)
7272{
7273    int i;
7274    int size = 0;
7275
7276    for (i = 0; i < b->b_iused; i++) {
7277        size += instr_size(&b->b_instr[i]);
7278    }
7279    return size;
7280}
7281
7282static basicblock *
7283push_except_block(ExceptStack *stack, struct instr *setup) {
7284    assert(is_block_push(setup));
7285    int opcode = setup->i_opcode;
7286    basicblock * target = setup->i_target;
7287    if (opcode == SETUP_WITH || opcode == SETUP_CLEANUP) {
7288        target->b_preserve_lasti = 1;
7289    }
7290    stack->handlers[++stack->depth] = target;
7291    return target;
7292}
7293
7294static basicblock *
7295pop_except_block(ExceptStack *stack) {
7296    assert(stack->depth > 0);
7297    return stack->handlers[--stack->depth];
7298}
7299
7300static basicblock *
7301except_stack_top(ExceptStack *stack) {
7302    return stack->handlers[stack->depth];
7303}
7304
7305static ExceptStack *
7306make_except_stack(void) {
7307    ExceptStack *new = PyMem_Malloc(sizeof(ExceptStack));
7308    if (new == NULL) {
7309        PyErr_NoMemory();
7310        return NULL;
7311    }
7312    new->depth = 0;
7313    new->handlers[0] = NULL;
7314    return new;
7315}
7316
7317static ExceptStack *
7318copy_except_stack(ExceptStack *stack) {
7319    ExceptStack *copy = PyMem_Malloc(sizeof(ExceptStack));
7320    if (copy == NULL) {
7321        PyErr_NoMemory();
7322        return NULL;
7323    }
7324    memcpy(copy, stack, sizeof(ExceptStack));
7325    return copy;
7326}
7327
7328static int
7329label_exception_targets(basicblock *entry) {
7330    int nblocks = 0;
7331    for (basicblock *b = entry; b != NULL; b = b->b_next) {
7332        b->b_visited = 0;
7333        nblocks++;
7334    }
7335    basicblock **todo_stack = PyMem_Malloc(sizeof(basicblock *)*nblocks);
7336    if (todo_stack == NULL) {
7337        PyErr_NoMemory();
7338        return -1;
7339    }
7340    ExceptStack *except_stack = make_except_stack();
7341    if (except_stack == NULL) {
7342        PyMem_Free(todo_stack);
7343        PyErr_NoMemory();
7344        return -1;
7345    }
7346    except_stack->depth = 0;
7347    todo_stack[0] = entry;
7348    entry->b_visited = 1;
7349    entry->b_exceptstack = except_stack;
7350    basicblock **todo = &todo_stack[1];
7351    basicblock *handler = NULL;
7352    while (todo > todo_stack) {
7353        todo--;
7354        basicblock *b = todo[0];
7355        assert(b->b_visited == 1);
7356        except_stack = b->b_exceptstack;
7357        assert(except_stack != NULL);
7358        b->b_exceptstack = NULL;
7359        handler = except_stack_top(except_stack);
7360        for (int i = 0; i < b->b_iused; i++) {
7361            struct instr *instr = &b->b_instr[i];
7362            if (is_block_push(instr)) {
7363                if (!instr->i_target->b_visited) {
7364                    ExceptStack *copy = copy_except_stack(except_stack);
7365                    if (copy == NULL) {
7366                        goto error;
7367                    }
7368                    instr->i_target->b_exceptstack = copy;
7369                    todo[0] = instr->i_target;
7370                    instr->i_target->b_visited = 1;
7371                    todo++;
7372                }
7373                handler = push_except_block(except_stack, instr);
7374            }
7375            else if (instr->i_opcode == POP_BLOCK) {
7376                handler = pop_except_block(except_stack);
7377            }
7378            else if (is_jump(instr)) {
7379                instr->i_except = handler;
7380                assert(i == b->b_iused -1);
7381                if (!instr->i_target->b_visited) {
7382                    if (b->b_nofallthrough == 0) {
7383                        ExceptStack *copy = copy_except_stack(except_stack);
7384                        if (copy == NULL) {
7385                            goto error;
7386                        }
7387                        instr->i_target->b_exceptstack = copy;
7388                    }
7389                    else {
7390                        instr->i_target->b_exceptstack = except_stack;
7391                        except_stack = NULL;
7392                    }
7393                    todo[0] = instr->i_target;
7394                    instr->i_target->b_visited = 1;
7395                    todo++;
7396                }
7397            }
7398            else {
7399                instr->i_except = handler;
7400            }
7401        }
7402        if (b->b_nofallthrough == 0 && !b->b_next->b_visited) {
7403            assert(except_stack != NULL);
7404            b->b_next->b_exceptstack = except_stack;
7405            todo[0] = b->b_next;
7406            b->b_next->b_visited = 1;
7407            todo++;
7408        }
7409        else if (except_stack != NULL) {
7410           PyMem_Free(except_stack);
7411        }
7412    }
7413#ifdef Py_DEBUG
7414    for (basicblock *b = entry; b != NULL; b = b->b_next) {
7415        assert(b->b_exceptstack == NULL);
7416    }
7417#endif
7418    PyMem_Free(todo_stack);
7419    return 0;
7420error:
7421    PyMem_Free(todo_stack);
7422    PyMem_Free(except_stack);
7423    return -1;
7424}
7425
7426
7427static void
7428convert_exception_handlers_to_nops(basicblock *entry) {
7429    for (basicblock *b = entry; b != NULL; b = b->b_next) {
7430        for (int i = 0; i < b->b_iused; i++) {
7431            struct instr *instr = &b->b_instr[i];
7432            if (is_block_push(instr) || instr->i_opcode == POP_BLOCK) {
7433                instr->i_opcode = NOP;
7434            }
7435        }
7436    }
7437}
7438
7439static inline void
7440write_except_byte(struct assembler *a, int byte) {
7441    unsigned char *p = (unsigned char *) PyBytes_AS_STRING(a->a_except_table);
7442    p[a->a_except_table_off++] = byte;
7443}
7444
7445#define CONTINUATION_BIT 64
7446
7447static void
7448assemble_emit_exception_table_item(struct assembler *a, int value, int msb)
7449{
7450    assert ((msb | 128) == 128);
7451    assert(value >= 0 && value < (1 << 30));
7452    if (value >= 1 << 24) {
7453        write_except_byte(a, (value >> 24) | CONTINUATION_BIT | msb);
7454        msb = 0;
7455    }
7456    if (value >= 1 << 18) {
7457        write_except_byte(a, ((value >> 18)&0x3f) | CONTINUATION_BIT | msb);
7458        msb = 0;
7459    }
7460    if (value >= 1 << 12) {
7461        write_except_byte(a, ((value >> 12)&0x3f) | CONTINUATION_BIT | msb);
7462        msb = 0;
7463    }
7464    if (value >= 1 << 6) {
7465        write_except_byte(a, ((value >> 6)&0x3f) | CONTINUATION_BIT | msb);
7466        msb = 0;
7467    }
7468    write_except_byte(a, (value&0x3f) | msb);
7469}
7470
7471/* See Objects/exception_handling_notes.txt for details of layout */
7472#define MAX_SIZE_OF_ENTRY 20
7473
7474static int
7475assemble_emit_exception_table_entry(struct assembler *a, int start, int end, basicblock *handler)
7476{
7477    Py_ssize_t len = PyBytes_GET_SIZE(a->a_except_table);
7478    if (a->a_except_table_off + MAX_SIZE_OF_ENTRY >= len) {
7479        if (_PyBytes_Resize(&a->a_except_table, len * 2) < 0)
7480            return 0;
7481    }
7482    int size = end-start;
7483    assert(end > start);
7484    int target = handler->b_offset;
7485    int depth = handler->b_startdepth - 1;
7486    if (handler->b_preserve_lasti) {
7487        depth -= 1;
7488    }
7489    assert(depth >= 0);
7490    int depth_lasti = (depth<<1) | handler->b_preserve_lasti;
7491    assemble_emit_exception_table_item(a, start, (1<<7));
7492    assemble_emit_exception_table_item(a, size, 0);
7493    assemble_emit_exception_table_item(a, target, 0);
7494    assemble_emit_exception_table_item(a, depth_lasti, 0);
7495    return 1;
7496}
7497
7498static int
7499assemble_exception_table(struct assembler *a)
7500{
7501    basicblock *b;
7502    int ioffset = 0;
7503    basicblock *handler = NULL;
7504    int start = -1;
7505    for (b = a->a_entry; b != NULL; b = b->b_next) {
7506        ioffset = b->b_offset;
7507        for (int i = 0; i < b->b_iused; i++) {
7508            struct instr *instr = &b->b_instr[i];
7509            if (instr->i_except != handler) {
7510                if (handler != NULL) {
7511                    RETURN_IF_FALSE(assemble_emit_exception_table_entry(a, start, ioffset, handler));
7512                }
7513                start = ioffset;
7514                handler = instr->i_except;
7515            }
7516            ioffset += instr_size(instr);
7517        }
7518    }
7519    if (handler != NULL) {
7520        RETURN_IF_FALSE(assemble_emit_exception_table_entry(a, start, ioffset, handler));
7521    }
7522    return 1;
7523}
7524
7525/* Code location emitting code. See locations.md for a description of the format. */
7526
7527#define MSB 0x80
7528
7529static void
7530write_location_byte(struct assembler* a, int val)
7531{
7532    PyBytes_AS_STRING(a->a_linetable)[a->a_location_off] = val&255;
7533    a->a_location_off++;
7534}
7535
7536
7537static uint8_t *
7538location_pointer(struct assembler* a)
7539{
7540    return (uint8_t *)PyBytes_AS_STRING(a->a_linetable) +
7541        a->a_location_off;
7542}
7543
7544static void
7545write_location_first_byte(struct assembler* a, int code, int length)
7546{
7547    a->a_location_off += write_location_entry_start(
7548        location_pointer(a), code, length);
7549}
7550
7551static void
7552write_location_varint(struct assembler* a, unsigned int val)
7553{
7554    uint8_t *ptr = location_pointer(a);
7555    a->a_location_off += write_varint(ptr, val);
7556}
7557
7558
7559static void
7560write_location_signed_varint(struct assembler* a, int val)
7561{
7562    uint8_t *ptr = location_pointer(a);
7563    a->a_location_off += write_signed_varint(ptr, val);
7564}
7565
7566static void
7567write_location_info_short_form(struct assembler* a, int length, int column, int end_column)
7568{
7569    assert(length > 0 &&  length <= 8);
7570    int column_low_bits = column & 7;
7571    int column_group = column >> 3;
7572    assert(column < 80);
7573    assert(end_column >= column);
7574    assert(end_column - column < 16);
7575    write_location_first_byte(a, PY_CODE_LOCATION_INFO_SHORT0 + column_group, length);
7576    write_location_byte(a, (column_low_bits << 4) | (end_column - column));
7577}
7578
7579static void
7580write_location_info_oneline_form(struct assembler* a, int length, int line_delta, int column, int end_column)
7581{
7582    assert(length > 0 &&  length <= 8);
7583    assert(line_delta >= 0 && line_delta < 3);
7584    assert(column < 128);
7585    assert(end_column < 128);
7586    write_location_first_byte(a, PY_CODE_LOCATION_INFO_ONE_LINE0 + line_delta, length);
7587    write_location_byte(a, column);
7588    write_location_byte(a, end_column);
7589}
7590
7591static void
7592write_location_info_long_form(struct assembler* a, struct instr* i, int length)
7593{
7594    assert(length > 0 &&  length <= 8);
7595    write_location_first_byte(a, PY_CODE_LOCATION_INFO_LONG, length);
7596    write_location_signed_varint(a, i->i_lineno - a->a_lineno);
7597    assert(i->i_end_lineno >= i->i_lineno);
7598    write_location_varint(a, i->i_end_lineno - i->i_lineno);
7599    write_location_varint(a, i->i_col_offset+1);
7600    write_location_varint(a, i->i_end_col_offset+1);
7601}
7602
7603static void
7604write_location_info_none(struct assembler* a, int length)
7605{
7606    write_location_first_byte(a, PY_CODE_LOCATION_INFO_NONE, length);
7607}
7608
7609static void
7610write_location_info_no_column(struct assembler* a, int length, int line_delta)
7611{
7612    write_location_first_byte(a, PY_CODE_LOCATION_INFO_NO_COLUMNS, length);
7613    write_location_signed_varint(a, line_delta);
7614}
7615
7616#define THEORETICAL_MAX_ENTRY_SIZE 25 /* 1 + 6 + 6 + 6 + 6 */
7617
7618static int
7619write_location_info_entry(struct assembler* a, struct instr* i, int isize)
7620{
7621    Py_ssize_t len = PyBytes_GET_SIZE(a->a_linetable);
7622    if (a->a_location_off + THEORETICAL_MAX_ENTRY_SIZE >= len) {
7623        assert(len > THEORETICAL_MAX_ENTRY_SIZE);
7624        if (_PyBytes_Resize(&a->a_linetable, len*2) < 0) {
7625            return 0;
7626        }
7627    }
7628    if (i->i_lineno < 0) {
7629        write_location_info_none(a, isize);
7630        return 1;
7631    }
7632    int line_delta = i->i_lineno - a->a_lineno;
7633    int column = i->i_col_offset;
7634    int end_column = i->i_end_col_offset;
7635    assert(column >= -1);
7636    assert(end_column >= -1);
7637    if (column < 0 || end_column < 0) {
7638        if (i->i_end_lineno == i->i_lineno || i->i_end_lineno == -1) {
7639            write_location_info_no_column(a, isize, line_delta);
7640            a->a_lineno = i->i_lineno;
7641            return 1;
7642        }
7643    }
7644    else if (i->i_end_lineno == i->i_lineno) {
7645        if (line_delta == 0 && column < 80 && end_column - column < 16 && end_column >= column) {
7646            write_location_info_short_form(a, isize, column, end_column);
7647            return 1;
7648        }
7649        if (line_delta >= 0 && line_delta < 3 && column < 128 && end_column < 128) {
7650            write_location_info_oneline_form(a, isize, line_delta, column, end_column);
7651            a->a_lineno = i->i_lineno;
7652            return 1;
7653        }
7654    }
7655    write_location_info_long_form(a, i, isize);
7656    a->a_lineno = i->i_lineno;
7657    return 1;
7658}
7659
7660static int
7661assemble_emit_location(struct assembler* a, struct instr* i)
7662{
7663    int isize = instr_size(i);
7664    while (isize > 8) {
7665        if (!write_location_info_entry(a, i, 8)) {
7666            return 0;
7667        }
7668        isize -= 8;
7669    }
7670    return write_location_info_entry(a, i, isize);
7671}
7672
7673/* assemble_emit()
7674   Extend the bytecode with a new instruction.
7675   Update lnotab if necessary.
7676*/
7677
7678static int
7679assemble_emit(struct assembler *a, struct instr *i)
7680{
7681    Py_ssize_t len = PyBytes_GET_SIZE(a->a_bytecode);
7682    _Py_CODEUNIT *code;
7683
7684    int size = instr_size(i);
7685    if (a->a_offset + size >= len / (int)sizeof(_Py_CODEUNIT)) {
7686        if (len > PY_SSIZE_T_MAX / 2)
7687            return 0;
7688        if (_PyBytes_Resize(&a->a_bytecode, len * 2) < 0)
7689            return 0;
7690    }
7691    code = (_Py_CODEUNIT *)PyBytes_AS_STRING(a->a_bytecode) + a->a_offset;
7692    a->a_offset += size;
7693    write_instr(code, i, size);
7694    return 1;
7695}
7696
7697static void
7698normalize_jumps(struct assembler *a)
7699{
7700    for (basicblock *b = a->a_entry; b != NULL; b = b->b_next) {
7701        b->b_visited = 0;
7702    }
7703    for (basicblock *b = a->a_entry; b != NULL; b = b->b_next) {
7704        b->b_visited = 1;
7705        if (b->b_iused == 0) {
7706            continue;
7707        }
7708        struct instr *last = &b->b_instr[b->b_iused-1];
7709        assert(!IS_ASSEMBLER_OPCODE(last->i_opcode));
7710        if (is_jump(last)) {
7711            bool is_forward = last->i_target->b_visited == 0;
7712            switch(last->i_opcode) {
7713                case JUMP:
7714                    last->i_opcode = is_forward ? JUMP_FORWARD : JUMP_BACKWARD;
7715                    break;
7716                case JUMP_NO_INTERRUPT:
7717                    last->i_opcode = is_forward ?
7718                        JUMP_FORWARD : JUMP_BACKWARD_NO_INTERRUPT;
7719                    break;
7720                case POP_JUMP_IF_NOT_NONE:
7721                    last->i_opcode = is_forward ?
7722                        POP_JUMP_FORWARD_IF_NOT_NONE : POP_JUMP_BACKWARD_IF_NOT_NONE;
7723                    break;
7724                case POP_JUMP_IF_NONE:
7725                    last->i_opcode = is_forward ?
7726                        POP_JUMP_FORWARD_IF_NONE : POP_JUMP_BACKWARD_IF_NONE;
7727                    break;
7728                case POP_JUMP_IF_FALSE:
7729                    last->i_opcode = is_forward ?
7730                        POP_JUMP_FORWARD_IF_FALSE : POP_JUMP_BACKWARD_IF_FALSE;
7731                    break;
7732                case POP_JUMP_IF_TRUE:
7733                    last->i_opcode = is_forward ?
7734                        POP_JUMP_FORWARD_IF_TRUE : POP_JUMP_BACKWARD_IF_TRUE;
7735                    break;
7736                case JUMP_IF_TRUE_OR_POP:
7737                case JUMP_IF_FALSE_OR_POP:
7738                    if (!is_forward) {
7739                        /* As far as we can tell, the compiler never emits
7740                         * these jumps with a backwards target. If/when this
7741                         * exception is raised, we have found a use case for
7742                         * a backwards version of this jump (or to replace
7743                         * it with the sequence (COPY 1, POP_JUMP_IF_T/F, POP)
7744                         */
7745                        PyErr_Format(PyExc_SystemError,
7746                            "unexpected %s jumping backwards",
7747                            last->i_opcode == JUMP_IF_TRUE_OR_POP ?
7748                                "JUMP_IF_TRUE_OR_POP" : "JUMP_IF_FALSE_OR_POP");
7749                    }
7750                    break;
7751            }
7752        }
7753    }
7754}
7755
7756static void
7757assemble_jump_offsets(struct assembler *a, struct compiler *c)
7758{
7759    basicblock *b;
7760    int bsize, totsize, extended_arg_recompile;
7761    int i;
7762
7763    /* Compute the size of each block and fixup jump args.
7764       Replace block pointer with position in bytecode. */
7765    do {
7766        totsize = 0;
7767        for (basicblock *b = a->a_entry; b != NULL; b = b->b_next) {
7768            bsize = blocksize(b);
7769            b->b_offset = totsize;
7770            totsize += bsize;
7771        }
7772        extended_arg_recompile = 0;
7773        for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
7774            bsize = b->b_offset;
7775            for (i = 0; i < b->b_iused; i++) {
7776                struct instr *instr = &b->b_instr[i];
7777                int isize = instr_size(instr);
7778                /* Relative jumps are computed relative to
7779                   the instruction pointer after fetching
7780                   the jump instruction.
7781                */
7782                bsize += isize;
7783                if (is_jump(instr)) {
7784                    instr->i_oparg = instr->i_target->b_offset;
7785                    if (is_relative_jump(instr)) {
7786                        if (instr->i_oparg < bsize) {
7787                            assert(IS_BACKWARDS_JUMP_OPCODE(instr->i_opcode));
7788                            instr->i_oparg = bsize - instr->i_oparg;
7789                        }
7790                        else {
7791                            assert(!IS_BACKWARDS_JUMP_OPCODE(instr->i_opcode));
7792                            instr->i_oparg -= bsize;
7793                        }
7794                    }
7795                    else {
7796                        assert(!IS_BACKWARDS_JUMP_OPCODE(instr->i_opcode));
7797                    }
7798                    if (instr_size(instr) != isize) {
7799                        extended_arg_recompile = 1;
7800                    }
7801                }
7802            }
7803        }
7804
7805    /* XXX: This is an awful hack that could hurt performance, but
7806        on the bright side it should work until we come up
7807        with a better solution.
7808
7809        The issue is that in the first loop blocksize() is called
7810        which calls instr_size() which requires i_oparg be set
7811        appropriately. There is a bootstrap problem because
7812        i_oparg is calculated in the second loop above.
7813
7814        So we loop until we stop seeing new EXTENDED_ARGs.
7815        The only EXTENDED_ARGs that could be popping up are
7816        ones in jump instructions.  So this should converge
7817        fairly quickly.
7818    */
7819    } while (extended_arg_recompile);
7820}
7821
7822static PyObject *
7823dict_keys_inorder(PyObject *dict, Py_ssize_t offset)
7824{
7825    PyObject *tuple, *k, *v;
7826    Py_ssize_t i, pos = 0, size = PyDict_GET_SIZE(dict);
7827
7828    tuple = PyTuple_New(size);
7829    if (tuple == NULL)
7830        return NULL;
7831    while (PyDict_Next(dict, &pos, &k, &v)) {
7832        i = PyLong_AS_LONG(v);
7833        Py_INCREF(k);
7834        assert((i - offset) < size);
7835        assert((i - offset) >= 0);
7836        PyTuple_SET_ITEM(tuple, i - offset, k);
7837    }
7838    return tuple;
7839}
7840
7841static PyObject *
7842consts_dict_keys_inorder(PyObject *dict)
7843{
7844    PyObject *consts, *k, *v;
7845    Py_ssize_t i, pos = 0, size = PyDict_GET_SIZE(dict);
7846
7847    consts = PyList_New(size);   /* PyCode_Optimize() requires a list */
7848    if (consts == NULL)
7849        return NULL;
7850    while (PyDict_Next(dict, &pos, &k, &v)) {
7851        i = PyLong_AS_LONG(v);
7852        /* The keys of the dictionary can be tuples wrapping a constant.
7853         * (see compiler_add_o and _PyCode_ConstantKey). In that case
7854         * the object we want is always second. */
7855        if (PyTuple_CheckExact(k)) {
7856            k = PyTuple_GET_ITEM(k, 1);
7857        }
7858        Py_INCREF(k);
7859        assert(i < size);
7860        assert(i >= 0);
7861        PyList_SET_ITEM(consts, i, k);
7862    }
7863    return consts;
7864}
7865
7866static int
7867compute_code_flags(struct compiler *c)
7868{
7869    PySTEntryObject *ste = c->u->u_ste;
7870    int flags = 0;
7871    if (ste->ste_type == FunctionBlock) {
7872        flags |= CO_NEWLOCALS | CO_OPTIMIZED;
7873        if (ste->ste_nested)
7874            flags |= CO_NESTED;
7875        if (ste->ste_generator && !ste->ste_coroutine)
7876            flags |= CO_GENERATOR;
7877        if (!ste->ste_generator && ste->ste_coroutine)
7878            flags |= CO_COROUTINE;
7879        if (ste->ste_generator && ste->ste_coroutine)
7880            flags |= CO_ASYNC_GENERATOR;
7881        if (ste->ste_varargs)
7882            flags |= CO_VARARGS;
7883        if (ste->ste_varkeywords)
7884            flags |= CO_VARKEYWORDS;
7885    }
7886
7887    /* (Only) inherit compilerflags in PyCF_MASK */
7888    flags |= (c->c_flags->cf_flags & PyCF_MASK);
7889
7890    if ((IS_TOP_LEVEL_AWAIT(c)) &&
7891         ste->ste_coroutine &&
7892         !ste->ste_generator) {
7893        flags |= CO_COROUTINE;
7894    }
7895
7896    return flags;
7897}
7898
7899// Merge *obj* with constant cache.
7900// Unlike merge_consts_recursive(), this function doesn't work recursively.
7901static int
7902merge_const_one(struct compiler *c, PyObject **obj)
7903{
7904    PyObject *key = _PyCode_ConstantKey(*obj);
7905    if (key == NULL) {
7906        return 0;
7907    }
7908
7909    // t is borrowed reference
7910    PyObject *t = PyDict_SetDefault(c->c_const_cache, key, key);
7911    Py_DECREF(key);
7912    if (t == NULL) {
7913        return 0;
7914    }
7915    if (t == key) {  // obj is new constant.
7916        return 1;
7917    }
7918
7919    if (PyTuple_CheckExact(t)) {
7920        // t is still borrowed reference
7921        t = PyTuple_GET_ITEM(t, 1);
7922    }
7923
7924    Py_INCREF(t);
7925    Py_DECREF(*obj);
7926    *obj = t;
7927    return 1;
7928}
7929
7930// This is in codeobject.c.
7931extern void _Py_set_localsplus_info(int, PyObject *, unsigned char,
7932                                   PyObject *, PyObject *);
7933
7934static void
7935compute_localsplus_info(struct compiler *c, int nlocalsplus,
7936                        PyObject *names, PyObject *kinds)
7937{
7938    PyObject *k, *v;
7939    Py_ssize_t pos = 0;
7940    while (PyDict_Next(c->u->u_varnames, &pos, &k, &v)) {
7941        int offset = (int)PyLong_AS_LONG(v);
7942        assert(offset >= 0);
7943        assert(offset < nlocalsplus);
7944        // For now we do not distinguish arg kinds.
7945        _PyLocals_Kind kind = CO_FAST_LOCAL;
7946        if (PyDict_GetItem(c->u->u_cellvars, k) != NULL) {
7947            kind |= CO_FAST_CELL;
7948        }
7949        _Py_set_localsplus_info(offset, k, kind, names, kinds);
7950    }
7951    int nlocals = (int)PyDict_GET_SIZE(c->u->u_varnames);
7952
7953    // This counter mirrors the fix done in fix_cell_offsets().
7954    int numdropped = 0;
7955    pos = 0;
7956    while (PyDict_Next(c->u->u_cellvars, &pos, &k, &v)) {
7957        if (PyDict_GetItem(c->u->u_varnames, k) != NULL) {
7958            // Skip cells that are already covered by locals.
7959            numdropped += 1;
7960            continue;
7961        }
7962        int offset = (int)PyLong_AS_LONG(v);
7963        assert(offset >= 0);
7964        offset += nlocals - numdropped;
7965        assert(offset < nlocalsplus);
7966        _Py_set_localsplus_info(offset, k, CO_FAST_CELL, names, kinds);
7967    }
7968
7969    pos = 0;
7970    while (PyDict_Next(c->u->u_freevars, &pos, &k, &v)) {
7971        int offset = (int)PyLong_AS_LONG(v);
7972        assert(offset >= 0);
7973        offset += nlocals - numdropped;
7974        assert(offset < nlocalsplus);
7975        _Py_set_localsplus_info(offset, k, CO_FAST_FREE, names, kinds);
7976    }
7977}
7978
7979static PyCodeObject *
7980makecode(struct compiler *c, struct assembler *a, PyObject *constslist,
7981         int maxdepth, int nlocalsplus)
7982{
7983    PyCodeObject *co = NULL;
7984    PyObject *names = NULL;
7985    PyObject *consts = NULL;
7986    PyObject *localsplusnames = NULL;
7987    PyObject *localspluskinds = NULL;
7988
7989    names = dict_keys_inorder(c->u->u_names, 0);
7990    if (!names) {
7991        goto error;
7992    }
7993    if (!merge_const_one(c, &names)) {
7994        goto error;
7995    }
7996
7997    int flags = compute_code_flags(c);
7998    if (flags < 0) {
7999        goto error;
8000    }
8001
8002    consts = PyList_AsTuple(constslist); /* PyCode_New requires a tuple */
8003    if (consts == NULL) {
8004        goto error;
8005    }
8006    if (!merge_const_one(c, &consts)) {
8007        goto error;
8008    }
8009
8010    assert(c->u->u_posonlyargcount < INT_MAX);
8011    assert(c->u->u_argcount < INT_MAX);
8012    assert(c->u->u_kwonlyargcount < INT_MAX);
8013    int posonlyargcount = (int)c->u->u_posonlyargcount;
8014    int posorkwargcount = (int)c->u->u_argcount;
8015    assert(INT_MAX - posonlyargcount - posorkwargcount > 0);
8016    int kwonlyargcount = (int)c->u->u_kwonlyargcount;
8017
8018    localsplusnames = PyTuple_New(nlocalsplus);
8019    if (localsplusnames == NULL) {
8020        goto error;
8021    }
8022    localspluskinds = PyBytes_FromStringAndSize(NULL, nlocalsplus);
8023    if (localspluskinds == NULL) {
8024        goto error;
8025    }
8026    compute_localsplus_info(c, nlocalsplus, localsplusnames, localspluskinds);
8027
8028    struct _PyCodeConstructor con = {
8029        .filename = c->c_filename,
8030        .name = c->u->u_name,
8031        .qualname = c->u->u_qualname ? c->u->u_qualname : c->u->u_name,
8032        .flags = flags,
8033
8034        .code = a->a_bytecode,
8035        .firstlineno = c->u->u_firstlineno,
8036        .linetable = a->a_linetable,
8037
8038        .consts = consts,
8039        .names = names,
8040
8041        .localsplusnames = localsplusnames,
8042        .localspluskinds = localspluskinds,
8043
8044        .argcount = posonlyargcount + posorkwargcount,
8045        .posonlyargcount = posonlyargcount,
8046        .kwonlyargcount = kwonlyargcount,
8047
8048        .stacksize = maxdepth,
8049
8050        .exceptiontable = a->a_except_table,
8051    };
8052
8053    if (_PyCode_Validate(&con) < 0) {
8054        goto error;
8055    }
8056
8057    if (!merge_const_one(c, &localsplusnames)) {
8058        goto error;
8059    }
8060    con.localsplusnames = localsplusnames;
8061
8062    co = _PyCode_New(&con);
8063    if (co == NULL) {
8064        goto error;
8065    }
8066
8067 error:
8068    Py_XDECREF(names);
8069    Py_XDECREF(consts);
8070    Py_XDECREF(localsplusnames);
8071    Py_XDECREF(localspluskinds);
8072    return co;
8073}
8074
8075
8076/* For debugging purposes only */
8077#if 0
8078static void
8079dump_instr(struct instr *i)
8080{
8081    const char *jrel = (is_relative_jump(i)) ? "jrel " : "";
8082    const char *jabs = (is_jump(i) && !is_relative_jump(i))? "jabs " : "";
8083
8084    char arg[128];
8085
8086    *arg = '\0';
8087    if (HAS_ARG(i->i_opcode)) {
8088        sprintf(arg, "arg: %d ", i->i_oparg);
8089    }
8090    fprintf(stderr, "line: %d, opcode: %d %s%s%s\n",
8091                    i->i_lineno, i->i_opcode, arg, jabs, jrel);
8092}
8093
8094static void
8095dump_basicblock(const basicblock *b)
8096{
8097    const char *b_return = b->b_return ? "return " : "";
8098    fprintf(stderr, "used: %d, depth: %d, offset: %d %s\n",
8099        b->b_iused, b->b_startdepth, b->b_offset, b_return);
8100    if (b->b_instr) {
8101        int i;
8102        for (i = 0; i < b->b_iused; i++) {
8103            fprintf(stderr, "  [%02d] ", i);
8104            dump_instr(b->b_instr + i);
8105        }
8106    }
8107}
8108#endif
8109
8110
8111static int
8112normalize_basic_block(basicblock *bb);
8113
8114static int
8115optimize_cfg(struct compiler *c, struct assembler *a, PyObject *consts);
8116
8117static int
8118trim_unused_consts(struct compiler *c, struct assembler *a, PyObject *consts);
8119
8120/* Duplicates exit BBs, so that line numbers can be propagated to them */
8121static int
8122duplicate_exits_without_lineno(struct compiler *c);
8123
8124static int
8125extend_block(basicblock *bb);
8126
8127static int *
8128build_cellfixedoffsets(struct compiler *c)
8129{
8130    int nlocals = (int)PyDict_GET_SIZE(c->u->u_varnames);
8131    int ncellvars = (int)PyDict_GET_SIZE(c->u->u_cellvars);
8132    int nfreevars = (int)PyDict_GET_SIZE(c->u->u_freevars);
8133
8134    int noffsets = ncellvars + nfreevars;
8135    int *fixed = PyMem_New(int, noffsets);
8136    if (fixed == NULL) {
8137        PyErr_NoMemory();
8138        return NULL;
8139    }
8140    for (int i = 0; i < noffsets; i++) {
8141        fixed[i] = nlocals + i;
8142    }
8143
8144    PyObject *varname, *cellindex;
8145    Py_ssize_t pos = 0;
8146    while (PyDict_Next(c->u->u_cellvars, &pos, &varname, &cellindex)) {
8147        PyObject *varindex = PyDict_GetItem(c->u->u_varnames, varname);
8148        if (varindex != NULL) {
8149            assert(PyLong_AS_LONG(cellindex) < INT_MAX);
8150            assert(PyLong_AS_LONG(varindex) < INT_MAX);
8151            int oldindex = (int)PyLong_AS_LONG(cellindex);
8152            int argoffset = (int)PyLong_AS_LONG(varindex);
8153            fixed[oldindex] = argoffset;
8154        }
8155    }
8156
8157    return fixed;
8158}
8159
8160static inline int
8161insert_instruction(basicblock *block, int pos, struct instr *instr) {
8162    if (compiler_next_instr(block) < 0) {
8163        return -1;
8164    }
8165    for (int i = block->b_iused-1; i > pos; i--) {
8166        block->b_instr[i] = block->b_instr[i-1];
8167    }
8168    block->b_instr[pos] = *instr;
8169    return 0;
8170}
8171
8172static int
8173insert_prefix_instructions(struct compiler *c, basicblock *entryblock,
8174                           int *fixed, int nfreevars)
8175{
8176
8177    int flags = compute_code_flags(c);
8178    if (flags < 0) {
8179        return -1;
8180    }
8181    assert(c->u->u_firstlineno > 0);
8182
8183    /* Add the generator prefix instructions. */
8184    if (flags & (CO_GENERATOR | CO_COROUTINE | CO_ASYNC_GENERATOR)) {
8185        struct instr make_gen = {
8186            .i_opcode = RETURN_GENERATOR,
8187            .i_oparg = 0,
8188            .i_lineno = c->u->u_firstlineno,
8189            .i_col_offset = -1,
8190            .i_end_lineno = c->u->u_firstlineno,
8191            .i_end_col_offset = -1,
8192            .i_target = NULL,
8193        };
8194        if (insert_instruction(entryblock, 0, &make_gen) < 0) {
8195            return -1;
8196        }
8197        struct instr pop_top = {
8198            .i_opcode = POP_TOP,
8199            .i_oparg = 0,
8200            .i_lineno = -1,
8201            .i_col_offset = -1,
8202            .i_end_lineno = -1,
8203            .i_end_col_offset = -1,
8204            .i_target = NULL,
8205        };
8206        if (insert_instruction(entryblock, 1, &pop_top) < 0) {
8207            return -1;
8208        }
8209    }
8210
8211    /* Set up cells for any variable that escapes, to be put in a closure. */
8212    const int ncellvars = (int)PyDict_GET_SIZE(c->u->u_cellvars);
8213    if (ncellvars) {
8214        // c->u->u_cellvars has the cells out of order so we sort them
8215        // before adding the MAKE_CELL instructions.  Note that we
8216        // adjust for arg cells, which come first.
8217        const int nvars = ncellvars + (int)PyDict_GET_SIZE(c->u->u_varnames);
8218        int *sorted = PyMem_RawCalloc(nvars, sizeof(int));
8219        if (sorted == NULL) {
8220            PyErr_NoMemory();
8221            return -1;
8222        }
8223        for (int i = 0; i < ncellvars; i++) {
8224            sorted[fixed[i]] = i + 1;
8225        }
8226        for (int i = 0, ncellsused = 0; ncellsused < ncellvars; i++) {
8227            int oldindex = sorted[i] - 1;
8228            if (oldindex == -1) {
8229                continue;
8230            }
8231            struct instr make_cell = {
8232                .i_opcode = MAKE_CELL,
8233                // This will get fixed in offset_derefs().
8234                .i_oparg = oldindex,
8235                .i_lineno = -1,
8236                .i_col_offset = -1,
8237                .i_end_lineno = -1,
8238                .i_end_col_offset = -1,
8239                .i_target = NULL,
8240            };
8241            if (insert_instruction(entryblock, ncellsused, &make_cell) < 0) {
8242                return -1;
8243            }
8244            ncellsused += 1;
8245        }
8246        PyMem_RawFree(sorted);
8247    }
8248
8249    if (nfreevars) {
8250        struct instr copy_frees = {
8251            .i_opcode = COPY_FREE_VARS,
8252            .i_oparg = nfreevars,
8253            .i_lineno = -1,
8254            .i_col_offset = -1,
8255            .i_end_lineno = -1,
8256            .i_end_col_offset = -1,
8257            .i_target = NULL,
8258        };
8259        if (insert_instruction(entryblock, 0, &copy_frees) < 0) {
8260            return -1;
8261        }
8262
8263    }
8264
8265    return 0;
8266}
8267
8268/* Make sure that all returns have a line number, even if early passes
8269 * have failed to propagate a correct line number.
8270 * The resulting line number may not be correct according to PEP 626,
8271 * but should be "good enough", and no worse than in older versions. */
8272static void
8273guarantee_lineno_for_exits(struct assembler *a, int firstlineno) {
8274    int lineno = firstlineno;
8275    assert(lineno > 0);
8276    for (basicblock *b = a->a_entry; b != NULL; b = b->b_next) {
8277        if (b->b_iused == 0) {
8278            continue;
8279        }
8280        struct instr *last = &b->b_instr[b->b_iused-1];
8281        if (last->i_lineno < 0) {
8282            if (last->i_opcode == RETURN_VALUE) {
8283                for (int i = 0; i < b->b_iused; i++) {
8284                    assert(b->b_instr[i].i_lineno < 0);
8285
8286                    b->b_instr[i].i_lineno = lineno;
8287                }
8288            }
8289        }
8290        else {
8291            lineno = last->i_lineno;
8292        }
8293    }
8294}
8295
8296static int
8297fix_cell_offsets(struct compiler *c, basicblock *entryblock, int *fixedmap)
8298{
8299    int nlocals = (int)PyDict_GET_SIZE(c->u->u_varnames);
8300    int ncellvars = (int)PyDict_GET_SIZE(c->u->u_cellvars);
8301    int nfreevars = (int)PyDict_GET_SIZE(c->u->u_freevars);
8302    int noffsets = ncellvars + nfreevars;
8303
8304    // First deal with duplicates (arg cells).
8305    int numdropped = 0;
8306    for (int i = 0; i < noffsets ; i++) {
8307        if (fixedmap[i] == i + nlocals) {
8308            fixedmap[i] -= numdropped;
8309        }
8310        else {
8311            // It was a duplicate (cell/arg).
8312            numdropped += 1;
8313        }
8314    }
8315
8316    // Then update offsets, either relative to locals or by cell2arg.
8317    for (basicblock *b = entryblock; b != NULL; b = b->b_next) {
8318        for (int i = 0; i < b->b_iused; i++) {
8319            struct instr *inst = &b->b_instr[i];
8320            // This is called before extended args are generated.
8321            assert(inst->i_opcode != EXTENDED_ARG);
8322            assert(inst->i_opcode != EXTENDED_ARG_QUICK);
8323            int oldoffset = inst->i_oparg;
8324            switch(inst->i_opcode) {
8325                case MAKE_CELL:
8326                case LOAD_CLOSURE:
8327                case LOAD_DEREF:
8328                case STORE_DEREF:
8329                case DELETE_DEREF:
8330                case LOAD_CLASSDEREF:
8331                    assert(oldoffset >= 0);
8332                    assert(oldoffset < noffsets);
8333                    assert(fixedmap[oldoffset] >= 0);
8334                    inst->i_oparg = fixedmap[oldoffset];
8335            }
8336        }
8337    }
8338
8339    return numdropped;
8340}
8341
8342static void
8343propagate_line_numbers(struct assembler *a);
8344
8345static PyCodeObject *
8346assemble(struct compiler *c, int addNone)
8347{
8348    basicblock *b, *entryblock;
8349    struct assembler a;
8350    int j, nblocks;
8351    PyCodeObject *co = NULL;
8352    PyObject *consts = NULL;
8353    memset(&a, 0, sizeof(struct assembler));
8354
8355    /* Make sure every block that falls off the end returns None. */
8356    if (!c->u->u_curblock->b_return) {
8357        UNSET_LOC(c);
8358        if (addNone)
8359            ADDOP_LOAD_CONST(c, Py_None);
8360        ADDOP(c, RETURN_VALUE);
8361    }
8362
8363    for (basicblock *b = c->u->u_blocks; b != NULL; b = b->b_list) {
8364        if (normalize_basic_block(b)) {
8365            return NULL;
8366        }
8367    }
8368
8369    for (basicblock *b = c->u->u_blocks; b != NULL; b = b->b_list) {
8370        if (extend_block(b)) {
8371            return NULL;
8372        }
8373    }
8374
8375    nblocks = 0;
8376    entryblock = NULL;
8377    for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
8378        nblocks++;
8379        entryblock = b;
8380    }
8381    assert(entryblock != NULL);
8382
8383    assert(PyDict_GET_SIZE(c->u->u_varnames) < INT_MAX);
8384    assert(PyDict_GET_SIZE(c->u->u_cellvars) < INT_MAX);
8385    assert(PyDict_GET_SIZE(c->u->u_freevars) < INT_MAX);
8386    int nlocals = (int)PyDict_GET_SIZE(c->u->u_varnames);
8387    int ncellvars = (int)PyDict_GET_SIZE(c->u->u_cellvars);
8388    int nfreevars = (int)PyDict_GET_SIZE(c->u->u_freevars);
8389    assert(INT_MAX - nlocals - ncellvars > 0);
8390    assert(INT_MAX - nlocals - ncellvars - nfreevars > 0);
8391    int nlocalsplus = nlocals + ncellvars + nfreevars;
8392    int *cellfixedoffsets = build_cellfixedoffsets(c);
8393    if (cellfixedoffsets == NULL) {
8394        goto error;
8395    }
8396
8397    /* Set firstlineno if it wasn't explicitly set. */
8398    if (!c->u->u_firstlineno) {
8399        if (entryblock->b_instr && entryblock->b_instr->i_lineno) {
8400            c->u->u_firstlineno = entryblock->b_instr->i_lineno;
8401        }
8402        else {
8403            c->u->u_firstlineno = 1;
8404        }
8405    }
8406
8407    // This must be called before fix_cell_offsets().
8408    if (insert_prefix_instructions(c, entryblock, cellfixedoffsets, nfreevars)) {
8409        goto error;
8410    }
8411
8412    if (!assemble_init(&a, nblocks, c->u->u_firstlineno))
8413        goto error;
8414    a.a_entry = entryblock;
8415    a.a_nblocks = nblocks;
8416
8417    int numdropped = fix_cell_offsets(c, entryblock, cellfixedoffsets);
8418    PyMem_Free(cellfixedoffsets);  // At this point we're done with it.
8419    cellfixedoffsets = NULL;
8420    if (numdropped < 0) {
8421        goto error;
8422    }
8423    nlocalsplus -= numdropped;
8424
8425    consts = consts_dict_keys_inorder(c->u->u_consts);
8426    if (consts == NULL) {
8427        goto error;
8428    }
8429
8430    if (optimize_cfg(c, &a, consts)) {
8431        goto error;
8432    }
8433    if (duplicate_exits_without_lineno(c)) {
8434        return NULL;
8435    }
8436    if (trim_unused_consts(c, &a, consts)) {
8437        goto error;
8438    }
8439    propagate_line_numbers(&a);
8440    guarantee_lineno_for_exits(&a, c->u->u_firstlineno);
8441    int maxdepth = stackdepth(c);
8442    if (maxdepth < 0) {
8443        goto error;
8444    }
8445    /* TO DO -- For 3.12, make sure that `maxdepth <= MAX_ALLOWED_STACK_USE` */
8446
8447    if (label_exception_targets(entryblock)) {
8448        goto error;
8449    }
8450    convert_exception_handlers_to_nops(entryblock);
8451    for (basicblock *b = a.a_entry; b != NULL; b = b->b_next) {
8452        clean_basic_block(b);
8453    }
8454
8455    /* Order of basic blocks must have been determined by now */
8456    normalize_jumps(&a);
8457
8458    /* Can't modify the bytecode after computing jump offsets. */
8459    assemble_jump_offsets(&a, c);
8460
8461    /* Emit code. */
8462    for(b = entryblock; b != NULL; b = b->b_next) {
8463        for (j = 0; j < b->b_iused; j++)
8464            if (!assemble_emit(&a, &b->b_instr[j]))
8465                goto error;
8466    }
8467
8468    /* Emit location info */
8469    a.a_lineno = c->u->u_firstlineno;
8470    for(b = entryblock; b != NULL; b = b->b_next) {
8471        for (j = 0; j < b->b_iused; j++)
8472            if (!assemble_emit_location(&a, &b->b_instr[j]))
8473                goto error;
8474    }
8475
8476    if (!assemble_exception_table(&a)) {
8477        goto error;
8478    }
8479    if (_PyBytes_Resize(&a.a_except_table, a.a_except_table_off) < 0) {
8480        goto error;
8481    }
8482    if (!merge_const_one(c, &a.a_except_table)) {
8483        goto error;
8484    }
8485
8486    if (_PyBytes_Resize(&a.a_linetable, a.a_location_off) < 0) {
8487        goto error;
8488    }
8489    if (!merge_const_one(c, &a.a_linetable)) {
8490        goto error;
8491    }
8492
8493    if (_PyBytes_Resize(&a.a_bytecode, a.a_offset * sizeof(_Py_CODEUNIT)) < 0) {
8494        goto error;
8495    }
8496    if (!merge_const_one(c, &a.a_bytecode)) {
8497        goto error;
8498    }
8499
8500    co = makecode(c, &a, consts, maxdepth, nlocalsplus);
8501 error:
8502    Py_XDECREF(consts);
8503    assemble_free(&a);
8504    if (cellfixedoffsets != NULL) {
8505        PyMem_Free(cellfixedoffsets);
8506    }
8507    return co;
8508}
8509
8510static PyObject*
8511get_const_value(int opcode, int oparg, PyObject *co_consts)
8512{
8513    PyObject *constant = NULL;
8514    assert(HAS_CONST(opcode));
8515    if (opcode == LOAD_CONST) {
8516        constant = PyList_GET_ITEM(co_consts, oparg);
8517    }
8518
8519    if (constant == NULL) {
8520        PyErr_SetString(PyExc_SystemError,
8521                        "Internal error: failed to get value of a constant");
8522        return NULL;
8523    }
8524    Py_INCREF(constant);
8525    return constant;
8526}
8527
8528/* Replace LOAD_CONST c1, LOAD_CONST c2 ... LOAD_CONST cn, BUILD_TUPLE n
8529   with    LOAD_CONST (c1, c2, ... cn).
8530   The consts table must still be in list form so that the
8531   new constant (c1, c2, ... cn) can be appended.
8532   Called with codestr pointing to the first LOAD_CONST.
8533*/
8534static int
8535fold_tuple_on_constants(struct compiler *c,
8536                        struct instr *inst,
8537                        int n, PyObject *consts)
8538{
8539    /* Pre-conditions */
8540    assert(PyList_CheckExact(consts));
8541    assert(inst[n].i_opcode == BUILD_TUPLE);
8542    assert(inst[n].i_oparg == n);
8543
8544    for (int i = 0; i < n; i++) {
8545        if (!HAS_CONST(inst[i].i_opcode)) {
8546            return 0;
8547        }
8548    }
8549
8550    /* Buildup new tuple of constants */
8551    PyObject *newconst = PyTuple_New(n);
8552    if (newconst == NULL) {
8553        return -1;
8554    }
8555    for (int i = 0; i < n; i++) {
8556        int op = inst[i].i_opcode;
8557        int arg = inst[i].i_oparg;
8558        PyObject *constant = get_const_value(op, arg, consts);
8559        if (constant == NULL) {
8560            return -1;
8561        }
8562        PyTuple_SET_ITEM(newconst, i, constant);
8563    }
8564    if (merge_const_one(c, &newconst) == 0) {
8565        Py_DECREF(newconst);
8566        return -1;
8567    }
8568
8569    Py_ssize_t index;
8570    for (index = 0; index < PyList_GET_SIZE(consts); index++) {
8571        if (PyList_GET_ITEM(consts, index) == newconst) {
8572            break;
8573        }
8574    }
8575    if (index == PyList_GET_SIZE(consts)) {
8576        if ((size_t)index >= (size_t)INT_MAX - 1) {
8577            Py_DECREF(newconst);
8578            PyErr_SetString(PyExc_OverflowError, "too many constants");
8579            return -1;
8580        }
8581        if (PyList_Append(consts, newconst)) {
8582            Py_DECREF(newconst);
8583            return -1;
8584        }
8585    }
8586    Py_DECREF(newconst);
8587    for (int i = 0; i < n; i++) {
8588        inst[i].i_opcode = NOP;
8589    }
8590    inst[n].i_opcode = LOAD_CONST;
8591    inst[n].i_oparg = (int)index;
8592    return 0;
8593}
8594
8595#define VISITED (-1)
8596
8597// Replace an arbitrary run of SWAPs and NOPs with an optimal one that has the
8598// same effect.
8599static int
8600swaptimize(basicblock *block, int *ix)
8601{
8602    // NOTE: "./python -m test test_patma" serves as a good, quick stress test
8603    // for this function. Make sure to blow away cached *.pyc files first!
8604    assert(*ix < block->b_iused);
8605    struct instr *instructions = &block->b_instr[*ix];
8606    // Find the length of the current sequence of SWAPs and NOPs, and record the
8607    // maximum depth of the stack manipulations:
8608    assert(instructions[0].i_opcode == SWAP);
8609    int depth = instructions[0].i_oparg;
8610    int len = 0;
8611    int more = false;
8612    int limit = block->b_iused - *ix;
8613    while (++len < limit) {
8614        int opcode = instructions[len].i_opcode;
8615        if (opcode == SWAP) {
8616            depth = Py_MAX(depth, instructions[len].i_oparg);
8617            more = true;
8618        }
8619        else if (opcode != NOP) {
8620            break;
8621        }
8622    }
8623    // It's already optimal if there's only one SWAP:
8624    if (!more) {
8625        return 0;
8626    }
8627    // Create an array with elements {0, 1, 2, ..., depth - 1}:
8628    int *stack = PyMem_Malloc(depth * sizeof(int));
8629    if (stack == NULL) {
8630        PyErr_NoMemory();
8631        return -1;
8632    }
8633    for (int i = 0; i < depth; i++) {
8634        stack[i] = i;
8635    }
8636    // Simulate the combined effect of these instructions by "running" them on
8637    // our "stack":
8638    for (int i = 0; i < len; i++) {
8639        if (instructions[i].i_opcode == SWAP) {
8640            int oparg = instructions[i].i_oparg;
8641            int top = stack[0];
8642            // SWAPs are 1-indexed:
8643            stack[0] = stack[oparg - 1];
8644            stack[oparg - 1] = top;
8645        }
8646    }
8647    // Now we can begin! Our approach here is based on a solution to a closely
8648    // related problem (https://cs.stackexchange.com/a/13938). It's easiest to
8649    // think of this algorithm as determining the steps needed to efficiently
8650    // "un-shuffle" our stack. By performing the moves in *reverse* order,
8651    // though, we can efficiently *shuffle* it! For this reason, we will be
8652    // replacing instructions starting from the *end* of the run. Since the
8653    // solution is optimal, we don't need to worry about running out of space:
8654    int current = len - 1;
8655    for (int i = 0; i < depth; i++) {
8656        // Skip items that have already been visited, or just happen to be in
8657        // the correct location:
8658        if (stack[i] == VISITED || stack[i] == i) {
8659            continue;
8660        }
8661        // Okay, we've found an item that hasn't been visited. It forms a cycle
8662        // with other items; traversing the cycle and swapping each item with
8663        // the next will put them all in the correct place. The weird
8664        // loop-and-a-half is necessary to insert 0 into every cycle, since we
8665        // can only swap from that position:
8666        int j = i;
8667        while (true) {
8668            // Skip the actual swap if our item is zero, since swapping the top
8669            // item with itself is pointless:
8670            if (j) {
8671                assert(0 <= current);
8672                // SWAPs are 1-indexed:
8673                instructions[current].i_opcode = SWAP;
8674                instructions[current--].i_oparg = j + 1;
8675            }
8676            if (stack[j] == VISITED) {
8677                // Completed the cycle:
8678                assert(j == i);
8679                break;
8680            }
8681            int next_j = stack[j];
8682            stack[j] = VISITED;
8683            j = next_j;
8684        }
8685    }
8686    // NOP out any unused instructions:
8687    while (0 <= current) {
8688        instructions[current--].i_opcode = NOP;
8689    }
8690    PyMem_Free(stack);
8691    *ix += len - 1;
8692    return 0;
8693}
8694
8695// This list is pretty small, since it's only okay to reorder opcodes that:
8696// - can't affect control flow (like jumping or raising exceptions)
8697// - can't invoke arbitrary code (besides finalizers)
8698// - only touch the TOS (and pop it when finished)
8699#define SWAPPABLE(opcode) \
8700    ((opcode) == STORE_FAST || (opcode) == POP_TOP)
8701
8702#define STORES_TO(instr) \
8703    (((instr).i_opcode == STORE_FAST) ? (instr).i_oparg : -1)
8704
8705static int
8706next_swappable_instruction(basicblock *block, int i, int lineno)
8707{
8708    while (++i < block->b_iused) {
8709        struct instr *instruction = &block->b_instr[i];
8710        if (0 <= lineno && instruction->i_lineno != lineno) {
8711            // Optimizing across this instruction could cause user-visible
8712            // changes in the names bound between line tracing events!
8713            return -1;
8714        }
8715        if (instruction->i_opcode == NOP) {
8716            continue;
8717        }
8718        if (SWAPPABLE(instruction->i_opcode)) {
8719            return i;
8720        }
8721        return -1;
8722    }
8723    return -1;
8724}
8725
8726// Attempt to apply SWAPs statically by swapping *instructions* rather than
8727// stack items. For example, we can replace SWAP(2), POP_TOP, STORE_FAST(42)
8728// with the more efficient NOP, STORE_FAST(42), POP_TOP.
8729static void
8730apply_static_swaps(basicblock *block, int i)
8731{
8732    // SWAPs are to our left, and potential swaperands are to our right:
8733    for (; 0 <= i; i--) {
8734        assert(i < block->b_iused);
8735        struct instr *swap = &block->b_instr[i];
8736        if (swap->i_opcode != SWAP) {
8737            if (swap->i_opcode == NOP || SWAPPABLE(swap->i_opcode)) {
8738                // Nope, but we know how to handle these. Keep looking:
8739                continue;
8740            }
8741            // We can't reason about what this instruction does. Bail:
8742            return;
8743        }
8744        int j = next_swappable_instruction(block, i, -1);
8745        if (j < 0) {
8746            return;
8747        }
8748        int k = j;
8749        int lineno = block->b_instr[j].i_lineno;
8750        for (int count = swap->i_oparg - 1; 0 < count; count--) {
8751            k = next_swappable_instruction(block, k, lineno);
8752            if (k < 0) {
8753                return;
8754            }
8755        }
8756        // The reordering is not safe if the two instructions to be swapped
8757        // store to the same location, or if any intervening instruction stores
8758        // to the same location as either of them.
8759        int store_j = STORES_TO(block->b_instr[j]);
8760        int store_k = STORES_TO(block->b_instr[k]);
8761        if (store_j >= 0 || store_k >= 0) {
8762            if (store_j == store_k) {
8763                return;
8764            }
8765            for (int idx = j + 1; idx < k; idx++) {
8766                int store_idx = STORES_TO(block->b_instr[idx]);
8767                if (store_idx >= 0 && (store_idx == store_j || store_idx == store_k)) {
8768                    return;
8769                }
8770            }
8771        }
8772
8773        // Success!
8774        swap->i_opcode = NOP;
8775        struct instr temp = block->b_instr[j];
8776        block->b_instr[j] = block->b_instr[k];
8777        block->b_instr[k] = temp;
8778    }
8779}
8780
8781// Attempt to eliminate jumps to jumps by updating inst to jump to
8782// target->i_target using the provided opcode. Return whether or not the
8783// optimization was successful.
8784static bool
8785jump_thread(struct instr *inst, struct instr *target, int opcode)
8786{
8787    assert(!IS_VIRTUAL_OPCODE(opcode) || IS_VIRTUAL_JUMP_OPCODE(opcode));
8788    assert(is_jump(inst));
8789    assert(is_jump(target));
8790    // bpo-45773: If inst->i_target == target->i_target, then nothing actually
8791    // changes (and we fall into an infinite loop):
8792    if (inst->i_lineno == target->i_lineno &&
8793        inst->i_target != target->i_target)
8794    {
8795        inst->i_target = target->i_target;
8796        inst->i_opcode = opcode;
8797        return true;
8798    }
8799    return false;
8800}
8801
8802/* Maximum size of basic block that should be copied in optimizer */
8803#define MAX_COPY_SIZE 4
8804
8805/* Optimization */
8806static int
8807optimize_basic_block(struct compiler *c, basicblock *bb, PyObject *consts)
8808{
8809    assert(PyList_CheckExact(consts));
8810    struct instr nop;
8811    nop.i_opcode = NOP;
8812    struct instr *target;
8813    for (int i = 0; i < bb->b_iused; i++) {
8814        struct instr *inst = &bb->b_instr[i];
8815        int oparg = inst->i_oparg;
8816        int nextop = i+1 < bb->b_iused ? bb->b_instr[i+1].i_opcode : 0;
8817        if (is_jump(inst) || is_block_push(inst)) {
8818            /* Skip over empty basic blocks. */
8819            while (inst->i_target->b_iused == 0) {
8820                inst->i_target = inst->i_target->b_next;
8821            }
8822            target = &inst->i_target->b_instr[0];
8823            assert(!IS_ASSEMBLER_OPCODE(target->i_opcode));
8824        }
8825        else {
8826            target = &nop;
8827        }
8828        assert(!IS_ASSEMBLER_OPCODE(inst->i_opcode));
8829        switch (inst->i_opcode) {
8830            /* Remove LOAD_CONST const; conditional jump */
8831            case LOAD_CONST:
8832            {
8833                PyObject* cnt;
8834                int is_true;
8835                int jump_if_true;
8836                switch(nextop) {
8837                    case POP_JUMP_IF_FALSE:
8838                    case POP_JUMP_IF_TRUE:
8839                        cnt = get_const_value(inst->i_opcode, oparg, consts);
8840                        if (cnt == NULL) {
8841                            goto error;
8842                        }
8843                        is_true = PyObject_IsTrue(cnt);
8844                        Py_DECREF(cnt);
8845                        if (is_true == -1) {
8846                            goto error;
8847                        }
8848                        inst->i_opcode = NOP;
8849                        jump_if_true = nextop == POP_JUMP_IF_TRUE;
8850                        if (is_true == jump_if_true) {
8851                            bb->b_instr[i+1].i_opcode = JUMP;
8852                            bb->b_nofallthrough = 1;
8853                        }
8854                        else {
8855                            bb->b_instr[i+1].i_opcode = NOP;
8856                        }
8857                        break;
8858                    case JUMP_IF_FALSE_OR_POP:
8859                    case JUMP_IF_TRUE_OR_POP:
8860                        cnt = get_const_value(inst->i_opcode, oparg, consts);
8861                        if (cnt == NULL) {
8862                            goto error;
8863                        }
8864                        is_true = PyObject_IsTrue(cnt);
8865                        Py_DECREF(cnt);
8866                        if (is_true == -1) {
8867                            goto error;
8868                        }
8869                        jump_if_true = nextop == JUMP_IF_TRUE_OR_POP;
8870                        if (is_true == jump_if_true) {
8871                            bb->b_instr[i+1].i_opcode = JUMP;
8872                            bb->b_nofallthrough = 1;
8873                        }
8874                        else {
8875                            inst->i_opcode = NOP;
8876                            bb->b_instr[i+1].i_opcode = NOP;
8877                        }
8878                        break;
8879                    case IS_OP:
8880                        cnt = get_const_value(inst->i_opcode, oparg, consts);
8881                        if (cnt == NULL) {
8882                            goto error;
8883                        }
8884                        int jump_op = i+2 < bb->b_iused ? bb->b_instr[i+2].i_opcode : 0;
8885                        if (Py_IsNone(cnt) && (jump_op == POP_JUMP_IF_FALSE || jump_op == POP_JUMP_IF_TRUE)) {
8886                            unsigned char nextarg = bb->b_instr[i+1].i_oparg;
8887                            inst->i_opcode = NOP;
8888                            bb->b_instr[i+1].i_opcode = NOP;
8889                            bb->b_instr[i+2].i_opcode = nextarg ^ (jump_op == POP_JUMP_IF_FALSE) ?
8890                                    POP_JUMP_IF_NOT_NONE : POP_JUMP_IF_NONE;
8891                        }
8892                        Py_DECREF(cnt);
8893                        break;
8894                }
8895                break;
8896            }
8897
8898                /* Try to fold tuples of constants.
8899                   Skip over BUILD_TUPLE(1) UNPACK_SEQUENCE(1).
8900                   Replace BUILD_TUPLE(2) UNPACK_SEQUENCE(2) with SWAP(2).
8901                   Replace BUILD_TUPLE(3) UNPACK_SEQUENCE(3) with SWAP(3). */
8902            case BUILD_TUPLE:
8903                if (nextop == UNPACK_SEQUENCE && oparg == bb->b_instr[i+1].i_oparg) {
8904                    switch(oparg) {
8905                        case 1:
8906                            inst->i_opcode = NOP;
8907                            bb->b_instr[i+1].i_opcode = NOP;
8908                            continue;
8909                        case 2:
8910                        case 3:
8911                            inst->i_opcode = NOP;
8912                            bb->b_instr[i+1].i_opcode = SWAP;
8913                            continue;
8914                    }
8915                }
8916                if (i >= oparg) {
8917                    if (fold_tuple_on_constants(c, inst-oparg, oparg, consts)) {
8918                        goto error;
8919                    }
8920                }
8921                break;
8922
8923                /* Simplify conditional jump to conditional jump where the
8924                   result of the first test implies the success of a similar
8925                   test or the failure of the opposite test.
8926                   Arises in code like:
8927                   "a and b or c"
8928                   "(a and b) and c"
8929                   "(a or b) or c"
8930                   "(a or b) and c"
8931                   x:JUMP_IF_FALSE_OR_POP y   y:JUMP_IF_FALSE_OR_POP z
8932                      -->  x:JUMP_IF_FALSE_OR_POP z
8933                   x:JUMP_IF_FALSE_OR_POP y   y:JUMP_IF_TRUE_OR_POP z
8934                      -->  x:POP_JUMP_IF_FALSE y+1
8935                   where y+1 is the instruction following the second test.
8936                */
8937            case JUMP_IF_FALSE_OR_POP:
8938                switch (target->i_opcode) {
8939                    case POP_JUMP_IF_FALSE:
8940                        i -= jump_thread(inst, target, POP_JUMP_IF_FALSE);
8941                        break;
8942                    case JUMP:
8943                    case JUMP_IF_FALSE_OR_POP:
8944                        i -= jump_thread(inst, target, JUMP_IF_FALSE_OR_POP);
8945                        break;
8946                    case JUMP_IF_TRUE_OR_POP:
8947                    case POP_JUMP_IF_TRUE:
8948                        if (inst->i_lineno == target->i_lineno) {
8949                            // We don't need to bother checking for loops here,
8950                            // since a block's b_next cannot point to itself:
8951                            assert(inst->i_target != inst->i_target->b_next);
8952                            inst->i_opcode = POP_JUMP_IF_FALSE;
8953                            inst->i_target = inst->i_target->b_next;
8954                            --i;
8955                        }
8956                        break;
8957                }
8958                break;
8959            case JUMP_IF_TRUE_OR_POP:
8960                switch (target->i_opcode) {
8961                    case POP_JUMP_IF_TRUE:
8962                        i -= jump_thread(inst, target, POP_JUMP_IF_TRUE);
8963                        break;
8964                    case JUMP:
8965                    case JUMP_IF_TRUE_OR_POP:
8966                        i -= jump_thread(inst, target, JUMP_IF_TRUE_OR_POP);
8967                        break;
8968                    case JUMP_IF_FALSE_OR_POP:
8969                    case POP_JUMP_IF_FALSE:
8970                        if (inst->i_lineno == target->i_lineno) {
8971                            // We don't need to bother checking for loops here,
8972                            // since a block's b_next cannot point to itself:
8973                            assert(inst->i_target != inst->i_target->b_next);
8974                            inst->i_opcode = POP_JUMP_IF_TRUE;
8975                            inst->i_target = inst->i_target->b_next;
8976                            --i;
8977                        }
8978                        break;
8979                }
8980                break;
8981            case POP_JUMP_IF_NOT_NONE:
8982            case POP_JUMP_IF_NONE:
8983                switch (target->i_opcode) {
8984                    case JUMP:
8985                        i -= jump_thread(inst, target, inst->i_opcode);
8986                }
8987                break;
8988            case POP_JUMP_IF_FALSE:
8989                switch (target->i_opcode) {
8990                    case JUMP:
8991                        i -= jump_thread(inst, target, POP_JUMP_IF_FALSE);
8992                }
8993                break;
8994            case POP_JUMP_IF_TRUE:
8995                switch (target->i_opcode) {
8996                    case JUMP:
8997                        i -= jump_thread(inst, target, POP_JUMP_IF_TRUE);
8998                }
8999                break;
9000            case JUMP:
9001                switch (target->i_opcode) {
9002                    case JUMP:
9003                        i -= jump_thread(inst, target, JUMP);
9004                }
9005                break;
9006            case FOR_ITER:
9007                if (target->i_opcode == JUMP) {
9008                    /* This will not work now because the jump (at target) could
9009                     * be forward or backward and FOR_ITER only jumps forward. We
9010                     * can re-enable this if ever we implement a backward version
9011                     * of FOR_ITER.
9012                     */
9013                    /*
9014                    i -= jump_thread(inst, target, FOR_ITER);
9015                    */
9016                }
9017                break;
9018            case SWAP:
9019                if (oparg == 1) {
9020                    inst->i_opcode = NOP;
9021                    break;
9022                }
9023                if (swaptimize(bb, &i)) {
9024                    goto error;
9025                }
9026                apply_static_swaps(bb, i);
9027                break;
9028            case KW_NAMES:
9029                break;
9030            case PUSH_NULL:
9031                if (nextop == LOAD_GLOBAL && (inst[1].i_opcode & 1) == 0) {
9032                    inst->i_opcode = NOP;
9033                    inst->i_oparg = 0;
9034                    inst[1].i_oparg |= 1;
9035                }
9036                break;
9037            default:
9038                /* All HAS_CONST opcodes should be handled with LOAD_CONST */
9039                assert (!HAS_CONST(inst->i_opcode));
9040        }
9041    }
9042    return 0;
9043error:
9044    return -1;
9045}
9046
9047static bool
9048basicblock_has_lineno(const basicblock *bb) {
9049    for (int i = 0; i < bb->b_iused; i++) {
9050        if (bb->b_instr[i].i_lineno > 0) {
9051            return true;
9052        }
9053    }
9054    return false;
9055}
9056
9057/* If this block ends with an unconditional jump to an exit block,
9058 * then remove the jump and extend this block with the target.
9059 */
9060static int
9061extend_block(basicblock *bb) {
9062    if (bb->b_iused == 0) {
9063        return 0;
9064    }
9065    struct instr *last = &bb->b_instr[bb->b_iused-1];
9066    if (last->i_opcode != JUMP &&
9067        last->i_opcode != JUMP_FORWARD &&
9068        last->i_opcode != JUMP_BACKWARD) {
9069        return 0;
9070    }
9071    if (last->i_target->b_exit && last->i_target->b_iused <= MAX_COPY_SIZE) {
9072        basicblock *to_copy = last->i_target;
9073        if (basicblock_has_lineno(to_copy)) {
9074            /* copy only blocks without line number (like implicit 'return None's) */
9075            return 0;
9076        }
9077        last->i_opcode = NOP;
9078        for (int i = 0; i < to_copy->b_iused; i++) {
9079            int index = compiler_next_instr(bb);
9080            if (index < 0) {
9081                return -1;
9082            }
9083            bb->b_instr[index] = to_copy->b_instr[i];
9084        }
9085        bb->b_exit = 1;
9086    }
9087    return 0;
9088}
9089
9090static void
9091clean_basic_block(basicblock *bb) {
9092    /* Remove NOPs when legal to do so. */
9093    int dest = 0;
9094    int prev_lineno = -1;
9095    for (int src = 0; src < bb->b_iused; src++) {
9096        int lineno = bb->b_instr[src].i_lineno;
9097        if (bb->b_instr[src].i_opcode == NOP) {
9098            /* Eliminate no-op if it doesn't have a line number */
9099            if (lineno < 0) {
9100                continue;
9101            }
9102            /* or, if the previous instruction had the same line number. */
9103            if (prev_lineno == lineno) {
9104                continue;
9105            }
9106            /* or, if the next instruction has same line number or no line number */
9107            if (src < bb->b_iused - 1) {
9108                int next_lineno = bb->b_instr[src+1].i_lineno;
9109                if (next_lineno == lineno) {
9110                    continue;
9111                }
9112                if (next_lineno < 0) {
9113                    COPY_INSTR_LOC(bb->b_instr[src], bb->b_instr[src+1]);
9114                    continue;
9115                }
9116            }
9117            else {
9118                basicblock* next = bb->b_next;
9119                while (next && next->b_iused == 0) {
9120                    next = next->b_next;
9121                }
9122                /* or if last instruction in BB and next BB has same line number */
9123                if (next) {
9124                    if (lineno == next->b_instr[0].i_lineno) {
9125                        continue;
9126                    }
9127                }
9128            }
9129
9130        }
9131        if (dest != src) {
9132            bb->b_instr[dest] = bb->b_instr[src];
9133        }
9134        dest++;
9135        prev_lineno = lineno;
9136    }
9137    assert(dest <= bb->b_iused);
9138    bb->b_iused = dest;
9139}
9140
9141static int
9142normalize_basic_block(basicblock *bb) {
9143    /* Mark blocks as exit and/or nofallthrough.
9144     Raise SystemError if CFG is malformed. */
9145    for (int i = 0; i < bb->b_iused; i++) {
9146        assert(!IS_ASSEMBLER_OPCODE(bb->b_instr[i].i_opcode));
9147        switch(bb->b_instr[i].i_opcode) {
9148            case RETURN_VALUE:
9149            case RAISE_VARARGS:
9150            case RERAISE:
9151                bb->b_exit = 1;
9152                bb->b_nofallthrough = 1;
9153                break;
9154            case JUMP:
9155            case JUMP_NO_INTERRUPT:
9156                bb->b_nofallthrough = 1;
9157                /* fall through */
9158            case POP_JUMP_IF_NOT_NONE:
9159            case POP_JUMP_IF_NONE:
9160            case POP_JUMP_IF_FALSE:
9161            case POP_JUMP_IF_TRUE:
9162            case JUMP_IF_FALSE_OR_POP:
9163            case JUMP_IF_TRUE_OR_POP:
9164            case FOR_ITER:
9165                if (i != bb->b_iused-1) {
9166                    PyErr_SetString(PyExc_SystemError, "malformed control flow graph.");
9167                    return -1;
9168                }
9169                /* Skip over empty basic blocks. */
9170                while (bb->b_instr[i].i_target->b_iused == 0) {
9171                    bb->b_instr[i].i_target = bb->b_instr[i].i_target->b_next;
9172                }
9173
9174        }
9175    }
9176    return 0;
9177}
9178
9179static int
9180mark_reachable(struct assembler *a) {
9181    basicblock **stack, **sp;
9182    sp = stack = (basicblock **)PyObject_Malloc(sizeof(basicblock *) * a->a_nblocks);
9183    if (stack == NULL) {
9184        return -1;
9185    }
9186    a->a_entry->b_predecessors = 1;
9187    *sp++ = a->a_entry;
9188    while (sp > stack) {
9189        basicblock *b = *(--sp);
9190        if (b->b_next && !b->b_nofallthrough) {
9191            if (b->b_next->b_predecessors == 0) {
9192                *sp++ = b->b_next;
9193            }
9194            b->b_next->b_predecessors++;
9195        }
9196        for (int i = 0; i < b->b_iused; i++) {
9197            basicblock *target;
9198            struct instr *instr = &b->b_instr[i];
9199            if (is_jump(instr) || is_block_push(instr)) {
9200                target = instr->i_target;
9201                if (target->b_predecessors == 0) {
9202                    *sp++ = target;
9203                }
9204                target->b_predecessors++;
9205            }
9206        }
9207    }
9208    PyObject_Free(stack);
9209    return 0;
9210}
9211
9212static void
9213eliminate_empty_basic_blocks(basicblock *entry) {
9214    /* Eliminate empty blocks */
9215    for (basicblock *b = entry; b != NULL; b = b->b_next) {
9216        basicblock *next = b->b_next;
9217        if (next) {
9218            while (next->b_iused == 0 && next->b_next) {
9219                next = next->b_next;
9220            }
9221            b->b_next = next;
9222        }
9223    }
9224    for (basicblock *b = entry; b != NULL; b = b->b_next) {
9225        if (b->b_iused == 0) {
9226            continue;
9227        }
9228        if (is_jump(&b->b_instr[b->b_iused-1])) {
9229            basicblock *target = b->b_instr[b->b_iused-1].i_target;
9230            while (target->b_iused == 0) {
9231                target = target->b_next;
9232            }
9233            b->b_instr[b->b_iused-1].i_target = target;
9234        }
9235    }
9236}
9237
9238
9239/* If an instruction has no line number, but it's predecessor in the BB does,
9240 * then copy the line number. If a successor block has no line number, and only
9241 * one predecessor, then inherit the line number.
9242 * This ensures that all exit blocks (with one predecessor) receive a line number.
9243 * Also reduces the size of the line number table,
9244 * but has no impact on the generated line number events.
9245 */
9246static void
9247propagate_line_numbers(struct assembler *a) {
9248    for (basicblock *b = a->a_entry; b != NULL; b = b->b_next) {
9249        if (b->b_iused == 0) {
9250            continue;
9251        }
9252
9253        // Not a real instruction, only to store positions
9254        // from previous instructions and propagate them.
9255        struct instr prev_instr = {
9256            .i_lineno = -1,
9257            .i_col_offset = -1,
9258            .i_end_lineno = -1,
9259            .i_end_col_offset = -1,
9260        };
9261        for (int i = 0; i < b->b_iused; i++) {
9262            if (b->b_instr[i].i_lineno < 0) {
9263                COPY_INSTR_LOC(prev_instr, b->b_instr[i]);
9264            }
9265            else {
9266                COPY_INSTR_LOC(b->b_instr[i], prev_instr);
9267            }
9268        }
9269        if (!b->b_nofallthrough && b->b_next->b_predecessors == 1) {
9270            assert(b->b_next->b_iused);
9271            if (b->b_next->b_instr[0].i_lineno < 0) {
9272                COPY_INSTR_LOC(prev_instr, b->b_next->b_instr[0]);
9273            }
9274        }
9275        if (is_jump(&b->b_instr[b->b_iused-1])) {
9276            basicblock *target = b->b_instr[b->b_iused-1].i_target;
9277            if (target->b_predecessors == 1) {
9278                if (target->b_instr[0].i_lineno < 0) {
9279                    COPY_INSTR_LOC(prev_instr, target->b_instr[0]);
9280                }
9281            }
9282        }
9283    }
9284}
9285
9286/* Perform optimizations on a control flow graph.
9287   The consts object should still be in list form to allow new constants
9288   to be appended.
9289
9290   All transformations keep the code size the same or smaller.
9291   For those that reduce size, the gaps are initially filled with
9292   NOPs.  Later those NOPs are removed.
9293*/
9294
9295static int
9296optimize_cfg(struct compiler *c, struct assembler *a, PyObject *consts)
9297{
9298    for (basicblock *b = a->a_entry; b != NULL; b = b->b_next) {
9299        if (optimize_basic_block(c, b, consts)) {
9300            return -1;
9301        }
9302        clean_basic_block(b);
9303        assert(b->b_predecessors == 0);
9304    }
9305    for (basicblock *b = c->u->u_blocks; b != NULL; b = b->b_list) {
9306        if (extend_block(b)) {
9307            return -1;
9308        }
9309    }
9310    if (mark_reachable(a)) {
9311        return -1;
9312    }
9313    /* Delete unreachable instructions */
9314    for (basicblock *b = a->a_entry; b != NULL; b = b->b_next) {
9315       if (b->b_predecessors == 0) {
9316            b->b_iused = 0;
9317            b->b_nofallthrough = 0;
9318       }
9319    }
9320    eliminate_empty_basic_blocks(a->a_entry);
9321    for (basicblock *b = a->a_entry; b != NULL; b = b->b_next) {
9322        clean_basic_block(b);
9323    }
9324    /* Delete jump instructions made redundant by previous step. If a non-empty
9325       block ends with a jump instruction, check if the next non-empty block
9326       reached through normal flow control is the target of that jump. If it
9327       is, then the jump instruction is redundant and can be deleted.
9328    */
9329    int maybe_empty_blocks = 0;
9330    for (basicblock *b = a->a_entry; b != NULL; b = b->b_next) {
9331        if (b->b_iused > 0) {
9332            struct instr *b_last_instr = &b->b_instr[b->b_iused - 1];
9333            assert(!IS_ASSEMBLER_OPCODE(b_last_instr->i_opcode));
9334            if (b_last_instr->i_opcode == JUMP ||
9335                b_last_instr->i_opcode == JUMP_NO_INTERRUPT) {
9336                if (b_last_instr->i_target == b->b_next) {
9337                    assert(b->b_next->b_iused);
9338                    b->b_nofallthrough = 0;
9339                    b_last_instr->i_opcode = NOP;
9340                    maybe_empty_blocks = 1;
9341                }
9342            }
9343        }
9344    }
9345    if (maybe_empty_blocks) {
9346        eliminate_empty_basic_blocks(a->a_entry);
9347    }
9348    return 0;
9349}
9350
9351// Remove trailing unused constants.
9352static int
9353trim_unused_consts(struct compiler *c, struct assembler *a, PyObject *consts)
9354{
9355    assert(PyList_CheckExact(consts));
9356
9357    // The first constant may be docstring; keep it always.
9358    int max_const_index = 0;
9359    for (basicblock *b = a->a_entry; b != NULL; b = b->b_next) {
9360        for (int i = 0; i < b->b_iused; i++) {
9361            if ((b->b_instr[i].i_opcode == LOAD_CONST ||
9362                b->b_instr[i].i_opcode == KW_NAMES) &&
9363                    b->b_instr[i].i_oparg > max_const_index) {
9364                max_const_index = b->b_instr[i].i_oparg;
9365            }
9366        }
9367    }
9368    if (max_const_index+1 < PyList_GET_SIZE(consts)) {
9369        //fprintf(stderr, "removing trailing consts: max=%d, size=%d\n",
9370        //        max_const_index, (int)PyList_GET_SIZE(consts));
9371        if (PyList_SetSlice(consts, max_const_index+1,
9372                            PyList_GET_SIZE(consts), NULL) < 0) {
9373            return 1;
9374        }
9375    }
9376    return 0;
9377}
9378
9379static inline int
9380is_exit_without_lineno(basicblock *b) {
9381    if (!b->b_exit) {
9382        return 0;
9383    }
9384    for (int i = 0; i < b->b_iused; i++) {
9385        if (b->b_instr[i].i_lineno >= 0) {
9386            return 0;
9387        }
9388    }
9389    return 1;
9390}
9391
9392/* PEP 626 mandates that the f_lineno of a frame is correct
9393 * after a frame terminates. It would be prohibitively expensive
9394 * to continuously update the f_lineno field at runtime,
9395 * so we make sure that all exiting instruction (raises and returns)
9396 * have a valid line number, allowing us to compute f_lineno lazily.
9397 * We can do this by duplicating the exit blocks without line number
9398 * so that none have more than one predecessor. We can then safely
9399 * copy the line number from the sole predecessor block.
9400 */
9401static int
9402duplicate_exits_without_lineno(struct compiler *c)
9403{
9404    /* Copy all exit blocks without line number that are targets of a jump.
9405     */
9406    for (basicblock *b = c->u->u_blocks; b != NULL; b = b->b_list) {
9407        if (b->b_iused > 0 && is_jump(&b->b_instr[b->b_iused-1])) {
9408            basicblock *target = b->b_instr[b->b_iused-1].i_target;
9409            if (is_exit_without_lineno(target) && target->b_predecessors > 1) {
9410                basicblock *new_target = compiler_copy_block(c, target);
9411                if (new_target == NULL) {
9412                    return -1;
9413                }
9414                COPY_INSTR_LOC(b->b_instr[b->b_iused-1], new_target->b_instr[0]);
9415                b->b_instr[b->b_iused-1].i_target = new_target;
9416                target->b_predecessors--;
9417                new_target->b_predecessors = 1;
9418                new_target->b_next = target->b_next;
9419                target->b_next = new_target;
9420            }
9421        }
9422    }
9423    /* Eliminate empty blocks */
9424    for (basicblock *b = c->u->u_blocks; b != NULL; b = b->b_list) {
9425        while (b->b_next && b->b_next->b_iused == 0) {
9426            b->b_next = b->b_next->b_next;
9427        }
9428    }
9429    /* Any remaining reachable exit blocks without line number can only be reached by
9430     * fall through, and thus can only have a single predecessor */
9431    for (basicblock *b = c->u->u_blocks; b != NULL; b = b->b_list) {
9432        if (!b->b_nofallthrough && b->b_next && b->b_iused > 0) {
9433            if (is_exit_without_lineno(b->b_next)) {
9434                assert(b->b_next->b_iused > 0);
9435                COPY_INSTR_LOC(b->b_instr[b->b_iused-1],  b->b_next->b_instr[0]);
9436            }
9437        }
9438    }
9439    return 0;
9440}
9441
9442
9443/* Retained for API compatibility.
9444 * Optimization is now done in optimize_cfg */
9445
9446PyObject *
9447PyCode_Optimize(PyObject *code, PyObject* Py_UNUSED(consts),
9448                PyObject *Py_UNUSED(names), PyObject *Py_UNUSED(lnotab_obj))
9449{
9450    Py_INCREF(code);
9451    return code;
9452}
9453