blob: 46660f243ac89b0eb7ce700841f028a2e45a4b53 [file] [log] [blame]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001/*
2 * This file compiles an abstract syntax tree (AST) into Python bytecode.
3 *
Victor Stinnera81fca62021-03-24 00:51:50 +01004 * The primary entry point is _PyAST_Compile(), which returns a
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005 * PyCodeObject. The compiler makes several passes to build the code
6 * object:
7 * 1. Checks for future statements. See future.c
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008 * 2. Builds a symbol table. See symtable.c.
Thomas Wouters89f507f2006-12-13 04:49:30 +00009 * 3. Generate code for basic blocks. See compiler_mod() in this file.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000010 * 4. Assemble the basic blocks into final code. See assemble() in
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000011 * this file.
Mark Shannon6e8128f2020-07-30 10:03:00 +010012 * 5. Optimize the byte code (peephole optimizations).
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000013 *
14 * Note that compiler_mod() suggests module, but the module ast type
15 * (mod_ty) has cases for expressions and interactive statements.
Nick Coghlan944d3eb2005-11-16 12:46:55 +000016 *
Jeremy Hyltone9357b22006-03-01 15:47:05 +000017 * 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
Thomas Wouters89f507f2006-12-13 04:49:30 +000020 * structure takes care of releasing those. Use the arena to manage
21 * objects.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000022 */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000023
Guido van Rossum79f25d91997-04-29 20:08:16 +000024#include "Python.h"
Victor Stinner526fdeb2021-03-17 23:50:50 +010025#include "pycore_ast.h" // _PyAST_GetDocString()
Victor Stinnera81fca62021-03-24 00:51:50 +010026#include "pycore_compile.h" // _PyFuture_FromAST()
Victor Stinnerba7a99d2021-01-30 01:46:44 +010027#include "pycore_pymem.h" // _PyMem_IsPtrFreed()
Victor Stinnerc9bc2902020-10-27 02:24:34 +010028#include "pycore_long.h" // _PyLong_GetZero()
Victor Stinner28ad12f2021-03-19 12:41:49 +010029#include "pycore_symtable.h" // PySTEntryObject
Guido van Rossum3f5da241990-12-20 15:06:42 +000030
Mark Shannon582aaf12020-08-04 17:30:11 +010031#define NEED_OPCODE_JUMP_TABLES
Victor Stinner526fdeb2021-03-17 23:50:50 +010032#include "opcode.h" // EXTENDED_ARG
33#include "wordcode_helpers.h" // instrsize()
34
Guido van Rossumb05a5c71997-05-07 17:46:13 +000035
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000036#define DEFAULT_BLOCK_SIZE 16
37#define DEFAULT_BLOCKS 8
38#define DEFAULT_CODE_SIZE 128
39#define DEFAULT_LNOTAB_SIZE 16
Jeremy Hylton29906ee2001-02-27 04:23:34 +000040
Nick Coghlan650f0d02007-04-15 12:05:43 +000041#define COMP_GENEXP 0
42#define COMP_LISTCOMP 1
43#define COMP_SETCOMP 2
Guido van Rossum992d4a32007-07-11 13:09:30 +000044#define COMP_DICTCOMP 3
Nick Coghlan650f0d02007-04-15 12:05:43 +000045
Mark Shannon11e0b292021-04-15 14:28:56 +010046/* A soft limit for stack use, to avoid excessive
47 * memory use for large constants, etc.
48 *
49 * The value 30 is plucked out of thin air.
50 * Code that could use more stack than this is
51 * rare, so the exact value is unimportant.
52 */
53#define STACK_USE_GUIDELINE 30
54
55/* If we exceed this limit, it should
56 * be considered a compiler bug.
57 * Currently it should be impossible
58 * to exceed STACK_USE_GUIDELINE * 100,
59 * as 100 is the maximum parse depth.
60 * For performance reasons we will
61 * want to reduce this to a
62 * few hundred in the future.
63 *
64 * NOTE: Whatever MAX_ALLOWED_STACK_USE is
65 * set to, it should never restrict what Python
66 * we can write, just how we compile it.
67 */
68#define MAX_ALLOWED_STACK_USE (STACK_USE_GUIDELINE * 100)
69
Pablo Galindo90235812020-03-15 04:29:22 +000070#define IS_TOP_LEVEL_AWAIT(c) ( \
71 (c->c_flags->cf_flags & PyCF_ALLOW_TOP_LEVEL_AWAIT) \
72 && (c->u->u_ste->ste_type == ModuleBlock))
73
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000074struct instr {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000075 unsigned char i_opcode;
76 int i_oparg;
77 struct basicblock_ *i_target; /* target block (if jump instruction) */
78 int i_lineno;
Guido van Rossum3f5da241990-12-20 15:06:42 +000079};
80
Mark Shannon582aaf12020-08-04 17:30:11 +010081#define LOG_BITS_PER_INT 5
82#define MASK_LOW_LOG_BITS 31
83
84static inline int
85is_bit_set_in_table(uint32_t *table, int bitindex) {
86 /* Is the relevant bit set in the relevant word? */
87 /* 256 bits fit into 8 32-bits words.
88 * Word is indexed by (bitindex>>ln(size of int in bits)).
89 * Bit within word is the low bits of bitindex.
90 */
91 uint32_t word = table[bitindex >> LOG_BITS_PER_INT];
92 return (word >> (bitindex & MASK_LOW_LOG_BITS)) & 1;
93}
94
95static inline int
96is_relative_jump(struct instr *i)
97{
98 return is_bit_set_in_table(_PyOpcode_RelativeJump, i->i_opcode);
99}
100
101static inline int
102is_jump(struct instr *i)
103{
104 return is_bit_set_in_table(_PyOpcode_Jump, i->i_opcode);
105}
106
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000107typedef struct basicblock_ {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000108 /* Each basicblock in a compilation unit is linked via b_list in the
109 reverse order that the block are allocated. b_list points to the next
110 block, not to be confused with b_next, which is next by control flow. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000111 struct basicblock_ *b_list;
112 /* number of instructions used */
113 int b_iused;
114 /* length of instruction array (b_instr) */
115 int b_ialloc;
116 /* pointer to an array of instructions, initially NULL */
117 struct instr *b_instr;
118 /* If b_next is non-NULL, it is a pointer to the next
119 block reached by normal control flow. */
120 struct basicblock_ *b_next;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000121 /* b_return is true if a RETURN_VALUE opcode is inserted. */
122 unsigned b_return : 1;
Mark Shannon3bd60352021-01-13 12:05:43 +0000123 /* Number of predecssors that a block has. */
124 int b_predecessors;
Mark Shannoncc75ab72020-11-12 19:49:33 +0000125 /* Basic block has no fall through (it ends with a return, raise or jump) */
126 unsigned b_nofallthrough : 1;
127 /* Basic block exits scope (it ends with a return or raise) */
128 unsigned b_exit : 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000129 /* depth of stack upon entry of block, computed by stackdepth() */
130 int b_startdepth;
131 /* instruction offset for block, computed by assemble_jump_offsets() */
132 int b_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000133} basicblock;
134
135/* fblockinfo tracks the current frame block.
136
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000137A frame block is used to handle loops, try/except, and try/finally.
138It's called a frame block to distinguish it from a basic block in the
139compiler IR.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000140*/
141
Mark Shannon02d126a2020-09-25 14:04:19 +0100142enum fblocktype { WHILE_LOOP, FOR_LOOP, TRY_EXCEPT, FINALLY_TRY, FINALLY_END,
tomKPZ7a7ba3d2021-04-07 07:43:45 -0700143 WITH, ASYNC_WITH, HANDLER_CLEANUP, POP_VALUE, EXCEPTION_HANDLER,
144 ASYNC_COMPREHENSION_GENERATOR };
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000145
146struct fblockinfo {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000147 enum fblocktype fb_type;
148 basicblock *fb_block;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +0200149 /* (optional) type-specific exit or cleanup block */
150 basicblock *fb_exit;
Mark Shannonfee55262019-11-21 09:11:43 +0000151 /* (optional) additional information required for unwinding */
152 void *fb_datum;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000153};
154
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100155enum {
156 COMPILER_SCOPE_MODULE,
157 COMPILER_SCOPE_CLASS,
158 COMPILER_SCOPE_FUNCTION,
Yury Selivanov75445082015-05-11 22:57:16 -0400159 COMPILER_SCOPE_ASYNC_FUNCTION,
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400160 COMPILER_SCOPE_LAMBDA,
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100161 COMPILER_SCOPE_COMPREHENSION,
162};
163
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000164/* The following items change on entry and exit of code blocks.
165 They must be saved and restored when returning to a block.
166*/
167struct compiler_unit {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000168 PySTEntryObject *u_ste;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000169
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000170 PyObject *u_name;
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400171 PyObject *u_qualname; /* dot-separated qualified name (lazy) */
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100172 int u_scope_type;
173
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000174 /* The following fields are dicts that map objects to
175 the index of them in co_XXX. The index is used as
176 the argument for opcodes that refer to those collections.
177 */
178 PyObject *u_consts; /* all constants */
179 PyObject *u_names; /* all names */
180 PyObject *u_varnames; /* local variables */
181 PyObject *u_cellvars; /* cell variables */
182 PyObject *u_freevars; /* free variables */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000183
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000184 PyObject *u_private; /* for private name mangling */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000185
Victor Stinnerf8e32212013-11-19 23:56:34 +0100186 Py_ssize_t u_argcount; /* number of arguments for block */
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100187 Py_ssize_t u_posonlyargcount; /* number of positional only arguments for block */
Victor Stinnerf8e32212013-11-19 23:56:34 +0100188 Py_ssize_t u_kwonlyargcount; /* number of keyword only arguments for block */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000189 /* Pointer to the most recently allocated block. By following b_list
190 members, you can reach all early allocated blocks. */
191 basicblock *u_blocks;
192 basicblock *u_curblock; /* pointer to current block */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000193
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000194 int u_nfblocks;
195 struct fblockinfo u_fblock[CO_MAXBLOCKS];
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000196
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000197 int u_firstlineno; /* the first lineno of the block */
198 int u_lineno; /* the lineno for the current stmt */
Benjamin Petersond4efd9e2010-09-20 23:02:10 +0000199 int u_col_offset; /* the offset of the current stmt */
Pablo Galindoa77aac42021-04-23 14:27:05 +0100200 int u_end_lineno; /* the end line of the current stmt */
201 int u_end_col_offset; /* the end offset of the current stmt */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000202};
203
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000204/* This struct captures the global state of a compilation.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000205
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000206The u pointer points to the current compilation unit, while units
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000207for enclosing blocks are stored in c_stack. The u and c_stack are
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000208managed by compiler_enter_scope() and compiler_exit_scope().
Nick Coghlanaab9c2b2012-11-04 23:14:34 +1000209
210Note that we don't track recursion levels during compilation - the
211task of detecting and rejecting excessive levels of nesting is
212handled by the symbol analysis pass.
213
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000214*/
215
216struct compiler {
Victor Stinner14e461d2013-08-26 22:28:21 +0200217 PyObject *c_filename;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000218 struct symtable *c_st;
219 PyFutureFeatures *c_future; /* pointer to module's __future__ */
220 PyCompilerFlags *c_flags;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000221
Georg Brandl8334fd92010-12-04 10:26:46 +0000222 int c_optimize; /* optimization level */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000223 int c_interactive; /* true if in interactive mode */
224 int c_nestlevel;
INADA Naokic2e16072018-11-26 21:23:22 +0900225 PyObject *c_const_cache; /* Python dict holding all constants,
226 including names tuple */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000227 struct compiler_unit *u; /* compiler state for current block */
228 PyObject *c_stack; /* Python list holding compiler_unit ptrs */
229 PyArena *c_arena; /* pointer to memory allocation arena */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000230};
231
Brandt Bucher145bf262021-02-26 14:51:55 -0800232typedef struct {
Brandt Bucher0ad1e032021-05-02 13:02:10 -0700233 // A list of strings corresponding to name captures. It is used to track:
234 // - Repeated name assignments in the same pattern.
235 // - Different name assignments in alternatives.
236 // - The order of name assignments in alternatives.
Brandt Bucher145bf262021-02-26 14:51:55 -0800237 PyObject *stores;
Brandt Bucher0ad1e032021-05-02 13:02:10 -0700238 // If 0, any name captures against our subject will raise.
Brandt Bucher145bf262021-02-26 14:51:55 -0800239 int allow_irrefutable;
Brandt Bucher0ad1e032021-05-02 13:02:10 -0700240 // An array of blocks to jump to on failure. Jumping to fail_pop[i] will pop
241 // i items off of the stack. The end result looks like this (with each block
242 // falling through to the next):
243 // fail_pop[4]: POP_TOP
244 // fail_pop[3]: POP_TOP
245 // fail_pop[2]: POP_TOP
246 // fail_pop[1]: POP_TOP
247 // fail_pop[0]: NOP
248 basicblock **fail_pop;
249 // The current length of fail_pop.
250 Py_ssize_t fail_pop_size;
251 // The number of items on top of the stack that need to *stay* on top of the
252 // stack. Variable captures go beneath these. All of them will be popped on
253 // failure.
254 Py_ssize_t on_top;
Brandt Bucher145bf262021-02-26 14:51:55 -0800255} pattern_context;
256
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100257static int compiler_enter_scope(struct compiler *, identifier, int, void *, int);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000258static void compiler_free(struct compiler *);
259static basicblock *compiler_new_block(struct compiler *);
Andy Lester76d58772020-03-10 21:18:12 -0500260static int compiler_next_instr(basicblock *);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000261static int compiler_addop(struct compiler *, int);
Victor Stinnerf8e32212013-11-19 23:56:34 +0100262static int compiler_addop_i(struct compiler *, int, Py_ssize_t);
Mark Shannon582aaf12020-08-04 17:30:11 +0100263static int compiler_addop_j(struct compiler *, int, basicblock *);
Mark Shannon127dde52021-01-04 18:06:55 +0000264static int compiler_addop_j_noline(struct compiler *, int, basicblock *);
Brandt Bucher145bf262021-02-26 14:51:55 -0800265static int compiler_error(struct compiler *, const char *, ...);
Serhiy Storchaka62e44812019-02-16 08:12:19 +0200266static int compiler_warn(struct compiler *, const char *, ...);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000267static int compiler_nameop(struct compiler *, identifier, expr_context_ty);
268
269static PyCodeObject *compiler_mod(struct compiler *, mod_ty);
270static int compiler_visit_stmt(struct compiler *, stmt_ty);
271static int compiler_visit_keyword(struct compiler *, keyword_ty);
272static int compiler_visit_expr(struct compiler *, expr_ty);
273static int compiler_augassign(struct compiler *, stmt_ty);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -0700274static int compiler_annassign(struct compiler *, stmt_ty);
Serhiy Storchaka13d52c22020-03-10 18:52:34 +0200275static int compiler_subscript(struct compiler *, expr_ty);
276static int compiler_slice(struct compiler *, expr_ty);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000277
Andy Lester76d58772020-03-10 21:18:12 -0500278static int inplace_binop(operator_ty);
Pablo Galindoa5634c42020-09-16 19:42:00 +0100279static int are_all_items_const(asdl_expr_seq *, Py_ssize_t, Py_ssize_t);
Mark Shannon8473cf82020-12-15 11:07:50 +0000280
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000281
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -0500282static int compiler_with(struct compiler *, stmt_ty, int);
Yury Selivanov75445082015-05-11 22:57:16 -0400283static int compiler_async_with(struct compiler *, stmt_ty, int);
284static int compiler_async_for(struct compiler *, stmt_ty);
Victor Stinner976bb402016-03-23 11:36:19 +0100285static int compiler_call_helper(struct compiler *c, int n,
Pablo Galindoa5634c42020-09-16 19:42:00 +0100286 asdl_expr_seq *args,
287 asdl_keyword_seq *keywords);
Benjamin Peterson43af12b2011-05-29 11:43:10 -0500288static int compiler_try_except(struct compiler *, stmt_ty);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400289static int compiler_set_qualname(struct compiler *);
Guido van Rossumc2e20742006-02-27 22:32:47 +0000290
Yury Selivanov52c4e7c2016-09-09 10:36:01 -0700291static int compiler_sync_comprehension_generator(
292 struct compiler *c,
Pablo Galindoa5634c42020-09-16 19:42:00 +0100293 asdl_comprehension_seq *generators, int gen_index,
Serhiy Storchaka8c579b12020-02-12 12:18:59 +0200294 int depth,
Yury Selivanov52c4e7c2016-09-09 10:36:01 -0700295 expr_ty elt, expr_ty val, int type);
296
297static int compiler_async_comprehension_generator(
298 struct compiler *c,
Pablo Galindoa5634c42020-09-16 19:42:00 +0100299 asdl_comprehension_seq *generators, int gen_index,
Serhiy Storchaka8c579b12020-02-12 12:18:59 +0200300 int depth,
Yury Selivanov52c4e7c2016-09-09 10:36:01 -0700301 expr_ty elt, expr_ty val, int type);
302
Nick Coghlan1e7b8582021-04-29 15:58:44 +1000303static int compiler_pattern(struct compiler *, pattern_ty, pattern_context *);
Brandt Bucher145bf262021-02-26 14:51:55 -0800304static int compiler_match(struct compiler *, stmt_ty);
Nick Coghlan1e7b8582021-04-29 15:58:44 +1000305static int compiler_pattern_subpattern(struct compiler *, pattern_ty,
Brandt Bucher145bf262021-02-26 14:51:55 -0800306 pattern_context *);
307
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000308static PyCodeObject *assemble(struct compiler *, int addNone);
Mark Shannon332cd5e2018-01-30 00:41:04 +0000309static PyObject *__doc__, *__annotations__;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000310
Benjamin Peterson9e77f722015-05-07 18:41:47 -0400311#define CAPSULE_NAME "compile.c compiler unit"
Benjamin Petersonb173f782009-05-05 22:31:58 +0000312
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000313PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000314_Py_Mangle(PyObject *privateobj, PyObject *ident)
Michael W. Hudson60934622004-08-12 17:56:29 +0000315{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000316 /* Name mangling: __private becomes _classname__private.
317 This is independent from how the name is used. */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200318 PyObject *result;
319 size_t nlen, plen, ipriv;
320 Py_UCS4 maxchar;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000321 if (privateobj == NULL || !PyUnicode_Check(privateobj) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200322 PyUnicode_READ_CHAR(ident, 0) != '_' ||
323 PyUnicode_READ_CHAR(ident, 1) != '_') {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000324 Py_INCREF(ident);
325 return ident;
326 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200327 nlen = PyUnicode_GET_LENGTH(ident);
328 plen = PyUnicode_GET_LENGTH(privateobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000329 /* Don't mangle __id__ or names with dots.
Guido van Rossumd8faa362007-04-27 19:54:29 +0000330
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000331 The only time a name with a dot can occur is when
332 we are compiling an import statement that has a
333 package name.
Guido van Rossumd8faa362007-04-27 19:54:29 +0000334
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000335 TODO(jhylton): Decide whether we want to support
336 mangling of the module name, e.g. __M.X.
337 */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200338 if ((PyUnicode_READ_CHAR(ident, nlen-1) == '_' &&
339 PyUnicode_READ_CHAR(ident, nlen-2) == '_') ||
340 PyUnicode_FindChar(ident, '.', 0, nlen, 1) != -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000341 Py_INCREF(ident);
342 return ident; /* Don't mangle __whatever__ */
343 }
344 /* Strip leading underscores from class name */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200345 ipriv = 0;
346 while (PyUnicode_READ_CHAR(privateobj, ipriv) == '_')
347 ipriv++;
348 if (ipriv == plen) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000349 Py_INCREF(ident);
350 return ident; /* Don't mangle if class is just underscores */
351 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200352 plen -= ipriv;
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000353
Antoine Pitrou55bff892013-04-06 21:21:04 +0200354 if (plen + nlen >= PY_SSIZE_T_MAX - 1) {
355 PyErr_SetString(PyExc_OverflowError,
356 "private identifier too large to be mangled");
357 return NULL;
358 }
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000359
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200360 maxchar = PyUnicode_MAX_CHAR_VALUE(ident);
361 if (PyUnicode_MAX_CHAR_VALUE(privateobj) > maxchar)
362 maxchar = PyUnicode_MAX_CHAR_VALUE(privateobj);
363
364 result = PyUnicode_New(1 + nlen + plen, maxchar);
365 if (!result)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000366 return 0;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200367 /* ident = "_" + priv[ipriv:] + ident # i.e. 1+plen+nlen bytes */
368 PyUnicode_WRITE(PyUnicode_KIND(result), PyUnicode_DATA(result), 0, '_');
Victor Stinner6c7a52a2011-09-28 21:39:17 +0200369 if (PyUnicode_CopyCharacters(result, 1, privateobj, ipriv, plen) < 0) {
370 Py_DECREF(result);
371 return NULL;
372 }
373 if (PyUnicode_CopyCharacters(result, plen+1, ident, 0, nlen) < 0) {
374 Py_DECREF(result);
375 return NULL;
376 }
Victor Stinner8f825062012-04-27 13:55:39 +0200377 assert(_PyUnicode_CheckConsistency(result, 1));
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200378 return result;
Michael W. Hudson60934622004-08-12 17:56:29 +0000379}
380
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000381static int
382compiler_init(struct compiler *c)
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000383{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000384 memset(c, 0, sizeof(struct compiler));
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000385
INADA Naokic2e16072018-11-26 21:23:22 +0900386 c->c_const_cache = PyDict_New();
387 if (!c->c_const_cache) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000388 return 0;
INADA Naokic2e16072018-11-26 21:23:22 +0900389 }
390
391 c->c_stack = PyList_New(0);
392 if (!c->c_stack) {
393 Py_CLEAR(c->c_const_cache);
394 return 0;
395 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000396
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000397 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000398}
399
400PyCodeObject *
Victor Stinnera81fca62021-03-24 00:51:50 +0100401_PyAST_Compile(mod_ty mod, PyObject *filename, PyCompilerFlags *flags,
402 int optimize, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000403{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000404 struct compiler c;
405 PyCodeObject *co = NULL;
Victor Stinner37d66d72019-06-13 02:16:41 +0200406 PyCompilerFlags local_flags = _PyCompilerFlags_INIT;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000407 int merged;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000408
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000409 if (!__doc__) {
410 __doc__ = PyUnicode_InternFromString("__doc__");
411 if (!__doc__)
412 return NULL;
413 }
Mark Shannon332cd5e2018-01-30 00:41:04 +0000414 if (!__annotations__) {
415 __annotations__ = PyUnicode_InternFromString("__annotations__");
416 if (!__annotations__)
417 return NULL;
418 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000419 if (!compiler_init(&c))
420 return NULL;
Victor Stinner14e461d2013-08-26 22:28:21 +0200421 Py_INCREF(filename);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000422 c.c_filename = filename;
423 c.c_arena = arena;
Victor Stinnera81fca62021-03-24 00:51:50 +0100424 c.c_future = _PyFuture_FromAST(mod, filename);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000425 if (c.c_future == NULL)
426 goto finally;
427 if (!flags) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000428 flags = &local_flags;
429 }
430 merged = c.c_future->ff_features | flags->cf_flags;
431 c.c_future->ff_features = merged;
432 flags->cf_flags = merged;
433 c.c_flags = flags;
Victor Stinnerda7933e2020-04-13 03:04:28 +0200434 c.c_optimize = (optimize == -1) ? _Py_GetConfig()->optimization_level : optimize;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000435 c.c_nestlevel = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000436
Pablo Galindod112c602020-03-18 23:02:09 +0000437 _PyASTOptimizeState state;
438 state.optimize = c.c_optimize;
439 state.ff_features = merged;
440
441 if (!_PyAST_Optimize(mod, arena, &state)) {
INADA Naoki7ea143a2017-12-14 16:47:20 +0900442 goto finally;
443 }
444
Victor Stinner28ad12f2021-03-19 12:41:49 +0100445 c.c_st = _PySymtable_Build(mod, filename, c.c_future);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000446 if (c.c_st == NULL) {
447 if (!PyErr_Occurred())
448 PyErr_SetString(PyExc_SystemError, "no symtable");
449 goto finally;
450 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000451
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000452 co = compiler_mod(&c, mod);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000453
Thomas Wouters1175c432006-02-27 22:49:54 +0000454 finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000455 compiler_free(&c);
456 assert(co || PyErr_Occurred());
457 return co;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000458}
459
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000460static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000461compiler_free(struct compiler *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000462{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000463 if (c->c_st)
Victor Stinner28ad12f2021-03-19 12:41:49 +0100464 _PySymtable_Free(c->c_st);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000465 if (c->c_future)
466 PyObject_Free(c->c_future);
Victor Stinner14e461d2013-08-26 22:28:21 +0200467 Py_XDECREF(c->c_filename);
INADA Naokic2e16072018-11-26 21:23:22 +0900468 Py_DECREF(c->c_const_cache);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000469 Py_DECREF(c->c_stack);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000470}
471
Guido van Rossum79f25d91997-04-29 20:08:16 +0000472static PyObject *
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000473list2dict(PyObject *list)
Guido van Rossum2dff9911992-09-03 20:50:59 +0000474{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000475 Py_ssize_t i, n;
476 PyObject *v, *k;
477 PyObject *dict = PyDict_New();
478 if (!dict) return NULL;
Guido van Rossumd076c731998-10-07 19:42:25 +0000479
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000480 n = PyList_Size(list);
481 for (i = 0; i < n; i++) {
Victor Stinnerad9a0662013-11-19 22:23:20 +0100482 v = PyLong_FromSsize_t(i);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000483 if (!v) {
484 Py_DECREF(dict);
485 return NULL;
486 }
487 k = PyList_GET_ITEM(list, i);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +0300488 if (PyDict_SetItem(dict, k, v) < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000489 Py_DECREF(v);
490 Py_DECREF(dict);
491 return NULL;
492 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000493 Py_DECREF(v);
494 }
495 return dict;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000496}
497
498/* Return new dict containing names from src that match scope(s).
499
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000500src is a symbol table dictionary. If the scope of a name matches
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000501either scope_type or flag is set, insert it into the new dict. The
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000502values are integers, starting at offset and increasing by one for
503each key.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000504*/
505
506static PyObject *
Victor Stinnerad9a0662013-11-19 22:23:20 +0100507dictbytype(PyObject *src, int scope_type, int flag, Py_ssize_t offset)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000508{
Benjamin Peterson51ab2832012-07-18 15:12:47 -0700509 Py_ssize_t i = offset, scope, num_keys, key_i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000510 PyObject *k, *v, *dest = PyDict_New();
Meador Inge2ca63152012-07-18 14:20:11 -0500511 PyObject *sorted_keys;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000512
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000513 assert(offset >= 0);
514 if (dest == NULL)
515 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000516
Meador Inge2ca63152012-07-18 14:20:11 -0500517 /* Sort the keys so that we have a deterministic order on the indexes
518 saved in the returned dictionary. These indexes are used as indexes
519 into the free and cell var storage. Therefore if they aren't
520 deterministic, then the generated bytecode is not deterministic.
521 */
522 sorted_keys = PyDict_Keys(src);
523 if (sorted_keys == NULL)
524 return NULL;
525 if (PyList_Sort(sorted_keys) != 0) {
526 Py_DECREF(sorted_keys);
527 return NULL;
528 }
Meador Ingef69e24e2012-07-18 16:41:03 -0500529 num_keys = PyList_GET_SIZE(sorted_keys);
Meador Inge2ca63152012-07-18 14:20:11 -0500530
531 for (key_i = 0; key_i < num_keys; key_i++) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000532 /* XXX this should probably be a macro in symtable.h */
533 long vi;
Meador Inge2ca63152012-07-18 14:20:11 -0500534 k = PyList_GET_ITEM(sorted_keys, key_i);
Serhiy Storchakafb5db7e2020-10-26 08:43:39 +0200535 v = PyDict_GetItemWithError(src, k);
536 assert(v && PyLong_Check(v));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000537 vi = PyLong_AS_LONG(v);
538 scope = (vi >> SCOPE_OFFSET) & SCOPE_MASK;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000539
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000540 if (scope == scope_type || vi & flag) {
Serhiy Storchakad70c2a62018-04-20 16:01:25 +0300541 PyObject *item = PyLong_FromSsize_t(i);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000542 if (item == NULL) {
Meador Inge2ca63152012-07-18 14:20:11 -0500543 Py_DECREF(sorted_keys);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000544 Py_DECREF(dest);
545 return NULL;
546 }
547 i++;
Serhiy Storchakad70c2a62018-04-20 16:01:25 +0300548 if (PyDict_SetItem(dest, k, item) < 0) {
Meador Inge2ca63152012-07-18 14:20:11 -0500549 Py_DECREF(sorted_keys);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000550 Py_DECREF(item);
551 Py_DECREF(dest);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000552 return NULL;
553 }
554 Py_DECREF(item);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000555 }
556 }
Meador Inge2ca63152012-07-18 14:20:11 -0500557 Py_DECREF(sorted_keys);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000558 return dest;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000559}
560
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000561static void
562compiler_unit_check(struct compiler_unit *u)
563{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000564 basicblock *block;
565 for (block = u->u_blocks; block != NULL; block = block->b_list) {
Victor Stinnerba7a99d2021-01-30 01:46:44 +0100566 assert(!_PyMem_IsPtrFreed(block));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000567 if (block->b_instr != NULL) {
568 assert(block->b_ialloc > 0);
Mark Shannon6e8128f2020-07-30 10:03:00 +0100569 assert(block->b_iused >= 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000570 assert(block->b_ialloc >= block->b_iused);
571 }
572 else {
573 assert (block->b_iused == 0);
574 assert (block->b_ialloc == 0);
575 }
576 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000577}
578
579static void
580compiler_unit_free(struct compiler_unit *u)
581{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000582 basicblock *b, *next;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000583
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000584 compiler_unit_check(u);
585 b = u->u_blocks;
586 while (b != NULL) {
587 if (b->b_instr)
588 PyObject_Free((void *)b->b_instr);
589 next = b->b_list;
590 PyObject_Free((void *)b);
591 b = next;
592 }
593 Py_CLEAR(u->u_ste);
594 Py_CLEAR(u->u_name);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400595 Py_CLEAR(u->u_qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000596 Py_CLEAR(u->u_consts);
597 Py_CLEAR(u->u_names);
598 Py_CLEAR(u->u_varnames);
599 Py_CLEAR(u->u_freevars);
600 Py_CLEAR(u->u_cellvars);
601 Py_CLEAR(u->u_private);
602 PyObject_Free(u);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000603}
604
605static int
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100606compiler_enter_scope(struct compiler *c, identifier name,
607 int scope_type, void *key, int lineno)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000608{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000609 struct compiler_unit *u;
Victor Stinnerfc6f2ef2016-02-27 02:19:22 +0100610 basicblock *block;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000611
Andy Lester7668a8b2020-03-24 23:26:44 -0500612 u = (struct compiler_unit *)PyObject_Calloc(1, sizeof(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000613 struct compiler_unit));
614 if (!u) {
615 PyErr_NoMemory();
616 return 0;
617 }
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100618 u->u_scope_type = scope_type;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000619 u->u_argcount = 0;
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100620 u->u_posonlyargcount = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000621 u->u_kwonlyargcount = 0;
622 u->u_ste = PySymtable_Lookup(c->c_st, key);
623 if (!u->u_ste) {
624 compiler_unit_free(u);
625 return 0;
626 }
627 Py_INCREF(name);
628 u->u_name = name;
629 u->u_varnames = list2dict(u->u_ste->ste_varnames);
630 u->u_cellvars = dictbytype(u->u_ste->ste_symbols, CELL, 0, 0);
631 if (!u->u_varnames || !u->u_cellvars) {
632 compiler_unit_free(u);
633 return 0;
634 }
Benjamin Peterson312595c2013-05-15 15:26:42 -0500635 if (u->u_ste->ste_needs_class_closure) {
Martin Panter7462b6492015-11-02 03:37:02 +0000636 /* Cook up an implicit __class__ cell. */
Benjamin Peterson312595c2013-05-15 15:26:42 -0500637 _Py_IDENTIFIER(__class__);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +0300638 PyObject *name;
Benjamin Peterson312595c2013-05-15 15:26:42 -0500639 int res;
640 assert(u->u_scope_type == COMPILER_SCOPE_CLASS);
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +0200641 assert(PyDict_GET_SIZE(u->u_cellvars) == 0);
Benjamin Peterson312595c2013-05-15 15:26:42 -0500642 name = _PyUnicode_FromId(&PyId___class__);
643 if (!name) {
644 compiler_unit_free(u);
645 return 0;
646 }
Victor Stinnerc9bc2902020-10-27 02:24:34 +0100647 res = PyDict_SetItem(u->u_cellvars, name, _PyLong_GetZero());
Benjamin Peterson312595c2013-05-15 15:26:42 -0500648 if (res < 0) {
649 compiler_unit_free(u);
650 return 0;
651 }
652 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000653
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000654 u->u_freevars = dictbytype(u->u_ste->ste_symbols, FREE, DEF_FREE_CLASS,
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +0200655 PyDict_GET_SIZE(u->u_cellvars));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000656 if (!u->u_freevars) {
657 compiler_unit_free(u);
658 return 0;
659 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000660
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000661 u->u_blocks = NULL;
662 u->u_nfblocks = 0;
663 u->u_firstlineno = lineno;
664 u->u_lineno = 0;
Benjamin Petersond4efd9e2010-09-20 23:02:10 +0000665 u->u_col_offset = 0;
Pablo Galindoa77aac42021-04-23 14:27:05 +0100666 u->u_end_lineno = 0;
667 u->u_end_col_offset = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000668 u->u_consts = PyDict_New();
669 if (!u->u_consts) {
670 compiler_unit_free(u);
671 return 0;
672 }
673 u->u_names = PyDict_New();
674 if (!u->u_names) {
675 compiler_unit_free(u);
676 return 0;
677 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000678
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000679 u->u_private = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000680
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000681 /* Push the old compiler_unit on the stack. */
682 if (c->u) {
Benjamin Peterson9e77f722015-05-07 18:41:47 -0400683 PyObject *capsule = PyCapsule_New(c->u, CAPSULE_NAME, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000684 if (!capsule || PyList_Append(c->c_stack, capsule) < 0) {
685 Py_XDECREF(capsule);
686 compiler_unit_free(u);
687 return 0;
688 }
689 Py_DECREF(capsule);
690 u->u_private = c->u->u_private;
691 Py_XINCREF(u->u_private);
692 }
693 c->u = u;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000694
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000695 c->c_nestlevel++;
Victor Stinnerfc6f2ef2016-02-27 02:19:22 +0100696
697 block = compiler_new_block(c);
698 if (block == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000699 return 0;
Victor Stinnerfc6f2ef2016-02-27 02:19:22 +0100700 c->u->u_curblock = block;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000701
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400702 if (u->u_scope_type != COMPILER_SCOPE_MODULE) {
703 if (!compiler_set_qualname(c))
704 return 0;
705 }
706
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000707 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000708}
709
Neil Schemenauerc396d9e2005-10-25 06:30:14 +0000710static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000711compiler_exit_scope(struct compiler *c)
712{
Victor Stinnera6192632021-01-29 16:53:03 +0100713 // Don't call PySequence_DelItem() with an exception raised
714 PyObject *exc_type, *exc_val, *exc_tb;
715 PyErr_Fetch(&exc_type, &exc_val, &exc_tb);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000716
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000717 c->c_nestlevel--;
718 compiler_unit_free(c->u);
719 /* Restore c->u to the parent unit. */
Victor Stinnera6192632021-01-29 16:53:03 +0100720 Py_ssize_t n = PyList_GET_SIZE(c->c_stack) - 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000721 if (n >= 0) {
Victor Stinnera6192632021-01-29 16:53:03 +0100722 PyObject *capsule = PyList_GET_ITEM(c->c_stack, n);
Benjamin Peterson9e77f722015-05-07 18:41:47 -0400723 c->u = (struct compiler_unit *)PyCapsule_GetPointer(capsule, CAPSULE_NAME);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000724 assert(c->u);
725 /* we are deleting from a list so this really shouldn't fail */
Victor Stinnera6192632021-01-29 16:53:03 +0100726 if (PySequence_DelItem(c->c_stack, n) < 0) {
Victor Stinnerba7a99d2021-01-30 01:46:44 +0100727 _PyErr_WriteUnraisableMsg("on removing the last compiler "
728 "stack item", NULL);
Victor Stinnera6192632021-01-29 16:53:03 +0100729 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000730 compiler_unit_check(c->u);
731 }
Victor Stinnera6192632021-01-29 16:53:03 +0100732 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000733 c->u = NULL;
Victor Stinnera6192632021-01-29 16:53:03 +0100734 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000735
Victor Stinnera6192632021-01-29 16:53:03 +0100736 PyErr_Restore(exc_type, exc_val, exc_tb);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000737}
738
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400739static int
740compiler_set_qualname(struct compiler *c)
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100741{
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100742 _Py_static_string(dot, ".");
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400743 _Py_static_string(dot_locals, ".<locals>");
744 Py_ssize_t stack_size;
745 struct compiler_unit *u = c->u;
746 PyObject *name, *base, *dot_str, *dot_locals_str;
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100747
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400748 base = NULL;
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100749 stack_size = PyList_GET_SIZE(c->c_stack);
Benjamin Petersona8a38b82013-10-19 16:14:39 -0400750 assert(stack_size >= 1);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400751 if (stack_size > 1) {
752 int scope, force_global = 0;
753 struct compiler_unit *parent;
754 PyObject *mangled, *capsule;
755
Benjamin Peterson3d9e4812013-10-19 16:01:13 -0400756 capsule = PyList_GET_ITEM(c->c_stack, stack_size - 1);
Benjamin Peterson9e77f722015-05-07 18:41:47 -0400757 parent = (struct compiler_unit *)PyCapsule_GetPointer(capsule, CAPSULE_NAME);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400758 assert(parent);
759
Yury Selivanov75445082015-05-11 22:57:16 -0400760 if (u->u_scope_type == COMPILER_SCOPE_FUNCTION
761 || u->u_scope_type == COMPILER_SCOPE_ASYNC_FUNCTION
762 || u->u_scope_type == COMPILER_SCOPE_CLASS) {
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400763 assert(u->u_name);
764 mangled = _Py_Mangle(parent->u_private, u->u_name);
765 if (!mangled)
766 return 0;
Victor Stinner28ad12f2021-03-19 12:41:49 +0100767 scope = _PyST_GetScope(parent->u_ste, mangled);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400768 Py_DECREF(mangled);
769 assert(scope != GLOBAL_IMPLICIT);
770 if (scope == GLOBAL_EXPLICIT)
771 force_global = 1;
772 }
773
774 if (!force_global) {
775 if (parent->u_scope_type == COMPILER_SCOPE_FUNCTION
Yury Selivanov75445082015-05-11 22:57:16 -0400776 || parent->u_scope_type == COMPILER_SCOPE_ASYNC_FUNCTION
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400777 || parent->u_scope_type == COMPILER_SCOPE_LAMBDA) {
778 dot_locals_str = _PyUnicode_FromId(&dot_locals);
779 if (dot_locals_str == NULL)
780 return 0;
781 base = PyUnicode_Concat(parent->u_qualname, dot_locals_str);
782 if (base == NULL)
783 return 0;
784 }
785 else {
786 Py_INCREF(parent->u_qualname);
787 base = parent->u_qualname;
Benjamin Peterson3d9e4812013-10-19 16:01:13 -0400788 }
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100789 }
790 }
Benjamin Peterson3d9e4812013-10-19 16:01:13 -0400791
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400792 if (base != NULL) {
793 dot_str = _PyUnicode_FromId(&dot);
794 if (dot_str == NULL) {
795 Py_DECREF(base);
796 return 0;
797 }
798 name = PyUnicode_Concat(base, dot_str);
799 Py_DECREF(base);
800 if (name == NULL)
801 return 0;
802 PyUnicode_Append(&name, u->u_name);
803 if (name == NULL)
804 return 0;
805 }
806 else {
807 Py_INCREF(u->u_name);
808 name = u->u_name;
809 }
810 u->u_qualname = name;
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100811
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400812 return 1;
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100813}
814
Eric V. Smith235a6f02015-09-19 14:51:32 -0400815
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000816/* Allocate a new block and return a pointer to it.
817 Returns NULL on error.
818*/
819
820static basicblock *
821compiler_new_block(struct compiler *c)
822{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000823 basicblock *b;
824 struct compiler_unit *u;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000825
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000826 u = c->u;
Andy Lester7668a8b2020-03-24 23:26:44 -0500827 b = (basicblock *)PyObject_Calloc(1, sizeof(basicblock));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000828 if (b == NULL) {
829 PyErr_NoMemory();
830 return NULL;
831 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000832 /* Extend the singly linked list of blocks with new block. */
833 b->b_list = u->u_blocks;
834 u->u_blocks = b;
835 return b;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000836}
837
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000838static basicblock *
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000839compiler_next_block(struct compiler *c)
840{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000841 basicblock *block = compiler_new_block(c);
842 if (block == NULL)
843 return NULL;
844 c->u->u_curblock->b_next = block;
845 c->u->u_curblock = block;
846 return block;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000847}
848
849static basicblock *
850compiler_use_next_block(struct compiler *c, basicblock *block)
851{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000852 assert(block != NULL);
853 c->u->u_curblock->b_next = block;
854 c->u->u_curblock = block;
855 return block;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000856}
857
Mark Shannon5977a792020-12-02 13:31:40 +0000858static basicblock *
859compiler_copy_block(struct compiler *c, basicblock *block)
860{
861 /* Cannot copy a block if it has a fallthrough, since
862 * a block can only have one fallthrough predecessor.
863 */
864 assert(block->b_nofallthrough);
865 basicblock *result = compiler_next_block(c);
866 if (result == NULL) {
867 return NULL;
868 }
869 for (int i = 0; i < block->b_iused; i++) {
870 int n = compiler_next_instr(result);
871 if (n < 0) {
872 return NULL;
873 }
874 result->b_instr[n] = block->b_instr[i];
875 }
876 result->b_exit = block->b_exit;
Mark Shannon3bd60352021-01-13 12:05:43 +0000877 result->b_nofallthrough = 1;
Mark Shannon5977a792020-12-02 13:31:40 +0000878 return result;
879}
880
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000881/* Returns the offset of the next instruction in the current block's
882 b_instr array. Resizes the b_instr as necessary.
883 Returns -1 on failure.
Thomas Wouters89f507f2006-12-13 04:49:30 +0000884*/
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000885
886static int
Andy Lester76d58772020-03-10 21:18:12 -0500887compiler_next_instr(basicblock *b)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000888{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000889 assert(b != NULL);
890 if (b->b_instr == NULL) {
Andy Lester7668a8b2020-03-24 23:26:44 -0500891 b->b_instr = (struct instr *)PyObject_Calloc(
892 DEFAULT_BLOCK_SIZE, sizeof(struct instr));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000893 if (b->b_instr == NULL) {
894 PyErr_NoMemory();
895 return -1;
896 }
897 b->b_ialloc = DEFAULT_BLOCK_SIZE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000898 }
899 else if (b->b_iused == b->b_ialloc) {
900 struct instr *tmp;
901 size_t oldsize, newsize;
902 oldsize = b->b_ialloc * sizeof(struct instr);
903 newsize = oldsize << 1;
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000904
Benjamin Peterson2f8bfef2016-09-07 09:26:18 -0700905 if (oldsize > (SIZE_MAX >> 1)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000906 PyErr_NoMemory();
907 return -1;
908 }
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000909
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000910 if (newsize == 0) {
911 PyErr_NoMemory();
912 return -1;
913 }
914 b->b_ialloc <<= 1;
915 tmp = (struct instr *)PyObject_Realloc(
916 (void *)b->b_instr, newsize);
917 if (tmp == NULL) {
918 PyErr_NoMemory();
919 return -1;
920 }
921 b->b_instr = tmp;
922 memset((char *)b->b_instr + oldsize, 0, newsize - oldsize);
923 }
924 return b->b_iused++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000925}
926
Serhiy Storchaka61cb3d02020-03-17 18:07:30 +0200927/* Set the line number and column offset for the following instructions.
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000928
Christian Heimes2202f872008-02-06 14:31:34 +0000929 The line number is reset in the following cases:
930 - when entering a new scope
931 - on each statement
Serhiy Storchaka61cb3d02020-03-17 18:07:30 +0200932 - on each expression and sub-expression
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +0200933 - before the "except" and "finally" clauses
Thomas Wouters89f507f2006-12-13 04:49:30 +0000934*/
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000935
Serhiy Storchaka61cb3d02020-03-17 18:07:30 +0200936#define SET_LOC(c, x) \
937 (c)->u->u_lineno = (x)->lineno; \
Pablo Galindoa77aac42021-04-23 14:27:05 +0100938 (c)->u->u_col_offset = (x)->col_offset; \
939 (c)->u->u_end_lineno = (x)->end_lineno; \
940 (c)->u->u_end_col_offset = (x)->end_col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000941
Serhiy Storchakad4864c62018-01-09 21:54:52 +0200942/* Return the stack effect of opcode with argument oparg.
943
944 Some opcodes have different stack effect when jump to the target and
945 when not jump. The 'jump' parameter specifies the case:
946
947 * 0 -- when not jump
948 * 1 -- when jump
949 * -1 -- maximal
950 */
Serhiy Storchakad4864c62018-01-09 21:54:52 +0200951static int
952stack_effect(int opcode, int oparg, int jump)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000953{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000954 switch (opcode) {
Serhiy Storchaka57faf342018-04-25 22:04:06 +0300955 case NOP:
956 case EXTENDED_ARG:
957 return 0;
958
Serhiy Storchakad4864c62018-01-09 21:54:52 +0200959 /* Stack manipulation */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000960 case POP_TOP:
961 return -1;
962 case ROT_TWO:
963 case ROT_THREE:
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +0200964 case ROT_FOUR:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000965 return 0;
966 case DUP_TOP:
967 return 1;
Antoine Pitrou74a69fa2010-09-04 18:43:52 +0000968 case DUP_TOP_TWO:
969 return 2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000970
Serhiy Storchakad4864c62018-01-09 21:54:52 +0200971 /* Unary operators */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000972 case UNARY_POSITIVE:
973 case UNARY_NEGATIVE:
974 case UNARY_NOT:
975 case UNARY_INVERT:
976 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000977
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000978 case SET_ADD:
979 case LIST_APPEND:
980 return -1;
981 case MAP_ADD:
982 return -2;
Neal Norwitz10be2ea2006-03-03 20:29:11 +0000983
Serhiy Storchakad4864c62018-01-09 21:54:52 +0200984 /* Binary operators */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000985 case BINARY_POWER:
986 case BINARY_MULTIPLY:
Benjamin Petersond51374e2014-04-09 23:55:56 -0400987 case BINARY_MATRIX_MULTIPLY:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000988 case BINARY_MODULO:
989 case BINARY_ADD:
990 case BINARY_SUBTRACT:
991 case BINARY_SUBSCR:
992 case BINARY_FLOOR_DIVIDE:
993 case BINARY_TRUE_DIVIDE:
994 return -1;
995 case INPLACE_FLOOR_DIVIDE:
996 case INPLACE_TRUE_DIVIDE:
997 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000998
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000999 case INPLACE_ADD:
1000 case INPLACE_SUBTRACT:
1001 case INPLACE_MULTIPLY:
Benjamin Petersond51374e2014-04-09 23:55:56 -04001002 case INPLACE_MATRIX_MULTIPLY:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001003 case INPLACE_MODULO:
1004 return -1;
1005 case STORE_SUBSCR:
1006 return -3;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001007 case DELETE_SUBSCR:
1008 return -2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001009
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001010 case BINARY_LSHIFT:
1011 case BINARY_RSHIFT:
1012 case BINARY_AND:
1013 case BINARY_XOR:
1014 case BINARY_OR:
1015 return -1;
1016 case INPLACE_POWER:
1017 return -1;
1018 case GET_ITER:
1019 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001020
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001021 case PRINT_EXPR:
1022 return -1;
1023 case LOAD_BUILD_CLASS:
1024 return 1;
1025 case INPLACE_LSHIFT:
1026 case INPLACE_RSHIFT:
1027 case INPLACE_AND:
1028 case INPLACE_XOR:
1029 case INPLACE_OR:
1030 return -1;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001031
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001032 case SETUP_WITH:
Serhiy Storchakad4864c62018-01-09 21:54:52 +02001033 /* 1 in the normal flow.
1034 * Restore the stack position and push 6 values before jumping to
1035 * the handler if an exception be raised. */
1036 return jump ? 6 : 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001037 case RETURN_VALUE:
1038 return -1;
1039 case IMPORT_STAR:
1040 return -1;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001041 case SETUP_ANNOTATIONS:
1042 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001043 case YIELD_VALUE:
1044 return 0;
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05001045 case YIELD_FROM:
1046 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001047 case POP_BLOCK:
1048 return 0;
1049 case POP_EXCEPT:
Serhiy Storchakad4864c62018-01-09 21:54:52 +02001050 return -3;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001051
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001052 case STORE_NAME:
1053 return -1;
1054 case DELETE_NAME:
1055 return 0;
1056 case UNPACK_SEQUENCE:
1057 return oparg-1;
1058 case UNPACK_EX:
1059 return (oparg&0xFF) + (oparg>>8);
1060 case FOR_ITER:
Serhiy Storchakad4864c62018-01-09 21:54:52 +02001061 /* -1 at end of iterator, 1 if continue iterating. */
1062 return jump > 0 ? -1 : 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001063
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001064 case STORE_ATTR:
1065 return -2;
1066 case DELETE_ATTR:
1067 return -1;
1068 case STORE_GLOBAL:
1069 return -1;
1070 case DELETE_GLOBAL:
1071 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001072 case LOAD_CONST:
1073 return 1;
1074 case LOAD_NAME:
1075 return 1;
1076 case BUILD_TUPLE:
1077 case BUILD_LIST:
1078 case BUILD_SET:
Serhiy Storchakaea525a22016-09-06 22:07:53 +03001079 case BUILD_STRING:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001080 return 1-oparg;
1081 case BUILD_MAP:
Benjamin Petersonb6855152015-09-10 21:02:39 -07001082 return 1 - 2*oparg;
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03001083 case BUILD_CONST_KEY_MAP:
1084 return -oparg;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001085 case LOAD_ATTR:
1086 return 0;
1087 case COMPARE_OP:
Mark Shannon9af0e472020-01-14 10:12:45 +00001088 case IS_OP:
1089 case CONTAINS_OP:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001090 return -1;
Mark Shannon9af0e472020-01-14 10:12:45 +00001091 case JUMP_IF_NOT_EXC_MATCH:
1092 return -2;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001093 case IMPORT_NAME:
1094 return -1;
1095 case IMPORT_FROM:
1096 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001097
Serhiy Storchakad4864c62018-01-09 21:54:52 +02001098 /* Jumps */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001099 case JUMP_FORWARD:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001100 case JUMP_ABSOLUTE:
1101 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001102
Serhiy Storchakad4864c62018-01-09 21:54:52 +02001103 case JUMP_IF_TRUE_OR_POP:
1104 case JUMP_IF_FALSE_OR_POP:
1105 return jump ? 0 : -1;
1106
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001107 case POP_JUMP_IF_FALSE:
1108 case POP_JUMP_IF_TRUE:
1109 return -1;
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00001110
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001111 case LOAD_GLOBAL:
1112 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001113
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001114 /* Exception handling */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001115 case SETUP_FINALLY:
Serhiy Storchakad4864c62018-01-09 21:54:52 +02001116 /* 0 in the normal flow.
1117 * Restore the stack position and push 6 values before jumping to
1118 * the handler if an exception be raised. */
1119 return jump ? 6 : 0;
Mark Shannonfee55262019-11-21 09:11:43 +00001120 case RERAISE:
1121 return -3;
1122
1123 case WITH_EXCEPT_START:
1124 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001125
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001126 case LOAD_FAST:
1127 return 1;
1128 case STORE_FAST:
1129 return -1;
1130 case DELETE_FAST:
1131 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001132
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001133 case RAISE_VARARGS:
1134 return -oparg;
Serhiy Storchakad4864c62018-01-09 21:54:52 +02001135
1136 /* Functions and calls */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001137 case CALL_FUNCTION:
Victor Stinnerf9b760f2016-09-09 10:17:08 -07001138 return -oparg;
Yury Selivanovf2392132016-12-13 19:03:51 -05001139 case CALL_METHOD:
1140 return -oparg-1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001141 case CALL_FUNCTION_KW:
Victor Stinnerf9b760f2016-09-09 10:17:08 -07001142 return -oparg-1;
1143 case CALL_FUNCTION_EX:
Matthieu Dartiailh3a9ac822017-02-21 14:25:22 +01001144 return -1 - ((oparg & 0x01) != 0);
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001145 case MAKE_FUNCTION:
1146 return -1 - ((oparg & 0x01) != 0) - ((oparg & 0x02) != 0) -
1147 ((oparg & 0x04) != 0) - ((oparg & 0x08) != 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001148 case BUILD_SLICE:
1149 if (oparg == 3)
1150 return -2;
1151 else
1152 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001153
Serhiy Storchakad4864c62018-01-09 21:54:52 +02001154 /* Closures */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001155 case LOAD_CLOSURE:
1156 return 1;
1157 case LOAD_DEREF:
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04001158 case LOAD_CLASSDEREF:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001159 return 1;
1160 case STORE_DEREF:
1161 return -1;
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00001162 case DELETE_DEREF:
1163 return 0;
Serhiy Storchakad4864c62018-01-09 21:54:52 +02001164
1165 /* Iterators and generators */
Yury Selivanov75445082015-05-11 22:57:16 -04001166 case GET_AWAITABLE:
1167 return 0;
1168 case SETUP_ASYNC_WITH:
Serhiy Storchakad4864c62018-01-09 21:54:52 +02001169 /* 0 in the normal flow.
1170 * Restore the stack position to the position before the result
1171 * of __aenter__ and push 6 values before jumping to the handler
1172 * if an exception be raised. */
1173 return jump ? -1 + 6 : 0;
Yury Selivanov75445082015-05-11 22:57:16 -04001174 case BEFORE_ASYNC_WITH:
1175 return 1;
1176 case GET_AITER:
1177 return 0;
1178 case GET_ANEXT:
1179 return 1;
Yury Selivanov5376ba92015-06-22 12:19:30 -04001180 case GET_YIELD_FROM_ITER:
1181 return 0;
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02001182 case END_ASYNC_FOR:
1183 return -7;
Eric V. Smitha78c7952015-11-03 12:45:05 -05001184 case FORMAT_VALUE:
1185 /* If there's a fmt_spec on the stack, we go from 2->1,
1186 else 1->1. */
1187 return (oparg & FVS_MASK) == FVS_HAVE_SPEC ? -1 : 0;
Yury Selivanovf2392132016-12-13 19:03:51 -05001188 case LOAD_METHOD:
1189 return 1;
Zackery Spytzce6a0702019-08-25 03:44:09 -06001190 case LOAD_ASSERTION_ERROR:
1191 return 1;
Mark Shannon13bc1392020-01-23 09:25:17 +00001192 case LIST_TO_TUPLE:
1193 return 0;
Mark Shannonb37181e2021-04-06 11:48:59 +01001194 case GEN_START:
1195 return -1;
Mark Shannon13bc1392020-01-23 09:25:17 +00001196 case LIST_EXTEND:
1197 case SET_UPDATE:
Mark Shannon8a4cd702020-01-27 09:57:45 +00001198 case DICT_MERGE:
1199 case DICT_UPDATE:
Mark Shannon13bc1392020-01-23 09:25:17 +00001200 return -1;
Brandt Bucher145bf262021-02-26 14:51:55 -08001201 case COPY_DICT_WITHOUT_KEYS:
1202 return 0;
1203 case MATCH_CLASS:
1204 return -1;
1205 case GET_LEN:
1206 case MATCH_MAPPING:
1207 case MATCH_SEQUENCE:
1208 return 1;
1209 case MATCH_KEYS:
1210 return 2;
Brandt Bucher0ad1e032021-05-02 13:02:10 -07001211 case ROT_N:
1212 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001213 default:
Larry Hastings3a907972013-11-23 14:49:22 -08001214 return PY_INVALID_STACK_EFFECT;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001215 }
Larry Hastings3a907972013-11-23 14:49:22 -08001216 return PY_INVALID_STACK_EFFECT; /* not reachable */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001217}
1218
Serhiy Storchakad4864c62018-01-09 21:54:52 +02001219int
Serhiy Storchaka7bdf2822018-09-18 09:54:26 +03001220PyCompile_OpcodeStackEffectWithJump(int opcode, int oparg, int jump)
1221{
1222 return stack_effect(opcode, oparg, jump);
1223}
1224
1225int
Serhiy Storchakad4864c62018-01-09 21:54:52 +02001226PyCompile_OpcodeStackEffect(int opcode, int oparg)
1227{
1228 return stack_effect(opcode, oparg, -1);
1229}
1230
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001231/* Add an opcode with no argument.
1232 Returns 0 on failure, 1 on success.
1233*/
1234
1235static int
Mark Shannon3bd60352021-01-13 12:05:43 +00001236compiler_addop_line(struct compiler *c, int opcode, int line)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001237{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001238 basicblock *b;
1239 struct instr *i;
1240 int off;
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001241 assert(!HAS_ARG(opcode));
Andy Lester76d58772020-03-10 21:18:12 -05001242 off = compiler_next_instr(c->u->u_curblock);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001243 if (off < 0)
1244 return 0;
1245 b = c->u->u_curblock;
1246 i = &b->b_instr[off];
1247 i->i_opcode = opcode;
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001248 i->i_oparg = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001249 if (opcode == RETURN_VALUE)
1250 b->b_return = 1;
Mark Shannon3bd60352021-01-13 12:05:43 +00001251 i->i_lineno = line;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001252 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001253}
1254
Mark Shannon3bd60352021-01-13 12:05:43 +00001255static int
1256compiler_addop(struct compiler *c, int opcode)
1257{
1258 return compiler_addop_line(c, opcode, c->u->u_lineno);
1259}
1260
1261static int
1262compiler_addop_noline(struct compiler *c, int opcode)
1263{
1264 return compiler_addop_line(c, opcode, -1);
1265}
1266
1267
Victor Stinnerf8e32212013-11-19 23:56:34 +01001268static Py_ssize_t
Andy Lester76d58772020-03-10 21:18:12 -05001269compiler_add_o(PyObject *dict, PyObject *o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001270{
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001271 PyObject *v;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001272 Py_ssize_t arg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001273
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001274 v = PyDict_GetItemWithError(dict, o);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001275 if (!v) {
Stefan Krahc0cbed12015-07-27 12:56:49 +02001276 if (PyErr_Occurred()) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001277 return -1;
Stefan Krahc0cbed12015-07-27 12:56:49 +02001278 }
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +02001279 arg = PyDict_GET_SIZE(dict);
Victor Stinnerad9a0662013-11-19 22:23:20 +01001280 v = PyLong_FromSsize_t(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001281 if (!v) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001282 return -1;
1283 }
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001284 if (PyDict_SetItem(dict, o, v) < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001285 Py_DECREF(v);
1286 return -1;
1287 }
1288 Py_DECREF(v);
1289 }
1290 else
1291 arg = PyLong_AsLong(v);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001292 return arg;
1293}
1294
INADA Naokic2e16072018-11-26 21:23:22 +09001295// Merge const *o* recursively and return constant key object.
1296static PyObject*
1297merge_consts_recursive(struct compiler *c, PyObject *o)
1298{
1299 // None and Ellipsis are singleton, and key is the singleton.
1300 // No need to merge object and key.
1301 if (o == Py_None || o == Py_Ellipsis) {
1302 Py_INCREF(o);
1303 return o;
1304 }
1305
1306 PyObject *key = _PyCode_ConstantKey(o);
1307 if (key == NULL) {
1308 return NULL;
1309 }
1310
1311 // t is borrowed reference
1312 PyObject *t = PyDict_SetDefault(c->c_const_cache, key, key);
1313 if (t != key) {
INADA Naokif7e4d362018-11-29 00:58:46 +09001314 // o is registered in c_const_cache. Just use it.
Zackery Spytz9b4a1b12019-03-20 03:16:25 -06001315 Py_XINCREF(t);
INADA Naokic2e16072018-11-26 21:23:22 +09001316 Py_DECREF(key);
1317 return t;
1318 }
1319
INADA Naokif7e4d362018-11-29 00:58:46 +09001320 // We registered o in c_const_cache.
Simeon63b5fc52019-04-09 19:36:57 -04001321 // When o is a tuple or frozenset, we want to merge its
INADA Naokif7e4d362018-11-29 00:58:46 +09001322 // items too.
INADA Naokic2e16072018-11-26 21:23:22 +09001323 if (PyTuple_CheckExact(o)) {
INADA Naokif7e4d362018-11-29 00:58:46 +09001324 Py_ssize_t len = PyTuple_GET_SIZE(o);
1325 for (Py_ssize_t i = 0; i < len; i++) {
INADA Naokic2e16072018-11-26 21:23:22 +09001326 PyObject *item = PyTuple_GET_ITEM(o, i);
1327 PyObject *u = merge_consts_recursive(c, item);
1328 if (u == NULL) {
1329 Py_DECREF(key);
1330 return NULL;
1331 }
1332
1333 // See _PyCode_ConstantKey()
1334 PyObject *v; // borrowed
1335 if (PyTuple_CheckExact(u)) {
1336 v = PyTuple_GET_ITEM(u, 1);
1337 }
1338 else {
1339 v = u;
1340 }
1341 if (v != item) {
1342 Py_INCREF(v);
1343 PyTuple_SET_ITEM(o, i, v);
1344 Py_DECREF(item);
1345 }
1346
1347 Py_DECREF(u);
1348 }
1349 }
INADA Naokif7e4d362018-11-29 00:58:46 +09001350 else if (PyFrozenSet_CheckExact(o)) {
Simeon63b5fc52019-04-09 19:36:57 -04001351 // *key* is tuple. And its first item is frozenset of
INADA Naokif7e4d362018-11-29 00:58:46 +09001352 // constant keys.
1353 // See _PyCode_ConstantKey() for detail.
1354 assert(PyTuple_CheckExact(key));
1355 assert(PyTuple_GET_SIZE(key) == 2);
1356
1357 Py_ssize_t len = PySet_GET_SIZE(o);
1358 if (len == 0) { // empty frozenset should not be re-created.
1359 return key;
1360 }
1361 PyObject *tuple = PyTuple_New(len);
1362 if (tuple == NULL) {
1363 Py_DECREF(key);
1364 return NULL;
1365 }
1366 Py_ssize_t i = 0, pos = 0;
1367 PyObject *item;
1368 Py_hash_t hash;
1369 while (_PySet_NextEntry(o, &pos, &item, &hash)) {
1370 PyObject *k = merge_consts_recursive(c, item);
1371 if (k == NULL) {
1372 Py_DECREF(tuple);
1373 Py_DECREF(key);
1374 return NULL;
1375 }
1376 PyObject *u;
1377 if (PyTuple_CheckExact(k)) {
1378 u = PyTuple_GET_ITEM(k, 1);
1379 Py_INCREF(u);
1380 Py_DECREF(k);
1381 }
1382 else {
1383 u = k;
1384 }
1385 PyTuple_SET_ITEM(tuple, i, u); // Steals reference of u.
1386 i++;
1387 }
1388
1389 // Instead of rewriting o, we create new frozenset and embed in the
1390 // key tuple. Caller should get merged frozenset from the key tuple.
1391 PyObject *new = PyFrozenSet_New(tuple);
1392 Py_DECREF(tuple);
1393 if (new == NULL) {
1394 Py_DECREF(key);
1395 return NULL;
1396 }
1397 assert(PyTuple_GET_ITEM(key, 1) == o);
1398 Py_DECREF(o);
1399 PyTuple_SET_ITEM(key, 1, new);
1400 }
INADA Naokic2e16072018-11-26 21:23:22 +09001401
1402 return key;
1403}
1404
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001405static Py_ssize_t
1406compiler_add_const(struct compiler *c, PyObject *o)
1407{
INADA Naokic2e16072018-11-26 21:23:22 +09001408 PyObject *key = merge_consts_recursive(c, o);
1409 if (key == NULL) {
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001410 return -1;
INADA Naokic2e16072018-11-26 21:23:22 +09001411 }
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001412
Andy Lester76d58772020-03-10 21:18:12 -05001413 Py_ssize_t arg = compiler_add_o(c->u->u_consts, key);
INADA Naokic2e16072018-11-26 21:23:22 +09001414 Py_DECREF(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001415 return arg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001416}
1417
1418static int
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001419compiler_addop_load_const(struct compiler *c, PyObject *o)
1420{
1421 Py_ssize_t arg = compiler_add_const(c, o);
1422 if (arg < 0)
1423 return 0;
1424 return compiler_addop_i(c, LOAD_CONST, arg);
1425}
1426
1427static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001428compiler_addop_o(struct compiler *c, int opcode, PyObject *dict,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001429 PyObject *o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001430{
Andy Lester76d58772020-03-10 21:18:12 -05001431 Py_ssize_t arg = compiler_add_o(dict, o);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001432 if (arg < 0)
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00001433 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001434 return compiler_addop_i(c, opcode, arg);
1435}
1436
1437static int
1438compiler_addop_name(struct compiler *c, int opcode, PyObject *dict,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001439 PyObject *o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001440{
Victor Stinnerad9a0662013-11-19 22:23:20 +01001441 Py_ssize_t arg;
Pablo Galindo18c5f9d2019-07-15 10:15:01 +01001442
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001443 PyObject *mangled = _Py_Mangle(c->u->u_private, o);
1444 if (!mangled)
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00001445 return 0;
Andy Lester76d58772020-03-10 21:18:12 -05001446 arg = compiler_add_o(dict, mangled);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001447 Py_DECREF(mangled);
1448 if (arg < 0)
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00001449 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001450 return compiler_addop_i(c, opcode, arg);
1451}
1452
1453/* Add an opcode with an integer argument.
1454 Returns 0 on failure, 1 on success.
1455*/
1456
1457static int
Mark Shannon11e0b292021-04-15 14:28:56 +01001458compiler_addop_i_line(struct compiler *c, int opcode, Py_ssize_t oparg, int lineno)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001459{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001460 struct instr *i;
1461 int off;
Victor Stinnerad9a0662013-11-19 22:23:20 +01001462
Victor Stinner2ad474b2016-03-01 23:34:47 +01001463 /* oparg value is unsigned, but a signed C int is usually used to store
1464 it in the C code (like Python/ceval.c).
1465
1466 Limit to 32-bit signed C int (rather than INT_MAX) for portability.
1467
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001468 The argument of a concrete bytecode instruction is limited to 8-bit.
1469 EXTENDED_ARG is used for 16, 24, and 32-bit arguments. */
1470 assert(HAS_ARG(opcode));
Victor Stinner2ad474b2016-03-01 23:34:47 +01001471 assert(0 <= oparg && oparg <= 2147483647);
Victor Stinnerad9a0662013-11-19 22:23:20 +01001472
Andy Lester76d58772020-03-10 21:18:12 -05001473 off = compiler_next_instr(c->u->u_curblock);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001474 if (off < 0)
1475 return 0;
1476 i = &c->u->u_curblock->b_instr[off];
Victor Stinnerf8e32212013-11-19 23:56:34 +01001477 i->i_opcode = opcode;
1478 i->i_oparg = Py_SAFE_DOWNCAST(oparg, Py_ssize_t, int);
Mark Shannon11e0b292021-04-15 14:28:56 +01001479 i->i_lineno = lineno;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001480 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001481}
1482
Mark Shannon11e0b292021-04-15 14:28:56 +01001483static int
1484compiler_addop_i(struct compiler *c, int opcode, Py_ssize_t oparg)
1485{
1486 return compiler_addop_i_line(c, opcode, oparg, c->u->u_lineno);
1487}
1488
1489static int
1490compiler_addop_i_noline(struct compiler *c, int opcode, Py_ssize_t oparg)
1491{
1492 return compiler_addop_i_line(c, opcode, oparg, -1);
1493}
1494
Mark Shannon28b75c82020-12-23 11:43:10 +00001495static int add_jump_to_block(basicblock *b, int opcode, int lineno, basicblock *target)
1496{
1497 assert(HAS_ARG(opcode));
1498 assert(b != NULL);
1499 assert(target != NULL);
1500
1501 int off = compiler_next_instr(b);
1502 struct instr *i = &b->b_instr[off];
1503 if (off < 0) {
1504 return 0;
1505 }
1506 i->i_opcode = opcode;
1507 i->i_target = target;
1508 i->i_lineno = lineno;
1509 return 1;
1510}
1511
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001512static int
Mark Shannon582aaf12020-08-04 17:30:11 +01001513compiler_addop_j(struct compiler *c, int opcode, basicblock *b)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001514{
Mark Shannon28b75c82020-12-23 11:43:10 +00001515 return add_jump_to_block(c->u->u_curblock, opcode, c->u->u_lineno, b);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001516}
1517
Mark Shannon127dde52021-01-04 18:06:55 +00001518static int
1519compiler_addop_j_noline(struct compiler *c, int opcode, basicblock *b)
1520{
1521 return add_jump_to_block(c->u->u_curblock, opcode, -1, b);
1522}
1523
Victor Stinnerfc6f2ef2016-02-27 02:19:22 +01001524/* NEXT_BLOCK() creates an implicit jump from the current block
1525 to the new block.
1526
1527 The returns inside this macro make it impossible to decref objects
1528 created in the local function. Local objects should use the arena.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001529*/
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001530#define NEXT_BLOCK(C) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001531 if (compiler_next_block((C)) == NULL) \
1532 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001533}
1534
1535#define ADDOP(C, OP) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001536 if (!compiler_addop((C), (OP))) \
1537 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001538}
1539
Mark Shannon3bd60352021-01-13 12:05:43 +00001540#define ADDOP_NOLINE(C, OP) { \
1541 if (!compiler_addop_noline((C), (OP))) \
1542 return 0; \
1543}
1544
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001545#define ADDOP_IN_SCOPE(C, OP) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001546 if (!compiler_addop((C), (OP))) { \
1547 compiler_exit_scope(c); \
1548 return 0; \
1549 } \
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001550}
1551
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001552#define ADDOP_LOAD_CONST(C, O) { \
1553 if (!compiler_addop_load_const((C), (O))) \
1554 return 0; \
1555}
1556
1557/* Same as ADDOP_LOAD_CONST, but steals a reference. */
1558#define ADDOP_LOAD_CONST_NEW(C, O) { \
1559 PyObject *__new_const = (O); \
1560 if (__new_const == NULL) { \
1561 return 0; \
1562 } \
1563 if (!compiler_addop_load_const((C), __new_const)) { \
1564 Py_DECREF(__new_const); \
1565 return 0; \
1566 } \
1567 Py_DECREF(__new_const); \
1568}
1569
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001570#define ADDOP_O(C, OP, O, TYPE) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001571 if (!compiler_addop_o((C), (OP), (C)->u->u_ ## TYPE, (O))) \
1572 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001573}
1574
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03001575/* Same as ADDOP_O, but steals a reference. */
1576#define ADDOP_N(C, OP, O, TYPE) { \
1577 if (!compiler_addop_o((C), (OP), (C)->u->u_ ## TYPE, (O))) { \
1578 Py_DECREF((O)); \
1579 return 0; \
1580 } \
1581 Py_DECREF((O)); \
1582}
1583
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001584#define ADDOP_NAME(C, OP, O, TYPE) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001585 if (!compiler_addop_name((C), (OP), (C)->u->u_ ## TYPE, (O))) \
1586 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001587}
1588
1589#define ADDOP_I(C, OP, O) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001590 if (!compiler_addop_i((C), (OP), (O))) \
1591 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001592}
1593
Mark Shannon11e0b292021-04-15 14:28:56 +01001594#define ADDOP_I_NOLINE(C, OP, O) { \
1595 if (!compiler_addop_i_noline((C), (OP), (O))) \
1596 return 0; \
1597}
1598
Mark Shannon582aaf12020-08-04 17:30:11 +01001599#define ADDOP_JUMP(C, OP, O) { \
1600 if (!compiler_addop_j((C), (OP), (O))) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001601 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001602}
1603
Mark Shannon127dde52021-01-04 18:06:55 +00001604/* Add a jump with no line number.
1605 * Used for artificial jumps that have no corresponding
1606 * token in the source code. */
1607#define ADDOP_JUMP_NOLINE(C, OP, O) { \
1608 if (!compiler_addop_j_noline((C), (OP), (O))) \
1609 return 0; \
1610}
1611
Mark Shannon9af0e472020-01-14 10:12:45 +00001612#define ADDOP_COMPARE(C, CMP) { \
1613 if (!compiler_addcompare((C), (cmpop_ty)(CMP))) \
1614 return 0; \
1615}
1616
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001617/* VISIT and VISIT_SEQ takes an ASDL type as their second argument. They use
1618 the ASDL name to synthesize the name of the C type and the visit function.
1619*/
1620
1621#define VISIT(C, TYPE, V) {\
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001622 if (!compiler_visit_ ## TYPE((C), (V))) \
1623 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001624}
1625
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001626#define VISIT_IN_SCOPE(C, TYPE, V) {\
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001627 if (!compiler_visit_ ## TYPE((C), (V))) { \
1628 compiler_exit_scope(c); \
1629 return 0; \
1630 } \
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001631}
1632
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001633#define VISIT_SLICE(C, V, CTX) {\
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001634 if (!compiler_visit_slice((C), (V), (CTX))) \
1635 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001636}
1637
1638#define VISIT_SEQ(C, TYPE, SEQ) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001639 int _i; \
Pablo Galindoa5634c42020-09-16 19:42:00 +01001640 asdl_ ## TYPE ## _seq *seq = (SEQ); /* avoid variable capture */ \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001641 for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \
1642 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \
1643 if (!compiler_visit_ ## TYPE((C), elt)) \
1644 return 0; \
1645 } \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001646}
1647
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001648#define VISIT_SEQ_IN_SCOPE(C, TYPE, SEQ) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001649 int _i; \
Pablo Galindoa5634c42020-09-16 19:42:00 +01001650 asdl_ ## TYPE ## _seq *seq = (SEQ); /* avoid variable capture */ \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001651 for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \
1652 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \
1653 if (!compiler_visit_ ## TYPE((C), elt)) { \
1654 compiler_exit_scope(c); \
1655 return 0; \
1656 } \
1657 } \
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001658}
1659
Brandt Bucher145bf262021-02-26 14:51:55 -08001660#define RETURN_IF_FALSE(X) \
1661 if (!(X)) { \
1662 return 0; \
1663 }
1664
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001665/* Search if variable annotations are present statically in a block. */
1666
1667static int
Pablo Galindoa5634c42020-09-16 19:42:00 +01001668find_ann(asdl_stmt_seq *stmts)
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001669{
1670 int i, j, res = 0;
1671 stmt_ty st;
1672
1673 for (i = 0; i < asdl_seq_LEN(stmts); i++) {
1674 st = (stmt_ty)asdl_seq_GET(stmts, i);
1675 switch (st->kind) {
1676 case AnnAssign_kind:
1677 return 1;
1678 case For_kind:
1679 res = find_ann(st->v.For.body) ||
1680 find_ann(st->v.For.orelse);
1681 break;
1682 case AsyncFor_kind:
1683 res = find_ann(st->v.AsyncFor.body) ||
1684 find_ann(st->v.AsyncFor.orelse);
1685 break;
1686 case While_kind:
1687 res = find_ann(st->v.While.body) ||
1688 find_ann(st->v.While.orelse);
1689 break;
1690 case If_kind:
1691 res = find_ann(st->v.If.body) ||
1692 find_ann(st->v.If.orelse);
1693 break;
1694 case With_kind:
1695 res = find_ann(st->v.With.body);
1696 break;
1697 case AsyncWith_kind:
1698 res = find_ann(st->v.AsyncWith.body);
1699 break;
1700 case Try_kind:
1701 for (j = 0; j < asdl_seq_LEN(st->v.Try.handlers); j++) {
1702 excepthandler_ty handler = (excepthandler_ty)asdl_seq_GET(
1703 st->v.Try.handlers, j);
1704 if (find_ann(handler->v.ExceptHandler.body)) {
1705 return 1;
1706 }
1707 }
1708 res = find_ann(st->v.Try.body) ||
1709 find_ann(st->v.Try.finalbody) ||
1710 find_ann(st->v.Try.orelse);
1711 break;
1712 default:
1713 res = 0;
1714 }
1715 if (res) {
1716 break;
1717 }
1718 }
1719 return res;
1720}
1721
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001722/*
1723 * Frame block handling functions
1724 */
1725
1726static int
1727compiler_push_fblock(struct compiler *c, enum fblocktype t, basicblock *b,
Mark Shannonfee55262019-11-21 09:11:43 +00001728 basicblock *exit, void *datum)
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001729{
1730 struct fblockinfo *f;
1731 if (c->u->u_nfblocks >= CO_MAXBLOCKS) {
Mark Shannon02d126a2020-09-25 14:04:19 +01001732 return compiler_error(c, "too many statically nested blocks");
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001733 }
1734 f = &c->u->u_fblock[c->u->u_nfblocks++];
1735 f->fb_type = t;
1736 f->fb_block = b;
1737 f->fb_exit = exit;
Mark Shannonfee55262019-11-21 09:11:43 +00001738 f->fb_datum = datum;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001739 return 1;
1740}
1741
1742static void
1743compiler_pop_fblock(struct compiler *c, enum fblocktype t, basicblock *b)
1744{
1745 struct compiler_unit *u = c->u;
1746 assert(u->u_nfblocks > 0);
1747 u->u_nfblocks--;
1748 assert(u->u_fblock[u->u_nfblocks].fb_type == t);
1749 assert(u->u_fblock[u->u_nfblocks].fb_block == b);
1750}
1751
Mark Shannonfee55262019-11-21 09:11:43 +00001752static int
1753compiler_call_exit_with_nones(struct compiler *c) {
1754 ADDOP_O(c, LOAD_CONST, Py_None, consts);
1755 ADDOP(c, DUP_TOP);
1756 ADDOP(c, DUP_TOP);
1757 ADDOP_I(c, CALL_FUNCTION, 3);
1758 return 1;
1759}
1760
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001761/* Unwind a frame block. If preserve_tos is true, the TOS before
Mark Shannonfee55262019-11-21 09:11:43 +00001762 * popping the blocks will be restored afterwards, unless another
1763 * return, break or continue is found. In which case, the TOS will
1764 * be popped.
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001765 */
1766static int
1767compiler_unwind_fblock(struct compiler *c, struct fblockinfo *info,
1768 int preserve_tos)
1769{
1770 switch (info->fb_type) {
1771 case WHILE_LOOP:
Mark Shannon02d126a2020-09-25 14:04:19 +01001772 case EXCEPTION_HANDLER:
tomKPZ7a7ba3d2021-04-07 07:43:45 -07001773 case ASYNC_COMPREHENSION_GENERATOR:
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001774 return 1;
1775
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001776 case FOR_LOOP:
1777 /* Pop the iterator */
1778 if (preserve_tos) {
1779 ADDOP(c, ROT_TWO);
1780 }
1781 ADDOP(c, POP_TOP);
1782 return 1;
1783
Mark Shannon02d126a2020-09-25 14:04:19 +01001784 case TRY_EXCEPT:
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001785 ADDOP(c, POP_BLOCK);
1786 return 1;
1787
1788 case FINALLY_TRY:
Mark Shannon5274b682020-12-16 13:07:01 +00001789 /* This POP_BLOCK gets the line number of the unwinding statement */
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001790 ADDOP(c, POP_BLOCK);
Serhiy Storchakaef61c522019-08-24 13:11:52 +03001791 if (preserve_tos) {
Mark Shannonfee55262019-11-21 09:11:43 +00001792 if (!compiler_push_fblock(c, POP_VALUE, NULL, NULL, NULL)) {
1793 return 0;
1794 }
Serhiy Storchakaef61c522019-08-24 13:11:52 +03001795 }
Mark Shannon5274b682020-12-16 13:07:01 +00001796 /* Emit the finally block */
Mark Shannonfee55262019-11-21 09:11:43 +00001797 VISIT_SEQ(c, stmt, info->fb_datum);
1798 if (preserve_tos) {
1799 compiler_pop_fblock(c, POP_VALUE, NULL);
Serhiy Storchakaef61c522019-08-24 13:11:52 +03001800 }
Mark Shannon5274b682020-12-16 13:07:01 +00001801 /* The finally block should appear to execute after the
1802 * statement causing the unwinding, so make the unwinding
1803 * instruction artificial */
1804 c->u->u_lineno = -1;
Serhiy Storchakaef61c522019-08-24 13:11:52 +03001805 return 1;
Mark Shannon13bc1392020-01-23 09:25:17 +00001806
Mark Shannonfee55262019-11-21 09:11:43 +00001807 case FINALLY_END:
1808 if (preserve_tos) {
1809 ADDOP(c, ROT_FOUR);
1810 }
1811 ADDOP(c, POP_TOP);
1812 ADDOP(c, POP_TOP);
1813 ADDOP(c, POP_TOP);
1814 if (preserve_tos) {
1815 ADDOP(c, ROT_FOUR);
1816 }
1817 ADDOP(c, POP_EXCEPT);
1818 return 1;
Serhiy Storchakaef61c522019-08-24 13:11:52 +03001819
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001820 case WITH:
1821 case ASYNC_WITH:
Mark Shannon5979e812021-04-30 14:32:47 +01001822 SET_LOC(c, (stmt_ty)info->fb_datum);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001823 ADDOP(c, POP_BLOCK);
1824 if (preserve_tos) {
1825 ADDOP(c, ROT_TWO);
1826 }
Mark Shannonfee55262019-11-21 09:11:43 +00001827 if(!compiler_call_exit_with_nones(c)) {
1828 return 0;
1829 }
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001830 if (info->fb_type == ASYNC_WITH) {
1831 ADDOP(c, GET_AWAITABLE);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001832 ADDOP_LOAD_CONST(c, Py_None);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001833 ADDOP(c, YIELD_FROM);
1834 }
Mark Shannonfee55262019-11-21 09:11:43 +00001835 ADDOP(c, POP_TOP);
Mark Shannoncea05852021-06-03 19:57:31 +01001836 /* The exit block should appear to execute after the
1837 * statement causing the unwinding, so make the unwinding
1838 * instruction artificial */
1839 c->u->u_lineno = -1;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001840 return 1;
1841
1842 case HANDLER_CLEANUP:
Mark Shannonfee55262019-11-21 09:11:43 +00001843 if (info->fb_datum) {
1844 ADDOP(c, POP_BLOCK);
1845 }
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001846 if (preserve_tos) {
1847 ADDOP(c, ROT_FOUR);
1848 }
Mark Shannonfee55262019-11-21 09:11:43 +00001849 ADDOP(c, POP_EXCEPT);
1850 if (info->fb_datum) {
1851 ADDOP_LOAD_CONST(c, Py_None);
1852 compiler_nameop(c, info->fb_datum, Store);
1853 compiler_nameop(c, info->fb_datum, Del);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001854 }
Mark Shannonfee55262019-11-21 09:11:43 +00001855 return 1;
1856
1857 case POP_VALUE:
1858 if (preserve_tos) {
1859 ADDOP(c, ROT_TWO);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001860 }
Mark Shannonfee55262019-11-21 09:11:43 +00001861 ADDOP(c, POP_TOP);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001862 return 1;
1863 }
1864 Py_UNREACHABLE();
1865}
1866
Mark Shannonfee55262019-11-21 09:11:43 +00001867/** Unwind block stack. If loop is not NULL, then stop when the first loop is encountered. */
1868static int
1869compiler_unwind_fblock_stack(struct compiler *c, int preserve_tos, struct fblockinfo **loop) {
1870 if (c->u->u_nfblocks == 0) {
1871 return 1;
1872 }
1873 struct fblockinfo *top = &c->u->u_fblock[c->u->u_nfblocks-1];
1874 if (loop != NULL && (top->fb_type == WHILE_LOOP || top->fb_type == FOR_LOOP)) {
1875 *loop = top;
1876 return 1;
1877 }
1878 struct fblockinfo copy = *top;
1879 c->u->u_nfblocks--;
1880 if (!compiler_unwind_fblock(c, &copy, preserve_tos)) {
1881 return 0;
1882 }
1883 if (!compiler_unwind_fblock_stack(c, preserve_tos, loop)) {
1884 return 0;
1885 }
1886 c->u->u_fblock[c->u->u_nfblocks] = copy;
1887 c->u->u_nfblocks++;
1888 return 1;
1889}
1890
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001891/* Compile a sequence of statements, checking for a docstring
1892 and for annotations. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001893
1894static int
Pablo Galindoa5634c42020-09-16 19:42:00 +01001895compiler_body(struct compiler *c, asdl_stmt_seq *stmts)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001896{
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001897 int i = 0;
1898 stmt_ty st;
Serhiy Storchaka143ce5c2018-05-30 10:56:16 +03001899 PyObject *docstring;
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001900
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001901 /* Set current line number to the line number of first statement.
1902 This way line number for SETUP_ANNOTATIONS will always
1903 coincide with the line number of first "real" statement in module.
Hansraj Das01171eb2019-10-09 07:54:02 +05301904 If body is empty, then lineno will be set later in assemble. */
Serhiy Storchaka61cb3d02020-03-17 18:07:30 +02001905 if (c->u->u_scope_type == COMPILER_SCOPE_MODULE && asdl_seq_LEN(stmts)) {
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001906 st = (stmt_ty)asdl_seq_GET(stmts, 0);
Serhiy Storchaka61cb3d02020-03-17 18:07:30 +02001907 SET_LOC(c, st);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001908 }
1909 /* Every annotated class and module should have __annotations__. */
1910 if (find_ann(stmts)) {
1911 ADDOP(c, SETUP_ANNOTATIONS);
1912 }
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001913 if (!asdl_seq_LEN(stmts))
1914 return 1;
INADA Naokicb41b272017-02-23 00:31:59 +09001915 /* if not -OO mode, set docstring */
Serhiy Storchaka143ce5c2018-05-30 10:56:16 +03001916 if (c->c_optimize < 2) {
1917 docstring = _PyAST_GetDocString(stmts);
1918 if (docstring) {
1919 i = 1;
1920 st = (stmt_ty)asdl_seq_GET(stmts, 0);
1921 assert(st->kind == Expr_kind);
1922 VISIT(c, expr, st->v.Expr.value);
1923 if (!compiler_nameop(c, __doc__, Store))
1924 return 0;
1925 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001926 }
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001927 for (; i < asdl_seq_LEN(stmts); i++)
1928 VISIT(c, stmt, (stmt_ty)asdl_seq_GET(stmts, i));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001929 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001930}
1931
1932static PyCodeObject *
1933compiler_mod(struct compiler *c, mod_ty mod)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001934{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001935 PyCodeObject *co;
1936 int addNone = 1;
1937 static PyObject *module;
1938 if (!module) {
1939 module = PyUnicode_InternFromString("<module>");
1940 if (!module)
1941 return NULL;
1942 }
1943 /* Use 0 for firstlineno initially, will fixup in assemble(). */
Mark Shannon877df852020-11-12 09:43:29 +00001944 if (!compiler_enter_scope(c, module, COMPILER_SCOPE_MODULE, mod, 1))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001945 return NULL;
1946 switch (mod->kind) {
1947 case Module_kind:
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001948 if (!compiler_body(c, mod->v.Module.body)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001949 compiler_exit_scope(c);
1950 return 0;
1951 }
1952 break;
1953 case Interactive_kind:
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001954 if (find_ann(mod->v.Interactive.body)) {
1955 ADDOP(c, SETUP_ANNOTATIONS);
1956 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001957 c->c_interactive = 1;
Pablo Galindoa5634c42020-09-16 19:42:00 +01001958 VISIT_SEQ_IN_SCOPE(c, stmt, mod->v.Interactive.body);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001959 break;
1960 case Expression_kind:
1961 VISIT_IN_SCOPE(c, expr, mod->v.Expression.body);
1962 addNone = 0;
1963 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001964 default:
1965 PyErr_Format(PyExc_SystemError,
1966 "module kind %d should not be possible",
1967 mod->kind);
1968 return 0;
1969 }
1970 co = assemble(c, addNone);
1971 compiler_exit_scope(c);
1972 return co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001973}
1974
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001975/* The test for LOCAL must come before the test for FREE in order to
1976 handle classes where name is both local and free. The local var is
1977 a method and the free var is a free var referenced within a method.
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001978*/
1979
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001980static int
1981get_ref_type(struct compiler *c, PyObject *name)
1982{
Victor Stinner0b1bc562013-05-16 22:17:17 +02001983 int scope;
Benjamin Peterson312595c2013-05-15 15:26:42 -05001984 if (c->u->u_scope_type == COMPILER_SCOPE_CLASS &&
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02001985 _PyUnicode_EqualToASCIIString(name, "__class__"))
Benjamin Peterson312595c2013-05-15 15:26:42 -05001986 return CELL;
Victor Stinner28ad12f2021-03-19 12:41:49 +01001987 scope = _PyST_GetScope(c->u->u_ste, name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001988 if (scope == 0) {
Victor Stinnerba7a99d2021-01-30 01:46:44 +01001989 PyErr_Format(PyExc_SystemError,
Victor Stinner28ad12f2021-03-19 12:41:49 +01001990 "_PyST_GetScope(name=%R) failed: "
Victor Stinnerba7a99d2021-01-30 01:46:44 +01001991 "unknown scope in unit %S (%R); "
1992 "symbols: %R; locals: %R; globals: %R",
1993 name,
1994 c->u->u_name, c->u->u_ste->ste_id,
1995 c->u->u_ste->ste_symbols, c->u->u_varnames, c->u->u_names);
1996 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001997 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001998 return scope;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001999}
2000
2001static int
2002compiler_lookup_arg(PyObject *dict, PyObject *name)
2003{
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03002004 PyObject *v;
Serhiy Storchakafb5db7e2020-10-26 08:43:39 +02002005 v = PyDict_GetItemWithError(dict, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002006 if (v == NULL)
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00002007 return -1;
Christian Heimes217cfd12007-12-02 14:31:20 +00002008 return PyLong_AS_LONG(v);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002009}
2010
2011static int
Victor Stinnerba7a99d2021-01-30 01:46:44 +01002012compiler_make_closure(struct compiler *c, PyCodeObject *co, Py_ssize_t flags,
2013 PyObject *qualname)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002014{
Victor Stinnerad9a0662013-11-19 22:23:20 +01002015 Py_ssize_t i, free = PyCode_GetNumFree(co);
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002016 if (qualname == NULL)
2017 qualname = co->co_name;
2018
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002019 if (free) {
2020 for (i = 0; i < free; ++i) {
2021 /* Bypass com_addop_varname because it will generate
2022 LOAD_DEREF but LOAD_CLOSURE is needed.
2023 */
2024 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002025
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002026 /* Special case: If a class contains a method with a
2027 free variable that has the same name as a method,
2028 the name will be considered free *and* local in the
2029 class. It should be handled by the closure, as
Min ho Kimc4cacc82019-07-31 08:16:13 +10002030 well as by the normal name lookup logic.
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002031 */
Victor Stinnerba7a99d2021-01-30 01:46:44 +01002032 int reftype = get_ref_type(c, name);
2033 if (reftype == -1) {
2034 return 0;
2035 }
2036 int arg;
2037 if (reftype == CELL) {
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002038 arg = compiler_lookup_arg(c->u->u_cellvars, name);
Victor Stinnerba7a99d2021-01-30 01:46:44 +01002039 }
2040 else {
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002041 arg = compiler_lookup_arg(c->u->u_freevars, name);
Victor Stinnerba7a99d2021-01-30 01:46:44 +01002042 }
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002043 if (arg == -1) {
Victor Stinnerba7a99d2021-01-30 01:46:44 +01002044 PyErr_Format(PyExc_SystemError,
2045 "compiler_lookup_arg(name=%R) with reftype=%d failed in %S; "
2046 "freevars of code %S: %R",
2047 name,
2048 reftype,
2049 c->u->u_name,
2050 co->co_name,
2051 co->co_freevars);
2052 return 0;
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002053 }
2054 ADDOP_I(c, LOAD_CLOSURE, arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002055 }
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002056 flags |= 0x08;
2057 ADDOP_I(c, BUILD_TUPLE, free);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002058 }
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03002059 ADDOP_LOAD_CONST(c, (PyObject*)co);
2060 ADDOP_LOAD_CONST(c, qualname);
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002061 ADDOP_I(c, MAKE_FUNCTION, flags);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002062 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002063}
2064
2065static int
Pablo Galindoa5634c42020-09-16 19:42:00 +01002066compiler_decorators(struct compiler *c, asdl_expr_seq* decos)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002067{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002068 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002069
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002070 if (!decos)
2071 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002072
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002073 for (i = 0; i < asdl_seq_LEN(decos); i++) {
2074 VISIT(c, expr, (expr_ty)asdl_seq_GET(decos, i));
2075 }
2076 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002077}
2078
2079static int
Pablo Galindoa5634c42020-09-16 19:42:00 +01002080compiler_visit_kwonlydefaults(struct compiler *c, asdl_arg_seq *kwonlyargs,
2081 asdl_expr_seq *kw_defaults)
Guido van Rossum4f72a782006-10-27 23:31:49 +00002082{
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03002083 /* Push a dict of keyword-only default values.
2084
2085 Return 0 on error, -1 if no dict pushed, 1 if a dict is pushed.
2086 */
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002087 int i;
2088 PyObject *keys = NULL;
2089
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002090 for (i = 0; i < asdl_seq_LEN(kwonlyargs); i++) {
2091 arg_ty arg = asdl_seq_GET(kwonlyargs, i);
2092 expr_ty default_ = asdl_seq_GET(kw_defaults, i);
2093 if (default_) {
Benjamin Peterson32c59b62012-04-17 19:53:21 -04002094 PyObject *mangled = _Py_Mangle(c->u->u_private, arg->arg);
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002095 if (!mangled) {
2096 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002097 }
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002098 if (keys == NULL) {
2099 keys = PyList_New(1);
2100 if (keys == NULL) {
2101 Py_DECREF(mangled);
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03002102 return 0;
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002103 }
2104 PyList_SET_ITEM(keys, 0, mangled);
2105 }
2106 else {
2107 int res = PyList_Append(keys, mangled);
2108 Py_DECREF(mangled);
2109 if (res == -1) {
2110 goto error;
2111 }
2112 }
2113 if (!compiler_visit_expr(c, default_)) {
2114 goto error;
2115 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002116 }
2117 }
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002118 if (keys != NULL) {
2119 Py_ssize_t default_count = PyList_GET_SIZE(keys);
2120 PyObject *keys_tuple = PyList_AsTuple(keys);
2121 Py_DECREF(keys);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03002122 ADDOP_LOAD_CONST_NEW(c, keys_tuple);
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002123 ADDOP_I(c, BUILD_CONST_KEY_MAP, default_count);
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03002124 assert(default_count > 0);
2125 return 1;
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002126 }
2127 else {
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03002128 return -1;
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002129 }
2130
2131error:
2132 Py_XDECREF(keys);
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03002133 return 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +00002134}
2135
2136static int
Guido van Rossum95e4d582018-01-26 08:20:18 -08002137compiler_visit_annexpr(struct compiler *c, expr_ty annotation)
2138{
Serhiy Storchaka64fddc42018-05-17 06:17:48 +03002139 ADDOP_LOAD_CONST_NEW(c, _PyAST_ExprAsUnicode(annotation));
Guido van Rossum95e4d582018-01-26 08:20:18 -08002140 return 1;
2141}
2142
2143static int
Neal Norwitzc1505362006-12-28 06:47:50 +00002144compiler_visit_argannotation(struct compiler *c, identifier id,
Yurii Karabas73019792020-11-25 12:43:18 +02002145 expr_ty annotation, Py_ssize_t *annotations_len)
Neal Norwitzc1505362006-12-28 06:47:50 +00002146{
Pablo Galindob0544ba2021-04-21 12:41:19 +01002147 if (!annotation) {
2148 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002149 }
Pablo Galindob0544ba2021-04-21 12:41:19 +01002150
2151 PyObject *mangled = _Py_Mangle(c->u->u_private, id);
2152 if (!mangled) {
2153 return 0;
2154 }
2155 ADDOP_LOAD_CONST(c, mangled);
2156 Py_DECREF(mangled);
2157
2158 if (c->c_future->ff_features & CO_FUTURE_ANNOTATIONS) {
2159 VISIT(c, annexpr, annotation)
2160 }
2161 else {
2162 VISIT(c, expr, annotation);
2163 }
2164 *annotations_len += 2;
Yury Selivanovf315c1c2015-07-23 09:10:44 +03002165 return 1;
Neal Norwitzc1505362006-12-28 06:47:50 +00002166}
2167
2168static int
Pablo Galindoa5634c42020-09-16 19:42:00 +01002169compiler_visit_argannotations(struct compiler *c, asdl_arg_seq* args,
Yurii Karabas73019792020-11-25 12:43:18 +02002170 Py_ssize_t *annotations_len)
Neal Norwitzc1505362006-12-28 06:47:50 +00002171{
Yury Selivanovf315c1c2015-07-23 09:10:44 +03002172 int i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002173 for (i = 0; i < asdl_seq_LEN(args); i++) {
2174 arg_ty arg = (arg_ty)asdl_seq_GET(args, i);
Yury Selivanovf315c1c2015-07-23 09:10:44 +03002175 if (!compiler_visit_argannotation(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002176 c,
2177 arg->arg,
2178 arg->annotation,
Yurii Karabas73019792020-11-25 12:43:18 +02002179 annotations_len))
Yury Selivanovf315c1c2015-07-23 09:10:44 +03002180 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002181 }
Yury Selivanovf315c1c2015-07-23 09:10:44 +03002182 return 1;
Neal Norwitzc1505362006-12-28 06:47:50 +00002183}
2184
2185static int
2186compiler_visit_annotations(struct compiler *c, arguments_ty args,
2187 expr_ty returns)
2188{
Yurii Karabas73019792020-11-25 12:43:18 +02002189 /* Push arg annotation names and values.
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002190 The expressions are evaluated out-of-order wrt the source code.
Neal Norwitzc1505362006-12-28 06:47:50 +00002191
Yurii Karabas73019792020-11-25 12:43:18 +02002192 Return 0 on error, -1 if no annotations pushed, 1 if a annotations is pushed.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002193 */
2194 static identifier return_str;
Yurii Karabas73019792020-11-25 12:43:18 +02002195 Py_ssize_t annotations_len = 0;
Neal Norwitzc1505362006-12-28 06:47:50 +00002196
Yurii Karabas73019792020-11-25 12:43:18 +02002197 if (!compiler_visit_argannotations(c, args->args, &annotations_len))
2198 return 0;
2199 if (!compiler_visit_argannotations(c, args->posonlyargs, &annotations_len))
2200 return 0;
Benjamin Petersoncda75be2013-03-18 10:48:58 -07002201 if (args->vararg && args->vararg->annotation &&
Yury Selivanovf315c1c2015-07-23 09:10:44 +03002202 !compiler_visit_argannotation(c, args->vararg->arg,
Yurii Karabas73019792020-11-25 12:43:18 +02002203 args->vararg->annotation, &annotations_len))
2204 return 0;
2205 if (!compiler_visit_argannotations(c, args->kwonlyargs, &annotations_len))
2206 return 0;
Benjamin Petersoncda75be2013-03-18 10:48:58 -07002207 if (args->kwarg && args->kwarg->annotation &&
Yury Selivanovf315c1c2015-07-23 09:10:44 +03002208 !compiler_visit_argannotation(c, args->kwarg->arg,
Yurii Karabas73019792020-11-25 12:43:18 +02002209 args->kwarg->annotation, &annotations_len))
2210 return 0;
Neal Norwitzc1505362006-12-28 06:47:50 +00002211
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002212 if (!return_str) {
2213 return_str = PyUnicode_InternFromString("return");
2214 if (!return_str)
Yurii Karabas73019792020-11-25 12:43:18 +02002215 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002216 }
Yurii Karabas73019792020-11-25 12:43:18 +02002217 if (!compiler_visit_argannotation(c, return_str, returns, &annotations_len)) {
2218 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002219 }
2220
Yurii Karabas73019792020-11-25 12:43:18 +02002221 if (annotations_len) {
2222 ADDOP_I(c, BUILD_TUPLE, annotations_len);
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03002223 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002224 }
Neal Norwitzc1505362006-12-28 06:47:50 +00002225
Yurii Karabas73019792020-11-25 12:43:18 +02002226 return -1;
Neal Norwitzc1505362006-12-28 06:47:50 +00002227}
2228
2229static int
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03002230compiler_visit_defaults(struct compiler *c, arguments_ty args)
2231{
2232 VISIT_SEQ(c, expr, args->defaults);
2233 ADDOP_I(c, BUILD_TUPLE, asdl_seq_LEN(args->defaults));
2234 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002235}
2236
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002237static Py_ssize_t
2238compiler_default_arguments(struct compiler *c, arguments_ty args)
2239{
2240 Py_ssize_t funcflags = 0;
2241 if (args->defaults && asdl_seq_LEN(args->defaults) > 0) {
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03002242 if (!compiler_visit_defaults(c, args))
2243 return -1;
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002244 funcflags |= 0x01;
2245 }
2246 if (args->kwonlyargs) {
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03002247 int res = compiler_visit_kwonlydefaults(c, args->kwonlyargs,
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002248 args->kw_defaults);
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03002249 if (res == 0) {
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002250 return -1;
2251 }
2252 else if (res > 0) {
2253 funcflags |= 0x02;
2254 }
2255 }
2256 return funcflags;
2257}
2258
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002259static int
Pablo Galindoc5fc1562020-04-22 23:29:27 +01002260forbidden_name(struct compiler *c, identifier name, expr_context_ty ctx)
2261{
2262
2263 if (ctx == Store && _PyUnicode_EqualToASCIIString(name, "__debug__")) {
2264 compiler_error(c, "cannot assign to __debug__");
2265 return 1;
2266 }
2267 return 0;
2268}
2269
2270static int
2271compiler_check_debug_one_arg(struct compiler *c, arg_ty arg)
2272{
2273 if (arg != NULL) {
2274 if (forbidden_name(c, arg->arg, Store))
2275 return 0;
2276 }
2277 return 1;
2278}
2279
2280static int
Pablo Galindoa5634c42020-09-16 19:42:00 +01002281compiler_check_debug_args_seq(struct compiler *c, asdl_arg_seq *args)
Pablo Galindoc5fc1562020-04-22 23:29:27 +01002282{
2283 if (args != NULL) {
Pablo Galindoee40e4b2020-04-23 03:43:08 +01002284 for (Py_ssize_t i = 0, n = asdl_seq_LEN(args); i < n; i++) {
Pablo Galindoc5fc1562020-04-22 23:29:27 +01002285 if (!compiler_check_debug_one_arg(c, asdl_seq_GET(args, i)))
2286 return 0;
2287 }
2288 }
2289 return 1;
2290}
2291
2292static int
2293compiler_check_debug_args(struct compiler *c, arguments_ty args)
2294{
2295 if (!compiler_check_debug_args_seq(c, args->posonlyargs))
2296 return 0;
2297 if (!compiler_check_debug_args_seq(c, args->args))
2298 return 0;
2299 if (!compiler_check_debug_one_arg(c, args->vararg))
2300 return 0;
2301 if (!compiler_check_debug_args_seq(c, args->kwonlyargs))
2302 return 0;
2303 if (!compiler_check_debug_one_arg(c, args->kwarg))
2304 return 0;
2305 return 1;
2306}
2307
2308static int
Yury Selivanov75445082015-05-11 22:57:16 -04002309compiler_function(struct compiler *c, stmt_ty s, int is_async)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002310{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002311 PyCodeObject *co;
Serhiy Storchaka143ce5c2018-05-30 10:56:16 +03002312 PyObject *qualname, *docstring = NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04002313 arguments_ty args;
2314 expr_ty returns;
2315 identifier name;
Pablo Galindoa5634c42020-09-16 19:42:00 +01002316 asdl_expr_seq* decos;
2317 asdl_stmt_seq *body;
INADA Naokicb41b272017-02-23 00:31:59 +09002318 Py_ssize_t i, funcflags;
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03002319 int annotations;
Yury Selivanov75445082015-05-11 22:57:16 -04002320 int scope_type;
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +02002321 int firstlineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002322
Yury Selivanov75445082015-05-11 22:57:16 -04002323 if (is_async) {
2324 assert(s->kind == AsyncFunctionDef_kind);
2325
2326 args = s->v.AsyncFunctionDef.args;
2327 returns = s->v.AsyncFunctionDef.returns;
2328 decos = s->v.AsyncFunctionDef.decorator_list;
2329 name = s->v.AsyncFunctionDef.name;
2330 body = s->v.AsyncFunctionDef.body;
2331
2332 scope_type = COMPILER_SCOPE_ASYNC_FUNCTION;
2333 } else {
2334 assert(s->kind == FunctionDef_kind);
2335
2336 args = s->v.FunctionDef.args;
2337 returns = s->v.FunctionDef.returns;
2338 decos = s->v.FunctionDef.decorator_list;
2339 name = s->v.FunctionDef.name;
2340 body = s->v.FunctionDef.body;
2341
2342 scope_type = COMPILER_SCOPE_FUNCTION;
2343 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002344
Pablo Galindoc5fc1562020-04-22 23:29:27 +01002345 if (!compiler_check_debug_args(c, args))
2346 return 0;
2347
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002348 if (!compiler_decorators(c, decos))
2349 return 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +00002350
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +02002351 firstlineno = s->lineno;
2352 if (asdl_seq_LEN(decos)) {
2353 firstlineno = ((expr_ty)asdl_seq_GET(decos, 0))->lineno;
2354 }
2355
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002356 funcflags = compiler_default_arguments(c, args);
2357 if (funcflags == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002358 return 0;
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002359 }
2360
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03002361 annotations = compiler_visit_annotations(c, args, returns);
2362 if (annotations == 0) {
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002363 return 0;
2364 }
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03002365 else if (annotations > 0) {
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002366 funcflags |= 0x04;
2367 }
2368
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +02002369 if (!compiler_enter_scope(c, name, scope_type, (void *)s, firstlineno)) {
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002370 return 0;
2371 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002372
INADA Naokicb41b272017-02-23 00:31:59 +09002373 /* if not -OO mode, add docstring */
Serhiy Storchaka143ce5c2018-05-30 10:56:16 +03002374 if (c->c_optimize < 2) {
2375 docstring = _PyAST_GetDocString(body);
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03002376 }
Serhiy Storchaka143ce5c2018-05-30 10:56:16 +03002377 if (compiler_add_const(c, docstring ? docstring : Py_None) < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002378 compiler_exit_scope(c);
2379 return 0;
2380 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002381
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002382 c->u->u_argcount = asdl_seq_LEN(args->args);
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01002383 c->u->u_posonlyargcount = asdl_seq_LEN(args->posonlyargs);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002384 c->u->u_kwonlyargcount = asdl_seq_LEN(args->kwonlyargs);
Mark Shannon877df852020-11-12 09:43:29 +00002385 for (i = docstring ? 1 : 0; i < asdl_seq_LEN(body); i++) {
Mark Shannonfd009e62020-11-13 12:53:53 +00002386 VISIT_IN_SCOPE(c, stmt, (stmt_ty)asdl_seq_GET(body, i));
Mark Shannon877df852020-11-12 09:43:29 +00002387 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002388 co = assemble(c, 1);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04002389 qualname = c->u->u_qualname;
2390 Py_INCREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002391 compiler_exit_scope(c);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04002392 if (co == NULL) {
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002393 Py_XDECREF(qualname);
2394 Py_XDECREF(co);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002395 return 0;
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002396 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002397
Victor Stinnerba7a99d2021-01-30 01:46:44 +01002398 if (!compiler_make_closure(c, co, funcflags, qualname)) {
2399 Py_DECREF(qualname);
2400 Py_DECREF(co);
2401 return 0;
2402 }
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002403 Py_DECREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002404 Py_DECREF(co);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002405
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002406 /* decorators */
2407 for (i = 0; i < asdl_seq_LEN(decos); i++) {
2408 ADDOP_I(c, CALL_FUNCTION, 1);
2409 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002410
Yury Selivanov75445082015-05-11 22:57:16 -04002411 return compiler_nameop(c, name, Store);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002412}
2413
2414static int
2415compiler_class(struct compiler *c, stmt_ty s)
2416{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002417 PyCodeObject *co;
2418 PyObject *str;
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +02002419 int i, firstlineno;
Pablo Galindoa5634c42020-09-16 19:42:00 +01002420 asdl_expr_seq *decos = s->v.ClassDef.decorator_list;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002421
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002422 if (!compiler_decorators(c, decos))
2423 return 0;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002424
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +02002425 firstlineno = s->lineno;
2426 if (asdl_seq_LEN(decos)) {
2427 firstlineno = ((expr_ty)asdl_seq_GET(decos, 0))->lineno;
2428 }
2429
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002430 /* ultimately generate code for:
2431 <name> = __build_class__(<func>, <name>, *<bases>, **<keywords>)
2432 where:
2433 <func> is a function/closure created from the class body;
2434 it has a single argument (__locals__) where the dict
2435 (or MutableSequence) representing the locals is passed
2436 <name> is the class name
2437 <bases> is the positional arguments and *varargs argument
2438 <keywords> is the keyword arguments and **kwds argument
2439 This borrows from compiler_call.
2440 */
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002441
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002442 /* 1. compile the class body into a code object */
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002443 if (!compiler_enter_scope(c, s->v.ClassDef.name,
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +02002444 COMPILER_SCOPE_CLASS, (void *)s, firstlineno))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002445 return 0;
2446 /* this block represents what we do in the new scope */
2447 {
2448 /* use the class name for name mangling */
2449 Py_INCREF(s->v.ClassDef.name);
Serhiy Storchaka48842712016-04-06 09:45:48 +03002450 Py_XSETREF(c->u->u_private, s->v.ClassDef.name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002451 /* load (global) __name__ ... */
2452 str = PyUnicode_InternFromString("__name__");
2453 if (!str || !compiler_nameop(c, str, Load)) {
2454 Py_XDECREF(str);
2455 compiler_exit_scope(c);
2456 return 0;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002457 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002458 Py_DECREF(str);
2459 /* ... and store it as __module__ */
2460 str = PyUnicode_InternFromString("__module__");
2461 if (!str || !compiler_nameop(c, str, Store)) {
2462 Py_XDECREF(str);
2463 compiler_exit_scope(c);
2464 return 0;
2465 }
2466 Py_DECREF(str);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04002467 assert(c->u->u_qualname);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03002468 ADDOP_LOAD_CONST(c, c->u->u_qualname);
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002469 str = PyUnicode_InternFromString("__qualname__");
2470 if (!str || !compiler_nameop(c, str, Store)) {
2471 Py_XDECREF(str);
2472 compiler_exit_scope(c);
2473 return 0;
2474 }
2475 Py_DECREF(str);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002476 /* compile the body proper */
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03002477 if (!compiler_body(c, s->v.ClassDef.body)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002478 compiler_exit_scope(c);
2479 return 0;
2480 }
Mark Shannone56d54e2021-01-15 13:52:00 +00002481 /* The following code is artificial */
2482 c->u->u_lineno = -1;
Nick Coghlan19d24672016-12-05 16:47:55 +10002483 /* Return __classcell__ if it is referenced, otherwise return None */
Benjamin Peterson312595c2013-05-15 15:26:42 -05002484 if (c->u->u_ste->ste_needs_class_closure) {
Nick Coghlan19d24672016-12-05 16:47:55 +10002485 /* Store __classcell__ into class namespace & return it */
Benjamin Peterson312595c2013-05-15 15:26:42 -05002486 str = PyUnicode_InternFromString("__class__");
2487 if (str == NULL) {
2488 compiler_exit_scope(c);
2489 return 0;
2490 }
2491 i = compiler_lookup_arg(c->u->u_cellvars, str);
2492 Py_DECREF(str);
Victor Stinner98e818b2013-11-05 18:07:34 +01002493 if (i < 0) {
2494 compiler_exit_scope(c);
2495 return 0;
2496 }
Benjamin Peterson312595c2013-05-15 15:26:42 -05002497 assert(i == 0);
Nick Coghlan944368e2016-09-11 14:45:49 +10002498
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002499 ADDOP_I(c, LOAD_CLOSURE, i);
Nick Coghlan19d24672016-12-05 16:47:55 +10002500 ADDOP(c, DUP_TOP);
Nick Coghlan944368e2016-09-11 14:45:49 +10002501 str = PyUnicode_InternFromString("__classcell__");
2502 if (!str || !compiler_nameop(c, str, Store)) {
2503 Py_XDECREF(str);
2504 compiler_exit_scope(c);
2505 return 0;
2506 }
2507 Py_DECREF(str);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002508 }
Benjamin Peterson312595c2013-05-15 15:26:42 -05002509 else {
Nick Coghlan19d24672016-12-05 16:47:55 +10002510 /* No methods referenced __class__, so just return None */
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +02002511 assert(PyDict_GET_SIZE(c->u->u_cellvars) == 0);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03002512 ADDOP_LOAD_CONST(c, Py_None);
Benjamin Peterson312595c2013-05-15 15:26:42 -05002513 }
Nick Coghlan19d24672016-12-05 16:47:55 +10002514 ADDOP_IN_SCOPE(c, RETURN_VALUE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002515 /* create the code object */
2516 co = assemble(c, 1);
2517 }
2518 /* leave the new scope */
2519 compiler_exit_scope(c);
2520 if (co == NULL)
2521 return 0;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002522
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002523 /* 2. load the 'build_class' function */
2524 ADDOP(c, LOAD_BUILD_CLASS);
2525
2526 /* 3. load a function (or closure) made from the code object */
Victor Stinnerba7a99d2021-01-30 01:46:44 +01002527 if (!compiler_make_closure(c, co, 0, NULL)) {
2528 Py_DECREF(co);
2529 return 0;
2530 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002531 Py_DECREF(co);
2532
2533 /* 4. load class name */
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03002534 ADDOP_LOAD_CONST(c, s->v.ClassDef.name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002535
2536 /* 5. generate the rest of the code for the call */
Pablo Galindoa5634c42020-09-16 19:42:00 +01002537 if (!compiler_call_helper(c, 2, s->v.ClassDef.bases, s->v.ClassDef.keywords))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002538 return 0;
2539
2540 /* 6. apply decorators */
2541 for (i = 0; i < asdl_seq_LEN(decos); i++) {
2542 ADDOP_I(c, CALL_FUNCTION, 1);
2543 }
2544
2545 /* 7. store into <name> */
2546 if (!compiler_nameop(c, s->v.ClassDef.name, Store))
2547 return 0;
2548 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002549}
2550
Serhiy Storchaka3bcbedc2019-01-18 07:47:48 +02002551/* Return 0 if the expression is a constant value except named singletons.
2552 Return 1 otherwise. */
2553static int
2554check_is_arg(expr_ty e)
2555{
2556 if (e->kind != Constant_kind) {
2557 return 1;
2558 }
2559 PyObject *value = e->v.Constant.value;
2560 return (value == Py_None
2561 || value == Py_False
2562 || value == Py_True
2563 || value == Py_Ellipsis);
2564}
2565
2566/* Check operands of identity chacks ("is" and "is not").
2567 Emit a warning if any operand is a constant except named singletons.
2568 Return 0 on error.
2569 */
2570static int
2571check_compare(struct compiler *c, expr_ty e)
2572{
2573 Py_ssize_t i, n;
2574 int left = check_is_arg(e->v.Compare.left);
2575 n = asdl_seq_LEN(e->v.Compare.ops);
2576 for (i = 0; i < n; i++) {
2577 cmpop_ty op = (cmpop_ty)asdl_seq_GET(e->v.Compare.ops, i);
2578 int right = check_is_arg((expr_ty)asdl_seq_GET(e->v.Compare.comparators, i));
2579 if (op == Is || op == IsNot) {
2580 if (!right || !left) {
2581 const char *msg = (op == Is)
2582 ? "\"is\" with a literal. Did you mean \"==\"?"
2583 : "\"is not\" with a literal. Did you mean \"!=\"?";
2584 return compiler_warn(c, msg);
2585 }
2586 }
2587 left = right;
2588 }
2589 return 1;
2590}
2591
Mark Shannon9af0e472020-01-14 10:12:45 +00002592static int compiler_addcompare(struct compiler *c, cmpop_ty op)
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002593{
Mark Shannon9af0e472020-01-14 10:12:45 +00002594 int cmp;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002595 switch (op) {
2596 case Eq:
Mark Shannon9af0e472020-01-14 10:12:45 +00002597 cmp = Py_EQ;
2598 break;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002599 case NotEq:
Mark Shannon9af0e472020-01-14 10:12:45 +00002600 cmp = Py_NE;
2601 break;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002602 case Lt:
Mark Shannon9af0e472020-01-14 10:12:45 +00002603 cmp = Py_LT;
2604 break;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002605 case LtE:
Mark Shannon9af0e472020-01-14 10:12:45 +00002606 cmp = Py_LE;
2607 break;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002608 case Gt:
Mark Shannon9af0e472020-01-14 10:12:45 +00002609 cmp = Py_GT;
2610 break;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002611 case GtE:
Mark Shannon9af0e472020-01-14 10:12:45 +00002612 cmp = Py_GE;
2613 break;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002614 case Is:
Mark Shannon9af0e472020-01-14 10:12:45 +00002615 ADDOP_I(c, IS_OP, 0);
2616 return 1;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002617 case IsNot:
Mark Shannon9af0e472020-01-14 10:12:45 +00002618 ADDOP_I(c, IS_OP, 1);
2619 return 1;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002620 case In:
Mark Shannon9af0e472020-01-14 10:12:45 +00002621 ADDOP_I(c, CONTAINS_OP, 0);
2622 return 1;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002623 case NotIn:
Mark Shannon9af0e472020-01-14 10:12:45 +00002624 ADDOP_I(c, CONTAINS_OP, 1);
2625 return 1;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002626 default:
Mark Shannon9af0e472020-01-14 10:12:45 +00002627 Py_UNREACHABLE();
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002628 }
Mark Shannon9af0e472020-01-14 10:12:45 +00002629 ADDOP_I(c, COMPARE_OP, cmp);
2630 return 1;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002631}
2632
Mark Shannon9af0e472020-01-14 10:12:45 +00002633
2634
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002635static int
2636compiler_jump_if(struct compiler *c, expr_ty e, basicblock *next, int cond)
2637{
2638 switch (e->kind) {
2639 case UnaryOp_kind:
2640 if (e->v.UnaryOp.op == Not)
2641 return compiler_jump_if(c, e->v.UnaryOp.operand, next, !cond);
2642 /* fallback to general implementation */
2643 break;
2644 case BoolOp_kind: {
Pablo Galindoa5634c42020-09-16 19:42:00 +01002645 asdl_expr_seq *s = e->v.BoolOp.values;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002646 Py_ssize_t i, n = asdl_seq_LEN(s) - 1;
2647 assert(n >= 0);
2648 int cond2 = e->v.BoolOp.op == Or;
2649 basicblock *next2 = next;
2650 if (!cond2 != !cond) {
2651 next2 = compiler_new_block(c);
2652 if (next2 == NULL)
2653 return 0;
2654 }
2655 for (i = 0; i < n; ++i) {
2656 if (!compiler_jump_if(c, (expr_ty)asdl_seq_GET(s, i), next2, cond2))
2657 return 0;
2658 }
2659 if (!compiler_jump_if(c, (expr_ty)asdl_seq_GET(s, n), next, cond))
2660 return 0;
2661 if (next2 != next)
2662 compiler_use_next_block(c, next2);
2663 return 1;
2664 }
2665 case IfExp_kind: {
2666 basicblock *end, *next2;
2667 end = compiler_new_block(c);
2668 if (end == NULL)
2669 return 0;
2670 next2 = compiler_new_block(c);
2671 if (next2 == NULL)
2672 return 0;
2673 if (!compiler_jump_if(c, e->v.IfExp.test, next2, 0))
2674 return 0;
2675 if (!compiler_jump_if(c, e->v.IfExp.body, next, cond))
2676 return 0;
Mark Shannon127dde52021-01-04 18:06:55 +00002677 ADDOP_JUMP_NOLINE(c, JUMP_FORWARD, end);
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002678 compiler_use_next_block(c, next2);
2679 if (!compiler_jump_if(c, e->v.IfExp.orelse, next, cond))
2680 return 0;
2681 compiler_use_next_block(c, end);
2682 return 1;
2683 }
2684 case Compare_kind: {
2685 Py_ssize_t i, n = asdl_seq_LEN(e->v.Compare.ops) - 1;
2686 if (n > 0) {
Serhiy Storchaka45835252019-02-16 08:29:46 +02002687 if (!check_compare(c, e)) {
2688 return 0;
2689 }
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002690 basicblock *cleanup = compiler_new_block(c);
2691 if (cleanup == NULL)
2692 return 0;
2693 VISIT(c, expr, e->v.Compare.left);
2694 for (i = 0; i < n; i++) {
2695 VISIT(c, expr,
2696 (expr_ty)asdl_seq_GET(e->v.Compare.comparators, i));
2697 ADDOP(c, DUP_TOP);
2698 ADDOP(c, ROT_THREE);
Mark Shannon9af0e472020-01-14 10:12:45 +00002699 ADDOP_COMPARE(c, asdl_seq_GET(e->v.Compare.ops, i));
Mark Shannon582aaf12020-08-04 17:30:11 +01002700 ADDOP_JUMP(c, POP_JUMP_IF_FALSE, cleanup);
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002701 NEXT_BLOCK(c);
2702 }
2703 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, n));
Mark Shannon9af0e472020-01-14 10:12:45 +00002704 ADDOP_COMPARE(c, asdl_seq_GET(e->v.Compare.ops, n));
Mark Shannon582aaf12020-08-04 17:30:11 +01002705 ADDOP_JUMP(c, cond ? POP_JUMP_IF_TRUE : POP_JUMP_IF_FALSE, next);
Mark Shannon266b4622020-11-17 19:30:14 +00002706 NEXT_BLOCK(c);
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002707 basicblock *end = compiler_new_block(c);
2708 if (end == NULL)
2709 return 0;
Mark Shannon127dde52021-01-04 18:06:55 +00002710 ADDOP_JUMP_NOLINE(c, JUMP_FORWARD, end);
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002711 compiler_use_next_block(c, cleanup);
2712 ADDOP(c, POP_TOP);
2713 if (!cond) {
Mark Shannon127dde52021-01-04 18:06:55 +00002714 ADDOP_JUMP_NOLINE(c, JUMP_FORWARD, next);
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002715 }
2716 compiler_use_next_block(c, end);
2717 return 1;
2718 }
2719 /* fallback to general implementation */
2720 break;
2721 }
2722 default:
2723 /* fallback to general implementation */
2724 break;
2725 }
2726
2727 /* general implementation */
2728 VISIT(c, expr, e);
Mark Shannon582aaf12020-08-04 17:30:11 +01002729 ADDOP_JUMP(c, cond ? POP_JUMP_IF_TRUE : POP_JUMP_IF_FALSE, next);
Mark Shannon266b4622020-11-17 19:30:14 +00002730 NEXT_BLOCK(c);
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002731 return 1;
2732}
2733
2734static int
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002735compiler_ifexp(struct compiler *c, expr_ty e)
2736{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002737 basicblock *end, *next;
2738
2739 assert(e->kind == IfExp_kind);
2740 end = compiler_new_block(c);
2741 if (end == NULL)
2742 return 0;
2743 next = compiler_new_block(c);
2744 if (next == NULL)
2745 return 0;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002746 if (!compiler_jump_if(c, e->v.IfExp.test, next, 0))
2747 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002748 VISIT(c, expr, e->v.IfExp.body);
Mark Shannon127dde52021-01-04 18:06:55 +00002749 ADDOP_JUMP_NOLINE(c, JUMP_FORWARD, end);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002750 compiler_use_next_block(c, next);
2751 VISIT(c, expr, e->v.IfExp.orelse);
2752 compiler_use_next_block(c, end);
2753 return 1;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002754}
2755
2756static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002757compiler_lambda(struct compiler *c, expr_ty e)
2758{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002759 PyCodeObject *co;
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002760 PyObject *qualname;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002761 static identifier name;
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002762 Py_ssize_t funcflags;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002763 arguments_ty args = e->v.Lambda.args;
2764 assert(e->kind == Lambda_kind);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002765
Pablo Galindoc5fc1562020-04-22 23:29:27 +01002766 if (!compiler_check_debug_args(c, args))
2767 return 0;
2768
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002769 if (!name) {
2770 name = PyUnicode_InternFromString("<lambda>");
2771 if (!name)
2772 return 0;
2773 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002774
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002775 funcflags = compiler_default_arguments(c, args);
2776 if (funcflags == -1) {
2777 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002778 }
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002779
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04002780 if (!compiler_enter_scope(c, name, COMPILER_SCOPE_LAMBDA,
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002781 (void *)e, e->lineno))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002782 return 0;
Neal Norwitz4737b232005-11-19 23:58:29 +00002783
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002784 /* Make None the first constant, so the lambda can't have a
2785 docstring. */
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03002786 if (compiler_add_const(c, Py_None) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002787 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002788
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002789 c->u->u_argcount = asdl_seq_LEN(args->args);
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01002790 c->u->u_posonlyargcount = asdl_seq_LEN(args->posonlyargs);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002791 c->u->u_kwonlyargcount = asdl_seq_LEN(args->kwonlyargs);
2792 VISIT_IN_SCOPE(c, expr, e->v.Lambda.body);
2793 if (c->u->u_ste->ste_generator) {
Serhiy Storchakac775ad62015-03-11 18:20:35 +02002794 co = assemble(c, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002795 }
2796 else {
2797 ADDOP_IN_SCOPE(c, RETURN_VALUE);
Serhiy Storchakac775ad62015-03-11 18:20:35 +02002798 co = assemble(c, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002799 }
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04002800 qualname = c->u->u_qualname;
2801 Py_INCREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002802 compiler_exit_scope(c);
Pablo Galindo7fdab832021-01-29 22:40:59 +00002803 if (co == NULL) {
2804 Py_DECREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002805 return 0;
Pablo Galindo7fdab832021-01-29 22:40:59 +00002806 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002807
Victor Stinnerba7a99d2021-01-30 01:46:44 +01002808 if (!compiler_make_closure(c, co, funcflags, qualname)) {
2809 Py_DECREF(qualname);
2810 Py_DECREF(co);
2811 return 0;
2812 }
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002813 Py_DECREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002814 Py_DECREF(co);
2815
2816 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002817}
2818
2819static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002820compiler_if(struct compiler *c, stmt_ty s)
2821{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002822 basicblock *end, *next;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002823 assert(s->kind == If_kind);
2824 end = compiler_new_block(c);
Mark Shannon8473cf82020-12-15 11:07:50 +00002825 if (end == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002826 return 0;
Mark Shannon8473cf82020-12-15 11:07:50 +00002827 }
2828 if (asdl_seq_LEN(s->v.If.orelse)) {
2829 next = compiler_new_block(c);
2830 if (next == NULL) {
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002831 return 0;
Mark Shannonfee55262019-11-21 09:11:43 +00002832 }
Mark Shannon8473cf82020-12-15 11:07:50 +00002833 }
2834 else {
2835 next = end;
2836 }
2837 if (!compiler_jump_if(c, s->v.If.test, next, 0)) {
2838 return 0;
2839 }
2840 VISIT_SEQ(c, stmt, s->v.If.body);
2841 if (asdl_seq_LEN(s->v.If.orelse)) {
Mark Shannon127dde52021-01-04 18:06:55 +00002842 ADDOP_JUMP_NOLINE(c, JUMP_FORWARD, end);
Mark Shannon8473cf82020-12-15 11:07:50 +00002843 compiler_use_next_block(c, next);
2844 VISIT_SEQ(c, stmt, s->v.If.orelse);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002845 }
2846 compiler_use_next_block(c, end);
2847 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002848}
2849
2850static int
2851compiler_for(struct compiler *c, stmt_ty s)
2852{
Mark Shannon5977a792020-12-02 13:31:40 +00002853 basicblock *start, *body, *cleanup, *end;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002854
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002855 start = compiler_new_block(c);
Mark Shannon5977a792020-12-02 13:31:40 +00002856 body = compiler_new_block(c);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002857 cleanup = compiler_new_block(c);
2858 end = compiler_new_block(c);
Mark Shannon5977a792020-12-02 13:31:40 +00002859 if (start == NULL || body == NULL || end == NULL || cleanup == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002860 return 0;
Mark Shannonfee55262019-11-21 09:11:43 +00002861 }
2862 if (!compiler_push_fblock(c, FOR_LOOP, start, end, NULL)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002863 return 0;
Mark Shannonfee55262019-11-21 09:11:43 +00002864 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002865 VISIT(c, expr, s->v.For.iter);
2866 ADDOP(c, GET_ITER);
2867 compiler_use_next_block(c, start);
Mark Shannon582aaf12020-08-04 17:30:11 +01002868 ADDOP_JUMP(c, FOR_ITER, cleanup);
Mark Shannon5977a792020-12-02 13:31:40 +00002869 compiler_use_next_block(c, body);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002870 VISIT(c, expr, s->v.For.target);
2871 VISIT_SEQ(c, stmt, s->v.For.body);
Mark Shannonf5e97b72020-12-14 11:28:39 +00002872 /* Mark jump as artificial */
2873 c->u->u_lineno = -1;
Mark Shannon582aaf12020-08-04 17:30:11 +01002874 ADDOP_JUMP(c, JUMP_ABSOLUTE, start);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002875 compiler_use_next_block(c, cleanup);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002876
2877 compiler_pop_fblock(c, FOR_LOOP, start);
2878
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002879 VISIT_SEQ(c, stmt, s->v.For.orelse);
2880 compiler_use_next_block(c, end);
2881 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002882}
2883
Yury Selivanov75445082015-05-11 22:57:16 -04002884
2885static int
2886compiler_async_for(struct compiler *c, stmt_ty s)
2887{
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002888 basicblock *start, *except, *end;
Pablo Galindo90235812020-03-15 04:29:22 +00002889 if (IS_TOP_LEVEL_AWAIT(c)){
Matthias Bussonnier565b4f12019-05-21 13:12:03 -07002890 c->u->u_ste->ste_coroutine = 1;
2891 } else if (c->u->u_scope_type != COMPILER_SCOPE_ASYNC_FUNCTION) {
Zsolt Dollensteine2396502018-04-27 08:58:56 -07002892 return compiler_error(c, "'async for' outside async function");
2893 }
2894
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002895 start = compiler_new_block(c);
Yury Selivanov75445082015-05-11 22:57:16 -04002896 except = compiler_new_block(c);
2897 end = compiler_new_block(c);
Yury Selivanov75445082015-05-11 22:57:16 -04002898
Mark Shannonfee55262019-11-21 09:11:43 +00002899 if (start == NULL || except == NULL || end == NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04002900 return 0;
Mark Shannonfee55262019-11-21 09:11:43 +00002901 }
Yury Selivanov75445082015-05-11 22:57:16 -04002902 VISIT(c, expr, s->v.AsyncFor.iter);
2903 ADDOP(c, GET_AITER);
Yury Selivanov75445082015-05-11 22:57:16 -04002904
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002905 compiler_use_next_block(c, start);
Mark Shannonfee55262019-11-21 09:11:43 +00002906 if (!compiler_push_fblock(c, FOR_LOOP, start, end, NULL)) {
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002907 return 0;
Mark Shannonfee55262019-11-21 09:11:43 +00002908 }
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002909 /* SETUP_FINALLY to guard the __anext__ call */
Mark Shannon582aaf12020-08-04 17:30:11 +01002910 ADDOP_JUMP(c, SETUP_FINALLY, except);
Yury Selivanov75445082015-05-11 22:57:16 -04002911 ADDOP(c, GET_ANEXT);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03002912 ADDOP_LOAD_CONST(c, Py_None);
Yury Selivanov75445082015-05-11 22:57:16 -04002913 ADDOP(c, YIELD_FROM);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002914 ADDOP(c, POP_BLOCK); /* for SETUP_FINALLY */
Yury Selivanov75445082015-05-11 22:57:16 -04002915
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002916 /* Success block for __anext__ */
2917 VISIT(c, expr, s->v.AsyncFor.target);
2918 VISIT_SEQ(c, stmt, s->v.AsyncFor.body);
Mark Shannon582aaf12020-08-04 17:30:11 +01002919 ADDOP_JUMP(c, JUMP_ABSOLUTE, start);
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002920
2921 compiler_pop_fblock(c, FOR_LOOP, start);
Yury Selivanov75445082015-05-11 22:57:16 -04002922
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002923 /* Except block for __anext__ */
Yury Selivanov75445082015-05-11 22:57:16 -04002924 compiler_use_next_block(c, except);
Mark Shannon877df852020-11-12 09:43:29 +00002925
Mark Shannon47695e32021-07-15 15:54:38 +01002926 /* Use same line number as the iterator,
2927 * as the END_ASYNC_FOR succeeds the `for`, not the body. */
2928 SET_LOC(c, s->v.AsyncFor.iter);
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002929 ADDOP(c, END_ASYNC_FOR);
Yury Selivanov75445082015-05-11 22:57:16 -04002930
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002931 /* `else` block */
Yury Selivanov75445082015-05-11 22:57:16 -04002932 VISIT_SEQ(c, stmt, s->v.For.orelse);
2933
2934 compiler_use_next_block(c, end);
2935
2936 return 1;
2937}
2938
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002939static int
2940compiler_while(struct compiler *c, stmt_ty s)
2941{
Mark Shannon266b4622020-11-17 19:30:14 +00002942 basicblock *loop, *body, *end, *anchor = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002943 loop = compiler_new_block(c);
Mark Shannon266b4622020-11-17 19:30:14 +00002944 body = compiler_new_block(c);
2945 anchor = compiler_new_block(c);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002946 end = compiler_new_block(c);
Mark Shannon266b4622020-11-17 19:30:14 +00002947 if (loop == NULL || body == NULL || anchor == NULL || end == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002948 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002949 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002950 compiler_use_next_block(c, loop);
Mark Shannon266b4622020-11-17 19:30:14 +00002951 if (!compiler_push_fblock(c, WHILE_LOOP, loop, end, NULL)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002952 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002953 }
Mark Shannon8473cf82020-12-15 11:07:50 +00002954 if (!compiler_jump_if(c, s->v.While.test, anchor, 0)) {
2955 return 0;
Mark Shannon266b4622020-11-17 19:30:14 +00002956 }
2957
2958 compiler_use_next_block(c, body);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002959 VISIT_SEQ(c, stmt, s->v.While.body);
Mark Shannon8473cf82020-12-15 11:07:50 +00002960 SET_LOC(c, s);
2961 if (!compiler_jump_if(c, s->v.While.test, body, 1)) {
2962 return 0;
2963 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002964
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002965 compiler_pop_fblock(c, WHILE_LOOP, loop);
2966
Mark Shannon266b4622020-11-17 19:30:14 +00002967 compiler_use_next_block(c, anchor);
2968 if (s->v.While.orelse) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002969 VISIT_SEQ(c, stmt, s->v.While.orelse);
Mark Shannon266b4622020-11-17 19:30:14 +00002970 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002971 compiler_use_next_block(c, end);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002972
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002973 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002974}
2975
2976static int
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002977compiler_return(struct compiler *c, stmt_ty s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002978{
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002979 int preserve_tos = ((s->v.Return.value != NULL) &&
Serhiy Storchaka3f228112018-09-27 17:42:37 +03002980 (s->v.Return.value->kind != Constant_kind));
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002981 if (c->u->u_ste->ste_type != FunctionBlock)
2982 return compiler_error(c, "'return' outside function");
2983 if (s->v.Return.value != NULL &&
2984 c->u->u_ste->ste_coroutine && c->u->u_ste->ste_generator)
2985 {
2986 return compiler_error(
2987 c, "'return' with value in async generator");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002988 }
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002989 if (preserve_tos) {
2990 VISIT(c, expr, s->v.Return.value);
Mark Shannon5274b682020-12-16 13:07:01 +00002991 } else {
Mark Shannoncea05852021-06-03 19:57:31 +01002992 /* Emit instruction with line number for return value */
Mark Shannon5274b682020-12-16 13:07:01 +00002993 if (s->v.Return.value != NULL) {
2994 SET_LOC(c, s->v.Return.value);
2995 ADDOP(c, NOP);
2996 }
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002997 }
Mark Shannoncea05852021-06-03 19:57:31 +01002998 if (s->v.Return.value == NULL || s->v.Return.value->lineno != s->lineno) {
2999 SET_LOC(c, s);
3000 ADDOP(c, NOP);
3001 }
3002
Mark Shannonfee55262019-11-21 09:11:43 +00003003 if (!compiler_unwind_fblock_stack(c, preserve_tos, NULL))
3004 return 0;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003005 if (s->v.Return.value == NULL) {
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03003006 ADDOP_LOAD_CONST(c, Py_None);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003007 }
3008 else if (!preserve_tos) {
Mark Shannon5274b682020-12-16 13:07:01 +00003009 ADDOP_LOAD_CONST(c, s->v.Return.value->v.Constant.value);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003010 }
3011 ADDOP(c, RETURN_VALUE);
Mark Shannon266b4622020-11-17 19:30:14 +00003012 NEXT_BLOCK(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003013
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003014 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003015}
3016
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003017static int
3018compiler_break(struct compiler *c)
3019{
Mark Shannonfee55262019-11-21 09:11:43 +00003020 struct fblockinfo *loop = NULL;
Mark Shannoncea05852021-06-03 19:57:31 +01003021 /* Emit instruction with line number */
3022 ADDOP(c, NOP);
Mark Shannonfee55262019-11-21 09:11:43 +00003023 if (!compiler_unwind_fblock_stack(c, 0, &loop)) {
3024 return 0;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003025 }
Mark Shannonfee55262019-11-21 09:11:43 +00003026 if (loop == NULL) {
3027 return compiler_error(c, "'break' outside loop");
3028 }
3029 if (!compiler_unwind_fblock(c, loop, 0)) {
3030 return 0;
3031 }
Mark Shannon582aaf12020-08-04 17:30:11 +01003032 ADDOP_JUMP(c, JUMP_ABSOLUTE, loop->fb_exit);
Mark Shannon266b4622020-11-17 19:30:14 +00003033 NEXT_BLOCK(c);
Mark Shannonfee55262019-11-21 09:11:43 +00003034 return 1;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003035}
3036
3037static int
3038compiler_continue(struct compiler *c)
3039{
Mark Shannonfee55262019-11-21 09:11:43 +00003040 struct fblockinfo *loop = NULL;
Mark Shannoncea05852021-06-03 19:57:31 +01003041 /* Emit instruction with line number */
3042 ADDOP(c, NOP);
Mark Shannonfee55262019-11-21 09:11:43 +00003043 if (!compiler_unwind_fblock_stack(c, 0, &loop)) {
3044 return 0;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003045 }
Mark Shannonfee55262019-11-21 09:11:43 +00003046 if (loop == NULL) {
3047 return compiler_error(c, "'continue' not properly in loop");
3048 }
Mark Shannon582aaf12020-08-04 17:30:11 +01003049 ADDOP_JUMP(c, JUMP_ABSOLUTE, loop->fb_block);
Mark Shannon266b4622020-11-17 19:30:14 +00003050 NEXT_BLOCK(c)
Mark Shannonfee55262019-11-21 09:11:43 +00003051 return 1;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003052}
3053
3054
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003055/* Code generated for "try: <body> finally: <finalbody>" is as follows:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003056
3057 SETUP_FINALLY L
3058 <code for body>
3059 POP_BLOCK
Mark Shannonfee55262019-11-21 09:11:43 +00003060 <code for finalbody>
3061 JUMP E
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003062 L:
3063 <code for finalbody>
Mark Shannonfee55262019-11-21 09:11:43 +00003064 E:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003065
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003066 The special instructions use the block stack. Each block
3067 stack entry contains the instruction that created it (here
3068 SETUP_FINALLY), the level of the value stack at the time the
3069 block stack entry was created, and a label (here L).
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003070
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003071 SETUP_FINALLY:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003072 Pushes the current value stack level and the label
3073 onto the block stack.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003074 POP_BLOCK:
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003075 Pops en entry from the block stack.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003076
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003077 The block stack is unwound when an exception is raised:
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003078 when a SETUP_FINALLY entry is found, the raised and the caught
3079 exceptions are pushed onto the value stack (and the exception
3080 condition is cleared), and the interpreter jumps to the label
3081 gotten from the block stack.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003082*/
3083
3084static int
3085compiler_try_finally(struct compiler *c, stmt_ty s)
3086{
Mark Shannonfee55262019-11-21 09:11:43 +00003087 basicblock *body, *end, *exit;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003088
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003089 body = compiler_new_block(c);
3090 end = compiler_new_block(c);
Mark Shannonfee55262019-11-21 09:11:43 +00003091 exit = compiler_new_block(c);
3092 if (body == NULL || end == NULL || exit == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003093 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003094
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003095 /* `try` block */
Mark Shannon582aaf12020-08-04 17:30:11 +01003096 ADDOP_JUMP(c, SETUP_FINALLY, end);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003097 compiler_use_next_block(c, body);
Mark Shannonfee55262019-11-21 09:11:43 +00003098 if (!compiler_push_fblock(c, FINALLY_TRY, body, end, s->v.Try.finalbody))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003099 return 0;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003100 if (s->v.Try.handlers && asdl_seq_LEN(s->v.Try.handlers)) {
3101 if (!compiler_try_except(c, s))
3102 return 0;
3103 }
3104 else {
3105 VISIT_SEQ(c, stmt, s->v.Try.body);
3106 }
Mark Shannon3bd60352021-01-13 12:05:43 +00003107 ADDOP_NOLINE(c, POP_BLOCK);
Mark Shannonfee55262019-11-21 09:11:43 +00003108 compiler_pop_fblock(c, FINALLY_TRY, body);
3109 VISIT_SEQ(c, stmt, s->v.Try.finalbody);
Mark Shannon127dde52021-01-04 18:06:55 +00003110 ADDOP_JUMP_NOLINE(c, JUMP_FORWARD, exit);
Mark Shannonfee55262019-11-21 09:11:43 +00003111 /* `finally` block */
3112 compiler_use_next_block(c, end);
3113 if (!compiler_push_fblock(c, FINALLY_END, end, NULL, NULL))
3114 return 0;
3115 VISIT_SEQ(c, stmt, s->v.Try.finalbody);
3116 compiler_pop_fblock(c, FINALLY_END, end);
Mark Shannonbf353f32020-12-17 13:55:28 +00003117 ADDOP_I(c, RERAISE, 0);
Mark Shannonfee55262019-11-21 09:11:43 +00003118 compiler_use_next_block(c, exit);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003119 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003120}
3121
3122/*
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00003123 Code generated for "try: S except E1 as V1: S1 except E2 as V2: S2 ...":
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003124 (The contents of the value stack is shown in [], with the top
3125 at the right; 'tb' is trace-back info, 'val' the exception's
3126 associated value, and 'exc' the exception.)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003127
3128 Value stack Label Instruction Argument
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003129 [] SETUP_FINALLY L1
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003130 [] <code for S>
3131 [] POP_BLOCK
3132 [] JUMP_FORWARD L0
3133
3134 [tb, val, exc] L1: DUP )
3135 [tb, val, exc, exc] <evaluate E1> )
Mark Shannon9af0e472020-01-14 10:12:45 +00003136 [tb, val, exc, exc, E1] JUMP_IF_NOT_EXC_MATCH L2 ) only if E1
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003137 [tb, val, exc] POP
3138 [tb, val] <assign to V1> (or POP if no V1)
3139 [tb] POP
3140 [] <code for S1>
3141 JUMP_FORWARD L0
3142
3143 [tb, val, exc] L2: DUP
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003144 .............................etc.......................
3145
Mark Shannonfee55262019-11-21 09:11:43 +00003146 [tb, val, exc] Ln+1: RERAISE # re-raise exception
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003147
3148 [] L0: <next statement>
3149
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003150 Of course, parts are not generated if Vi or Ei is not present.
3151*/
3152static int
3153compiler_try_except(struct compiler *c, stmt_ty s)
3154{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003155 basicblock *body, *orelse, *except, *end;
Victor Stinnerad9a0662013-11-19 22:23:20 +01003156 Py_ssize_t i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003157
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003158 body = compiler_new_block(c);
3159 except = compiler_new_block(c);
3160 orelse = compiler_new_block(c);
3161 end = compiler_new_block(c);
3162 if (body == NULL || except == NULL || orelse == NULL || end == NULL)
3163 return 0;
Mark Shannon582aaf12020-08-04 17:30:11 +01003164 ADDOP_JUMP(c, SETUP_FINALLY, except);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003165 compiler_use_next_block(c, body);
Mark Shannon02d126a2020-09-25 14:04:19 +01003166 if (!compiler_push_fblock(c, TRY_EXCEPT, body, NULL, NULL))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003167 return 0;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003168 VISIT_SEQ(c, stmt, s->v.Try.body);
Mark Shannon02d126a2020-09-25 14:04:19 +01003169 compiler_pop_fblock(c, TRY_EXCEPT, body);
Mark Shannon3bd60352021-01-13 12:05:43 +00003170 ADDOP_NOLINE(c, POP_BLOCK);
3171 ADDOP_JUMP_NOLINE(c, JUMP_FORWARD, orelse);
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003172 n = asdl_seq_LEN(s->v.Try.handlers);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003173 compiler_use_next_block(c, except);
Mark Shannon02d126a2020-09-25 14:04:19 +01003174 /* Runtime will push a block here, so we need to account for that */
3175 if (!compiler_push_fblock(c, EXCEPTION_HANDLER, NULL, NULL, NULL))
3176 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003177 for (i = 0; i < n; i++) {
3178 excepthandler_ty handler = (excepthandler_ty)asdl_seq_GET(
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003179 s->v.Try.handlers, i);
Mark Shannon8d4b1842021-05-06 13:38:50 +01003180 SET_LOC(c, handler);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003181 if (!handler->v.ExceptHandler.type && i < n-1)
3182 return compiler_error(c, "default 'except:' must be last");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003183 except = compiler_new_block(c);
3184 if (except == NULL)
3185 return 0;
3186 if (handler->v.ExceptHandler.type) {
3187 ADDOP(c, DUP_TOP);
3188 VISIT(c, expr, handler->v.ExceptHandler.type);
Mark Shannon582aaf12020-08-04 17:30:11 +01003189 ADDOP_JUMP(c, JUMP_IF_NOT_EXC_MATCH, except);
Mark Shannon266b4622020-11-17 19:30:14 +00003190 NEXT_BLOCK(c);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003191 }
3192 ADDOP(c, POP_TOP);
3193 if (handler->v.ExceptHandler.name) {
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003194 basicblock *cleanup_end, *cleanup_body;
Guido van Rossumb940e112007-01-10 16:19:56 +00003195
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003196 cleanup_end = compiler_new_block(c);
3197 cleanup_body = compiler_new_block(c);
Zackery Spytz53ebf4b2018-10-11 23:54:03 -06003198 if (cleanup_end == NULL || cleanup_body == NULL) {
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003199 return 0;
Zackery Spytz53ebf4b2018-10-11 23:54:03 -06003200 }
Guido van Rossumb940e112007-01-10 16:19:56 +00003201
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003202 compiler_nameop(c, handler->v.ExceptHandler.name, Store);
3203 ADDOP(c, POP_TOP);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003204
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003205 /*
3206 try:
Ezio Melotti1b6424f2013-04-19 07:10:09 +03003207 # body
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003208 except type as name:
Ezio Melotti1b6424f2013-04-19 07:10:09 +03003209 try:
3210 # body
3211 finally:
Chris Angelicoad098b62019-05-21 23:34:19 +10003212 name = None # in case body contains "del name"
Ezio Melotti1b6424f2013-04-19 07:10:09 +03003213 del name
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003214 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003215
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003216 /* second try: */
Mark Shannon582aaf12020-08-04 17:30:11 +01003217 ADDOP_JUMP(c, SETUP_FINALLY, cleanup_end);
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003218 compiler_use_next_block(c, cleanup_body);
Mark Shannonfee55262019-11-21 09:11:43 +00003219 if (!compiler_push_fblock(c, HANDLER_CLEANUP, cleanup_body, NULL, handler->v.ExceptHandler.name))
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003220 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003221
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003222 /* second # body */
3223 VISIT_SEQ(c, stmt, handler->v.ExceptHandler.body);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003224 compiler_pop_fblock(c, HANDLER_CLEANUP, cleanup_body);
Mark Shannon877df852020-11-12 09:43:29 +00003225 /* name = None; del name; # Mark as artificial */
3226 c->u->u_lineno = -1;
Mark Shannon794ff7d2021-07-14 11:43:56 +01003227 ADDOP(c, POP_BLOCK);
3228 ADDOP(c, POP_EXCEPT);
Mark Shannonfee55262019-11-21 09:11:43 +00003229 ADDOP_LOAD_CONST(c, Py_None);
3230 compiler_nameop(c, handler->v.ExceptHandler.name, Store);
3231 compiler_nameop(c, handler->v.ExceptHandler.name, Del);
Mark Shannon582aaf12020-08-04 17:30:11 +01003232 ADDOP_JUMP(c, JUMP_FORWARD, end);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003233
Mark Shannonfee55262019-11-21 09:11:43 +00003234 /* except: */
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003235 compiler_use_next_block(c, cleanup_end);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003236
Mark Shannon877df852020-11-12 09:43:29 +00003237 /* name = None; del name; # Mark as artificial */
3238 c->u->u_lineno = -1;
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03003239 ADDOP_LOAD_CONST(c, Py_None);
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003240 compiler_nameop(c, handler->v.ExceptHandler.name, Store);
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003241 compiler_nameop(c, handler->v.ExceptHandler.name, Del);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003242
Mark Shannonbf353f32020-12-17 13:55:28 +00003243 ADDOP_I(c, RERAISE, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003244 }
3245 else {
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003246 basicblock *cleanup_body;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003247
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003248 cleanup_body = compiler_new_block(c);
Benjamin Peterson0a5dad92011-05-27 14:17:04 -05003249 if (!cleanup_body)
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003250 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003251
Guido van Rossumb940e112007-01-10 16:19:56 +00003252 ADDOP(c, POP_TOP);
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003253 ADDOP(c, POP_TOP);
3254 compiler_use_next_block(c, cleanup_body);
Mark Shannonfee55262019-11-21 09:11:43 +00003255 if (!compiler_push_fblock(c, HANDLER_CLEANUP, cleanup_body, NULL, NULL))
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003256 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003257 VISIT_SEQ(c, stmt, handler->v.ExceptHandler.body);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003258 compiler_pop_fblock(c, HANDLER_CLEANUP, cleanup_body);
Mark Shannon127dde52021-01-04 18:06:55 +00003259 c->u->u_lineno = -1;
Mark Shannonfee55262019-11-21 09:11:43 +00003260 ADDOP(c, POP_EXCEPT);
Mark Shannon582aaf12020-08-04 17:30:11 +01003261 ADDOP_JUMP(c, JUMP_FORWARD, end);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003262 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003263 compiler_use_next_block(c, except);
3264 }
Mark Shannon02d126a2020-09-25 14:04:19 +01003265 compiler_pop_fblock(c, EXCEPTION_HANDLER, NULL);
Mark Shannonf2dbfd72020-12-21 13:53:50 +00003266 /* Mark as artificial */
3267 c->u->u_lineno = -1;
Mark Shannonbf353f32020-12-17 13:55:28 +00003268 ADDOP_I(c, RERAISE, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003269 compiler_use_next_block(c, orelse);
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003270 VISIT_SEQ(c, stmt, s->v.Try.orelse);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003271 compiler_use_next_block(c, end);
3272 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003273}
3274
3275static int
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003276compiler_try(struct compiler *c, stmt_ty s) {
3277 if (s->v.Try.finalbody && asdl_seq_LEN(s->v.Try.finalbody))
3278 return compiler_try_finally(c, s);
3279 else
3280 return compiler_try_except(c, s);
3281}
3282
3283
3284static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003285compiler_import_as(struct compiler *c, identifier name, identifier asname)
3286{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003287 /* The IMPORT_NAME opcode was already generated. This function
3288 merely needs to bind the result to a name.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003289
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003290 If there is a dot in name, we need to split it and emit a
Serhiy Storchakaf93234b2017-05-09 22:31:05 +03003291 IMPORT_FROM for each name.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003292 */
Serhiy Storchaka265fcc52017-08-29 15:47:44 +03003293 Py_ssize_t len = PyUnicode_GET_LENGTH(name);
3294 Py_ssize_t dot = PyUnicode_FindChar(name, '.', 0, len, 1);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003295 if (dot == -2)
Serhiy Storchaka694de3b2016-06-15 20:06:07 +03003296 return 0;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003297 if (dot != -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003298 /* Consume the base module name to get the first attribute */
Serhiy Storchaka265fcc52017-08-29 15:47:44 +03003299 while (1) {
3300 Py_ssize_t pos = dot + 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003301 PyObject *attr;
Serhiy Storchaka265fcc52017-08-29 15:47:44 +03003302 dot = PyUnicode_FindChar(name, '.', pos, len, 1);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003303 if (dot == -2)
Serhiy Storchaka694de3b2016-06-15 20:06:07 +03003304 return 0;
Serhiy Storchaka265fcc52017-08-29 15:47:44 +03003305 attr = PyUnicode_Substring(name, pos, (dot != -1) ? dot : len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003306 if (!attr)
Serhiy Storchaka694de3b2016-06-15 20:06:07 +03003307 return 0;
Serhiy Storchakaaa8e51f2018-04-01 00:29:37 +03003308 ADDOP_N(c, IMPORT_FROM, attr, names);
Serhiy Storchaka265fcc52017-08-29 15:47:44 +03003309 if (dot == -1) {
3310 break;
3311 }
3312 ADDOP(c, ROT_TWO);
3313 ADDOP(c, POP_TOP);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003314 }
Serhiy Storchaka265fcc52017-08-29 15:47:44 +03003315 if (!compiler_nameop(c, asname, Store)) {
3316 return 0;
3317 }
3318 ADDOP(c, POP_TOP);
3319 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003320 }
3321 return compiler_nameop(c, asname, Store);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003322}
3323
3324static int
3325compiler_import(struct compiler *c, stmt_ty s)
3326{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003327 /* The Import node stores a module name like a.b.c as a single
3328 string. This is convenient for all cases except
3329 import a.b.c as d
3330 where we need to parse that string to extract the individual
3331 module names.
3332 XXX Perhaps change the representation to make this case simpler?
3333 */
Victor Stinnerad9a0662013-11-19 22:23:20 +01003334 Py_ssize_t i, n = asdl_seq_LEN(s->v.Import.names);
Thomas Woutersf7f438b2006-02-28 16:09:29 +00003335
Victor Stinnerc9bc2902020-10-27 02:24:34 +01003336 PyObject *zero = _PyLong_GetZero(); // borrowed reference
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003337 for (i = 0; i < n; i++) {
3338 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.Import.names, i);
3339 int r;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003340
Victor Stinnerc9bc2902020-10-27 02:24:34 +01003341 ADDOP_LOAD_CONST(c, zero);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03003342 ADDOP_LOAD_CONST(c, Py_None);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003343 ADDOP_NAME(c, IMPORT_NAME, alias->name, names);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003344
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003345 if (alias->asname) {
3346 r = compiler_import_as(c, alias->name, alias->asname);
3347 if (!r)
3348 return r;
3349 }
3350 else {
3351 identifier tmp = alias->name;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003352 Py_ssize_t dot = PyUnicode_FindChar(
3353 alias->name, '.', 0, PyUnicode_GET_LENGTH(alias->name), 1);
Victor Stinner6b64a682013-07-11 22:50:45 +02003354 if (dot != -1) {
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003355 tmp = PyUnicode_Substring(alias->name, 0, dot);
Victor Stinner6b64a682013-07-11 22:50:45 +02003356 if (tmp == NULL)
3357 return 0;
3358 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003359 r = compiler_nameop(c, tmp, Store);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003360 if (dot != -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003361 Py_DECREF(tmp);
3362 }
3363 if (!r)
3364 return r;
3365 }
3366 }
3367 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003368}
3369
3370static int
3371compiler_from_import(struct compiler *c, stmt_ty s)
3372{
Victor Stinnerad9a0662013-11-19 22:23:20 +01003373 Py_ssize_t i, n = asdl_seq_LEN(s->v.ImportFrom.names);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03003374 PyObject *names;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003375 static PyObject *empty_string;
Benjamin Peterson78565b22009-06-28 19:19:51 +00003376
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003377 if (!empty_string) {
3378 empty_string = PyUnicode_FromString("");
3379 if (!empty_string)
3380 return 0;
3381 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003382
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03003383 ADDOP_LOAD_CONST_NEW(c, PyLong_FromLong(s->v.ImportFrom.level));
Serhiy Storchakaa95d9862018-03-24 22:42:35 +02003384
3385 names = PyTuple_New(n);
3386 if (!names)
3387 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003388
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003389 /* build up the names */
3390 for (i = 0; i < n; i++) {
3391 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);
3392 Py_INCREF(alias->name);
3393 PyTuple_SET_ITEM(names, i, alias->name);
3394 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003395
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003396 if (s->lineno > c->c_future->ff_lineno && s->v.ImportFrom.module &&
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02003397 _PyUnicode_EqualToASCIIString(s->v.ImportFrom.module, "__future__")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003398 Py_DECREF(names);
3399 return compiler_error(c, "from __future__ imports must occur "
3400 "at the beginning of the file");
3401 }
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03003402 ADDOP_LOAD_CONST_NEW(c, names);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003403
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003404 if (s->v.ImportFrom.module) {
3405 ADDOP_NAME(c, IMPORT_NAME, s->v.ImportFrom.module, names);
3406 }
3407 else {
3408 ADDOP_NAME(c, IMPORT_NAME, empty_string, names);
3409 }
3410 for (i = 0; i < n; i++) {
3411 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);
3412 identifier store_name;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003413
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003414 if (i == 0 && PyUnicode_READ_CHAR(alias->name, 0) == '*') {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003415 assert(n == 1);
3416 ADDOP(c, IMPORT_STAR);
3417 return 1;
3418 }
3419
3420 ADDOP_NAME(c, IMPORT_FROM, alias->name, names);
3421 store_name = alias->name;
3422 if (alias->asname)
3423 store_name = alias->asname;
3424
3425 if (!compiler_nameop(c, store_name, Store)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003426 return 0;
3427 }
3428 }
3429 /* remove imported module */
3430 ADDOP(c, POP_TOP);
3431 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003432}
3433
3434static int
3435compiler_assert(struct compiler *c, stmt_ty s)
3436{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003437 basicblock *end;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003438
tsukasa-aua8ef4572021-03-16 22:14:41 +11003439 /* Always emit a warning if the test is a non-zero length tuple */
3440 if ((s->v.Assert.test->kind == Tuple_kind &&
3441 asdl_seq_LEN(s->v.Assert.test->v.Tuple.elts) > 0) ||
3442 (s->v.Assert.test->kind == Constant_kind &&
3443 PyTuple_Check(s->v.Assert.test->v.Constant.value) &&
3444 PyTuple_Size(s->v.Assert.test->v.Constant.value) > 0))
Serhiy Storchakad31e7732018-10-21 10:09:39 +03003445 {
3446 if (!compiler_warn(c, "assertion is always true, "
3447 "perhaps remove parentheses?"))
3448 {
Victor Stinner14e461d2013-08-26 22:28:21 +02003449 return 0;
3450 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003451 }
tsukasa-aua8ef4572021-03-16 22:14:41 +11003452 if (c->c_optimize)
3453 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003454 end = compiler_new_block(c);
3455 if (end == NULL)
3456 return 0;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03003457 if (!compiler_jump_if(c, s->v.Assert.test, end, 1))
3458 return 0;
Zackery Spytzce6a0702019-08-25 03:44:09 -06003459 ADDOP(c, LOAD_ASSERTION_ERROR);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003460 if (s->v.Assert.msg) {
3461 VISIT(c, expr, s->v.Assert.msg);
3462 ADDOP_I(c, CALL_FUNCTION, 1);
3463 }
3464 ADDOP_I(c, RAISE_VARARGS, 1);
3465 compiler_use_next_block(c, end);
3466 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003467}
3468
3469static int
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01003470compiler_visit_stmt_expr(struct compiler *c, expr_ty value)
3471{
3472 if (c->c_interactive && c->c_nestlevel <= 1) {
3473 VISIT(c, expr, value);
3474 ADDOP(c, PRINT_EXPR);
3475 return 1;
3476 }
3477
Serhiy Storchaka3f228112018-09-27 17:42:37 +03003478 if (value->kind == Constant_kind) {
Victor Stinner15a30952016-02-08 22:45:06 +01003479 /* ignore constant statement */
Mark Shannon877df852020-11-12 09:43:29 +00003480 ADDOP(c, NOP);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01003481 return 1;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01003482 }
3483
3484 VISIT(c, expr, value);
Mark Shannonc5440932021-03-15 14:24:25 +00003485 /* Mark POP_TOP as artificial */
3486 c->u->u_lineno = -1;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01003487 ADDOP(c, POP_TOP);
3488 return 1;
3489}
3490
3491static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003492compiler_visit_stmt(struct compiler *c, stmt_ty s)
3493{
Victor Stinnerad9a0662013-11-19 22:23:20 +01003494 Py_ssize_t i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003495
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003496 /* Always assign a lineno to the next instruction for a stmt. */
Serhiy Storchaka61cb3d02020-03-17 18:07:30 +02003497 SET_LOC(c, s);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003498
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003499 switch (s->kind) {
3500 case FunctionDef_kind:
Yury Selivanov75445082015-05-11 22:57:16 -04003501 return compiler_function(c, s, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003502 case ClassDef_kind:
3503 return compiler_class(c, s);
3504 case Return_kind:
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003505 return compiler_return(c, s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003506 case Delete_kind:
3507 VISIT_SEQ(c, expr, s->v.Delete.targets)
3508 break;
3509 case Assign_kind:
3510 n = asdl_seq_LEN(s->v.Assign.targets);
3511 VISIT(c, expr, s->v.Assign.value);
3512 for (i = 0; i < n; i++) {
3513 if (i < n - 1)
3514 ADDOP(c, DUP_TOP);
3515 VISIT(c, expr,
3516 (expr_ty)asdl_seq_GET(s->v.Assign.targets, i));
3517 }
3518 break;
3519 case AugAssign_kind:
3520 return compiler_augassign(c, s);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003521 case AnnAssign_kind:
3522 return compiler_annassign(c, s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003523 case For_kind:
3524 return compiler_for(c, s);
3525 case While_kind:
3526 return compiler_while(c, s);
3527 case If_kind:
3528 return compiler_if(c, s);
Brandt Bucher145bf262021-02-26 14:51:55 -08003529 case Match_kind:
3530 return compiler_match(c, s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003531 case Raise_kind:
3532 n = 0;
3533 if (s->v.Raise.exc) {
3534 VISIT(c, expr, s->v.Raise.exc);
3535 n++;
Victor Stinnerad9a0662013-11-19 22:23:20 +01003536 if (s->v.Raise.cause) {
3537 VISIT(c, expr, s->v.Raise.cause);
3538 n++;
3539 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003540 }
Victor Stinnerad9a0662013-11-19 22:23:20 +01003541 ADDOP_I(c, RAISE_VARARGS, (int)n);
Mark Shannon266b4622020-11-17 19:30:14 +00003542 NEXT_BLOCK(c);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003543 break;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003544 case Try_kind:
3545 return compiler_try(c, s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003546 case Assert_kind:
3547 return compiler_assert(c, s);
3548 case Import_kind:
3549 return compiler_import(c, s);
3550 case ImportFrom_kind:
3551 return compiler_from_import(c, s);
3552 case Global_kind:
3553 case Nonlocal_kind:
3554 break;
3555 case Expr_kind:
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01003556 return compiler_visit_stmt_expr(c, s->v.Expr.value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003557 case Pass_kind:
Mark Shannon877df852020-11-12 09:43:29 +00003558 ADDOP(c, NOP);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003559 break;
3560 case Break_kind:
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003561 return compiler_break(c);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003562 case Continue_kind:
3563 return compiler_continue(c);
3564 case With_kind:
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003565 return compiler_with(c, s, 0);
Yury Selivanov75445082015-05-11 22:57:16 -04003566 case AsyncFunctionDef_kind:
3567 return compiler_function(c, s, 1);
3568 case AsyncWith_kind:
3569 return compiler_async_with(c, s, 0);
3570 case AsyncFor_kind:
3571 return compiler_async_for(c, s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003572 }
Yury Selivanov75445082015-05-11 22:57:16 -04003573
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003574 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003575}
3576
3577static int
3578unaryop(unaryop_ty op)
3579{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003580 switch (op) {
3581 case Invert:
3582 return UNARY_INVERT;
3583 case Not:
3584 return UNARY_NOT;
3585 case UAdd:
3586 return UNARY_POSITIVE;
3587 case USub:
3588 return UNARY_NEGATIVE;
3589 default:
3590 PyErr_Format(PyExc_SystemError,
3591 "unary op %d should not be possible", op);
3592 return 0;
3593 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003594}
3595
3596static int
Andy Lester76d58772020-03-10 21:18:12 -05003597binop(operator_ty op)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003598{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003599 switch (op) {
3600 case Add:
3601 return BINARY_ADD;
3602 case Sub:
3603 return BINARY_SUBTRACT;
3604 case Mult:
3605 return BINARY_MULTIPLY;
Benjamin Petersond51374e2014-04-09 23:55:56 -04003606 case MatMult:
3607 return BINARY_MATRIX_MULTIPLY;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003608 case Div:
3609 return BINARY_TRUE_DIVIDE;
3610 case Mod:
3611 return BINARY_MODULO;
3612 case Pow:
3613 return BINARY_POWER;
3614 case LShift:
3615 return BINARY_LSHIFT;
3616 case RShift:
3617 return BINARY_RSHIFT;
3618 case BitOr:
3619 return BINARY_OR;
3620 case BitXor:
3621 return BINARY_XOR;
3622 case BitAnd:
3623 return BINARY_AND;
3624 case FloorDiv:
3625 return BINARY_FLOOR_DIVIDE;
3626 default:
3627 PyErr_Format(PyExc_SystemError,
3628 "binary op %d should not be possible", op);
3629 return 0;
3630 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003631}
3632
3633static int
Andy Lester76d58772020-03-10 21:18:12 -05003634inplace_binop(operator_ty op)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003635{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003636 switch (op) {
3637 case Add:
3638 return INPLACE_ADD;
3639 case Sub:
3640 return INPLACE_SUBTRACT;
3641 case Mult:
3642 return INPLACE_MULTIPLY;
Benjamin Petersond51374e2014-04-09 23:55:56 -04003643 case MatMult:
3644 return INPLACE_MATRIX_MULTIPLY;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003645 case Div:
3646 return INPLACE_TRUE_DIVIDE;
3647 case Mod:
3648 return INPLACE_MODULO;
3649 case Pow:
3650 return INPLACE_POWER;
3651 case LShift:
3652 return INPLACE_LSHIFT;
3653 case RShift:
3654 return INPLACE_RSHIFT;
3655 case BitOr:
3656 return INPLACE_OR;
3657 case BitXor:
3658 return INPLACE_XOR;
3659 case BitAnd:
3660 return INPLACE_AND;
3661 case FloorDiv:
3662 return INPLACE_FLOOR_DIVIDE;
3663 default:
3664 PyErr_Format(PyExc_SystemError,
3665 "inplace binary op %d should not be possible", op);
3666 return 0;
3667 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003668}
3669
3670static int
3671compiler_nameop(struct compiler *c, identifier name, expr_context_ty ctx)
3672{
Victor Stinnerad9a0662013-11-19 22:23:20 +01003673 int op, scope;
3674 Py_ssize_t arg;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003675 enum { OP_FAST, OP_GLOBAL, OP_DEREF, OP_NAME } optype;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003676
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003677 PyObject *dict = c->u->u_names;
3678 PyObject *mangled;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003679
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02003680 assert(!_PyUnicode_EqualToASCIIString(name, "None") &&
3681 !_PyUnicode_EqualToASCIIString(name, "True") &&
3682 !_PyUnicode_EqualToASCIIString(name, "False"));
Benjamin Peterson70b224d2012-12-06 17:49:58 -05003683
Pablo Galindoc5fc1562020-04-22 23:29:27 +01003684 if (forbidden_name(c, name, ctx))
3685 return 0;
3686
Serhiy Storchakabd6ec4d2017-12-18 14:29:12 +02003687 mangled = _Py_Mangle(c->u->u_private, name);
3688 if (!mangled)
3689 return 0;
3690
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003691 op = 0;
3692 optype = OP_NAME;
Victor Stinner28ad12f2021-03-19 12:41:49 +01003693 scope = _PyST_GetScope(c->u->u_ste, mangled);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003694 switch (scope) {
3695 case FREE:
3696 dict = c->u->u_freevars;
3697 optype = OP_DEREF;
3698 break;
3699 case CELL:
3700 dict = c->u->u_cellvars;
3701 optype = OP_DEREF;
3702 break;
3703 case LOCAL:
3704 if (c->u->u_ste->ste_type == FunctionBlock)
3705 optype = OP_FAST;
3706 break;
3707 case GLOBAL_IMPLICIT:
Benjamin Peterson1dfd2472015-04-27 21:44:22 -04003708 if (c->u->u_ste->ste_type == FunctionBlock)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003709 optype = OP_GLOBAL;
3710 break;
3711 case GLOBAL_EXPLICIT:
3712 optype = OP_GLOBAL;
3713 break;
3714 default:
3715 /* scope can be 0 */
3716 break;
3717 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003718
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003719 /* XXX Leave assert here, but handle __doc__ and the like better */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003720 assert(scope || PyUnicode_READ_CHAR(name, 0) == '_');
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003721
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003722 switch (optype) {
3723 case OP_DEREF:
3724 switch (ctx) {
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04003725 case Load:
3726 op = (c->u->u_ste->ste_type == ClassBlock) ? LOAD_CLASSDEREF : LOAD_DEREF;
3727 break;
Serhiy Storchaka6b975982020-03-17 23:41:08 +02003728 case Store: op = STORE_DEREF; break;
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00003729 case Del: op = DELETE_DEREF; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003730 }
3731 break;
3732 case OP_FAST:
3733 switch (ctx) {
3734 case Load: op = LOAD_FAST; break;
Serhiy Storchaka6b975982020-03-17 23:41:08 +02003735 case Store: op = STORE_FAST; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003736 case Del: op = DELETE_FAST; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003737 }
Serhiy Storchakaaa8e51f2018-04-01 00:29:37 +03003738 ADDOP_N(c, op, mangled, varnames);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003739 return 1;
3740 case OP_GLOBAL:
3741 switch (ctx) {
3742 case Load: op = LOAD_GLOBAL; break;
Serhiy Storchaka6b975982020-03-17 23:41:08 +02003743 case Store: op = STORE_GLOBAL; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003744 case Del: op = DELETE_GLOBAL; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003745 }
3746 break;
3747 case OP_NAME:
3748 switch (ctx) {
Benjamin Peterson20f9c3c2010-07-20 22:39:34 +00003749 case Load: op = LOAD_NAME; break;
Serhiy Storchaka6b975982020-03-17 23:41:08 +02003750 case Store: op = STORE_NAME; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003751 case Del: op = DELETE_NAME; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003752 }
3753 break;
3754 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003755
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003756 assert(op);
Andy Lester76d58772020-03-10 21:18:12 -05003757 arg = compiler_add_o(dict, mangled);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003758 Py_DECREF(mangled);
3759 if (arg < 0)
3760 return 0;
3761 return compiler_addop_i(c, op, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003762}
3763
3764static int
3765compiler_boolop(struct compiler *c, expr_ty e)
3766{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003767 basicblock *end;
Victor Stinnerad9a0662013-11-19 22:23:20 +01003768 int jumpi;
3769 Py_ssize_t i, n;
Pablo Galindoa5634c42020-09-16 19:42:00 +01003770 asdl_expr_seq *s;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003771
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003772 assert(e->kind == BoolOp_kind);
3773 if (e->v.BoolOp.op == And)
3774 jumpi = JUMP_IF_FALSE_OR_POP;
3775 else
3776 jumpi = JUMP_IF_TRUE_OR_POP;
3777 end = compiler_new_block(c);
3778 if (end == NULL)
3779 return 0;
3780 s = e->v.BoolOp.values;
3781 n = asdl_seq_LEN(s) - 1;
3782 assert(n >= 0);
3783 for (i = 0; i < n; ++i) {
3784 VISIT(c, expr, (expr_ty)asdl_seq_GET(s, i));
Mark Shannon582aaf12020-08-04 17:30:11 +01003785 ADDOP_JUMP(c, jumpi, end);
Mark Shannon6e8128f2020-07-30 10:03:00 +01003786 basicblock *next = compiler_new_block(c);
3787 if (next == NULL) {
3788 return 0;
3789 }
3790 compiler_use_next_block(c, next);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003791 }
3792 VISIT(c, expr, (expr_ty)asdl_seq_GET(s, n));
3793 compiler_use_next_block(c, end);
3794 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003795}
3796
3797static int
Pablo Galindoa5634c42020-09-16 19:42:00 +01003798starunpack_helper(struct compiler *c, asdl_expr_seq *elts, int pushed,
Mark Shannon13bc1392020-01-23 09:25:17 +00003799 int build, int add, int extend, int tuple)
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003800{
3801 Py_ssize_t n = asdl_seq_LEN(elts);
Brandt Bucher6dd9b642019-11-25 22:16:53 -08003802 if (n > 2 && are_all_items_const(elts, 0, n)) {
3803 PyObject *folded = PyTuple_New(n);
3804 if (folded == NULL) {
3805 return 0;
3806 }
3807 PyObject *val;
Mark Shannon11e0b292021-04-15 14:28:56 +01003808 for (Py_ssize_t i = 0; i < n; i++) {
Brandt Bucher6dd9b642019-11-25 22:16:53 -08003809 val = ((expr_ty)asdl_seq_GET(elts, i))->v.Constant.value;
3810 Py_INCREF(val);
3811 PyTuple_SET_ITEM(folded, i, val);
3812 }
Mark Shannon13bc1392020-01-23 09:25:17 +00003813 if (tuple) {
3814 ADDOP_LOAD_CONST_NEW(c, folded);
3815 } else {
3816 if (add == SET_ADD) {
3817 Py_SETREF(folded, PyFrozenSet_New(folded));
3818 if (folded == NULL) {
3819 return 0;
3820 }
Brandt Bucher6dd9b642019-11-25 22:16:53 -08003821 }
Mark Shannon13bc1392020-01-23 09:25:17 +00003822 ADDOP_I(c, build, pushed);
3823 ADDOP_LOAD_CONST_NEW(c, folded);
3824 ADDOP_I(c, extend, 1);
Brandt Bucher6dd9b642019-11-25 22:16:53 -08003825 }
Brandt Bucher6dd9b642019-11-25 22:16:53 -08003826 return 1;
3827 }
Mark Shannon13bc1392020-01-23 09:25:17 +00003828
Mark Shannon11e0b292021-04-15 14:28:56 +01003829 int big = n+pushed > STACK_USE_GUIDELINE;
3830 int seen_star = 0;
3831 for (Py_ssize_t i = 0; i < n; i++) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003832 expr_ty elt = asdl_seq_GET(elts, i);
3833 if (elt->kind == Starred_kind) {
Mark Shannon13bc1392020-01-23 09:25:17 +00003834 seen_star = 1;
3835 }
3836 }
Mark Shannon11e0b292021-04-15 14:28:56 +01003837 if (!seen_star && !big) {
3838 for (Py_ssize_t i = 0; i < n; i++) {
Mark Shannon13bc1392020-01-23 09:25:17 +00003839 expr_ty elt = asdl_seq_GET(elts, i);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003840 VISIT(c, expr, elt);
Mark Shannon13bc1392020-01-23 09:25:17 +00003841 }
3842 if (tuple) {
3843 ADDOP_I(c, BUILD_TUPLE, n+pushed);
3844 } else {
3845 ADDOP_I(c, build, n+pushed);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003846 }
Mark Shannon11e0b292021-04-15 14:28:56 +01003847 return 1;
3848 }
3849 int sequence_built = 0;
3850 if (big) {
3851 ADDOP_I(c, build, pushed);
3852 sequence_built = 1;
3853 }
3854 for (Py_ssize_t i = 0; i < n; i++) {
3855 expr_ty elt = asdl_seq_GET(elts, i);
3856 if (elt->kind == Starred_kind) {
3857 if (sequence_built == 0) {
3858 ADDOP_I(c, build, i+pushed);
3859 sequence_built = 1;
3860 }
3861 VISIT(c, expr, elt->v.Starred.value);
3862 ADDOP_I(c, extend, 1);
3863 }
3864 else {
3865 VISIT(c, expr, elt);
3866 if (sequence_built) {
3867 ADDOP_I(c, add, 1);
3868 }
3869 }
3870 }
3871 assert(sequence_built);
3872 if (tuple) {
3873 ADDOP(c, LIST_TO_TUPLE);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003874 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003875 return 1;
3876}
3877
3878static int
Brandt Bucher145bf262021-02-26 14:51:55 -08003879unpack_helper(struct compiler *c, asdl_expr_seq *elts)
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003880{
3881 Py_ssize_t n = asdl_seq_LEN(elts);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003882 int seen_star = 0;
Brandt Bucher145bf262021-02-26 14:51:55 -08003883 for (Py_ssize_t i = 0; i < n; i++) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003884 expr_ty elt = asdl_seq_GET(elts, i);
3885 if (elt->kind == Starred_kind && !seen_star) {
3886 if ((i >= (1 << 8)) ||
3887 (n-i-1 >= (INT_MAX >> 8)))
3888 return compiler_error(c,
3889 "too many expressions in "
3890 "star-unpacking assignment");
3891 ADDOP_I(c, UNPACK_EX, (i + ((n-i-1) << 8)));
3892 seen_star = 1;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003893 }
3894 else if (elt->kind == Starred_kind) {
3895 return compiler_error(c,
Furkan Öndercb6534e2020-03-26 04:54:31 +03003896 "multiple starred expressions in assignment");
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003897 }
3898 }
3899 if (!seen_star) {
3900 ADDOP_I(c, UNPACK_SEQUENCE, n);
3901 }
Brandt Bucher145bf262021-02-26 14:51:55 -08003902 return 1;
3903}
3904
3905static int
3906assignment_helper(struct compiler *c, asdl_expr_seq *elts)
3907{
3908 Py_ssize_t n = asdl_seq_LEN(elts);
3909 RETURN_IF_FALSE(unpack_helper(c, elts));
3910 for (Py_ssize_t i = 0; i < n; i++) {
Brandt Bucherd5aa2e92020-03-07 19:44:18 -08003911 expr_ty elt = asdl_seq_GET(elts, i);
3912 VISIT(c, expr, elt->kind != Starred_kind ? elt : elt->v.Starred.value);
3913 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003914 return 1;
3915}
3916
3917static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003918compiler_list(struct compiler *c, expr_ty e)
3919{
Pablo Galindoa5634c42020-09-16 19:42:00 +01003920 asdl_expr_seq *elts = e->v.List.elts;
Serhiy Storchakad8b3a982019-03-05 20:42:06 +02003921 if (e->v.List.ctx == Store) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003922 return assignment_helper(c, elts);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003923 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003924 else if (e->v.List.ctx == Load) {
Mark Shannon13bc1392020-01-23 09:25:17 +00003925 return starunpack_helper(c, elts, 0, BUILD_LIST,
3926 LIST_APPEND, LIST_EXTEND, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003927 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003928 else
3929 VISIT_SEQ(c, expr, elts);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003930 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003931}
3932
3933static int
3934compiler_tuple(struct compiler *c, expr_ty e)
3935{
Pablo Galindoa5634c42020-09-16 19:42:00 +01003936 asdl_expr_seq *elts = e->v.Tuple.elts;
Serhiy Storchakad8b3a982019-03-05 20:42:06 +02003937 if (e->v.Tuple.ctx == Store) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003938 return assignment_helper(c, elts);
3939 }
3940 else if (e->v.Tuple.ctx == Load) {
Mark Shannon13bc1392020-01-23 09:25:17 +00003941 return starunpack_helper(c, elts, 0, BUILD_LIST,
3942 LIST_APPEND, LIST_EXTEND, 1);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003943 }
3944 else
3945 VISIT_SEQ(c, expr, elts);
3946 return 1;
3947}
3948
3949static int
3950compiler_set(struct compiler *c, expr_ty e)
3951{
Mark Shannon13bc1392020-01-23 09:25:17 +00003952 return starunpack_helper(c, e->v.Set.elts, 0, BUILD_SET,
3953 SET_ADD, SET_UPDATE, 0);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003954}
3955
3956static int
Pablo Galindoa5634c42020-09-16 19:42:00 +01003957are_all_items_const(asdl_expr_seq *seq, Py_ssize_t begin, Py_ssize_t end)
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003958{
3959 Py_ssize_t i;
3960 for (i = begin; i < end; i++) {
3961 expr_ty key = (expr_ty)asdl_seq_GET(seq, i);
Serhiy Storchaka3f228112018-09-27 17:42:37 +03003962 if (key == NULL || key->kind != Constant_kind)
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003963 return 0;
3964 }
3965 return 1;
3966}
3967
3968static int
3969compiler_subdict(struct compiler *c, expr_ty e, Py_ssize_t begin, Py_ssize_t end)
3970{
3971 Py_ssize_t i, n = end - begin;
3972 PyObject *keys, *key;
Mark Shannon11e0b292021-04-15 14:28:56 +01003973 int big = n*2 > STACK_USE_GUIDELINE;
3974 if (n > 1 && !big && are_all_items_const(e->v.Dict.keys, begin, end)) {
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003975 for (i = begin; i < end; i++) {
3976 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Dict.values, i));
3977 }
3978 keys = PyTuple_New(n);
3979 if (keys == NULL) {
3980 return 0;
3981 }
3982 for (i = begin; i < end; i++) {
Serhiy Storchaka3f228112018-09-27 17:42:37 +03003983 key = ((expr_ty)asdl_seq_GET(e->v.Dict.keys, i))->v.Constant.value;
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003984 Py_INCREF(key);
3985 PyTuple_SET_ITEM(keys, i - begin, key);
3986 }
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03003987 ADDOP_LOAD_CONST_NEW(c, keys);
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003988 ADDOP_I(c, BUILD_CONST_KEY_MAP, n);
Mark Shannon11e0b292021-04-15 14:28:56 +01003989 return 1;
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003990 }
Mark Shannon11e0b292021-04-15 14:28:56 +01003991 if (big) {
3992 ADDOP_I(c, BUILD_MAP, 0);
3993 }
3994 for (i = begin; i < end; i++) {
3995 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Dict.keys, i));
3996 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Dict.values, i));
3997 if (big) {
3998 ADDOP_I(c, MAP_ADD, 1);
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003999 }
Mark Shannon11e0b292021-04-15 14:28:56 +01004000 }
4001 if (!big) {
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03004002 ADDOP_I(c, BUILD_MAP, n);
4003 }
4004 return 1;
4005}
4006
4007static int
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004008compiler_dict(struct compiler *c, expr_ty e)
4009{
Victor Stinner976bb402016-03-23 11:36:19 +01004010 Py_ssize_t i, n, elements;
Mark Shannon8a4cd702020-01-27 09:57:45 +00004011 int have_dict;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004012 int is_unpacking = 0;
4013 n = asdl_seq_LEN(e->v.Dict.values);
Mark Shannon8a4cd702020-01-27 09:57:45 +00004014 have_dict = 0;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004015 elements = 0;
4016 for (i = 0; i < n; i++) {
4017 is_unpacking = (expr_ty)asdl_seq_GET(e->v.Dict.keys, i) == NULL;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004018 if (is_unpacking) {
Mark Shannon8a4cd702020-01-27 09:57:45 +00004019 if (elements) {
4020 if (!compiler_subdict(c, e, i - elements, i)) {
4021 return 0;
4022 }
4023 if (have_dict) {
4024 ADDOP_I(c, DICT_UPDATE, 1);
4025 }
4026 have_dict = 1;
4027 elements = 0;
4028 }
4029 if (have_dict == 0) {
4030 ADDOP_I(c, BUILD_MAP, 0);
4031 have_dict = 1;
4032 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004033 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Dict.values, i));
Mark Shannon8a4cd702020-01-27 09:57:45 +00004034 ADDOP_I(c, DICT_UPDATE, 1);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004035 }
4036 else {
Mark Shannon11e0b292021-04-15 14:28:56 +01004037 if (elements*2 > STACK_USE_GUIDELINE) {
Pablo Galindoc51db0e2020-08-13 09:48:41 +01004038 if (!compiler_subdict(c, e, i - elements, i + 1)) {
Mark Shannon8a4cd702020-01-27 09:57:45 +00004039 return 0;
4040 }
4041 if (have_dict) {
4042 ADDOP_I(c, DICT_UPDATE, 1);
4043 }
4044 have_dict = 1;
4045 elements = 0;
4046 }
4047 else {
4048 elements++;
4049 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004050 }
4051 }
Mark Shannon8a4cd702020-01-27 09:57:45 +00004052 if (elements) {
4053 if (!compiler_subdict(c, e, n - elements, n)) {
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03004054 return 0;
Mark Shannon8a4cd702020-01-27 09:57:45 +00004055 }
4056 if (have_dict) {
4057 ADDOP_I(c, DICT_UPDATE, 1);
4058 }
4059 have_dict = 1;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004060 }
Mark Shannon8a4cd702020-01-27 09:57:45 +00004061 if (!have_dict) {
4062 ADDOP_I(c, BUILD_MAP, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004063 }
4064 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004065}
4066
4067static int
4068compiler_compare(struct compiler *c, expr_ty e)
4069{
Victor Stinnerad9a0662013-11-19 22:23:20 +01004070 Py_ssize_t i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004071
Serhiy Storchaka3bcbedc2019-01-18 07:47:48 +02004072 if (!check_compare(c, e)) {
4073 return 0;
4074 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004075 VISIT(c, expr, e->v.Compare.left);
Serhiy Storchaka02b9ef22017-12-30 09:47:42 +02004076 assert(asdl_seq_LEN(e->v.Compare.ops) > 0);
4077 n = asdl_seq_LEN(e->v.Compare.ops) - 1;
4078 if (n == 0) {
4079 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, 0));
Mark Shannon9af0e472020-01-14 10:12:45 +00004080 ADDOP_COMPARE(c, asdl_seq_GET(e->v.Compare.ops, 0));
Serhiy Storchaka02b9ef22017-12-30 09:47:42 +02004081 }
4082 else {
4083 basicblock *cleanup = compiler_new_block(c);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004084 if (cleanup == NULL)
4085 return 0;
Serhiy Storchaka02b9ef22017-12-30 09:47:42 +02004086 for (i = 0; i < n; i++) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004087 VISIT(c, expr,
4088 (expr_ty)asdl_seq_GET(e->v.Compare.comparators, i));
Serhiy Storchaka02b9ef22017-12-30 09:47:42 +02004089 ADDOP(c, DUP_TOP);
4090 ADDOP(c, ROT_THREE);
Mark Shannon9af0e472020-01-14 10:12:45 +00004091 ADDOP_COMPARE(c, asdl_seq_GET(e->v.Compare.ops, i));
Mark Shannon582aaf12020-08-04 17:30:11 +01004092 ADDOP_JUMP(c, JUMP_IF_FALSE_OR_POP, cleanup);
Serhiy Storchaka02b9ef22017-12-30 09:47:42 +02004093 NEXT_BLOCK(c);
4094 }
4095 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, n));
Mark Shannon9af0e472020-01-14 10:12:45 +00004096 ADDOP_COMPARE(c, asdl_seq_GET(e->v.Compare.ops, n));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004097 basicblock *end = compiler_new_block(c);
4098 if (end == NULL)
4099 return 0;
Mark Shannon127dde52021-01-04 18:06:55 +00004100 ADDOP_JUMP_NOLINE(c, JUMP_FORWARD, end);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004101 compiler_use_next_block(c, cleanup);
4102 ADDOP(c, ROT_TWO);
4103 ADDOP(c, POP_TOP);
4104 compiler_use_next_block(c, end);
4105 }
4106 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004107}
4108
Serhiy Storchaka62e44812019-02-16 08:12:19 +02004109static PyTypeObject *
4110infer_type(expr_ty e)
4111{
4112 switch (e->kind) {
4113 case Tuple_kind:
4114 return &PyTuple_Type;
4115 case List_kind:
4116 case ListComp_kind:
4117 return &PyList_Type;
4118 case Dict_kind:
4119 case DictComp_kind:
4120 return &PyDict_Type;
4121 case Set_kind:
4122 case SetComp_kind:
4123 return &PySet_Type;
4124 case GeneratorExp_kind:
4125 return &PyGen_Type;
4126 case Lambda_kind:
4127 return &PyFunction_Type;
4128 case JoinedStr_kind:
4129 case FormattedValue_kind:
4130 return &PyUnicode_Type;
4131 case Constant_kind:
Victor Stinnera102ed72020-02-07 02:24:48 +01004132 return Py_TYPE(e->v.Constant.value);
Serhiy Storchaka62e44812019-02-16 08:12:19 +02004133 default:
4134 return NULL;
4135 }
4136}
4137
4138static int
4139check_caller(struct compiler *c, expr_ty e)
4140{
4141 switch (e->kind) {
4142 case Constant_kind:
4143 case Tuple_kind:
4144 case List_kind:
4145 case ListComp_kind:
4146 case Dict_kind:
4147 case DictComp_kind:
4148 case Set_kind:
4149 case SetComp_kind:
4150 case GeneratorExp_kind:
4151 case JoinedStr_kind:
4152 case FormattedValue_kind:
4153 return compiler_warn(c, "'%.200s' object is not callable; "
4154 "perhaps you missed a comma?",
4155 infer_type(e)->tp_name);
4156 default:
4157 return 1;
4158 }
4159}
4160
4161static int
4162check_subscripter(struct compiler *c, expr_ty e)
4163{
4164 PyObject *v;
4165
4166 switch (e->kind) {
4167 case Constant_kind:
4168 v = e->v.Constant.value;
4169 if (!(v == Py_None || v == Py_Ellipsis ||
4170 PyLong_Check(v) || PyFloat_Check(v) || PyComplex_Check(v) ||
4171 PyAnySet_Check(v)))
4172 {
4173 return 1;
4174 }
4175 /* fall through */
4176 case Set_kind:
4177 case SetComp_kind:
4178 case GeneratorExp_kind:
4179 case Lambda_kind:
4180 return compiler_warn(c, "'%.200s' object is not subscriptable; "
4181 "perhaps you missed a comma?",
4182 infer_type(e)->tp_name);
4183 default:
4184 return 1;
4185 }
4186}
4187
4188static int
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02004189check_index(struct compiler *c, expr_ty e, expr_ty s)
Serhiy Storchaka62e44812019-02-16 08:12:19 +02004190{
4191 PyObject *v;
4192
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02004193 PyTypeObject *index_type = infer_type(s);
Serhiy Storchaka62e44812019-02-16 08:12:19 +02004194 if (index_type == NULL
4195 || PyType_FastSubclass(index_type, Py_TPFLAGS_LONG_SUBCLASS)
4196 || index_type == &PySlice_Type) {
4197 return 1;
4198 }
4199
4200 switch (e->kind) {
4201 case Constant_kind:
4202 v = e->v.Constant.value;
4203 if (!(PyUnicode_Check(v) || PyBytes_Check(v) || PyTuple_Check(v))) {
4204 return 1;
4205 }
4206 /* fall through */
4207 case Tuple_kind:
4208 case List_kind:
4209 case ListComp_kind:
4210 case JoinedStr_kind:
4211 case FormattedValue_kind:
4212 return compiler_warn(c, "%.200s indices must be integers or slices, "
4213 "not %.200s; "
4214 "perhaps you missed a comma?",
4215 infer_type(e)->tp_name,
4216 index_type->tp_name);
4217 default:
4218 return 1;
4219 }
4220}
4221
Zackery Spytz97f5de02019-03-22 01:30:32 -06004222// Return 1 if the method call was optimized, -1 if not, and 0 on error.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004223static int
Yury Selivanovf2392132016-12-13 19:03:51 -05004224maybe_optimize_method_call(struct compiler *c, expr_ty e)
4225{
4226 Py_ssize_t argsl, i;
4227 expr_ty meth = e->v.Call.func;
Pablo Galindoa5634c42020-09-16 19:42:00 +01004228 asdl_expr_seq *args = e->v.Call.args;
Yury Selivanovf2392132016-12-13 19:03:51 -05004229
4230 /* Check that the call node is an attribute access, and that
4231 the call doesn't have keyword parameters. */
4232 if (meth->kind != Attribute_kind || meth->v.Attribute.ctx != Load ||
Mark Shannon11e0b292021-04-15 14:28:56 +01004233 asdl_seq_LEN(e->v.Call.keywords)) {
Yury Selivanovf2392132016-12-13 19:03:51 -05004234 return -1;
Mark Shannon11e0b292021-04-15 14:28:56 +01004235 }
4236 /* Check that there aren't too many arguments */
Yury Selivanovf2392132016-12-13 19:03:51 -05004237 argsl = asdl_seq_LEN(args);
Mark Shannon11e0b292021-04-15 14:28:56 +01004238 if (argsl >= STACK_USE_GUIDELINE) {
4239 return -1;
4240 }
4241 /* Check that there are no *varargs types of arguments. */
Yury Selivanovf2392132016-12-13 19:03:51 -05004242 for (i = 0; i < argsl; i++) {
4243 expr_ty elt = asdl_seq_GET(args, i);
4244 if (elt->kind == Starred_kind) {
4245 return -1;
4246 }
4247 }
4248
4249 /* Alright, we can optimize the code. */
4250 VISIT(c, expr, meth->v.Attribute.value);
Mark Shannond48848c2021-03-14 18:01:30 +00004251 int old_lineno = c->u->u_lineno;
4252 c->u->u_lineno = meth->end_lineno;
Yury Selivanovf2392132016-12-13 19:03:51 -05004253 ADDOP_NAME(c, LOAD_METHOD, meth->v.Attribute.attr, names);
4254 VISIT_SEQ(c, expr, e->v.Call.args);
4255 ADDOP_I(c, CALL_METHOD, asdl_seq_LEN(e->v.Call.args));
Mark Shannond48848c2021-03-14 18:01:30 +00004256 c->u->u_lineno = old_lineno;
Yury Selivanovf2392132016-12-13 19:03:51 -05004257 return 1;
4258}
4259
4260static int
Pablo Galindoa5634c42020-09-16 19:42:00 +01004261validate_keywords(struct compiler *c, asdl_keyword_seq *keywords)
Zackery Spytz08050e92020-04-06 00:47:47 -06004262{
4263 Py_ssize_t nkeywords = asdl_seq_LEN(keywords);
4264 for (Py_ssize_t i = 0; i < nkeywords; i++) {
Pablo Galindo254ec782020-04-03 20:37:13 +01004265 keyword_ty key = ((keyword_ty)asdl_seq_GET(keywords, i));
4266 if (key->arg == NULL) {
4267 continue;
4268 }
Pablo Galindoc5fc1562020-04-22 23:29:27 +01004269 if (forbidden_name(c, key->arg, Store)) {
4270 return -1;
4271 }
Zackery Spytz08050e92020-04-06 00:47:47 -06004272 for (Py_ssize_t j = i + 1; j < nkeywords; j++) {
Pablo Galindo254ec782020-04-03 20:37:13 +01004273 keyword_ty other = ((keyword_ty)asdl_seq_GET(keywords, j));
4274 if (other->arg && !PyUnicode_Compare(key->arg, other->arg)) {
Miss Islington (bot)13de28f2021-05-07 13:40:09 -07004275 SET_LOC(c, other);
Brandt Bucher145bf262021-02-26 14:51:55 -08004276 compiler_error(c, "keyword argument repeated: %U", key->arg);
Pablo Galindo254ec782020-04-03 20:37:13 +01004277 return -1;
4278 }
4279 }
4280 }
4281 return 0;
4282}
4283
4284static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004285compiler_call(struct compiler *c, expr_ty e)
4286{
Zackery Spytz97f5de02019-03-22 01:30:32 -06004287 int ret = maybe_optimize_method_call(c, e);
4288 if (ret >= 0) {
4289 return ret;
4290 }
Serhiy Storchaka62e44812019-02-16 08:12:19 +02004291 if (!check_caller(c, e->v.Call.func)) {
4292 return 0;
4293 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004294 VISIT(c, expr, e->v.Call.func);
4295 return compiler_call_helper(c, 0,
4296 e->v.Call.args,
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004297 e->v.Call.keywords);
Guido van Rossum52cc1d82007-03-18 15:41:51 +00004298}
4299
Eric V. Smith235a6f02015-09-19 14:51:32 -04004300static int
4301compiler_joined_str(struct compiler *c, expr_ty e)
4302{
Mark Shannon11e0b292021-04-15 14:28:56 +01004303
4304 Py_ssize_t value_count = asdl_seq_LEN(e->v.JoinedStr.values);
4305 if (value_count > STACK_USE_GUIDELINE) {
4306 ADDOP_LOAD_CONST_NEW(c, _PyUnicode_FromASCII("", 0));
4307 PyObject *join = _PyUnicode_FromASCII("join", 4);
4308 if (join == NULL) {
4309 return 0;
4310 }
4311 ADDOP_NAME(c, LOAD_METHOD, join, names);
4312 Py_DECREF(join);
4313 ADDOP_I(c, BUILD_LIST, 0);
4314 for (Py_ssize_t i = 0; i < asdl_seq_LEN(e->v.JoinedStr.values); i++) {
4315 VISIT(c, expr, asdl_seq_GET(e->v.JoinedStr.values, i));
4316 ADDOP_I(c, LIST_APPEND, 1);
4317 }
4318 ADDOP_I(c, CALL_METHOD, 1);
4319 }
4320 else {
4321 VISIT_SEQ(c, expr, e->v.JoinedStr.values);
4322 if (asdl_seq_LEN(e->v.JoinedStr.values) != 1) {
4323 ADDOP_I(c, BUILD_STRING, asdl_seq_LEN(e->v.JoinedStr.values));
4324 }
4325 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04004326 return 1;
4327}
4328
Eric V. Smitha78c7952015-11-03 12:45:05 -05004329/* Used to implement f-strings. Format a single value. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04004330static int
4331compiler_formatted_value(struct compiler *c, expr_ty e)
4332{
Eric V. Smitha78c7952015-11-03 12:45:05 -05004333 /* Our oparg encodes 2 pieces of information: the conversion
4334 character, and whether or not a format_spec was provided.
Eric V. Smith235a6f02015-09-19 14:51:32 -04004335
Eric V. Smith9a4135e2019-05-08 16:28:48 -04004336 Convert the conversion char to 3 bits:
4337 : 000 0x0 FVC_NONE The default if nothing specified.
Eric V. Smitha78c7952015-11-03 12:45:05 -05004338 !s : 001 0x1 FVC_STR
4339 !r : 010 0x2 FVC_REPR
4340 !a : 011 0x3 FVC_ASCII
Eric V. Smith235a6f02015-09-19 14:51:32 -04004341
Eric V. Smitha78c7952015-11-03 12:45:05 -05004342 next bit is whether or not we have a format spec:
4343 yes : 100 0x4
4344 no : 000 0x0
4345 */
Eric V. Smith235a6f02015-09-19 14:51:32 -04004346
Eric V. Smith9a4135e2019-05-08 16:28:48 -04004347 int conversion = e->v.FormattedValue.conversion;
Eric V. Smitha78c7952015-11-03 12:45:05 -05004348 int oparg;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004349
Eric V. Smith9a4135e2019-05-08 16:28:48 -04004350 /* The expression to be formatted. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04004351 VISIT(c, expr, e->v.FormattedValue.value);
4352
Eric V. Smith9a4135e2019-05-08 16:28:48 -04004353 switch (conversion) {
Eric V. Smitha78c7952015-11-03 12:45:05 -05004354 case 's': oparg = FVC_STR; break;
4355 case 'r': oparg = FVC_REPR; break;
4356 case 'a': oparg = FVC_ASCII; break;
4357 case -1: oparg = FVC_NONE; break;
4358 default:
Eric V. Smith9a4135e2019-05-08 16:28:48 -04004359 PyErr_Format(PyExc_SystemError,
4360 "Unrecognized conversion character %d", conversion);
Eric V. Smitha78c7952015-11-03 12:45:05 -05004361 return 0;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004362 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04004363 if (e->v.FormattedValue.format_spec) {
Eric V. Smitha78c7952015-11-03 12:45:05 -05004364 /* Evaluate the format spec, and update our opcode arg. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04004365 VISIT(c, expr, e->v.FormattedValue.format_spec);
Eric V. Smitha78c7952015-11-03 12:45:05 -05004366 oparg |= FVS_HAVE_SPEC;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004367 }
4368
Eric V. Smitha78c7952015-11-03 12:45:05 -05004369 /* And push our opcode and oparg */
4370 ADDOP_I(c, FORMAT_VALUE, oparg);
Eric V. Smith9a4135e2019-05-08 16:28:48 -04004371
Eric V. Smith235a6f02015-09-19 14:51:32 -04004372 return 1;
4373}
4374
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03004375static int
Pablo Galindoa5634c42020-09-16 19:42:00 +01004376compiler_subkwargs(struct compiler *c, asdl_keyword_seq *keywords, Py_ssize_t begin, Py_ssize_t end)
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03004377{
4378 Py_ssize_t i, n = end - begin;
4379 keyword_ty kw;
4380 PyObject *keys, *key;
4381 assert(n > 0);
Mark Shannon11e0b292021-04-15 14:28:56 +01004382 int big = n*2 > STACK_USE_GUIDELINE;
4383 if (n > 1 && !big) {
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03004384 for (i = begin; i < end; i++) {
4385 kw = asdl_seq_GET(keywords, i);
4386 VISIT(c, expr, kw->value);
4387 }
4388 keys = PyTuple_New(n);
4389 if (keys == NULL) {
4390 return 0;
4391 }
4392 for (i = begin; i < end; i++) {
4393 key = ((keyword_ty) asdl_seq_GET(keywords, i))->arg;
4394 Py_INCREF(key);
4395 PyTuple_SET_ITEM(keys, i - begin, key);
4396 }
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03004397 ADDOP_LOAD_CONST_NEW(c, keys);
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03004398 ADDOP_I(c, BUILD_CONST_KEY_MAP, n);
Mark Shannon11e0b292021-04-15 14:28:56 +01004399 return 1;
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03004400 }
Mark Shannon11e0b292021-04-15 14:28:56 +01004401 if (big) {
4402 ADDOP_I_NOLINE(c, BUILD_MAP, 0);
4403 }
4404 for (i = begin; i < end; i++) {
4405 kw = asdl_seq_GET(keywords, i);
4406 ADDOP_LOAD_CONST(c, kw->arg);
4407 VISIT(c, expr, kw->value);
4408 if (big) {
4409 ADDOP_I_NOLINE(c, MAP_ADD, 1);
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03004410 }
Mark Shannon11e0b292021-04-15 14:28:56 +01004411 }
4412 if (!big) {
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03004413 ADDOP_I(c, BUILD_MAP, n);
4414 }
4415 return 1;
4416}
4417
Guido van Rossum52cc1d82007-03-18 15:41:51 +00004418/* shared code between compiler_call and compiler_class */
4419static int
4420compiler_call_helper(struct compiler *c,
Victor Stinner976bb402016-03-23 11:36:19 +01004421 int n, /* Args already pushed */
Pablo Galindoa5634c42020-09-16 19:42:00 +01004422 asdl_expr_seq *args,
4423 asdl_keyword_seq *keywords)
Guido van Rossum52cc1d82007-03-18 15:41:51 +00004424{
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004425 Py_ssize_t i, nseen, nelts, nkwelts;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004426
Pablo Galindo254ec782020-04-03 20:37:13 +01004427 if (validate_keywords(c, keywords) == -1) {
4428 return 0;
4429 }
4430
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004431 nelts = asdl_seq_LEN(args);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004432 nkwelts = asdl_seq_LEN(keywords);
4433
Mark Shannon11e0b292021-04-15 14:28:56 +01004434 if (nelts + nkwelts*2 > STACK_USE_GUIDELINE) {
4435 goto ex_call;
4436 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004437 for (i = 0; i < nelts; i++) {
4438 expr_ty elt = asdl_seq_GET(args, i);
4439 if (elt->kind == Starred_kind) {
Mark Shannon13bc1392020-01-23 09:25:17 +00004440 goto ex_call;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004441 }
Mark Shannon13bc1392020-01-23 09:25:17 +00004442 }
4443 for (i = 0; i < nkwelts; i++) {
4444 keyword_ty kw = asdl_seq_GET(keywords, i);
4445 if (kw->arg == NULL) {
4446 goto ex_call;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004447 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004448 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004449
Mark Shannon13bc1392020-01-23 09:25:17 +00004450 /* No * or ** args, so can use faster calling sequence */
4451 for (i = 0; i < nelts; i++) {
4452 expr_ty elt = asdl_seq_GET(args, i);
4453 assert(elt->kind != Starred_kind);
4454 VISIT(c, expr, elt);
4455 }
4456 if (nkwelts) {
4457 PyObject *names;
4458 VISIT_SEQ(c, keyword, keywords);
4459 names = PyTuple_New(nkwelts);
4460 if (names == NULL) {
4461 return 0;
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004462 }
Mark Shannon13bc1392020-01-23 09:25:17 +00004463 for (i = 0; i < nkwelts; i++) {
4464 keyword_ty kw = asdl_seq_GET(keywords, i);
4465 Py_INCREF(kw->arg);
4466 PyTuple_SET_ITEM(names, i, kw->arg);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004467 }
Mark Shannon13bc1392020-01-23 09:25:17 +00004468 ADDOP_LOAD_CONST_NEW(c, names);
4469 ADDOP_I(c, CALL_FUNCTION_KW, n + nelts + nkwelts);
4470 return 1;
4471 }
4472 else {
4473 ADDOP_I(c, CALL_FUNCTION, n + nelts);
4474 return 1;
4475 }
4476
4477ex_call:
4478
4479 /* Do positional arguments. */
4480 if (n ==0 && nelts == 1 && ((expr_ty)asdl_seq_GET(args, 0))->kind == Starred_kind) {
4481 VISIT(c, expr, ((expr_ty)asdl_seq_GET(args, 0))->v.Starred.value);
4482 }
4483 else if (starunpack_helper(c, args, n, BUILD_LIST,
4484 LIST_APPEND, LIST_EXTEND, 1) == 0) {
4485 return 0;
4486 }
4487 /* Then keyword arguments */
4488 if (nkwelts) {
Mark Shannon8a4cd702020-01-27 09:57:45 +00004489 /* Has a new dict been pushed */
4490 int have_dict = 0;
Mark Shannon13bc1392020-01-23 09:25:17 +00004491
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004492 nseen = 0; /* the number of keyword arguments on the stack following */
4493 for (i = 0; i < nkwelts; i++) {
4494 keyword_ty kw = asdl_seq_GET(keywords, i);
4495 if (kw->arg == NULL) {
4496 /* A keyword argument unpacking. */
4497 if (nseen) {
Mark Shannon8a4cd702020-01-27 09:57:45 +00004498 if (!compiler_subkwargs(c, keywords, i - nseen, i)) {
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03004499 return 0;
Mark Shannon8a4cd702020-01-27 09:57:45 +00004500 }
Mark Shannondb64f122020-06-01 10:42:42 +01004501 if (have_dict) {
4502 ADDOP_I(c, DICT_MERGE, 1);
4503 }
Mark Shannon8a4cd702020-01-27 09:57:45 +00004504 have_dict = 1;
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004505 nseen = 0;
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03004506 }
Mark Shannon8a4cd702020-01-27 09:57:45 +00004507 if (!have_dict) {
4508 ADDOP_I(c, BUILD_MAP, 0);
4509 have_dict = 1;
4510 }
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004511 VISIT(c, expr, kw->value);
Mark Shannon8a4cd702020-01-27 09:57:45 +00004512 ADDOP_I(c, DICT_MERGE, 1);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004513 }
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004514 else {
4515 nseen++;
4516 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004517 }
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004518 if (nseen) {
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03004519 /* Pack up any trailing keyword arguments. */
Mark Shannon8a4cd702020-01-27 09:57:45 +00004520 if (!compiler_subkwargs(c, keywords, nkwelts - nseen, nkwelts)) {
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03004521 return 0;
Mark Shannon8a4cd702020-01-27 09:57:45 +00004522 }
4523 if (have_dict) {
4524 ADDOP_I(c, DICT_MERGE, 1);
4525 }
4526 have_dict = 1;
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03004527 }
Mark Shannon8a4cd702020-01-27 09:57:45 +00004528 assert(have_dict);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004529 }
Mark Shannon13bc1392020-01-23 09:25:17 +00004530 ADDOP_I(c, CALL_FUNCTION_EX, nkwelts > 0);
4531 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004532}
4533
Nick Coghlan650f0d02007-04-15 12:05:43 +00004534
4535/* List and set comprehensions and generator expressions work by creating a
4536 nested function to perform the actual iteration. This means that the
4537 iteration variables don't leak into the current scope.
4538 The defined function is called immediately following its definition, with the
4539 result of that call being the result of the expression.
4540 The LC/SC version returns the populated container, while the GE version is
4541 flagged in symtable.c as a generator, so it returns the generator object
4542 when the function is called.
Nick Coghlan650f0d02007-04-15 12:05:43 +00004543
4544 Possible cleanups:
4545 - iterate over the generator sequence instead of using recursion
4546*/
4547
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004548
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004549static int
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004550compiler_comprehension_generator(struct compiler *c,
Pablo Galindoa5634c42020-09-16 19:42:00 +01004551 asdl_comprehension_seq *generators, int gen_index,
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004552 int depth,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004553 expr_ty elt, expr_ty val, int type)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004554{
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004555 comprehension_ty gen;
4556 gen = (comprehension_ty)asdl_seq_GET(generators, gen_index);
4557 if (gen->is_async) {
4558 return compiler_async_comprehension_generator(
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004559 c, generators, gen_index, depth, elt, val, type);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004560 } else {
4561 return compiler_sync_comprehension_generator(
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004562 c, generators, gen_index, depth, elt, val, type);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004563 }
4564}
4565
4566static int
4567compiler_sync_comprehension_generator(struct compiler *c,
Pablo Galindoa5634c42020-09-16 19:42:00 +01004568 asdl_comprehension_seq *generators, int gen_index,
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004569 int depth,
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004570 expr_ty elt, expr_ty val, int type)
4571{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004572 /* generate code for the iterator, then each of the ifs,
4573 and then write to the element */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004574
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004575 comprehension_ty gen;
4576 basicblock *start, *anchor, *skip, *if_cleanup;
Victor Stinnerad9a0662013-11-19 22:23:20 +01004577 Py_ssize_t i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004578
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004579 start = compiler_new_block(c);
4580 skip = compiler_new_block(c);
4581 if_cleanup = compiler_new_block(c);
4582 anchor = compiler_new_block(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004583
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004584 if (start == NULL || skip == NULL || if_cleanup == NULL ||
4585 anchor == NULL)
4586 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004587
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004588 gen = (comprehension_ty)asdl_seq_GET(generators, gen_index);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004589
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004590 if (gen_index == 0) {
4591 /* Receive outermost iter as an implicit argument */
4592 c->u->u_argcount = 1;
4593 ADDOP_I(c, LOAD_FAST, 0);
4594 }
4595 else {
4596 /* Sub-iter - calculate on the fly */
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004597 /* Fast path for the temporary variable assignment idiom:
4598 for y in [f(x)]
4599 */
Pablo Galindoa5634c42020-09-16 19:42:00 +01004600 asdl_expr_seq *elts;
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004601 switch (gen->iter->kind) {
4602 case List_kind:
4603 elts = gen->iter->v.List.elts;
4604 break;
4605 case Tuple_kind:
4606 elts = gen->iter->v.Tuple.elts;
4607 break;
4608 default:
4609 elts = NULL;
4610 }
4611 if (asdl_seq_LEN(elts) == 1) {
4612 expr_ty elt = asdl_seq_GET(elts, 0);
4613 if (elt->kind != Starred_kind) {
4614 VISIT(c, expr, elt);
4615 start = NULL;
4616 }
4617 }
4618 if (start) {
4619 VISIT(c, expr, gen->iter);
4620 ADDOP(c, GET_ITER);
4621 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004622 }
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004623 if (start) {
4624 depth++;
4625 compiler_use_next_block(c, start);
Mark Shannon582aaf12020-08-04 17:30:11 +01004626 ADDOP_JUMP(c, FOR_ITER, anchor);
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004627 NEXT_BLOCK(c);
4628 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004629 VISIT(c, expr, gen->target);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004630
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004631 /* XXX this needs to be cleaned up...a lot! */
4632 n = asdl_seq_LEN(gen->ifs);
4633 for (i = 0; i < n; i++) {
4634 expr_ty e = (expr_ty)asdl_seq_GET(gen->ifs, i);
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03004635 if (!compiler_jump_if(c, e, if_cleanup, 0))
4636 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004637 NEXT_BLOCK(c);
4638 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004639
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004640 if (++gen_index < asdl_seq_LEN(generators))
4641 if (!compiler_comprehension_generator(c,
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004642 generators, gen_index, depth,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004643 elt, val, type))
4644 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004645
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004646 /* only append after the last for generator */
4647 if (gen_index >= asdl_seq_LEN(generators)) {
4648 /* comprehension specific code */
4649 switch (type) {
4650 case COMP_GENEXP:
4651 VISIT(c, expr, elt);
4652 ADDOP(c, YIELD_VALUE);
4653 ADDOP(c, POP_TOP);
4654 break;
4655 case COMP_LISTCOMP:
4656 VISIT(c, expr, elt);
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004657 ADDOP_I(c, LIST_APPEND, depth + 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004658 break;
4659 case COMP_SETCOMP:
4660 VISIT(c, expr, elt);
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004661 ADDOP_I(c, SET_ADD, depth + 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004662 break;
4663 case COMP_DICTCOMP:
Jörn Heisslerc8a35412019-06-22 16:40:55 +02004664 /* With '{k: v}', k is evaluated before v, so we do
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004665 the same. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004666 VISIT(c, expr, elt);
Jörn Heisslerc8a35412019-06-22 16:40:55 +02004667 VISIT(c, expr, val);
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004668 ADDOP_I(c, MAP_ADD, depth + 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004669 break;
4670 default:
4671 return 0;
4672 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004673
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004674 compiler_use_next_block(c, skip);
4675 }
4676 compiler_use_next_block(c, if_cleanup);
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004677 if (start) {
Mark Shannon582aaf12020-08-04 17:30:11 +01004678 ADDOP_JUMP(c, JUMP_ABSOLUTE, start);
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004679 compiler_use_next_block(c, anchor);
4680 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004681
4682 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004683}
4684
4685static int
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004686compiler_async_comprehension_generator(struct compiler *c,
Pablo Galindoa5634c42020-09-16 19:42:00 +01004687 asdl_comprehension_seq *generators, int gen_index,
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004688 int depth,
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004689 expr_ty elt, expr_ty val, int type)
4690{
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004691 comprehension_ty gen;
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02004692 basicblock *start, *if_cleanup, *except;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004693 Py_ssize_t i, n;
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02004694 start = compiler_new_block(c);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004695 except = compiler_new_block(c);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004696 if_cleanup = compiler_new_block(c);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004697
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02004698 if (start == NULL || if_cleanup == NULL || except == NULL) {
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004699 return 0;
4700 }
4701
4702 gen = (comprehension_ty)asdl_seq_GET(generators, gen_index);
4703
4704 if (gen_index == 0) {
4705 /* Receive outermost iter as an implicit argument */
4706 c->u->u_argcount = 1;
4707 ADDOP_I(c, LOAD_FAST, 0);
4708 }
4709 else {
4710 /* Sub-iter - calculate on the fly */
4711 VISIT(c, expr, gen->iter);
4712 ADDOP(c, GET_AITER);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004713 }
4714
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02004715 compiler_use_next_block(c, start);
tomKPZ7a7ba3d2021-04-07 07:43:45 -07004716 /* Runtime will push a block here, so we need to account for that */
4717 if (!compiler_push_fblock(c, ASYNC_COMPREHENSION_GENERATOR, start,
4718 NULL, NULL)) {
4719 return 0;
4720 }
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004721
Mark Shannon582aaf12020-08-04 17:30:11 +01004722 ADDOP_JUMP(c, SETUP_FINALLY, except);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004723 ADDOP(c, GET_ANEXT);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03004724 ADDOP_LOAD_CONST(c, Py_None);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004725 ADDOP(c, YIELD_FROM);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004726 ADDOP(c, POP_BLOCK);
Serhiy Storchaka24d32012018-03-10 18:22:34 +02004727 VISIT(c, expr, gen->target);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004728
4729 n = asdl_seq_LEN(gen->ifs);
4730 for (i = 0; i < n; i++) {
4731 expr_ty e = (expr_ty)asdl_seq_GET(gen->ifs, i);
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03004732 if (!compiler_jump_if(c, e, if_cleanup, 0))
4733 return 0;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004734 NEXT_BLOCK(c);
4735 }
4736
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004737 depth++;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004738 if (++gen_index < asdl_seq_LEN(generators))
4739 if (!compiler_comprehension_generator(c,
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004740 generators, gen_index, depth,
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004741 elt, val, type))
4742 return 0;
4743
4744 /* only append after the last for generator */
4745 if (gen_index >= asdl_seq_LEN(generators)) {
4746 /* comprehension specific code */
4747 switch (type) {
4748 case COMP_GENEXP:
4749 VISIT(c, expr, elt);
4750 ADDOP(c, YIELD_VALUE);
4751 ADDOP(c, POP_TOP);
4752 break;
4753 case COMP_LISTCOMP:
4754 VISIT(c, expr, elt);
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004755 ADDOP_I(c, LIST_APPEND, depth + 1);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004756 break;
4757 case COMP_SETCOMP:
4758 VISIT(c, expr, elt);
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004759 ADDOP_I(c, SET_ADD, depth + 1);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004760 break;
4761 case COMP_DICTCOMP:
Jörn Heisslerc8a35412019-06-22 16:40:55 +02004762 /* With '{k: v}', k is evaluated before v, so we do
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004763 the same. */
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004764 VISIT(c, expr, elt);
Jörn Heisslerc8a35412019-06-22 16:40:55 +02004765 VISIT(c, expr, val);
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004766 ADDOP_I(c, MAP_ADD, depth + 1);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004767 break;
4768 default:
4769 return 0;
4770 }
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004771 }
4772 compiler_use_next_block(c, if_cleanup);
Mark Shannon582aaf12020-08-04 17:30:11 +01004773 ADDOP_JUMP(c, JUMP_ABSOLUTE, start);
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02004774
tomKPZ7a7ba3d2021-04-07 07:43:45 -07004775 compiler_pop_fblock(c, ASYNC_COMPREHENSION_GENERATOR, start);
4776
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02004777 compiler_use_next_block(c, except);
4778 ADDOP(c, END_ASYNC_FOR);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004779
4780 return 1;
4781}
4782
4783static int
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004784compiler_comprehension(struct compiler *c, expr_ty e, int type,
Pablo Galindoa5634c42020-09-16 19:42:00 +01004785 identifier name, asdl_comprehension_seq *generators, expr_ty elt,
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004786 expr_ty val)
Nick Coghlan650f0d02007-04-15 12:05:43 +00004787{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004788 PyCodeObject *co = NULL;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004789 comprehension_ty outermost;
Antoine Pitrou86a36b52011-11-25 18:56:07 +01004790 PyObject *qualname = NULL;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004791 int is_async_generator = 0;
Matthias Bussonnierbd461742020-07-06 14:26:52 -07004792 int top_level_await = IS_TOP_LEVEL_AWAIT(c);
Nick Coghlan650f0d02007-04-15 12:05:43 +00004793
Matthias Bussonnierbd461742020-07-06 14:26:52 -07004794
Batuhan TaÅŸkaya9052f7a2020-03-19 14:35:44 +03004795 int is_async_function = c->u->u_ste->ste_coroutine;
Nick Coghlan650f0d02007-04-15 12:05:43 +00004796
Batuhan TaÅŸkaya9052f7a2020-03-19 14:35:44 +03004797 outermost = (comprehension_ty) asdl_seq_GET(generators, 0);
Antoine Pitrou86a36b52011-11-25 18:56:07 +01004798 if (!compiler_enter_scope(c, name, COMPILER_SCOPE_COMPREHENSION,
4799 (void *)e, e->lineno))
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004800 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004801 goto error;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004802 }
Mark Shannon7674c832021-06-21 11:47:16 +01004803 SET_LOC(c, e);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004804
4805 is_async_generator = c->u->u_ste->ste_coroutine;
4806
Matthias Bussonnierbd461742020-07-06 14:26:52 -07004807 if (is_async_generator && !is_async_function && type != COMP_GENEXP && !top_level_await) {
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004808 compiler_error(c, "asynchronous comprehension outside of "
4809 "an asynchronous function");
4810 goto error_in_scope;
4811 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00004812
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004813 if (type != COMP_GENEXP) {
4814 int op;
4815 switch (type) {
4816 case COMP_LISTCOMP:
4817 op = BUILD_LIST;
4818 break;
4819 case COMP_SETCOMP:
4820 op = BUILD_SET;
4821 break;
4822 case COMP_DICTCOMP:
4823 op = BUILD_MAP;
4824 break;
4825 default:
4826 PyErr_Format(PyExc_SystemError,
4827 "unknown comprehension type %d", type);
4828 goto error_in_scope;
4829 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00004830
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004831 ADDOP_I(c, op, 0);
4832 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00004833
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004834 if (!compiler_comprehension_generator(c, generators, 0, 0, elt,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004835 val, type))
4836 goto error_in_scope;
Nick Coghlan650f0d02007-04-15 12:05:43 +00004837
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004838 if (type != COMP_GENEXP) {
4839 ADDOP(c, RETURN_VALUE);
4840 }
4841
4842 co = assemble(c, 1);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04004843 qualname = c->u->u_qualname;
4844 Py_INCREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004845 compiler_exit_scope(c);
Matthias Bussonnierbd461742020-07-06 14:26:52 -07004846 if (top_level_await && is_async_generator){
4847 c->u->u_ste->ste_coroutine = 1;
4848 }
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04004849 if (co == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004850 goto error;
4851
Victor Stinnerba7a99d2021-01-30 01:46:44 +01004852 if (!compiler_make_closure(c, co, 0, qualname)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004853 goto error;
Victor Stinnerba7a99d2021-01-30 01:46:44 +01004854 }
Antoine Pitrou86a36b52011-11-25 18:56:07 +01004855 Py_DECREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004856 Py_DECREF(co);
4857
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004858 VISIT(c, expr, outermost->iter);
4859
4860 if (outermost->is_async) {
4861 ADDOP(c, GET_AITER);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004862 } else {
4863 ADDOP(c, GET_ITER);
4864 }
4865
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004866 ADDOP_I(c, CALL_FUNCTION, 1);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004867
4868 if (is_async_generator && type != COMP_GENEXP) {
4869 ADDOP(c, GET_AWAITABLE);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03004870 ADDOP_LOAD_CONST(c, Py_None);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004871 ADDOP(c, YIELD_FROM);
4872 }
4873
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004874 return 1;
Nick Coghlan650f0d02007-04-15 12:05:43 +00004875error_in_scope:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004876 compiler_exit_scope(c);
Nick Coghlan650f0d02007-04-15 12:05:43 +00004877error:
Antoine Pitrou86a36b52011-11-25 18:56:07 +01004878 Py_XDECREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004879 Py_XDECREF(co);
4880 return 0;
Nick Coghlan650f0d02007-04-15 12:05:43 +00004881}
4882
4883static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004884compiler_genexp(struct compiler *c, expr_ty e)
4885{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004886 static identifier name;
4887 if (!name) {
Zackery Spytzf3036392018-04-15 16:12:29 -06004888 name = PyUnicode_InternFromString("<genexpr>");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004889 if (!name)
4890 return 0;
4891 }
4892 assert(e->kind == GeneratorExp_kind);
4893 return compiler_comprehension(c, e, COMP_GENEXP, name,
4894 e->v.GeneratorExp.generators,
4895 e->v.GeneratorExp.elt, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004896}
4897
4898static int
Nick Coghlan650f0d02007-04-15 12:05:43 +00004899compiler_listcomp(struct compiler *c, expr_ty e)
4900{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004901 static identifier name;
4902 if (!name) {
Zackery Spytzf3036392018-04-15 16:12:29 -06004903 name = PyUnicode_InternFromString("<listcomp>");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004904 if (!name)
4905 return 0;
4906 }
4907 assert(e->kind == ListComp_kind);
4908 return compiler_comprehension(c, e, COMP_LISTCOMP, name,
4909 e->v.ListComp.generators,
4910 e->v.ListComp.elt, NULL);
Nick Coghlan650f0d02007-04-15 12:05:43 +00004911}
4912
4913static int
4914compiler_setcomp(struct compiler *c, expr_ty e)
4915{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004916 static identifier name;
4917 if (!name) {
Zackery Spytzf3036392018-04-15 16:12:29 -06004918 name = PyUnicode_InternFromString("<setcomp>");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004919 if (!name)
4920 return 0;
4921 }
4922 assert(e->kind == SetComp_kind);
4923 return compiler_comprehension(c, e, COMP_SETCOMP, name,
4924 e->v.SetComp.generators,
4925 e->v.SetComp.elt, NULL);
Guido van Rossum992d4a32007-07-11 13:09:30 +00004926}
4927
4928
4929static int
4930compiler_dictcomp(struct compiler *c, expr_ty e)
4931{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004932 static identifier name;
4933 if (!name) {
Zackery Spytzf3036392018-04-15 16:12:29 -06004934 name = PyUnicode_InternFromString("<dictcomp>");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004935 if (!name)
4936 return 0;
4937 }
4938 assert(e->kind == DictComp_kind);
4939 return compiler_comprehension(c, e, COMP_DICTCOMP, name,
4940 e->v.DictComp.generators,
4941 e->v.DictComp.key, e->v.DictComp.value);
Nick Coghlan650f0d02007-04-15 12:05:43 +00004942}
4943
4944
4945static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004946compiler_visit_keyword(struct compiler *c, keyword_ty k)
4947{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004948 VISIT(c, expr, k->value);
4949 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004950}
4951
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004952/* Test whether expression is constant. For constants, report
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004953 whether they are true or false.
4954
4955 Return values: 1 for true, 0 for false, -1 for non-constant.
4956 */
4957
4958static int
Mark Shannonfee55262019-11-21 09:11:43 +00004959compiler_with_except_finish(struct compiler *c) {
4960 basicblock *exit;
4961 exit = compiler_new_block(c);
4962 if (exit == NULL)
4963 return 0;
Mark Shannon582aaf12020-08-04 17:30:11 +01004964 ADDOP_JUMP(c, POP_JUMP_IF_TRUE, exit);
Mark Shannon266b4622020-11-17 19:30:14 +00004965 NEXT_BLOCK(c);
Mark Shannonbf353f32020-12-17 13:55:28 +00004966 ADDOP_I(c, RERAISE, 1);
Mark Shannonfee55262019-11-21 09:11:43 +00004967 compiler_use_next_block(c, exit);
4968 ADDOP(c, POP_TOP);
4969 ADDOP(c, POP_TOP);
4970 ADDOP(c, POP_TOP);
4971 ADDOP(c, POP_EXCEPT);
4972 ADDOP(c, POP_TOP);
4973 return 1;
4974}
Yury Selivanov75445082015-05-11 22:57:16 -04004975
4976/*
4977 Implements the async with statement.
4978
4979 The semantics outlined in that PEP are as follows:
4980
4981 async with EXPR as VAR:
4982 BLOCK
4983
4984 It is implemented roughly as:
4985
4986 context = EXPR
4987 exit = context.__aexit__ # not calling it
4988 value = await context.__aenter__()
4989 try:
4990 VAR = value # if VAR present in the syntax
4991 BLOCK
4992 finally:
4993 if an exception was raised:
Serhiy Storchakaec466a12015-06-11 00:09:32 +03004994 exc = copy of (exception, instance, traceback)
Yury Selivanov75445082015-05-11 22:57:16 -04004995 else:
Serhiy Storchakaec466a12015-06-11 00:09:32 +03004996 exc = (None, None, None)
Yury Selivanov75445082015-05-11 22:57:16 -04004997 if not (await exit(*exc)):
4998 raise
4999 */
5000static int
5001compiler_async_with(struct compiler *c, stmt_ty s, int pos)
5002{
Mark Shannonfee55262019-11-21 09:11:43 +00005003 basicblock *block, *final, *exit;
Yury Selivanov75445082015-05-11 22:57:16 -04005004 withitem_ty item = asdl_seq_GET(s->v.AsyncWith.items, pos);
5005
5006 assert(s->kind == AsyncWith_kind);
Pablo Galindo90235812020-03-15 04:29:22 +00005007 if (IS_TOP_LEVEL_AWAIT(c)){
Matthias Bussonnier565b4f12019-05-21 13:12:03 -07005008 c->u->u_ste->ste_coroutine = 1;
5009 } else if (c->u->u_scope_type != COMPILER_SCOPE_ASYNC_FUNCTION){
Zsolt Dollensteine2396502018-04-27 08:58:56 -07005010 return compiler_error(c, "'async with' outside async function");
5011 }
Yury Selivanov75445082015-05-11 22:57:16 -04005012
5013 block = compiler_new_block(c);
Mark Shannonfee55262019-11-21 09:11:43 +00005014 final = compiler_new_block(c);
5015 exit = compiler_new_block(c);
5016 if (!block || !final || !exit)
Yury Selivanov75445082015-05-11 22:57:16 -04005017 return 0;
5018
5019 /* Evaluate EXPR */
5020 VISIT(c, expr, item->context_expr);
5021
5022 ADDOP(c, BEFORE_ASYNC_WITH);
5023 ADDOP(c, GET_AWAITABLE);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005024 ADDOP_LOAD_CONST(c, Py_None);
Yury Selivanov75445082015-05-11 22:57:16 -04005025 ADDOP(c, YIELD_FROM);
5026
Mark Shannon582aaf12020-08-04 17:30:11 +01005027 ADDOP_JUMP(c, SETUP_ASYNC_WITH, final);
Yury Selivanov75445082015-05-11 22:57:16 -04005028
5029 /* SETUP_ASYNC_WITH pushes a finally block. */
5030 compiler_use_next_block(c, block);
Mark Shannon5979e812021-04-30 14:32:47 +01005031 if (!compiler_push_fblock(c, ASYNC_WITH, block, final, s)) {
Yury Selivanov75445082015-05-11 22:57:16 -04005032 return 0;
5033 }
5034
5035 if (item->optional_vars) {
5036 VISIT(c, expr, item->optional_vars);
5037 }
5038 else {
5039 /* Discard result from context.__aenter__() */
5040 ADDOP(c, POP_TOP);
5041 }
5042
5043 pos++;
5044 if (pos == asdl_seq_LEN(s->v.AsyncWith.items))
5045 /* BLOCK code */
5046 VISIT_SEQ(c, stmt, s->v.AsyncWith.body)
5047 else if (!compiler_async_with(c, s, pos))
5048 return 0;
5049
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02005050 compiler_pop_fblock(c, ASYNC_WITH, block);
Mark Shannonfee55262019-11-21 09:11:43 +00005051 ADDOP(c, POP_BLOCK);
5052 /* End of body; start the cleanup */
Yury Selivanov75445082015-05-11 22:57:16 -04005053
Mark Shannonfee55262019-11-21 09:11:43 +00005054 /* For successful outcome:
5055 * call __exit__(None, None, None)
5056 */
Mark Shannon5979e812021-04-30 14:32:47 +01005057 SET_LOC(c, s);
Mark Shannonfee55262019-11-21 09:11:43 +00005058 if(!compiler_call_exit_with_nones(c))
Yury Selivanov75445082015-05-11 22:57:16 -04005059 return 0;
Mark Shannonfee55262019-11-21 09:11:43 +00005060 ADDOP(c, GET_AWAITABLE);
5061 ADDOP_O(c, LOAD_CONST, Py_None, consts);
5062 ADDOP(c, YIELD_FROM);
Yury Selivanov75445082015-05-11 22:57:16 -04005063
Mark Shannonfee55262019-11-21 09:11:43 +00005064 ADDOP(c, POP_TOP);
Yury Selivanov75445082015-05-11 22:57:16 -04005065
Mark Shannon582aaf12020-08-04 17:30:11 +01005066 ADDOP_JUMP(c, JUMP_ABSOLUTE, exit);
Mark Shannonfee55262019-11-21 09:11:43 +00005067
5068 /* For exceptional outcome: */
5069 compiler_use_next_block(c, final);
Mark Shannonfee55262019-11-21 09:11:43 +00005070 ADDOP(c, WITH_EXCEPT_START);
Yury Selivanov75445082015-05-11 22:57:16 -04005071 ADDOP(c, GET_AWAITABLE);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005072 ADDOP_LOAD_CONST(c, Py_None);
Yury Selivanov75445082015-05-11 22:57:16 -04005073 ADDOP(c, YIELD_FROM);
Mark Shannonfee55262019-11-21 09:11:43 +00005074 compiler_with_except_finish(c);
Yury Selivanov75445082015-05-11 22:57:16 -04005075
Mark Shannonfee55262019-11-21 09:11:43 +00005076compiler_use_next_block(c, exit);
Yury Selivanov75445082015-05-11 22:57:16 -04005077 return 1;
5078}
5079
5080
Guido van Rossumc2e20742006-02-27 22:32:47 +00005081/*
5082 Implements the with statement from PEP 343.
Guido van Rossumc2e20742006-02-27 22:32:47 +00005083 with EXPR as VAR:
5084 BLOCK
Mark Shannonfee55262019-11-21 09:11:43 +00005085 is implemented as:
5086 <code for EXPR>
5087 SETUP_WITH E
5088 <code to store to VAR> or POP_TOP
5089 <code for BLOCK>
5090 LOAD_CONST (None, None, None)
5091 CALL_FUNCTION_EX 0
5092 JUMP_FORWARD EXIT
5093 E: WITH_EXCEPT_START (calls EXPR.__exit__)
5094 POP_JUMP_IF_TRUE T:
5095 RERAISE
5096 T: POP_TOP * 3 (remove exception from stack)
5097 POP_EXCEPT
5098 POP_TOP
5099 EXIT:
Guido van Rossumc2e20742006-02-27 22:32:47 +00005100 */
Mark Shannonfee55262019-11-21 09:11:43 +00005101
Guido van Rossumc2e20742006-02-27 22:32:47 +00005102static int
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05005103compiler_with(struct compiler *c, stmt_ty s, int pos)
Guido van Rossumc2e20742006-02-27 22:32:47 +00005104{
Mark Shannonfee55262019-11-21 09:11:43 +00005105 basicblock *block, *final, *exit;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05005106 withitem_ty item = asdl_seq_GET(s->v.With.items, pos);
Guido van Rossumc2e20742006-02-27 22:32:47 +00005107
5108 assert(s->kind == With_kind);
5109
Guido van Rossumc2e20742006-02-27 22:32:47 +00005110 block = compiler_new_block(c);
Mark Shannonfee55262019-11-21 09:11:43 +00005111 final = compiler_new_block(c);
5112 exit = compiler_new_block(c);
5113 if (!block || !final || !exit)
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00005114 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00005115
Thomas Wouters477c8d52006-05-27 19:21:47 +00005116 /* Evaluate EXPR */
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05005117 VISIT(c, expr, item->context_expr);
Mark Shannonfee55262019-11-21 09:11:43 +00005118 /* Will push bound __exit__ */
Mark Shannon582aaf12020-08-04 17:30:11 +01005119 ADDOP_JUMP(c, SETUP_WITH, final);
Guido van Rossumc2e20742006-02-27 22:32:47 +00005120
Benjamin Peterson876b2f22009-06-28 03:18:59 +00005121 /* SETUP_WITH pushes a finally block. */
Guido van Rossumc2e20742006-02-27 22:32:47 +00005122 compiler_use_next_block(c, block);
Mark Shannon5979e812021-04-30 14:32:47 +01005123 if (!compiler_push_fblock(c, WITH, block, final, s)) {
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00005124 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00005125 }
5126
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05005127 if (item->optional_vars) {
5128 VISIT(c, expr, item->optional_vars);
Benjamin Peterson876b2f22009-06-28 03:18:59 +00005129 }
5130 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005131 /* Discard result from context.__enter__() */
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00005132 ADDOP(c, POP_TOP);
Guido van Rossumc2e20742006-02-27 22:32:47 +00005133 }
5134
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05005135 pos++;
5136 if (pos == asdl_seq_LEN(s->v.With.items))
5137 /* BLOCK code */
5138 VISIT_SEQ(c, stmt, s->v.With.body)
5139 else if (!compiler_with(c, s, pos))
5140 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00005141
Mark Shannon3bd60352021-01-13 12:05:43 +00005142
5143 /* Mark all following code as artificial */
5144 c->u->u_lineno = -1;
Guido van Rossumc2e20742006-02-27 22:32:47 +00005145 ADDOP(c, POP_BLOCK);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02005146 compiler_pop_fblock(c, WITH, block);
Mark Shannon13bc1392020-01-23 09:25:17 +00005147
Mark Shannonfee55262019-11-21 09:11:43 +00005148 /* End of body; start the cleanup. */
Mark Shannon13bc1392020-01-23 09:25:17 +00005149
Mark Shannonfee55262019-11-21 09:11:43 +00005150 /* For successful outcome:
5151 * call __exit__(None, None, None)
5152 */
Mark Shannon5979e812021-04-30 14:32:47 +01005153 SET_LOC(c, s);
Mark Shannonfee55262019-11-21 09:11:43 +00005154 if (!compiler_call_exit_with_nones(c))
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00005155 return 0;
Mark Shannonfee55262019-11-21 09:11:43 +00005156 ADDOP(c, POP_TOP);
Mark Shannon582aaf12020-08-04 17:30:11 +01005157 ADDOP_JUMP(c, JUMP_FORWARD, exit);
Guido van Rossumc2e20742006-02-27 22:32:47 +00005158
Mark Shannonfee55262019-11-21 09:11:43 +00005159 /* For exceptional outcome: */
5160 compiler_use_next_block(c, final);
Mark Shannonfee55262019-11-21 09:11:43 +00005161 ADDOP(c, WITH_EXCEPT_START);
5162 compiler_with_except_finish(c);
5163
5164 compiler_use_next_block(c, exit);
Guido van Rossumc2e20742006-02-27 22:32:47 +00005165 return 1;
5166}
5167
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005168static int
Serhiy Storchakada8d72c2018-09-17 15:17:29 +03005169compiler_visit_expr1(struct compiler *c, expr_ty e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005170{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005171 switch (e->kind) {
Emily Morehouse8f59ee02019-01-24 16:49:56 -07005172 case NamedExpr_kind:
5173 VISIT(c, expr, e->v.NamedExpr.value);
5174 ADDOP(c, DUP_TOP);
5175 VISIT(c, expr, e->v.NamedExpr.target);
5176 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005177 case BoolOp_kind:
5178 return compiler_boolop(c, e);
5179 case BinOp_kind:
5180 VISIT(c, expr, e->v.BinOp.left);
5181 VISIT(c, expr, e->v.BinOp.right);
Andy Lester76d58772020-03-10 21:18:12 -05005182 ADDOP(c, binop(e->v.BinOp.op));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005183 break;
5184 case UnaryOp_kind:
5185 VISIT(c, expr, e->v.UnaryOp.operand);
5186 ADDOP(c, unaryop(e->v.UnaryOp.op));
5187 break;
5188 case Lambda_kind:
5189 return compiler_lambda(c, e);
5190 case IfExp_kind:
5191 return compiler_ifexp(c, e);
5192 case Dict_kind:
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04005193 return compiler_dict(c, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005194 case Set_kind:
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04005195 return compiler_set(c, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005196 case GeneratorExp_kind:
5197 return compiler_genexp(c, e);
5198 case ListComp_kind:
5199 return compiler_listcomp(c, e);
5200 case SetComp_kind:
5201 return compiler_setcomp(c, e);
5202 case DictComp_kind:
5203 return compiler_dictcomp(c, e);
5204 case Yield_kind:
5205 if (c->u->u_ste->ste_type != FunctionBlock)
5206 return compiler_error(c, "'yield' outside function");
Mark Dickinsonded35ae2012-11-25 14:36:26 +00005207 if (e->v.Yield.value) {
5208 VISIT(c, expr, e->v.Yield.value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005209 }
5210 else {
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005211 ADDOP_LOAD_CONST(c, Py_None);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005212 }
Mark Dickinsonded35ae2012-11-25 14:36:26 +00005213 ADDOP(c, YIELD_VALUE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005214 break;
Mark Dickinsonded35ae2012-11-25 14:36:26 +00005215 case YieldFrom_kind:
5216 if (c->u->u_ste->ste_type != FunctionBlock)
5217 return compiler_error(c, "'yield' outside function");
Yury Selivanov75445082015-05-11 22:57:16 -04005218
5219 if (c->u->u_scope_type == COMPILER_SCOPE_ASYNC_FUNCTION)
5220 return compiler_error(c, "'yield from' inside async function");
5221
Mark Dickinsonded35ae2012-11-25 14:36:26 +00005222 VISIT(c, expr, e->v.YieldFrom.value);
Yury Selivanov5376ba92015-06-22 12:19:30 -04005223 ADDOP(c, GET_YIELD_FROM_ITER);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005224 ADDOP_LOAD_CONST(c, Py_None);
Mark Dickinsonded35ae2012-11-25 14:36:26 +00005225 ADDOP(c, YIELD_FROM);
5226 break;
Yury Selivanov75445082015-05-11 22:57:16 -04005227 case Await_kind:
Pablo Galindo90235812020-03-15 04:29:22 +00005228 if (!IS_TOP_LEVEL_AWAIT(c)){
Matthias Bussonnier565b4f12019-05-21 13:12:03 -07005229 if (c->u->u_ste->ste_type != FunctionBlock){
5230 return compiler_error(c, "'await' outside function");
5231 }
Yury Selivanov75445082015-05-11 22:57:16 -04005232
Victor Stinner331a6a52019-05-27 16:39:22 +02005233 if (c->u->u_scope_type != COMPILER_SCOPE_ASYNC_FUNCTION &&
Matthias Bussonnier565b4f12019-05-21 13:12:03 -07005234 c->u->u_scope_type != COMPILER_SCOPE_COMPREHENSION){
5235 return compiler_error(c, "'await' outside async function");
5236 }
5237 }
Yury Selivanov75445082015-05-11 22:57:16 -04005238
5239 VISIT(c, expr, e->v.Await.value);
5240 ADDOP(c, GET_AWAITABLE);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005241 ADDOP_LOAD_CONST(c, Py_None);
Yury Selivanov75445082015-05-11 22:57:16 -04005242 ADDOP(c, YIELD_FROM);
5243 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005244 case Compare_kind:
5245 return compiler_compare(c, e);
5246 case Call_kind:
5247 return compiler_call(c, e);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01005248 case Constant_kind:
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005249 ADDOP_LOAD_CONST(c, e->v.Constant.value);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01005250 break;
Eric V. Smith235a6f02015-09-19 14:51:32 -04005251 case JoinedStr_kind:
5252 return compiler_joined_str(c, e);
5253 case FormattedValue_kind:
5254 return compiler_formatted_value(c, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005255 /* The following exprs can be assignment targets. */
5256 case Attribute_kind:
Serhiy Storchaka6b975982020-03-17 23:41:08 +02005257 VISIT(c, expr, e->v.Attribute.value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005258 switch (e->v.Attribute.ctx) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005259 case Load:
Mark Shannond48848c2021-03-14 18:01:30 +00005260 {
5261 int old_lineno = c->u->u_lineno;
5262 c->u->u_lineno = e->end_lineno;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005263 ADDOP_NAME(c, LOAD_ATTR, e->v.Attribute.attr, names);
Mark Shannond48848c2021-03-14 18:01:30 +00005264 c->u->u_lineno = old_lineno;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005265 break;
Mark Shannond48848c2021-03-14 18:01:30 +00005266 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005267 case Store:
Mark Shannond48848c2021-03-14 18:01:30 +00005268 if (forbidden_name(c, e->v.Attribute.attr, e->v.Attribute.ctx)) {
Pablo Galindoc5fc1562020-04-22 23:29:27 +01005269 return 0;
Mark Shannond48848c2021-03-14 18:01:30 +00005270 }
5271 int old_lineno = c->u->u_lineno;
5272 c->u->u_lineno = e->end_lineno;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005273 ADDOP_NAME(c, STORE_ATTR, e->v.Attribute.attr, names);
Mark Shannond48848c2021-03-14 18:01:30 +00005274 c->u->u_lineno = old_lineno;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005275 break;
5276 case Del:
5277 ADDOP_NAME(c, DELETE_ATTR, e->v.Attribute.attr, names);
5278 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005279 }
5280 break;
5281 case Subscript_kind:
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005282 return compiler_subscript(c, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005283 case Starred_kind:
5284 switch (e->v.Starred.ctx) {
5285 case Store:
5286 /* In all legitimate cases, the Starred node was already replaced
5287 * by compiler_list/compiler_tuple. XXX: is that okay? */
5288 return compiler_error(c,
5289 "starred assignment target must be in a list or tuple");
5290 default:
5291 return compiler_error(c,
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04005292 "can't use starred expression here");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005293 }
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005294 break;
5295 case Slice_kind:
5296 return compiler_slice(c, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005297 case Name_kind:
5298 return compiler_nameop(c, e->v.Name.id, e->v.Name.ctx);
5299 /* child nodes of List and Tuple will have expr_context set */
5300 case List_kind:
5301 return compiler_list(c, e);
5302 case Tuple_kind:
5303 return compiler_tuple(c, e);
5304 }
5305 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005306}
5307
5308static int
Serhiy Storchakada8d72c2018-09-17 15:17:29 +03005309compiler_visit_expr(struct compiler *c, expr_ty e)
5310{
Serhiy Storchakada8d72c2018-09-17 15:17:29 +03005311 int old_lineno = c->u->u_lineno;
Miss Islington (bot)13de28f2021-05-07 13:40:09 -07005312 int old_end_lineno = c->u->u_end_lineno;
Serhiy Storchakada8d72c2018-09-17 15:17:29 +03005313 int old_col_offset = c->u->u_col_offset;
Miss Islington (bot)13de28f2021-05-07 13:40:09 -07005314 int old_end_col_offset = c->u->u_end_col_offset;
Serhiy Storchaka61cb3d02020-03-17 18:07:30 +02005315 SET_LOC(c, e);
Serhiy Storchakada8d72c2018-09-17 15:17:29 +03005316 int res = compiler_visit_expr1(c, e);
Serhiy Storchaka61cb3d02020-03-17 18:07:30 +02005317 c->u->u_lineno = old_lineno;
Miss Islington (bot)13de28f2021-05-07 13:40:09 -07005318 c->u->u_end_lineno = old_end_lineno;
Serhiy Storchakada8d72c2018-09-17 15:17:29 +03005319 c->u->u_col_offset = old_col_offset;
Miss Islington (bot)13de28f2021-05-07 13:40:09 -07005320 c->u->u_end_col_offset = old_end_col_offset;
Serhiy Storchakada8d72c2018-09-17 15:17:29 +03005321 return res;
5322}
5323
5324static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005325compiler_augassign(struct compiler *c, stmt_ty s)
5326{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005327 assert(s->kind == AugAssign_kind);
Serhiy Storchaka6b975982020-03-17 23:41:08 +02005328 expr_ty e = s->v.AugAssign.target;
5329
5330 int old_lineno = c->u->u_lineno;
Miss Islington (bot)13de28f2021-05-07 13:40:09 -07005331 int old_end_lineno = c->u->u_end_lineno;
Serhiy Storchaka6b975982020-03-17 23:41:08 +02005332 int old_col_offset = c->u->u_col_offset;
Miss Islington (bot)13de28f2021-05-07 13:40:09 -07005333 int old_end_col_offset = c->u->u_end_col_offset;
Serhiy Storchaka6b975982020-03-17 23:41:08 +02005334 SET_LOC(c, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005335
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005336 switch (e->kind) {
5337 case Attribute_kind:
Serhiy Storchaka6b975982020-03-17 23:41:08 +02005338 VISIT(c, expr, e->v.Attribute.value);
5339 ADDOP(c, DUP_TOP);
Mark Shannond48848c2021-03-14 18:01:30 +00005340 int old_lineno = c->u->u_lineno;
5341 c->u->u_lineno = e->end_lineno;
Serhiy Storchaka6b975982020-03-17 23:41:08 +02005342 ADDOP_NAME(c, LOAD_ATTR, e->v.Attribute.attr, names);
Mark Shannond48848c2021-03-14 18:01:30 +00005343 c->u->u_lineno = old_lineno;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005344 break;
5345 case Subscript_kind:
Serhiy Storchaka6b975982020-03-17 23:41:08 +02005346 VISIT(c, expr, e->v.Subscript.value);
5347 VISIT(c, expr, e->v.Subscript.slice);
5348 ADDOP(c, DUP_TOP_TWO);
5349 ADDOP(c, BINARY_SUBSCR);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005350 break;
5351 case Name_kind:
5352 if (!compiler_nameop(c, e->v.Name.id, Load))
5353 return 0;
Serhiy Storchaka6b975982020-03-17 23:41:08 +02005354 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005355 default:
5356 PyErr_Format(PyExc_SystemError,
5357 "invalid node type (%d) for augmented assignment",
5358 e->kind);
5359 return 0;
5360 }
Serhiy Storchaka6b975982020-03-17 23:41:08 +02005361
5362 c->u->u_lineno = old_lineno;
Miss Islington (bot)13de28f2021-05-07 13:40:09 -07005363 c->u->u_end_lineno = old_end_lineno;
Serhiy Storchaka6b975982020-03-17 23:41:08 +02005364 c->u->u_col_offset = old_col_offset;
Miss Islington (bot)13de28f2021-05-07 13:40:09 -07005365 c->u->u_end_col_offset = old_end_col_offset;
Serhiy Storchaka6b975982020-03-17 23:41:08 +02005366
5367 VISIT(c, expr, s->v.AugAssign.value);
5368 ADDOP(c, inplace_binop(s->v.AugAssign.op));
5369
5370 SET_LOC(c, e);
5371
5372 switch (e->kind) {
5373 case Attribute_kind:
Mark Shannond48848c2021-03-14 18:01:30 +00005374 c->u->u_lineno = e->end_lineno;
Serhiy Storchaka6b975982020-03-17 23:41:08 +02005375 ADDOP(c, ROT_TWO);
5376 ADDOP_NAME(c, STORE_ATTR, e->v.Attribute.attr, names);
5377 break;
5378 case Subscript_kind:
5379 ADDOP(c, ROT_THREE);
5380 ADDOP(c, STORE_SUBSCR);
5381 break;
5382 case Name_kind:
5383 return compiler_nameop(c, e->v.Name.id, Store);
5384 default:
5385 Py_UNREACHABLE();
5386 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005387 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005388}
5389
5390static int
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005391check_ann_expr(struct compiler *c, expr_ty e)
5392{
5393 VISIT(c, expr, e);
5394 ADDOP(c, POP_TOP);
5395 return 1;
5396}
5397
5398static int
5399check_annotation(struct compiler *c, stmt_ty s)
5400{
Batuhan Taskaya8cc3cfa2021-04-25 05:31:20 +03005401 /* Annotations of complex targets does not produce anything
5402 under annotations future */
5403 if (c->c_future->ff_features & CO_FUTURE_ANNOTATIONS) {
5404 return 1;
5405 }
5406
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005407 /* Annotations are only evaluated in a module or class. */
5408 if (c->u->u_scope_type == COMPILER_SCOPE_MODULE ||
5409 c->u->u_scope_type == COMPILER_SCOPE_CLASS) {
5410 return check_ann_expr(c, s->v.AnnAssign.annotation);
5411 }
5412 return 1;
5413}
5414
5415static int
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005416check_ann_subscr(struct compiler *c, expr_ty e)
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005417{
5418 /* We check that everything in a subscript is defined at runtime. */
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005419 switch (e->kind) {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005420 case Slice_kind:
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005421 if (e->v.Slice.lower && !check_ann_expr(c, e->v.Slice.lower)) {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005422 return 0;
5423 }
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005424 if (e->v.Slice.upper && !check_ann_expr(c, e->v.Slice.upper)) {
5425 return 0;
5426 }
5427 if (e->v.Slice.step && !check_ann_expr(c, e->v.Slice.step)) {
5428 return 0;
5429 }
5430 return 1;
5431 case Tuple_kind: {
5432 /* extended slice */
Pablo Galindoa5634c42020-09-16 19:42:00 +01005433 asdl_expr_seq *elts = e->v.Tuple.elts;
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005434 Py_ssize_t i, n = asdl_seq_LEN(elts);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005435 for (i = 0; i < n; i++) {
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005436 if (!check_ann_subscr(c, asdl_seq_GET(elts, i))) {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005437 return 0;
5438 }
5439 }
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005440 return 1;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005441 }
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005442 default:
5443 return check_ann_expr(c, e);
5444 }
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005445}
5446
5447static int
5448compiler_annassign(struct compiler *c, stmt_ty s)
5449{
5450 expr_ty targ = s->v.AnnAssign.target;
Guido van Rossum015d8742016-09-11 09:45:24 -07005451 PyObject* mangled;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005452
5453 assert(s->kind == AnnAssign_kind);
5454
5455 /* We perform the actual assignment first. */
5456 if (s->v.AnnAssign.value) {
5457 VISIT(c, expr, s->v.AnnAssign.value);
5458 VISIT(c, expr, targ);
5459 }
5460 switch (targ->kind) {
5461 case Name_kind:
Pablo Galindoc5fc1562020-04-22 23:29:27 +01005462 if (forbidden_name(c, targ->v.Name.id, Store))
5463 return 0;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005464 /* If we have a simple name in a module or class, store annotation. */
5465 if (s->v.AnnAssign.simple &&
5466 (c->u->u_scope_type == COMPILER_SCOPE_MODULE ||
5467 c->u->u_scope_type == COMPILER_SCOPE_CLASS)) {
Pablo Galindob0544ba2021-04-21 12:41:19 +01005468 if (c->c_future->ff_features & CO_FUTURE_ANNOTATIONS) {
5469 VISIT(c, annexpr, s->v.AnnAssign.annotation)
5470 }
5471 else {
5472 VISIT(c, expr, s->v.AnnAssign.annotation);
5473 }
Mark Shannon332cd5e2018-01-30 00:41:04 +00005474 ADDOP_NAME(c, LOAD_NAME, __annotations__, names);
Serhiy Storchakaa95d9862018-03-24 22:42:35 +02005475 mangled = _Py_Mangle(c->u->u_private, targ->v.Name.id);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005476 ADDOP_LOAD_CONST_NEW(c, mangled);
Mark Shannon332cd5e2018-01-30 00:41:04 +00005477 ADDOP(c, STORE_SUBSCR);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005478 }
5479 break;
5480 case Attribute_kind:
Pablo Galindoc5fc1562020-04-22 23:29:27 +01005481 if (forbidden_name(c, targ->v.Attribute.attr, Store))
5482 return 0;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005483 if (!s->v.AnnAssign.value &&
5484 !check_ann_expr(c, targ->v.Attribute.value)) {
5485 return 0;
5486 }
5487 break;
5488 case Subscript_kind:
5489 if (!s->v.AnnAssign.value &&
5490 (!check_ann_expr(c, targ->v.Subscript.value) ||
5491 !check_ann_subscr(c, targ->v.Subscript.slice))) {
5492 return 0;
5493 }
5494 break;
5495 default:
5496 PyErr_Format(PyExc_SystemError,
5497 "invalid node type (%d) for annotated assignment",
5498 targ->kind);
5499 return 0;
5500 }
5501 /* Annotation is evaluated last. */
5502 if (!s->v.AnnAssign.simple && !check_annotation(c, s)) {
5503 return 0;
5504 }
5505 return 1;
5506}
5507
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005508/* Raises a SyntaxError and returns 0.
5509 If something goes wrong, a different exception may be raised.
5510*/
5511
5512static int
Brandt Bucher145bf262021-02-26 14:51:55 -08005513compiler_error(struct compiler *c, const char *format, ...)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005514{
Brandt Bucher145bf262021-02-26 14:51:55 -08005515 va_list vargs;
5516#ifdef HAVE_STDARG_PROTOTYPES
5517 va_start(vargs, format);
5518#else
5519 va_start(vargs);
5520#endif
5521 PyObject *msg = PyUnicode_FromFormatV(format, vargs);
5522 va_end(vargs);
5523 if (msg == NULL) {
5524 return 0;
5525 }
5526 PyObject *loc = PyErr_ProgramTextObject(c->c_filename, c->u->u_lineno);
5527 if (loc == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005528 Py_INCREF(Py_None);
5529 loc = Py_None;
5530 }
Pablo Galindoa77aac42021-04-23 14:27:05 +01005531 PyObject *args = Py_BuildValue("O(OiiOii)", msg, c->c_filename,
5532 c->u->u_lineno, c->u->u_col_offset + 1, loc,
5533 c->u->u_end_lineno, c->u->u_end_col_offset + 1);
Brandt Bucher145bf262021-02-26 14:51:55 -08005534 Py_DECREF(msg);
5535 if (args == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005536 goto exit;
Brandt Bucher145bf262021-02-26 14:51:55 -08005537 }
5538 PyErr_SetObject(PyExc_SyntaxError, args);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005539 exit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005540 Py_DECREF(loc);
Brandt Bucher145bf262021-02-26 14:51:55 -08005541 Py_XDECREF(args);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005542 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005543}
5544
Serhiy Storchakad31e7732018-10-21 10:09:39 +03005545/* Emits a SyntaxWarning and returns 1 on success.
5546 If a SyntaxWarning raised as error, replaces it with a SyntaxError
5547 and returns 0.
5548*/
5549static int
Serhiy Storchaka62e44812019-02-16 08:12:19 +02005550compiler_warn(struct compiler *c, const char *format, ...)
Serhiy Storchakad31e7732018-10-21 10:09:39 +03005551{
Serhiy Storchaka62e44812019-02-16 08:12:19 +02005552 va_list vargs;
5553#ifdef HAVE_STDARG_PROTOTYPES
5554 va_start(vargs, format);
5555#else
5556 va_start(vargs);
5557#endif
5558 PyObject *msg = PyUnicode_FromFormatV(format, vargs);
5559 va_end(vargs);
Serhiy Storchakad31e7732018-10-21 10:09:39 +03005560 if (msg == NULL) {
5561 return 0;
5562 }
5563 if (PyErr_WarnExplicitObject(PyExc_SyntaxWarning, msg, c->c_filename,
5564 c->u->u_lineno, NULL, NULL) < 0)
5565 {
Serhiy Storchakad31e7732018-10-21 10:09:39 +03005566 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
Serhiy Storchaka62e44812019-02-16 08:12:19 +02005567 /* Replace the SyntaxWarning exception with a SyntaxError
5568 to get a more accurate error report */
Serhiy Storchakad31e7732018-10-21 10:09:39 +03005569 PyErr_Clear();
Serhiy Storchaka62e44812019-02-16 08:12:19 +02005570 assert(PyUnicode_AsUTF8(msg) != NULL);
5571 compiler_error(c, PyUnicode_AsUTF8(msg));
Serhiy Storchakad31e7732018-10-21 10:09:39 +03005572 }
Serhiy Storchaka62e44812019-02-16 08:12:19 +02005573 Py_DECREF(msg);
Serhiy Storchakad31e7732018-10-21 10:09:39 +03005574 return 0;
5575 }
5576 Py_DECREF(msg);
5577 return 1;
5578}
5579
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005580static int
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005581compiler_subscript(struct compiler *c, expr_ty e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005582{
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005583 expr_context_ty ctx = e->v.Subscript.ctx;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005584 int op = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005585
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005586 if (ctx == Load) {
5587 if (!check_subscripter(c, e->v.Subscript.value)) {
5588 return 0;
5589 }
5590 if (!check_index(c, e->v.Subscript.value, e->v.Subscript.slice)) {
5591 return 0;
5592 }
5593 }
5594
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005595 switch (ctx) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005596 case Load: op = BINARY_SUBSCR; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005597 case Store: op = STORE_SUBSCR; break;
5598 case Del: op = DELETE_SUBSCR; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005599 }
Serhiy Storchaka6b975982020-03-17 23:41:08 +02005600 assert(op);
5601 VISIT(c, expr, e->v.Subscript.value);
5602 VISIT(c, expr, e->v.Subscript.slice);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005603 ADDOP(c, op);
5604 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005605}
5606
5607static int
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005608compiler_slice(struct compiler *c, expr_ty s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005609{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005610 int n = 2;
5611 assert(s->kind == Slice_kind);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005612
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005613 /* only handles the cases where BUILD_SLICE is emitted */
5614 if (s->v.Slice.lower) {
5615 VISIT(c, expr, s->v.Slice.lower);
5616 }
5617 else {
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005618 ADDOP_LOAD_CONST(c, Py_None);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005619 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005620
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005621 if (s->v.Slice.upper) {
5622 VISIT(c, expr, s->v.Slice.upper);
5623 }
5624 else {
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005625 ADDOP_LOAD_CONST(c, Py_None);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005626 }
5627
5628 if (s->v.Slice.step) {
5629 n++;
5630 VISIT(c, expr, s->v.Slice.step);
5631 }
5632 ADDOP_I(c, BUILD_SLICE, n);
5633 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005634}
5635
Brandt Bucher145bf262021-02-26 14:51:55 -08005636
5637// PEP 634: Structural Pattern Matching
5638
Brandt Bucher0ad1e032021-05-02 13:02:10 -07005639// To keep things simple, all compiler_pattern_* and pattern_helper_* routines
5640// follow the convention of consuming TOS (the subject for the given pattern)
5641// and calling jump_to_fail_pop on failure (no match).
5642
5643// When calling into these routines, it's important that pc->on_top be kept
5644// updated to reflect the current number of items that we are using on the top
5645// of the stack: they will be popped on failure, and any name captures will be
5646// stored *underneath* them on success. This lets us defer all names stores
5647// until the *entire* pattern matches.
Brandt Bucher145bf262021-02-26 14:51:55 -08005648
Brandt Bucher145bf262021-02-26 14:51:55 -08005649#define WILDCARD_CHECK(N) \
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005650 ((N)->kind == MatchAs_kind && !(N)->v.MatchAs.name)
Brandt Bucher145bf262021-02-26 14:51:55 -08005651
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005652#define WILDCARD_STAR_CHECK(N) \
5653 ((N)->kind == MatchStar_kind && !(N)->v.MatchStar.name)
5654
5655// Limit permitted subexpressions, even if the parser & AST validator let them through
5656#define MATCH_VALUE_EXPR(N) \
5657 ((N)->kind == Constant_kind || (N)->kind == Attribute_kind)
Brandt Bucher145bf262021-02-26 14:51:55 -08005658
Brandt Bucher0ad1e032021-05-02 13:02:10 -07005659// Allocate or resize pc->fail_pop to allow for n items to be popped on failure.
5660static int
5661ensure_fail_pop(struct compiler *c, pattern_context *pc, Py_ssize_t n)
5662{
5663 Py_ssize_t size = n + 1;
5664 if (size <= pc->fail_pop_size) {
5665 return 1;
5666 }
5667 Py_ssize_t needed = sizeof(basicblock*) * size;
5668 basicblock **resized = PyObject_Realloc(pc->fail_pop, needed);
5669 if (resized == NULL) {
5670 PyErr_NoMemory();
5671 return 0;
5672 }
5673 pc->fail_pop = resized;
5674 while (pc->fail_pop_size < size) {
5675 basicblock *new_block;
5676 RETURN_IF_FALSE(new_block = compiler_new_block(c));
5677 pc->fail_pop[pc->fail_pop_size++] = new_block;
5678 }
5679 return 1;
5680}
5681
5682// Use op to jump to the correct fail_pop block.
5683static int
5684jump_to_fail_pop(struct compiler *c, pattern_context *pc, int op)
5685{
5686 // Pop any items on the top of the stack, plus any objects we were going to
5687 // capture on success:
5688 Py_ssize_t pops = pc->on_top + PyList_GET_SIZE(pc->stores);
5689 RETURN_IF_FALSE(ensure_fail_pop(c, pc, pops));
5690 ADDOP_JUMP(c, op, pc->fail_pop[pops]);
5691 NEXT_BLOCK(c);
5692 return 1;
5693}
5694
5695// Build all of the fail_pop blocks and reset fail_pop.
5696static int
5697emit_and_reset_fail_pop(struct compiler *c, pattern_context *pc)
5698{
5699 if (!pc->fail_pop_size) {
5700 assert(pc->fail_pop == NULL);
5701 NEXT_BLOCK(c);
5702 return 1;
5703 }
5704 while (--pc->fail_pop_size) {
5705 compiler_use_next_block(c, pc->fail_pop[pc->fail_pop_size]);
5706 if (!compiler_addop(c, POP_TOP)) {
5707 pc->fail_pop_size = 0;
5708 PyObject_Free(pc->fail_pop);
5709 pc->fail_pop = NULL;
5710 return 0;
5711 }
5712 }
5713 compiler_use_next_block(c, pc->fail_pop[0]);
5714 PyObject_Free(pc->fail_pop);
5715 pc->fail_pop = NULL;
5716 return 1;
5717}
5718
5719static int
5720compiler_error_duplicate_store(struct compiler *c, identifier n)
5721{
5722 return compiler_error(c, "multiple assignments to name %R in pattern", n);
5723}
5724
Brandt Bucher145bf262021-02-26 14:51:55 -08005725static int
5726pattern_helper_store_name(struct compiler *c, identifier n, pattern_context *pc)
5727{
Brandt Bucherdbe60ee2021-04-29 17:19:28 -07005728 if (n == NULL) {
5729 ADDOP(c, POP_TOP);
5730 return 1;
5731 }
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005732 if (forbidden_name(c, n, Store)) {
5733 return 0;
5734 }
Brandt Bucher145bf262021-02-26 14:51:55 -08005735 // Can't assign to the same name twice:
Brandt Bucher0ad1e032021-05-02 13:02:10 -07005736 int duplicate = PySequence_Contains(pc->stores, n);
5737 if (duplicate < 0) {
5738 return 0;
Brandt Bucher145bf262021-02-26 14:51:55 -08005739 }
Brandt Bucher0ad1e032021-05-02 13:02:10 -07005740 if (duplicate) {
5741 return compiler_error_duplicate_store(c, n);
Brandt Bucher145bf262021-02-26 14:51:55 -08005742 }
Brandt Bucher0ad1e032021-05-02 13:02:10 -07005743 // Rotate this object underneath any items we need to preserve:
5744 ADDOP_I(c, ROT_N, pc->on_top + PyList_GET_SIZE(pc->stores) + 1);
5745 return !PyList_Append(pc->stores, n);
Brandt Bucher145bf262021-02-26 14:51:55 -08005746}
5747
5748
5749static int
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005750pattern_unpack_helper(struct compiler *c, asdl_pattern_seq *elts)
5751{
5752 Py_ssize_t n = asdl_seq_LEN(elts);
5753 int seen_star = 0;
5754 for (Py_ssize_t i = 0; i < n; i++) {
5755 pattern_ty elt = asdl_seq_GET(elts, i);
5756 if (elt->kind == MatchStar_kind && !seen_star) {
5757 if ((i >= (1 << 8)) ||
5758 (n-i-1 >= (INT_MAX >> 8)))
5759 return compiler_error(c,
5760 "too many expressions in "
5761 "star-unpacking sequence pattern");
5762 ADDOP_I(c, UNPACK_EX, (i + ((n-i-1) << 8)));
5763 seen_star = 1;
5764 }
5765 else if (elt->kind == MatchStar_kind) {
5766 return compiler_error(c,
5767 "multiple starred expressions in sequence pattern");
5768 }
5769 }
5770 if (!seen_star) {
5771 ADDOP_I(c, UNPACK_SEQUENCE, n);
5772 }
5773 return 1;
5774}
5775
5776static int
5777pattern_helper_sequence_unpack(struct compiler *c, asdl_pattern_seq *patterns,
Brandt Bucher145bf262021-02-26 14:51:55 -08005778 Py_ssize_t star, pattern_context *pc)
5779{
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005780 RETURN_IF_FALSE(pattern_unpack_helper(c, patterns));
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005781 Py_ssize_t size = asdl_seq_LEN(patterns);
Brandt Bucher0ad1e032021-05-02 13:02:10 -07005782 // We've now got a bunch of new subjects on the stack. They need to remain
5783 // there after each subpattern match:
5784 pc->on_top += size;
Brandt Bucher145bf262021-02-26 14:51:55 -08005785 for (Py_ssize_t i = 0; i < size; i++) {
Brandt Bucher0ad1e032021-05-02 13:02:10 -07005786 // One less item to keep track of each time we loop through:
5787 pc->on_top--;
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005788 pattern_ty pattern = asdl_seq_GET(patterns, i);
Brandt Bucher0ad1e032021-05-02 13:02:10 -07005789 RETURN_IF_FALSE(compiler_pattern_subpattern(c, pattern, pc));
Brandt Bucher145bf262021-02-26 14:51:55 -08005790 }
Brandt Bucher145bf262021-02-26 14:51:55 -08005791 return 1;
Brandt Bucher145bf262021-02-26 14:51:55 -08005792}
5793
5794// Like pattern_helper_sequence_unpack, but uses BINARY_SUBSCR instead of
5795// UNPACK_SEQUENCE / UNPACK_EX. This is more efficient for patterns with a
5796// starred wildcard like [first, *_] / [first, *_, last] / [*_, last] / etc.
5797static int
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005798pattern_helper_sequence_subscr(struct compiler *c, asdl_pattern_seq *patterns,
Brandt Bucher145bf262021-02-26 14:51:55 -08005799 Py_ssize_t star, pattern_context *pc)
5800{
Brandt Bucher0ad1e032021-05-02 13:02:10 -07005801 // We need to keep the subject around for extracting elements:
5802 pc->on_top++;
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005803 Py_ssize_t size = asdl_seq_LEN(patterns);
Brandt Bucher145bf262021-02-26 14:51:55 -08005804 for (Py_ssize_t i = 0; i < size; i++) {
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005805 pattern_ty pattern = asdl_seq_GET(patterns, i);
5806 if (WILDCARD_CHECK(pattern)) {
Brandt Bucher145bf262021-02-26 14:51:55 -08005807 continue;
5808 }
5809 if (i == star) {
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005810 assert(WILDCARD_STAR_CHECK(pattern));
Brandt Bucher145bf262021-02-26 14:51:55 -08005811 continue;
5812 }
5813 ADDOP(c, DUP_TOP);
5814 if (i < star) {
5815 ADDOP_LOAD_CONST_NEW(c, PyLong_FromSsize_t(i));
5816 }
5817 else {
5818 // The subject may not support negative indexing! Compute a
5819 // nonnegative index:
5820 ADDOP(c, GET_LEN);
5821 ADDOP_LOAD_CONST_NEW(c, PyLong_FromSsize_t(size - i));
5822 ADDOP(c, BINARY_SUBTRACT);
5823 }
5824 ADDOP(c, BINARY_SUBSCR);
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005825 RETURN_IF_FALSE(compiler_pattern_subpattern(c, pattern, pc));
Brandt Bucher145bf262021-02-26 14:51:55 -08005826 }
Brandt Bucher0ad1e032021-05-02 13:02:10 -07005827 // Pop the subject, we're done with it:
5828 pc->on_top--;
Brandt Bucher145bf262021-02-26 14:51:55 -08005829 ADDOP(c, POP_TOP);
Brandt Bucher145bf262021-02-26 14:51:55 -08005830 return 1;
5831}
5832
Brandt Bucher145bf262021-02-26 14:51:55 -08005833// Like compiler_pattern, but turn off checks for irrefutability.
5834static int
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005835compiler_pattern_subpattern(struct compiler *c, pattern_ty p, pattern_context *pc)
Brandt Bucher145bf262021-02-26 14:51:55 -08005836{
5837 int allow_irrefutable = pc->allow_irrefutable;
5838 pc->allow_irrefutable = 1;
5839 RETURN_IF_FALSE(compiler_pattern(c, p, pc));
5840 pc->allow_irrefutable = allow_irrefutable;
5841 return 1;
5842}
5843
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005844static int
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005845compiler_pattern_as(struct compiler *c, pattern_ty p, pattern_context *pc)
5846{
5847 assert(p->kind == MatchAs_kind);
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005848 if (p->v.MatchAs.pattern == NULL) {
Brandt Bucherdbe60ee2021-04-29 17:19:28 -07005849 // An irrefutable match:
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005850 if (!pc->allow_irrefutable) {
Brandt Bucherdbe60ee2021-04-29 17:19:28 -07005851 if (p->v.MatchAs.name) {
5852 const char *e = "name capture %R makes remaining patterns unreachable";
5853 return compiler_error(c, e, p->v.MatchAs.name);
5854 }
5855 const char *e = "wildcard makes remaining patterns unreachable";
5856 return compiler_error(c, e);
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005857 }
Brandt Bucher0ad1e032021-05-02 13:02:10 -07005858 return pattern_helper_store_name(c, p->v.MatchAs.name, pc);
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005859 }
Brandt Bucher145bf262021-02-26 14:51:55 -08005860 // Need to make a copy for (possibly) storing later:
Brandt Bucher0ad1e032021-05-02 13:02:10 -07005861 pc->on_top++;
Brandt Bucher145bf262021-02-26 14:51:55 -08005862 ADDOP(c, DUP_TOP);
5863 RETURN_IF_FALSE(compiler_pattern(c, p->v.MatchAs.pattern, pc));
Brandt Bucher0ad1e032021-05-02 13:02:10 -07005864 // Success! Store it:
5865 pc->on_top--;
Brandt Bucher145bf262021-02-26 14:51:55 -08005866 RETURN_IF_FALSE(pattern_helper_store_name(c, p->v.MatchAs.name, pc));
Brandt Bucher145bf262021-02-26 14:51:55 -08005867 return 1;
5868}
5869
Brandt Bucher145bf262021-02-26 14:51:55 -08005870static int
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005871compiler_pattern_star(struct compiler *c, pattern_ty p, pattern_context *pc)
Brandt Bucher145bf262021-02-26 14:51:55 -08005872{
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005873 assert(p->kind == MatchStar_kind);
Brandt Bucherdbe60ee2021-04-29 17:19:28 -07005874 RETURN_IF_FALSE(pattern_helper_store_name(c, p->v.MatchStar.name, pc));
Brandt Bucherdbe60ee2021-04-29 17:19:28 -07005875 return 1;
Brandt Bucher145bf262021-02-26 14:51:55 -08005876}
5877
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005878static int
5879validate_kwd_attrs(struct compiler *c, asdl_identifier_seq *attrs, asdl_pattern_seq* patterns)
5880{
5881 // Any errors will point to the pattern rather than the arg name as the
5882 // parser is only supplying identifiers rather than Name or keyword nodes
5883 Py_ssize_t nattrs = asdl_seq_LEN(attrs);
5884 for (Py_ssize_t i = 0; i < nattrs; i++) {
5885 identifier attr = ((identifier)asdl_seq_GET(attrs, i));
Miss Islington (bot)13de28f2021-05-07 13:40:09 -07005886 SET_LOC(c, ((pattern_ty) asdl_seq_GET(patterns, i)));
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005887 if (forbidden_name(c, attr, Store)) {
5888 return -1;
5889 }
5890 for (Py_ssize_t j = i + 1; j < nattrs; j++) {
5891 identifier other = ((identifier)asdl_seq_GET(attrs, j));
5892 if (!PyUnicode_Compare(attr, other)) {
Miss Islington (bot)13de28f2021-05-07 13:40:09 -07005893 SET_LOC(c, ((pattern_ty) asdl_seq_GET(patterns, j)));
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005894 compiler_error(c, "attribute name repeated in class pattern: %U", attr);
5895 return -1;
5896 }
5897 }
5898 }
5899 return 0;
5900}
Brandt Bucher145bf262021-02-26 14:51:55 -08005901
5902static int
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005903compiler_pattern_class(struct compiler *c, pattern_ty p, pattern_context *pc)
Brandt Bucher145bf262021-02-26 14:51:55 -08005904{
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005905 assert(p->kind == MatchClass_kind);
5906 asdl_pattern_seq *patterns = p->v.MatchClass.patterns;
5907 asdl_identifier_seq *kwd_attrs = p->v.MatchClass.kwd_attrs;
5908 asdl_pattern_seq *kwd_patterns = p->v.MatchClass.kwd_patterns;
5909 Py_ssize_t nargs = asdl_seq_LEN(patterns);
5910 Py_ssize_t nattrs = asdl_seq_LEN(kwd_attrs);
5911 Py_ssize_t nkwd_patterns = asdl_seq_LEN(kwd_patterns);
5912 if (nattrs != nkwd_patterns) {
5913 // AST validator shouldn't let this happen, but if it does,
5914 // just fail, don't crash out of the interpreter
5915 const char * e = "kwd_attrs (%d) / kwd_patterns (%d) length mismatch in class pattern";
5916 return compiler_error(c, e, nattrs, nkwd_patterns);
Brandt Bucher145bf262021-02-26 14:51:55 -08005917 }
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005918 if (INT_MAX < nargs || INT_MAX < nargs + nattrs - 1) {
5919 const char *e = "too many sub-patterns in class pattern %R";
5920 return compiler_error(c, e, p->v.MatchClass.cls);
5921 }
5922 if (nattrs) {
5923 RETURN_IF_FALSE(!validate_kwd_attrs(c, kwd_attrs, kwd_patterns));
Miss Islington (bot)13de28f2021-05-07 13:40:09 -07005924 SET_LOC(c, p);
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005925 }
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005926 VISIT(c, expr, p->v.MatchClass.cls);
5927 PyObject *attr_names;
5928 RETURN_IF_FALSE(attr_names = PyTuple_New(nattrs));
Brandt Bucher145bf262021-02-26 14:51:55 -08005929 Py_ssize_t i;
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005930 for (i = 0; i < nattrs; i++) {
5931 PyObject *name = asdl_seq_GET(kwd_attrs, i);
Brandt Bucher145bf262021-02-26 14:51:55 -08005932 Py_INCREF(name);
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005933 PyTuple_SET_ITEM(attr_names, i, name);
Brandt Bucher145bf262021-02-26 14:51:55 -08005934 }
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005935 ADDOP_LOAD_CONST_NEW(c, attr_names);
Brandt Bucher145bf262021-02-26 14:51:55 -08005936 ADDOP_I(c, MATCH_CLASS, nargs);
Brandt Bucher0ad1e032021-05-02 13:02:10 -07005937 // TOS is now a tuple of (nargs + nattrs) attributes. Preserve it:
5938 pc->on_top++;
5939 RETURN_IF_FALSE(jump_to_fail_pop(c, pc, POP_JUMP_IF_FALSE));
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005940 for (i = 0; i < nargs + nattrs; i++) {
5941 pattern_ty pattern;
Brandt Bucher145bf262021-02-26 14:51:55 -08005942 if (i < nargs) {
5943 // Positional:
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005944 pattern = asdl_seq_GET(patterns, i);
Brandt Bucher145bf262021-02-26 14:51:55 -08005945 }
5946 else {
5947 // Keyword:
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005948 pattern = asdl_seq_GET(kwd_patterns, i - nargs);
Brandt Bucher145bf262021-02-26 14:51:55 -08005949 }
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005950 if (WILDCARD_CHECK(pattern)) {
Brandt Bucher145bf262021-02-26 14:51:55 -08005951 continue;
5952 }
5953 // Get the i-th attribute, and match it against the i-th pattern:
5954 ADDOP(c, DUP_TOP);
5955 ADDOP_LOAD_CONST_NEW(c, PyLong_FromSsize_t(i));
5956 ADDOP(c, BINARY_SUBSCR);
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005957 RETURN_IF_FALSE(compiler_pattern_subpattern(c, pattern, pc));
Brandt Bucher145bf262021-02-26 14:51:55 -08005958 }
5959 // Success! Pop the tuple of attributes:
Brandt Bucher0ad1e032021-05-02 13:02:10 -07005960 pc->on_top--;
Brandt Bucher145bf262021-02-26 14:51:55 -08005961 ADDOP(c, POP_TOP);
Brandt Bucher145bf262021-02-26 14:51:55 -08005962 return 1;
5963}
5964
Brandt Bucher145bf262021-02-26 14:51:55 -08005965static int
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005966compiler_pattern_mapping(struct compiler *c, pattern_ty p, pattern_context *pc)
Brandt Bucher145bf262021-02-26 14:51:55 -08005967{
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005968 assert(p->kind == MatchMapping_kind);
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005969 asdl_expr_seq *keys = p->v.MatchMapping.keys;
5970 asdl_pattern_seq *patterns = p->v.MatchMapping.patterns;
5971 Py_ssize_t size = asdl_seq_LEN(keys);
5972 Py_ssize_t npatterns = asdl_seq_LEN(patterns);
5973 if (size != npatterns) {
5974 // AST validator shouldn't let this happen, but if it does,
5975 // just fail, don't crash out of the interpreter
5976 const char * e = "keys (%d) / patterns (%d) length mismatch in mapping pattern";
5977 return compiler_error(c, e, size, npatterns);
5978 }
5979 // We have a double-star target if "rest" is set
5980 PyObject *star_target = p->v.MatchMapping.rest;
Brandt Bucher0ad1e032021-05-02 13:02:10 -07005981 // We need to keep the subject on top during the mapping and length checks:
5982 pc->on_top++;
Brandt Bucher145bf262021-02-26 14:51:55 -08005983 ADDOP(c, MATCH_MAPPING);
Brandt Bucher0ad1e032021-05-02 13:02:10 -07005984 RETURN_IF_FALSE(jump_to_fail_pop(c, pc, POP_JUMP_IF_FALSE));
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005985 if (!size && !star_target) {
Brandt Bucher0ad1e032021-05-02 13:02:10 -07005986 // If the pattern is just "{}", we're done! Pop the subject:
5987 pc->on_top--;
Brandt Bucher145bf262021-02-26 14:51:55 -08005988 ADDOP(c, POP_TOP);
Brandt Bucher145bf262021-02-26 14:51:55 -08005989 return 1;
5990 }
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005991 if (size) {
Brandt Bucher145bf262021-02-26 14:51:55 -08005992 // If the pattern has any keys in it, perform a length check:
5993 ADDOP(c, GET_LEN);
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005994 ADDOP_LOAD_CONST_NEW(c, PyLong_FromSsize_t(size));
Brandt Bucher145bf262021-02-26 14:51:55 -08005995 ADDOP_COMPARE(c, GtE);
Brandt Bucher0ad1e032021-05-02 13:02:10 -07005996 RETURN_IF_FALSE(jump_to_fail_pop(c, pc, POP_JUMP_IF_FALSE));
Brandt Bucher145bf262021-02-26 14:51:55 -08005997 }
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005998 if (INT_MAX < size - 1) {
Brandt Bucher145bf262021-02-26 14:51:55 -08005999 return compiler_error(c, "too many sub-patterns in mapping pattern");
6000 }
6001 // Collect all of the keys into a tuple for MATCH_KEYS and
6002 // COPY_DICT_WITHOUT_KEYS. They can either be dotted names or literals:
Miss Islington (bot)016af142021-07-14 18:00:35 -07006003
6004 // Maintaining a set of Constant_kind kind keys allows us to raise a
6005 // SyntaxError in the case of duplicates.
6006 PyObject *seen = PySet_New(NULL);
6007 if (seen == NULL) {
6008 return 0;
6009 }
6010
6011 // NOTE: goto error on failure in the loop below to avoid leaking `seen`
Nick Coghlan1e7b8582021-04-29 15:58:44 +10006012 for (Py_ssize_t i = 0; i < size; i++) {
Brandt Bucher145bf262021-02-26 14:51:55 -08006013 expr_ty key = asdl_seq_GET(keys, i);
6014 if (key == NULL) {
Nick Coghlan1e7b8582021-04-29 15:58:44 +10006015 const char *e = "can't use NULL keys in MatchMapping "
6016 "(set 'rest' parameter instead)";
Miss Islington (bot)13de28f2021-05-07 13:40:09 -07006017 SET_LOC(c, ((pattern_ty) asdl_seq_GET(patterns, i)));
Miss Islington (bot)016af142021-07-14 18:00:35 -07006018 compiler_error(c, e);
6019 goto error;
Nick Coghlan1e7b8582021-04-29 15:58:44 +10006020 }
Miss Islington (bot)016af142021-07-14 18:00:35 -07006021
6022 if (key->kind == Constant_kind) {
6023 int in_seen = PySet_Contains(seen, key->v.Constant.value);
6024 if (in_seen < 0) {
6025 goto error;
6026 }
6027 if (in_seen) {
6028 const char *e = "mapping pattern checks duplicate key (%R)";
6029 compiler_error(c, e, key->v.Constant.value);
6030 goto error;
6031 }
6032 if (PySet_Add(seen, key->v.Constant.value)) {
6033 goto error;
6034 }
6035 }
6036
6037 else if (key->kind != Attribute_kind) {
Nick Coghlan1e7b8582021-04-29 15:58:44 +10006038 const char *e = "mapping pattern keys may only match literals and attribute lookups";
Miss Islington (bot)016af142021-07-14 18:00:35 -07006039 compiler_error(c, e);
6040 goto error;
Brandt Bucher145bf262021-02-26 14:51:55 -08006041 }
Miss Islington (bot)016af142021-07-14 18:00:35 -07006042 if (!compiler_visit_expr(c, key)) {
6043 goto error;
6044 }
Brandt Bucher145bf262021-02-26 14:51:55 -08006045 }
Miss Islington (bot)016af142021-07-14 18:00:35 -07006046
6047 // all keys have been checked; there are no duplicates
6048 Py_DECREF(seen);
6049
Nick Coghlan1e7b8582021-04-29 15:58:44 +10006050 ADDOP_I(c, BUILD_TUPLE, size);
Brandt Bucher145bf262021-02-26 14:51:55 -08006051 ADDOP(c, MATCH_KEYS);
Brandt Bucher0ad1e032021-05-02 13:02:10 -07006052 // There's now a tuple of keys and a tuple of values on top of the subject:
6053 pc->on_top += 2;
6054 RETURN_IF_FALSE(jump_to_fail_pop(c, pc, POP_JUMP_IF_FALSE));
6055 // So far so good. Use that tuple of values on the stack to match
Brandt Bucher145bf262021-02-26 14:51:55 -08006056 // sub-patterns against:
Nick Coghlan1e7b8582021-04-29 15:58:44 +10006057 for (Py_ssize_t i = 0; i < size; i++) {
6058 pattern_ty pattern = asdl_seq_GET(patterns, i);
6059 if (WILDCARD_CHECK(pattern)) {
Brandt Bucher145bf262021-02-26 14:51:55 -08006060 continue;
6061 }
6062 ADDOP(c, DUP_TOP);
6063 ADDOP_LOAD_CONST_NEW(c, PyLong_FromSsize_t(i));
6064 ADDOP(c, BINARY_SUBSCR);
Nick Coghlan1e7b8582021-04-29 15:58:44 +10006065 RETURN_IF_FALSE(compiler_pattern_subpattern(c, pattern, pc));
Brandt Bucher145bf262021-02-26 14:51:55 -08006066 }
Brandt Bucher0ad1e032021-05-02 13:02:10 -07006067 // If we get this far, it's a match! We're done with the tuple of values,
6068 // and whatever happens next should consume the tuple of keys underneath it:
6069 pc->on_top -= 2;
Brandt Bucher145bf262021-02-26 14:51:55 -08006070 ADDOP(c, POP_TOP);
Nick Coghlan1e7b8582021-04-29 15:58:44 +10006071 if (star_target) {
6072 // If we have a starred name, bind a dict of remaining items to it:
Brandt Bucher145bf262021-02-26 14:51:55 -08006073 ADDOP(c, COPY_DICT_WITHOUT_KEYS);
Nick Coghlan1e7b8582021-04-29 15:58:44 +10006074 RETURN_IF_FALSE(pattern_helper_store_name(c, star_target, pc));
Brandt Bucher145bf262021-02-26 14:51:55 -08006075 }
6076 else {
6077 // Otherwise, we don't care about this tuple of keys anymore:
6078 ADDOP(c, POP_TOP);
6079 }
6080 // Pop the subject:
Brandt Bucher0ad1e032021-05-02 13:02:10 -07006081 pc->on_top--;
Brandt Bucher145bf262021-02-26 14:51:55 -08006082 ADDOP(c, POP_TOP);
Brandt Bucher145bf262021-02-26 14:51:55 -08006083 return 1;
Miss Islington (bot)016af142021-07-14 18:00:35 -07006084
6085error:
6086 Py_DECREF(seen);
6087 return 0;
Brandt Bucher145bf262021-02-26 14:51:55 -08006088}
6089
Brandt Bucher145bf262021-02-26 14:51:55 -08006090static int
Nick Coghlan1e7b8582021-04-29 15:58:44 +10006091compiler_pattern_or(struct compiler *c, pattern_ty p, pattern_context *pc)
Brandt Bucher145bf262021-02-26 14:51:55 -08006092{
6093 assert(p->kind == MatchOr_kind);
Brandt Bucher0ad1e032021-05-02 13:02:10 -07006094 basicblock *end;
Brandt Bucher145bf262021-02-26 14:51:55 -08006095 RETURN_IF_FALSE(end = compiler_new_block(c));
Brandt Bucher145bf262021-02-26 14:51:55 -08006096 Py_ssize_t size = asdl_seq_LEN(p->v.MatchOr.patterns);
6097 assert(size > 1);
6098 // We're going to be messing with pc. Keep the original info handy:
Brandt Bucher0ad1e032021-05-02 13:02:10 -07006099 pattern_context old_pc = *pc;
6100 Py_INCREF(pc->stores);
6101 // control is the list of names bound by the first alternative. It is used
6102 // for checking different name bindings in alternatives, and for correcting
6103 // the order in which extracted elements are placed on the stack.
6104 PyObject *control = NULL;
6105 // NOTE: We can't use returning macros anymore! goto error on error.
Brandt Bucher145bf262021-02-26 14:51:55 -08006106 for (Py_ssize_t i = 0; i < size; i++) {
Nick Coghlan1e7b8582021-04-29 15:58:44 +10006107 pattern_ty alt = asdl_seq_GET(p->v.MatchOr.patterns, i);
Brandt Bucher145bf262021-02-26 14:51:55 -08006108 SET_LOC(c, alt);
Brandt Bucher0ad1e032021-05-02 13:02:10 -07006109 PyObject *pc_stores = PyList_New(0);
6110 if (pc_stores == NULL) {
6111 goto error;
Brandt Bucher145bf262021-02-26 14:51:55 -08006112 }
Brandt Bucher0ad1e032021-05-02 13:02:10 -07006113 Py_SETREF(pc->stores, pc_stores);
6114 // An irrefutable sub-pattern must be last, if it is allowed at all:
6115 pc->allow_irrefutable = (i == size - 1) && old_pc.allow_irrefutable;
6116 pc->fail_pop = NULL;
6117 pc->fail_pop_size = 0;
6118 pc->on_top = 0;
6119 if (!compiler_addop(c, DUP_TOP) || !compiler_pattern(c, alt, pc)) {
6120 goto error;
6121 }
6122 // Success!
6123 Py_ssize_t nstores = PyList_GET_SIZE(pc->stores);
Brandt Bucher145bf262021-02-26 14:51:55 -08006124 if (!i) {
Brandt Bucher0ad1e032021-05-02 13:02:10 -07006125 // This is the first alternative, so save its stores as a "control"
6126 // for the others (they can't bind a different set of names, and
6127 // might need to be reordered):
6128 assert(control == NULL);
Brandt Bucher145bf262021-02-26 14:51:55 -08006129 control = pc->stores;
Brandt Bucher0ad1e032021-05-02 13:02:10 -07006130 Py_INCREF(control);
Brandt Bucher145bf262021-02-26 14:51:55 -08006131 }
Brandt Bucher0ad1e032021-05-02 13:02:10 -07006132 else if (nstores != PyList_GET_SIZE(control)) {
6133 goto diff;
Brandt Bucher145bf262021-02-26 14:51:55 -08006134 }
Brandt Bucher0ad1e032021-05-02 13:02:10 -07006135 else if (nstores) {
6136 // There were captures. Check to see if we differ from control:
6137 Py_ssize_t icontrol = nstores;
6138 while (icontrol--) {
6139 PyObject *name = PyList_GET_ITEM(control, icontrol);
6140 Py_ssize_t istores = PySequence_Index(pc->stores, name);
6141 if (istores < 0) {
6142 PyErr_Clear();
6143 goto diff;
6144 }
6145 if (icontrol != istores) {
6146 // Reorder the names on the stack to match the order of the
6147 // names in control. There's probably a better way of doing
6148 // this; the current solution is potentially very
6149 // inefficient when each alternative subpattern binds lots
6150 // of names in different orders. It's fine for reasonable
6151 // cases, though.
6152 assert(istores < icontrol);
6153 Py_ssize_t rotations = istores + 1;
6154 // Perfom the same rotation on pc->stores:
6155 PyObject *rotated = PyList_GetSlice(pc->stores, 0,
6156 rotations);
6157 if (rotated == NULL ||
6158 PyList_SetSlice(pc->stores, 0, rotations, NULL) ||
6159 PyList_SetSlice(pc->stores, icontrol - istores,
6160 icontrol - istores, rotated))
6161 {
6162 Py_XDECREF(rotated);
6163 goto error;
6164 }
6165 Py_DECREF(rotated);
6166 // That just did:
6167 // rotated = pc_stores[:rotations]
6168 // del pc_stores[:rotations]
6169 // pc_stores[icontrol-istores:icontrol-istores] = rotated
6170 // Do the same thing to the stack, using several ROT_Ns:
6171 while (rotations--) {
6172 if (!compiler_addop_i(c, ROT_N, icontrol + 1)) {
6173 goto error;
6174 }
6175 }
6176 }
6177 }
6178 }
6179 assert(control);
6180 if (!compiler_addop_j(c, JUMP_FORWARD, end) ||
6181 !compiler_next_block(c) ||
6182 !emit_and_reset_fail_pop(c, pc))
6183 {
6184 goto error;
6185 }
Brandt Bucher145bf262021-02-26 14:51:55 -08006186 }
Brandt Bucher0ad1e032021-05-02 13:02:10 -07006187 Py_DECREF(pc->stores);
6188 *pc = old_pc;
6189 Py_INCREF(pc->stores);
6190 // Need to NULL this for the PyObject_Free call in the error block.
6191 old_pc.fail_pop = NULL;
6192 // No match. Pop the remaining copy of the subject and fail:
6193 if (!compiler_addop(c, POP_TOP) || !jump_to_fail_pop(c, pc, JUMP_FORWARD)) {
6194 goto error;
6195 }
Brandt Bucher145bf262021-02-26 14:51:55 -08006196 compiler_use_next_block(c, end);
Brandt Bucher0ad1e032021-05-02 13:02:10 -07006197 Py_ssize_t nstores = PyList_GET_SIZE(control);
6198 // There's a bunch of stuff on the stack between any where the new stores
6199 // are and where they need to be:
6200 // - The other stores.
6201 // - A copy of the subject.
6202 // - Anything else that may be on top of the stack.
6203 // - Any previous stores we've already stashed away on the stack.
Pablo Galindo39494282021-05-03 16:20:46 +01006204 Py_ssize_t nrots = nstores + 1 + pc->on_top + PyList_GET_SIZE(pc->stores);
Brandt Bucher0ad1e032021-05-02 13:02:10 -07006205 for (Py_ssize_t i = 0; i < nstores; i++) {
6206 // Rotate this capture to its proper place on the stack:
6207 if (!compiler_addop_i(c, ROT_N, nrots)) {
6208 goto error;
6209 }
6210 // Update the list of previous stores with this new name, checking for
6211 // duplicates:
6212 PyObject *name = PyList_GET_ITEM(control, i);
6213 int dupe = PySequence_Contains(pc->stores, name);
6214 if (dupe < 0) {
6215 goto error;
6216 }
6217 if (dupe) {
6218 compiler_error_duplicate_store(c, name);
6219 goto error;
6220 }
6221 if (PyList_Append(pc->stores, name)) {
6222 goto error;
6223 }
6224 }
6225 Py_DECREF(old_pc.stores);
6226 Py_DECREF(control);
6227 // NOTE: Returning macros are safe again.
6228 // Pop the copy of the subject:
6229 ADDOP(c, POP_TOP);
Brandt Bucher145bf262021-02-26 14:51:55 -08006230 return 1;
Brandt Bucher0ad1e032021-05-02 13:02:10 -07006231diff:
6232 compiler_error(c, "alternative patterns bind different names");
6233error:
6234 PyObject_Free(old_pc.fail_pop);
6235 Py_DECREF(old_pc.stores);
Brandt Bucher145bf262021-02-26 14:51:55 -08006236 Py_XDECREF(control);
6237 return 0;
6238}
6239
6240
6241static int
Nick Coghlan1e7b8582021-04-29 15:58:44 +10006242compiler_pattern_sequence(struct compiler *c, pattern_ty p, pattern_context *pc)
Brandt Bucher145bf262021-02-26 14:51:55 -08006243{
Nick Coghlan1e7b8582021-04-29 15:58:44 +10006244 assert(p->kind == MatchSequence_kind);
6245 asdl_pattern_seq *patterns = p->v.MatchSequence.patterns;
6246 Py_ssize_t size = asdl_seq_LEN(patterns);
Brandt Bucher145bf262021-02-26 14:51:55 -08006247 Py_ssize_t star = -1;
6248 int only_wildcard = 1;
6249 int star_wildcard = 0;
6250 // Find a starred name, if it exists. There may be at most one:
6251 for (Py_ssize_t i = 0; i < size; i++) {
Nick Coghlan1e7b8582021-04-29 15:58:44 +10006252 pattern_ty pattern = asdl_seq_GET(patterns, i);
6253 if (pattern->kind == MatchStar_kind) {
Brandt Bucher145bf262021-02-26 14:51:55 -08006254 if (star >= 0) {
6255 const char *e = "multiple starred names in sequence pattern";
6256 return compiler_error(c, e);
6257 }
Nick Coghlan1e7b8582021-04-29 15:58:44 +10006258 star_wildcard = WILDCARD_STAR_CHECK(pattern);
6259 only_wildcard &= star_wildcard;
Brandt Bucher145bf262021-02-26 14:51:55 -08006260 star = i;
Nick Coghlan1e7b8582021-04-29 15:58:44 +10006261 continue;
Brandt Bucher145bf262021-02-26 14:51:55 -08006262 }
Nick Coghlan1e7b8582021-04-29 15:58:44 +10006263 only_wildcard &= WILDCARD_CHECK(pattern);
Brandt Bucher145bf262021-02-26 14:51:55 -08006264 }
Brandt Bucher0ad1e032021-05-02 13:02:10 -07006265 // We need to keep the subject on top during the sequence and length checks:
6266 pc->on_top++;
Brandt Bucher145bf262021-02-26 14:51:55 -08006267 ADDOP(c, MATCH_SEQUENCE);
Brandt Bucher0ad1e032021-05-02 13:02:10 -07006268 RETURN_IF_FALSE(jump_to_fail_pop(c, pc, POP_JUMP_IF_FALSE));
Brandt Bucher145bf262021-02-26 14:51:55 -08006269 if (star < 0) {
6270 // No star: len(subject) == size
6271 ADDOP(c, GET_LEN);
6272 ADDOP_LOAD_CONST_NEW(c, PyLong_FromSsize_t(size));
6273 ADDOP_COMPARE(c, Eq);
Brandt Bucher0ad1e032021-05-02 13:02:10 -07006274 RETURN_IF_FALSE(jump_to_fail_pop(c, pc, POP_JUMP_IF_FALSE));
Brandt Bucher145bf262021-02-26 14:51:55 -08006275 }
6276 else if (size > 1) {
6277 // Star: len(subject) >= size - 1
6278 ADDOP(c, GET_LEN);
6279 ADDOP_LOAD_CONST_NEW(c, PyLong_FromSsize_t(size - 1));
6280 ADDOP_COMPARE(c, GtE);
Brandt Bucher0ad1e032021-05-02 13:02:10 -07006281 RETURN_IF_FALSE(jump_to_fail_pop(c, pc, POP_JUMP_IF_FALSE));
Brandt Bucher145bf262021-02-26 14:51:55 -08006282 }
Brandt Bucher0ad1e032021-05-02 13:02:10 -07006283 // Whatever comes next should consume the subject:
6284 pc->on_top--;
Brandt Bucher145bf262021-02-26 14:51:55 -08006285 if (only_wildcard) {
6286 // Patterns like: [] / [_] / [_, _] / [*_] / [_, *_] / [_, _, *_] / etc.
6287 ADDOP(c, POP_TOP);
Brandt Bucher145bf262021-02-26 14:51:55 -08006288 }
6289 else if (star_wildcard) {
Nick Coghlan1e7b8582021-04-29 15:58:44 +10006290 RETURN_IF_FALSE(pattern_helper_sequence_subscr(c, patterns, star, pc));
Brandt Bucher145bf262021-02-26 14:51:55 -08006291 }
6292 else {
Nick Coghlan1e7b8582021-04-29 15:58:44 +10006293 RETURN_IF_FALSE(pattern_helper_sequence_unpack(c, patterns, star, pc));
Brandt Bucher145bf262021-02-26 14:51:55 -08006294 }
Brandt Bucher145bf262021-02-26 14:51:55 -08006295 return 1;
6296}
6297
Brandt Bucher145bf262021-02-26 14:51:55 -08006298static int
Nick Coghlan1e7b8582021-04-29 15:58:44 +10006299compiler_pattern_value(struct compiler *c, pattern_ty p, pattern_context *pc)
Brandt Bucher145bf262021-02-26 14:51:55 -08006300{
Nick Coghlan1e7b8582021-04-29 15:58:44 +10006301 assert(p->kind == MatchValue_kind);
6302 expr_ty value = p->v.MatchValue.value;
6303 if (!MATCH_VALUE_EXPR(value)) {
6304 const char *e = "patterns may only match literals and attribute lookups";
6305 return compiler_error(c, e);
6306 }
6307 VISIT(c, expr, value);
Brandt Bucher145bf262021-02-26 14:51:55 -08006308 ADDOP_COMPARE(c, Eq);
Brandt Bucher0ad1e032021-05-02 13:02:10 -07006309 RETURN_IF_FALSE(jump_to_fail_pop(c, pc, POP_JUMP_IF_FALSE));
Brandt Bucher145bf262021-02-26 14:51:55 -08006310 return 1;
6311}
6312
Brandt Bucher145bf262021-02-26 14:51:55 -08006313static int
Brandt Bucherdbe60ee2021-04-29 17:19:28 -07006314compiler_pattern_singleton(struct compiler *c, pattern_ty p, pattern_context *pc)
Brandt Bucher145bf262021-02-26 14:51:55 -08006315{
Nick Coghlan1e7b8582021-04-29 15:58:44 +10006316 assert(p->kind == MatchSingleton_kind);
6317 ADDOP_LOAD_CONST(c, p->v.MatchSingleton.value);
6318 ADDOP_COMPARE(c, Is);
Brandt Bucher0ad1e032021-05-02 13:02:10 -07006319 RETURN_IF_FALSE(jump_to_fail_pop(c, pc, POP_JUMP_IF_FALSE));
Brandt Bucher145bf262021-02-26 14:51:55 -08006320 return 1;
6321}
6322
Brandt Bucher145bf262021-02-26 14:51:55 -08006323static int
Nick Coghlan1e7b8582021-04-29 15:58:44 +10006324compiler_pattern(struct compiler *c, pattern_ty p, pattern_context *pc)
Brandt Bucher145bf262021-02-26 14:51:55 -08006325{
6326 SET_LOC(c, p);
6327 switch (p->kind) {
Nick Coghlan1e7b8582021-04-29 15:58:44 +10006328 case MatchValue_kind:
Brandt Bucher145bf262021-02-26 14:51:55 -08006329 return compiler_pattern_value(c, p, pc);
Nick Coghlan1e7b8582021-04-29 15:58:44 +10006330 case MatchSingleton_kind:
Brandt Bucherdbe60ee2021-04-29 17:19:28 -07006331 return compiler_pattern_singleton(c, p, pc);
Nick Coghlan1e7b8582021-04-29 15:58:44 +10006332 case MatchSequence_kind:
Brandt Bucher145bf262021-02-26 14:51:55 -08006333 return compiler_pattern_sequence(c, p, pc);
Nick Coghlan1e7b8582021-04-29 15:58:44 +10006334 case MatchMapping_kind:
6335 return compiler_pattern_mapping(c, p, pc);
6336 case MatchClass_kind:
6337 return compiler_pattern_class(c, p, pc);
6338 case MatchStar_kind:
6339 return compiler_pattern_star(c, p, pc);
Brandt Bucher145bf262021-02-26 14:51:55 -08006340 case MatchAs_kind:
6341 return compiler_pattern_as(c, p, pc);
6342 case MatchOr_kind:
6343 return compiler_pattern_or(c, p, pc);
Brandt Bucher145bf262021-02-26 14:51:55 -08006344 }
Nick Coghlan1e7b8582021-04-29 15:58:44 +10006345 // AST validator shouldn't let this happen, but if it does,
6346 // just fail, don't crash out of the interpreter
6347 const char *e = "invalid match pattern node in AST (kind=%d)";
6348 return compiler_error(c, e, p->kind);
Brandt Bucher145bf262021-02-26 14:51:55 -08006349}
6350
Brandt Bucher145bf262021-02-26 14:51:55 -08006351static int
Brandt Bucher0ad1e032021-05-02 13:02:10 -07006352compiler_match_inner(struct compiler *c, stmt_ty s, pattern_context *pc)
Brandt Bucher145bf262021-02-26 14:51:55 -08006353{
6354 VISIT(c, expr, s->v.Match.subject);
Brandt Bucher0ad1e032021-05-02 13:02:10 -07006355 basicblock *end;
Brandt Bucher145bf262021-02-26 14:51:55 -08006356 RETURN_IF_FALSE(end = compiler_new_block(c));
6357 Py_ssize_t cases = asdl_seq_LEN(s->v.Match.cases);
Nick Coghlan1e7b8582021-04-29 15:58:44 +10006358 assert(cases > 0);
Brandt Bucher145bf262021-02-26 14:51:55 -08006359 match_case_ty m = asdl_seq_GET(s->v.Match.cases, cases - 1);
6360 int has_default = WILDCARD_CHECK(m->pattern) && 1 < cases;
6361 for (Py_ssize_t i = 0; i < cases - has_default; i++) {
6362 m = asdl_seq_GET(s->v.Match.cases, i);
6363 SET_LOC(c, m->pattern);
Brandt Bucher145bf262021-02-26 14:51:55 -08006364 // Only copy the subject if we're *not* on the last case:
6365 if (i != cases - has_default - 1) {
6366 ADDOP(c, DUP_TOP);
6367 }
Brandt Bucher0ad1e032021-05-02 13:02:10 -07006368 RETURN_IF_FALSE(pc->stores = PyList_New(0));
6369 // Irrefutable cases must be either guarded, last, or both:
6370 pc->allow_irrefutable = m->guard != NULL || i == cases - 1;
6371 pc->fail_pop = NULL;
6372 pc->fail_pop_size = 0;
6373 pc->on_top = 0;
6374 // NOTE: Can't use returning macros here (they'll leak pc->stores)!
6375 if (!compiler_pattern(c, m->pattern, pc)) {
6376 Py_DECREF(pc->stores);
6377 return 0;
6378 }
6379 assert(!pc->on_top);
6380 // It's a match! Store all of the captured names (they're on the stack).
6381 Py_ssize_t nstores = PyList_GET_SIZE(pc->stores);
6382 for (Py_ssize_t n = 0; n < nstores; n++) {
6383 PyObject *name = PyList_GET_ITEM(pc->stores, n);
6384 if (!compiler_nameop(c, name, Store)) {
6385 Py_DECREF(pc->stores);
6386 return 0;
6387 }
6388 }
6389 Py_DECREF(pc->stores);
6390 // NOTE: Returning macros are safe again.
Brandt Bucher145bf262021-02-26 14:51:55 -08006391 if (m->guard) {
Brandt Bucher0ad1e032021-05-02 13:02:10 -07006392 RETURN_IF_FALSE(ensure_fail_pop(c, pc, 0));
6393 RETURN_IF_FALSE(compiler_jump_if(c, m->guard, pc->fail_pop[0], 0));
Brandt Bucher145bf262021-02-26 14:51:55 -08006394 }
6395 // Success! Pop the subject off, we're done with it:
6396 if (i != cases - has_default - 1) {
6397 ADDOP(c, POP_TOP);
6398 }
6399 VISIT_SEQ(c, stmt, m->body);
6400 ADDOP_JUMP(c, JUMP_FORWARD, end);
Brandt Bucher0ad1e032021-05-02 13:02:10 -07006401 RETURN_IF_FALSE(emit_and_reset_fail_pop(c, pc));
Brandt Bucher145bf262021-02-26 14:51:55 -08006402 }
6403 if (has_default) {
6404 if (cases == 1) {
6405 // No matches. Done with the subject:
6406 ADDOP(c, POP_TOP);
6407 }
6408 // A trailing "case _" is common, and lets us save a bit of redundant
6409 // pushing and popping in the loop above:
6410 m = asdl_seq_GET(s->v.Match.cases, cases - 1);
6411 SET_LOC(c, m->pattern);
6412 if (m->guard) {
6413 RETURN_IF_FALSE(compiler_jump_if(c, m->guard, end, 0));
6414 }
6415 VISIT_SEQ(c, stmt, m->body);
6416 }
6417 compiler_use_next_block(c, end);
6418 return 1;
6419}
6420
Brandt Bucher0ad1e032021-05-02 13:02:10 -07006421static int
6422compiler_match(struct compiler *c, stmt_ty s)
6423{
6424 pattern_context pc;
6425 pc.fail_pop = NULL;
6426 int result = compiler_match_inner(c, s, &pc);
6427 PyObject_Free(pc.fail_pop);
6428 return result;
6429}
6430
Brandt Bucher145bf262021-02-26 14:51:55 -08006431#undef WILDCARD_CHECK
Nick Coghlan1e7b8582021-04-29 15:58:44 +10006432#undef WILDCARD_STAR_CHECK
Brandt Bucher145bf262021-02-26 14:51:55 -08006433
Thomas Wouters89f507f2006-12-13 04:49:30 +00006434/* End of the compiler section, beginning of the assembler section */
6435
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00006436/* do depth-first search of basic block graph, starting with block.
T. Wouters99b54d62019-09-12 07:05:33 -07006437 post records the block indices in post-order.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00006438
6439 XXX must handle implicit jumps from one block to next
6440*/
6441
Thomas Wouters89f507f2006-12-13 04:49:30 +00006442struct assembler {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006443 PyObject *a_bytecode; /* string containing bytecode */
6444 int a_offset; /* offset into bytecode */
6445 int a_nblocks; /* number of reachable blocks */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006446 PyObject *a_lnotab; /* string containing lnotab */
6447 int a_lnotab_off; /* offset into lnotab */
Mark Shannon877df852020-11-12 09:43:29 +00006448 int a_prevlineno; /* lineno of last emitted line in line table */
6449 int a_lineno; /* lineno of last emitted instruction */
6450 int a_lineno_start; /* bytecode start offset of current lineno */
Mark Shannoncc75ab72020-11-12 19:49:33 +00006451 basicblock *a_entry;
Thomas Wouters89f507f2006-12-13 04:49:30 +00006452};
6453
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02006454Py_LOCAL_INLINE(void)
6455stackdepth_push(basicblock ***sp, basicblock *b, int depth)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00006456{
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02006457 assert(b->b_startdepth < 0 || b->b_startdepth == depth);
Mark Shannonfee55262019-11-21 09:11:43 +00006458 if (b->b_startdepth < depth && b->b_startdepth < 100) {
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02006459 assert(b->b_startdepth < 0);
6460 b->b_startdepth = depth;
6461 *(*sp)++ = b;
Serhiy Storchakad4864c62018-01-09 21:54:52 +02006462 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00006463}
6464
6465/* Find the flow path that needs the largest stack. We assume that
6466 * cycles in the flow graph have no net effect on the stack depth.
6467 */
6468static int
6469stackdepth(struct compiler *c)
6470{
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02006471 basicblock *b, *entryblock = NULL;
6472 basicblock **stack, **sp;
6473 int nblocks = 0, maxdepth = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006474 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006475 b->b_startdepth = INT_MIN;
6476 entryblock = b;
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02006477 nblocks++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006478 }
Mark Shannon67969f52021-04-07 10:52:07 +01006479 assert(entryblock!= NULL);
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02006480 stack = (basicblock **)PyObject_Malloc(sizeof(basicblock *) * nblocks);
6481 if (!stack) {
6482 PyErr_NoMemory();
6483 return -1;
6484 }
6485
6486 sp = stack;
Mark Shannonb37181e2021-04-06 11:48:59 +01006487 if (c->u->u_ste->ste_generator || c->u->u_ste->ste_coroutine) {
6488 stackdepth_push(&sp, entryblock, 1);
6489 } else {
6490 stackdepth_push(&sp, entryblock, 0);
6491 }
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02006492 while (sp != stack) {
6493 b = *--sp;
6494 int depth = b->b_startdepth;
6495 assert(depth >= 0);
6496 basicblock *next = b->b_next;
6497 for (int i = 0; i < b->b_iused; i++) {
6498 struct instr *instr = &b->b_instr[i];
6499 int effect = stack_effect(instr->i_opcode, instr->i_oparg, 0);
6500 if (effect == PY_INVALID_STACK_EFFECT) {
Victor Stinnerba7a99d2021-01-30 01:46:44 +01006501 PyErr_Format(PyExc_SystemError,
6502 "compiler stack_effect(opcode=%d, arg=%i) failed",
6503 instr->i_opcode, instr->i_oparg);
6504 return -1;
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02006505 }
6506 int new_depth = depth + effect;
6507 if (new_depth > maxdepth) {
6508 maxdepth = new_depth;
6509 }
6510 assert(depth >= 0); /* invalid code or bug in stackdepth() */
Mark Shannon582aaf12020-08-04 17:30:11 +01006511 if (is_jump(instr)) {
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02006512 effect = stack_effect(instr->i_opcode, instr->i_oparg, 1);
6513 assert(effect != PY_INVALID_STACK_EFFECT);
6514 int target_depth = depth + effect;
6515 if (target_depth > maxdepth) {
6516 maxdepth = target_depth;
6517 }
6518 assert(target_depth >= 0); /* invalid code or bug in stackdepth() */
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02006519 stackdepth_push(&sp, instr->i_target, target_depth);
6520 }
6521 depth = new_depth;
6522 if (instr->i_opcode == JUMP_ABSOLUTE ||
6523 instr->i_opcode == JUMP_FORWARD ||
6524 instr->i_opcode == RETURN_VALUE ||
Mark Shannonfee55262019-11-21 09:11:43 +00006525 instr->i_opcode == RAISE_VARARGS ||
6526 instr->i_opcode == RERAISE)
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02006527 {
6528 /* remaining code is dead */
6529 next = NULL;
6530 break;
6531 }
6532 }
6533 if (next != NULL) {
Mark Shannon266b4622020-11-17 19:30:14 +00006534 assert(b->b_nofallthrough == 0);
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02006535 stackdepth_push(&sp, next, depth);
6536 }
6537 }
6538 PyObject_Free(stack);
6539 return maxdepth;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00006540}
6541
6542static int
6543assemble_init(struct assembler *a, int nblocks, int firstlineno)
6544{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006545 memset(a, 0, sizeof(struct assembler));
Mark Shannon877df852020-11-12 09:43:29 +00006546 a->a_prevlineno = a->a_lineno = firstlineno;
Mark Shannonfd009e62020-11-13 12:53:53 +00006547 a->a_lnotab = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006548 a->a_bytecode = PyBytes_FromStringAndSize(NULL, DEFAULT_CODE_SIZE);
Mark Shannonfd009e62020-11-13 12:53:53 +00006549 if (a->a_bytecode == NULL) {
6550 goto error;
6551 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006552 a->a_lnotab = PyBytes_FromStringAndSize(NULL, DEFAULT_LNOTAB_SIZE);
Mark Shannonfd009e62020-11-13 12:53:53 +00006553 if (a->a_lnotab == NULL) {
6554 goto error;
6555 }
Benjamin Peterson2f8bfef2016-09-07 09:26:18 -07006556 if ((size_t)nblocks > SIZE_MAX / sizeof(basicblock *)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006557 PyErr_NoMemory();
Mark Shannonfd009e62020-11-13 12:53:53 +00006558 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006559 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006560 return 1;
Mark Shannonfd009e62020-11-13 12:53:53 +00006561error:
6562 Py_XDECREF(a->a_bytecode);
6563 Py_XDECREF(a->a_lnotab);
6564 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00006565}
6566
6567static void
6568assemble_free(struct assembler *a)
6569{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006570 Py_XDECREF(a->a_bytecode);
6571 Py_XDECREF(a->a_lnotab);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00006572}
6573
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00006574static int
6575blocksize(basicblock *b)
6576{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006577 int i;
6578 int size = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00006579
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006580 for (i = 0; i < b->b_iused; i++)
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03006581 size += instrsize(b->b_instr[i].i_oparg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006582 return size;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00006583}
6584
Guido van Rossumf68d8e52001-04-14 17:55:09 +00006585static int
Mark Shannon877df852020-11-12 09:43:29 +00006586assemble_emit_linetable_pair(struct assembler *a, int bdelta, int ldelta)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006587{
Mark Shannon877df852020-11-12 09:43:29 +00006588 Py_ssize_t len = PyBytes_GET_SIZE(a->a_lnotab);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006589 if (a->a_lnotab_off + 2 >= len) {
6590 if (_PyBytes_Resize(&a->a_lnotab, len * 2) < 0)
6591 return 0;
6592 }
Pablo Galindo86e322f2021-01-30 13:54:22 +00006593 unsigned char *lnotab = (unsigned char *) PyBytes_AS_STRING(a->a_lnotab);
6594 lnotab += a->a_lnotab_off;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006595 a->a_lnotab_off += 2;
Mark Shannon877df852020-11-12 09:43:29 +00006596 *lnotab++ = bdelta;
6597 *lnotab++ = ldelta;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006598 return 1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006599}
6600
Mark Shannon877df852020-11-12 09:43:29 +00006601/* Appends a range to the end of the line number table. See
6602 * Objects/lnotab_notes.txt for the description of the line number table. */
6603
6604static int
6605assemble_line_range(struct assembler *a)
6606{
6607 int ldelta, bdelta;
6608 bdelta = (a->a_offset - a->a_lineno_start) * 2;
6609 if (bdelta == 0) {
6610 return 1;
6611 }
6612 if (a->a_lineno < 0) {
6613 ldelta = -128;
6614 }
6615 else {
6616 ldelta = a->a_lineno - a->a_prevlineno;
6617 a->a_prevlineno = a->a_lineno;
6618 while (ldelta > 127) {
6619 if (!assemble_emit_linetable_pair(a, 0, 127)) {
6620 return 0;
6621 }
6622 ldelta -= 127;
6623 }
6624 while (ldelta < -127) {
6625 if (!assemble_emit_linetable_pair(a, 0, -127)) {
6626 return 0;
6627 }
6628 ldelta += 127;
6629 }
6630 }
6631 assert(-128 <= ldelta && ldelta < 128);
6632 while (bdelta > 254) {
6633 if (!assemble_emit_linetable_pair(a, 254, ldelta)) {
6634 return 0;
6635 }
6636 ldelta = a->a_lineno < 0 ? -128 : 0;
6637 bdelta -= 254;
6638 }
6639 if (!assemble_emit_linetable_pair(a, bdelta, ldelta)) {
6640 return 0;
6641 }
6642 a->a_lineno_start = a->a_offset;
6643 return 1;
6644}
6645
6646static int
6647assemble_lnotab(struct assembler *a, struct instr *i)
6648{
6649 if (i->i_lineno == a->a_lineno) {
6650 return 1;
6651 }
6652 if (!assemble_line_range(a)) {
6653 return 0;
6654 }
6655 a->a_lineno = i->i_lineno;
6656 return 1;
6657}
6658
6659
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00006660/* assemble_emit()
6661 Extend the bytecode with a new instruction.
6662 Update lnotab if necessary.
Jeremy Hylton376e63d2003-08-28 14:42:14 +00006663*/
6664
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00006665static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00006666assemble_emit(struct assembler *a, struct instr *i)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00006667{
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03006668 int size, arg = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006669 Py_ssize_t len = PyBytes_GET_SIZE(a->a_bytecode);
Serhiy Storchakaab874002016-09-11 13:48:15 +03006670 _Py_CODEUNIT *code;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00006671
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03006672 arg = i->i_oparg;
6673 size = instrsize(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006674 if (i->i_lineno && !assemble_lnotab(a, i))
6675 return 0;
Serhiy Storchakaab874002016-09-11 13:48:15 +03006676 if (a->a_offset + size >= len / (int)sizeof(_Py_CODEUNIT)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006677 if (len > PY_SSIZE_T_MAX / 2)
6678 return 0;
6679 if (_PyBytes_Resize(&a->a_bytecode, len * 2) < 0)
6680 return 0;
6681 }
Serhiy Storchakaab874002016-09-11 13:48:15 +03006682 code = (_Py_CODEUNIT *)PyBytes_AS_STRING(a->a_bytecode) + a->a_offset;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006683 a->a_offset += size;
Serhiy Storchakaab874002016-09-11 13:48:15 +03006684 write_op_arg(code, i->i_opcode, arg, size);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006685 return 1;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00006686}
6687
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00006688static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00006689assemble_jump_offsets(struct assembler *a, struct compiler *c)
Anthony Baxterc2a5a632004-08-02 06:10:11 +00006690{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006691 basicblock *b;
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03006692 int bsize, totsize, extended_arg_recompile;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006693 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00006694
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006695 /* Compute the size of each block and fixup jump args.
6696 Replace block pointer with position in bytecode. */
6697 do {
6698 totsize = 0;
Mark Shannoncc75ab72020-11-12 19:49:33 +00006699 for (basicblock *b = a->a_entry; b != NULL; b = b->b_next) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006700 bsize = blocksize(b);
6701 b->b_offset = totsize;
6702 totsize += bsize;
6703 }
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03006704 extended_arg_recompile = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006705 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
6706 bsize = b->b_offset;
6707 for (i = 0; i < b->b_iused; i++) {
6708 struct instr *instr = &b->b_instr[i];
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03006709 int isize = instrsize(instr->i_oparg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006710 /* Relative jumps are computed relative to
6711 the instruction pointer after fetching
6712 the jump instruction.
6713 */
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03006714 bsize += isize;
Mark Shannon582aaf12020-08-04 17:30:11 +01006715 if (is_jump(instr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006716 instr->i_oparg = instr->i_target->b_offset;
Mark Shannon582aaf12020-08-04 17:30:11 +01006717 if (is_relative_jump(instr)) {
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03006718 instr->i_oparg -= bsize;
6719 }
6720 if (instrsize(instr->i_oparg) != isize) {
6721 extended_arg_recompile = 1;
6722 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006723 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006724 }
6725 }
Neal Norwitzf1d50682005-10-23 23:00:41 +00006726
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006727 /* XXX: This is an awful hack that could hurt performance, but
6728 on the bright side it should work until we come up
6729 with a better solution.
Neal Norwitzf1d50682005-10-23 23:00:41 +00006730
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006731 The issue is that in the first loop blocksize() is called
6732 which calls instrsize() which requires i_oparg be set
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03006733 appropriately. There is a bootstrap problem because
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006734 i_oparg is calculated in the second loop above.
Neal Norwitzf1d50682005-10-23 23:00:41 +00006735
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006736 So we loop until we stop seeing new EXTENDED_ARGs.
6737 The only EXTENDED_ARGs that could be popping up are
6738 ones in jump instructions. So this should converge
6739 fairly quickly.
6740 */
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03006741 } while (extended_arg_recompile);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00006742}
6743
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006744static PyObject *
Victor Stinnerad9a0662013-11-19 22:23:20 +01006745dict_keys_inorder(PyObject *dict, Py_ssize_t offset)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006746{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006747 PyObject *tuple, *k, *v;
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +02006748 Py_ssize_t i, pos = 0, size = PyDict_GET_SIZE(dict);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006749
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006750 tuple = PyTuple_New(size);
6751 if (tuple == NULL)
6752 return NULL;
6753 while (PyDict_Next(dict, &pos, &k, &v)) {
6754 i = PyLong_AS_LONG(v);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03006755 Py_INCREF(k);
6756 assert((i - offset) < size);
6757 assert((i - offset) >= 0);
6758 PyTuple_SET_ITEM(tuple, i - offset, k);
6759 }
6760 return tuple;
6761}
6762
6763static PyObject *
6764consts_dict_keys_inorder(PyObject *dict)
6765{
6766 PyObject *consts, *k, *v;
6767 Py_ssize_t i, pos = 0, size = PyDict_GET_SIZE(dict);
6768
6769 consts = PyList_New(size); /* PyCode_Optimize() requires a list */
6770 if (consts == NULL)
6771 return NULL;
6772 while (PyDict_Next(dict, &pos, &k, &v)) {
6773 i = PyLong_AS_LONG(v);
Serhiy Storchakab7e1eff2018-04-19 08:28:04 +03006774 /* The keys of the dictionary can be tuples wrapping a contant.
6775 * (see compiler_add_o and _PyCode_ConstantKey). In that case
6776 * the object we want is always second. */
6777 if (PyTuple_CheckExact(k)) {
6778 k = PyTuple_GET_ITEM(k, 1);
6779 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006780 Py_INCREF(k);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03006781 assert(i < size);
6782 assert(i >= 0);
6783 PyList_SET_ITEM(consts, i, k);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006784 }
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03006785 return consts;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006786}
6787
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006788static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00006789compute_code_flags(struct compiler *c)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006790{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006791 PySTEntryObject *ste = c->u->u_ste;
Victor Stinnerad9a0662013-11-19 22:23:20 +01006792 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006793 if (ste->ste_type == FunctionBlock) {
Benjamin Peterson1dfd2472015-04-27 21:44:22 -04006794 flags |= CO_NEWLOCALS | CO_OPTIMIZED;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006795 if (ste->ste_nested)
6796 flags |= CO_NESTED;
Yury Selivanoveb636452016-09-08 22:01:51 -07006797 if (ste->ste_generator && !ste->ste_coroutine)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006798 flags |= CO_GENERATOR;
Yury Selivanoveb636452016-09-08 22:01:51 -07006799 if (!ste->ste_generator && ste->ste_coroutine)
6800 flags |= CO_COROUTINE;
6801 if (ste->ste_generator && ste->ste_coroutine)
6802 flags |= CO_ASYNC_GENERATOR;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006803 if (ste->ste_varargs)
6804 flags |= CO_VARARGS;
6805 if (ste->ste_varkeywords)
6806 flags |= CO_VARKEYWORDS;
6807 }
Thomas Wouters5e9f1fa2006-02-28 20:02:27 +00006808
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006809 /* (Only) inherit compilerflags in PyCF_MASK */
6810 flags |= (c->c_flags->cf_flags & PyCF_MASK);
Thomas Wouters5e9f1fa2006-02-28 20:02:27 +00006811
Pablo Galindo90235812020-03-15 04:29:22 +00006812 if ((IS_TOP_LEVEL_AWAIT(c)) &&
Matthias Bussonnier565b4f12019-05-21 13:12:03 -07006813 ste->ste_coroutine &&
6814 !ste->ste_generator) {
6815 flags |= CO_COROUTINE;
6816 }
6817
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006818 return flags;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006819}
6820
Inada Naokibdb941b2021-02-10 09:20:42 +09006821// Merge *obj* with constant cache.
INADA Naokic2e16072018-11-26 21:23:22 +09006822// Unlike merge_consts_recursive(), this function doesn't work recursively.
6823static int
Inada Naokibdb941b2021-02-10 09:20:42 +09006824merge_const_one(struct compiler *c, PyObject **obj)
INADA Naokic2e16072018-11-26 21:23:22 +09006825{
Inada Naokibdb941b2021-02-10 09:20:42 +09006826 PyObject *key = _PyCode_ConstantKey(*obj);
INADA Naokic2e16072018-11-26 21:23:22 +09006827 if (key == NULL) {
6828 return 0;
6829 }
6830
6831 // t is borrowed reference
6832 PyObject *t = PyDict_SetDefault(c->c_const_cache, key, key);
6833 Py_DECREF(key);
6834 if (t == NULL) {
6835 return 0;
6836 }
Inada Naokibdb941b2021-02-10 09:20:42 +09006837 if (t == key) { // obj is new constant.
INADA Naokic2e16072018-11-26 21:23:22 +09006838 return 1;
6839 }
6840
Inada Naokibdb941b2021-02-10 09:20:42 +09006841 if (PyTuple_CheckExact(t)) {
6842 // t is still borrowed reference
6843 t = PyTuple_GET_ITEM(t, 1);
6844 }
6845
6846 Py_INCREF(t);
6847 Py_DECREF(*obj);
6848 *obj = t;
INADA Naokic2e16072018-11-26 21:23:22 +09006849 return 1;
6850}
6851
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00006852static PyCodeObject *
Mark Shannon6e8128f2020-07-30 10:03:00 +01006853makecode(struct compiler *c, struct assembler *a, PyObject *consts)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006854{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006855 PyCodeObject *co = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006856 PyObject *names = NULL;
6857 PyObject *varnames = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006858 PyObject *name = NULL;
6859 PyObject *freevars = NULL;
6860 PyObject *cellvars = NULL;
Victor Stinnerad9a0662013-11-19 22:23:20 +01006861 Py_ssize_t nlocals;
6862 int nlocals_int;
6863 int flags;
Pablo Galindocd74e662019-06-01 18:08:04 +01006864 int posorkeywordargcount, posonlyargcount, kwonlyargcount, maxdepth;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006865
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006866 names = dict_keys_inorder(c->u->u_names, 0);
6867 varnames = dict_keys_inorder(c->u->u_varnames, 0);
Mark Shannon6e8128f2020-07-30 10:03:00 +01006868 if (!names || !varnames) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006869 goto error;
Mark Shannon6e8128f2020-07-30 10:03:00 +01006870 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006871 cellvars = dict_keys_inorder(c->u->u_cellvars, 0);
6872 if (!cellvars)
6873 goto error;
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03006874 freevars = dict_keys_inorder(c->u->u_freevars, PyTuple_GET_SIZE(cellvars));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006875 if (!freevars)
6876 goto error;
Victor Stinnerad9a0662013-11-19 22:23:20 +01006877
Inada Naokibdb941b2021-02-10 09:20:42 +09006878 if (!merge_const_one(c, &names) ||
6879 !merge_const_one(c, &varnames) ||
6880 !merge_const_one(c, &cellvars) ||
6881 !merge_const_one(c, &freevars))
INADA Naokic2e16072018-11-26 21:23:22 +09006882 {
6883 goto error;
6884 }
6885
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +02006886 nlocals = PyDict_GET_SIZE(c->u->u_varnames);
Victor Stinnerad9a0662013-11-19 22:23:20 +01006887 assert(nlocals < INT_MAX);
6888 nlocals_int = Py_SAFE_DOWNCAST(nlocals, Py_ssize_t, int);
6889
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006890 flags = compute_code_flags(c);
6891 if (flags < 0)
6892 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00006893
Mark Shannon6e8128f2020-07-30 10:03:00 +01006894 consts = PyList_AsTuple(consts); /* PyCode_New requires a tuple */
6895 if (consts == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006896 goto error;
Mark Shannon6e8128f2020-07-30 10:03:00 +01006897 }
Inada Naokibdb941b2021-02-10 09:20:42 +09006898 if (!merge_const_one(c, &consts)) {
Mark Shannon6e8128f2020-07-30 10:03:00 +01006899 Py_DECREF(consts);
INADA Naokic2e16072018-11-26 21:23:22 +09006900 goto error;
6901 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006902
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01006903 posonlyargcount = Py_SAFE_DOWNCAST(c->u->u_posonlyargcount, Py_ssize_t, int);
Pablo Galindocd74e662019-06-01 18:08:04 +01006904 posorkeywordargcount = Py_SAFE_DOWNCAST(c->u->u_argcount, Py_ssize_t, int);
Victor Stinnerf8e32212013-11-19 23:56:34 +01006905 kwonlyargcount = Py_SAFE_DOWNCAST(c->u->u_kwonlyargcount, Py_ssize_t, int);
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02006906 maxdepth = stackdepth(c);
6907 if (maxdepth < 0) {
Mark Shannon6e8128f2020-07-30 10:03:00 +01006908 Py_DECREF(consts);
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02006909 goto error;
6910 }
Mark Shannon11e0b292021-04-15 14:28:56 +01006911 if (maxdepth > MAX_ALLOWED_STACK_USE) {
6912 PyErr_Format(PyExc_SystemError,
6913 "excessive stack use: stack is %d deep",
6914 maxdepth);
6915 Py_DECREF(consts);
6916 goto error;
6917 }
Pablo Galindo4a2edc32019-07-01 11:35:05 +01006918 co = PyCode_NewWithPosOnlyArgs(posonlyargcount+posorkeywordargcount,
Mark Shannon13bc1392020-01-23 09:25:17 +00006919 posonlyargcount, kwonlyargcount, nlocals_int,
Mark Shannon6e8128f2020-07-30 10:03:00 +01006920 maxdepth, flags, a->a_bytecode, consts, names,
Pablo Galindo4a2edc32019-07-01 11:35:05 +01006921 varnames, freevars, cellvars, c->c_filename,
6922 c->u->u_name, c->u->u_firstlineno, a->a_lnotab);
Mark Shannon6e8128f2020-07-30 10:03:00 +01006923 Py_DECREF(consts);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00006924 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006925 Py_XDECREF(names);
6926 Py_XDECREF(varnames);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006927 Py_XDECREF(name);
6928 Py_XDECREF(freevars);
6929 Py_XDECREF(cellvars);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006930 return co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006931}
6932
Thomas Wouters0e3f5912006-08-11 14:57:12 +00006933
6934/* For debugging purposes only */
6935#if 0
6936static void
Mark Shannon37686f72021-07-16 11:49:10 +01006937dump_instr(struct instr *i)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00006938{
Mark Shannon37686f72021-07-16 11:49:10 +01006939 const char *jrel = (is_relative_jump(i)) ? "jrel " : "";
6940 const char *jabs = (is_jump(i) && !is_relative_jump(i))? "jabs " : "";
6941
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006942 char arg[128];
Thomas Wouters0e3f5912006-08-11 14:57:12 +00006943
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006944 *arg = '\0';
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03006945 if (HAS_ARG(i->i_opcode)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006946 sprintf(arg, "arg: %d ", i->i_oparg);
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03006947 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006948 fprintf(stderr, "line: %d, opcode: %d %s%s%s\n",
6949 i->i_lineno, i->i_opcode, arg, jabs, jrel);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00006950}
6951
6952static void
6953dump_basicblock(const basicblock *b)
6954{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006955 const char *b_return = b->b_return ? "return " : "";
Pablo Galindo60eb9f12020-06-28 01:55:47 +01006956 fprintf(stderr, "used: %d, depth: %d, offset: %d %s\n",
6957 b->b_iused, b->b_startdepth, b->b_offset, b_return);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006958 if (b->b_instr) {
6959 int i;
6960 for (i = 0; i < b->b_iused; i++) {
6961 fprintf(stderr, " [%02d] ", i);
6962 dump_instr(b->b_instr + i);
6963 }
6964 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00006965}
6966#endif
6967
Mark Shannon5977a792020-12-02 13:31:40 +00006968
6969static int
6970normalize_basic_block(basicblock *bb);
6971
Mark Shannon6e8128f2020-07-30 10:03:00 +01006972static int
Inada Naoki8a232c72021-04-16 14:01:04 +09006973optimize_cfg(struct compiler *c, struct assembler *a, PyObject *consts);
Mark Shannon6e8128f2020-07-30 10:03:00 +01006974
Mark Shannon5977a792020-12-02 13:31:40 +00006975static int
6976ensure_exits_have_lineno(struct compiler *c);
6977
Mark Shannonb37181e2021-04-06 11:48:59 +01006978static int
Mark Shannon37686f72021-07-16 11:49:10 +01006979extend_block(basicblock *bb);
6980
6981static int
Mark Shannonb37181e2021-04-06 11:48:59 +01006982insert_generator_prefix(struct compiler *c, basicblock *entryblock) {
6983
6984 int flags = compute_code_flags(c);
6985 if (flags < 0) {
6986 return -1;
6987 }
6988 int kind;
6989 if (flags & (CO_GENERATOR | CO_COROUTINE | CO_ASYNC_GENERATOR)) {
6990 if (flags & CO_COROUTINE) {
6991 kind = 1;
6992 }
6993 else if (flags & CO_ASYNC_GENERATOR) {
6994 kind = 2;
6995 }
6996 else {
6997 kind = 0;
6998 }
6999 }
7000 else {
7001 return 0;
7002 }
7003 if (compiler_next_instr(entryblock) < 0) {
7004 return -1;
7005 }
7006 for (int i = entryblock->b_iused-1; i > 0; i--) {
7007 entryblock->b_instr[i] = entryblock->b_instr[i-1];
7008 }
7009 entryblock->b_instr[0].i_opcode = GEN_START;
7010 entryblock->b_instr[0].i_oparg = kind;
7011 entryblock->b_instr[0].i_lineno = -1;
7012 entryblock->b_instr[0].i_target = NULL;
7013 return 0;
7014}
7015
Mark Shannon0acdf252021-05-13 14:11:41 +01007016/* Make sure that all returns have a line number, even if early passes
7017 * have failed to propagate a correct line number.
7018 * The resulting line number may not be correct according to PEP 626,
7019 * but should be "good enough", and no worse than in older versions. */
7020static void
7021guarantee_lineno_for_exits(struct assembler *a, int firstlineno) {
7022 int lineno = firstlineno;
7023 assert(lineno > 0);
7024 for (basicblock *b = a->a_entry; b != NULL; b = b->b_next) {
7025 if (b->b_iused == 0) {
7026 continue;
7027 }
7028 struct instr *last = &b->b_instr[b->b_iused-1];
7029 if (last->i_lineno < 0) {
7030 if (last->i_opcode == RETURN_VALUE)
7031 {
7032 for (int i = 0; i < b->b_iused; i++) {
7033 assert(b->b_instr[i].i_lineno < 0);
7034 b->b_instr[i].i_lineno = lineno;
7035 }
7036 }
7037 }
7038 else {
7039 lineno = last->i_lineno;
7040 }
7041 }
7042}
7043
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00007044static PyCodeObject *
7045assemble(struct compiler *c, int addNone)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00007046{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007047 basicblock *b, *entryblock;
7048 struct assembler a;
Mark Shannoncc75ab72020-11-12 19:49:33 +00007049 int j, nblocks;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007050 PyCodeObject *co = NULL;
Mark Shannon6e8128f2020-07-30 10:03:00 +01007051 PyObject *consts = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00007052
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007053 /* Make sure every block that falls off the end returns None.
7054 XXX NEXT_BLOCK() isn't quite right, because if the last
7055 block ends with a jump or return b_next shouldn't set.
7056 */
7057 if (!c->u->u_curblock->b_return) {
Mark Shannon877df852020-11-12 09:43:29 +00007058 c->u->u_lineno = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007059 if (addNone)
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03007060 ADDOP_LOAD_CONST(c, Py_None);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007061 ADDOP(c, RETURN_VALUE);
7062 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00007063
Mark Shannon5977a792020-12-02 13:31:40 +00007064 for (basicblock *b = c->u->u_blocks; b != NULL; b = b->b_list) {
7065 if (normalize_basic_block(b)) {
Alex Henrie503627f2021-03-02 03:20:25 -07007066 return NULL;
Mark Shannon5977a792020-12-02 13:31:40 +00007067 }
7068 }
7069
Mark Shannon37686f72021-07-16 11:49:10 +01007070 for (basicblock *b = c->u->u_blocks; b != NULL; b = b->b_list) {
7071 if (extend_block(b)) {
7072 return NULL;
7073 }
7074 }
7075
Mark Shannon5977a792020-12-02 13:31:40 +00007076 if (ensure_exits_have_lineno(c)) {
Alex Henrie503627f2021-03-02 03:20:25 -07007077 return NULL;
Mark Shannon5977a792020-12-02 13:31:40 +00007078 }
7079
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007080 nblocks = 0;
7081 entryblock = NULL;
7082 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
7083 nblocks++;
7084 entryblock = b;
7085 }
Mark Shannon67969f52021-04-07 10:52:07 +01007086 assert(entryblock != NULL);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00007087
Mark Shannonb37181e2021-04-06 11:48:59 +01007088 if (insert_generator_prefix(c, entryblock)) {
7089 goto error;
7090 }
7091
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007092 /* Set firstlineno if it wasn't explicitly set. */
7093 if (!c->u->u_firstlineno) {
Mark Shannon67969f52021-04-07 10:52:07 +01007094 if (entryblock->b_instr && entryblock->b_instr->i_lineno)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007095 c->u->u_firstlineno = entryblock->b_instr->i_lineno;
Mark Shannon877df852020-11-12 09:43:29 +00007096 else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007097 c->u->u_firstlineno = 1;
7098 }
Mark Shannon5977a792020-12-02 13:31:40 +00007099
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007100 if (!assemble_init(&a, nblocks, c->u->u_firstlineno))
7101 goto error;
Mark Shannoncc75ab72020-11-12 19:49:33 +00007102 a.a_entry = entryblock;
7103 a.a_nblocks = nblocks;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00007104
Mark Shannon6e8128f2020-07-30 10:03:00 +01007105 consts = consts_dict_keys_inorder(c->u->u_consts);
7106 if (consts == NULL) {
7107 goto error;
7108 }
Mark Shannon37686f72021-07-16 11:49:10 +01007109
Inada Naoki8a232c72021-04-16 14:01:04 +09007110 if (optimize_cfg(c, &a, consts)) {
Mark Shannon6e8128f2020-07-30 10:03:00 +01007111 goto error;
7112 }
Mark Shannon0acdf252021-05-13 14:11:41 +01007113 guarantee_lineno_for_exits(&a, c->u->u_firstlineno);
Mark Shannon6e8128f2020-07-30 10:03:00 +01007114
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007115 /* Can't modify the bytecode after computing jump offsets. */
7116 assemble_jump_offsets(&a, c);
Tim Petersb6c3cea2001-06-26 03:36:28 +00007117
Mark Shannoncc75ab72020-11-12 19:49:33 +00007118 /* Emit code. */
7119 for(b = entryblock; b != NULL; b = b->b_next) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007120 for (j = 0; j < b->b_iused; j++)
7121 if (!assemble_emit(&a, &b->b_instr[j]))
7122 goto error;
7123 }
Mark Shannon877df852020-11-12 09:43:29 +00007124 if (!assemble_line_range(&a)) {
7125 return 0;
7126 }
Tim Petersb6c3cea2001-06-26 03:36:28 +00007127
Inada Naokibdb941b2021-02-10 09:20:42 +09007128 if (_PyBytes_Resize(&a.a_lnotab, a.a_lnotab_off) < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007129 goto error;
Inada Naokibdb941b2021-02-10 09:20:42 +09007130 }
7131 if (!merge_const_one(c, &a.a_lnotab)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007132 goto error;
Inada Naokibdb941b2021-02-10 09:20:42 +09007133 }
7134 if (_PyBytes_Resize(&a.a_bytecode, a.a_offset * sizeof(_Py_CODEUNIT)) < 0) {
7135 goto error;
7136 }
7137 if (!merge_const_one(c, &a.a_bytecode)) {
7138 goto error;
7139 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00007140
Mark Shannon6e8128f2020-07-30 10:03:00 +01007141 co = makecode(c, &a, consts);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00007142 error:
Mark Shannon6e8128f2020-07-30 10:03:00 +01007143 Py_XDECREF(consts);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007144 assemble_free(&a);
7145 return co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00007146}
Georg Brandl8334fd92010-12-04 10:26:46 +00007147
Mark Shannon6e8128f2020-07-30 10:03:00 +01007148/* Replace LOAD_CONST c1, LOAD_CONST c2 ... LOAD_CONST cn, BUILD_TUPLE n
7149 with LOAD_CONST (c1, c2, ... cn).
7150 The consts table must still be in list form so that the
7151 new constant (c1, c2, ... cn) can be appended.
7152 Called with codestr pointing to the first LOAD_CONST.
7153*/
7154static int
Inada Naoki8a232c72021-04-16 14:01:04 +09007155fold_tuple_on_constants(struct compiler *c,
7156 struct instr *inst,
Mark Shannon6e8128f2020-07-30 10:03:00 +01007157 int n, PyObject *consts)
7158{
7159 /* Pre-conditions */
7160 assert(PyList_CheckExact(consts));
7161 assert(inst[n].i_opcode == BUILD_TUPLE);
7162 assert(inst[n].i_oparg == n);
7163
7164 for (int i = 0; i < n; i++) {
7165 if (inst[i].i_opcode != LOAD_CONST) {
7166 return 0;
7167 }
7168 }
7169
7170 /* Buildup new tuple of constants */
7171 PyObject *newconst = PyTuple_New(n);
7172 if (newconst == NULL) {
7173 return -1;
7174 }
7175 for (int i = 0; i < n; i++) {
7176 int arg = inst[i].i_oparg;
7177 PyObject *constant = PyList_GET_ITEM(consts, arg);
7178 Py_INCREF(constant);
7179 PyTuple_SET_ITEM(newconst, i, constant);
7180 }
Inada Naoki8a232c72021-04-16 14:01:04 +09007181 if (merge_const_one(c, &newconst) == 0) {
Mark Shannon6e8128f2020-07-30 10:03:00 +01007182 Py_DECREF(newconst);
Mark Shannon6e8128f2020-07-30 10:03:00 +01007183 return -1;
7184 }
Inada Naoki8a232c72021-04-16 14:01:04 +09007185
7186 Py_ssize_t index;
7187 for (index = 0; index < PyList_GET_SIZE(consts); index++) {
7188 if (PyList_GET_ITEM(consts, index) == newconst) {
7189 break;
7190 }
7191 }
7192 if (index == PyList_GET_SIZE(consts)) {
7193 if ((size_t)index >= (size_t)INT_MAX - 1) {
7194 Py_DECREF(newconst);
7195 PyErr_SetString(PyExc_OverflowError, "too many constants");
7196 return -1;
7197 }
7198 if (PyList_Append(consts, newconst)) {
7199 Py_DECREF(newconst);
7200 return -1;
7201 }
Mark Shannon6e8128f2020-07-30 10:03:00 +01007202 }
7203 Py_DECREF(newconst);
7204 for (int i = 0; i < n; i++) {
7205 inst[i].i_opcode = NOP;
7206 }
7207 inst[n].i_opcode = LOAD_CONST;
Victor Stinner71f2ff42020-09-23 14:06:55 +02007208 inst[n].i_oparg = (int)index;
Mark Shannon6e8128f2020-07-30 10:03:00 +01007209 return 0;
7210}
7211
Mark Shannon28b75c82020-12-23 11:43:10 +00007212
Brandt Bucher0ad1e032021-05-02 13:02:10 -07007213// Eliminate n * ROT_N(n).
7214static void
7215fold_rotations(struct instr *inst, int n)
7216{
7217 for (int i = 0; i < n; i++) {
7218 int rot;
7219 switch (inst[i].i_opcode) {
7220 case ROT_N:
7221 rot = inst[i].i_oparg;
7222 break;
7223 case ROT_FOUR:
7224 rot = 4;
7225 break;
7226 case ROT_THREE:
7227 rot = 3;
7228 break;
7229 case ROT_TWO:
7230 rot = 2;
7231 break;
7232 default:
7233 return;
7234 }
7235 if (rot != n) {
7236 return;
7237 }
7238 }
7239 for (int i = 0; i < n; i++) {
7240 inst[i].i_opcode = NOP;
7241 }
7242}
7243
7244
Mark Shannon28b75c82020-12-23 11:43:10 +00007245static int
7246eliminate_jump_to_jump(basicblock *bb, int opcode) {
7247 assert (bb->b_iused > 0);
7248 struct instr *inst = &bb->b_instr[bb->b_iused-1];
7249 assert (is_jump(inst));
7250 assert (inst->i_target->b_iused > 0);
7251 struct instr *target = &inst->i_target->b_instr[0];
7252 if (inst->i_target == target->i_target) {
7253 /* Nothing to do */
7254 return 0;
7255 }
7256 int lineno = target->i_lineno;
7257 if (add_jump_to_block(bb, opcode, lineno, target->i_target) == 0) {
7258 return -1;
7259 }
7260 assert (bb->b_iused >= 2);
7261 bb->b_instr[bb->b_iused-2].i_opcode = NOP;
7262 return 0;
7263}
7264
Mark Shannoncc75ab72020-11-12 19:49:33 +00007265/* Maximum size of basic block that should be copied in optimizer */
7266#define MAX_COPY_SIZE 4
Mark Shannon6e8128f2020-07-30 10:03:00 +01007267
7268/* Optimization */
7269static int
Inada Naoki8a232c72021-04-16 14:01:04 +09007270optimize_basic_block(struct compiler *c, basicblock *bb, PyObject *consts)
Mark Shannon6e8128f2020-07-30 10:03:00 +01007271{
7272 assert(PyList_CheckExact(consts));
7273 struct instr nop;
7274 nop.i_opcode = NOP;
7275 struct instr *target;
Mark Shannon6e8128f2020-07-30 10:03:00 +01007276 for (int i = 0; i < bb->b_iused; i++) {
7277 struct instr *inst = &bb->b_instr[i];
7278 int oparg = inst->i_oparg;
7279 int nextop = i+1 < bb->b_iused ? bb->b_instr[i+1].i_opcode : 0;
Mark Shannon582aaf12020-08-04 17:30:11 +01007280 if (is_jump(inst)) {
Mark Shannon6e8128f2020-07-30 10:03:00 +01007281 /* Skip over empty basic blocks. */
7282 while (inst->i_target->b_iused == 0) {
7283 inst->i_target = inst->i_target->b_next;
7284 }
7285 target = &inst->i_target->b_instr[0];
7286 }
7287 else {
7288 target = &nop;
7289 }
7290 switch (inst->i_opcode) {
Mark Shannon266b4622020-11-17 19:30:14 +00007291 /* Remove LOAD_CONST const; conditional jump */
Mark Shannon6e8128f2020-07-30 10:03:00 +01007292 case LOAD_CONST:
Mark Shannon266b4622020-11-17 19:30:14 +00007293 {
7294 PyObject* cnt;
7295 int is_true;
7296 int jump_if_true;
7297 switch(nextop) {
7298 case POP_JUMP_IF_FALSE:
7299 case POP_JUMP_IF_TRUE:
7300 cnt = PyList_GET_ITEM(consts, oparg);
7301 is_true = PyObject_IsTrue(cnt);
7302 if (is_true == -1) {
7303 goto error;
7304 }
7305 inst->i_opcode = NOP;
7306 jump_if_true = nextop == POP_JUMP_IF_TRUE;
7307 if (is_true == jump_if_true) {
7308 bb->b_instr[i+1].i_opcode = JUMP_ABSOLUTE;
7309 bb->b_nofallthrough = 1;
7310 }
7311 else {
7312 bb->b_instr[i+1].i_opcode = NOP;
7313 }
7314 break;
7315 case JUMP_IF_FALSE_OR_POP:
7316 case JUMP_IF_TRUE_OR_POP:
7317 cnt = PyList_GET_ITEM(consts, oparg);
7318 is_true = PyObject_IsTrue(cnt);
7319 if (is_true == -1) {
7320 goto error;
7321 }
7322 jump_if_true = nextop == JUMP_IF_TRUE_OR_POP;
7323 if (is_true == jump_if_true) {
7324 bb->b_instr[i+1].i_opcode = JUMP_ABSOLUTE;
7325 bb->b_nofallthrough = 1;
7326 }
7327 else {
7328 inst->i_opcode = NOP;
7329 bb->b_instr[i+1].i_opcode = NOP;
7330 }
7331 break;
Mark Shannon6e8128f2020-07-30 10:03:00 +01007332 }
7333 break;
Mark Shannon266b4622020-11-17 19:30:14 +00007334 }
Mark Shannon6e8128f2020-07-30 10:03:00 +01007335
7336 /* Try to fold tuples of constants.
7337 Skip over BUILD_SEQN 1 UNPACK_SEQN 1.
7338 Replace BUILD_SEQN 2 UNPACK_SEQN 2 with ROT2.
7339 Replace BUILD_SEQN 3 UNPACK_SEQN 3 with ROT3 ROT2. */
7340 case BUILD_TUPLE:
7341 if (nextop == UNPACK_SEQUENCE && oparg == bb->b_instr[i+1].i_oparg) {
7342 switch(oparg) {
7343 case 1:
7344 inst->i_opcode = NOP;
7345 bb->b_instr[i+1].i_opcode = NOP;
7346 break;
7347 case 2:
7348 inst->i_opcode = ROT_TWO;
7349 bb->b_instr[i+1].i_opcode = NOP;
7350 break;
7351 case 3:
7352 inst->i_opcode = ROT_THREE;
7353 bb->b_instr[i+1].i_opcode = ROT_TWO;
7354 }
7355 break;
7356 }
7357 if (i >= oparg) {
Inada Naoki8a232c72021-04-16 14:01:04 +09007358 if (fold_tuple_on_constants(c, inst-oparg, oparg, consts)) {
Mark Shannon6e8128f2020-07-30 10:03:00 +01007359 goto error;
7360 }
7361 }
7362 break;
7363
7364 /* Simplify conditional jump to conditional jump where the
7365 result of the first test implies the success of a similar
7366 test or the failure of the opposite test.
7367 Arises in code like:
7368 "a and b or c"
7369 "(a and b) and c"
7370 "(a or b) or c"
7371 "(a or b) and c"
7372 x:JUMP_IF_FALSE_OR_POP y y:JUMP_IF_FALSE_OR_POP z
7373 --> x:JUMP_IF_FALSE_OR_POP z
7374 x:JUMP_IF_FALSE_OR_POP y y:JUMP_IF_TRUE_OR_POP z
7375 --> x:POP_JUMP_IF_FALSE y+1
7376 where y+1 is the instruction following the second test.
7377 */
7378 case JUMP_IF_FALSE_OR_POP:
7379 switch(target->i_opcode) {
7380 case POP_JUMP_IF_FALSE:
Mark Shannon28b75c82020-12-23 11:43:10 +00007381 if (inst->i_lineno == target->i_lineno) {
7382 *inst = *target;
7383 i--;
7384 }
Mark Shannon6e8128f2020-07-30 10:03:00 +01007385 break;
7386 case JUMP_ABSOLUTE:
7387 case JUMP_FORWARD:
7388 case JUMP_IF_FALSE_OR_POP:
Mark Shannon28b75c82020-12-23 11:43:10 +00007389 if (inst->i_lineno == target->i_lineno &&
7390 inst->i_target != target->i_target) {
Mark Shannon266b4622020-11-17 19:30:14 +00007391 inst->i_target = target->i_target;
Mark Shannon28b75c82020-12-23 11:43:10 +00007392 i--;
Mark Shannon266b4622020-11-17 19:30:14 +00007393 }
Mark Shannon6e8128f2020-07-30 10:03:00 +01007394 break;
7395 case JUMP_IF_TRUE_OR_POP:
7396 assert (inst->i_target->b_iused == 1);
Mark Shannon28b75c82020-12-23 11:43:10 +00007397 if (inst->i_lineno == target->i_lineno) {
7398 inst->i_opcode = POP_JUMP_IF_FALSE;
7399 inst->i_target = inst->i_target->b_next;
7400 --i;
7401 }
Mark Shannon6e8128f2020-07-30 10:03:00 +01007402 break;
7403 }
7404 break;
7405
7406 case JUMP_IF_TRUE_OR_POP:
7407 switch(target->i_opcode) {
7408 case POP_JUMP_IF_TRUE:
Mark Shannon28b75c82020-12-23 11:43:10 +00007409 if (inst->i_lineno == target->i_lineno) {
7410 *inst = *target;
7411 i--;
7412 }
Mark Shannon6e8128f2020-07-30 10:03:00 +01007413 break;
7414 case JUMP_ABSOLUTE:
7415 case JUMP_FORWARD:
7416 case JUMP_IF_TRUE_OR_POP:
Mark Shannon28b75c82020-12-23 11:43:10 +00007417 if (inst->i_lineno == target->i_lineno &&
7418 inst->i_target != target->i_target) {
Mark Shannon266b4622020-11-17 19:30:14 +00007419 inst->i_target = target->i_target;
Mark Shannon28b75c82020-12-23 11:43:10 +00007420 i--;
Mark Shannon266b4622020-11-17 19:30:14 +00007421 }
Mark Shannon6e8128f2020-07-30 10:03:00 +01007422 break;
7423 case JUMP_IF_FALSE_OR_POP:
7424 assert (inst->i_target->b_iused == 1);
Mark Shannon28b75c82020-12-23 11:43:10 +00007425 if (inst->i_lineno == target->i_lineno) {
7426 inst->i_opcode = POP_JUMP_IF_TRUE;
7427 inst->i_target = inst->i_target->b_next;
7428 --i;
7429 }
Mark Shannon6e8128f2020-07-30 10:03:00 +01007430 break;
7431 }
7432 break;
7433
7434 case POP_JUMP_IF_FALSE:
7435 switch(target->i_opcode) {
7436 case JUMP_ABSOLUTE:
7437 case JUMP_FORWARD:
Mark Shannon28b75c82020-12-23 11:43:10 +00007438 if (inst->i_lineno == target->i_lineno) {
Mark Shannon266b4622020-11-17 19:30:14 +00007439 inst->i_target = target->i_target;
Mark Shannon28b75c82020-12-23 11:43:10 +00007440 i--;
Mark Shannon266b4622020-11-17 19:30:14 +00007441 }
Mark Shannon6e8128f2020-07-30 10:03:00 +01007442 break;
7443 }
7444 break;
7445
7446 case POP_JUMP_IF_TRUE:
7447 switch(target->i_opcode) {
7448 case JUMP_ABSOLUTE:
7449 case JUMP_FORWARD:
Mark Shannon28b75c82020-12-23 11:43:10 +00007450 if (inst->i_lineno == target->i_lineno) {
Mark Shannon266b4622020-11-17 19:30:14 +00007451 inst->i_target = target->i_target;
Mark Shannon28b75c82020-12-23 11:43:10 +00007452 i--;
Mark Shannon266b4622020-11-17 19:30:14 +00007453 }
Mark Shannon6e8128f2020-07-30 10:03:00 +01007454 break;
7455 }
7456 break;
7457
7458 case JUMP_ABSOLUTE:
7459 case JUMP_FORWARD:
Mark Shannoncc75ab72020-11-12 19:49:33 +00007460 assert (i == bb->b_iused-1);
Mark Shannon6e8128f2020-07-30 10:03:00 +01007461 switch(target->i_opcode) {
7462 case JUMP_FORWARD:
Mark Shannon28b75c82020-12-23 11:43:10 +00007463 if (eliminate_jump_to_jump(bb, inst->i_opcode)) {
7464 goto error;
Mark Shannon266b4622020-11-17 19:30:14 +00007465 }
Mark Shannon6e8128f2020-07-30 10:03:00 +01007466 break;
Mark Shannon28b75c82020-12-23 11:43:10 +00007467
Mark Shannon6e8128f2020-07-30 10:03:00 +01007468 case JUMP_ABSOLUTE:
Mark Shannon28b75c82020-12-23 11:43:10 +00007469 if (eliminate_jump_to_jump(bb, JUMP_ABSOLUTE)) {
7470 goto error;
Mark Shannon266b4622020-11-17 19:30:14 +00007471 }
Mark Shannon6e8128f2020-07-30 10:03:00 +01007472 break;
Mark Shannon37686f72021-07-16 11:49:10 +01007473 }
7474 break;
7475 case FOR_ITER:
7476 assert (i == bb->b_iused-1);
7477 if (target->i_opcode == JUMP_FORWARD) {
7478 if (eliminate_jump_to_jump(bb, inst->i_opcode)) {
7479 goto error;
7480 }
Mark Shannoncc75ab72020-11-12 19:49:33 +00007481 }
Brandt Bucher0ad1e032021-05-02 13:02:10 -07007482 break;
7483 case ROT_N:
7484 switch (oparg) {
7485 case 0:
7486 case 1:
7487 inst->i_opcode = NOP;
7488 continue;
7489 case 2:
7490 inst->i_opcode = ROT_TWO;
7491 break;
7492 case 3:
7493 inst->i_opcode = ROT_THREE;
7494 break;
7495 case 4:
7496 inst->i_opcode = ROT_FOUR;
7497 break;
7498 }
7499 if (i >= oparg - 1) {
7500 fold_rotations(inst - oparg + 1, oparg);
7501 }
7502 break;
Mark Shannon6e8128f2020-07-30 10:03:00 +01007503 }
7504 }
7505 return 0;
7506error:
7507 return -1;
7508}
7509
Mark Shannon37686f72021-07-16 11:49:10 +01007510/* If this block ends with an unconditional jump to an exit block,
7511 * then remove the jump and extend this block with the target.
7512 */
7513static int
7514extend_block(basicblock *bb) {
7515 if (bb->b_iused == 0) {
7516 return 0;
7517 }
7518 struct instr *last = &bb->b_instr[bb->b_iused-1];
7519 if (last->i_opcode != JUMP_ABSOLUTE && last->i_opcode != JUMP_FORWARD) {
7520 return 0;
7521 }
7522 if (last->i_target->b_exit && last->i_target->b_iused <= MAX_COPY_SIZE) {
7523 basicblock *to_copy = last->i_target;
7524 last->i_opcode = NOP;
7525 for (int i = 0; i < to_copy->b_iused; i++) {
7526 int index = compiler_next_instr(bb);
7527 if (index < 0) {
7528 return -1;
7529 }
7530 bb->b_instr[index] = to_copy->b_instr[i];
7531 }
7532 bb->b_exit = 1;
7533 }
7534 return 0;
7535}
Mark Shannon6e8128f2020-07-30 10:03:00 +01007536
7537static void
Mark Shannon1659ad12021-01-13 15:05:04 +00007538clean_basic_block(basicblock *bb, int prev_lineno) {
7539 /* Remove NOPs when legal to do so. */
Mark Shannon6e8128f2020-07-30 10:03:00 +01007540 int dest = 0;
7541 for (int src = 0; src < bb->b_iused; src++) {
Mark Shannon877df852020-11-12 09:43:29 +00007542 int lineno = bb->b_instr[src].i_lineno;
Mark Shannoncc75ab72020-11-12 19:49:33 +00007543 if (bb->b_instr[src].i_opcode == NOP) {
Mark Shannon266b4622020-11-17 19:30:14 +00007544 /* Eliminate no-op if it doesn't have a line number */
Mark Shannoncc75ab72020-11-12 19:49:33 +00007545 if (lineno < 0) {
7546 continue;
7547 }
Mark Shannon266b4622020-11-17 19:30:14 +00007548 /* or, if the previous instruction had the same line number. */
Mark Shannoncc75ab72020-11-12 19:49:33 +00007549 if (prev_lineno == lineno) {
7550 continue;
7551 }
Mark Shannon266b4622020-11-17 19:30:14 +00007552 /* or, if the next instruction has same line number or no line number */
Mark Shannoncc75ab72020-11-12 19:49:33 +00007553 if (src < bb->b_iused - 1) {
7554 int next_lineno = bb->b_instr[src+1].i_lineno;
7555 if (next_lineno < 0 || next_lineno == lineno) {
7556 bb->b_instr[src+1].i_lineno = lineno;
7557 continue;
Mark Shannon877df852020-11-12 09:43:29 +00007558 }
7559 }
Mark Shannon266b4622020-11-17 19:30:14 +00007560 else {
7561 basicblock* next = bb->b_next;
7562 while (next && next->b_iused == 0) {
7563 next = next->b_next;
7564 }
7565 /* or if last instruction in BB and next BB has same line number */
7566 if (next) {
7567 if (lineno == next->b_instr[0].i_lineno) {
7568 continue;
7569 }
7570 }
7571 }
7572
Mark Shannon6e8128f2020-07-30 10:03:00 +01007573 }
Mark Shannoncc75ab72020-11-12 19:49:33 +00007574 if (dest != src) {
7575 bb->b_instr[dest] = bb->b_instr[src];
7576 }
7577 dest++;
7578 prev_lineno = lineno;
Mark Shannon6e8128f2020-07-30 10:03:00 +01007579 }
Mark Shannon6e8128f2020-07-30 10:03:00 +01007580 assert(dest <= bb->b_iused);
7581 bb->b_iused = dest;
7582}
7583
Mark Shannon266b4622020-11-17 19:30:14 +00007584static int
7585normalize_basic_block(basicblock *bb) {
7586 /* Mark blocks as exit and/or nofallthrough.
7587 Raise SystemError if CFG is malformed. */
Mark Shannoncc75ab72020-11-12 19:49:33 +00007588 for (int i = 0; i < bb->b_iused; i++) {
7589 switch(bb->b_instr[i].i_opcode) {
7590 case RETURN_VALUE:
7591 case RAISE_VARARGS:
7592 case RERAISE:
Mark Shannoncc75ab72020-11-12 19:49:33 +00007593 bb->b_exit = 1;
Mark Shannon5977a792020-12-02 13:31:40 +00007594 bb->b_nofallthrough = 1;
7595 break;
Mark Shannoncc75ab72020-11-12 19:49:33 +00007596 case JUMP_ABSOLUTE:
7597 case JUMP_FORWARD:
Mark Shannoncc75ab72020-11-12 19:49:33 +00007598 bb->b_nofallthrough = 1;
Mark Shannon266b4622020-11-17 19:30:14 +00007599 /* fall through */
7600 case POP_JUMP_IF_FALSE:
7601 case POP_JUMP_IF_TRUE:
7602 case JUMP_IF_FALSE_OR_POP:
7603 case JUMP_IF_TRUE_OR_POP:
Mark Shannon5977a792020-12-02 13:31:40 +00007604 case FOR_ITER:
Mark Shannon266b4622020-11-17 19:30:14 +00007605 if (i != bb->b_iused-1) {
7606 PyErr_SetString(PyExc_SystemError, "malformed control flow graph.");
7607 return -1;
7608 }
Mark Shannon5977a792020-12-02 13:31:40 +00007609 /* Skip over empty basic blocks. */
7610 while (bb->b_instr[i].i_target->b_iused == 0) {
7611 bb->b_instr[i].i_target = bb->b_instr[i].i_target->b_next;
7612 }
7613
Mark Shannoncc75ab72020-11-12 19:49:33 +00007614 }
7615 }
Mark Shannon266b4622020-11-17 19:30:14 +00007616 return 0;
Mark Shannoncc75ab72020-11-12 19:49:33 +00007617}
7618
Mark Shannon6e8128f2020-07-30 10:03:00 +01007619static int
7620mark_reachable(struct assembler *a) {
7621 basicblock **stack, **sp;
7622 sp = stack = (basicblock **)PyObject_Malloc(sizeof(basicblock *) * a->a_nblocks);
7623 if (stack == NULL) {
7624 return -1;
7625 }
Mark Shannon3bd60352021-01-13 12:05:43 +00007626 a->a_entry->b_predecessors = 1;
Mark Shannoncc75ab72020-11-12 19:49:33 +00007627 *sp++ = a->a_entry;
Mark Shannon6e8128f2020-07-30 10:03:00 +01007628 while (sp > stack) {
7629 basicblock *b = *(--sp);
Mark Shannon3bd60352021-01-13 12:05:43 +00007630 if (b->b_next && !b->b_nofallthrough) {
7631 if (b->b_next->b_predecessors == 0) {
7632 *sp++ = b->b_next;
7633 }
7634 b->b_next->b_predecessors++;
Mark Shannon6e8128f2020-07-30 10:03:00 +01007635 }
7636 for (int i = 0; i < b->b_iused; i++) {
7637 basicblock *target;
Mark Shannon582aaf12020-08-04 17:30:11 +01007638 if (is_jump(&b->b_instr[i])) {
Mark Shannon6e8128f2020-07-30 10:03:00 +01007639 target = b->b_instr[i].i_target;
Mark Shannon3bd60352021-01-13 12:05:43 +00007640 if (target->b_predecessors == 0) {
Mark Shannon6e8128f2020-07-30 10:03:00 +01007641 *sp++ = target;
7642 }
Mark Shannon3bd60352021-01-13 12:05:43 +00007643 target->b_predecessors++;
Mark Shannon6e8128f2020-07-30 10:03:00 +01007644 }
7645 }
7646 }
7647 PyObject_Free(stack);
7648 return 0;
7649}
7650
Mark Shannon3bd60352021-01-13 12:05:43 +00007651static void
7652eliminate_empty_basic_blocks(basicblock *entry) {
7653 /* Eliminate empty blocks */
7654 for (basicblock *b = entry; b != NULL; b = b->b_next) {
7655 basicblock *next = b->b_next;
7656 if (next) {
7657 while (next->b_iused == 0 && next->b_next) {
7658 next = next->b_next;
7659 }
7660 b->b_next = next;
7661 }
7662 }
7663 for (basicblock *b = entry; b != NULL; b = b->b_next) {
7664 if (b->b_iused == 0) {
7665 continue;
7666 }
7667 if (is_jump(&b->b_instr[b->b_iused-1])) {
7668 basicblock *target = b->b_instr[b->b_iused-1].i_target;
7669 while (target->b_iused == 0) {
7670 target = target->b_next;
7671 }
7672 b->b_instr[b->b_iused-1].i_target = target;
7673 }
7674 }
7675}
7676
7677
Mark Shannon5977a792020-12-02 13:31:40 +00007678/* If an instruction has no line number, but it's predecessor in the BB does,
Mark Shannon3bd60352021-01-13 12:05:43 +00007679 * then copy the line number. If a successor block has no line number, and only
7680 * one predecessor, then inherit the line number.
7681 * This ensures that all exit blocks (with one predecessor) receive a line number.
7682 * Also reduces the size of the line number table,
Mark Shannon5977a792020-12-02 13:31:40 +00007683 * but has no impact on the generated line number events.
7684 */
7685static void
Mark Shannon3bd60352021-01-13 12:05:43 +00007686propogate_line_numbers(struct assembler *a) {
Mark Shannon5977a792020-12-02 13:31:40 +00007687 for (basicblock *b = a->a_entry; b != NULL; b = b->b_next) {
Mark Shannon3bd60352021-01-13 12:05:43 +00007688 if (b->b_iused == 0) {
7689 continue;
7690 }
Mark Shannon5977a792020-12-02 13:31:40 +00007691 int prev_lineno = -1;
7692 for (int i = 0; i < b->b_iused; i++) {
7693 if (b->b_instr[i].i_lineno < 0) {
7694 b->b_instr[i].i_lineno = prev_lineno;
7695 }
7696 else {
7697 prev_lineno = b->b_instr[i].i_lineno;
7698 }
7699 }
Mark Shannon3bd60352021-01-13 12:05:43 +00007700 if (!b->b_nofallthrough && b->b_next->b_predecessors == 1) {
7701 assert(b->b_next->b_iused);
7702 if (b->b_next->b_instr[0].i_lineno < 0) {
7703 b->b_next->b_instr[0].i_lineno = prev_lineno;
7704 }
7705 }
7706 if (is_jump(&b->b_instr[b->b_iused-1])) {
7707 switch (b->b_instr[b->b_iused-1].i_opcode) {
7708 /* Note: Only actual jumps, not exception handlers */
7709 case SETUP_ASYNC_WITH:
7710 case SETUP_WITH:
7711 case SETUP_FINALLY:
7712 continue;
7713 }
7714 basicblock *target = b->b_instr[b->b_iused-1].i_target;
7715 if (target->b_predecessors == 1) {
7716 if (target->b_instr[0].i_lineno < 0) {
7717 target->b_instr[0].i_lineno = prev_lineno;
7718 }
7719 }
7720 }
Mark Shannon5977a792020-12-02 13:31:40 +00007721 }
7722}
7723
7724/* Perform optimizations on a control flow graph.
Mark Shannon6e8128f2020-07-30 10:03:00 +01007725 The consts object should still be in list form to allow new constants
7726 to be appended.
7727
7728 All transformations keep the code size the same or smaller.
7729 For those that reduce size, the gaps are initially filled with
7730 NOPs. Later those NOPs are removed.
7731*/
7732
7733static int
Inada Naoki8a232c72021-04-16 14:01:04 +09007734optimize_cfg(struct compiler *c, struct assembler *a, PyObject *consts)
Mark Shannon6e8128f2020-07-30 10:03:00 +01007735{
Mark Shannoncc75ab72020-11-12 19:49:33 +00007736 for (basicblock *b = a->a_entry; b != NULL; b = b->b_next) {
Inada Naoki8a232c72021-04-16 14:01:04 +09007737 if (optimize_basic_block(c, b, consts)) {
Mark Shannon6e8128f2020-07-30 10:03:00 +01007738 return -1;
7739 }
Mark Shannon1659ad12021-01-13 15:05:04 +00007740 clean_basic_block(b, -1);
Mark Shannon3bd60352021-01-13 12:05:43 +00007741 assert(b->b_predecessors == 0);
Mark Shannon6e8128f2020-07-30 10:03:00 +01007742 }
7743 if (mark_reachable(a)) {
7744 return -1;
7745 }
7746 /* Delete unreachable instructions */
Mark Shannoncc75ab72020-11-12 19:49:33 +00007747 for (basicblock *b = a->a_entry; b != NULL; b = b->b_next) {
Mark Shannon3bd60352021-01-13 12:05:43 +00007748 if (b->b_predecessors == 0) {
Mark Shannoncc75ab72020-11-12 19:49:33 +00007749 b->b_iused = 0;
Om Gc71581c2020-12-16 17:48:05 +05307750 b->b_nofallthrough = 0;
Mark Shannon6e8128f2020-07-30 10:03:00 +01007751 }
7752 }
Mark Shannon1659ad12021-01-13 15:05:04 +00007753 basicblock *pred = NULL;
7754 for (basicblock *b = a->a_entry; b != NULL; b = b->b_next) {
7755 int prev_lineno = -1;
7756 if (pred && pred->b_iused) {
7757 prev_lineno = pred->b_instr[pred->b_iused-1].i_lineno;
7758 }
7759 clean_basic_block(b, prev_lineno);
7760 pred = b->b_nofallthrough ? NULL : b;
7761 }
Mark Shannon3bd60352021-01-13 12:05:43 +00007762 eliminate_empty_basic_blocks(a->a_entry);
Om Gc71581c2020-12-16 17:48:05 +05307763 /* Delete jump instructions made redundant by previous step. If a non-empty
7764 block ends with a jump instruction, check if the next non-empty block
7765 reached through normal flow control is the target of that jump. If it
7766 is, then the jump instruction is redundant and can be deleted.
7767 */
Mark Shannon3bd60352021-01-13 12:05:43 +00007768 int maybe_empty_blocks = 0;
Om Gc71581c2020-12-16 17:48:05 +05307769 for (basicblock *b = a->a_entry; b != NULL; b = b->b_next) {
7770 if (b->b_iused > 0) {
7771 struct instr *b_last_instr = &b->b_instr[b->b_iused - 1];
Mark Shannon802b6452021-02-02 14:59:15 +00007772 if (b_last_instr->i_opcode == JUMP_ABSOLUTE ||
Om Gc71581c2020-12-16 17:48:05 +05307773 b_last_instr->i_opcode == JUMP_FORWARD) {
Mark Shannon3bd60352021-01-13 12:05:43 +00007774 if (b_last_instr->i_target == b->b_next) {
7775 assert(b->b_next->b_iused);
Om Gc71581c2020-12-16 17:48:05 +05307776 b->b_nofallthrough = 0;
Mark Shannon802b6452021-02-02 14:59:15 +00007777 b_last_instr->i_opcode = NOP;
7778 clean_basic_block(b, -1);
7779 maybe_empty_blocks = 1;
Om Gc71581c2020-12-16 17:48:05 +05307780 }
7781 }
7782 }
7783 }
Mark Shannon3bd60352021-01-13 12:05:43 +00007784 if (maybe_empty_blocks) {
7785 eliminate_empty_basic_blocks(a->a_entry);
7786 }
7787 propogate_line_numbers(a);
Mark Shannon6e8128f2020-07-30 10:03:00 +01007788 return 0;
7789}
7790
Mark Shannon5977a792020-12-02 13:31:40 +00007791static inline int
7792is_exit_without_lineno(basicblock *b) {
7793 return b->b_exit && b->b_instr[0].i_lineno < 0;
7794}
7795
7796/* PEP 626 mandates that the f_lineno of a frame is correct
7797 * after a frame terminates. It would be prohibitively expensive
7798 * to continuously update the f_lineno field at runtime,
7799 * so we make sure that all exiting instruction (raises and returns)
7800 * have a valid line number, allowing us to compute f_lineno lazily.
7801 * We can do this by duplicating the exit blocks without line number
7802 * so that none have more than one predecessor. We can then safely
7803 * copy the line number from the sole predecessor block.
7804 */
7805static int
7806ensure_exits_have_lineno(struct compiler *c)
7807{
Mark Shannoneaccc122020-12-04 15:22:12 +00007808 basicblock *entry = NULL;
Mark Shannon5977a792020-12-02 13:31:40 +00007809 /* Copy all exit blocks without line number that are targets of a jump.
7810 */
7811 for (basicblock *b = c->u->u_blocks; b != NULL; b = b->b_list) {
7812 if (b->b_iused > 0 && is_jump(&b->b_instr[b->b_iused-1])) {
7813 switch (b->b_instr[b->b_iused-1].i_opcode) {
7814 /* Note: Only actual jumps, not exception handlers */
7815 case SETUP_ASYNC_WITH:
7816 case SETUP_WITH:
7817 case SETUP_FINALLY:
7818 continue;
7819 }
7820 basicblock *target = b->b_instr[b->b_iused-1].i_target;
7821 if (is_exit_without_lineno(target)) {
7822 basicblock *new_target = compiler_copy_block(c, target);
7823 if (new_target == NULL) {
7824 return -1;
7825 }
7826 new_target->b_instr[0].i_lineno = b->b_instr[b->b_iused-1].i_lineno;
7827 b->b_instr[b->b_iused-1].i_target = new_target;
7828 }
7829 }
Mark Shannoneaccc122020-12-04 15:22:12 +00007830 entry = b;
7831 }
7832 assert(entry != NULL);
7833 if (is_exit_without_lineno(entry)) {
7834 entry->b_instr[0].i_lineno = c->u->u_firstlineno;
Mark Shannon5977a792020-12-02 13:31:40 +00007835 }
Mark Shannonee9f98d2021-01-05 12:04:10 +00007836 /* Eliminate empty blocks */
7837 for (basicblock *b = c->u->u_blocks; b != NULL; b = b->b_list) {
7838 while (b->b_next && b->b_next->b_iused == 0) {
7839 b->b_next = b->b_next->b_next;
7840 }
7841 }
Mark Shannon5977a792020-12-02 13:31:40 +00007842 /* Any remaining reachable exit blocks without line number can only be reached by
7843 * fall through, and thus can only have a single predecessor */
7844 for (basicblock *b = c->u->u_blocks; b != NULL; b = b->b_list) {
7845 if (!b->b_nofallthrough && b->b_next && b->b_iused > 0) {
7846 if (is_exit_without_lineno(b->b_next)) {
7847 assert(b->b_next->b_iused > 0);
7848 b->b_next->b_instr[0].i_lineno = b->b_instr[b->b_iused-1].i_lineno;
7849 }
7850 }
7851 }
7852 return 0;
7853}
7854
7855
Mark Shannon6e8128f2020-07-30 10:03:00 +01007856/* Retained for API compatibility.
7857 * Optimization is now done in optimize_cfg */
7858
7859PyObject *
7860PyCode_Optimize(PyObject *code, PyObject* Py_UNUSED(consts),
7861 PyObject *Py_UNUSED(names), PyObject *Py_UNUSED(lnotab_obj))
7862{
7863 Py_INCREF(code);
7864 return code;
7865}