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).  See peephole.c
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 "Python.h"
25 
26 #include "Python-ast.h"
27 #include "ast.h"
28 #include "code.h"
29 #include "symtable.h"
30 #include "opcode.h"
31 #include "wordcode_helpers.h"
32 
33 #define DEFAULT_BLOCK_SIZE 16
34 #define DEFAULT_BLOCKS 8
35 #define DEFAULT_CODE_SIZE 128
36 #define DEFAULT_LNOTAB_SIZE 16
37 
38 #define COMP_GENEXP   0
39 #define COMP_LISTCOMP 1
40 #define COMP_SETCOMP  2
41 #define COMP_DICTCOMP 3
42 
43 #define IS_TOP_LEVEL_AWAIT(c) ( \
44         (c->c_flags->cf_flags & PyCF_ALLOW_TOP_LEVEL_AWAIT) \
45         && (c->u->u_ste->ste_type == ModuleBlock))
46 
47 struct instr {
48     unsigned i_jabs : 1;
49     unsigned i_jrel : 1;
50     unsigned char i_opcode;
51     int i_oparg;
52     struct basicblock_ *i_target; /* target block (if jump instruction) */
53     int i_lineno;
54 };
55 
56 typedef struct basicblock_ {
57     /* Each basicblock in a compilation unit is linked via b_list in the
58        reverse order that the block are allocated.  b_list points to the next
59        block, not to be confused with b_next, which is next by control flow. */
60     struct basicblock_ *b_list;
61     /* number of instructions used */
62     int b_iused;
63     /* length of instruction array (b_instr) */
64     int b_ialloc;
65     /* pointer to an array of instructions, initially NULL */
66     struct instr *b_instr;
67     /* If b_next is non-NULL, it is a pointer to the next
68        block reached by normal control flow. */
69     struct basicblock_ *b_next;
70     /* b_seen is used to perform a DFS of basicblocks. */
71     unsigned b_seen : 1;
72     /* b_return is true if a RETURN_VALUE opcode is inserted. */
73     unsigned b_return : 1;
74     /* depth of stack upon entry of block, computed by stackdepth() */
75     int b_startdepth;
76     /* instruction offset for block, computed by assemble_jump_offsets() */
77     int b_offset;
78 } basicblock;
79 
80 /* fblockinfo tracks the current frame block.
81 
82 A frame block is used to handle loops, try/except, and try/finally.
83 It's called a frame block to distinguish it from a basic block in the
84 compiler IR.
85 */
86 
87 enum fblocktype { WHILE_LOOP, FOR_LOOP, TRY_EXCEPT, FINALLY_TRY, FINALLY_END,
88                   WITH, ASYNC_WITH, HANDLER_CLEANUP, POP_VALUE, EXCEPTION_HANDLER };
89 
90 struct fblockinfo {
91     enum fblocktype fb_type;
92     basicblock *fb_block;
93     /* (optional) type-specific exit or cleanup block */
94     basicblock *fb_exit;
95     /* (optional) additional information required for unwinding */
96     void *fb_datum;
97 };
98 
99 enum {
100     COMPILER_SCOPE_MODULE,
101     COMPILER_SCOPE_CLASS,
102     COMPILER_SCOPE_FUNCTION,
103     COMPILER_SCOPE_ASYNC_FUNCTION,
104     COMPILER_SCOPE_LAMBDA,
105     COMPILER_SCOPE_COMPREHENSION,
106 };
107 
108 /* The following items change on entry and exit of code blocks.
109    They must be saved and restored when returning to a block.
110 */
111 struct compiler_unit {
112     PySTEntryObject *u_ste;
113 
114     PyObject *u_name;
115     PyObject *u_qualname;  /* dot-separated qualified name (lazy) */
116     int u_scope_type;
117 
118     /* The following fields are dicts that map objects to
119        the index of them in co_XXX.      The index is used as
120        the argument for opcodes that refer to those collections.
121     */
122     PyObject *u_consts;    /* all constants */
123     PyObject *u_names;     /* all names */
124     PyObject *u_varnames;  /* local variables */
125     PyObject *u_cellvars;  /* cell variables */
126     PyObject *u_freevars;  /* free variables */
127 
128     PyObject *u_private;        /* for private name mangling */
129 
130     Py_ssize_t u_argcount;        /* number of arguments for block */
131     Py_ssize_t u_posonlyargcount;        /* number of positional only arguments for block */
132     Py_ssize_t u_kwonlyargcount; /* number of keyword only arguments for block */
133     /* Pointer to the most recently allocated block.  By following b_list
134        members, you can reach all early allocated blocks. */
135     basicblock *u_blocks;
136     basicblock *u_curblock; /* pointer to current block */
137 
138     int u_nfblocks;
139     struct fblockinfo u_fblock[CO_MAXBLOCKS];
140 
141     int u_firstlineno; /* the first lineno of the block */
142     int u_lineno;          /* the lineno for the current stmt */
143     int u_col_offset;      /* the offset of the current stmt */
144 };
145 
146 /* This struct captures the global state of a compilation.
147 
148 The u pointer points to the current compilation unit, while units
149 for enclosing blocks are stored in c_stack.     The u and c_stack are
150 managed by compiler_enter_scope() and compiler_exit_scope().
151 
152 Note that we don't track recursion levels during compilation - the
153 task of detecting and rejecting excessive levels of nesting is
154 handled by the symbol analysis pass.
155 
156 */
157 
158 struct compiler {
159     PyObject *c_filename;
160     struct symtable *c_st;
161     PyFutureFeatures *c_future; /* pointer to module's __future__ */
162     PyCompilerFlags *c_flags;
163 
164     int c_optimize;              /* optimization level */
165     int c_interactive;           /* true if in interactive mode */
166     int c_nestlevel;
167     int c_do_not_emit_bytecode;  /* The compiler won't emit any bytecode
168                                     if this value is different from zero.
169                                     This can be used to temporarily visit
170                                     nodes without emitting bytecode to
171                                     check only errors. */
172 
173     PyObject *c_const_cache;     /* Python dict holding all constants,
174                                     including names tuple */
175     struct compiler_unit *u; /* compiler state for current block */
176     PyObject *c_stack;           /* Python list holding compiler_unit ptrs */
177     PyArena *c_arena;            /* pointer to memory allocation arena */
178 };
179 
180 static int compiler_enter_scope(struct compiler *, identifier, int, void *, int);
181 static void compiler_free(struct compiler *);
182 static basicblock *compiler_new_block(struct compiler *);
183 static int compiler_next_instr(basicblock *);
184 static int compiler_addop(struct compiler *, int);
185 static int compiler_addop_i(struct compiler *, int, Py_ssize_t);
186 static int compiler_addop_j(struct compiler *, int, basicblock *, int);
187 static int compiler_error(struct compiler *, const char *);
188 static int compiler_warn(struct compiler *, const char *, ...);
189 static int compiler_nameop(struct compiler *, identifier, expr_context_ty);
190 
191 static PyCodeObject *compiler_mod(struct compiler *, mod_ty);
192 static int compiler_visit_stmt(struct compiler *, stmt_ty);
193 static int compiler_visit_keyword(struct compiler *, keyword_ty);
194 static int compiler_visit_expr(struct compiler *, expr_ty);
195 static int compiler_augassign(struct compiler *, stmt_ty);
196 static int compiler_annassign(struct compiler *, stmt_ty);
197 static int compiler_subscript(struct compiler *, expr_ty);
198 static int compiler_slice(struct compiler *, expr_ty);
199 
200 static int inplace_binop(operator_ty);
201 static int are_all_items_const(asdl_seq *, Py_ssize_t, Py_ssize_t);
202 static int expr_constant(expr_ty);
203 
204 static int compiler_with(struct compiler *, stmt_ty, int);
205 static int compiler_async_with(struct compiler *, stmt_ty, int);
206 static int compiler_async_for(struct compiler *, stmt_ty);
207 static int compiler_call_helper(struct compiler *c, int n,
208                                 asdl_seq *args,
209                                 asdl_seq *keywords);
210 static int compiler_try_except(struct compiler *, stmt_ty);
211 static int compiler_set_qualname(struct compiler *);
212 
213 static int compiler_sync_comprehension_generator(
214                                       struct compiler *c,
215                                       asdl_seq *generators, int gen_index,
216                                       int depth,
217                                       expr_ty elt, expr_ty val, int type);
218 
219 static int compiler_async_comprehension_generator(
220                                       struct compiler *c,
221                                       asdl_seq *generators, int gen_index,
222                                       int depth,
223                                       expr_ty elt, expr_ty val, int type);
224 
225 static PyCodeObject *assemble(struct compiler *, int addNone);
226 static PyObject *__doc__, *__annotations__;
227 
228 #define CAPSULE_NAME "compile.c compiler unit"
229 
230 PyObject *
_Py_Mangle(PyObject * privateobj,PyObject * ident)231 _Py_Mangle(PyObject *privateobj, PyObject *ident)
232 {
233     /* Name mangling: __private becomes _classname__private.
234        This is independent from how the name is used. */
235     PyObject *result;
236     size_t nlen, plen, ipriv;
237     Py_UCS4 maxchar;
238     if (privateobj == NULL || !PyUnicode_Check(privateobj) ||
239         PyUnicode_READ_CHAR(ident, 0) != '_' ||
240         PyUnicode_READ_CHAR(ident, 1) != '_') {
241         Py_INCREF(ident);
242         return ident;
243     }
244     nlen = PyUnicode_GET_LENGTH(ident);
245     plen = PyUnicode_GET_LENGTH(privateobj);
246     /* Don't mangle __id__ or names with dots.
247 
248        The only time a name with a dot can occur is when
249        we are compiling an import statement that has a
250        package name.
251 
252        TODO(jhylton): Decide whether we want to support
253        mangling of the module name, e.g. __M.X.
254     */
255     if ((PyUnicode_READ_CHAR(ident, nlen-1) == '_' &&
256          PyUnicode_READ_CHAR(ident, nlen-2) == '_') ||
257         PyUnicode_FindChar(ident, '.', 0, nlen, 1) != -1) {
258         Py_INCREF(ident);
259         return ident; /* Don't mangle __whatever__ */
260     }
261     /* Strip leading underscores from class name */
262     ipriv = 0;
263     while (PyUnicode_READ_CHAR(privateobj, ipriv) == '_')
264         ipriv++;
265     if (ipriv == plen) {
266         Py_INCREF(ident);
267         return ident; /* Don't mangle if class is just underscores */
268     }
269     plen -= ipriv;
270 
271     if (plen + nlen >= PY_SSIZE_T_MAX - 1) {
272         PyErr_SetString(PyExc_OverflowError,
273                         "private identifier too large to be mangled");
274         return NULL;
275     }
276 
277     maxchar = PyUnicode_MAX_CHAR_VALUE(ident);
278     if (PyUnicode_MAX_CHAR_VALUE(privateobj) > maxchar)
279         maxchar = PyUnicode_MAX_CHAR_VALUE(privateobj);
280 
281     result = PyUnicode_New(1 + nlen + plen, maxchar);
282     if (!result)
283         return 0;
284     /* ident = "_" + priv[ipriv:] + ident # i.e. 1+plen+nlen bytes */
285     PyUnicode_WRITE(PyUnicode_KIND(result), PyUnicode_DATA(result), 0, '_');
286     if (PyUnicode_CopyCharacters(result, 1, privateobj, ipriv, plen) < 0) {
287         Py_DECREF(result);
288         return NULL;
289     }
290     if (PyUnicode_CopyCharacters(result, plen+1, ident, 0, nlen) < 0) {
291         Py_DECREF(result);
292         return NULL;
293     }
294     assert(_PyUnicode_CheckConsistency(result, 1));
295     return result;
296 }
297 
298 static int
compiler_init(struct compiler * c)299 compiler_init(struct compiler *c)
300 {
301     memset(c, 0, sizeof(struct compiler));
302 
303     c->c_const_cache = PyDict_New();
304     if (!c->c_const_cache) {
305         return 0;
306     }
307 
308     c->c_stack = PyList_New(0);
309     if (!c->c_stack) {
310         Py_CLEAR(c->c_const_cache);
311         return 0;
312     }
313 
314     return 1;
315 }
316 
317 PyCodeObject *
PyAST_CompileObject(mod_ty mod,PyObject * filename,PyCompilerFlags * flags,int optimize,PyArena * arena)318 PyAST_CompileObject(mod_ty mod, PyObject *filename, PyCompilerFlags *flags,
319                    int optimize, PyArena *arena)
320 {
321     struct compiler c;
322     PyCodeObject *co = NULL;
323     PyCompilerFlags local_flags = _PyCompilerFlags_INIT;
324     int merged;
325 
326     if (!__doc__) {
327         __doc__ = PyUnicode_InternFromString("__doc__");
328         if (!__doc__)
329             return NULL;
330     }
331     if (!__annotations__) {
332         __annotations__ = PyUnicode_InternFromString("__annotations__");
333         if (!__annotations__)
334             return NULL;
335     }
336     if (!compiler_init(&c))
337         return NULL;
338     Py_INCREF(filename);
339     c.c_filename = filename;
340     c.c_arena = arena;
341     c.c_future = PyFuture_FromASTObject(mod, filename);
342     if (c.c_future == NULL)
343         goto finally;
344     if (!flags) {
345         flags = &local_flags;
346     }
347     merged = c.c_future->ff_features | flags->cf_flags;
348     c.c_future->ff_features = merged;
349     flags->cf_flags = merged;
350     c.c_flags = flags;
351     c.c_optimize = (optimize == -1) ? _Py_GetConfig()->optimization_level : optimize;
352     c.c_nestlevel = 0;
353     c.c_do_not_emit_bytecode = 0;
354 
355     _PyASTOptimizeState state;
356     state.optimize = c.c_optimize;
357     state.ff_features = merged;
358 
359     if (!_PyAST_Optimize(mod, arena, &state)) {
360         goto finally;
361     }
362 
363     c.c_st = PySymtable_BuildObject(mod, filename, c.c_future);
364     if (c.c_st == NULL) {
365         if (!PyErr_Occurred())
366             PyErr_SetString(PyExc_SystemError, "no symtable");
367         goto finally;
368     }
369 
370     co = compiler_mod(&c, mod);
371 
372  finally:
373     compiler_free(&c);
374     assert(co || PyErr_Occurred());
375     return co;
376 }
377 
378 PyCodeObject *
PyAST_CompileEx(mod_ty mod,const char * filename_str,PyCompilerFlags * flags,int optimize,PyArena * arena)379 PyAST_CompileEx(mod_ty mod, const char *filename_str, PyCompilerFlags *flags,
380                 int optimize, PyArena *arena)
381 {
382     PyObject *filename;
383     PyCodeObject *co;
384     filename = PyUnicode_DecodeFSDefault(filename_str);
385     if (filename == NULL)
386         return NULL;
387     co = PyAST_CompileObject(mod, filename, flags, optimize, arena);
388     Py_DECREF(filename);
389     return co;
390 
391 }
392 
393 PyCodeObject *
PyNode_Compile(struct _node * n,const char * filename)394 PyNode_Compile(struct _node *n, const char *filename)
395 {
396     PyCodeObject *co = NULL;
397     mod_ty mod;
398     PyArena *arena = PyArena_New();
399     if (!arena)
400         return NULL;
401     mod = PyAST_FromNode(n, NULL, filename, arena);
402     if (mod)
403         co = PyAST_Compile(mod, filename, NULL, arena);
404     PyArena_Free(arena);
405     return co;
406 }
407 
408 static void
compiler_free(struct compiler * c)409 compiler_free(struct compiler *c)
410 {
411     if (c->c_st)
412         PySymtable_Free(c->c_st);
413     if (c->c_future)
414         PyObject_Free(c->c_future);
415     Py_XDECREF(c->c_filename);
416     Py_DECREF(c->c_const_cache);
417     Py_DECREF(c->c_stack);
418 }
419 
420 static PyObject *
list2dict(PyObject * list)421 list2dict(PyObject *list)
422 {
423     Py_ssize_t i, n;
424     PyObject *v, *k;
425     PyObject *dict = PyDict_New();
426     if (!dict) return NULL;
427 
428     n = PyList_Size(list);
429     for (i = 0; i < n; i++) {
430         v = PyLong_FromSsize_t(i);
431         if (!v) {
432             Py_DECREF(dict);
433             return NULL;
434         }
435         k = PyList_GET_ITEM(list, i);
436         if (PyDict_SetItem(dict, k, v) < 0) {
437             Py_DECREF(v);
438             Py_DECREF(dict);
439             return NULL;
440         }
441         Py_DECREF(v);
442     }
443     return dict;
444 }
445 
446 /* Return new dict containing names from src that match scope(s).
447 
448 src is a symbol table dictionary.  If the scope of a name matches
449 either scope_type or flag is set, insert it into the new dict.  The
450 values are integers, starting at offset and increasing by one for
451 each key.
452 */
453 
454 static PyObject *
dictbytype(PyObject * src,int scope_type,int flag,Py_ssize_t offset)455 dictbytype(PyObject *src, int scope_type, int flag, Py_ssize_t offset)
456 {
457     Py_ssize_t i = offset, scope, num_keys, key_i;
458     PyObject *k, *v, *dest = PyDict_New();
459     PyObject *sorted_keys;
460 
461     assert(offset >= 0);
462     if (dest == NULL)
463         return NULL;
464 
465     /* Sort the keys so that we have a deterministic order on the indexes
466        saved in the returned dictionary.  These indexes are used as indexes
467        into the free and cell var storage.  Therefore if they aren't
468        deterministic, then the generated bytecode is not deterministic.
469     */
470     sorted_keys = PyDict_Keys(src);
471     if (sorted_keys == NULL)
472         return NULL;
473     if (PyList_Sort(sorted_keys) != 0) {
474         Py_DECREF(sorted_keys);
475         return NULL;
476     }
477     num_keys = PyList_GET_SIZE(sorted_keys);
478 
479     for (key_i = 0; key_i < num_keys; key_i++) {
480         /* XXX this should probably be a macro in symtable.h */
481         long vi;
482         k = PyList_GET_ITEM(sorted_keys, key_i);
483         v = PyDict_GetItem(src, k);
484         assert(PyLong_Check(v));
485         vi = PyLong_AS_LONG(v);
486         scope = (vi >> SCOPE_OFFSET) & SCOPE_MASK;
487 
488         if (scope == scope_type || vi & flag) {
489             PyObject *item = PyLong_FromSsize_t(i);
490             if (item == NULL) {
491                 Py_DECREF(sorted_keys);
492                 Py_DECREF(dest);
493                 return NULL;
494             }
495             i++;
496             if (PyDict_SetItem(dest, k, item) < 0) {
497                 Py_DECREF(sorted_keys);
498                 Py_DECREF(item);
499                 Py_DECREF(dest);
500                 return NULL;
501             }
502             Py_DECREF(item);
503         }
504     }
505     Py_DECREF(sorted_keys);
506     return dest;
507 }
508 
509 static void
compiler_unit_check(struct compiler_unit * u)510 compiler_unit_check(struct compiler_unit *u)
511 {
512     basicblock *block;
513     for (block = u->u_blocks; block != NULL; block = block->b_list) {
514         assert((uintptr_t)block != 0xcbcbcbcbU);
515         assert((uintptr_t)block != 0xfbfbfbfbU);
516         assert((uintptr_t)block != 0xdbdbdbdbU);
517         if (block->b_instr != NULL) {
518             assert(block->b_ialloc > 0);
519             assert(block->b_iused > 0);
520             assert(block->b_ialloc >= block->b_iused);
521         }
522         else {
523             assert (block->b_iused == 0);
524             assert (block->b_ialloc == 0);
525         }
526     }
527 }
528 
529 static void
compiler_unit_free(struct compiler_unit * u)530 compiler_unit_free(struct compiler_unit *u)
531 {
532     basicblock *b, *next;
533 
534     compiler_unit_check(u);
535     b = u->u_blocks;
536     while (b != NULL) {
537         if (b->b_instr)
538             PyObject_Free((void *)b->b_instr);
539         next = b->b_list;
540         PyObject_Free((void *)b);
541         b = next;
542     }
543     Py_CLEAR(u->u_ste);
544     Py_CLEAR(u->u_name);
545     Py_CLEAR(u->u_qualname);
546     Py_CLEAR(u->u_consts);
547     Py_CLEAR(u->u_names);
548     Py_CLEAR(u->u_varnames);
549     Py_CLEAR(u->u_freevars);
550     Py_CLEAR(u->u_cellvars);
551     Py_CLEAR(u->u_private);
552     PyObject_Free(u);
553 }
554 
555 static int
compiler_enter_scope(struct compiler * c,identifier name,int scope_type,void * key,int lineno)556 compiler_enter_scope(struct compiler *c, identifier name,
557                      int scope_type, void *key, int lineno)
558 {
559     struct compiler_unit *u;
560     basicblock *block;
561 
562     u = (struct compiler_unit *)PyObject_Calloc(1, sizeof(
563                                             struct compiler_unit));
564     if (!u) {
565         PyErr_NoMemory();
566         return 0;
567     }
568     u->u_scope_type = scope_type;
569     u->u_argcount = 0;
570     u->u_posonlyargcount = 0;
571     u->u_kwonlyargcount = 0;
572     u->u_ste = PySymtable_Lookup(c->c_st, key);
573     if (!u->u_ste) {
574         compiler_unit_free(u);
575         return 0;
576     }
577     Py_INCREF(name);
578     u->u_name = name;
579     u->u_varnames = list2dict(u->u_ste->ste_varnames);
580     u->u_cellvars = dictbytype(u->u_ste->ste_symbols, CELL, 0, 0);
581     if (!u->u_varnames || !u->u_cellvars) {
582         compiler_unit_free(u);
583         return 0;
584     }
585     if (u->u_ste->ste_needs_class_closure) {
586         /* Cook up an implicit __class__ cell. */
587         _Py_IDENTIFIER(__class__);
588         PyObject *name;
589         int res;
590         assert(u->u_scope_type == COMPILER_SCOPE_CLASS);
591         assert(PyDict_GET_SIZE(u->u_cellvars) == 0);
592         name = _PyUnicode_FromId(&PyId___class__);
593         if (!name) {
594             compiler_unit_free(u);
595             return 0;
596         }
597         res = PyDict_SetItem(u->u_cellvars, name, _PyLong_Zero);
598         if (res < 0) {
599             compiler_unit_free(u);
600             return 0;
601         }
602     }
603 
604     u->u_freevars = dictbytype(u->u_ste->ste_symbols, FREE, DEF_FREE_CLASS,
605                                PyDict_GET_SIZE(u->u_cellvars));
606     if (!u->u_freevars) {
607         compiler_unit_free(u);
608         return 0;
609     }
610 
611     u->u_blocks = NULL;
612     u->u_nfblocks = 0;
613     u->u_firstlineno = lineno;
614     u->u_lineno = 0;
615     u->u_col_offset = 0;
616     u->u_consts = PyDict_New();
617     if (!u->u_consts) {
618         compiler_unit_free(u);
619         return 0;
620     }
621     u->u_names = PyDict_New();
622     if (!u->u_names) {
623         compiler_unit_free(u);
624         return 0;
625     }
626 
627     u->u_private = NULL;
628 
629     /* Push the old compiler_unit on the stack. */
630     if (c->u) {
631         PyObject *capsule = PyCapsule_New(c->u, CAPSULE_NAME, NULL);
632         if (!capsule || PyList_Append(c->c_stack, capsule) < 0) {
633             Py_XDECREF(capsule);
634             compiler_unit_free(u);
635             return 0;
636         }
637         Py_DECREF(capsule);
638         u->u_private = c->u->u_private;
639         Py_XINCREF(u->u_private);
640     }
641     c->u = u;
642 
643     c->c_nestlevel++;
644 
645     block = compiler_new_block(c);
646     if (block == NULL)
647         return 0;
648     c->u->u_curblock = block;
649 
650     if (u->u_scope_type != COMPILER_SCOPE_MODULE) {
651         if (!compiler_set_qualname(c))
652             return 0;
653     }
654 
655     return 1;
656 }
657 
658 static void
compiler_exit_scope(struct compiler * c)659 compiler_exit_scope(struct compiler *c)
660 {
661     Py_ssize_t n;
662     PyObject *capsule;
663 
664     c->c_nestlevel--;
665     compiler_unit_free(c->u);
666     /* Restore c->u to the parent unit. */
667     n = PyList_GET_SIZE(c->c_stack) - 1;
668     if (n >= 0) {
669         capsule = PyList_GET_ITEM(c->c_stack, n);
670         c->u = (struct compiler_unit *)PyCapsule_GetPointer(capsule, CAPSULE_NAME);
671         assert(c->u);
672         /* we are deleting from a list so this really shouldn't fail */
673         if (PySequence_DelItem(c->c_stack, n) < 0)
674             Py_FatalError("compiler_exit_scope()");
675         compiler_unit_check(c->u);
676     }
677     else
678         c->u = NULL;
679 
680 }
681 
682 static int
compiler_set_qualname(struct compiler * c)683 compiler_set_qualname(struct compiler *c)
684 {
685     _Py_static_string(dot, ".");
686     _Py_static_string(dot_locals, ".<locals>");
687     Py_ssize_t stack_size;
688     struct compiler_unit *u = c->u;
689     PyObject *name, *base, *dot_str, *dot_locals_str;
690 
691     base = NULL;
692     stack_size = PyList_GET_SIZE(c->c_stack);
693     assert(stack_size >= 1);
694     if (stack_size > 1) {
695         int scope, force_global = 0;
696         struct compiler_unit *parent;
697         PyObject *mangled, *capsule;
698 
699         capsule = PyList_GET_ITEM(c->c_stack, stack_size - 1);
700         parent = (struct compiler_unit *)PyCapsule_GetPointer(capsule, CAPSULE_NAME);
701         assert(parent);
702 
703         if (u->u_scope_type == COMPILER_SCOPE_FUNCTION
704             || u->u_scope_type == COMPILER_SCOPE_ASYNC_FUNCTION
705             || u->u_scope_type == COMPILER_SCOPE_CLASS) {
706             assert(u->u_name);
707             mangled = _Py_Mangle(parent->u_private, u->u_name);
708             if (!mangled)
709                 return 0;
710             scope = PyST_GetScope(parent->u_ste, mangled);
711             Py_DECREF(mangled);
712             assert(scope != GLOBAL_IMPLICIT);
713             if (scope == GLOBAL_EXPLICIT)
714                 force_global = 1;
715         }
716 
717         if (!force_global) {
718             if (parent->u_scope_type == COMPILER_SCOPE_FUNCTION
719                 || parent->u_scope_type == COMPILER_SCOPE_ASYNC_FUNCTION
720                 || parent->u_scope_type == COMPILER_SCOPE_LAMBDA) {
721                 dot_locals_str = _PyUnicode_FromId(&dot_locals);
722                 if (dot_locals_str == NULL)
723                     return 0;
724                 base = PyUnicode_Concat(parent->u_qualname, dot_locals_str);
725                 if (base == NULL)
726                     return 0;
727             }
728             else {
729                 Py_INCREF(parent->u_qualname);
730                 base = parent->u_qualname;
731             }
732         }
733     }
734 
735     if (base != NULL) {
736         dot_str = _PyUnicode_FromId(&dot);
737         if (dot_str == NULL) {
738             Py_DECREF(base);
739             return 0;
740         }
741         name = PyUnicode_Concat(base, dot_str);
742         Py_DECREF(base);
743         if (name == NULL)
744             return 0;
745         PyUnicode_Append(&name, u->u_name);
746         if (name == NULL)
747             return 0;
748     }
749     else {
750         Py_INCREF(u->u_name);
751         name = u->u_name;
752     }
753     u->u_qualname = name;
754 
755     return 1;
756 }
757 
758 
759 /* Allocate a new block and return a pointer to it.
760    Returns NULL on error.
761 */
762 
763 static basicblock *
compiler_new_block(struct compiler * c)764 compiler_new_block(struct compiler *c)
765 {
766     basicblock *b;
767     struct compiler_unit *u;
768 
769     u = c->u;
770     b = (basicblock *)PyObject_Calloc(1, sizeof(basicblock));
771     if (b == NULL) {
772         PyErr_NoMemory();
773         return NULL;
774     }
775     /* Extend the singly linked list of blocks with new block. */
776     b->b_list = u->u_blocks;
777     u->u_blocks = b;
778     return b;
779 }
780 
781 static basicblock *
compiler_next_block(struct compiler * c)782 compiler_next_block(struct compiler *c)
783 {
784     basicblock *block = compiler_new_block(c);
785     if (block == NULL)
786         return NULL;
787     c->u->u_curblock->b_next = block;
788     c->u->u_curblock = block;
789     return block;
790 }
791 
792 static basicblock *
compiler_use_next_block(struct compiler * c,basicblock * block)793 compiler_use_next_block(struct compiler *c, basicblock *block)
794 {
795     assert(block != NULL);
796     c->u->u_curblock->b_next = block;
797     c->u->u_curblock = block;
798     return block;
799 }
800 
801 /* Returns the offset of the next instruction in the current block's
802    b_instr array.  Resizes the b_instr as necessary.
803    Returns -1 on failure.
804 */
805 
806 static int
compiler_next_instr(basicblock * b)807 compiler_next_instr(basicblock *b)
808 {
809     assert(b != NULL);
810     if (b->b_instr == NULL) {
811         b->b_instr = (struct instr *)PyObject_Calloc(
812                          DEFAULT_BLOCK_SIZE, sizeof(struct instr));
813         if (b->b_instr == NULL) {
814             PyErr_NoMemory();
815             return -1;
816         }
817         b->b_ialloc = DEFAULT_BLOCK_SIZE;
818     }
819     else if (b->b_iused == b->b_ialloc) {
820         struct instr *tmp;
821         size_t oldsize, newsize;
822         oldsize = b->b_ialloc * sizeof(struct instr);
823         newsize = oldsize << 1;
824 
825         if (oldsize > (SIZE_MAX >> 1)) {
826             PyErr_NoMemory();
827             return -1;
828         }
829 
830         if (newsize == 0) {
831             PyErr_NoMemory();
832             return -1;
833         }
834         b->b_ialloc <<= 1;
835         tmp = (struct instr *)PyObject_Realloc(
836                                         (void *)b->b_instr, newsize);
837         if (tmp == NULL) {
838             PyErr_NoMemory();
839             return -1;
840         }
841         b->b_instr = tmp;
842         memset((char *)b->b_instr + oldsize, 0, newsize - oldsize);
843     }
844     return b->b_iused++;
845 }
846 
847 /* Set the line number and column offset for the following instructions.
848 
849    The line number is reset in the following cases:
850    - when entering a new scope
851    - on each statement
852    - on each expression and sub-expression
853    - before the "except" and "finally" clauses
854 */
855 
856 #define SET_LOC(c, x)                           \
857     (c)->u->u_lineno = (x)->lineno;             \
858     (c)->u->u_col_offset = (x)->col_offset;
859 
860 /* Return the stack effect of opcode with argument oparg.
861 
862    Some opcodes have different stack effect when jump to the target and
863    when not jump. The 'jump' parameter specifies the case:
864 
865    * 0 -- when not jump
866    * 1 -- when jump
867    * -1 -- maximal
868  */
869 /* XXX Make the stack effect of WITH_CLEANUP_START and
870    WITH_CLEANUP_FINISH deterministic. */
871 static int
stack_effect(int opcode,int oparg,int jump)872 stack_effect(int opcode, int oparg, int jump)
873 {
874     switch (opcode) {
875         case NOP:
876         case EXTENDED_ARG:
877             return 0;
878 
879         /* Stack manipulation */
880         case POP_TOP:
881             return -1;
882         case ROT_TWO:
883         case ROT_THREE:
884         case ROT_FOUR:
885             return 0;
886         case DUP_TOP:
887             return 1;
888         case DUP_TOP_TWO:
889             return 2;
890 
891         /* Unary operators */
892         case UNARY_POSITIVE:
893         case UNARY_NEGATIVE:
894         case UNARY_NOT:
895         case UNARY_INVERT:
896             return 0;
897 
898         case SET_ADD:
899         case LIST_APPEND:
900             return -1;
901         case MAP_ADD:
902             return -2;
903 
904         /* Binary operators */
905         case BINARY_POWER:
906         case BINARY_MULTIPLY:
907         case BINARY_MATRIX_MULTIPLY:
908         case BINARY_MODULO:
909         case BINARY_ADD:
910         case BINARY_SUBTRACT:
911         case BINARY_SUBSCR:
912         case BINARY_FLOOR_DIVIDE:
913         case BINARY_TRUE_DIVIDE:
914             return -1;
915         case INPLACE_FLOOR_DIVIDE:
916         case INPLACE_TRUE_DIVIDE:
917             return -1;
918 
919         case INPLACE_ADD:
920         case INPLACE_SUBTRACT:
921         case INPLACE_MULTIPLY:
922         case INPLACE_MATRIX_MULTIPLY:
923         case INPLACE_MODULO:
924             return -1;
925         case STORE_SUBSCR:
926             return -3;
927         case DELETE_SUBSCR:
928             return -2;
929 
930         case BINARY_LSHIFT:
931         case BINARY_RSHIFT:
932         case BINARY_AND:
933         case BINARY_XOR:
934         case BINARY_OR:
935             return -1;
936         case INPLACE_POWER:
937             return -1;
938         case GET_ITER:
939             return 0;
940 
941         case PRINT_EXPR:
942             return -1;
943         case LOAD_BUILD_CLASS:
944             return 1;
945         case INPLACE_LSHIFT:
946         case INPLACE_RSHIFT:
947         case INPLACE_AND:
948         case INPLACE_XOR:
949         case INPLACE_OR:
950             return -1;
951 
952         case SETUP_WITH:
953             /* 1 in the normal flow.
954              * Restore the stack position and push 6 values before jumping to
955              * the handler if an exception be raised. */
956             return jump ? 6 : 1;
957         case RETURN_VALUE:
958             return -1;
959         case IMPORT_STAR:
960             return -1;
961         case SETUP_ANNOTATIONS:
962             return 0;
963         case YIELD_VALUE:
964             return 0;
965         case YIELD_FROM:
966             return -1;
967         case POP_BLOCK:
968             return 0;
969         case POP_EXCEPT:
970             return -3;
971 
972         case STORE_NAME:
973             return -1;
974         case DELETE_NAME:
975             return 0;
976         case UNPACK_SEQUENCE:
977             return oparg-1;
978         case UNPACK_EX:
979             return (oparg&0xFF) + (oparg>>8);
980         case FOR_ITER:
981             /* -1 at end of iterator, 1 if continue iterating. */
982             return jump > 0 ? -1 : 1;
983 
984         case STORE_ATTR:
985             return -2;
986         case DELETE_ATTR:
987             return -1;
988         case STORE_GLOBAL:
989             return -1;
990         case DELETE_GLOBAL:
991             return 0;
992         case LOAD_CONST:
993             return 1;
994         case LOAD_NAME:
995             return 1;
996         case BUILD_TUPLE:
997         case BUILD_LIST:
998         case BUILD_SET:
999         case BUILD_STRING:
1000             return 1-oparg;
1001         case BUILD_MAP:
1002             return 1 - 2*oparg;
1003         case BUILD_CONST_KEY_MAP:
1004             return -oparg;
1005         case LOAD_ATTR:
1006             return 0;
1007         case COMPARE_OP:
1008         case IS_OP:
1009         case CONTAINS_OP:
1010             return -1;
1011         case JUMP_IF_NOT_EXC_MATCH:
1012             return -2;
1013         case IMPORT_NAME:
1014             return -1;
1015         case IMPORT_FROM:
1016             return 1;
1017 
1018         /* Jumps */
1019         case JUMP_FORWARD:
1020         case JUMP_ABSOLUTE:
1021             return 0;
1022 
1023         case JUMP_IF_TRUE_OR_POP:
1024         case JUMP_IF_FALSE_OR_POP:
1025             return jump ? 0 : -1;
1026 
1027         case POP_JUMP_IF_FALSE:
1028         case POP_JUMP_IF_TRUE:
1029             return -1;
1030 
1031         case LOAD_GLOBAL:
1032             return 1;
1033 
1034         /* Exception handling */
1035         case SETUP_FINALLY:
1036             /* 0 in the normal flow.
1037              * Restore the stack position and push 6 values before jumping to
1038              * the handler if an exception be raised. */
1039             return jump ? 6 : 0;
1040         case RERAISE:
1041             return -3;
1042 
1043         case WITH_EXCEPT_START:
1044             return 1;
1045 
1046         case LOAD_FAST:
1047             return 1;
1048         case STORE_FAST:
1049             return -1;
1050         case DELETE_FAST:
1051             return 0;
1052 
1053         case RAISE_VARARGS:
1054             return -oparg;
1055 
1056         /* Functions and calls */
1057         case CALL_FUNCTION:
1058             return -oparg;
1059         case CALL_METHOD:
1060             return -oparg-1;
1061         case CALL_FUNCTION_KW:
1062             return -oparg-1;
1063         case CALL_FUNCTION_EX:
1064             return -1 - ((oparg & 0x01) != 0);
1065         case MAKE_FUNCTION:
1066             return -1 - ((oparg & 0x01) != 0) - ((oparg & 0x02) != 0) -
1067                 ((oparg & 0x04) != 0) - ((oparg & 0x08) != 0);
1068         case BUILD_SLICE:
1069             if (oparg == 3)
1070                 return -2;
1071             else
1072                 return -1;
1073 
1074         /* Closures */
1075         case LOAD_CLOSURE:
1076             return 1;
1077         case LOAD_DEREF:
1078         case LOAD_CLASSDEREF:
1079             return 1;
1080         case STORE_DEREF:
1081             return -1;
1082         case DELETE_DEREF:
1083             return 0;
1084 
1085         /* Iterators and generators */
1086         case GET_AWAITABLE:
1087             return 0;
1088         case SETUP_ASYNC_WITH:
1089             /* 0 in the normal flow.
1090              * Restore the stack position to the position before the result
1091              * of __aenter__ and push 6 values before jumping to the handler
1092              * if an exception be raised. */
1093             return jump ? -1 + 6 : 0;
1094         case BEFORE_ASYNC_WITH:
1095             return 1;
1096         case GET_AITER:
1097             return 0;
1098         case GET_ANEXT:
1099             return 1;
1100         case GET_YIELD_FROM_ITER:
1101             return 0;
1102         case END_ASYNC_FOR:
1103             return -7;
1104         case FORMAT_VALUE:
1105             /* If there's a fmt_spec on the stack, we go from 2->1,
1106                else 1->1. */
1107             return (oparg & FVS_MASK) == FVS_HAVE_SPEC ? -1 : 0;
1108         case LOAD_METHOD:
1109             return 1;
1110         case LOAD_ASSERTION_ERROR:
1111             return 1;
1112         case LIST_TO_TUPLE:
1113             return 0;
1114         case LIST_EXTEND:
1115         case SET_UPDATE:
1116         case DICT_MERGE:
1117         case DICT_UPDATE:
1118             return -1;
1119         default:
1120             return PY_INVALID_STACK_EFFECT;
1121     }
1122     return PY_INVALID_STACK_EFFECT; /* not reachable */
1123 }
1124 
1125 int
PyCompile_OpcodeStackEffectWithJump(int opcode,int oparg,int jump)1126 PyCompile_OpcodeStackEffectWithJump(int opcode, int oparg, int jump)
1127 {
1128     return stack_effect(opcode, oparg, jump);
1129 }
1130 
1131 int
PyCompile_OpcodeStackEffect(int opcode,int oparg)1132 PyCompile_OpcodeStackEffect(int opcode, int oparg)
1133 {
1134     return stack_effect(opcode, oparg, -1);
1135 }
1136 
1137 /* Add an opcode with no argument.
1138    Returns 0 on failure, 1 on success.
1139 */
1140 
1141 static int
compiler_addop(struct compiler * c,int opcode)1142 compiler_addop(struct compiler *c, int opcode)
1143 {
1144     basicblock *b;
1145     struct instr *i;
1146     int off;
1147     assert(!HAS_ARG(opcode));
1148     if (c->c_do_not_emit_bytecode) {
1149         return 1;
1150     }
1151     off = compiler_next_instr(c->u->u_curblock);
1152     if (off < 0)
1153         return 0;
1154     b = c->u->u_curblock;
1155     i = &b->b_instr[off];
1156     i->i_opcode = opcode;
1157     i->i_oparg = 0;
1158     if (opcode == RETURN_VALUE)
1159         b->b_return = 1;
1160     i->i_lineno = c->u->u_lineno;
1161     return 1;
1162 }
1163 
1164 static Py_ssize_t
compiler_add_o(PyObject * dict,PyObject * o)1165 compiler_add_o(PyObject *dict, PyObject *o)
1166 {
1167     PyObject *v;
1168     Py_ssize_t arg;
1169 
1170     v = PyDict_GetItemWithError(dict, o);
1171     if (!v) {
1172         if (PyErr_Occurred()) {
1173             return -1;
1174         }
1175         arg = PyDict_GET_SIZE(dict);
1176         v = PyLong_FromSsize_t(arg);
1177         if (!v) {
1178             return -1;
1179         }
1180         if (PyDict_SetItem(dict, o, v) < 0) {
1181             Py_DECREF(v);
1182             return -1;
1183         }
1184         Py_DECREF(v);
1185     }
1186     else
1187         arg = PyLong_AsLong(v);
1188     return arg;
1189 }
1190 
1191 // Merge const *o* recursively and return constant key object.
1192 static PyObject*
merge_consts_recursive(struct compiler * c,PyObject * o)1193 merge_consts_recursive(struct compiler *c, PyObject *o)
1194 {
1195     // None and Ellipsis are singleton, and key is the singleton.
1196     // No need to merge object and key.
1197     if (o == Py_None || o == Py_Ellipsis) {
1198         Py_INCREF(o);
1199         return o;
1200     }
1201 
1202     PyObject *key = _PyCode_ConstantKey(o);
1203     if (key == NULL) {
1204         return NULL;
1205     }
1206 
1207     // t is borrowed reference
1208     PyObject *t = PyDict_SetDefault(c->c_const_cache, key, key);
1209     if (t != key) {
1210         // o is registered in c_const_cache.  Just use it.
1211         Py_XINCREF(t);
1212         Py_DECREF(key);
1213         return t;
1214     }
1215 
1216     // We registered o in c_const_cache.
1217     // When o is a tuple or frozenset, we want to merge its
1218     // items too.
1219     if (PyTuple_CheckExact(o)) {
1220         Py_ssize_t len = PyTuple_GET_SIZE(o);
1221         for (Py_ssize_t i = 0; i < len; i++) {
1222             PyObject *item = PyTuple_GET_ITEM(o, i);
1223             PyObject *u = merge_consts_recursive(c, item);
1224             if (u == NULL) {
1225                 Py_DECREF(key);
1226                 return NULL;
1227             }
1228 
1229             // See _PyCode_ConstantKey()
1230             PyObject *v;  // borrowed
1231             if (PyTuple_CheckExact(u)) {
1232                 v = PyTuple_GET_ITEM(u, 1);
1233             }
1234             else {
1235                 v = u;
1236             }
1237             if (v != item) {
1238                 Py_INCREF(v);
1239                 PyTuple_SET_ITEM(o, i, v);
1240                 Py_DECREF(item);
1241             }
1242 
1243             Py_DECREF(u);
1244         }
1245     }
1246     else if (PyFrozenSet_CheckExact(o)) {
1247         // *key* is tuple. And its first item is frozenset of
1248         // constant keys.
1249         // See _PyCode_ConstantKey() for detail.
1250         assert(PyTuple_CheckExact(key));
1251         assert(PyTuple_GET_SIZE(key) == 2);
1252 
1253         Py_ssize_t len = PySet_GET_SIZE(o);
1254         if (len == 0) {  // empty frozenset should not be re-created.
1255             return key;
1256         }
1257         PyObject *tuple = PyTuple_New(len);
1258         if (tuple == NULL) {
1259             Py_DECREF(key);
1260             return NULL;
1261         }
1262         Py_ssize_t i = 0, pos = 0;
1263         PyObject *item;
1264         Py_hash_t hash;
1265         while (_PySet_NextEntry(o, &pos, &item, &hash)) {
1266             PyObject *k = merge_consts_recursive(c, item);
1267             if (k == NULL) {
1268                 Py_DECREF(tuple);
1269                 Py_DECREF(key);
1270                 return NULL;
1271             }
1272             PyObject *u;
1273             if (PyTuple_CheckExact(k)) {
1274                 u = PyTuple_GET_ITEM(k, 1);
1275                 Py_INCREF(u);
1276                 Py_DECREF(k);
1277             }
1278             else {
1279                 u = k;
1280             }
1281             PyTuple_SET_ITEM(tuple, i, u);  // Steals reference of u.
1282             i++;
1283         }
1284 
1285         // Instead of rewriting o, we create new frozenset and embed in the
1286         // key tuple.  Caller should get merged frozenset from the key tuple.
1287         PyObject *new = PyFrozenSet_New(tuple);
1288         Py_DECREF(tuple);
1289         if (new == NULL) {
1290             Py_DECREF(key);
1291             return NULL;
1292         }
1293         assert(PyTuple_GET_ITEM(key, 1) == o);
1294         Py_DECREF(o);
1295         PyTuple_SET_ITEM(key, 1, new);
1296     }
1297 
1298     return key;
1299 }
1300 
1301 static Py_ssize_t
compiler_add_const(struct compiler * c,PyObject * o)1302 compiler_add_const(struct compiler *c, PyObject *o)
1303 {
1304     if (c->c_do_not_emit_bytecode) {
1305         return 0;
1306     }
1307 
1308     PyObject *key = merge_consts_recursive(c, o);
1309     if (key == NULL) {
1310         return -1;
1311     }
1312 
1313     Py_ssize_t arg = compiler_add_o(c->u->u_consts, key);
1314     Py_DECREF(key);
1315     return arg;
1316 }
1317 
1318 static int
compiler_addop_load_const(struct compiler * c,PyObject * o)1319 compiler_addop_load_const(struct compiler *c, PyObject *o)
1320 {
1321     if (c->c_do_not_emit_bytecode) {
1322         return 1;
1323     }
1324 
1325     Py_ssize_t arg = compiler_add_const(c, o);
1326     if (arg < 0)
1327         return 0;
1328     return compiler_addop_i(c, LOAD_CONST, arg);
1329 }
1330 
1331 static int
compiler_addop_o(struct compiler * c,int opcode,PyObject * dict,PyObject * o)1332 compiler_addop_o(struct compiler *c, int opcode, PyObject *dict,
1333                      PyObject *o)
1334 {
1335     if (c->c_do_not_emit_bytecode) {
1336         return 1;
1337     }
1338 
1339     Py_ssize_t arg = compiler_add_o(dict, o);
1340     if (arg < 0)
1341         return 0;
1342     return compiler_addop_i(c, opcode, arg);
1343 }
1344 
1345 static int
compiler_addop_name(struct compiler * c,int opcode,PyObject * dict,PyObject * o)1346 compiler_addop_name(struct compiler *c, int opcode, PyObject *dict,
1347                     PyObject *o)
1348 {
1349     Py_ssize_t arg;
1350 
1351     if (c->c_do_not_emit_bytecode) {
1352         return 1;
1353     }
1354 
1355     PyObject *mangled = _Py_Mangle(c->u->u_private, o);
1356     if (!mangled)
1357         return 0;
1358     arg = compiler_add_o(dict, mangled);
1359     Py_DECREF(mangled);
1360     if (arg < 0)
1361         return 0;
1362     return compiler_addop_i(c, opcode, arg);
1363 }
1364 
1365 /* Add an opcode with an integer argument.
1366    Returns 0 on failure, 1 on success.
1367 */
1368 
1369 static int
compiler_addop_i(struct compiler * c,int opcode,Py_ssize_t oparg)1370 compiler_addop_i(struct compiler *c, int opcode, Py_ssize_t oparg)
1371 {
1372     struct instr *i;
1373     int off;
1374 
1375     if (c->c_do_not_emit_bytecode) {
1376         return 1;
1377     }
1378 
1379     /* oparg value is unsigned, but a signed C int is usually used to store
1380        it in the C code (like Python/ceval.c).
1381 
1382        Limit to 32-bit signed C int (rather than INT_MAX) for portability.
1383 
1384        The argument of a concrete bytecode instruction is limited to 8-bit.
1385        EXTENDED_ARG is used for 16, 24, and 32-bit arguments. */
1386     assert(HAS_ARG(opcode));
1387     assert(0 <= oparg && oparg <= 2147483647);
1388 
1389     off = compiler_next_instr(c->u->u_curblock);
1390     if (off < 0)
1391         return 0;
1392     i = &c->u->u_curblock->b_instr[off];
1393     i->i_opcode = opcode;
1394     i->i_oparg = Py_SAFE_DOWNCAST(oparg, Py_ssize_t, int);
1395     i->i_lineno = c->u->u_lineno;
1396     return 1;
1397 }
1398 
1399 static int
compiler_addop_j(struct compiler * c,int opcode,basicblock * b,int absolute)1400 compiler_addop_j(struct compiler *c, int opcode, basicblock *b, int absolute)
1401 {
1402     struct instr *i;
1403     int off;
1404 
1405     if (c->c_do_not_emit_bytecode) {
1406         return 1;
1407     }
1408 
1409     assert(HAS_ARG(opcode));
1410     assert(b != NULL);
1411     off = compiler_next_instr(c->u->u_curblock);
1412     if (off < 0)
1413         return 0;
1414     i = &c->u->u_curblock->b_instr[off];
1415     i->i_opcode = opcode;
1416     i->i_target = b;
1417     if (absolute)
1418         i->i_jabs = 1;
1419     else
1420         i->i_jrel = 1;
1421     i->i_lineno = c->u->u_lineno;
1422     return 1;
1423 }
1424 
1425 /* NEXT_BLOCK() creates an implicit jump from the current block
1426    to the new block.
1427 
1428    The returns inside this macro make it impossible to decref objects
1429    created in the local function. Local objects should use the arena.
1430 */
1431 #define NEXT_BLOCK(C) { \
1432     if (compiler_next_block((C)) == NULL) \
1433         return 0; \
1434 }
1435 
1436 #define ADDOP(C, OP) { \
1437     if (!compiler_addop((C), (OP))) \
1438         return 0; \
1439 }
1440 
1441 #define ADDOP_IN_SCOPE(C, OP) { \
1442     if (!compiler_addop((C), (OP))) { \
1443         compiler_exit_scope(c); \
1444         return 0; \
1445     } \
1446 }
1447 
1448 #define ADDOP_LOAD_CONST(C, O) { \
1449     if (!compiler_addop_load_const((C), (O))) \
1450         return 0; \
1451 }
1452 
1453 /* Same as ADDOP_LOAD_CONST, but steals a reference. */
1454 #define ADDOP_LOAD_CONST_NEW(C, O) { \
1455     PyObject *__new_const = (O); \
1456     if (__new_const == NULL) { \
1457         return 0; \
1458     } \
1459     if (!compiler_addop_load_const((C), __new_const)) { \
1460         Py_DECREF(__new_const); \
1461         return 0; \
1462     } \
1463     Py_DECREF(__new_const); \
1464 }
1465 
1466 #define ADDOP_O(C, OP, O, TYPE) { \
1467     if (!compiler_addop_o((C), (OP), (C)->u->u_ ## TYPE, (O))) \
1468         return 0; \
1469 }
1470 
1471 /* Same as ADDOP_O, but steals a reference. */
1472 #define ADDOP_N(C, OP, O, TYPE) { \
1473     if (!compiler_addop_o((C), (OP), (C)->u->u_ ## TYPE, (O))) { \
1474         Py_DECREF((O)); \
1475         return 0; \
1476     } \
1477     Py_DECREF((O)); \
1478 }
1479 
1480 #define ADDOP_NAME(C, OP, O, TYPE) { \
1481     if (!compiler_addop_name((C), (OP), (C)->u->u_ ## TYPE, (O))) \
1482         return 0; \
1483 }
1484 
1485 #define ADDOP_I(C, OP, O) { \
1486     if (!compiler_addop_i((C), (OP), (O))) \
1487         return 0; \
1488 }
1489 
1490 #define ADDOP_JABS(C, OP, O) { \
1491     if (!compiler_addop_j((C), (OP), (O), 1)) \
1492         return 0; \
1493 }
1494 
1495 #define ADDOP_JREL(C, OP, O) { \
1496     if (!compiler_addop_j((C), (OP), (O), 0)) \
1497         return 0; \
1498 }
1499 
1500 
1501 #define ADDOP_COMPARE(C, CMP) { \
1502     if (!compiler_addcompare((C), (cmpop_ty)(CMP))) \
1503         return 0; \
1504 }
1505 
1506 /* VISIT and VISIT_SEQ takes an ASDL type as their second argument.  They use
1507    the ASDL name to synthesize the name of the C type and the visit function.
1508 */
1509 
1510 #define VISIT(C, TYPE, V) {\
1511     if (!compiler_visit_ ## TYPE((C), (V))) \
1512         return 0; \
1513 }
1514 
1515 #define VISIT_IN_SCOPE(C, TYPE, V) {\
1516     if (!compiler_visit_ ## TYPE((C), (V))) { \
1517         compiler_exit_scope(c); \
1518         return 0; \
1519     } \
1520 }
1521 
1522 #define VISIT_SLICE(C, V, CTX) {\
1523     if (!compiler_visit_slice((C), (V), (CTX))) \
1524         return 0; \
1525 }
1526 
1527 #define VISIT_SEQ(C, TYPE, SEQ) { \
1528     int _i; \
1529     asdl_seq *seq = (SEQ); /* avoid variable capture */ \
1530     for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \
1531         TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \
1532         if (!compiler_visit_ ## TYPE((C), elt)) \
1533             return 0; \
1534     } \
1535 }
1536 
1537 #define VISIT_SEQ_IN_SCOPE(C, TYPE, SEQ) { \
1538     int _i; \
1539     asdl_seq *seq = (SEQ); /* avoid variable capture */ \
1540     for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \
1541         TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \
1542         if (!compiler_visit_ ## TYPE((C), elt)) { \
1543             compiler_exit_scope(c); \
1544             return 0; \
1545         } \
1546     } \
1547 }
1548 
1549 /* These macros allows to check only for errors and not emmit bytecode
1550  * while visiting nodes.
1551 */
1552 
1553 #define BEGIN_DO_NOT_EMIT_BYTECODE { \
1554     c->c_do_not_emit_bytecode++;
1555 
1556 #define END_DO_NOT_EMIT_BYTECODE \
1557     c->c_do_not_emit_bytecode--; \
1558 }
1559 
1560 /* Search if variable annotations are present statically in a block. */
1561 
1562 static int
find_ann(asdl_seq * stmts)1563 find_ann(asdl_seq *stmts)
1564 {
1565     int i, j, res = 0;
1566     stmt_ty st;
1567 
1568     for (i = 0; i < asdl_seq_LEN(stmts); i++) {
1569         st = (stmt_ty)asdl_seq_GET(stmts, i);
1570         switch (st->kind) {
1571         case AnnAssign_kind:
1572             return 1;
1573         case For_kind:
1574             res = find_ann(st->v.For.body) ||
1575                   find_ann(st->v.For.orelse);
1576             break;
1577         case AsyncFor_kind:
1578             res = find_ann(st->v.AsyncFor.body) ||
1579                   find_ann(st->v.AsyncFor.orelse);
1580             break;
1581         case While_kind:
1582             res = find_ann(st->v.While.body) ||
1583                   find_ann(st->v.While.orelse);
1584             break;
1585         case If_kind:
1586             res = find_ann(st->v.If.body) ||
1587                   find_ann(st->v.If.orelse);
1588             break;
1589         case With_kind:
1590             res = find_ann(st->v.With.body);
1591             break;
1592         case AsyncWith_kind:
1593             res = find_ann(st->v.AsyncWith.body);
1594             break;
1595         case Try_kind:
1596             for (j = 0; j < asdl_seq_LEN(st->v.Try.handlers); j++) {
1597                 excepthandler_ty handler = (excepthandler_ty)asdl_seq_GET(
1598                     st->v.Try.handlers, j);
1599                 if (find_ann(handler->v.ExceptHandler.body)) {
1600                     return 1;
1601                 }
1602             }
1603             res = find_ann(st->v.Try.body) ||
1604                   find_ann(st->v.Try.finalbody) ||
1605                   find_ann(st->v.Try.orelse);
1606             break;
1607         default:
1608             res = 0;
1609         }
1610         if (res) {
1611             break;
1612         }
1613     }
1614     return res;
1615 }
1616 
1617 /*
1618  * Frame block handling functions
1619  */
1620 
1621 static int
compiler_push_fblock(struct compiler * c,enum fblocktype t,basicblock * b,basicblock * exit,void * datum)1622 compiler_push_fblock(struct compiler *c, enum fblocktype t, basicblock *b,
1623                      basicblock *exit, void *datum)
1624 {
1625     struct fblockinfo *f;
1626     if (c->u->u_nfblocks >= CO_MAXBLOCKS) {
1627         return compiler_error(c, "too many statically nested blocks");
1628     }
1629     f = &c->u->u_fblock[c->u->u_nfblocks++];
1630     f->fb_type = t;
1631     f->fb_block = b;
1632     f->fb_exit = exit;
1633     f->fb_datum = datum;
1634     return 1;
1635 }
1636 
1637 static void
compiler_pop_fblock(struct compiler * c,enum fblocktype t,basicblock * b)1638 compiler_pop_fblock(struct compiler *c, enum fblocktype t, basicblock *b)
1639 {
1640     struct compiler_unit *u = c->u;
1641     assert(u->u_nfblocks > 0);
1642     u->u_nfblocks--;
1643     assert(u->u_fblock[u->u_nfblocks].fb_type == t);
1644     assert(u->u_fblock[u->u_nfblocks].fb_block == b);
1645 }
1646 
1647 static int
compiler_call_exit_with_nones(struct compiler * c)1648 compiler_call_exit_with_nones(struct compiler *c) {
1649     ADDOP_O(c, LOAD_CONST, Py_None, consts);
1650     ADDOP(c, DUP_TOP);
1651     ADDOP(c, DUP_TOP);
1652     ADDOP_I(c, CALL_FUNCTION, 3);
1653     return 1;
1654 }
1655 
1656 /* Unwind a frame block.  If preserve_tos is true, the TOS before
1657  * popping the blocks will be restored afterwards, unless another
1658  * return, break or continue is found. In which case, the TOS will
1659  * be popped.
1660  */
1661 static int
compiler_unwind_fblock(struct compiler * c,struct fblockinfo * info,int preserve_tos)1662 compiler_unwind_fblock(struct compiler *c, struct fblockinfo *info,
1663                        int preserve_tos)
1664 {
1665     switch (info->fb_type) {
1666         case WHILE_LOOP:
1667         case EXCEPTION_HANDLER:
1668             return 1;
1669 
1670         case FOR_LOOP:
1671             /* Pop the iterator */
1672             if (preserve_tos) {
1673                 ADDOP(c, ROT_TWO);
1674             }
1675             ADDOP(c, POP_TOP);
1676             return 1;
1677 
1678         case TRY_EXCEPT:
1679             ADDOP(c, POP_BLOCK);
1680             return 1;
1681 
1682         case FINALLY_TRY:
1683             ADDOP(c, POP_BLOCK);
1684             if (preserve_tos) {
1685                 if (!compiler_push_fblock(c, POP_VALUE, NULL, NULL, NULL)) {
1686                     return 0;
1687                 }
1688             }
1689             /* Emit the finally block, restoring the line number when done */
1690             int saved_lineno = c->u->u_lineno;
1691             VISIT_SEQ(c, stmt, info->fb_datum);
1692             c->u->u_lineno = saved_lineno;
1693             if (preserve_tos) {
1694                 compiler_pop_fblock(c, POP_VALUE, NULL);
1695             }
1696             return 1;
1697 
1698         case FINALLY_END:
1699             if (preserve_tos) {
1700                 ADDOP(c, ROT_FOUR);
1701             }
1702             ADDOP(c, POP_TOP);
1703             ADDOP(c, POP_TOP);
1704             ADDOP(c, POP_TOP);
1705             if (preserve_tos) {
1706                 ADDOP(c, ROT_FOUR);
1707             }
1708             ADDOP(c, POP_EXCEPT);
1709             return 1;
1710 
1711         case WITH:
1712         case ASYNC_WITH:
1713             ADDOP(c, POP_BLOCK);
1714             if (preserve_tos) {
1715                 ADDOP(c, ROT_TWO);
1716             }
1717             if(!compiler_call_exit_with_nones(c)) {
1718                 return 0;
1719             }
1720             if (info->fb_type == ASYNC_WITH) {
1721                 ADDOP(c, GET_AWAITABLE);
1722                 ADDOP_LOAD_CONST(c, Py_None);
1723                 ADDOP(c, YIELD_FROM);
1724             }
1725             ADDOP(c, POP_TOP);
1726             return 1;
1727 
1728         case HANDLER_CLEANUP:
1729             if (info->fb_datum) {
1730                 ADDOP(c, POP_BLOCK);
1731             }
1732             if (preserve_tos) {
1733                 ADDOP(c, ROT_FOUR);
1734             }
1735             ADDOP(c, POP_EXCEPT);
1736             if (info->fb_datum) {
1737                 ADDOP_LOAD_CONST(c, Py_None);
1738                 compiler_nameop(c, info->fb_datum, Store);
1739                 compiler_nameop(c, info->fb_datum, Del);
1740             }
1741             return 1;
1742 
1743         case POP_VALUE:
1744             if (preserve_tos) {
1745                 ADDOP(c, ROT_TWO);
1746             }
1747             ADDOP(c, POP_TOP);
1748             return 1;
1749     }
1750     Py_UNREACHABLE();
1751 }
1752 
1753 /** Unwind block stack. If loop is not NULL, then stop when the first loop is encountered. */
1754 static int
compiler_unwind_fblock_stack(struct compiler * c,int preserve_tos,struct fblockinfo ** loop)1755 compiler_unwind_fblock_stack(struct compiler *c, int preserve_tos, struct fblockinfo **loop) {
1756     if (c->u->u_nfblocks == 0) {
1757         return 1;
1758     }
1759     struct fblockinfo *top = &c->u->u_fblock[c->u->u_nfblocks-1];
1760     if (loop != NULL && (top->fb_type == WHILE_LOOP || top->fb_type == FOR_LOOP)) {
1761         *loop = top;
1762         return 1;
1763     }
1764     struct fblockinfo copy = *top;
1765     c->u->u_nfblocks--;
1766     if (!compiler_unwind_fblock(c, &copy, preserve_tos)) {
1767         return 0;
1768     }
1769     if (!compiler_unwind_fblock_stack(c, preserve_tos, loop)) {
1770         return 0;
1771     }
1772     c->u->u_fblock[c->u->u_nfblocks] = copy;
1773     c->u->u_nfblocks++;
1774     return 1;
1775 }
1776 
1777 /* Compile a sequence of statements, checking for a docstring
1778    and for annotations. */
1779 
1780 static int
compiler_body(struct compiler * c,asdl_seq * stmts)1781 compiler_body(struct compiler *c, asdl_seq *stmts)
1782 {
1783     int i = 0;
1784     stmt_ty st;
1785     PyObject *docstring;
1786 
1787     /* Set current line number to the line number of first statement.
1788        This way line number for SETUP_ANNOTATIONS will always
1789        coincide with the line number of first "real" statement in module.
1790        If body is empty, then lineno will be set later in assemble. */
1791     if (c->u->u_scope_type == COMPILER_SCOPE_MODULE && asdl_seq_LEN(stmts)) {
1792         st = (stmt_ty)asdl_seq_GET(stmts, 0);
1793         SET_LOC(c, st);
1794     }
1795     /* Every annotated class and module should have __annotations__. */
1796     if (find_ann(stmts)) {
1797         ADDOP(c, SETUP_ANNOTATIONS);
1798     }
1799     if (!asdl_seq_LEN(stmts))
1800         return 1;
1801     /* if not -OO mode, set docstring */
1802     if (c->c_optimize < 2) {
1803         docstring = _PyAST_GetDocString(stmts);
1804         if (docstring) {
1805             i = 1;
1806             st = (stmt_ty)asdl_seq_GET(stmts, 0);
1807             assert(st->kind == Expr_kind);
1808             VISIT(c, expr, st->v.Expr.value);
1809             if (!compiler_nameop(c, __doc__, Store))
1810                 return 0;
1811         }
1812     }
1813     for (; i < asdl_seq_LEN(stmts); i++)
1814         VISIT(c, stmt, (stmt_ty)asdl_seq_GET(stmts, i));
1815     return 1;
1816 }
1817 
1818 static PyCodeObject *
compiler_mod(struct compiler * c,mod_ty mod)1819 compiler_mod(struct compiler *c, mod_ty mod)
1820 {
1821     PyCodeObject *co;
1822     int addNone = 1;
1823     static PyObject *module;
1824     if (!module) {
1825         module = PyUnicode_InternFromString("<module>");
1826         if (!module)
1827             return NULL;
1828     }
1829     /* Use 0 for firstlineno initially, will fixup in assemble(). */
1830     if (!compiler_enter_scope(c, module, COMPILER_SCOPE_MODULE, mod, 0))
1831         return NULL;
1832     switch (mod->kind) {
1833     case Module_kind:
1834         if (!compiler_body(c, mod->v.Module.body)) {
1835             compiler_exit_scope(c);
1836             return 0;
1837         }
1838         break;
1839     case Interactive_kind:
1840         if (find_ann(mod->v.Interactive.body)) {
1841             ADDOP(c, SETUP_ANNOTATIONS);
1842         }
1843         c->c_interactive = 1;
1844         VISIT_SEQ_IN_SCOPE(c, stmt,
1845                                 mod->v.Interactive.body);
1846         break;
1847     case Expression_kind:
1848         VISIT_IN_SCOPE(c, expr, mod->v.Expression.body);
1849         addNone = 0;
1850         break;
1851     default:
1852         PyErr_Format(PyExc_SystemError,
1853                      "module kind %d should not be possible",
1854                      mod->kind);
1855         return 0;
1856     }
1857     co = assemble(c, addNone);
1858     compiler_exit_scope(c);
1859     return co;
1860 }
1861 
1862 /* The test for LOCAL must come before the test for FREE in order to
1863    handle classes where name is both local and free.  The local var is
1864    a method and the free var is a free var referenced within a method.
1865 */
1866 
1867 static int
get_ref_type(struct compiler * c,PyObject * name)1868 get_ref_type(struct compiler *c, PyObject *name)
1869 {
1870     int scope;
1871     if (c->u->u_scope_type == COMPILER_SCOPE_CLASS &&
1872         _PyUnicode_EqualToASCIIString(name, "__class__"))
1873         return CELL;
1874     scope = PyST_GetScope(c->u->u_ste, name);
1875     if (scope == 0) {
1876         _Py_FatalErrorFormat(__func__,
1877            "unknown scope for %.100s in %.100s(%s)\n"
1878            "symbols: %s\nlocals: %s\nglobals: %s",
1879            PyUnicode_AsUTF8(name),
1880            PyUnicode_AsUTF8(c->u->u_name),
1881            PyUnicode_AsUTF8(PyObject_Repr(c->u->u_ste->ste_id)),
1882            PyUnicode_AsUTF8(PyObject_Repr(c->u->u_ste->ste_symbols)),
1883            PyUnicode_AsUTF8(PyObject_Repr(c->u->u_varnames)),
1884            PyUnicode_AsUTF8(PyObject_Repr(c->u->u_names)));
1885     }
1886 
1887     return scope;
1888 }
1889 
1890 static int
compiler_lookup_arg(PyObject * dict,PyObject * name)1891 compiler_lookup_arg(PyObject *dict, PyObject *name)
1892 {
1893     PyObject *v;
1894     v = PyDict_GetItem(dict, name);
1895     if (v == NULL)
1896         return -1;
1897     return PyLong_AS_LONG(v);
1898 }
1899 
1900 static int
compiler_make_closure(struct compiler * c,PyCodeObject * co,Py_ssize_t flags,PyObject * qualname)1901 compiler_make_closure(struct compiler *c, PyCodeObject *co, Py_ssize_t flags, PyObject *qualname)
1902 {
1903     Py_ssize_t i, free = PyCode_GetNumFree(co);
1904     if (qualname == NULL)
1905         qualname = co->co_name;
1906 
1907     if (free) {
1908         for (i = 0; i < free; ++i) {
1909             /* Bypass com_addop_varname because it will generate
1910                LOAD_DEREF but LOAD_CLOSURE is needed.
1911             */
1912             PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
1913             int arg, reftype;
1914 
1915             /* Special case: If a class contains a method with a
1916                free variable that has the same name as a method,
1917                the name will be considered free *and* local in the
1918                class.  It should be handled by the closure, as
1919                well as by the normal name lookup logic.
1920             */
1921             reftype = get_ref_type(c, name);
1922             if (reftype == CELL)
1923                 arg = compiler_lookup_arg(c->u->u_cellvars, name);
1924             else /* (reftype == FREE) */
1925                 arg = compiler_lookup_arg(c->u->u_freevars, name);
1926             if (arg == -1) {
1927                 _Py_FatalErrorFormat(__func__,
1928                     "lookup %s in %s %d %d\n"
1929                     "freevars of %s: %s\n",
1930                     PyUnicode_AsUTF8(PyObject_Repr(name)),
1931                     PyUnicode_AsUTF8(c->u->u_name),
1932                     reftype, arg,
1933                     PyUnicode_AsUTF8(co->co_name),
1934                     PyUnicode_AsUTF8(PyObject_Repr(co->co_freevars)));
1935             }
1936             ADDOP_I(c, LOAD_CLOSURE, arg);
1937         }
1938         flags |= 0x08;
1939         ADDOP_I(c, BUILD_TUPLE, free);
1940     }
1941     ADDOP_LOAD_CONST(c, (PyObject*)co);
1942     ADDOP_LOAD_CONST(c, qualname);
1943     ADDOP_I(c, MAKE_FUNCTION, flags);
1944     return 1;
1945 }
1946 
1947 static int
compiler_decorators(struct compiler * c,asdl_seq * decos)1948 compiler_decorators(struct compiler *c, asdl_seq* decos)
1949 {
1950     int i;
1951 
1952     if (!decos)
1953         return 1;
1954 
1955     for (i = 0; i < asdl_seq_LEN(decos); i++) {
1956         VISIT(c, expr, (expr_ty)asdl_seq_GET(decos, i));
1957     }
1958     return 1;
1959 }
1960 
1961 static int
compiler_visit_kwonlydefaults(struct compiler * c,asdl_seq * kwonlyargs,asdl_seq * kw_defaults)1962 compiler_visit_kwonlydefaults(struct compiler *c, asdl_seq *kwonlyargs,
1963                               asdl_seq *kw_defaults)
1964 {
1965     /* Push a dict of keyword-only default values.
1966 
1967        Return 0 on error, -1 if no dict pushed, 1 if a dict is pushed.
1968        */
1969     int i;
1970     PyObject *keys = NULL;
1971 
1972     for (i = 0; i < asdl_seq_LEN(kwonlyargs); i++) {
1973         arg_ty arg = asdl_seq_GET(kwonlyargs, i);
1974         expr_ty default_ = asdl_seq_GET(kw_defaults, i);
1975         if (default_) {
1976             PyObject *mangled = _Py_Mangle(c->u->u_private, arg->arg);
1977             if (!mangled) {
1978                 goto error;
1979             }
1980             if (keys == NULL) {
1981                 keys = PyList_New(1);
1982                 if (keys == NULL) {
1983                     Py_DECREF(mangled);
1984                     return 0;
1985                 }
1986                 PyList_SET_ITEM(keys, 0, mangled);
1987             }
1988             else {
1989                 int res = PyList_Append(keys, mangled);
1990                 Py_DECREF(mangled);
1991                 if (res == -1) {
1992                     goto error;
1993                 }
1994             }
1995             if (!compiler_visit_expr(c, default_)) {
1996                 goto error;
1997             }
1998         }
1999     }
2000     if (keys != NULL) {
2001         Py_ssize_t default_count = PyList_GET_SIZE(keys);
2002         PyObject *keys_tuple = PyList_AsTuple(keys);
2003         Py_DECREF(keys);
2004         ADDOP_LOAD_CONST_NEW(c, keys_tuple);
2005         ADDOP_I(c, BUILD_CONST_KEY_MAP, default_count);
2006         assert(default_count > 0);
2007         return 1;
2008     }
2009     else {
2010         return -1;
2011     }
2012 
2013 error:
2014     Py_XDECREF(keys);
2015     return 0;
2016 }
2017 
2018 static int
compiler_visit_annexpr(struct compiler * c,expr_ty annotation)2019 compiler_visit_annexpr(struct compiler *c, expr_ty annotation)
2020 {
2021     ADDOP_LOAD_CONST_NEW(c, _PyAST_ExprAsUnicode(annotation));
2022     return 1;
2023 }
2024 
2025 static int
compiler_visit_argannotation(struct compiler * c,identifier id,expr_ty annotation,PyObject * names)2026 compiler_visit_argannotation(struct compiler *c, identifier id,
2027     expr_ty annotation, PyObject *names)
2028 {
2029     if (annotation) {
2030         PyObject *mangled;
2031         if (c->c_future->ff_features & CO_FUTURE_ANNOTATIONS) {
2032             VISIT(c, annexpr, annotation)
2033         }
2034         else {
2035             VISIT(c, expr, annotation);
2036         }
2037         mangled = _Py_Mangle(c->u->u_private, id);
2038         if (!mangled)
2039             return 0;
2040         if (PyList_Append(names, mangled) < 0) {
2041             Py_DECREF(mangled);
2042             return 0;
2043         }
2044         Py_DECREF(mangled);
2045     }
2046     return 1;
2047 }
2048 
2049 static int
compiler_visit_argannotations(struct compiler * c,asdl_seq * args,PyObject * names)2050 compiler_visit_argannotations(struct compiler *c, asdl_seq* args,
2051                               PyObject *names)
2052 {
2053     int i;
2054     for (i = 0; i < asdl_seq_LEN(args); i++) {
2055         arg_ty arg = (arg_ty)asdl_seq_GET(args, i);
2056         if (!compiler_visit_argannotation(
2057                         c,
2058                         arg->arg,
2059                         arg->annotation,
2060                         names))
2061             return 0;
2062     }
2063     return 1;
2064 }
2065 
2066 static int
compiler_visit_annotations(struct compiler * c,arguments_ty args,expr_ty returns)2067 compiler_visit_annotations(struct compiler *c, arguments_ty args,
2068                            expr_ty returns)
2069 {
2070     /* Push arg annotation dict.
2071        The expressions are evaluated out-of-order wrt the source code.
2072 
2073        Return 0 on error, -1 if no dict pushed, 1 if a dict is pushed.
2074        */
2075     static identifier return_str;
2076     PyObject *names;
2077     Py_ssize_t len;
2078     names = PyList_New(0);
2079     if (!names)
2080         return 0;
2081 
2082     if (!compiler_visit_argannotations(c, args->args, names))
2083         goto error;
2084     if (!compiler_visit_argannotations(c, args->posonlyargs, names))
2085         goto error;
2086     if (args->vararg && args->vararg->annotation &&
2087         !compiler_visit_argannotation(c, args->vararg->arg,
2088                                      args->vararg->annotation, names))
2089         goto error;
2090     if (!compiler_visit_argannotations(c, args->kwonlyargs, names))
2091         goto error;
2092     if (args->kwarg && args->kwarg->annotation &&
2093         !compiler_visit_argannotation(c, args->kwarg->arg,
2094                                      args->kwarg->annotation, names))
2095         goto error;
2096 
2097     if (!return_str) {
2098         return_str = PyUnicode_InternFromString("return");
2099         if (!return_str)
2100             goto error;
2101     }
2102     if (!compiler_visit_argannotation(c, return_str, returns, names)) {
2103         goto error;
2104     }
2105 
2106     len = PyList_GET_SIZE(names);
2107     if (len) {
2108         PyObject *keytuple = PyList_AsTuple(names);
2109         Py_DECREF(names);
2110         ADDOP_LOAD_CONST_NEW(c, keytuple);
2111         ADDOP_I(c, BUILD_CONST_KEY_MAP, len);
2112         return 1;
2113     }
2114     else {
2115         Py_DECREF(names);
2116         return -1;
2117     }
2118 
2119 error:
2120     Py_DECREF(names);
2121     return 0;
2122 }
2123 
2124 static int
compiler_visit_defaults(struct compiler * c,arguments_ty args)2125 compiler_visit_defaults(struct compiler *c, arguments_ty args)
2126 {
2127     VISIT_SEQ(c, expr, args->defaults);
2128     ADDOP_I(c, BUILD_TUPLE, asdl_seq_LEN(args->defaults));
2129     return 1;
2130 }
2131 
2132 static Py_ssize_t
compiler_default_arguments(struct compiler * c,arguments_ty args)2133 compiler_default_arguments(struct compiler *c, arguments_ty args)
2134 {
2135     Py_ssize_t funcflags = 0;
2136     if (args->defaults && asdl_seq_LEN(args->defaults) > 0) {
2137         if (!compiler_visit_defaults(c, args))
2138             return -1;
2139         funcflags |= 0x01;
2140     }
2141     if (args->kwonlyargs) {
2142         int res = compiler_visit_kwonlydefaults(c, args->kwonlyargs,
2143                                                 args->kw_defaults);
2144         if (res == 0) {
2145             return -1;
2146         }
2147         else if (res > 0) {
2148             funcflags |= 0x02;
2149         }
2150     }
2151     return funcflags;
2152 }
2153 
2154 static int
forbidden_name(struct compiler * c,identifier name,expr_context_ty ctx)2155 forbidden_name(struct compiler *c, identifier name, expr_context_ty ctx)
2156 {
2157 
2158     if (ctx == Store && _PyUnicode_EqualToASCIIString(name, "__debug__")) {
2159         compiler_error(c, "cannot assign to __debug__");
2160         return 1;
2161     }
2162     return 0;
2163 }
2164 
2165 static int
compiler_check_debug_one_arg(struct compiler * c,arg_ty arg)2166 compiler_check_debug_one_arg(struct compiler *c, arg_ty arg)
2167 {
2168     if (arg != NULL) {
2169         if (forbidden_name(c, arg->arg, Store))
2170             return 0;
2171     }
2172     return 1;
2173 }
2174 
2175 static int
compiler_check_debug_args_seq(struct compiler * c,asdl_seq * args)2176 compiler_check_debug_args_seq(struct compiler *c, asdl_seq *args)
2177 {
2178     if (args != NULL) {
2179         for (Py_ssize_t i = 0, n = asdl_seq_LEN(args); i < n; i++) {
2180             if (!compiler_check_debug_one_arg(c, asdl_seq_GET(args, i)))
2181                 return 0;
2182         }
2183     }
2184     return 1;
2185 }
2186 
2187 static int
compiler_check_debug_args(struct compiler * c,arguments_ty args)2188 compiler_check_debug_args(struct compiler *c, arguments_ty args)
2189 {
2190     if (!compiler_check_debug_args_seq(c, args->posonlyargs))
2191         return 0;
2192     if (!compiler_check_debug_args_seq(c, args->args))
2193         return 0;
2194     if (!compiler_check_debug_one_arg(c, args->vararg))
2195         return 0;
2196     if (!compiler_check_debug_args_seq(c, args->kwonlyargs))
2197         return 0;
2198     if (!compiler_check_debug_one_arg(c, args->kwarg))
2199         return 0;
2200     return 1;
2201 }
2202 
2203 static int
compiler_function(struct compiler * c,stmt_ty s,int is_async)2204 compiler_function(struct compiler *c, stmt_ty s, int is_async)
2205 {
2206     PyCodeObject *co;
2207     PyObject *qualname, *docstring = NULL;
2208     arguments_ty args;
2209     expr_ty returns;
2210     identifier name;
2211     asdl_seq* decos;
2212     asdl_seq *body;
2213     Py_ssize_t i, funcflags;
2214     int annotations;
2215     int scope_type;
2216     int firstlineno;
2217 
2218     if (is_async) {
2219         assert(s->kind == AsyncFunctionDef_kind);
2220 
2221         args = s->v.AsyncFunctionDef.args;
2222         returns = s->v.AsyncFunctionDef.returns;
2223         decos = s->v.AsyncFunctionDef.decorator_list;
2224         name = s->v.AsyncFunctionDef.name;
2225         body = s->v.AsyncFunctionDef.body;
2226 
2227         scope_type = COMPILER_SCOPE_ASYNC_FUNCTION;
2228     } else {
2229         assert(s->kind == FunctionDef_kind);
2230 
2231         args = s->v.FunctionDef.args;
2232         returns = s->v.FunctionDef.returns;
2233         decos = s->v.FunctionDef.decorator_list;
2234         name = s->v.FunctionDef.name;
2235         body = s->v.FunctionDef.body;
2236 
2237         scope_type = COMPILER_SCOPE_FUNCTION;
2238     }
2239 
2240     if (!compiler_check_debug_args(c, args))
2241         return 0;
2242 
2243     if (!compiler_decorators(c, decos))
2244         return 0;
2245 
2246     firstlineno = s->lineno;
2247     if (asdl_seq_LEN(decos)) {
2248         firstlineno = ((expr_ty)asdl_seq_GET(decos, 0))->lineno;
2249     }
2250 
2251     funcflags = compiler_default_arguments(c, args);
2252     if (funcflags == -1) {
2253         return 0;
2254     }
2255 
2256     annotations = compiler_visit_annotations(c, args, returns);
2257     if (annotations == 0) {
2258         return 0;
2259     }
2260     else if (annotations > 0) {
2261         funcflags |= 0x04;
2262     }
2263 
2264     if (!compiler_enter_scope(c, name, scope_type, (void *)s, firstlineno)) {
2265         return 0;
2266     }
2267 
2268     /* if not -OO mode, add docstring */
2269     if (c->c_optimize < 2) {
2270         docstring = _PyAST_GetDocString(body);
2271     }
2272     if (compiler_add_const(c, docstring ? docstring : Py_None) < 0) {
2273         compiler_exit_scope(c);
2274         return 0;
2275     }
2276 
2277     c->u->u_argcount = asdl_seq_LEN(args->args);
2278     c->u->u_posonlyargcount = asdl_seq_LEN(args->posonlyargs);
2279     c->u->u_kwonlyargcount = asdl_seq_LEN(args->kwonlyargs);
2280     VISIT_SEQ_IN_SCOPE(c, stmt, body);
2281     co = assemble(c, 1);
2282     qualname = c->u->u_qualname;
2283     Py_INCREF(qualname);
2284     compiler_exit_scope(c);
2285     if (co == NULL) {
2286         Py_XDECREF(qualname);
2287         Py_XDECREF(co);
2288         return 0;
2289     }
2290 
2291     compiler_make_closure(c, co, funcflags, qualname);
2292     Py_DECREF(qualname);
2293     Py_DECREF(co);
2294 
2295     /* decorators */
2296     for (i = 0; i < asdl_seq_LEN(decos); i++) {
2297         ADDOP_I(c, CALL_FUNCTION, 1);
2298     }
2299 
2300     return compiler_nameop(c, name, Store);
2301 }
2302 
2303 static int
compiler_class(struct compiler * c,stmt_ty s)2304 compiler_class(struct compiler *c, stmt_ty s)
2305 {
2306     PyCodeObject *co;
2307     PyObject *str;
2308     int i, firstlineno;
2309     asdl_seq* decos = s->v.ClassDef.decorator_list;
2310 
2311     if (!compiler_decorators(c, decos))
2312         return 0;
2313 
2314     firstlineno = s->lineno;
2315     if (asdl_seq_LEN(decos)) {
2316         firstlineno = ((expr_ty)asdl_seq_GET(decos, 0))->lineno;
2317     }
2318 
2319     /* ultimately generate code for:
2320          <name> = __build_class__(<func>, <name>, *<bases>, **<keywords>)
2321        where:
2322          <func> is a function/closure created from the class body;
2323             it has a single argument (__locals__) where the dict
2324             (or MutableSequence) representing the locals is passed
2325          <name> is the class name
2326          <bases> is the positional arguments and *varargs argument
2327          <keywords> is the keyword arguments and **kwds argument
2328        This borrows from compiler_call.
2329     */
2330 
2331     /* 1. compile the class body into a code object */
2332     if (!compiler_enter_scope(c, s->v.ClassDef.name,
2333                               COMPILER_SCOPE_CLASS, (void *)s, firstlineno))
2334         return 0;
2335     /* this block represents what we do in the new scope */
2336     {
2337         /* use the class name for name mangling */
2338         Py_INCREF(s->v.ClassDef.name);
2339         Py_XSETREF(c->u->u_private, s->v.ClassDef.name);
2340         /* load (global) __name__ ... */
2341         str = PyUnicode_InternFromString("__name__");
2342         if (!str || !compiler_nameop(c, str, Load)) {
2343             Py_XDECREF(str);
2344             compiler_exit_scope(c);
2345             return 0;
2346         }
2347         Py_DECREF(str);
2348         /* ... and store it as __module__ */
2349         str = PyUnicode_InternFromString("__module__");
2350         if (!str || !compiler_nameop(c, str, Store)) {
2351             Py_XDECREF(str);
2352             compiler_exit_scope(c);
2353             return 0;
2354         }
2355         Py_DECREF(str);
2356         assert(c->u->u_qualname);
2357         ADDOP_LOAD_CONST(c, c->u->u_qualname);
2358         str = PyUnicode_InternFromString("__qualname__");
2359         if (!str || !compiler_nameop(c, str, Store)) {
2360             Py_XDECREF(str);
2361             compiler_exit_scope(c);
2362             return 0;
2363         }
2364         Py_DECREF(str);
2365         /* compile the body proper */
2366         if (!compiler_body(c, s->v.ClassDef.body)) {
2367             compiler_exit_scope(c);
2368             return 0;
2369         }
2370         /* Return __classcell__ if it is referenced, otherwise return None */
2371         if (c->u->u_ste->ste_needs_class_closure) {
2372             /* Store __classcell__ into class namespace & return it */
2373             str = PyUnicode_InternFromString("__class__");
2374             if (str == NULL) {
2375                 compiler_exit_scope(c);
2376                 return 0;
2377             }
2378             i = compiler_lookup_arg(c->u->u_cellvars, str);
2379             Py_DECREF(str);
2380             if (i < 0) {
2381                 compiler_exit_scope(c);
2382                 return 0;
2383             }
2384             assert(i == 0);
2385 
2386             ADDOP_I(c, LOAD_CLOSURE, i);
2387             ADDOP(c, DUP_TOP);
2388             str = PyUnicode_InternFromString("__classcell__");
2389             if (!str || !compiler_nameop(c, str, Store)) {
2390                 Py_XDECREF(str);
2391                 compiler_exit_scope(c);
2392                 return 0;
2393             }
2394             Py_DECREF(str);
2395         }
2396         else {
2397             /* No methods referenced __class__, so just return None */
2398             assert(PyDict_GET_SIZE(c->u->u_cellvars) == 0);
2399             ADDOP_LOAD_CONST(c, Py_None);
2400         }
2401         ADDOP_IN_SCOPE(c, RETURN_VALUE);
2402         /* create the code object */
2403         co = assemble(c, 1);
2404     }
2405     /* leave the new scope */
2406     compiler_exit_scope(c);
2407     if (co == NULL)
2408         return 0;
2409 
2410     /* 2. load the 'build_class' function */
2411     ADDOP(c, LOAD_BUILD_CLASS);
2412 
2413     /* 3. load a function (or closure) made from the code object */
2414     compiler_make_closure(c, co, 0, NULL);
2415     Py_DECREF(co);
2416 
2417     /* 4. load class name */
2418     ADDOP_LOAD_CONST(c, s->v.ClassDef.name);
2419 
2420     /* 5. generate the rest of the code for the call */
2421     if (!compiler_call_helper(c, 2,
2422                               s->v.ClassDef.bases,
2423                               s->v.ClassDef.keywords))
2424         return 0;
2425 
2426     /* 6. apply decorators */
2427     for (i = 0; i < asdl_seq_LEN(decos); i++) {
2428         ADDOP_I(c, CALL_FUNCTION, 1);
2429     }
2430 
2431     /* 7. store into <name> */
2432     if (!compiler_nameop(c, s->v.ClassDef.name, Store))
2433         return 0;
2434     return 1;
2435 }
2436 
2437 /* Return 0 if the expression is a constant value except named singletons.
2438    Return 1 otherwise. */
2439 static int
check_is_arg(expr_ty e)2440 check_is_arg(expr_ty e)
2441 {
2442     if (e->kind != Constant_kind) {
2443         return 1;
2444     }
2445     PyObject *value = e->v.Constant.value;
2446     return (value == Py_None
2447          || value == Py_False
2448          || value == Py_True
2449          || value == Py_Ellipsis);
2450 }
2451 
2452 /* Check operands of identity chacks ("is" and "is not").
2453    Emit a warning if any operand is a constant except named singletons.
2454    Return 0 on error.
2455  */
2456 static int
check_compare(struct compiler * c,expr_ty e)2457 check_compare(struct compiler *c, expr_ty e)
2458 {
2459     Py_ssize_t i, n;
2460     int left = check_is_arg(e->v.Compare.left);
2461     n = asdl_seq_LEN(e->v.Compare.ops);
2462     for (i = 0; i < n; i++) {
2463         cmpop_ty op = (cmpop_ty)asdl_seq_GET(e->v.Compare.ops, i);
2464         int right = check_is_arg((expr_ty)asdl_seq_GET(e->v.Compare.comparators, i));
2465         if (op == Is || op == IsNot) {
2466             if (!right || !left) {
2467                 const char *msg = (op == Is)
2468                         ? "\"is\" with a literal. Did you mean \"==\"?"
2469                         : "\"is not\" with a literal. Did you mean \"!=\"?";
2470                 return compiler_warn(c, msg);
2471             }
2472         }
2473         left = right;
2474     }
2475     return 1;
2476 }
2477 
compiler_addcompare(struct compiler * c,cmpop_ty op)2478 static int compiler_addcompare(struct compiler *c, cmpop_ty op)
2479 {
2480     int cmp;
2481     switch (op) {
2482     case Eq:
2483         cmp = Py_EQ;
2484         break;
2485     case NotEq:
2486         cmp = Py_NE;
2487         break;
2488     case Lt:
2489         cmp = Py_LT;
2490         break;
2491     case LtE:
2492         cmp = Py_LE;
2493         break;
2494     case Gt:
2495         cmp = Py_GT;
2496         break;
2497     case GtE:
2498         cmp = Py_GE;
2499         break;
2500     case Is:
2501         ADDOP_I(c, IS_OP, 0);
2502         return 1;
2503     case IsNot:
2504         ADDOP_I(c, IS_OP, 1);
2505         return 1;
2506     case In:
2507         ADDOP_I(c, CONTAINS_OP, 0);
2508         return 1;
2509     case NotIn:
2510         ADDOP_I(c, CONTAINS_OP, 1);
2511         return 1;
2512     default:
2513         Py_UNREACHABLE();
2514     }
2515     ADDOP_I(c, COMPARE_OP, cmp);
2516     return 1;
2517 }
2518 
2519 
2520 
2521 static int
compiler_jump_if(struct compiler * c,expr_ty e,basicblock * next,int cond)2522 compiler_jump_if(struct compiler *c, expr_ty e, basicblock *next, int cond)
2523 {
2524     switch (e->kind) {
2525     case UnaryOp_kind:
2526         if (e->v.UnaryOp.op == Not)
2527             return compiler_jump_if(c, e->v.UnaryOp.operand, next, !cond);
2528         /* fallback to general implementation */
2529         break;
2530     case BoolOp_kind: {
2531         asdl_seq *s = e->v.BoolOp.values;
2532         Py_ssize_t i, n = asdl_seq_LEN(s) - 1;
2533         assert(n >= 0);
2534         int cond2 = e->v.BoolOp.op == Or;
2535         basicblock *next2 = next;
2536         if (!cond2 != !cond) {
2537             next2 = compiler_new_block(c);
2538             if (next2 == NULL)
2539                 return 0;
2540         }
2541         for (i = 0; i < n; ++i) {
2542             if (!compiler_jump_if(c, (expr_ty)asdl_seq_GET(s, i), next2, cond2))
2543                 return 0;
2544         }
2545         if (!compiler_jump_if(c, (expr_ty)asdl_seq_GET(s, n), next, cond))
2546             return 0;
2547         if (next2 != next)
2548             compiler_use_next_block(c, next2);
2549         return 1;
2550     }
2551     case IfExp_kind: {
2552         basicblock *end, *next2;
2553         end = compiler_new_block(c);
2554         if (end == NULL)
2555             return 0;
2556         next2 = compiler_new_block(c);
2557         if (next2 == NULL)
2558             return 0;
2559         if (!compiler_jump_if(c, e->v.IfExp.test, next2, 0))
2560             return 0;
2561         if (!compiler_jump_if(c, e->v.IfExp.body, next, cond))
2562             return 0;
2563         ADDOP_JREL(c, JUMP_FORWARD, end);
2564         compiler_use_next_block(c, next2);
2565         if (!compiler_jump_if(c, e->v.IfExp.orelse, next, cond))
2566             return 0;
2567         compiler_use_next_block(c, end);
2568         return 1;
2569     }
2570     case Compare_kind: {
2571         Py_ssize_t i, n = asdl_seq_LEN(e->v.Compare.ops) - 1;
2572         if (n > 0) {
2573             if (!check_compare(c, e)) {
2574                 return 0;
2575             }
2576             basicblock *cleanup = compiler_new_block(c);
2577             if (cleanup == NULL)
2578                 return 0;
2579             VISIT(c, expr, e->v.Compare.left);
2580             for (i = 0; i < n; i++) {
2581                 VISIT(c, expr,
2582                     (expr_ty)asdl_seq_GET(e->v.Compare.comparators, i));
2583                 ADDOP(c, DUP_TOP);
2584                 ADDOP(c, ROT_THREE);
2585                 ADDOP_COMPARE(c, asdl_seq_GET(e->v.Compare.ops, i));
2586                 ADDOP_JABS(c, POP_JUMP_IF_FALSE, cleanup);
2587                 NEXT_BLOCK(c);
2588             }
2589             VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, n));
2590             ADDOP_COMPARE(c, asdl_seq_GET(e->v.Compare.ops, n));
2591             ADDOP_JABS(c, cond ? POP_JUMP_IF_TRUE : POP_JUMP_IF_FALSE, next);
2592             basicblock *end = compiler_new_block(c);
2593             if (end == NULL)
2594                 return 0;
2595             ADDOP_JREL(c, JUMP_FORWARD, end);
2596             compiler_use_next_block(c, cleanup);
2597             ADDOP(c, POP_TOP);
2598             if (!cond) {
2599                 ADDOP_JREL(c, JUMP_FORWARD, next);
2600             }
2601             compiler_use_next_block(c, end);
2602             return 1;
2603         }
2604         /* fallback to general implementation */
2605         break;
2606     }
2607     default:
2608         /* fallback to general implementation */
2609         break;
2610     }
2611 
2612     /* general implementation */
2613     VISIT(c, expr, e);
2614     ADDOP_JABS(c, cond ? POP_JUMP_IF_TRUE : POP_JUMP_IF_FALSE, next);
2615     return 1;
2616 }
2617 
2618 static int
compiler_ifexp(struct compiler * c,expr_ty e)2619 compiler_ifexp(struct compiler *c, expr_ty e)
2620 {
2621     basicblock *end, *next;
2622 
2623     assert(e->kind == IfExp_kind);
2624     end = compiler_new_block(c);
2625     if (end == NULL)
2626         return 0;
2627     next = compiler_new_block(c);
2628     if (next == NULL)
2629         return 0;
2630     if (!compiler_jump_if(c, e->v.IfExp.test, next, 0))
2631         return 0;
2632     VISIT(c, expr, e->v.IfExp.body);
2633     ADDOP_JREL(c, JUMP_FORWARD, end);
2634     compiler_use_next_block(c, next);
2635     VISIT(c, expr, e->v.IfExp.orelse);
2636     compiler_use_next_block(c, end);
2637     return 1;
2638 }
2639 
2640 static int
compiler_lambda(struct compiler * c,expr_ty e)2641 compiler_lambda(struct compiler *c, expr_ty e)
2642 {
2643     PyCodeObject *co;
2644     PyObject *qualname;
2645     static identifier name;
2646     Py_ssize_t funcflags;
2647     arguments_ty args = e->v.Lambda.args;
2648     assert(e->kind == Lambda_kind);
2649 
2650     if (!compiler_check_debug_args(c, args))
2651         return 0;
2652 
2653     if (!name) {
2654         name = PyUnicode_InternFromString("<lambda>");
2655         if (!name)
2656             return 0;
2657     }
2658 
2659     funcflags = compiler_default_arguments(c, args);
2660     if (funcflags == -1) {
2661         return 0;
2662     }
2663 
2664     if (!compiler_enter_scope(c, name, COMPILER_SCOPE_LAMBDA,
2665                               (void *)e, e->lineno))
2666         return 0;
2667 
2668     /* Make None the first constant, so the lambda can't have a
2669        docstring. */
2670     if (compiler_add_const(c, Py_None) < 0)
2671         return 0;
2672 
2673     c->u->u_argcount = asdl_seq_LEN(args->args);
2674     c->u->u_posonlyargcount = asdl_seq_LEN(args->posonlyargs);
2675     c->u->u_kwonlyargcount = asdl_seq_LEN(args->kwonlyargs);
2676     VISIT_IN_SCOPE(c, expr, e->v.Lambda.body);
2677     if (c->u->u_ste->ste_generator) {
2678         co = assemble(c, 0);
2679     }
2680     else {
2681         ADDOP_IN_SCOPE(c, RETURN_VALUE);
2682         co = assemble(c, 1);
2683     }
2684     qualname = c->u->u_qualname;
2685     Py_INCREF(qualname);
2686     compiler_exit_scope(c);
2687     if (co == NULL)
2688         return 0;
2689 
2690     compiler_make_closure(c, co, funcflags, qualname);
2691     Py_DECREF(qualname);
2692     Py_DECREF(co);
2693 
2694     return 1;
2695 }
2696 
2697 static int
compiler_if(struct compiler * c,stmt_ty s)2698 compiler_if(struct compiler *c, stmt_ty s)
2699 {
2700     basicblock *end, *next;
2701     int constant;
2702     assert(s->kind == If_kind);
2703     end = compiler_new_block(c);
2704     if (end == NULL)
2705         return 0;
2706 
2707     constant = expr_constant(s->v.If.test);
2708     /* constant = 0: "if 0"
2709      * constant = 1: "if 1", "if 2", ...
2710      * constant = -1: rest */
2711     if (constant == 0) {
2712         BEGIN_DO_NOT_EMIT_BYTECODE
2713         VISIT_SEQ(c, stmt, s->v.If.body);
2714         END_DO_NOT_EMIT_BYTECODE
2715         if (s->v.If.orelse) {
2716             VISIT_SEQ(c, stmt, s->v.If.orelse);
2717         }
2718     } else if (constant == 1) {
2719         VISIT_SEQ(c, stmt, s->v.If.body);
2720         if (s->v.If.orelse) {
2721             BEGIN_DO_NOT_EMIT_BYTECODE
2722             VISIT_SEQ(c, stmt, s->v.If.orelse);
2723             END_DO_NOT_EMIT_BYTECODE
2724         }
2725     } else {
2726         if (asdl_seq_LEN(s->v.If.orelse)) {
2727             next = compiler_new_block(c);
2728             if (next == NULL)
2729                 return 0;
2730         }
2731         else {
2732             next = end;
2733         }
2734         if (!compiler_jump_if(c, s->v.If.test, next, 0)) {
2735             return 0;
2736         }
2737         VISIT_SEQ(c, stmt, s->v.If.body);
2738         if (asdl_seq_LEN(s->v.If.orelse)) {
2739             ADDOP_JREL(c, JUMP_FORWARD, end);
2740             compiler_use_next_block(c, next);
2741             VISIT_SEQ(c, stmt, s->v.If.orelse);
2742         }
2743     }
2744     compiler_use_next_block(c, end);
2745     return 1;
2746 }
2747 
2748 static int
compiler_for(struct compiler * c,stmt_ty s)2749 compiler_for(struct compiler *c, stmt_ty s)
2750 {
2751     basicblock *start, *cleanup, *end;
2752 
2753     start = compiler_new_block(c);
2754     cleanup = compiler_new_block(c);
2755     end = compiler_new_block(c);
2756     if (start == NULL || end == NULL || cleanup == NULL) {
2757         return 0;
2758     }
2759     if (!compiler_push_fblock(c, FOR_LOOP, start, end, NULL)) {
2760         return 0;
2761     }
2762     VISIT(c, expr, s->v.For.iter);
2763     ADDOP(c, GET_ITER);
2764     compiler_use_next_block(c, start);
2765     ADDOP_JREL(c, FOR_ITER, cleanup);
2766     VISIT(c, expr, s->v.For.target);
2767     VISIT_SEQ(c, stmt, s->v.For.body);
2768     ADDOP_JABS(c, JUMP_ABSOLUTE, start);
2769     compiler_use_next_block(c, cleanup);
2770 
2771     compiler_pop_fblock(c, FOR_LOOP, start);
2772 
2773     VISIT_SEQ(c, stmt, s->v.For.orelse);
2774     compiler_use_next_block(c, end);
2775     return 1;
2776 }
2777 
2778 
2779 static int
compiler_async_for(struct compiler * c,stmt_ty s)2780 compiler_async_for(struct compiler *c, stmt_ty s)
2781 {
2782     basicblock *start, *except, *end;
2783     if (IS_TOP_LEVEL_AWAIT(c)){
2784         c->u->u_ste->ste_coroutine = 1;
2785     } else if (c->u->u_scope_type != COMPILER_SCOPE_ASYNC_FUNCTION) {
2786         return compiler_error(c, "'async for' outside async function");
2787     }
2788 
2789     start = compiler_new_block(c);
2790     except = compiler_new_block(c);
2791     end = compiler_new_block(c);
2792 
2793     if (start == NULL || except == NULL || end == NULL) {
2794         return 0;
2795     }
2796     VISIT(c, expr, s->v.AsyncFor.iter);
2797     ADDOP(c, GET_AITER);
2798 
2799     compiler_use_next_block(c, start);
2800     if (!compiler_push_fblock(c, FOR_LOOP, start, end, NULL)) {
2801         return 0;
2802     }
2803     /* SETUP_FINALLY to guard the __anext__ call */
2804     ADDOP_JREL(c, SETUP_FINALLY, except);
2805     ADDOP(c, GET_ANEXT);
2806     ADDOP_LOAD_CONST(c, Py_None);
2807     ADDOP(c, YIELD_FROM);
2808     ADDOP(c, POP_BLOCK);  /* for SETUP_FINALLY */
2809 
2810     /* Success block for __anext__ */
2811     VISIT(c, expr, s->v.AsyncFor.target);
2812     VISIT_SEQ(c, stmt, s->v.AsyncFor.body);
2813     ADDOP_JABS(c, JUMP_ABSOLUTE, start);
2814 
2815     compiler_pop_fblock(c, FOR_LOOP, start);
2816 
2817     /* Except block for __anext__ */
2818     compiler_use_next_block(c, except);
2819     ADDOP(c, END_ASYNC_FOR);
2820 
2821     /* `else` block */
2822     VISIT_SEQ(c, stmt, s->v.For.orelse);
2823 
2824     compiler_use_next_block(c, end);
2825 
2826     return 1;
2827 }
2828 
2829 static int
compiler_while(struct compiler * c,stmt_ty s)2830 compiler_while(struct compiler *c, stmt_ty s)
2831 {
2832     basicblock *loop, *orelse, *end, *anchor = NULL;
2833     int constant = expr_constant(s->v.While.test);
2834 
2835     if (constant == 0) {
2836         BEGIN_DO_NOT_EMIT_BYTECODE
2837         // Push a dummy block so the VISIT_SEQ knows that we are
2838         // inside a while loop so it can correctly evaluate syntax
2839         // errors.
2840         if (!compiler_push_fblock(c, WHILE_LOOP, NULL, NULL, NULL)) {
2841             return 0;
2842         }
2843         VISIT_SEQ(c, stmt, s->v.While.body);
2844         // Remove the dummy block now that is not needed.
2845         compiler_pop_fblock(c, WHILE_LOOP, NULL);
2846         END_DO_NOT_EMIT_BYTECODE
2847         if (s->v.While.orelse) {
2848             VISIT_SEQ(c, stmt, s->v.While.orelse);
2849         }
2850         return 1;
2851     }
2852     loop = compiler_new_block(c);
2853     end = compiler_new_block(c);
2854     if (constant == -1) {
2855         anchor = compiler_new_block(c);
2856         if (anchor == NULL)
2857             return 0;
2858     }
2859     if (loop == NULL || end == NULL)
2860         return 0;
2861     if (s->v.While.orelse) {
2862         orelse = compiler_new_block(c);
2863         if (orelse == NULL)
2864             return 0;
2865     }
2866     else
2867         orelse = NULL;
2868 
2869     compiler_use_next_block(c, loop);
2870     if (!compiler_push_fblock(c, WHILE_LOOP, loop, end, NULL))
2871         return 0;
2872     if (constant == -1) {
2873         if (!compiler_jump_if(c, s->v.While.test, anchor, 0))
2874             return 0;
2875     }
2876     VISIT_SEQ(c, stmt, s->v.While.body);
2877     ADDOP_JABS(c, JUMP_ABSOLUTE, loop);
2878 
2879     /* XXX should the two POP instructions be in a separate block
2880        if there is no else clause ?
2881     */
2882 
2883     if (constant == -1)
2884         compiler_use_next_block(c, anchor);
2885     compiler_pop_fblock(c, WHILE_LOOP, loop);
2886 
2887     if (orelse != NULL) /* what if orelse is just pass? */
2888         VISIT_SEQ(c, stmt, s->v.While.orelse);
2889     compiler_use_next_block(c, end);
2890 
2891     return 1;
2892 }
2893 
2894 static int
compiler_return(struct compiler * c,stmt_ty s)2895 compiler_return(struct compiler *c, stmt_ty s)
2896 {
2897     int preserve_tos = ((s->v.Return.value != NULL) &&
2898                         (s->v.Return.value->kind != Constant_kind));
2899     if (c->u->u_ste->ste_type != FunctionBlock)
2900         return compiler_error(c, "'return' outside function");
2901     if (s->v.Return.value != NULL &&
2902         c->u->u_ste->ste_coroutine && c->u->u_ste->ste_generator)
2903     {
2904             return compiler_error(
2905                 c, "'return' with value in async generator");
2906     }
2907     if (preserve_tos) {
2908         VISIT(c, expr, s->v.Return.value);
2909     }
2910     if (!compiler_unwind_fblock_stack(c, preserve_tos, NULL))
2911         return 0;
2912     if (s->v.Return.value == NULL) {
2913         ADDOP_LOAD_CONST(c, Py_None);
2914     }
2915     else if (!preserve_tos) {
2916         VISIT(c, expr, s->v.Return.value);
2917     }
2918     ADDOP(c, RETURN_VALUE);
2919 
2920     return 1;
2921 }
2922 
2923 static int
compiler_break(struct compiler * c)2924 compiler_break(struct compiler *c)
2925 {
2926     struct fblockinfo *loop = NULL;
2927     if (!compiler_unwind_fblock_stack(c, 0, &loop)) {
2928         return 0;
2929     }
2930     if (loop == NULL) {
2931         return compiler_error(c, "'break' outside loop");
2932     }
2933     if (!compiler_unwind_fblock(c, loop, 0)) {
2934         return 0;
2935     }
2936     ADDOP_JABS(c, JUMP_ABSOLUTE, loop->fb_exit);
2937     return 1;
2938 }
2939 
2940 static int
compiler_continue(struct compiler * c)2941 compiler_continue(struct compiler *c)
2942 {
2943     struct fblockinfo *loop = NULL;
2944     if (!compiler_unwind_fblock_stack(c, 0, &loop)) {
2945         return 0;
2946     }
2947     if (loop == NULL) {
2948         return compiler_error(c, "'continue' not properly in loop");
2949     }
2950     ADDOP_JABS(c, JUMP_ABSOLUTE, loop->fb_block);
2951     return 1;
2952 }
2953 
2954 
2955 /* Code generated for "try: <body> finally: <finalbody>" is as follows:
2956 
2957         SETUP_FINALLY           L
2958         <code for body>
2959         POP_BLOCK
2960         <code for finalbody>
2961         JUMP E
2962     L:
2963         <code for finalbody>
2964     E:
2965 
2966    The special instructions use the block stack.  Each block
2967    stack entry contains the instruction that created it (here
2968    SETUP_FINALLY), the level of the value stack at the time the
2969    block stack entry was created, and a label (here L).
2970 
2971    SETUP_FINALLY:
2972     Pushes the current value stack level and the label
2973     onto the block stack.
2974    POP_BLOCK:
2975     Pops en entry from the block stack.
2976 
2977    The block stack is unwound when an exception is raised:
2978    when a SETUP_FINALLY entry is found, the raised and the caught
2979    exceptions are pushed onto the value stack (and the exception
2980    condition is cleared), and the interpreter jumps to the label
2981    gotten from the block stack.
2982 */
2983 
2984 static int
compiler_try_finally(struct compiler * c,stmt_ty s)2985 compiler_try_finally(struct compiler *c, stmt_ty s)
2986 {
2987     basicblock *body, *end, *exit;
2988 
2989     body = compiler_new_block(c);
2990     end = compiler_new_block(c);
2991     exit = compiler_new_block(c);
2992     if (body == NULL || end == NULL || exit == NULL)
2993         return 0;
2994 
2995     /* `try` block */
2996     ADDOP_JREL(c, SETUP_FINALLY, end);
2997     compiler_use_next_block(c, body);
2998     if (!compiler_push_fblock(c, FINALLY_TRY, body, end, s->v.Try.finalbody))
2999         return 0;
3000     if (s->v.Try.handlers && asdl_seq_LEN(s->v.Try.handlers)) {
3001         if (!compiler_try_except(c, s))
3002             return 0;
3003     }
3004     else {
3005         VISIT_SEQ(c, stmt, s->v.Try.body);
3006     }
3007     ADDOP(c, POP_BLOCK);
3008     compiler_pop_fblock(c, FINALLY_TRY, body);
3009     VISIT_SEQ(c, stmt, s->v.Try.finalbody);
3010     ADDOP_JREL(c, JUMP_FORWARD, exit);
3011     /* `finally` block */
3012     compiler_use_next_block(c, end);
3013     if (!compiler_push_fblock(c, FINALLY_END, end, NULL, NULL))
3014         return 0;
3015     VISIT_SEQ(c, stmt, s->v.Try.finalbody);
3016     compiler_pop_fblock(c, FINALLY_END, end);
3017     ADDOP(c, RERAISE);
3018     compiler_use_next_block(c, exit);
3019     return 1;
3020 }
3021 
3022 /*
3023    Code generated for "try: S except E1 as V1: S1 except E2 as V2: S2 ...":
3024    (The contents of the value stack is shown in [], with the top
3025    at the right; 'tb' is trace-back info, 'val' the exception's
3026    associated value, and 'exc' the exception.)
3027 
3028    Value stack          Label   Instruction     Argument
3029    []                           SETUP_FINALLY   L1
3030    []                           <code for S>
3031    []                           POP_BLOCK
3032    []                           JUMP_FORWARD    L0
3033 
3034    [tb, val, exc]       L1:     DUP                             )
3035    [tb, val, exc, exc]          <evaluate E1>                   )
3036    [tb, val, exc, exc, E1]      JUMP_IF_NOT_EXC_MATCH L2        ) only if E1
3037    [tb, val, exc]               POP
3038    [tb, val]                    <assign to V1>  (or POP if no V1)
3039    [tb]                         POP
3040    []                           <code for S1>
3041                                 JUMP_FORWARD    L0
3042 
3043    [tb, val, exc]       L2:     DUP
3044    .............................etc.......................
3045 
3046    [tb, val, exc]       Ln+1:   RERAISE     # re-raise exception
3047 
3048    []                   L0:     <next statement>
3049 
3050    Of course, parts are not generated if Vi or Ei is not present.
3051 */
3052 static int
compiler_try_except(struct compiler * c,stmt_ty s)3053 compiler_try_except(struct compiler *c, stmt_ty s)
3054 {
3055     basicblock *body, *orelse, *except, *end;
3056     Py_ssize_t i, n;
3057 
3058     body = compiler_new_block(c);
3059     except = compiler_new_block(c);
3060     orelse = compiler_new_block(c);
3061     end = compiler_new_block(c);
3062     if (body == NULL || except == NULL || orelse == NULL || end == NULL)
3063         return 0;
3064     ADDOP_JREL(c, SETUP_FINALLY, except);
3065     compiler_use_next_block(c, body);
3066     if (!compiler_push_fblock(c, TRY_EXCEPT, body, NULL, NULL))
3067         return 0;
3068     VISIT_SEQ(c, stmt, s->v.Try.body);
3069     ADDOP(c, POP_BLOCK);
3070     compiler_pop_fblock(c, TRY_EXCEPT, body);
3071     ADDOP_JREL(c, JUMP_FORWARD, orelse);
3072     n = asdl_seq_LEN(s->v.Try.handlers);
3073     compiler_use_next_block(c, except);
3074     /* Runtime will push a block here, so we need to account for that */
3075     if (!compiler_push_fblock(c, EXCEPTION_HANDLER, NULL, NULL, NULL))
3076         return 0;
3077     for (i = 0; i < n; i++) {
3078         excepthandler_ty handler = (excepthandler_ty)asdl_seq_GET(
3079             s->v.Try.handlers, i);
3080         if (!handler->v.ExceptHandler.type && i < n-1)
3081             return compiler_error(c, "default 'except:' must be last");
3082         SET_LOC(c, handler);
3083         except = compiler_new_block(c);
3084         if (except == NULL)
3085             return 0;
3086         if (handler->v.ExceptHandler.type) {
3087             ADDOP(c, DUP_TOP);
3088             VISIT(c, expr, handler->v.ExceptHandler.type);
3089             ADDOP_JABS(c, JUMP_IF_NOT_EXC_MATCH, except);
3090         }
3091         ADDOP(c, POP_TOP);
3092         if (handler->v.ExceptHandler.name) {
3093             basicblock *cleanup_end, *cleanup_body;
3094 
3095             cleanup_end = compiler_new_block(c);
3096             cleanup_body = compiler_new_block(c);
3097             if (cleanup_end == NULL || cleanup_body == NULL) {
3098                 return 0;
3099             }
3100 
3101             compiler_nameop(c, handler->v.ExceptHandler.name, Store);
3102             ADDOP(c, POP_TOP);
3103 
3104             /*
3105               try:
3106                   # body
3107               except type as name:
3108                   try:
3109                       # body
3110                   finally:
3111                       name = None # in case body contains "del name"
3112                       del name
3113             */
3114 
3115             /* second try: */
3116             ADDOP_JREL(c, SETUP_FINALLY, cleanup_end);
3117             compiler_use_next_block(c, cleanup_body);
3118             if (!compiler_push_fblock(c, HANDLER_CLEANUP, cleanup_body, NULL, handler->v.ExceptHandler.name))
3119                 return 0;
3120 
3121             /* second # body */
3122             VISIT_SEQ(c, stmt, handler->v.ExceptHandler.body);
3123             compiler_pop_fblock(c, HANDLER_CLEANUP, cleanup_body);
3124             ADDOP(c, POP_BLOCK);
3125             ADDOP(c, POP_EXCEPT);
3126             /* name = None; del name */
3127             ADDOP_LOAD_CONST(c, Py_None);
3128             compiler_nameop(c, handler->v.ExceptHandler.name, Store);
3129             compiler_nameop(c, handler->v.ExceptHandler.name, Del);
3130             ADDOP_JREL(c, JUMP_FORWARD, end);
3131 
3132             /* except: */
3133             compiler_use_next_block(c, cleanup_end);
3134 
3135             /* name = None; del name */
3136             ADDOP_LOAD_CONST(c, Py_None);
3137             compiler_nameop(c, handler->v.ExceptHandler.name, Store);
3138             compiler_nameop(c, handler->v.ExceptHandler.name, Del);
3139 
3140             ADDOP(c, RERAISE);
3141         }
3142         else {
3143             basicblock *cleanup_body;
3144 
3145             cleanup_body = compiler_new_block(c);
3146             if (!cleanup_body)
3147                 return 0;
3148 
3149             ADDOP(c, POP_TOP);
3150             ADDOP(c, POP_TOP);
3151             compiler_use_next_block(c, cleanup_body);
3152             if (!compiler_push_fblock(c, HANDLER_CLEANUP, cleanup_body, NULL, NULL))
3153                 return 0;
3154             VISIT_SEQ(c, stmt, handler->v.ExceptHandler.body);
3155             compiler_pop_fblock(c, HANDLER_CLEANUP, cleanup_body);
3156             ADDOP(c, POP_EXCEPT);
3157             ADDOP_JREL(c, JUMP_FORWARD, end);
3158         }
3159         compiler_use_next_block(c, except);
3160     }
3161     compiler_pop_fblock(c, EXCEPTION_HANDLER, NULL);
3162     ADDOP(c, RERAISE);
3163     compiler_use_next_block(c, orelse);
3164     VISIT_SEQ(c, stmt, s->v.Try.orelse);
3165     compiler_use_next_block(c, end);
3166     return 1;
3167 }
3168 
3169 static int
compiler_try(struct compiler * c,stmt_ty s)3170 compiler_try(struct compiler *c, stmt_ty s) {
3171     if (s->v.Try.finalbody && asdl_seq_LEN(s->v.Try.finalbody))
3172         return compiler_try_finally(c, s);
3173     else
3174         return compiler_try_except(c, s);
3175 }
3176 
3177 
3178 static int
compiler_import_as(struct compiler * c,identifier name,identifier asname)3179 compiler_import_as(struct compiler *c, identifier name, identifier asname)
3180 {
3181     /* The IMPORT_NAME opcode was already generated.  This function
3182        merely needs to bind the result to a name.
3183 
3184        If there is a dot in name, we need to split it and emit a
3185        IMPORT_FROM for each name.
3186     */
3187     Py_ssize_t len = PyUnicode_GET_LENGTH(name);
3188     Py_ssize_t dot = PyUnicode_FindChar(name, '.', 0, len, 1);
3189     if (dot == -2)
3190         return 0;
3191     if (dot != -1) {
3192         /* Consume the base module name to get the first attribute */
3193         while (1) {
3194             Py_ssize_t pos = dot + 1;
3195             PyObject *attr;
3196             dot = PyUnicode_FindChar(name, '.', pos, len, 1);
3197             if (dot == -2)
3198                 return 0;
3199             attr = PyUnicode_Substring(name, pos, (dot != -1) ? dot : len);
3200             if (!attr)
3201                 return 0;
3202             ADDOP_N(c, IMPORT_FROM, attr, names);
3203             if (dot == -1) {
3204                 break;
3205             }
3206             ADDOP(c, ROT_TWO);
3207             ADDOP(c, POP_TOP);
3208         }
3209         if (!compiler_nameop(c, asname, Store)) {
3210             return 0;
3211         }
3212         ADDOP(c, POP_TOP);
3213         return 1;
3214     }
3215     return compiler_nameop(c, asname, Store);
3216 }
3217 
3218 static int
compiler_import(struct compiler * c,stmt_ty s)3219 compiler_import(struct compiler *c, stmt_ty s)
3220 {
3221     /* The Import node stores a module name like a.b.c as a single
3222        string.  This is convenient for all cases except
3223          import a.b.c as d
3224        where we need to parse that string to extract the individual
3225        module names.
3226        XXX Perhaps change the representation to make this case simpler?
3227      */
3228     Py_ssize_t i, n = asdl_seq_LEN(s->v.Import.names);
3229 
3230     for (i = 0; i < n; i++) {
3231         alias_ty alias = (alias_ty)asdl_seq_GET(s->v.Import.names, i);
3232         int r;
3233 
3234         ADDOP_LOAD_CONST(c, _PyLong_Zero);
3235         ADDOP_LOAD_CONST(c, Py_None);
3236         ADDOP_NAME(c, IMPORT_NAME, alias->name, names);
3237 
3238         if (alias->asname) {
3239             r = compiler_import_as(c, alias->name, alias->asname);
3240             if (!r)
3241                 return r;
3242         }
3243         else {
3244             identifier tmp = alias->name;
3245             Py_ssize_t dot = PyUnicode_FindChar(
3246                 alias->name, '.', 0, PyUnicode_GET_LENGTH(alias->name), 1);
3247             if (dot != -1) {
3248                 tmp = PyUnicode_Substring(alias->name, 0, dot);
3249                 if (tmp == NULL)
3250                     return 0;
3251             }
3252             r = compiler_nameop(c, tmp, Store);
3253             if (dot != -1) {
3254                 Py_DECREF(tmp);
3255             }
3256             if (!r)
3257                 return r;
3258         }
3259     }
3260     return 1;
3261 }
3262 
3263 static int
compiler_from_import(struct compiler * c,stmt_ty s)3264 compiler_from_import(struct compiler *c, stmt_ty s)
3265 {
3266     Py_ssize_t i, n = asdl_seq_LEN(s->v.ImportFrom.names);
3267     PyObject *names;
3268     static PyObject *empty_string;
3269 
3270     if (!empty_string) {
3271         empty_string = PyUnicode_FromString("");
3272         if (!empty_string)
3273             return 0;
3274     }
3275 
3276     ADDOP_LOAD_CONST_NEW(c, PyLong_FromLong(s->v.ImportFrom.level));
3277 
3278     names = PyTuple_New(n);
3279     if (!names)
3280         return 0;
3281 
3282     /* build up the names */
3283     for (i = 0; i < n; i++) {
3284         alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);
3285         Py_INCREF(alias->name);
3286         PyTuple_SET_ITEM(names, i, alias->name);
3287     }
3288 
3289     if (s->lineno > c->c_future->ff_lineno && s->v.ImportFrom.module &&
3290         _PyUnicode_EqualToASCIIString(s->v.ImportFrom.module, "__future__")) {
3291         Py_DECREF(names);
3292         return compiler_error(c, "from __future__ imports must occur "
3293                               "at the beginning of the file");
3294     }
3295     ADDOP_LOAD_CONST_NEW(c, names);
3296 
3297     if (s->v.ImportFrom.module) {
3298         ADDOP_NAME(c, IMPORT_NAME, s->v.ImportFrom.module, names);
3299     }
3300     else {
3301         ADDOP_NAME(c, IMPORT_NAME, empty_string, names);
3302     }
3303     for (i = 0; i < n; i++) {
3304         alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);
3305         identifier store_name;
3306 
3307         if (i == 0 && PyUnicode_READ_CHAR(alias->name, 0) == '*') {
3308             assert(n == 1);
3309             ADDOP(c, IMPORT_STAR);
3310             return 1;
3311         }
3312 
3313         ADDOP_NAME(c, IMPORT_FROM, alias->name, names);
3314         store_name = alias->name;
3315         if (alias->asname)
3316             store_name = alias->asname;
3317 
3318         if (!compiler_nameop(c, store_name, Store)) {
3319             return 0;
3320         }
3321     }
3322     /* remove imported module */
3323     ADDOP(c, POP_TOP);
3324     return 1;
3325 }
3326 
3327 static int
compiler_assert(struct compiler * c,stmt_ty s)3328 compiler_assert(struct compiler *c, stmt_ty s)
3329 {
3330     basicblock *end;
3331 
3332     if (c->c_optimize)
3333         return 1;
3334     if (s->v.Assert.test->kind == Tuple_kind &&
3335         asdl_seq_LEN(s->v.Assert.test->v.Tuple.elts) > 0)
3336     {
3337         if (!compiler_warn(c, "assertion is always true, "
3338                               "perhaps remove parentheses?"))
3339         {
3340             return 0;
3341         }
3342     }
3343     end = compiler_new_block(c);
3344     if (end == NULL)
3345         return 0;
3346     if (!compiler_jump_if(c, s->v.Assert.test, end, 1))
3347         return 0;
3348     ADDOP(c, LOAD_ASSERTION_ERROR);
3349     if (s->v.Assert.msg) {
3350         VISIT(c, expr, s->v.Assert.msg);
3351         ADDOP_I(c, CALL_FUNCTION, 1);
3352     }
3353     ADDOP_I(c, RAISE_VARARGS, 1);
3354     compiler_use_next_block(c, end);
3355     return 1;
3356 }
3357 
3358 static int
compiler_visit_stmt_expr(struct compiler * c,expr_ty value)3359 compiler_visit_stmt_expr(struct compiler *c, expr_ty value)
3360 {
3361     if (c->c_interactive && c->c_nestlevel <= 1) {
3362         VISIT(c, expr, value);
3363         ADDOP(c, PRINT_EXPR);
3364         return 1;
3365     }
3366 
3367     if (value->kind == Constant_kind) {
3368         /* ignore constant statement */
3369         return 1;
3370     }
3371 
3372     VISIT(c, expr, value);
3373     ADDOP(c, POP_TOP);
3374     return 1;
3375 }
3376 
3377 static int
compiler_visit_stmt(struct compiler * c,stmt_ty s)3378 compiler_visit_stmt(struct compiler *c, stmt_ty s)
3379 {
3380     Py_ssize_t i, n;
3381 
3382     /* Always assign a lineno to the next instruction for a stmt. */
3383     SET_LOC(c, s);
3384 
3385     switch (s->kind) {
3386     case FunctionDef_kind:
3387         return compiler_function(c, s, 0);
3388     case ClassDef_kind:
3389         return compiler_class(c, s);
3390     case Return_kind:
3391         return compiler_return(c, s);
3392     case Delete_kind:
3393         VISIT_SEQ(c, expr, s->v.Delete.targets)
3394         break;
3395     case Assign_kind:
3396         n = asdl_seq_LEN(s->v.Assign.targets);
3397         VISIT(c, expr, s->v.Assign.value);
3398         for (i = 0; i < n; i++) {
3399             if (i < n - 1)
3400                 ADDOP(c, DUP_TOP);
3401             VISIT(c, expr,
3402                   (expr_ty)asdl_seq_GET(s->v.Assign.targets, i));
3403         }
3404         break;
3405     case AugAssign_kind:
3406         return compiler_augassign(c, s);
3407     case AnnAssign_kind:
3408         return compiler_annassign(c, s);
3409     case For_kind:
3410         return compiler_for(c, s);
3411     case While_kind:
3412         return compiler_while(c, s);
3413     case If_kind:
3414         return compiler_if(c, s);
3415     case Raise_kind:
3416         n = 0;
3417         if (s->v.Raise.exc) {
3418             VISIT(c, expr, s->v.Raise.exc);
3419             n++;
3420             if (s->v.Raise.cause) {
3421                 VISIT(c, expr, s->v.Raise.cause);
3422                 n++;
3423             }
3424         }
3425         ADDOP_I(c, RAISE_VARARGS, (int)n);
3426         break;
3427     case Try_kind:
3428         return compiler_try(c, s);
3429     case Assert_kind:
3430         return compiler_assert(c, s);
3431     case Import_kind:
3432         return compiler_import(c, s);
3433     case ImportFrom_kind:
3434         return compiler_from_import(c, s);
3435     case Global_kind:
3436     case Nonlocal_kind:
3437         break;
3438     case Expr_kind:
3439         return compiler_visit_stmt_expr(c, s->v.Expr.value);
3440     case Pass_kind:
3441         break;
3442     case Break_kind:
3443         return compiler_break(c);
3444     case Continue_kind:
3445         return compiler_continue(c);
3446     case With_kind:
3447         return compiler_with(c, s, 0);
3448     case AsyncFunctionDef_kind:
3449         return compiler_function(c, s, 1);
3450     case AsyncWith_kind:
3451         return compiler_async_with(c, s, 0);
3452     case AsyncFor_kind:
3453         return compiler_async_for(c, s);
3454     }
3455 
3456     return 1;
3457 }
3458 
3459 static int
unaryop(unaryop_ty op)3460 unaryop(unaryop_ty op)
3461 {
3462     switch (op) {
3463     case Invert:
3464         return UNARY_INVERT;
3465     case Not:
3466         return UNARY_NOT;
3467     case UAdd:
3468         return UNARY_POSITIVE;
3469     case USub:
3470         return UNARY_NEGATIVE;
3471     default:
3472         PyErr_Format(PyExc_SystemError,
3473             "unary op %d should not be possible", op);
3474         return 0;
3475     }
3476 }
3477 
3478 static int
binop(operator_ty op)3479 binop(operator_ty op)
3480 {
3481     switch (op) {
3482     case Add:
3483         return BINARY_ADD;
3484     case Sub:
3485         return BINARY_SUBTRACT;
3486     case Mult:
3487         return BINARY_MULTIPLY;
3488     case MatMult:
3489         return BINARY_MATRIX_MULTIPLY;
3490     case Div:
3491         return BINARY_TRUE_DIVIDE;
3492     case Mod:
3493         return BINARY_MODULO;
3494     case Pow:
3495         return BINARY_POWER;
3496     case LShift:
3497         return BINARY_LSHIFT;
3498     case RShift:
3499         return BINARY_RSHIFT;
3500     case BitOr:
3501         return BINARY_OR;
3502     case BitXor:
3503         return BINARY_XOR;
3504     case BitAnd:
3505         return BINARY_AND;
3506     case FloorDiv:
3507         return BINARY_FLOOR_DIVIDE;
3508     default:
3509         PyErr_Format(PyExc_SystemError,
3510             "binary op %d should not be possible", op);
3511         return 0;
3512     }
3513 }
3514 
3515 static int
inplace_binop(operator_ty op)3516 inplace_binop(operator_ty op)
3517 {
3518     switch (op) {
3519     case Add:
3520         return INPLACE_ADD;
3521     case Sub:
3522         return INPLACE_SUBTRACT;
3523     case Mult:
3524         return INPLACE_MULTIPLY;
3525     case MatMult:
3526         return INPLACE_MATRIX_MULTIPLY;
3527     case Div:
3528         return INPLACE_TRUE_DIVIDE;
3529     case Mod:
3530         return INPLACE_MODULO;
3531     case Pow:
3532         return INPLACE_POWER;
3533     case LShift:
3534         return INPLACE_LSHIFT;
3535     case RShift:
3536         return INPLACE_RSHIFT;
3537     case BitOr:
3538         return INPLACE_OR;
3539     case BitXor:
3540         return INPLACE_XOR;
3541     case BitAnd:
3542         return INPLACE_AND;
3543     case FloorDiv:
3544         return INPLACE_FLOOR_DIVIDE;
3545     default:
3546         PyErr_Format(PyExc_SystemError,
3547             "inplace binary op %d should not be possible", op);
3548         return 0;
3549     }
3550 }
3551 
3552 static int
compiler_nameop(struct compiler * c,identifier name,expr_context_ty ctx)3553 compiler_nameop(struct compiler *c, identifier name, expr_context_ty ctx)
3554 {
3555     int op, scope;
3556     Py_ssize_t arg;
3557     enum { OP_FAST, OP_GLOBAL, OP_DEREF, OP_NAME } optype;
3558 
3559     PyObject *dict = c->u->u_names;
3560     PyObject *mangled;
3561 
3562     assert(!_PyUnicode_EqualToASCIIString(name, "None") &&
3563            !_PyUnicode_EqualToASCIIString(name, "True") &&
3564            !_PyUnicode_EqualToASCIIString(name, "False"));
3565 
3566     if (forbidden_name(c, name, ctx))
3567         return 0;
3568 
3569     mangled = _Py_Mangle(c->u->u_private, name);
3570     if (!mangled)
3571         return 0;
3572 
3573     op = 0;
3574     optype = OP_NAME;
3575     scope = PyST_GetScope(c->u->u_ste, mangled);
3576     switch (scope) {
3577     case FREE:
3578         dict = c->u->u_freevars;
3579         optype = OP_DEREF;
3580         break;
3581     case CELL:
3582         dict = c->u->u_cellvars;
3583         optype = OP_DEREF;
3584         break;
3585     case LOCAL:
3586         if (c->u->u_ste->ste_type == FunctionBlock)
3587             optype = OP_FAST;
3588         break;
3589     case GLOBAL_IMPLICIT:
3590         if (c->u->u_ste->ste_type == FunctionBlock)
3591             optype = OP_GLOBAL;
3592         break;
3593     case GLOBAL_EXPLICIT:
3594         optype = OP_GLOBAL;
3595         break;
3596     default:
3597         /* scope can be 0 */
3598         break;
3599     }
3600 
3601     /* XXX Leave assert here, but handle __doc__ and the like better */
3602     assert(scope || PyUnicode_READ_CHAR(name, 0) == '_');
3603 
3604     switch (optype) {
3605     case OP_DEREF:
3606         switch (ctx) {
3607         case Load:
3608             op = (c->u->u_ste->ste_type == ClassBlock) ? LOAD_CLASSDEREF : LOAD_DEREF;
3609             break;
3610         case Store: op = STORE_DEREF; break;
3611         case Del: op = DELETE_DEREF; break;
3612         }
3613         break;
3614     case OP_FAST:
3615         switch (ctx) {
3616         case Load: op = LOAD_FAST; break;
3617         case Store: op = STORE_FAST; break;
3618         case Del: op = DELETE_FAST; break;
3619         }
3620         ADDOP_N(c, op, mangled, varnames);
3621         return 1;
3622     case OP_GLOBAL:
3623         switch (ctx) {
3624         case Load: op = LOAD_GLOBAL; break;
3625         case Store: op = STORE_GLOBAL; break;
3626         case Del: op = DELETE_GLOBAL; break;
3627         }
3628         break;
3629     case OP_NAME:
3630         switch (ctx) {
3631         case Load: op = LOAD_NAME; break;
3632         case Store: op = STORE_NAME; break;
3633         case Del: op = DELETE_NAME; break;
3634         }
3635         break;
3636     }
3637 
3638     assert(op);
3639     arg = compiler_add_o(dict, mangled);
3640     Py_DECREF(mangled);
3641     if (arg < 0)
3642         return 0;
3643     return compiler_addop_i(c, op, arg);
3644 }
3645 
3646 static int
compiler_boolop(struct compiler * c,expr_ty e)3647 compiler_boolop(struct compiler *c, expr_ty e)
3648 {
3649     basicblock *end;
3650     int jumpi;
3651     Py_ssize_t i, n;
3652     asdl_seq *s;
3653 
3654     assert(e->kind == BoolOp_kind);
3655     if (e->v.BoolOp.op == And)
3656         jumpi = JUMP_IF_FALSE_OR_POP;
3657     else
3658         jumpi = JUMP_IF_TRUE_OR_POP;
3659     end = compiler_new_block(c);
3660     if (end == NULL)
3661         return 0;
3662     s = e->v.BoolOp.values;
3663     n = asdl_seq_LEN(s) - 1;
3664     assert(n >= 0);
3665     for (i = 0; i < n; ++i) {
3666         VISIT(c, expr, (expr_ty)asdl_seq_GET(s, i));
3667         ADDOP_JABS(c, jumpi, end);
3668     }
3669     VISIT(c, expr, (expr_ty)asdl_seq_GET(s, n));
3670     compiler_use_next_block(c, end);
3671     return 1;
3672 }
3673 
3674 static int
starunpack_helper(struct compiler * c,asdl_seq * elts,int pushed,int build,int add,int extend,int tuple)3675 starunpack_helper(struct compiler *c, asdl_seq *elts, int pushed,
3676                   int build, int add, int extend, int tuple)
3677 {
3678     Py_ssize_t n = asdl_seq_LEN(elts);
3679     Py_ssize_t i, seen_star = 0;
3680     if (n > 2 && are_all_items_const(elts, 0, n)) {
3681         PyObject *folded = PyTuple_New(n);
3682         if (folded == NULL) {
3683             return 0;
3684         }
3685         PyObject *val;
3686         for (i = 0; i < n; i++) {
3687             val = ((expr_ty)asdl_seq_GET(elts, i))->v.Constant.value;
3688             Py_INCREF(val);
3689             PyTuple_SET_ITEM(folded, i, val);
3690         }
3691         if (tuple) {
3692             ADDOP_LOAD_CONST_NEW(c, folded);
3693         } else {
3694             if (add == SET_ADD) {
3695                 Py_SETREF(folded, PyFrozenSet_New(folded));
3696                 if (folded == NULL) {
3697                     return 0;
3698                 }
3699             }
3700             ADDOP_I(c, build, pushed);
3701             ADDOP_LOAD_CONST_NEW(c, folded);
3702             ADDOP_I(c, extend, 1);
3703         }
3704         return 1;
3705     }
3706 
3707     for (i = 0; i < n; i++) {
3708         expr_ty elt = asdl_seq_GET(elts, i);
3709         if (elt->kind == Starred_kind) {
3710             seen_star = 1;
3711         }
3712     }
3713     if (seen_star) {
3714         seen_star = 0;
3715         for (i = 0; i < n; i++) {
3716             expr_ty elt = asdl_seq_GET(elts, i);
3717             if (elt->kind == Starred_kind) {
3718                 if (seen_star == 0) {
3719                     ADDOP_I(c, build, i+pushed);
3720                     seen_star = 1;
3721                 }
3722                 VISIT(c, expr, elt->v.Starred.value);
3723                 ADDOP_I(c, extend, 1);
3724             }
3725             else {
3726                 VISIT(c, expr, elt);
3727                 if (seen_star) {
3728                     ADDOP_I(c, add, 1);
3729                 }
3730             }
3731         }
3732         assert(seen_star);
3733         if (tuple) {
3734             ADDOP(c, LIST_TO_TUPLE);
3735         }
3736     }
3737     else {
3738         for (i = 0; i < n; i++) {
3739             expr_ty elt = asdl_seq_GET(elts, i);
3740             VISIT(c, expr, elt);
3741         }
3742         if (tuple) {
3743             ADDOP_I(c, BUILD_TUPLE, n+pushed);
3744         } else {
3745             ADDOP_I(c, build, n+pushed);
3746         }
3747     }
3748     return 1;
3749 }
3750 
3751 static int
assignment_helper(struct compiler * c,asdl_seq * elts)3752 assignment_helper(struct compiler *c, asdl_seq *elts)
3753 {
3754     Py_ssize_t n = asdl_seq_LEN(elts);
3755     Py_ssize_t i;
3756     int seen_star = 0;
3757     for (i = 0; i < n; i++) {
3758         expr_ty elt = asdl_seq_GET(elts, i);
3759         if (elt->kind == Starred_kind && !seen_star) {
3760             if ((i >= (1 << 8)) ||
3761                 (n-i-1 >= (INT_MAX >> 8)))
3762                 return compiler_error(c,
3763                     "too many expressions in "
3764                     "star-unpacking assignment");
3765             ADDOP_I(c, UNPACK_EX, (i + ((n-i-1) << 8)));
3766             seen_star = 1;
3767         }
3768         else if (elt->kind == Starred_kind) {
3769             return compiler_error(c,
3770                 "multiple starred expressions in assignment");
3771         }
3772     }
3773     if (!seen_star) {
3774         ADDOP_I(c, UNPACK_SEQUENCE, n);
3775     }
3776     for (i = 0; i < n; i++) {
3777         expr_ty elt = asdl_seq_GET(elts, i);
3778         VISIT(c, expr, elt->kind != Starred_kind ? elt : elt->v.Starred.value);
3779     }
3780     return 1;
3781 }
3782 
3783 static int
compiler_list(struct compiler * c,expr_ty e)3784 compiler_list(struct compiler *c, expr_ty e)
3785 {
3786     asdl_seq *elts = e->v.List.elts;
3787     if (e->v.List.ctx == Store) {
3788         return assignment_helper(c, elts);
3789     }
3790     else if (e->v.List.ctx == Load) {
3791         return starunpack_helper(c, elts, 0, BUILD_LIST,
3792                                  LIST_APPEND, LIST_EXTEND, 0);
3793     }
3794     else
3795         VISIT_SEQ(c, expr, elts);
3796     return 1;
3797 }
3798 
3799 static int
compiler_tuple(struct compiler * c,expr_ty e)3800 compiler_tuple(struct compiler *c, expr_ty e)
3801 {
3802     asdl_seq *elts = e->v.Tuple.elts;
3803     if (e->v.Tuple.ctx == Store) {
3804         return assignment_helper(c, elts);
3805     }
3806     else if (e->v.Tuple.ctx == Load) {
3807         return starunpack_helper(c, elts, 0, BUILD_LIST,
3808                                  LIST_APPEND, LIST_EXTEND, 1);
3809     }
3810     else
3811         VISIT_SEQ(c, expr, elts);
3812     return 1;
3813 }
3814 
3815 static int
compiler_set(struct compiler * c,expr_ty e)3816 compiler_set(struct compiler *c, expr_ty e)
3817 {
3818     return starunpack_helper(c, e->v.Set.elts, 0, BUILD_SET,
3819                              SET_ADD, SET_UPDATE, 0);
3820 }
3821 
3822 static int
are_all_items_const(asdl_seq * seq,Py_ssize_t begin,Py_ssize_t end)3823 are_all_items_const(asdl_seq *seq, Py_ssize_t begin, Py_ssize_t end)
3824 {
3825     Py_ssize_t i;
3826     for (i = begin; i < end; i++) {
3827         expr_ty key = (expr_ty)asdl_seq_GET(seq, i);
3828         if (key == NULL || key->kind != Constant_kind)
3829             return 0;
3830     }
3831     return 1;
3832 }
3833 
3834 static int
compiler_subdict(struct compiler * c,expr_ty e,Py_ssize_t begin,Py_ssize_t end)3835 compiler_subdict(struct compiler *c, expr_ty e, Py_ssize_t begin, Py_ssize_t end)
3836 {
3837     Py_ssize_t i, n = end - begin;
3838     PyObject *keys, *key;
3839     if (n > 1 && are_all_items_const(e->v.Dict.keys, begin, end)) {
3840         for (i = begin; i < end; i++) {
3841             VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Dict.values, i));
3842         }
3843         keys = PyTuple_New(n);
3844         if (keys == NULL) {
3845             return 0;
3846         }
3847         for (i = begin; i < end; i++) {
3848             key = ((expr_ty)asdl_seq_GET(e->v.Dict.keys, i))->v.Constant.value;
3849             Py_INCREF(key);
3850             PyTuple_SET_ITEM(keys, i - begin, key);
3851         }
3852         ADDOP_LOAD_CONST_NEW(c, keys);
3853         ADDOP_I(c, BUILD_CONST_KEY_MAP, n);
3854     }
3855     else {
3856         for (i = begin; i < end; i++) {
3857             VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Dict.keys, i));
3858             VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Dict.values, i));
3859         }
3860         ADDOP_I(c, BUILD_MAP, n);
3861     }
3862     return 1;
3863 }
3864 
3865 static int
compiler_dict(struct compiler * c,expr_ty e)3866 compiler_dict(struct compiler *c, expr_ty e)
3867 {
3868     Py_ssize_t i, n, elements;
3869     int have_dict;
3870     int is_unpacking = 0;
3871     n = asdl_seq_LEN(e->v.Dict.values);
3872     have_dict = 0;
3873     elements = 0;
3874     for (i = 0; i < n; i++) {
3875         is_unpacking = (expr_ty)asdl_seq_GET(e->v.Dict.keys, i) == NULL;
3876         if (is_unpacking) {
3877             if (elements) {
3878                 if (!compiler_subdict(c, e, i - elements, i)) {
3879                     return 0;
3880                 }
3881                 if (have_dict) {
3882                     ADDOP_I(c, DICT_UPDATE, 1);
3883                 }
3884                 have_dict = 1;
3885                 elements = 0;
3886             }
3887             if (have_dict == 0) {
3888                 ADDOP_I(c, BUILD_MAP, 0);
3889                 have_dict = 1;
3890             }
3891             VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Dict.values, i));
3892             ADDOP_I(c, DICT_UPDATE, 1);
3893         }
3894         else {
3895             if (elements == 0xFFFF) {
3896                 if (!compiler_subdict(c, e, i - elements, i + 1)) {
3897                     return 0;
3898                 }
3899                 if (have_dict) {
3900                     ADDOP_I(c, DICT_UPDATE, 1);
3901                 }
3902                 have_dict = 1;
3903                 elements = 0;
3904             }
3905             else {
3906                 elements++;
3907             }
3908         }
3909     }
3910     if (elements) {
3911         if (!compiler_subdict(c, e, n - elements, n)) {
3912             return 0;
3913         }
3914         if (have_dict) {
3915             ADDOP_I(c, DICT_UPDATE, 1);
3916         }
3917         have_dict = 1;
3918     }
3919     if (!have_dict) {
3920         ADDOP_I(c, BUILD_MAP, 0);
3921     }
3922     return 1;
3923 }
3924 
3925 static int
compiler_compare(struct compiler * c,expr_ty e)3926 compiler_compare(struct compiler *c, expr_ty e)
3927 {
3928     Py_ssize_t i, n;
3929 
3930     if (!check_compare(c, e)) {
3931         return 0;
3932     }
3933     VISIT(c, expr, e->v.Compare.left);
3934     assert(asdl_seq_LEN(e->v.Compare.ops) > 0);
3935     n = asdl_seq_LEN(e->v.Compare.ops) - 1;
3936     if (n == 0) {
3937         VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, 0));
3938         ADDOP_COMPARE(c, asdl_seq_GET(e->v.Compare.ops, 0));
3939     }
3940     else {
3941         basicblock *cleanup = compiler_new_block(c);
3942         if (cleanup == NULL)
3943             return 0;
3944         for (i = 0; i < n; i++) {
3945             VISIT(c, expr,
3946                 (expr_ty)asdl_seq_GET(e->v.Compare.comparators, i));
3947             ADDOP(c, DUP_TOP);
3948             ADDOP(c, ROT_THREE);
3949             ADDOP_COMPARE(c, asdl_seq_GET(e->v.Compare.ops, i));
3950             ADDOP_JABS(c, JUMP_IF_FALSE_OR_POP, cleanup);
3951             NEXT_BLOCK(c);
3952         }
3953         VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, n));
3954         ADDOP_COMPARE(c, asdl_seq_GET(e->v.Compare.ops, n));
3955         basicblock *end = compiler_new_block(c);
3956         if (end == NULL)
3957             return 0;
3958         ADDOP_JREL(c, JUMP_FORWARD, end);
3959         compiler_use_next_block(c, cleanup);
3960         ADDOP(c, ROT_TWO);
3961         ADDOP(c, POP_TOP);
3962         compiler_use_next_block(c, end);
3963     }
3964     return 1;
3965 }
3966 
3967 static PyTypeObject *
infer_type(expr_ty e)3968 infer_type(expr_ty e)
3969 {
3970     switch (e->kind) {
3971     case Tuple_kind:
3972         return &PyTuple_Type;
3973     case List_kind:
3974     case ListComp_kind:
3975         return &PyList_Type;
3976     case Dict_kind:
3977     case DictComp_kind:
3978         return &PyDict_Type;
3979     case Set_kind:
3980     case SetComp_kind:
3981         return &PySet_Type;
3982     case GeneratorExp_kind:
3983         return &PyGen_Type;
3984     case Lambda_kind:
3985         return &PyFunction_Type;
3986     case JoinedStr_kind:
3987     case FormattedValue_kind:
3988         return &PyUnicode_Type;
3989     case Constant_kind:
3990         return Py_TYPE(e->v.Constant.value);
3991     default:
3992         return NULL;
3993     }
3994 }
3995 
3996 static int
check_caller(struct compiler * c,expr_ty e)3997 check_caller(struct compiler *c, expr_ty e)
3998 {
3999     switch (e->kind) {
4000     case Constant_kind:
4001     case Tuple_kind:
4002     case List_kind:
4003     case ListComp_kind:
4004     case Dict_kind:
4005     case DictComp_kind:
4006     case Set_kind:
4007     case SetComp_kind:
4008     case GeneratorExp_kind:
4009     case JoinedStr_kind:
4010     case FormattedValue_kind:
4011         return compiler_warn(c, "'%.200s' object is not callable; "
4012                                 "perhaps you missed a comma?",
4013                                 infer_type(e)->tp_name);
4014     default:
4015         return 1;
4016     }
4017 }
4018 
4019 static int
check_subscripter(struct compiler * c,expr_ty e)4020 check_subscripter(struct compiler *c, expr_ty e)
4021 {
4022     PyObject *v;
4023 
4024     switch (e->kind) {
4025     case Constant_kind:
4026         v = e->v.Constant.value;
4027         if (!(v == Py_None || v == Py_Ellipsis ||
4028               PyLong_Check(v) || PyFloat_Check(v) || PyComplex_Check(v) ||
4029               PyAnySet_Check(v)))
4030         {
4031             return 1;
4032         }
4033         /* fall through */
4034     case Set_kind:
4035     case SetComp_kind:
4036     case GeneratorExp_kind:
4037     case Lambda_kind:
4038         return compiler_warn(c, "'%.200s' object is not subscriptable; "
4039                                 "perhaps you missed a comma?",
4040                                 infer_type(e)->tp_name);
4041     default:
4042         return 1;
4043     }
4044 }
4045 
4046 static int
check_index(struct compiler * c,expr_ty e,expr_ty s)4047 check_index(struct compiler *c, expr_ty e, expr_ty s)
4048 {
4049     PyObject *v;
4050 
4051     PyTypeObject *index_type = infer_type(s);
4052     if (index_type == NULL
4053         || PyType_FastSubclass(index_type, Py_TPFLAGS_LONG_SUBCLASS)
4054         || index_type == &PySlice_Type) {
4055         return 1;
4056     }
4057 
4058     switch (e->kind) {
4059     case Constant_kind:
4060         v = e->v.Constant.value;
4061         if (!(PyUnicode_Check(v) || PyBytes_Check(v) || PyTuple_Check(v))) {
4062             return 1;
4063         }
4064         /* fall through */
4065     case Tuple_kind:
4066     case List_kind:
4067     case ListComp_kind:
4068     case JoinedStr_kind:
4069     case FormattedValue_kind:
4070         return compiler_warn(c, "%.200s indices must be integers or slices, "
4071                                 "not %.200s; "
4072                                 "perhaps you missed a comma?",
4073                                 infer_type(e)->tp_name,
4074                                 index_type->tp_name);
4075     default:
4076         return 1;
4077     }
4078 }
4079 
4080 // Return 1 if the method call was optimized, -1 if not, and 0 on error.
4081 static int
maybe_optimize_method_call(struct compiler * c,expr_ty e)4082 maybe_optimize_method_call(struct compiler *c, expr_ty e)
4083 {
4084     Py_ssize_t argsl, i;
4085     expr_ty meth = e->v.Call.func;
4086     asdl_seq *args = e->v.Call.args;
4087 
4088     /* Check that the call node is an attribute access, and that
4089        the call doesn't have keyword parameters. */
4090     if (meth->kind != Attribute_kind || meth->v.Attribute.ctx != Load ||
4091             asdl_seq_LEN(e->v.Call.keywords))
4092         return -1;
4093 
4094     /* Check that there are no *varargs types of arguments. */
4095     argsl = asdl_seq_LEN(args);
4096     for (i = 0; i < argsl; i++) {
4097         expr_ty elt = asdl_seq_GET(args, i);
4098         if (elt->kind == Starred_kind) {
4099             return -1;
4100         }
4101     }
4102 
4103     /* Alright, we can optimize the code. */
4104     VISIT(c, expr, meth->v.Attribute.value);
4105     ADDOP_NAME(c, LOAD_METHOD, meth->v.Attribute.attr, names);
4106     VISIT_SEQ(c, expr, e->v.Call.args);
4107     ADDOP_I(c, CALL_METHOD, asdl_seq_LEN(e->v.Call.args));
4108     return 1;
4109 }
4110 
4111 static int
validate_keywords(struct compiler * c,asdl_seq * keywords)4112 validate_keywords(struct compiler *c, asdl_seq *keywords)
4113 {
4114     Py_ssize_t nkeywords = asdl_seq_LEN(keywords);
4115     for (Py_ssize_t i = 0; i < nkeywords; i++) {
4116         keyword_ty key = ((keyword_ty)asdl_seq_GET(keywords, i));
4117         if (key->arg == NULL) {
4118             continue;
4119         }
4120         if (forbidden_name(c, key->arg, Store)) {
4121             return -1;
4122         }
4123         for (Py_ssize_t j = i + 1; j < nkeywords; j++) {
4124             keyword_ty other = ((keyword_ty)asdl_seq_GET(keywords, j));
4125             if (other->arg && !PyUnicode_Compare(key->arg, other->arg)) {
4126                 PyObject *msg = PyUnicode_FromFormat("keyword argument repeated: %U", key->arg);
4127                 if (msg == NULL) {
4128                     return -1;
4129                 }
4130                 c->u->u_col_offset = other->col_offset;
4131                 compiler_error(c, PyUnicode_AsUTF8(msg));
4132                 Py_DECREF(msg);
4133                 return -1;
4134             }
4135         }
4136     }
4137     return 0;
4138 }
4139 
4140 static int
compiler_call(struct compiler * c,expr_ty e)4141 compiler_call(struct compiler *c, expr_ty e)
4142 {
4143     int ret = maybe_optimize_method_call(c, e);
4144     if (ret >= 0) {
4145         return ret;
4146     }
4147     if (!check_caller(c, e->v.Call.func)) {
4148         return 0;
4149     }
4150     VISIT(c, expr, e->v.Call.func);
4151     return compiler_call_helper(c, 0,
4152                                 e->v.Call.args,
4153                                 e->v.Call.keywords);
4154 }
4155 
4156 static int
compiler_joined_str(struct compiler * c,expr_ty e)4157 compiler_joined_str(struct compiler *c, expr_ty e)
4158 {
4159     VISIT_SEQ(c, expr, e->v.JoinedStr.values);
4160     if (asdl_seq_LEN(e->v.JoinedStr.values) != 1)
4161         ADDOP_I(c, BUILD_STRING, asdl_seq_LEN(e->v.JoinedStr.values));
4162     return 1;
4163 }
4164 
4165 /* Used to implement f-strings. Format a single value. */
4166 static int
compiler_formatted_value(struct compiler * c,expr_ty e)4167 compiler_formatted_value(struct compiler *c, expr_ty e)
4168 {
4169     /* Our oparg encodes 2 pieces of information: the conversion
4170        character, and whether or not a format_spec was provided.
4171 
4172        Convert the conversion char to 3 bits:
4173            : 000  0x0  FVC_NONE   The default if nothing specified.
4174        !s  : 001  0x1  FVC_STR
4175        !r  : 010  0x2  FVC_REPR
4176        !a  : 011  0x3  FVC_ASCII
4177 
4178        next bit is whether or not we have a format spec:
4179        yes : 100  0x4
4180        no  : 000  0x0
4181     */
4182 
4183     int conversion = e->v.FormattedValue.conversion;
4184     int oparg;
4185 
4186     /* The expression to be formatted. */
4187     VISIT(c, expr, e->v.FormattedValue.value);
4188 
4189     switch (conversion) {
4190     case 's': oparg = FVC_STR;   break;
4191     case 'r': oparg = FVC_REPR;  break;
4192     case 'a': oparg = FVC_ASCII; break;
4193     case -1:  oparg = FVC_NONE;  break;
4194     default:
4195         PyErr_Format(PyExc_SystemError,
4196                      "Unrecognized conversion character %d", conversion);
4197         return 0;
4198     }
4199     if (e->v.FormattedValue.format_spec) {
4200         /* Evaluate the format spec, and update our opcode arg. */
4201         VISIT(c, expr, e->v.FormattedValue.format_spec);
4202         oparg |= FVS_HAVE_SPEC;
4203     }
4204 
4205     /* And push our opcode and oparg */
4206     ADDOP_I(c, FORMAT_VALUE, oparg);
4207 
4208     return 1;
4209 }
4210 
4211 static int
compiler_subkwargs(struct compiler * c,asdl_seq * keywords,Py_ssize_t begin,Py_ssize_t end)4212 compiler_subkwargs(struct compiler *c, asdl_seq *keywords, Py_ssize_t begin, Py_ssize_t end)
4213 {
4214     Py_ssize_t i, n = end - begin;
4215     keyword_ty kw;
4216     PyObject *keys, *key;
4217     assert(n > 0);
4218     if (n > 1) {
4219         for (i = begin; i < end; i++) {
4220             kw = asdl_seq_GET(keywords, i);
4221             VISIT(c, expr, kw->value);
4222         }
4223         keys = PyTuple_New(n);
4224         if (keys == NULL) {
4225             return 0;
4226         }
4227         for (i = begin; i < end; i++) {
4228             key = ((keyword_ty) asdl_seq_GET(keywords, i))->arg;
4229             Py_INCREF(key);
4230             PyTuple_SET_ITEM(keys, i - begin, key);
4231         }
4232         ADDOP_LOAD_CONST_NEW(c, keys);
4233         ADDOP_I(c, BUILD_CONST_KEY_MAP, n);
4234     }
4235     else {
4236         /* a for loop only executes once */
4237         for (i = begin; i < end; i++) {
4238             kw = asdl_seq_GET(keywords, i);
4239             ADDOP_LOAD_CONST(c, kw->arg);
4240             VISIT(c, expr, kw->value);
4241         }
4242         ADDOP_I(c, BUILD_MAP, n);
4243     }
4244     return 1;
4245 }
4246 
4247 /* shared code between compiler_call and compiler_class */
4248 static int
compiler_call_helper(struct compiler * c,int n,asdl_seq * args,asdl_seq * keywords)4249 compiler_call_helper(struct compiler *c,
4250                      int n, /* Args already pushed */
4251                      asdl_seq *args,
4252                      asdl_seq *keywords)
4253 {
4254     Py_ssize_t i, nseen, nelts, nkwelts;
4255 
4256     if (validate_keywords(c, keywords) == -1) {
4257         return 0;
4258     }
4259 
4260     nelts = asdl_seq_LEN(args);
4261     nkwelts = asdl_seq_LEN(keywords);
4262 
4263     for (i = 0; i < nelts; i++) {
4264         expr_ty elt = asdl_seq_GET(args, i);
4265         if (elt->kind == Starred_kind) {
4266             goto ex_call;
4267         }
4268     }
4269     for (i = 0; i < nkwelts; i++) {
4270         keyword_ty kw = asdl_seq_GET(keywords, i);
4271         if (kw->arg == NULL) {
4272             goto ex_call;
4273         }
4274     }
4275 
4276     /* No * or ** args, so can use faster calling sequence */
4277     for (i = 0; i < nelts; i++) {
4278         expr_ty elt = asdl_seq_GET(args, i);
4279         assert(elt->kind != Starred_kind);
4280         VISIT(c, expr, elt);
4281     }
4282     if (nkwelts) {
4283         PyObject *names;
4284         VISIT_SEQ(c, keyword, keywords);
4285         names = PyTuple_New(nkwelts);
4286         if (names == NULL) {
4287             return 0;
4288         }
4289         for (i = 0; i < nkwelts; i++) {
4290             keyword_ty kw = asdl_seq_GET(keywords, i);
4291             Py_INCREF(kw->arg);
4292             PyTuple_SET_ITEM(names, i, kw->arg);
4293         }
4294         ADDOP_LOAD_CONST_NEW(c, names);
4295         ADDOP_I(c, CALL_FUNCTION_KW, n + nelts + nkwelts);
4296         return 1;
4297     }
4298     else {
4299         ADDOP_I(c, CALL_FUNCTION, n + nelts);
4300         return 1;
4301     }
4302 
4303 ex_call:
4304 
4305     /* Do positional arguments. */
4306     if (n ==0 && nelts == 1 && ((expr_ty)asdl_seq_GET(args, 0))->kind == Starred_kind) {
4307         VISIT(c, expr, ((expr_ty)asdl_seq_GET(args, 0))->v.Starred.value);
4308     }
4309     else if (starunpack_helper(c, args, n, BUILD_LIST,
4310                                  LIST_APPEND, LIST_EXTEND, 1) == 0) {
4311         return 0;
4312     }
4313     /* Then keyword arguments */
4314     if (nkwelts) {
4315         /* Has a new dict been pushed */
4316         int have_dict = 0;
4317 
4318         nseen = 0;  /* the number of keyword arguments on the stack following */
4319         for (i = 0; i < nkwelts; i++) {
4320             keyword_ty kw = asdl_seq_GET(keywords, i);
4321             if (kw->arg == NULL) {
4322                 /* A keyword argument unpacking. */
4323                 if (nseen) {
4324                     if (!compiler_subkwargs(c, keywords, i - nseen, i)) {
4325                         return 0;
4326                     }
4327                     if (have_dict) {
4328                         ADDOP_I(c, DICT_MERGE, 1);
4329                     }
4330                     have_dict = 1;
4331                     nseen = 0;
4332                 }
4333                 if (!have_dict) {
4334                     ADDOP_I(c, BUILD_MAP, 0);
4335                     have_dict = 1;
4336                 }
4337                 VISIT(c, expr, kw->value);
4338                 ADDOP_I(c, DICT_MERGE, 1);
4339             }
4340             else {
4341                 nseen++;
4342             }
4343         }
4344         if (nseen) {
4345             /* Pack up any trailing keyword arguments. */
4346             if (!compiler_subkwargs(c, keywords, nkwelts - nseen, nkwelts)) {
4347                 return 0;
4348             }
4349             if (have_dict) {
4350                 ADDOP_I(c, DICT_MERGE, 1);
4351             }
4352             have_dict = 1;
4353         }
4354         assert(have_dict);
4355     }
4356     ADDOP_I(c, CALL_FUNCTION_EX, nkwelts > 0);
4357     return 1;
4358 }
4359 
4360 
4361 /* List and set comprehensions and generator expressions work by creating a
4362   nested function to perform the actual iteration. This means that the
4363   iteration variables don't leak into the current scope.
4364   The defined function is called immediately following its definition, with the
4365   result of that call being the result of the expression.
4366   The LC/SC version returns the populated container, while the GE version is
4367   flagged in symtable.c as a generator, so it returns the generator object
4368   when the function is called.
4369 
4370   Possible cleanups:
4371     - iterate over the generator sequence instead of using recursion
4372 */
4373 
4374 
4375 static int
compiler_comprehension_generator(struct compiler * c,asdl_seq * generators,int gen_index,int depth,expr_ty elt,expr_ty val,int type)4376 compiler_comprehension_generator(struct compiler *c,
4377                                  asdl_seq *generators, int gen_index,
4378                                  int depth,
4379                                  expr_ty elt, expr_ty val, int type)
4380 {
4381     comprehension_ty gen;
4382     gen = (comprehension_ty)asdl_seq_GET(generators, gen_index);
4383     if (gen->is_async) {
4384         return compiler_async_comprehension_generator(
4385             c, generators, gen_index, depth, elt, val, type);
4386     } else {
4387         return compiler_sync_comprehension_generator(
4388             c, generators, gen_index, depth, elt, val, type);
4389     }
4390 }
4391 
4392 static int
compiler_sync_comprehension_generator(struct compiler * c,asdl_seq * generators,int gen_index,int depth,expr_ty elt,expr_ty val,int type)4393 compiler_sync_comprehension_generator(struct compiler *c,
4394                                       asdl_seq *generators, int gen_index,
4395                                       int depth,
4396                                       expr_ty elt, expr_ty val, int type)
4397 {
4398     /* generate code for the iterator, then each of the ifs,
4399        and then write to the element */
4400 
4401     comprehension_ty gen;
4402     basicblock *start, *anchor, *skip, *if_cleanup;
4403     Py_ssize_t i, n;
4404 
4405     start = compiler_new_block(c);
4406     skip = compiler_new_block(c);
4407     if_cleanup = compiler_new_block(c);
4408     anchor = compiler_new_block(c);
4409 
4410     if (start == NULL || skip == NULL || if_cleanup == NULL ||
4411         anchor == NULL)
4412         return 0;
4413 
4414     gen = (comprehension_ty)asdl_seq_GET(generators, gen_index);
4415 
4416     if (gen_index == 0) {
4417         /* Receive outermost iter as an implicit argument */
4418         c->u->u_argcount = 1;
4419         ADDOP_I(c, LOAD_FAST, 0);
4420     }
4421     else {
4422         /* Sub-iter - calculate on the fly */
4423         /* Fast path for the temporary variable assignment idiom:
4424              for y in [f(x)]
4425          */
4426         asdl_seq *elts;
4427         switch (gen->iter->kind) {
4428             case List_kind:
4429                 elts = gen->iter->v.List.elts;
4430                 break;
4431             case Tuple_kind:
4432                 elts = gen->iter->v.Tuple.elts;
4433                 break;
4434             default:
4435                 elts = NULL;
4436         }
4437         if (asdl_seq_LEN(elts) == 1) {
4438             expr_ty elt = asdl_seq_GET(elts, 0);
4439             if (elt->kind != Starred_kind) {
4440                 VISIT(c, expr, elt);
4441                 start = NULL;
4442             }
4443         }
4444         if (start) {
4445             VISIT(c, expr, gen->iter);
4446             ADDOP(c, GET_ITER);
4447         }
4448     }
4449     if (start) {
4450         depth++;
4451         compiler_use_next_block(c, start);
4452         ADDOP_JREL(c, FOR_ITER, anchor);
4453         NEXT_BLOCK(c);
4454     }
4455     VISIT(c, expr, gen->target);
4456 
4457     /* XXX this needs to be cleaned up...a lot! */
4458     n = asdl_seq_LEN(gen->ifs);
4459     for (i = 0; i < n; i++) {
4460         expr_ty e = (expr_ty)asdl_seq_GET(gen->ifs, i);
4461         if (!compiler_jump_if(c, e, if_cleanup, 0))
4462             return 0;
4463         NEXT_BLOCK(c);
4464     }
4465 
4466     if (++gen_index < asdl_seq_LEN(generators))
4467         if (!compiler_comprehension_generator(c,
4468                                               generators, gen_index, depth,
4469                                               elt, val, type))
4470         return 0;
4471 
4472     /* only append after the last for generator */
4473     if (gen_index >= asdl_seq_LEN(generators)) {
4474         /* comprehension specific code */
4475         switch (type) {
4476         case COMP_GENEXP:
4477             VISIT(c, expr, elt);
4478             ADDOP(c, YIELD_VALUE);
4479             ADDOP(c, POP_TOP);
4480             break;
4481         case COMP_LISTCOMP:
4482             VISIT(c, expr, elt);
4483             ADDOP_I(c, LIST_APPEND, depth + 1);
4484             break;
4485         case COMP_SETCOMP:
4486             VISIT(c, expr, elt);
4487             ADDOP_I(c, SET_ADD, depth + 1);
4488             break;
4489         case COMP_DICTCOMP:
4490             /* With '{k: v}', k is evaluated before v, so we do
4491                the same. */
4492             VISIT(c, expr, elt);
4493             VISIT(c, expr, val);
4494             ADDOP_I(c, MAP_ADD, depth + 1);
4495             break;
4496         default:
4497             return 0;
4498         }
4499 
4500         compiler_use_next_block(c, skip);
4501     }
4502     compiler_use_next_block(c, if_cleanup);
4503     if (start) {
4504         ADDOP_JABS(c, JUMP_ABSOLUTE, start);
4505         compiler_use_next_block(c, anchor);
4506     }
4507 
4508     return 1;
4509 }
4510 
4511 static int
compiler_async_comprehension_generator(struct compiler * c,asdl_seq * generators,int gen_index,int depth,expr_ty elt,expr_ty val,int type)4512 compiler_async_comprehension_generator(struct compiler *c,
4513                                       asdl_seq *generators, int gen_index,
4514                                       int depth,
4515                                       expr_ty elt, expr_ty val, int type)
4516 {
4517     comprehension_ty gen;
4518     basicblock *start, *if_cleanup, *except;
4519     Py_ssize_t i, n;
4520     start = compiler_new_block(c);
4521     except = compiler_new_block(c);
4522     if_cleanup = compiler_new_block(c);
4523 
4524     if (start == NULL || if_cleanup == NULL || except == NULL) {
4525         return 0;
4526     }
4527 
4528     gen = (comprehension_ty)asdl_seq_GET(generators, gen_index);
4529 
4530     if (gen_index == 0) {
4531         /* Receive outermost iter as an implicit argument */
4532         c->u->u_argcount = 1;
4533         ADDOP_I(c, LOAD_FAST, 0);
4534     }
4535     else {
4536         /* Sub-iter - calculate on the fly */
4537         VISIT(c, expr, gen->iter);
4538         ADDOP(c, GET_AITER);
4539     }
4540 
4541     compiler_use_next_block(c, start);
4542 
4543     ADDOP_JREL(c, SETUP_FINALLY, except);
4544     ADDOP(c, GET_ANEXT);
4545     ADDOP_LOAD_CONST(c, Py_None);
4546     ADDOP(c, YIELD_FROM);
4547     ADDOP(c, POP_BLOCK);
4548     VISIT(c, expr, gen->target);
4549 
4550     n = asdl_seq_LEN(gen->ifs);
4551     for (i = 0; i < n; i++) {
4552         expr_ty e = (expr_ty)asdl_seq_GET(gen->ifs, i);
4553         if (!compiler_jump_if(c, e, if_cleanup, 0))
4554             return 0;
4555         NEXT_BLOCK(c);
4556     }
4557 
4558     depth++;
4559     if (++gen_index < asdl_seq_LEN(generators))
4560         if (!compiler_comprehension_generator(c,
4561                                               generators, gen_index, depth,
4562                                               elt, val, type))
4563         return 0;
4564 
4565     /* only append after the last for generator */
4566     if (gen_index >= asdl_seq_LEN(generators)) {
4567         /* comprehension specific code */
4568         switch (type) {
4569         case COMP_GENEXP:
4570             VISIT(c, expr, elt);
4571             ADDOP(c, YIELD_VALUE);
4572             ADDOP(c, POP_TOP);
4573             break;
4574         case COMP_LISTCOMP:
4575             VISIT(c, expr, elt);
4576             ADDOP_I(c, LIST_APPEND, depth + 1);
4577             break;
4578         case COMP_SETCOMP:
4579             VISIT(c, expr, elt);
4580             ADDOP_I(c, SET_ADD, depth + 1);
4581             break;
4582         case COMP_DICTCOMP:
4583             /* With '{k: v}', k is evaluated before v, so we do
4584                the same. */
4585             VISIT(c, expr, elt);
4586             VISIT(c, expr, val);
4587             ADDOP_I(c, MAP_ADD, depth + 1);
4588             break;
4589         default:
4590             return 0;
4591         }
4592     }
4593     compiler_use_next_block(c, if_cleanup);
4594     ADDOP_JABS(c, JUMP_ABSOLUTE, start);
4595 
4596     compiler_use_next_block(c, except);
4597     ADDOP(c, END_ASYNC_FOR);
4598 
4599     return 1;
4600 }
4601 
4602 static int
compiler_comprehension(struct compiler * c,expr_ty e,int type,identifier name,asdl_seq * generators,expr_ty elt,expr_ty val)4603 compiler_comprehension(struct compiler *c, expr_ty e, int type,
4604                        identifier name, asdl_seq *generators, expr_ty elt,
4605                        expr_ty val)
4606 {
4607     PyCodeObject *co = NULL;
4608     comprehension_ty outermost;
4609     PyObject *qualname = NULL;
4610     int is_async_generator = 0;
4611     int top_level_await = IS_TOP_LEVEL_AWAIT(c);
4612 
4613 
4614     int is_async_function = c->u->u_ste->ste_coroutine;
4615 
4616     outermost = (comprehension_ty) asdl_seq_GET(generators, 0);
4617     if (!compiler_enter_scope(c, name, COMPILER_SCOPE_COMPREHENSION,
4618                               (void *)e, e->lineno))
4619     {
4620         goto error;
4621     }
4622 
4623     is_async_generator = c->u->u_ste->ste_coroutine;
4624 
4625     if (is_async_generator && !is_async_function && type != COMP_GENEXP  && !top_level_await) {
4626         compiler_error(c, "asynchronous comprehension outside of "
4627                           "an asynchronous function");
4628         goto error_in_scope;
4629     }
4630 
4631     if (type != COMP_GENEXP) {
4632         int op;
4633         switch (type) {
4634         case COMP_LISTCOMP:
4635             op = BUILD_LIST;
4636             break;
4637         case COMP_SETCOMP:
4638             op = BUILD_SET;
4639             break;
4640         case COMP_DICTCOMP:
4641             op = BUILD_MAP;
4642             break;
4643         default:
4644             PyErr_Format(PyExc_SystemError,
4645                          "unknown comprehension type %d", type);
4646             goto error_in_scope;
4647         }
4648 
4649         ADDOP_I(c, op, 0);
4650     }
4651 
4652     if (!compiler_comprehension_generator(c, generators, 0, 0, elt,
4653                                           val, type))
4654         goto error_in_scope;
4655 
4656     if (type != COMP_GENEXP) {
4657         ADDOP(c, RETURN_VALUE);
4658     }
4659 
4660     co = assemble(c, 1);
4661     qualname = c->u->u_qualname;
4662     Py_INCREF(qualname);
4663     compiler_exit_scope(c);
4664     if (top_level_await && is_async_generator){
4665         c->u->u_ste->ste_coroutine = 1;
4666     }
4667     if (co == NULL)
4668         goto error;
4669 
4670     if (!compiler_make_closure(c, co, 0, qualname))
4671         goto error;
4672     Py_DECREF(qualname);
4673     Py_DECREF(co);
4674 
4675     VISIT(c, expr, outermost->iter);
4676 
4677     if (outermost->is_async) {
4678         ADDOP(c, GET_AITER);
4679     } else {
4680         ADDOP(c, GET_ITER);
4681     }
4682 
4683     ADDOP_I(c, CALL_FUNCTION, 1);
4684 
4685     if (is_async_generator && type != COMP_GENEXP) {
4686         ADDOP(c, GET_AWAITABLE);
4687         ADDOP_LOAD_CONST(c, Py_None);
4688         ADDOP(c, YIELD_FROM);
4689     }
4690 
4691     return 1;
4692 error_in_scope:
4693     compiler_exit_scope(c);
4694 error:
4695     Py_XDECREF(qualname);
4696     Py_XDECREF(co);
4697     return 0;
4698 }
4699 
4700 static int
compiler_genexp(struct compiler * c,expr_ty e)4701 compiler_genexp(struct compiler *c, expr_ty e)
4702 {
4703     static identifier name;
4704     if (!name) {
4705         name = PyUnicode_InternFromString("<genexpr>");
4706         if (!name)
4707             return 0;
4708     }
4709     assert(e->kind == GeneratorExp_kind);
4710     return compiler_comprehension(c, e, COMP_GENEXP, name,
4711                                   e->v.GeneratorExp.generators,
4712                                   e->v.GeneratorExp.elt, NULL);
4713 }
4714 
4715 static int
compiler_listcomp(struct compiler * c,expr_ty e)4716 compiler_listcomp(struct compiler *c, expr_ty e)
4717 {
4718     static identifier name;
4719     if (!name) {
4720         name = PyUnicode_InternFromString("<listcomp>");
4721         if (!name)
4722             return 0;
4723     }
4724     assert(e->kind == ListComp_kind);
4725     return compiler_comprehension(c, e, COMP_LISTCOMP, name,
4726                                   e->v.ListComp.generators,
4727                                   e->v.ListComp.elt, NULL);
4728 }
4729 
4730 static int
compiler_setcomp(struct compiler * c,expr_ty e)4731 compiler_setcomp(struct compiler *c, expr_ty e)
4732 {
4733     static identifier name;
4734     if (!name) {
4735         name = PyUnicode_InternFromString("<setcomp>");
4736         if (!name)
4737             return 0;
4738     }
4739     assert(e->kind == SetComp_kind);
4740     return compiler_comprehension(c, e, COMP_SETCOMP, name,
4741                                   e->v.SetComp.generators,
4742                                   e->v.SetComp.elt, NULL);
4743 }
4744 
4745 
4746 static int
compiler_dictcomp(struct compiler * c,expr_ty e)4747 compiler_dictcomp(struct compiler *c, expr_ty e)
4748 {
4749     static identifier name;
4750     if (!name) {
4751         name = PyUnicode_InternFromString("<dictcomp>");
4752         if (!name)
4753             return 0;
4754     }
4755     assert(e->kind == DictComp_kind);
4756     return compiler_comprehension(c, e, COMP_DICTCOMP, name,
4757                                   e->v.DictComp.generators,
4758                                   e->v.DictComp.key, e->v.DictComp.value);
4759 }
4760 
4761 
4762 static int
compiler_visit_keyword(struct compiler * c,keyword_ty k)4763 compiler_visit_keyword(struct compiler *c, keyword_ty k)
4764 {
4765     VISIT(c, expr, k->value);
4766     return 1;
4767 }
4768 
4769 /* Test whether expression is constant.  For constants, report
4770    whether they are true or false.
4771 
4772    Return values: 1 for true, 0 for false, -1 for non-constant.
4773  */
4774 
4775 static int
expr_constant(expr_ty e)4776 expr_constant(expr_ty e)
4777 {
4778     if (e->kind == Constant_kind) {
4779         return PyObject_IsTrue(e->v.Constant.value);
4780     }
4781     return -1;
4782 }
4783 
4784 static int
compiler_with_except_finish(struct compiler * c)4785 compiler_with_except_finish(struct compiler *c) {
4786     basicblock *exit;
4787     exit = compiler_new_block(c);
4788     if (exit == NULL)
4789         return 0;
4790     ADDOP_JABS(c, POP_JUMP_IF_TRUE, exit);
4791     ADDOP(c, RERAISE);
4792     compiler_use_next_block(c, exit);
4793     ADDOP(c, POP_TOP);
4794     ADDOP(c, POP_TOP);
4795     ADDOP(c, POP_TOP);
4796     ADDOP(c, POP_EXCEPT);
4797     ADDOP(c, POP_TOP);
4798     return 1;
4799 }
4800 
4801 /*
4802    Implements the async with statement.
4803 
4804    The semantics outlined in that PEP are as follows:
4805 
4806    async with EXPR as VAR:
4807        BLOCK
4808 
4809    It is implemented roughly as:
4810 
4811    context = EXPR
4812    exit = context.__aexit__  # not calling it
4813    value = await context.__aenter__()
4814    try:
4815        VAR = value  # if VAR present in the syntax
4816        BLOCK
4817    finally:
4818        if an exception was raised:
4819            exc = copy of (exception, instance, traceback)
4820        else:
4821            exc = (None, None, None)
4822        if not (await exit(*exc)):
4823            raise
4824  */
4825 static int
compiler_async_with(struct compiler * c,stmt_ty s,int pos)4826 compiler_async_with(struct compiler *c, stmt_ty s, int pos)
4827 {
4828     basicblock *block, *final, *exit;
4829     withitem_ty item = asdl_seq_GET(s->v.AsyncWith.items, pos);
4830 
4831     assert(s->kind == AsyncWith_kind);
4832     if (IS_TOP_LEVEL_AWAIT(c)){
4833         c->u->u_ste->ste_coroutine = 1;
4834     } else if (c->u->u_scope_type != COMPILER_SCOPE_ASYNC_FUNCTION){
4835         return compiler_error(c, "'async with' outside async function");
4836     }
4837 
4838     block = compiler_new_block(c);
4839     final = compiler_new_block(c);
4840     exit = compiler_new_block(c);
4841     if (!block || !final || !exit)
4842         return 0;
4843 
4844     /* Evaluate EXPR */
4845     VISIT(c, expr, item->context_expr);
4846 
4847     ADDOP(c, BEFORE_ASYNC_WITH);
4848     ADDOP(c, GET_AWAITABLE);
4849     ADDOP_LOAD_CONST(c, Py_None);
4850     ADDOP(c, YIELD_FROM);
4851 
4852     ADDOP_JREL(c, SETUP_ASYNC_WITH, final);
4853 
4854     /* SETUP_ASYNC_WITH pushes a finally block. */
4855     compiler_use_next_block(c, block);
4856     if (!compiler_push_fblock(c, ASYNC_WITH, block, final, NULL)) {
4857         return 0;
4858     }
4859 
4860     if (item->optional_vars) {
4861         VISIT(c, expr, item->optional_vars);
4862     }
4863     else {
4864     /* Discard result from context.__aenter__() */
4865         ADDOP(c, POP_TOP);
4866     }
4867 
4868     pos++;
4869     if (pos == asdl_seq_LEN(s->v.AsyncWith.items))
4870         /* BLOCK code */
4871         VISIT_SEQ(c, stmt, s->v.AsyncWith.body)
4872     else if (!compiler_async_with(c, s, pos))
4873             return 0;
4874 
4875     compiler_pop_fblock(c, ASYNC_WITH, block);
4876     ADDOP(c, POP_BLOCK);
4877     /* End of body; start the cleanup */
4878 
4879     /* For successful outcome:
4880      * call __exit__(None, None, None)
4881      */
4882     if(!compiler_call_exit_with_nones(c))
4883         return 0;
4884     ADDOP(c, GET_AWAITABLE);
4885     ADDOP_O(c, LOAD_CONST, Py_None, consts);
4886     ADDOP(c, YIELD_FROM);
4887 
4888     ADDOP(c, POP_TOP);
4889 
4890     ADDOP_JABS(c, JUMP_ABSOLUTE, exit);
4891 
4892     /* For exceptional outcome: */
4893     compiler_use_next_block(c, final);
4894 
4895     ADDOP(c, WITH_EXCEPT_START);
4896     ADDOP(c, GET_AWAITABLE);
4897     ADDOP_LOAD_CONST(c, Py_None);
4898     ADDOP(c, YIELD_FROM);
4899     compiler_with_except_finish(c);
4900 
4901 compiler_use_next_block(c, exit);
4902     return 1;
4903 }
4904 
4905 
4906 /*
4907    Implements the with statement from PEP 343.
4908    with EXPR as VAR:
4909        BLOCK
4910    is implemented as:
4911         <code for EXPR>
4912         SETUP_WITH  E
4913         <code to store to VAR> or POP_TOP
4914         <code for BLOCK>
4915         LOAD_CONST (None, None, None)
4916         CALL_FUNCTION_EX 0
4917         JUMP_FORWARD  EXIT
4918     E:  WITH_EXCEPT_START (calls EXPR.__exit__)
4919         POP_JUMP_IF_TRUE T:
4920         RERAISE
4921     T:  POP_TOP * 3 (remove exception from stack)
4922         POP_EXCEPT
4923         POP_TOP
4924     EXIT:
4925  */
4926 
4927 static int
compiler_with(struct compiler * c,stmt_ty s,int pos)4928 compiler_with(struct compiler *c, stmt_ty s, int pos)
4929 {
4930     basicblock *block, *final, *exit;
4931     withitem_ty item = asdl_seq_GET(s->v.With.items, pos);
4932 
4933     assert(s->kind == With_kind);
4934 
4935     block = compiler_new_block(c);
4936     final = compiler_new_block(c);
4937     exit = compiler_new_block(c);
4938     if (!block || !final || !exit)
4939         return 0;
4940 
4941     /* Evaluate EXPR */
4942     VISIT(c, expr, item->context_expr);
4943     /* Will push bound __exit__ */
4944     ADDOP_JREL(c, SETUP_WITH, final);
4945 
4946     /* SETUP_WITH pushes a finally block. */
4947     compiler_use_next_block(c, block);
4948     if (!compiler_push_fblock(c, WITH, block, final, NULL)) {
4949         return 0;
4950     }
4951 
4952     if (item->optional_vars) {
4953         VISIT(c, expr, item->optional_vars);
4954     }
4955     else {
4956     /* Discard result from context.__enter__() */
4957         ADDOP(c, POP_TOP);
4958     }
4959 
4960     pos++;
4961     if (pos == asdl_seq_LEN(s->v.With.items))
4962         /* BLOCK code */
4963         VISIT_SEQ(c, stmt, s->v.With.body)
4964     else if (!compiler_with(c, s, pos))
4965             return 0;
4966 
4967     ADDOP(c, POP_BLOCK);
4968     compiler_pop_fblock(c, WITH, block);
4969 
4970     /* End of body; start the cleanup. */
4971 
4972     /* For successful outcome:
4973      * call __exit__(None, None, None)
4974      */
4975     if (!compiler_call_exit_with_nones(c))
4976         return 0;
4977     ADDOP(c, POP_TOP);
4978     ADDOP_JREL(c, JUMP_FORWARD, exit);
4979 
4980     /* For exceptional outcome: */
4981     compiler_use_next_block(c, final);
4982 
4983     ADDOP(c, WITH_EXCEPT_START);
4984     compiler_with_except_finish(c);
4985 
4986     compiler_use_next_block(c, exit);
4987     return 1;
4988 }
4989 
4990 static int
compiler_visit_expr1(struct compiler * c,expr_ty e)4991 compiler_visit_expr1(struct compiler *c, expr_ty e)
4992 {
4993     switch (e->kind) {
4994     case NamedExpr_kind:
4995         VISIT(c, expr, e->v.NamedExpr.value);
4996         ADDOP(c, DUP_TOP);
4997         VISIT(c, expr, e->v.NamedExpr.target);
4998         break;
4999     case BoolOp_kind:
5000         return compiler_boolop(c, e);
5001     case BinOp_kind:
5002         VISIT(c, expr, e->v.BinOp.left);
5003         VISIT(c, expr, e->v.BinOp.right);
5004         ADDOP(c, binop(e->v.BinOp.op));
5005         break;
5006     case UnaryOp_kind:
5007         VISIT(c, expr, e->v.UnaryOp.operand);
5008         ADDOP(c, unaryop(e->v.UnaryOp.op));
5009         break;
5010     case Lambda_kind:
5011         return compiler_lambda(c, e);
5012     case IfExp_kind:
5013         return compiler_ifexp(c, e);
5014     case Dict_kind:
5015         return compiler_dict(c, e);
5016     case Set_kind:
5017         return compiler_set(c, e);
5018     case GeneratorExp_kind:
5019         return compiler_genexp(c, e);
5020     case ListComp_kind:
5021         return compiler_listcomp(c, e);
5022     case SetComp_kind:
5023         return compiler_setcomp(c, e);
5024     case DictComp_kind:
5025         return compiler_dictcomp(c, e);
5026     case Yield_kind:
5027         if (c->u->u_ste->ste_type != FunctionBlock)
5028             return compiler_error(c, "'yield' outside function");
5029         if (e->v.Yield.value) {
5030             VISIT(c, expr, e->v.Yield.value);
5031         }
5032         else {
5033             ADDOP_LOAD_CONST(c, Py_None);
5034         }
5035         ADDOP(c, YIELD_VALUE);
5036         break;
5037     case YieldFrom_kind:
5038         if (c->u->u_ste->ste_type != FunctionBlock)
5039             return compiler_error(c, "'yield' outside function");
5040 
5041         if (c->u->u_scope_type == COMPILER_SCOPE_ASYNC_FUNCTION)
5042             return compiler_error(c, "'yield from' inside async function");
5043 
5044         VISIT(c, expr, e->v.YieldFrom.value);
5045         ADDOP(c, GET_YIELD_FROM_ITER);
5046         ADDOP_LOAD_CONST(c, Py_None);
5047         ADDOP(c, YIELD_FROM);
5048         break;
5049     case Await_kind:
5050         if (!IS_TOP_LEVEL_AWAIT(c)){
5051             if (c->u->u_ste->ste_type != FunctionBlock){
5052                 return compiler_error(c, "'await' outside function");
5053             }
5054 
5055             if (c->u->u_scope_type != COMPILER_SCOPE_ASYNC_FUNCTION &&
5056                     c->u->u_scope_type != COMPILER_SCOPE_COMPREHENSION){
5057                 return compiler_error(c, "'await' outside async function");
5058             }
5059         }
5060 
5061         VISIT(c, expr, e->v.Await.value);
5062         ADDOP(c, GET_AWAITABLE);
5063         ADDOP_LOAD_CONST(c, Py_None);
5064         ADDOP(c, YIELD_FROM);
5065         break;
5066     case Compare_kind:
5067         return compiler_compare(c, e);
5068     case Call_kind:
5069         return compiler_call(c, e);
5070     case Constant_kind:
5071         ADDOP_LOAD_CONST(c, e->v.Constant.value);
5072         break;
5073     case JoinedStr_kind:
5074         return compiler_joined_str(c, e);
5075     case FormattedValue_kind:
5076         return compiler_formatted_value(c, e);
5077     /* The following exprs can be assignment targets. */
5078     case Attribute_kind:
5079         VISIT(c, expr, e->v.Attribute.value);
5080         switch (e->v.Attribute.ctx) {
5081         case Load:
5082             ADDOP_NAME(c, LOAD_ATTR, e->v.Attribute.attr, names);
5083             break;
5084         case Store:
5085             if (forbidden_name(c, e->v.Attribute.attr, e->v.Attribute.ctx))
5086                 return 0;
5087             ADDOP_NAME(c, STORE_ATTR, e->v.Attribute.attr, names);
5088             break;
5089         case Del:
5090             ADDOP_NAME(c, DELETE_ATTR, e->v.Attribute.attr, names);
5091             break;
5092         }
5093         break;
5094     case Subscript_kind:
5095         return compiler_subscript(c, e);
5096     case Starred_kind:
5097         switch (e->v.Starred.ctx) {
5098         case Store:
5099             /* In all legitimate cases, the Starred node was already replaced
5100              * by compiler_list/compiler_tuple. XXX: is that okay? */
5101             return compiler_error(c,
5102                 "starred assignment target must be in a list or tuple");
5103         default:
5104             return compiler_error(c,
5105                 "can't use starred expression here");
5106         }
5107         break;
5108     case Slice_kind:
5109         return compiler_slice(c, e);
5110     case Name_kind:
5111         return compiler_nameop(c, e->v.Name.id, e->v.Name.ctx);
5112     /* child nodes of List and Tuple will have expr_context set */
5113     case List_kind:
5114         return compiler_list(c, e);
5115     case Tuple_kind:
5116         return compiler_tuple(c, e);
5117     }
5118     return 1;
5119 }
5120 
5121 static int
compiler_visit_expr(struct compiler * c,expr_ty e)5122 compiler_visit_expr(struct compiler *c, expr_ty e)
5123 {
5124     int old_lineno = c->u->u_lineno;
5125     int old_col_offset = c->u->u_col_offset;
5126     SET_LOC(c, e);
5127     int res = compiler_visit_expr1(c, e);
5128     c->u->u_lineno = old_lineno;
5129     c->u->u_col_offset = old_col_offset;
5130     return res;
5131 }
5132 
5133 static int
compiler_augassign(struct compiler * c,stmt_ty s)5134 compiler_augassign(struct compiler *c, stmt_ty s)
5135 {
5136     assert(s->kind == AugAssign_kind);
5137     expr_ty e = s->v.AugAssign.target;
5138 
5139     int old_lineno = c->u->u_lineno;
5140     int old_col_offset = c->u->u_col_offset;
5141     SET_LOC(c, e);
5142 
5143     switch (e->kind) {
5144     case Attribute_kind:
5145         VISIT(c, expr, e->v.Attribute.value);
5146         ADDOP(c, DUP_TOP);
5147         ADDOP_NAME(c, LOAD_ATTR, e->v.Attribute.attr, names);
5148         break;
5149     case Subscript_kind:
5150         VISIT(c, expr, e->v.Subscript.value);
5151         VISIT(c, expr, e->v.Subscript.slice);
5152         ADDOP(c, DUP_TOP_TWO);
5153         ADDOP(c, BINARY_SUBSCR);
5154         break;
5155     case Name_kind:
5156         if (!compiler_nameop(c, e->v.Name.id, Load))
5157             return 0;
5158         break;
5159     default:
5160         PyErr_Format(PyExc_SystemError,
5161             "invalid node type (%d) for augmented assignment",
5162             e->kind);
5163         return 0;
5164     }
5165 
5166     c->u->u_lineno = old_lineno;
5167     c->u->u_col_offset = old_col_offset;
5168 
5169     VISIT(c, expr, s->v.AugAssign.value);
5170     ADDOP(c, inplace_binop(s->v.AugAssign.op));
5171 
5172     SET_LOC(c, e);
5173 
5174     switch (e->kind) {
5175     case Attribute_kind:
5176         ADDOP(c, ROT_TWO);
5177         ADDOP_NAME(c, STORE_ATTR, e->v.Attribute.attr, names);
5178         break;
5179     case Subscript_kind:
5180         ADDOP(c, ROT_THREE);
5181         ADDOP(c, STORE_SUBSCR);
5182         break;
5183     case Name_kind:
5184         return compiler_nameop(c, e->v.Name.id, Store);
5185     default:
5186         Py_UNREACHABLE();
5187     }
5188     return 1;
5189 }
5190 
5191 static int
check_ann_expr(struct compiler * c,expr_ty e)5192 check_ann_expr(struct compiler *c, expr_ty e)
5193 {
5194     VISIT(c, expr, e);
5195     ADDOP(c, POP_TOP);
5196     return 1;
5197 }
5198 
5199 static int
check_annotation(struct compiler * c,stmt_ty s)5200 check_annotation(struct compiler *c, stmt_ty s)
5201 {
5202     /* Annotations are only evaluated in a module or class. */
5203     if (c->u->u_scope_type == COMPILER_SCOPE_MODULE ||
5204         c->u->u_scope_type == COMPILER_SCOPE_CLASS) {
5205         return check_ann_expr(c, s->v.AnnAssign.annotation);
5206     }
5207     return 1;
5208 }
5209 
5210 static int
check_ann_subscr(struct compiler * c,expr_ty e)5211 check_ann_subscr(struct compiler *c, expr_ty e)
5212 {
5213     /* We check that everything in a subscript is defined at runtime. */
5214     switch (e->kind) {
5215     case Slice_kind:
5216         if (e->v.Slice.lower && !check_ann_expr(c, e->v.Slice.lower)) {
5217             return 0;
5218         }
5219         if (e->v.Slice.upper && !check_ann_expr(c, e->v.Slice.upper)) {
5220             return 0;
5221         }
5222         if (e->v.Slice.step && !check_ann_expr(c, e->v.Slice.step)) {
5223             return 0;
5224         }
5225         return 1;
5226     case Tuple_kind: {
5227         /* extended slice */
5228         asdl_seq *elts = e->v.Tuple.elts;
5229         Py_ssize_t i, n = asdl_seq_LEN(elts);
5230         for (i = 0; i < n; i++) {
5231             if (!check_ann_subscr(c, asdl_seq_GET(elts, i))) {
5232                 return 0;
5233             }
5234         }
5235         return 1;
5236     }
5237     default:
5238         return check_ann_expr(c, e);
5239     }
5240 }
5241 
5242 static int
compiler_annassign(struct compiler * c,stmt_ty s)5243 compiler_annassign(struct compiler *c, stmt_ty s)
5244 {
5245     expr_ty targ = s->v.AnnAssign.target;
5246     PyObject* mangled;
5247 
5248     assert(s->kind == AnnAssign_kind);
5249 
5250     /* We perform the actual assignment first. */
5251     if (s->v.AnnAssign.value) {
5252         VISIT(c, expr, s->v.AnnAssign.value);
5253         VISIT(c, expr, targ);
5254     }
5255     switch (targ->kind) {
5256     case Name_kind:
5257         if (forbidden_name(c, targ->v.Name.id, Store))
5258             return 0;
5259         /* If we have a simple name in a module or class, store annotation. */
5260         if (s->v.AnnAssign.simple &&
5261             (c->u->u_scope_type == COMPILER_SCOPE_MODULE ||
5262              c->u->u_scope_type == COMPILER_SCOPE_CLASS)) {
5263             if (c->c_future->ff_features & CO_FUTURE_ANNOTATIONS) {
5264                 VISIT(c, annexpr, s->v.AnnAssign.annotation)
5265             }
5266             else {
5267                 VISIT(c, expr, s->v.AnnAssign.annotation);
5268             }
5269             ADDOP_NAME(c, LOAD_NAME, __annotations__, names);
5270             mangled = _Py_Mangle(c->u->u_private, targ->v.Name.id);
5271             ADDOP_LOAD_CONST_NEW(c, mangled);
5272             ADDOP(c, STORE_SUBSCR);
5273         }
5274         break;
5275     case Attribute_kind:
5276         if (forbidden_name(c, targ->v.Attribute.attr, Store))
5277             return 0;
5278         if (!s->v.AnnAssign.value &&
5279             !check_ann_expr(c, targ->v.Attribute.value)) {
5280             return 0;
5281         }
5282         break;
5283     case Subscript_kind:
5284         if (!s->v.AnnAssign.value &&
5285             (!check_ann_expr(c, targ->v.Subscript.value) ||
5286              !check_ann_subscr(c, targ->v.Subscript.slice))) {
5287                 return 0;
5288         }
5289         break;
5290     default:
5291         PyErr_Format(PyExc_SystemError,
5292                      "invalid node type (%d) for annotated assignment",
5293                      targ->kind);
5294             return 0;
5295     }
5296     /* Annotation is evaluated last. */
5297     if (!s->v.AnnAssign.simple && !check_annotation(c, s)) {
5298         return 0;
5299     }
5300     return 1;
5301 }
5302 
5303 /* Raises a SyntaxError and returns 0.
5304    If something goes wrong, a different exception may be raised.
5305 */
5306 
5307 static int
compiler_error(struct compiler * c,const char * errstr)5308 compiler_error(struct compiler *c, const char *errstr)
5309 {
5310     PyObject *loc;
5311     PyObject *u = NULL, *v = NULL;
5312 
5313     loc = PyErr_ProgramTextObject(c->c_filename, c->u->u_lineno);
5314     if (!loc) {
5315         Py_INCREF(Py_None);
5316         loc = Py_None;
5317     }
5318     u = Py_BuildValue("(OiiO)", c->c_filename, c->u->u_lineno,
5319                       c->u->u_col_offset + 1, loc);
5320     if (!u)
5321         goto exit;
5322     v = Py_BuildValue("(zO)", errstr, u);
5323     if (!v)
5324         goto exit;
5325     PyErr_SetObject(PyExc_SyntaxError, v);
5326  exit:
5327     Py_DECREF(loc);
5328     Py_XDECREF(u);
5329     Py_XDECREF(v);
5330     return 0;
5331 }
5332 
5333 /* Emits a SyntaxWarning and returns 1 on success.
5334    If a SyntaxWarning raised as error, replaces it with a SyntaxError
5335    and returns 0.
5336 */
5337 static int
compiler_warn(struct compiler * c,const char * format,...)5338 compiler_warn(struct compiler *c, const char *format, ...)
5339 {
5340     va_list vargs;
5341 #ifdef HAVE_STDARG_PROTOTYPES
5342     va_start(vargs, format);
5343 #else
5344     va_start(vargs);
5345 #endif
5346     PyObject *msg = PyUnicode_FromFormatV(format, vargs);
5347     va_end(vargs);
5348     if (msg == NULL) {
5349         return 0;
5350     }
5351     if (PyErr_WarnExplicitObject(PyExc_SyntaxWarning, msg, c->c_filename,
5352                                  c->u->u_lineno, NULL, NULL) < 0)
5353     {
5354         if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
5355             /* Replace the SyntaxWarning exception with a SyntaxError
5356                to get a more accurate error report */
5357             PyErr_Clear();
5358             assert(PyUnicode_AsUTF8(msg) != NULL);
5359             compiler_error(c, PyUnicode_AsUTF8(msg));
5360         }
5361         Py_DECREF(msg);
5362         return 0;
5363     }
5364     Py_DECREF(msg);
5365     return 1;
5366 }
5367 
5368 static int
compiler_subscript(struct compiler * c,expr_ty e)5369 compiler_subscript(struct compiler *c, expr_ty e)
5370 {
5371     expr_context_ty ctx = e->v.Subscript.ctx;
5372     int op = 0;
5373 
5374     if (ctx == Load) {
5375         if (!check_subscripter(c, e->v.Subscript.value)) {
5376             return 0;
5377         }
5378         if (!check_index(c, e->v.Subscript.value, e->v.Subscript.slice)) {
5379             return 0;
5380         }
5381     }
5382 
5383     switch (ctx) {
5384         case Load:    op = BINARY_SUBSCR; break;
5385         case Store:   op = STORE_SUBSCR; break;
5386         case Del:     op = DELETE_SUBSCR; break;
5387     }
5388     assert(op);
5389     VISIT(c, expr, e->v.Subscript.value);
5390     VISIT(c, expr, e->v.Subscript.slice);
5391     ADDOP(c, op);
5392     return 1;
5393 }
5394 
5395 static int
compiler_slice(struct compiler * c,expr_ty s)5396 compiler_slice(struct compiler *c, expr_ty s)
5397 {
5398     int n = 2;
5399     assert(s->kind == Slice_kind);
5400 
5401     /* only handles the cases where BUILD_SLICE is emitted */
5402     if (s->v.Slice.lower) {
5403         VISIT(c, expr, s->v.Slice.lower);
5404     }
5405     else {
5406         ADDOP_LOAD_CONST(c, Py_None);
5407     }
5408 
5409     if (s->v.Slice.upper) {
5410         VISIT(c, expr, s->v.Slice.upper);
5411     }
5412     else {
5413         ADDOP_LOAD_CONST(c, Py_None);
5414     }
5415 
5416     if (s->v.Slice.step) {
5417         n++;
5418         VISIT(c, expr, s->v.Slice.step);
5419     }
5420     ADDOP_I(c, BUILD_SLICE, n);
5421     return 1;
5422 }
5423 
5424 /* End of the compiler section, beginning of the assembler section */
5425 
5426 /* do depth-first search of basic block graph, starting with block.
5427    post records the block indices in post-order.
5428 
5429    XXX must handle implicit jumps from one block to next
5430 */
5431 
5432 struct assembler {
5433     PyObject *a_bytecode;  /* string containing bytecode */
5434     int a_offset;              /* offset into bytecode */
5435     int a_nblocks;             /* number of reachable blocks */
5436     basicblock **a_postorder; /* list of blocks in dfs postorder */
5437     PyObject *a_lnotab;    /* string containing lnotab */
5438     int a_lnotab_off;      /* offset into lnotab */
5439     int a_lineno;              /* last lineno of emitted instruction */
5440     int a_lineno_off;      /* bytecode offset of last lineno */
5441 };
5442 
5443 static void
dfs(struct compiler * c,basicblock * b,struct assembler * a,int end)5444 dfs(struct compiler *c, basicblock *b, struct assembler *a, int end)
5445 {
5446     int i, j;
5447 
5448     /* Get rid of recursion for normal control flow.
5449        Since the number of blocks is limited, unused space in a_postorder
5450        (from a_nblocks to end) can be used as a stack for still not ordered
5451        blocks. */
5452     for (j = end; b && !b->b_seen; b = b->b_next) {
5453         b->b_seen = 1;
5454         assert(a->a_nblocks < j);
5455         a->a_postorder[--j] = b;
5456     }
5457     while (j < end) {
5458         b = a->a_postorder[j++];
5459         for (i = 0; i < b->b_iused; i++) {
5460             struct instr *instr = &b->b_instr[i];
5461             if (instr->i_jrel || instr->i_jabs)
5462                 dfs(c, instr->i_target, a, j);
5463         }
5464         assert(a->a_nblocks < j);
5465         a->a_postorder[a->a_nblocks++] = b;
5466     }
5467 }
5468 
5469 Py_LOCAL_INLINE(void)
stackdepth_push(basicblock *** sp,basicblock * b,int depth)5470 stackdepth_push(basicblock ***sp, basicblock *b, int depth)
5471 {
5472     assert(b->b_startdepth < 0 || b->b_startdepth == depth);
5473     if (b->b_startdepth < depth && b->b_startdepth < 100) {
5474         assert(b->b_startdepth < 0);
5475         b->b_startdepth = depth;
5476         *(*sp)++ = b;
5477     }
5478 }
5479 
5480 /* Find the flow path that needs the largest stack.  We assume that
5481  * cycles in the flow graph have no net effect on the stack depth.
5482  */
5483 static int
stackdepth(struct compiler * c)5484 stackdepth(struct compiler *c)
5485 {
5486     basicblock *b, *entryblock = NULL;
5487     basicblock **stack, **sp;
5488     int nblocks = 0, maxdepth = 0;
5489     for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
5490         b->b_startdepth = INT_MIN;
5491         entryblock = b;
5492         nblocks++;
5493     }
5494     if (!entryblock)
5495         return 0;
5496     stack = (basicblock **)PyObject_Malloc(sizeof(basicblock *) * nblocks);
5497     if (!stack) {
5498         PyErr_NoMemory();
5499         return -1;
5500     }
5501 
5502     sp = stack;
5503     stackdepth_push(&sp, entryblock, 0);
5504     while (sp != stack) {
5505         b = *--sp;
5506         int depth = b->b_startdepth;
5507         assert(depth >= 0);
5508         basicblock *next = b->b_next;
5509         for (int i = 0; i < b->b_iused; i++) {
5510             struct instr *instr = &b->b_instr[i];
5511             int effect = stack_effect(instr->i_opcode, instr->i_oparg, 0);
5512             if (effect == PY_INVALID_STACK_EFFECT) {
5513                 _Py_FatalErrorFormat(__func__,
5514                     "opcode = %d", instr->i_opcode);
5515             }
5516             int new_depth = depth + effect;
5517             if (new_depth > maxdepth) {
5518                 maxdepth = new_depth;
5519             }
5520             assert(depth >= 0); /* invalid code or bug in stackdepth() */
5521             if (instr->i_jrel || instr->i_jabs) {
5522                 effect = stack_effect(instr->i_opcode, instr->i_oparg, 1);
5523                 assert(effect != PY_INVALID_STACK_EFFECT);
5524                 int target_depth = depth + effect;
5525                 if (target_depth > maxdepth) {
5526                     maxdepth = target_depth;
5527                 }
5528                 assert(target_depth >= 0); /* invalid code or bug in stackdepth() */
5529                 stackdepth_push(&sp, instr->i_target, target_depth);
5530             }
5531             depth = new_depth;
5532             if (instr->i_opcode == JUMP_ABSOLUTE ||
5533                 instr->i_opcode == JUMP_FORWARD ||
5534                 instr->i_opcode == RETURN_VALUE ||
5535                 instr->i_opcode == RAISE_VARARGS ||
5536                 instr->i_opcode == RERAISE)
5537             {
5538                 /* remaining code is dead */
5539                 next = NULL;
5540                 break;
5541             }
5542         }
5543         if (next != NULL) {
5544             stackdepth_push(&sp, next, depth);
5545         }
5546     }
5547     PyObject_Free(stack);
5548     return maxdepth;
5549 }
5550 
5551 static int
assemble_init(struct assembler * a,int nblocks,int firstlineno)5552 assemble_init(struct assembler *a, int nblocks, int firstlineno)
5553 {
5554     memset(a, 0, sizeof(struct assembler));
5555     a->a_lineno = firstlineno;
5556     a->a_bytecode = PyBytes_FromStringAndSize(NULL, DEFAULT_CODE_SIZE);
5557     if (!a->a_bytecode)
5558         return 0;
5559     a->a_lnotab = PyBytes_FromStringAndSize(NULL, DEFAULT_LNOTAB_SIZE);
5560     if (!a->a_lnotab)
5561         return 0;
5562     if ((size_t)nblocks > SIZE_MAX / sizeof(basicblock *)) {
5563         PyErr_NoMemory();
5564         return 0;
5565     }
5566     a->a_postorder = (basicblock **)PyObject_Malloc(
5567                                         sizeof(basicblock *) * nblocks);
5568     if (!a->a_postorder) {
5569         PyErr_NoMemory();
5570         return 0;
5571     }
5572     return 1;
5573 }
5574 
5575 static void
assemble_free(struct assembler * a)5576 assemble_free(struct assembler *a)
5577 {
5578     Py_XDECREF(a->a_bytecode);
5579     Py_XDECREF(a->a_lnotab);
5580     if (a->a_postorder)
5581         PyObject_Free(a->a_postorder);
5582 }
5583 
5584 static int
blocksize(basicblock * b)5585 blocksize(basicblock *b)
5586 {
5587     int i;
5588     int size = 0;
5589 
5590     for (i = 0; i < b->b_iused; i++)
5591         size += instrsize(b->b_instr[i].i_oparg);
5592     return size;
5593 }
5594 
5595 /* Appends a pair to the end of the line number table, a_lnotab, representing
5596    the instruction's bytecode offset and line number.  See
5597    Objects/lnotab_notes.txt for the description of the line number table. */
5598 
5599 static int
assemble_lnotab(struct assembler * a,struct instr * i)5600 assemble_lnotab(struct assembler *a, struct instr *i)
5601 {
5602     int d_bytecode, d_lineno;
5603     Py_ssize_t len;
5604     unsigned char *lnotab;
5605 
5606     d_lineno = i->i_lineno - a->a_lineno;
5607     if (d_lineno == 0) {
5608         return 1;
5609     }
5610 
5611     d_bytecode = (a->a_offset - a->a_lineno_off) * sizeof(_Py_CODEUNIT);
5612     assert(d_bytecode >= 0);
5613 
5614     if (d_bytecode > 255) {
5615         int j, nbytes, ncodes = d_bytecode / 255;
5616         nbytes = a->a_lnotab_off + 2 * ncodes;
5617         len = PyBytes_GET_SIZE(a->a_lnotab);
5618         if (nbytes >= len) {
5619             if ((len <= INT_MAX / 2) && (len * 2 < nbytes))
5620                 len = nbytes;
5621             else if (len <= INT_MAX / 2)
5622                 len *= 2;
5623             else {
5624                 PyErr_NoMemory();
5625                 return 0;
5626             }
5627             if (_PyBytes_Resize(&a->a_lnotab, len) < 0)
5628                 return 0;
5629         }
5630         lnotab = (unsigned char *)
5631                    PyBytes_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
5632         for (j = 0; j < ncodes; j++) {
5633             *lnotab++ = 255;
5634             *lnotab++ = 0;
5635         }
5636         d_bytecode -= ncodes * 255;
5637         a->a_lnotab_off += ncodes * 2;
5638     }
5639     assert(0 <= d_bytecode && d_bytecode <= 255);
5640 
5641     if (d_lineno < -128 || 127 < d_lineno) {
5642         int j, nbytes, ncodes, k;
5643         if (d_lineno < 0) {
5644             k = -128;
5645             /* use division on positive numbers */
5646             ncodes = (-d_lineno) / 128;
5647         }
5648         else {
5649             k = 127;
5650             ncodes = d_lineno / 127;
5651         }
5652         d_lineno -= ncodes * k;
5653         assert(ncodes >= 1);
5654         nbytes = a->a_lnotab_off + 2 * ncodes;
5655         len = PyBytes_GET_SIZE(a->a_lnotab);
5656         if (nbytes >= len) {
5657             if ((len <= INT_MAX / 2) && len * 2 < nbytes)
5658                 len = nbytes;
5659             else if (len <= INT_MAX / 2)
5660                 len *= 2;
5661             else {
5662                 PyErr_NoMemory();
5663                 return 0;
5664             }
5665             if (_PyBytes_Resize(&a->a_lnotab, len) < 0)
5666                 return 0;
5667         }
5668         lnotab = (unsigned char *)
5669                    PyBytes_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
5670         *lnotab++ = d_bytecode;
5671         *lnotab++ = k;
5672         d_bytecode = 0;
5673         for (j = 1; j < ncodes; j++) {
5674             *lnotab++ = 0;
5675             *lnotab++ = k;
5676         }
5677         a->a_lnotab_off += ncodes * 2;
5678     }
5679     assert(-128 <= d_lineno && d_lineno <= 127);
5680 
5681     len = PyBytes_GET_SIZE(a->a_lnotab);
5682     if (a->a_lnotab_off + 2 >= len) {
5683         if (_PyBytes_Resize(&a->a_lnotab, len * 2) < 0)
5684             return 0;
5685     }
5686     lnotab = (unsigned char *)
5687                     PyBytes_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
5688 
5689     a->a_lnotab_off += 2;
5690     if (d_bytecode) {
5691         *lnotab++ = d_bytecode;
5692         *lnotab++ = d_lineno;
5693     }
5694     else {      /* First line of a block; def stmt, etc. */
5695         *lnotab++ = 0;
5696         *lnotab++ = d_lineno;
5697     }
5698     a->a_lineno = i->i_lineno;
5699     a->a_lineno_off = a->a_offset;
5700     return 1;
5701 }
5702 
5703 /* assemble_emit()
5704    Extend the bytecode with a new instruction.
5705    Update lnotab if necessary.
5706 */
5707 
5708 static int
assemble_emit(struct assembler * a,struct instr * i)5709 assemble_emit(struct assembler *a, struct instr *i)
5710 {
5711     int size, arg = 0;
5712     Py_ssize_t len = PyBytes_GET_SIZE(a->a_bytecode);
5713     _Py_CODEUNIT *code;
5714 
5715     arg = i->i_oparg;
5716     size = instrsize(arg);
5717     if (i->i_lineno && !assemble_lnotab(a, i))
5718         return 0;
5719     if (a->a_offset + size >= len / (int)sizeof(_Py_CODEUNIT)) {
5720         if (len > PY_SSIZE_T_MAX / 2)
5721             return 0;
5722         if (_PyBytes_Resize(&a->a_bytecode, len * 2) < 0)
5723             return 0;
5724     }
5725     code = (_Py_CODEUNIT *)PyBytes_AS_STRING(a->a_bytecode) + a->a_offset;
5726     a->a_offset += size;
5727     write_op_arg(code, i->i_opcode, arg, size);
5728     return 1;
5729 }
5730 
5731 static void
assemble_jump_offsets(struct assembler * a,struct compiler * c)5732 assemble_jump_offsets(struct assembler *a, struct compiler *c)
5733 {
5734     basicblock *b;
5735     int bsize, totsize, extended_arg_recompile;
5736     int i;
5737 
5738     /* Compute the size of each block and fixup jump args.
5739        Replace block pointer with position in bytecode. */
5740     do {
5741         totsize = 0;
5742         for (i = a->a_nblocks - 1; i >= 0; i--) {
5743             b = a->a_postorder[i];
5744             bsize = blocksize(b);
5745             b->b_offset = totsize;
5746             totsize += bsize;
5747         }
5748         extended_arg_recompile = 0;
5749         for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
5750             bsize = b->b_offset;
5751             for (i = 0; i < b->b_iused; i++) {
5752                 struct instr *instr = &b->b_instr[i];
5753                 int isize = instrsize(instr->i_oparg);
5754                 /* Relative jumps are computed relative to
5755                    the instruction pointer after fetching
5756                    the jump instruction.
5757                 */
5758                 bsize += isize;
5759                 if (instr->i_jabs || instr->i_jrel) {
5760                     instr->i_oparg = instr->i_target->b_offset;
5761                     if (instr->i_jrel) {
5762                         instr->i_oparg -= bsize;
5763                     }
5764                     instr->i_oparg *= sizeof(_Py_CODEUNIT);
5765                     if (instrsize(instr->i_oparg) != isize) {
5766                         extended_arg_recompile = 1;
5767                     }
5768                 }
5769             }
5770         }
5771 
5772     /* XXX: This is an awful hack that could hurt performance, but
5773         on the bright side it should work until we come up
5774         with a better solution.
5775 
5776         The issue is that in the first loop blocksize() is called
5777         which calls instrsize() which requires i_oparg be set
5778         appropriately. There is a bootstrap problem because
5779         i_oparg is calculated in the second loop above.
5780 
5781         So we loop until we stop seeing new EXTENDED_ARGs.
5782         The only EXTENDED_ARGs that could be popping up are
5783         ones in jump instructions.  So this should converge
5784         fairly quickly.
5785     */
5786     } while (extended_arg_recompile);
5787 }
5788 
5789 static PyObject *
dict_keys_inorder(PyObject * dict,Py_ssize_t offset)5790 dict_keys_inorder(PyObject *dict, Py_ssize_t offset)
5791 {
5792     PyObject *tuple, *k, *v;
5793     Py_ssize_t i, pos = 0, size = PyDict_GET_SIZE(dict);
5794 
5795     tuple = PyTuple_New(size);
5796     if (tuple == NULL)
5797         return NULL;
5798     while (PyDict_Next(dict, &pos, &k, &v)) {
5799         i = PyLong_AS_LONG(v);
5800         Py_INCREF(k);
5801         assert((i - offset) < size);
5802         assert((i - offset) >= 0);
5803         PyTuple_SET_ITEM(tuple, i - offset, k);
5804     }
5805     return tuple;
5806 }
5807 
5808 static PyObject *
consts_dict_keys_inorder(PyObject * dict)5809 consts_dict_keys_inorder(PyObject *dict)
5810 {
5811     PyObject *consts, *k, *v;
5812     Py_ssize_t i, pos = 0, size = PyDict_GET_SIZE(dict);
5813 
5814     consts = PyList_New(size);   /* PyCode_Optimize() requires a list */
5815     if (consts == NULL)
5816         return NULL;
5817     while (PyDict_Next(dict, &pos, &k, &v)) {
5818         i = PyLong_AS_LONG(v);
5819         /* The keys of the dictionary can be tuples wrapping a contant.
5820          * (see compiler_add_o and _PyCode_ConstantKey). In that case
5821          * the object we want is always second. */
5822         if (PyTuple_CheckExact(k)) {
5823             k = PyTuple_GET_ITEM(k, 1);
5824         }
5825         Py_INCREF(k);
5826         assert(i < size);
5827         assert(i >= 0);
5828         PyList_SET_ITEM(consts, i, k);
5829     }
5830     return consts;
5831 }
5832 
5833 static int
compute_code_flags(struct compiler * c)5834 compute_code_flags(struct compiler *c)
5835 {
5836     PySTEntryObject *ste = c->u->u_ste;
5837     int flags = 0;
5838     if (ste->ste_type == FunctionBlock) {
5839         flags |= CO_NEWLOCALS | CO_OPTIMIZED;
5840         if (ste->ste_nested)
5841             flags |= CO_NESTED;
5842         if (ste->ste_generator && !ste->ste_coroutine)
5843             flags |= CO_GENERATOR;
5844         if (!ste->ste_generator && ste->ste_coroutine)
5845             flags |= CO_COROUTINE;
5846         if (ste->ste_generator && ste->ste_coroutine)
5847             flags |= CO_ASYNC_GENERATOR;
5848         if (ste->ste_varargs)
5849             flags |= CO_VARARGS;
5850         if (ste->ste_varkeywords)
5851             flags |= CO_VARKEYWORDS;
5852     }
5853 
5854     /* (Only) inherit compilerflags in PyCF_MASK */
5855     flags |= (c->c_flags->cf_flags & PyCF_MASK);
5856 
5857     if ((IS_TOP_LEVEL_AWAIT(c)) &&
5858          ste->ste_coroutine &&
5859          !ste->ste_generator) {
5860         flags |= CO_COROUTINE;
5861     }
5862 
5863     return flags;
5864 }
5865 
5866 // Merge *tuple* with constant cache.
5867 // Unlike merge_consts_recursive(), this function doesn't work recursively.
5868 static int
merge_const_tuple(struct compiler * c,PyObject ** tuple)5869 merge_const_tuple(struct compiler *c, PyObject **tuple)
5870 {
5871     assert(PyTuple_CheckExact(*tuple));
5872 
5873     PyObject *key = _PyCode_ConstantKey(*tuple);
5874     if (key == NULL) {
5875         return 0;
5876     }
5877 
5878     // t is borrowed reference
5879     PyObject *t = PyDict_SetDefault(c->c_const_cache, key, key);
5880     Py_DECREF(key);
5881     if (t == NULL) {
5882         return 0;
5883     }
5884     if (t == key) {  // tuple is new constant.
5885         return 1;
5886     }
5887 
5888     PyObject *u = PyTuple_GET_ITEM(t, 1);
5889     Py_INCREF(u);
5890     Py_DECREF(*tuple);
5891     *tuple = u;
5892     return 1;
5893 }
5894 
5895 static PyCodeObject *
makecode(struct compiler * c,struct assembler * a)5896 makecode(struct compiler *c, struct assembler *a)
5897 {
5898     PyObject *tmp;
5899     PyCodeObject *co = NULL;
5900     PyObject *consts = NULL;
5901     PyObject *names = NULL;
5902     PyObject *varnames = NULL;
5903     PyObject *name = NULL;
5904     PyObject *freevars = NULL;
5905     PyObject *cellvars = NULL;
5906     PyObject *bytecode = NULL;
5907     Py_ssize_t nlocals;
5908     int nlocals_int;
5909     int flags;
5910     int posorkeywordargcount, posonlyargcount, kwonlyargcount, maxdepth;
5911 
5912     consts = consts_dict_keys_inorder(c->u->u_consts);
5913     names = dict_keys_inorder(c->u->u_names, 0);
5914     varnames = dict_keys_inorder(c->u->u_varnames, 0);
5915     if (!consts || !names || !varnames)
5916         goto error;
5917 
5918     cellvars = dict_keys_inorder(c->u->u_cellvars, 0);
5919     if (!cellvars)
5920         goto error;
5921     freevars = dict_keys_inorder(c->u->u_freevars, PyTuple_GET_SIZE(cellvars));
5922     if (!freevars)
5923         goto error;
5924 
5925     if (!merge_const_tuple(c, &names) ||
5926             !merge_const_tuple(c, &varnames) ||
5927             !merge_const_tuple(c, &cellvars) ||
5928             !merge_const_tuple(c, &freevars))
5929     {
5930         goto error;
5931     }
5932 
5933     nlocals = PyDict_GET_SIZE(c->u->u_varnames);
5934     assert(nlocals < INT_MAX);
5935     nlocals_int = Py_SAFE_DOWNCAST(nlocals, Py_ssize_t, int);
5936 
5937     flags = compute_code_flags(c);
5938     if (flags < 0)
5939         goto error;
5940 
5941     bytecode = PyCode_Optimize(a->a_bytecode, consts, names, a->a_lnotab);
5942     if (!bytecode)
5943         goto error;
5944 
5945     tmp = PyList_AsTuple(consts); /* PyCode_New requires a tuple */
5946     if (!tmp)
5947         goto error;
5948     Py_DECREF(consts);
5949     consts = tmp;
5950     if (!merge_const_tuple(c, &consts)) {
5951         goto error;
5952     }
5953 
5954     posonlyargcount = Py_SAFE_DOWNCAST(c->u->u_posonlyargcount, Py_ssize_t, int);
5955     posorkeywordargcount = Py_SAFE_DOWNCAST(c->u->u_argcount, Py_ssize_t, int);
5956     kwonlyargcount = Py_SAFE_DOWNCAST(c->u->u_kwonlyargcount, Py_ssize_t, int);
5957     maxdepth = stackdepth(c);
5958     if (maxdepth < 0) {
5959         goto error;
5960     }
5961     co = PyCode_NewWithPosOnlyArgs(posonlyargcount+posorkeywordargcount,
5962                                    posonlyargcount, kwonlyargcount, nlocals_int,
5963                                    maxdepth, flags, bytecode, consts, names,
5964                                    varnames, freevars, cellvars, c->c_filename,
5965                                    c->u->u_name, c->u->u_firstlineno, a->a_lnotab);
5966  error:
5967     Py_XDECREF(consts);
5968     Py_XDECREF(names);
5969     Py_XDECREF(varnames);
5970     Py_XDECREF(name);
5971     Py_XDECREF(freevars);
5972     Py_XDECREF(cellvars);
5973     Py_XDECREF(bytecode);
5974     return co;
5975 }
5976 
5977 
5978 /* For debugging purposes only */
5979 #if 0
5980 static void
5981 dump_instr(const struct instr *i)
5982 {
5983     const char *jrel = i->i_jrel ? "jrel " : "";
5984     const char *jabs = i->i_jabs ? "jabs " : "";
5985     char arg[128];
5986 
5987     *arg = '\0';
5988     if (HAS_ARG(i->i_opcode)) {
5989         sprintf(arg, "arg: %d ", i->i_oparg);
5990     }
5991     fprintf(stderr, "line: %d, opcode: %d %s%s%s\n",
5992                     i->i_lineno, i->i_opcode, arg, jabs, jrel);
5993 }
5994 
5995 static void
5996 dump_basicblock(const basicblock *b)
5997 {
5998     const char *seen = b->b_seen ? "seen " : "";
5999     const char *b_return = b->b_return ? "return " : "";
6000     fprintf(stderr, "used: %d, depth: %d, offset: %d %s%s\n",
6001         b->b_iused, b->b_startdepth, b->b_offset, seen, b_return);
6002     if (b->b_instr) {
6003         int i;
6004         for (i = 0; i < b->b_iused; i++) {
6005             fprintf(stderr, "  [%02d] ", i);
6006             dump_instr(b->b_instr + i);
6007         }
6008     }
6009 }
6010 #endif
6011 
6012 static PyCodeObject *
assemble(struct compiler * c,int addNone)6013 assemble(struct compiler *c, int addNone)
6014 {
6015     basicblock *b, *entryblock;
6016     struct assembler a;
6017     int i, j, nblocks;
6018     PyCodeObject *co = NULL;
6019 
6020     /* Make sure every block that falls off the end returns None.
6021        XXX NEXT_BLOCK() isn't quite right, because if the last
6022        block ends with a jump or return b_next shouldn't set.
6023      */
6024     if (!c->u->u_curblock->b_return) {
6025         NEXT_BLOCK(c);
6026         if (addNone)
6027             ADDOP_LOAD_CONST(c, Py_None);
6028         ADDOP(c, RETURN_VALUE);
6029     }
6030 
6031     nblocks = 0;
6032     entryblock = NULL;
6033     for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
6034         nblocks++;
6035         entryblock = b;
6036     }
6037 
6038     /* Set firstlineno if it wasn't explicitly set. */
6039     if (!c->u->u_firstlineno) {
6040         if (entryblock && entryblock->b_instr && entryblock->b_instr->i_lineno)
6041             c->u->u_firstlineno = entryblock->b_instr->i_lineno;
6042         else
6043             c->u->u_firstlineno = 1;
6044     }
6045     if (!assemble_init(&a, nblocks, c->u->u_firstlineno))
6046         goto error;
6047     dfs(c, entryblock, &a, nblocks);
6048 
6049     /* Can't modify the bytecode after computing jump offsets. */
6050     assemble_jump_offsets(&a, c);
6051 
6052     /* Emit code in reverse postorder from dfs. */
6053     for (i = a.a_nblocks - 1; i >= 0; i--) {
6054         b = a.a_postorder[i];
6055         for (j = 0; j < b->b_iused; j++)
6056             if (!assemble_emit(&a, &b->b_instr[j]))
6057                 goto error;
6058     }
6059 
6060     if (_PyBytes_Resize(&a.a_lnotab, a.a_lnotab_off) < 0)
6061         goto error;
6062     if (_PyBytes_Resize(&a.a_bytecode, a.a_offset * sizeof(_Py_CODEUNIT)) < 0)
6063         goto error;
6064 
6065     co = makecode(c, &a);
6066  error:
6067     assemble_free(&a);
6068     return co;
6069 }
6070 
6071 #undef PyAST_Compile
6072 PyCodeObject *
PyAST_Compile(mod_ty mod,const char * filename,PyCompilerFlags * flags,PyArena * arena)6073 PyAST_Compile(mod_ty mod, const char *filename, PyCompilerFlags *flags,
6074               PyArena *arena)
6075 {
6076     return PyAST_CompileEx(mod, filename, flags, -1, arena);
6077 }
6078