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