blob: 0508ea1df0ef04f791375eb78c706fa2ab21a8c7 [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
2926 c->u->u_lineno = -1;
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002927 ADDOP(c, END_ASYNC_FOR);
Yury Selivanov75445082015-05-11 22:57:16 -04002928
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002929 /* `else` block */
Yury Selivanov75445082015-05-11 22:57:16 -04002930 VISIT_SEQ(c, stmt, s->v.For.orelse);
2931
2932 compiler_use_next_block(c, end);
2933
2934 return 1;
2935}
2936
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002937static int
2938compiler_while(struct compiler *c, stmt_ty s)
2939{
Mark Shannon266b4622020-11-17 19:30:14 +00002940 basicblock *loop, *body, *end, *anchor = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002941 loop = compiler_new_block(c);
Mark Shannon266b4622020-11-17 19:30:14 +00002942 body = compiler_new_block(c);
2943 anchor = compiler_new_block(c);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002944 end = compiler_new_block(c);
Mark Shannon266b4622020-11-17 19:30:14 +00002945 if (loop == NULL || body == NULL || anchor == NULL || end == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002946 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002947 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002948 compiler_use_next_block(c, loop);
Mark Shannon266b4622020-11-17 19:30:14 +00002949 if (!compiler_push_fblock(c, WHILE_LOOP, loop, end, NULL)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002950 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002951 }
Mark Shannon8473cf82020-12-15 11:07:50 +00002952 if (!compiler_jump_if(c, s->v.While.test, anchor, 0)) {
2953 return 0;
Mark Shannon266b4622020-11-17 19:30:14 +00002954 }
2955
2956 compiler_use_next_block(c, body);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002957 VISIT_SEQ(c, stmt, s->v.While.body);
Mark Shannon8473cf82020-12-15 11:07:50 +00002958 SET_LOC(c, s);
2959 if (!compiler_jump_if(c, s->v.While.test, body, 1)) {
2960 return 0;
2961 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002962
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002963 compiler_pop_fblock(c, WHILE_LOOP, loop);
2964
Mark Shannon266b4622020-11-17 19:30:14 +00002965 compiler_use_next_block(c, anchor);
2966 if (s->v.While.orelse) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002967 VISIT_SEQ(c, stmt, s->v.While.orelse);
Mark Shannon266b4622020-11-17 19:30:14 +00002968 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002969 compiler_use_next_block(c, end);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002970
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002971 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002972}
2973
2974static int
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002975compiler_return(struct compiler *c, stmt_ty s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002976{
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002977 int preserve_tos = ((s->v.Return.value != NULL) &&
Serhiy Storchaka3f228112018-09-27 17:42:37 +03002978 (s->v.Return.value->kind != Constant_kind));
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002979 if (c->u->u_ste->ste_type != FunctionBlock)
2980 return compiler_error(c, "'return' outside function");
2981 if (s->v.Return.value != NULL &&
2982 c->u->u_ste->ste_coroutine && c->u->u_ste->ste_generator)
2983 {
2984 return compiler_error(
2985 c, "'return' with value in async generator");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002986 }
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002987 if (preserve_tos) {
2988 VISIT(c, expr, s->v.Return.value);
Mark Shannon5274b682020-12-16 13:07:01 +00002989 } else {
Mark Shannoncea05852021-06-03 19:57:31 +01002990 /* Emit instruction with line number for return value */
Mark Shannon5274b682020-12-16 13:07:01 +00002991 if (s->v.Return.value != NULL) {
2992 SET_LOC(c, s->v.Return.value);
2993 ADDOP(c, NOP);
2994 }
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002995 }
Mark Shannoncea05852021-06-03 19:57:31 +01002996 if (s->v.Return.value == NULL || s->v.Return.value->lineno != s->lineno) {
2997 SET_LOC(c, s);
2998 ADDOP(c, NOP);
2999 }
3000
Mark Shannonfee55262019-11-21 09:11:43 +00003001 if (!compiler_unwind_fblock_stack(c, preserve_tos, NULL))
3002 return 0;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003003 if (s->v.Return.value == NULL) {
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03003004 ADDOP_LOAD_CONST(c, Py_None);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003005 }
3006 else if (!preserve_tos) {
Mark Shannon5274b682020-12-16 13:07:01 +00003007 ADDOP_LOAD_CONST(c, s->v.Return.value->v.Constant.value);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003008 }
3009 ADDOP(c, RETURN_VALUE);
Mark Shannon266b4622020-11-17 19:30:14 +00003010 NEXT_BLOCK(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003011
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003012 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003013}
3014
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003015static int
3016compiler_break(struct compiler *c)
3017{
Mark Shannonfee55262019-11-21 09:11:43 +00003018 struct fblockinfo *loop = NULL;
Mark Shannoncea05852021-06-03 19:57:31 +01003019 /* Emit instruction with line number */
3020 ADDOP(c, NOP);
Mark Shannonfee55262019-11-21 09:11:43 +00003021 if (!compiler_unwind_fblock_stack(c, 0, &loop)) {
3022 return 0;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003023 }
Mark Shannonfee55262019-11-21 09:11:43 +00003024 if (loop == NULL) {
3025 return compiler_error(c, "'break' outside loop");
3026 }
3027 if (!compiler_unwind_fblock(c, loop, 0)) {
3028 return 0;
3029 }
Mark Shannon582aaf12020-08-04 17:30:11 +01003030 ADDOP_JUMP(c, JUMP_ABSOLUTE, loop->fb_exit);
Mark Shannon266b4622020-11-17 19:30:14 +00003031 NEXT_BLOCK(c);
Mark Shannonfee55262019-11-21 09:11:43 +00003032 return 1;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003033}
3034
3035static int
3036compiler_continue(struct compiler *c)
3037{
Mark Shannonfee55262019-11-21 09:11:43 +00003038 struct fblockinfo *loop = NULL;
Mark Shannoncea05852021-06-03 19:57:31 +01003039 /* Emit instruction with line number */
3040 ADDOP(c, NOP);
Mark Shannonfee55262019-11-21 09:11:43 +00003041 if (!compiler_unwind_fblock_stack(c, 0, &loop)) {
3042 return 0;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003043 }
Mark Shannonfee55262019-11-21 09:11:43 +00003044 if (loop == NULL) {
3045 return compiler_error(c, "'continue' not properly in loop");
3046 }
Mark Shannon582aaf12020-08-04 17:30:11 +01003047 ADDOP_JUMP(c, JUMP_ABSOLUTE, loop->fb_block);
Mark Shannon266b4622020-11-17 19:30:14 +00003048 NEXT_BLOCK(c)
Mark Shannonfee55262019-11-21 09:11:43 +00003049 return 1;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003050}
3051
3052
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003053/* Code generated for "try: <body> finally: <finalbody>" is as follows:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003054
3055 SETUP_FINALLY L
3056 <code for body>
3057 POP_BLOCK
Mark Shannonfee55262019-11-21 09:11:43 +00003058 <code for finalbody>
3059 JUMP E
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003060 L:
3061 <code for finalbody>
Mark Shannonfee55262019-11-21 09:11:43 +00003062 E:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003063
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003064 The special instructions use the block stack. Each block
3065 stack entry contains the instruction that created it (here
3066 SETUP_FINALLY), the level of the value stack at the time the
3067 block stack entry was created, and a label (here L).
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003068
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003069 SETUP_FINALLY:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003070 Pushes the current value stack level and the label
3071 onto the block stack.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003072 POP_BLOCK:
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003073 Pops en entry from the block stack.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003074
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003075 The block stack is unwound when an exception is raised:
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003076 when a SETUP_FINALLY entry is found, the raised and the caught
3077 exceptions are pushed onto the value stack (and the exception
3078 condition is cleared), and the interpreter jumps to the label
3079 gotten from the block stack.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003080*/
3081
3082static int
3083compiler_try_finally(struct compiler *c, stmt_ty s)
3084{
Mark Shannonfee55262019-11-21 09:11:43 +00003085 basicblock *body, *end, *exit;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003086
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003087 body = compiler_new_block(c);
3088 end = compiler_new_block(c);
Mark Shannonfee55262019-11-21 09:11:43 +00003089 exit = compiler_new_block(c);
3090 if (body == NULL || end == NULL || exit == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003091 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003092
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003093 /* `try` block */
Mark Shannon582aaf12020-08-04 17:30:11 +01003094 ADDOP_JUMP(c, SETUP_FINALLY, end);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003095 compiler_use_next_block(c, body);
Mark Shannonfee55262019-11-21 09:11:43 +00003096 if (!compiler_push_fblock(c, FINALLY_TRY, body, end, s->v.Try.finalbody))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003097 return 0;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003098 if (s->v.Try.handlers && asdl_seq_LEN(s->v.Try.handlers)) {
3099 if (!compiler_try_except(c, s))
3100 return 0;
3101 }
3102 else {
3103 VISIT_SEQ(c, stmt, s->v.Try.body);
3104 }
Mark Shannon3bd60352021-01-13 12:05:43 +00003105 ADDOP_NOLINE(c, POP_BLOCK);
Mark Shannonfee55262019-11-21 09:11:43 +00003106 compiler_pop_fblock(c, FINALLY_TRY, body);
3107 VISIT_SEQ(c, stmt, s->v.Try.finalbody);
Mark Shannon127dde52021-01-04 18:06:55 +00003108 ADDOP_JUMP_NOLINE(c, JUMP_FORWARD, exit);
Mark Shannonfee55262019-11-21 09:11:43 +00003109 /* `finally` block */
3110 compiler_use_next_block(c, end);
3111 if (!compiler_push_fblock(c, FINALLY_END, end, NULL, NULL))
3112 return 0;
3113 VISIT_SEQ(c, stmt, s->v.Try.finalbody);
3114 compiler_pop_fblock(c, FINALLY_END, end);
Mark Shannonbf353f32020-12-17 13:55:28 +00003115 ADDOP_I(c, RERAISE, 0);
Mark Shannonfee55262019-11-21 09:11:43 +00003116 compiler_use_next_block(c, exit);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003117 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003118}
3119
3120/*
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00003121 Code generated for "try: S except E1 as V1: S1 except E2 as V2: S2 ...":
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003122 (The contents of the value stack is shown in [], with the top
3123 at the right; 'tb' is trace-back info, 'val' the exception's
3124 associated value, and 'exc' the exception.)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003125
3126 Value stack Label Instruction Argument
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003127 [] SETUP_FINALLY L1
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003128 [] <code for S>
3129 [] POP_BLOCK
3130 [] JUMP_FORWARD L0
3131
3132 [tb, val, exc] L1: DUP )
3133 [tb, val, exc, exc] <evaluate E1> )
Mark Shannon9af0e472020-01-14 10:12:45 +00003134 [tb, val, exc, exc, E1] JUMP_IF_NOT_EXC_MATCH L2 ) only if E1
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003135 [tb, val, exc] POP
3136 [tb, val] <assign to V1> (or POP if no V1)
3137 [tb] POP
3138 [] <code for S1>
3139 JUMP_FORWARD L0
3140
3141 [tb, val, exc] L2: DUP
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003142 .............................etc.......................
3143
Mark Shannonfee55262019-11-21 09:11:43 +00003144 [tb, val, exc] Ln+1: RERAISE # re-raise exception
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003145
3146 [] L0: <next statement>
3147
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003148 Of course, parts are not generated if Vi or Ei is not present.
3149*/
3150static int
3151compiler_try_except(struct compiler *c, stmt_ty s)
3152{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003153 basicblock *body, *orelse, *except, *end;
Victor Stinnerad9a0662013-11-19 22:23:20 +01003154 Py_ssize_t i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003155
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003156 body = compiler_new_block(c);
3157 except = compiler_new_block(c);
3158 orelse = compiler_new_block(c);
3159 end = compiler_new_block(c);
3160 if (body == NULL || except == NULL || orelse == NULL || end == NULL)
3161 return 0;
Mark Shannon582aaf12020-08-04 17:30:11 +01003162 ADDOP_JUMP(c, SETUP_FINALLY, except);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003163 compiler_use_next_block(c, body);
Mark Shannon02d126a2020-09-25 14:04:19 +01003164 if (!compiler_push_fblock(c, TRY_EXCEPT, body, NULL, NULL))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003165 return 0;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003166 VISIT_SEQ(c, stmt, s->v.Try.body);
Mark Shannon02d126a2020-09-25 14:04:19 +01003167 compiler_pop_fblock(c, TRY_EXCEPT, body);
Mark Shannon3bd60352021-01-13 12:05:43 +00003168 ADDOP_NOLINE(c, POP_BLOCK);
3169 ADDOP_JUMP_NOLINE(c, JUMP_FORWARD, orelse);
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003170 n = asdl_seq_LEN(s->v.Try.handlers);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003171 compiler_use_next_block(c, except);
Mark Shannon02d126a2020-09-25 14:04:19 +01003172 /* Runtime will push a block here, so we need to account for that */
3173 if (!compiler_push_fblock(c, EXCEPTION_HANDLER, NULL, NULL, NULL))
3174 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003175 for (i = 0; i < n; i++) {
3176 excepthandler_ty handler = (excepthandler_ty)asdl_seq_GET(
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003177 s->v.Try.handlers, i);
Mark Shannon8d4b1842021-05-06 13:38:50 +01003178 SET_LOC(c, handler);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003179 if (!handler->v.ExceptHandler.type && i < n-1)
3180 return compiler_error(c, "default 'except:' must be last");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003181 except = compiler_new_block(c);
3182 if (except == NULL)
3183 return 0;
3184 if (handler->v.ExceptHandler.type) {
3185 ADDOP(c, DUP_TOP);
3186 VISIT(c, expr, handler->v.ExceptHandler.type);
Mark Shannon582aaf12020-08-04 17:30:11 +01003187 ADDOP_JUMP(c, JUMP_IF_NOT_EXC_MATCH, except);
Mark Shannon266b4622020-11-17 19:30:14 +00003188 NEXT_BLOCK(c);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003189 }
3190 ADDOP(c, POP_TOP);
3191 if (handler->v.ExceptHandler.name) {
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003192 basicblock *cleanup_end, *cleanup_body;
Guido van Rossumb940e112007-01-10 16:19:56 +00003193
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003194 cleanup_end = compiler_new_block(c);
3195 cleanup_body = compiler_new_block(c);
Zackery Spytz53ebf4b2018-10-11 23:54:03 -06003196 if (cleanup_end == NULL || cleanup_body == NULL) {
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003197 return 0;
Zackery Spytz53ebf4b2018-10-11 23:54:03 -06003198 }
Guido van Rossumb940e112007-01-10 16:19:56 +00003199
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003200 compiler_nameop(c, handler->v.ExceptHandler.name, Store);
3201 ADDOP(c, POP_TOP);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003202
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003203 /*
3204 try:
Ezio Melotti1b6424f2013-04-19 07:10:09 +03003205 # body
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003206 except type as name:
Ezio Melotti1b6424f2013-04-19 07:10:09 +03003207 try:
3208 # body
3209 finally:
Chris Angelicoad098b62019-05-21 23:34:19 +10003210 name = None # in case body contains "del name"
Ezio Melotti1b6424f2013-04-19 07:10:09 +03003211 del name
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003212 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003213
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003214 /* second try: */
Mark Shannon582aaf12020-08-04 17:30:11 +01003215 ADDOP_JUMP(c, SETUP_FINALLY, cleanup_end);
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003216 compiler_use_next_block(c, cleanup_body);
Mark Shannonfee55262019-11-21 09:11:43 +00003217 if (!compiler_push_fblock(c, HANDLER_CLEANUP, cleanup_body, NULL, handler->v.ExceptHandler.name))
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003218 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003219
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003220 /* second # body */
3221 VISIT_SEQ(c, stmt, handler->v.ExceptHandler.body);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003222 compiler_pop_fblock(c, HANDLER_CLEANUP, cleanup_body);
Mark Shannon877df852020-11-12 09:43:29 +00003223 /* name = None; del name; # Mark as artificial */
3224 c->u->u_lineno = -1;
Mark Shannon794ff7d2021-07-14 11:43:56 +01003225 ADDOP(c, POP_BLOCK);
3226 ADDOP(c, POP_EXCEPT);
Mark Shannonfee55262019-11-21 09:11:43 +00003227 ADDOP_LOAD_CONST(c, Py_None);
3228 compiler_nameop(c, handler->v.ExceptHandler.name, Store);
3229 compiler_nameop(c, handler->v.ExceptHandler.name, Del);
Mark Shannon582aaf12020-08-04 17:30:11 +01003230 ADDOP_JUMP(c, JUMP_FORWARD, end);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003231
Mark Shannonfee55262019-11-21 09:11:43 +00003232 /* except: */
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003233 compiler_use_next_block(c, cleanup_end);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003234
Mark Shannon877df852020-11-12 09:43:29 +00003235 /* name = None; del name; # Mark as artificial */
3236 c->u->u_lineno = -1;
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03003237 ADDOP_LOAD_CONST(c, Py_None);
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003238 compiler_nameop(c, handler->v.ExceptHandler.name, Store);
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003239 compiler_nameop(c, handler->v.ExceptHandler.name, Del);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003240
Mark Shannonbf353f32020-12-17 13:55:28 +00003241 ADDOP_I(c, RERAISE, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003242 }
3243 else {
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003244 basicblock *cleanup_body;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003245
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003246 cleanup_body = compiler_new_block(c);
Benjamin Peterson0a5dad92011-05-27 14:17:04 -05003247 if (!cleanup_body)
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003248 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003249
Guido van Rossumb940e112007-01-10 16:19:56 +00003250 ADDOP(c, POP_TOP);
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003251 ADDOP(c, POP_TOP);
3252 compiler_use_next_block(c, cleanup_body);
Mark Shannonfee55262019-11-21 09:11:43 +00003253 if (!compiler_push_fblock(c, HANDLER_CLEANUP, cleanup_body, NULL, NULL))
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003254 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003255 VISIT_SEQ(c, stmt, handler->v.ExceptHandler.body);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003256 compiler_pop_fblock(c, HANDLER_CLEANUP, cleanup_body);
Mark Shannon127dde52021-01-04 18:06:55 +00003257 c->u->u_lineno = -1;
Mark Shannonfee55262019-11-21 09:11:43 +00003258 ADDOP(c, POP_EXCEPT);
Mark Shannon582aaf12020-08-04 17:30:11 +01003259 ADDOP_JUMP(c, JUMP_FORWARD, end);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003260 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003261 compiler_use_next_block(c, except);
3262 }
Mark Shannon02d126a2020-09-25 14:04:19 +01003263 compiler_pop_fblock(c, EXCEPTION_HANDLER, NULL);
Mark Shannonf2dbfd72020-12-21 13:53:50 +00003264 /* Mark as artificial */
3265 c->u->u_lineno = -1;
Mark Shannonbf353f32020-12-17 13:55:28 +00003266 ADDOP_I(c, RERAISE, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003267 compiler_use_next_block(c, orelse);
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003268 VISIT_SEQ(c, stmt, s->v.Try.orelse);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003269 compiler_use_next_block(c, end);
3270 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003271}
3272
3273static int
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003274compiler_try(struct compiler *c, stmt_ty s) {
3275 if (s->v.Try.finalbody && asdl_seq_LEN(s->v.Try.finalbody))
3276 return compiler_try_finally(c, s);
3277 else
3278 return compiler_try_except(c, s);
3279}
3280
3281
3282static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003283compiler_import_as(struct compiler *c, identifier name, identifier asname)
3284{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003285 /* The IMPORT_NAME opcode was already generated. This function
3286 merely needs to bind the result to a name.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003287
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003288 If there is a dot in name, we need to split it and emit a
Serhiy Storchakaf93234b2017-05-09 22:31:05 +03003289 IMPORT_FROM for each name.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003290 */
Serhiy Storchaka265fcc52017-08-29 15:47:44 +03003291 Py_ssize_t len = PyUnicode_GET_LENGTH(name);
3292 Py_ssize_t dot = PyUnicode_FindChar(name, '.', 0, len, 1);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003293 if (dot == -2)
Serhiy Storchaka694de3b2016-06-15 20:06:07 +03003294 return 0;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003295 if (dot != -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003296 /* Consume the base module name to get the first attribute */
Serhiy Storchaka265fcc52017-08-29 15:47:44 +03003297 while (1) {
3298 Py_ssize_t pos = dot + 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003299 PyObject *attr;
Serhiy Storchaka265fcc52017-08-29 15:47:44 +03003300 dot = PyUnicode_FindChar(name, '.', pos, len, 1);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003301 if (dot == -2)
Serhiy Storchaka694de3b2016-06-15 20:06:07 +03003302 return 0;
Serhiy Storchaka265fcc52017-08-29 15:47:44 +03003303 attr = PyUnicode_Substring(name, pos, (dot != -1) ? dot : len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003304 if (!attr)
Serhiy Storchaka694de3b2016-06-15 20:06:07 +03003305 return 0;
Serhiy Storchakaaa8e51f2018-04-01 00:29:37 +03003306 ADDOP_N(c, IMPORT_FROM, attr, names);
Serhiy Storchaka265fcc52017-08-29 15:47:44 +03003307 if (dot == -1) {
3308 break;
3309 }
3310 ADDOP(c, ROT_TWO);
3311 ADDOP(c, POP_TOP);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003312 }
Serhiy Storchaka265fcc52017-08-29 15:47:44 +03003313 if (!compiler_nameop(c, asname, Store)) {
3314 return 0;
3315 }
3316 ADDOP(c, POP_TOP);
3317 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003318 }
3319 return compiler_nameop(c, asname, Store);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003320}
3321
3322static int
3323compiler_import(struct compiler *c, stmt_ty s)
3324{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003325 /* The Import node stores a module name like a.b.c as a single
3326 string. This is convenient for all cases except
3327 import a.b.c as d
3328 where we need to parse that string to extract the individual
3329 module names.
3330 XXX Perhaps change the representation to make this case simpler?
3331 */
Victor Stinnerad9a0662013-11-19 22:23:20 +01003332 Py_ssize_t i, n = asdl_seq_LEN(s->v.Import.names);
Thomas Woutersf7f438b2006-02-28 16:09:29 +00003333
Victor Stinnerc9bc2902020-10-27 02:24:34 +01003334 PyObject *zero = _PyLong_GetZero(); // borrowed reference
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003335 for (i = 0; i < n; i++) {
3336 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.Import.names, i);
3337 int r;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003338
Victor Stinnerc9bc2902020-10-27 02:24:34 +01003339 ADDOP_LOAD_CONST(c, zero);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03003340 ADDOP_LOAD_CONST(c, Py_None);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003341 ADDOP_NAME(c, IMPORT_NAME, alias->name, names);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003342
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003343 if (alias->asname) {
3344 r = compiler_import_as(c, alias->name, alias->asname);
3345 if (!r)
3346 return r;
3347 }
3348 else {
3349 identifier tmp = alias->name;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003350 Py_ssize_t dot = PyUnicode_FindChar(
3351 alias->name, '.', 0, PyUnicode_GET_LENGTH(alias->name), 1);
Victor Stinner6b64a682013-07-11 22:50:45 +02003352 if (dot != -1) {
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003353 tmp = PyUnicode_Substring(alias->name, 0, dot);
Victor Stinner6b64a682013-07-11 22:50:45 +02003354 if (tmp == NULL)
3355 return 0;
3356 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003357 r = compiler_nameop(c, tmp, Store);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003358 if (dot != -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003359 Py_DECREF(tmp);
3360 }
3361 if (!r)
3362 return r;
3363 }
3364 }
3365 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003366}
3367
3368static int
3369compiler_from_import(struct compiler *c, stmt_ty s)
3370{
Victor Stinnerad9a0662013-11-19 22:23:20 +01003371 Py_ssize_t i, n = asdl_seq_LEN(s->v.ImportFrom.names);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03003372 PyObject *names;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003373 static PyObject *empty_string;
Benjamin Peterson78565b22009-06-28 19:19:51 +00003374
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003375 if (!empty_string) {
3376 empty_string = PyUnicode_FromString("");
3377 if (!empty_string)
3378 return 0;
3379 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003380
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03003381 ADDOP_LOAD_CONST_NEW(c, PyLong_FromLong(s->v.ImportFrom.level));
Serhiy Storchakaa95d9862018-03-24 22:42:35 +02003382
3383 names = PyTuple_New(n);
3384 if (!names)
3385 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003386
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003387 /* build up the names */
3388 for (i = 0; i < n; i++) {
3389 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);
3390 Py_INCREF(alias->name);
3391 PyTuple_SET_ITEM(names, i, alias->name);
3392 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003393
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003394 if (s->lineno > c->c_future->ff_lineno && s->v.ImportFrom.module &&
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02003395 _PyUnicode_EqualToASCIIString(s->v.ImportFrom.module, "__future__")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003396 Py_DECREF(names);
3397 return compiler_error(c, "from __future__ imports must occur "
3398 "at the beginning of the file");
3399 }
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03003400 ADDOP_LOAD_CONST_NEW(c, names);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003401
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003402 if (s->v.ImportFrom.module) {
3403 ADDOP_NAME(c, IMPORT_NAME, s->v.ImportFrom.module, names);
3404 }
3405 else {
3406 ADDOP_NAME(c, IMPORT_NAME, empty_string, names);
3407 }
3408 for (i = 0; i < n; i++) {
3409 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);
3410 identifier store_name;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003411
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003412 if (i == 0 && PyUnicode_READ_CHAR(alias->name, 0) == '*') {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003413 assert(n == 1);
3414 ADDOP(c, IMPORT_STAR);
3415 return 1;
3416 }
3417
3418 ADDOP_NAME(c, IMPORT_FROM, alias->name, names);
3419 store_name = alias->name;
3420 if (alias->asname)
3421 store_name = alias->asname;
3422
3423 if (!compiler_nameop(c, store_name, Store)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003424 return 0;
3425 }
3426 }
3427 /* remove imported module */
3428 ADDOP(c, POP_TOP);
3429 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003430}
3431
3432static int
3433compiler_assert(struct compiler *c, stmt_ty s)
3434{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003435 basicblock *end;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003436
tsukasa-aua8ef4572021-03-16 22:14:41 +11003437 /* Always emit a warning if the test is a non-zero length tuple */
3438 if ((s->v.Assert.test->kind == Tuple_kind &&
3439 asdl_seq_LEN(s->v.Assert.test->v.Tuple.elts) > 0) ||
3440 (s->v.Assert.test->kind == Constant_kind &&
3441 PyTuple_Check(s->v.Assert.test->v.Constant.value) &&
3442 PyTuple_Size(s->v.Assert.test->v.Constant.value) > 0))
Serhiy Storchakad31e7732018-10-21 10:09:39 +03003443 {
3444 if (!compiler_warn(c, "assertion is always true, "
3445 "perhaps remove parentheses?"))
3446 {
Victor Stinner14e461d2013-08-26 22:28:21 +02003447 return 0;
3448 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003449 }
tsukasa-aua8ef4572021-03-16 22:14:41 +11003450 if (c->c_optimize)
3451 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003452 end = compiler_new_block(c);
3453 if (end == NULL)
3454 return 0;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03003455 if (!compiler_jump_if(c, s->v.Assert.test, end, 1))
3456 return 0;
Zackery Spytzce6a0702019-08-25 03:44:09 -06003457 ADDOP(c, LOAD_ASSERTION_ERROR);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003458 if (s->v.Assert.msg) {
3459 VISIT(c, expr, s->v.Assert.msg);
3460 ADDOP_I(c, CALL_FUNCTION, 1);
3461 }
3462 ADDOP_I(c, RAISE_VARARGS, 1);
3463 compiler_use_next_block(c, end);
3464 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003465}
3466
3467static int
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01003468compiler_visit_stmt_expr(struct compiler *c, expr_ty value)
3469{
3470 if (c->c_interactive && c->c_nestlevel <= 1) {
3471 VISIT(c, expr, value);
3472 ADDOP(c, PRINT_EXPR);
3473 return 1;
3474 }
3475
Serhiy Storchaka3f228112018-09-27 17:42:37 +03003476 if (value->kind == Constant_kind) {
Victor Stinner15a30952016-02-08 22:45:06 +01003477 /* ignore constant statement */
Mark Shannon877df852020-11-12 09:43:29 +00003478 ADDOP(c, NOP);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01003479 return 1;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01003480 }
3481
3482 VISIT(c, expr, value);
Mark Shannonc5440932021-03-15 14:24:25 +00003483 /* Mark POP_TOP as artificial */
3484 c->u->u_lineno = -1;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01003485 ADDOP(c, POP_TOP);
3486 return 1;
3487}
3488
3489static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003490compiler_visit_stmt(struct compiler *c, stmt_ty s)
3491{
Victor Stinnerad9a0662013-11-19 22:23:20 +01003492 Py_ssize_t i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003493
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003494 /* Always assign a lineno to the next instruction for a stmt. */
Serhiy Storchaka61cb3d02020-03-17 18:07:30 +02003495 SET_LOC(c, s);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003496
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003497 switch (s->kind) {
3498 case FunctionDef_kind:
Yury Selivanov75445082015-05-11 22:57:16 -04003499 return compiler_function(c, s, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003500 case ClassDef_kind:
3501 return compiler_class(c, s);
3502 case Return_kind:
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003503 return compiler_return(c, s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003504 case Delete_kind:
3505 VISIT_SEQ(c, expr, s->v.Delete.targets)
3506 break;
3507 case Assign_kind:
3508 n = asdl_seq_LEN(s->v.Assign.targets);
3509 VISIT(c, expr, s->v.Assign.value);
3510 for (i = 0; i < n; i++) {
3511 if (i < n - 1)
3512 ADDOP(c, DUP_TOP);
3513 VISIT(c, expr,
3514 (expr_ty)asdl_seq_GET(s->v.Assign.targets, i));
3515 }
3516 break;
3517 case AugAssign_kind:
3518 return compiler_augassign(c, s);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003519 case AnnAssign_kind:
3520 return compiler_annassign(c, s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003521 case For_kind:
3522 return compiler_for(c, s);
3523 case While_kind:
3524 return compiler_while(c, s);
3525 case If_kind:
3526 return compiler_if(c, s);
Brandt Bucher145bf262021-02-26 14:51:55 -08003527 case Match_kind:
3528 return compiler_match(c, s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003529 case Raise_kind:
3530 n = 0;
3531 if (s->v.Raise.exc) {
3532 VISIT(c, expr, s->v.Raise.exc);
3533 n++;
Victor Stinnerad9a0662013-11-19 22:23:20 +01003534 if (s->v.Raise.cause) {
3535 VISIT(c, expr, s->v.Raise.cause);
3536 n++;
3537 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003538 }
Victor Stinnerad9a0662013-11-19 22:23:20 +01003539 ADDOP_I(c, RAISE_VARARGS, (int)n);
Mark Shannon266b4622020-11-17 19:30:14 +00003540 NEXT_BLOCK(c);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003541 break;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003542 case Try_kind:
3543 return compiler_try(c, s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003544 case Assert_kind:
3545 return compiler_assert(c, s);
3546 case Import_kind:
3547 return compiler_import(c, s);
3548 case ImportFrom_kind:
3549 return compiler_from_import(c, s);
3550 case Global_kind:
3551 case Nonlocal_kind:
3552 break;
3553 case Expr_kind:
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01003554 return compiler_visit_stmt_expr(c, s->v.Expr.value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003555 case Pass_kind:
Mark Shannon877df852020-11-12 09:43:29 +00003556 ADDOP(c, NOP);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003557 break;
3558 case Break_kind:
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003559 return compiler_break(c);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003560 case Continue_kind:
3561 return compiler_continue(c);
3562 case With_kind:
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003563 return compiler_with(c, s, 0);
Yury Selivanov75445082015-05-11 22:57:16 -04003564 case AsyncFunctionDef_kind:
3565 return compiler_function(c, s, 1);
3566 case AsyncWith_kind:
3567 return compiler_async_with(c, s, 0);
3568 case AsyncFor_kind:
3569 return compiler_async_for(c, s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003570 }
Yury Selivanov75445082015-05-11 22:57:16 -04003571
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003572 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003573}
3574
3575static int
3576unaryop(unaryop_ty op)
3577{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003578 switch (op) {
3579 case Invert:
3580 return UNARY_INVERT;
3581 case Not:
3582 return UNARY_NOT;
3583 case UAdd:
3584 return UNARY_POSITIVE;
3585 case USub:
3586 return UNARY_NEGATIVE;
3587 default:
3588 PyErr_Format(PyExc_SystemError,
3589 "unary op %d should not be possible", op);
3590 return 0;
3591 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003592}
3593
3594static int
Andy Lester76d58772020-03-10 21:18:12 -05003595binop(operator_ty op)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003596{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003597 switch (op) {
3598 case Add:
3599 return BINARY_ADD;
3600 case Sub:
3601 return BINARY_SUBTRACT;
3602 case Mult:
3603 return BINARY_MULTIPLY;
Benjamin Petersond51374e2014-04-09 23:55:56 -04003604 case MatMult:
3605 return BINARY_MATRIX_MULTIPLY;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003606 case Div:
3607 return BINARY_TRUE_DIVIDE;
3608 case Mod:
3609 return BINARY_MODULO;
3610 case Pow:
3611 return BINARY_POWER;
3612 case LShift:
3613 return BINARY_LSHIFT;
3614 case RShift:
3615 return BINARY_RSHIFT;
3616 case BitOr:
3617 return BINARY_OR;
3618 case BitXor:
3619 return BINARY_XOR;
3620 case BitAnd:
3621 return BINARY_AND;
3622 case FloorDiv:
3623 return BINARY_FLOOR_DIVIDE;
3624 default:
3625 PyErr_Format(PyExc_SystemError,
3626 "binary op %d should not be possible", op);
3627 return 0;
3628 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003629}
3630
3631static int
Andy Lester76d58772020-03-10 21:18:12 -05003632inplace_binop(operator_ty op)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003633{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003634 switch (op) {
3635 case Add:
3636 return INPLACE_ADD;
3637 case Sub:
3638 return INPLACE_SUBTRACT;
3639 case Mult:
3640 return INPLACE_MULTIPLY;
Benjamin Petersond51374e2014-04-09 23:55:56 -04003641 case MatMult:
3642 return INPLACE_MATRIX_MULTIPLY;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003643 case Div:
3644 return INPLACE_TRUE_DIVIDE;
3645 case Mod:
3646 return INPLACE_MODULO;
3647 case Pow:
3648 return INPLACE_POWER;
3649 case LShift:
3650 return INPLACE_LSHIFT;
3651 case RShift:
3652 return INPLACE_RSHIFT;
3653 case BitOr:
3654 return INPLACE_OR;
3655 case BitXor:
3656 return INPLACE_XOR;
3657 case BitAnd:
3658 return INPLACE_AND;
3659 case FloorDiv:
3660 return INPLACE_FLOOR_DIVIDE;
3661 default:
3662 PyErr_Format(PyExc_SystemError,
3663 "inplace binary op %d should not be possible", op);
3664 return 0;
3665 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003666}
3667
3668static int
3669compiler_nameop(struct compiler *c, identifier name, expr_context_ty ctx)
3670{
Victor Stinnerad9a0662013-11-19 22:23:20 +01003671 int op, scope;
3672 Py_ssize_t arg;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003673 enum { OP_FAST, OP_GLOBAL, OP_DEREF, OP_NAME } optype;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003674
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003675 PyObject *dict = c->u->u_names;
3676 PyObject *mangled;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003677
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02003678 assert(!_PyUnicode_EqualToASCIIString(name, "None") &&
3679 !_PyUnicode_EqualToASCIIString(name, "True") &&
3680 !_PyUnicode_EqualToASCIIString(name, "False"));
Benjamin Peterson70b224d2012-12-06 17:49:58 -05003681
Pablo Galindoc5fc1562020-04-22 23:29:27 +01003682 if (forbidden_name(c, name, ctx))
3683 return 0;
3684
Serhiy Storchakabd6ec4d2017-12-18 14:29:12 +02003685 mangled = _Py_Mangle(c->u->u_private, name);
3686 if (!mangled)
3687 return 0;
3688
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003689 op = 0;
3690 optype = OP_NAME;
Victor Stinner28ad12f2021-03-19 12:41:49 +01003691 scope = _PyST_GetScope(c->u->u_ste, mangled);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003692 switch (scope) {
3693 case FREE:
3694 dict = c->u->u_freevars;
3695 optype = OP_DEREF;
3696 break;
3697 case CELL:
3698 dict = c->u->u_cellvars;
3699 optype = OP_DEREF;
3700 break;
3701 case LOCAL:
3702 if (c->u->u_ste->ste_type == FunctionBlock)
3703 optype = OP_FAST;
3704 break;
3705 case GLOBAL_IMPLICIT:
Benjamin Peterson1dfd2472015-04-27 21:44:22 -04003706 if (c->u->u_ste->ste_type == FunctionBlock)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003707 optype = OP_GLOBAL;
3708 break;
3709 case GLOBAL_EXPLICIT:
3710 optype = OP_GLOBAL;
3711 break;
3712 default:
3713 /* scope can be 0 */
3714 break;
3715 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003716
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003717 /* XXX Leave assert here, but handle __doc__ and the like better */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003718 assert(scope || PyUnicode_READ_CHAR(name, 0) == '_');
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003719
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003720 switch (optype) {
3721 case OP_DEREF:
3722 switch (ctx) {
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04003723 case Load:
3724 op = (c->u->u_ste->ste_type == ClassBlock) ? LOAD_CLASSDEREF : LOAD_DEREF;
3725 break;
Serhiy Storchaka6b975982020-03-17 23:41:08 +02003726 case Store: op = STORE_DEREF; break;
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00003727 case Del: op = DELETE_DEREF; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003728 }
3729 break;
3730 case OP_FAST:
3731 switch (ctx) {
3732 case Load: op = LOAD_FAST; break;
Serhiy Storchaka6b975982020-03-17 23:41:08 +02003733 case Store: op = STORE_FAST; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003734 case Del: op = DELETE_FAST; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003735 }
Serhiy Storchakaaa8e51f2018-04-01 00:29:37 +03003736 ADDOP_N(c, op, mangled, varnames);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003737 return 1;
3738 case OP_GLOBAL:
3739 switch (ctx) {
3740 case Load: op = LOAD_GLOBAL; break;
Serhiy Storchaka6b975982020-03-17 23:41:08 +02003741 case Store: op = STORE_GLOBAL; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003742 case Del: op = DELETE_GLOBAL; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003743 }
3744 break;
3745 case OP_NAME:
3746 switch (ctx) {
Benjamin Peterson20f9c3c2010-07-20 22:39:34 +00003747 case Load: op = LOAD_NAME; break;
Serhiy Storchaka6b975982020-03-17 23:41:08 +02003748 case Store: op = STORE_NAME; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003749 case Del: op = DELETE_NAME; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003750 }
3751 break;
3752 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003753
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003754 assert(op);
Andy Lester76d58772020-03-10 21:18:12 -05003755 arg = compiler_add_o(dict, mangled);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003756 Py_DECREF(mangled);
3757 if (arg < 0)
3758 return 0;
3759 return compiler_addop_i(c, op, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003760}
3761
3762static int
3763compiler_boolop(struct compiler *c, expr_ty e)
3764{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003765 basicblock *end;
Victor Stinnerad9a0662013-11-19 22:23:20 +01003766 int jumpi;
3767 Py_ssize_t i, n;
Pablo Galindoa5634c42020-09-16 19:42:00 +01003768 asdl_expr_seq *s;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003769
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003770 assert(e->kind == BoolOp_kind);
3771 if (e->v.BoolOp.op == And)
3772 jumpi = JUMP_IF_FALSE_OR_POP;
3773 else
3774 jumpi = JUMP_IF_TRUE_OR_POP;
3775 end = compiler_new_block(c);
3776 if (end == NULL)
3777 return 0;
3778 s = e->v.BoolOp.values;
3779 n = asdl_seq_LEN(s) - 1;
3780 assert(n >= 0);
3781 for (i = 0; i < n; ++i) {
3782 VISIT(c, expr, (expr_ty)asdl_seq_GET(s, i));
Mark Shannon582aaf12020-08-04 17:30:11 +01003783 ADDOP_JUMP(c, jumpi, end);
Mark Shannon6e8128f2020-07-30 10:03:00 +01003784 basicblock *next = compiler_new_block(c);
3785 if (next == NULL) {
3786 return 0;
3787 }
3788 compiler_use_next_block(c, next);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003789 }
3790 VISIT(c, expr, (expr_ty)asdl_seq_GET(s, n));
3791 compiler_use_next_block(c, end);
3792 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003793}
3794
3795static int
Pablo Galindoa5634c42020-09-16 19:42:00 +01003796starunpack_helper(struct compiler *c, asdl_expr_seq *elts, int pushed,
Mark Shannon13bc1392020-01-23 09:25:17 +00003797 int build, int add, int extend, int tuple)
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003798{
3799 Py_ssize_t n = asdl_seq_LEN(elts);
Brandt Bucher6dd9b642019-11-25 22:16:53 -08003800 if (n > 2 && are_all_items_const(elts, 0, n)) {
3801 PyObject *folded = PyTuple_New(n);
3802 if (folded == NULL) {
3803 return 0;
3804 }
3805 PyObject *val;
Mark Shannon11e0b292021-04-15 14:28:56 +01003806 for (Py_ssize_t i = 0; i < n; i++) {
Brandt Bucher6dd9b642019-11-25 22:16:53 -08003807 val = ((expr_ty)asdl_seq_GET(elts, i))->v.Constant.value;
3808 Py_INCREF(val);
3809 PyTuple_SET_ITEM(folded, i, val);
3810 }
Mark Shannon13bc1392020-01-23 09:25:17 +00003811 if (tuple) {
3812 ADDOP_LOAD_CONST_NEW(c, folded);
3813 } else {
3814 if (add == SET_ADD) {
3815 Py_SETREF(folded, PyFrozenSet_New(folded));
3816 if (folded == NULL) {
3817 return 0;
3818 }
Brandt Bucher6dd9b642019-11-25 22:16:53 -08003819 }
Mark Shannon13bc1392020-01-23 09:25:17 +00003820 ADDOP_I(c, build, pushed);
3821 ADDOP_LOAD_CONST_NEW(c, folded);
3822 ADDOP_I(c, extend, 1);
Brandt Bucher6dd9b642019-11-25 22:16:53 -08003823 }
Brandt Bucher6dd9b642019-11-25 22:16:53 -08003824 return 1;
3825 }
Mark Shannon13bc1392020-01-23 09:25:17 +00003826
Mark Shannon11e0b292021-04-15 14:28:56 +01003827 int big = n+pushed > STACK_USE_GUIDELINE;
3828 int seen_star = 0;
3829 for (Py_ssize_t i = 0; i < n; i++) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003830 expr_ty elt = asdl_seq_GET(elts, i);
3831 if (elt->kind == Starred_kind) {
Mark Shannon13bc1392020-01-23 09:25:17 +00003832 seen_star = 1;
3833 }
3834 }
Mark Shannon11e0b292021-04-15 14:28:56 +01003835 if (!seen_star && !big) {
3836 for (Py_ssize_t i = 0; i < n; i++) {
Mark Shannon13bc1392020-01-23 09:25:17 +00003837 expr_ty elt = asdl_seq_GET(elts, i);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003838 VISIT(c, expr, elt);
Mark Shannon13bc1392020-01-23 09:25:17 +00003839 }
3840 if (tuple) {
3841 ADDOP_I(c, BUILD_TUPLE, n+pushed);
3842 } else {
3843 ADDOP_I(c, build, n+pushed);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003844 }
Mark Shannon11e0b292021-04-15 14:28:56 +01003845 return 1;
3846 }
3847 int sequence_built = 0;
3848 if (big) {
3849 ADDOP_I(c, build, pushed);
3850 sequence_built = 1;
3851 }
3852 for (Py_ssize_t i = 0; i < n; i++) {
3853 expr_ty elt = asdl_seq_GET(elts, i);
3854 if (elt->kind == Starred_kind) {
3855 if (sequence_built == 0) {
3856 ADDOP_I(c, build, i+pushed);
3857 sequence_built = 1;
3858 }
3859 VISIT(c, expr, elt->v.Starred.value);
3860 ADDOP_I(c, extend, 1);
3861 }
3862 else {
3863 VISIT(c, expr, elt);
3864 if (sequence_built) {
3865 ADDOP_I(c, add, 1);
3866 }
3867 }
3868 }
3869 assert(sequence_built);
3870 if (tuple) {
3871 ADDOP(c, LIST_TO_TUPLE);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003872 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003873 return 1;
3874}
3875
3876static int
Brandt Bucher145bf262021-02-26 14:51:55 -08003877unpack_helper(struct compiler *c, asdl_expr_seq *elts)
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003878{
3879 Py_ssize_t n = asdl_seq_LEN(elts);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003880 int seen_star = 0;
Brandt Bucher145bf262021-02-26 14:51:55 -08003881 for (Py_ssize_t i = 0; i < n; i++) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003882 expr_ty elt = asdl_seq_GET(elts, i);
3883 if (elt->kind == Starred_kind && !seen_star) {
3884 if ((i >= (1 << 8)) ||
3885 (n-i-1 >= (INT_MAX >> 8)))
3886 return compiler_error(c,
3887 "too many expressions in "
3888 "star-unpacking assignment");
3889 ADDOP_I(c, UNPACK_EX, (i + ((n-i-1) << 8)));
3890 seen_star = 1;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003891 }
3892 else if (elt->kind == Starred_kind) {
3893 return compiler_error(c,
Furkan Öndercb6534e2020-03-26 04:54:31 +03003894 "multiple starred expressions in assignment");
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003895 }
3896 }
3897 if (!seen_star) {
3898 ADDOP_I(c, UNPACK_SEQUENCE, n);
3899 }
Brandt Bucher145bf262021-02-26 14:51:55 -08003900 return 1;
3901}
3902
3903static int
3904assignment_helper(struct compiler *c, asdl_expr_seq *elts)
3905{
3906 Py_ssize_t n = asdl_seq_LEN(elts);
3907 RETURN_IF_FALSE(unpack_helper(c, elts));
3908 for (Py_ssize_t i = 0; i < n; i++) {
Brandt Bucherd5aa2e92020-03-07 19:44:18 -08003909 expr_ty elt = asdl_seq_GET(elts, i);
3910 VISIT(c, expr, elt->kind != Starred_kind ? elt : elt->v.Starred.value);
3911 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003912 return 1;
3913}
3914
3915static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003916compiler_list(struct compiler *c, expr_ty e)
3917{
Pablo Galindoa5634c42020-09-16 19:42:00 +01003918 asdl_expr_seq *elts = e->v.List.elts;
Serhiy Storchakad8b3a982019-03-05 20:42:06 +02003919 if (e->v.List.ctx == Store) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003920 return assignment_helper(c, elts);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003921 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003922 else if (e->v.List.ctx == Load) {
Mark Shannon13bc1392020-01-23 09:25:17 +00003923 return starunpack_helper(c, elts, 0, BUILD_LIST,
3924 LIST_APPEND, LIST_EXTEND, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003925 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003926 else
3927 VISIT_SEQ(c, expr, elts);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003928 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003929}
3930
3931static int
3932compiler_tuple(struct compiler *c, expr_ty e)
3933{
Pablo Galindoa5634c42020-09-16 19:42:00 +01003934 asdl_expr_seq *elts = e->v.Tuple.elts;
Serhiy Storchakad8b3a982019-03-05 20:42:06 +02003935 if (e->v.Tuple.ctx == Store) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003936 return assignment_helper(c, elts);
3937 }
3938 else if (e->v.Tuple.ctx == Load) {
Mark Shannon13bc1392020-01-23 09:25:17 +00003939 return starunpack_helper(c, elts, 0, BUILD_LIST,
3940 LIST_APPEND, LIST_EXTEND, 1);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003941 }
3942 else
3943 VISIT_SEQ(c, expr, elts);
3944 return 1;
3945}
3946
3947static int
3948compiler_set(struct compiler *c, expr_ty e)
3949{
Mark Shannon13bc1392020-01-23 09:25:17 +00003950 return starunpack_helper(c, e->v.Set.elts, 0, BUILD_SET,
3951 SET_ADD, SET_UPDATE, 0);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003952}
3953
3954static int
Pablo Galindoa5634c42020-09-16 19:42:00 +01003955are_all_items_const(asdl_expr_seq *seq, Py_ssize_t begin, Py_ssize_t end)
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003956{
3957 Py_ssize_t i;
3958 for (i = begin; i < end; i++) {
3959 expr_ty key = (expr_ty)asdl_seq_GET(seq, i);
Serhiy Storchaka3f228112018-09-27 17:42:37 +03003960 if (key == NULL || key->kind != Constant_kind)
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003961 return 0;
3962 }
3963 return 1;
3964}
3965
3966static int
3967compiler_subdict(struct compiler *c, expr_ty e, Py_ssize_t begin, Py_ssize_t end)
3968{
3969 Py_ssize_t i, n = end - begin;
3970 PyObject *keys, *key;
Mark Shannon11e0b292021-04-15 14:28:56 +01003971 int big = n*2 > STACK_USE_GUIDELINE;
3972 if (n > 1 && !big && are_all_items_const(e->v.Dict.keys, begin, end)) {
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003973 for (i = begin; i < end; i++) {
3974 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Dict.values, i));
3975 }
3976 keys = PyTuple_New(n);
3977 if (keys == NULL) {
3978 return 0;
3979 }
3980 for (i = begin; i < end; i++) {
Serhiy Storchaka3f228112018-09-27 17:42:37 +03003981 key = ((expr_ty)asdl_seq_GET(e->v.Dict.keys, i))->v.Constant.value;
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003982 Py_INCREF(key);
3983 PyTuple_SET_ITEM(keys, i - begin, key);
3984 }
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03003985 ADDOP_LOAD_CONST_NEW(c, keys);
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003986 ADDOP_I(c, BUILD_CONST_KEY_MAP, n);
Mark Shannon11e0b292021-04-15 14:28:56 +01003987 return 1;
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003988 }
Mark Shannon11e0b292021-04-15 14:28:56 +01003989 if (big) {
3990 ADDOP_I(c, BUILD_MAP, 0);
3991 }
3992 for (i = begin; i < end; i++) {
3993 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Dict.keys, i));
3994 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Dict.values, i));
3995 if (big) {
3996 ADDOP_I(c, MAP_ADD, 1);
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003997 }
Mark Shannon11e0b292021-04-15 14:28:56 +01003998 }
3999 if (!big) {
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03004000 ADDOP_I(c, BUILD_MAP, n);
4001 }
4002 return 1;
4003}
4004
4005static int
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004006compiler_dict(struct compiler *c, expr_ty e)
4007{
Victor Stinner976bb402016-03-23 11:36:19 +01004008 Py_ssize_t i, n, elements;
Mark Shannon8a4cd702020-01-27 09:57:45 +00004009 int have_dict;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004010 int is_unpacking = 0;
4011 n = asdl_seq_LEN(e->v.Dict.values);
Mark Shannon8a4cd702020-01-27 09:57:45 +00004012 have_dict = 0;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004013 elements = 0;
4014 for (i = 0; i < n; i++) {
4015 is_unpacking = (expr_ty)asdl_seq_GET(e->v.Dict.keys, i) == NULL;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004016 if (is_unpacking) {
Mark Shannon8a4cd702020-01-27 09:57:45 +00004017 if (elements) {
4018 if (!compiler_subdict(c, e, i - elements, i)) {
4019 return 0;
4020 }
4021 if (have_dict) {
4022 ADDOP_I(c, DICT_UPDATE, 1);
4023 }
4024 have_dict = 1;
4025 elements = 0;
4026 }
4027 if (have_dict == 0) {
4028 ADDOP_I(c, BUILD_MAP, 0);
4029 have_dict = 1;
4030 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004031 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Dict.values, i));
Mark Shannon8a4cd702020-01-27 09:57:45 +00004032 ADDOP_I(c, DICT_UPDATE, 1);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004033 }
4034 else {
Mark Shannon11e0b292021-04-15 14:28:56 +01004035 if (elements*2 > STACK_USE_GUIDELINE) {
Pablo Galindoc51db0e2020-08-13 09:48:41 +01004036 if (!compiler_subdict(c, e, i - elements, i + 1)) {
Mark Shannon8a4cd702020-01-27 09:57:45 +00004037 return 0;
4038 }
4039 if (have_dict) {
4040 ADDOP_I(c, DICT_UPDATE, 1);
4041 }
4042 have_dict = 1;
4043 elements = 0;
4044 }
4045 else {
4046 elements++;
4047 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004048 }
4049 }
Mark Shannon8a4cd702020-01-27 09:57:45 +00004050 if (elements) {
4051 if (!compiler_subdict(c, e, n - elements, n)) {
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03004052 return 0;
Mark Shannon8a4cd702020-01-27 09:57:45 +00004053 }
4054 if (have_dict) {
4055 ADDOP_I(c, DICT_UPDATE, 1);
4056 }
4057 have_dict = 1;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004058 }
Mark Shannon8a4cd702020-01-27 09:57:45 +00004059 if (!have_dict) {
4060 ADDOP_I(c, BUILD_MAP, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004061 }
4062 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004063}
4064
4065static int
4066compiler_compare(struct compiler *c, expr_ty e)
4067{
Victor Stinnerad9a0662013-11-19 22:23:20 +01004068 Py_ssize_t i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004069
Serhiy Storchaka3bcbedc2019-01-18 07:47:48 +02004070 if (!check_compare(c, e)) {
4071 return 0;
4072 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004073 VISIT(c, expr, e->v.Compare.left);
Serhiy Storchaka02b9ef22017-12-30 09:47:42 +02004074 assert(asdl_seq_LEN(e->v.Compare.ops) > 0);
4075 n = asdl_seq_LEN(e->v.Compare.ops) - 1;
4076 if (n == 0) {
4077 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, 0));
Mark Shannon9af0e472020-01-14 10:12:45 +00004078 ADDOP_COMPARE(c, asdl_seq_GET(e->v.Compare.ops, 0));
Serhiy Storchaka02b9ef22017-12-30 09:47:42 +02004079 }
4080 else {
4081 basicblock *cleanup = compiler_new_block(c);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004082 if (cleanup == NULL)
4083 return 0;
Serhiy Storchaka02b9ef22017-12-30 09:47:42 +02004084 for (i = 0; i < n; i++) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004085 VISIT(c, expr,
4086 (expr_ty)asdl_seq_GET(e->v.Compare.comparators, i));
Serhiy Storchaka02b9ef22017-12-30 09:47:42 +02004087 ADDOP(c, DUP_TOP);
4088 ADDOP(c, ROT_THREE);
Mark Shannon9af0e472020-01-14 10:12:45 +00004089 ADDOP_COMPARE(c, asdl_seq_GET(e->v.Compare.ops, i));
Mark Shannon582aaf12020-08-04 17:30:11 +01004090 ADDOP_JUMP(c, JUMP_IF_FALSE_OR_POP, cleanup);
Serhiy Storchaka02b9ef22017-12-30 09:47:42 +02004091 NEXT_BLOCK(c);
4092 }
4093 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, n));
Mark Shannon9af0e472020-01-14 10:12:45 +00004094 ADDOP_COMPARE(c, asdl_seq_GET(e->v.Compare.ops, n));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004095 basicblock *end = compiler_new_block(c);
4096 if (end == NULL)
4097 return 0;
Mark Shannon127dde52021-01-04 18:06:55 +00004098 ADDOP_JUMP_NOLINE(c, JUMP_FORWARD, end);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004099 compiler_use_next_block(c, cleanup);
4100 ADDOP(c, ROT_TWO);
4101 ADDOP(c, POP_TOP);
4102 compiler_use_next_block(c, end);
4103 }
4104 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004105}
4106
Serhiy Storchaka62e44812019-02-16 08:12:19 +02004107static PyTypeObject *
4108infer_type(expr_ty e)
4109{
4110 switch (e->kind) {
4111 case Tuple_kind:
4112 return &PyTuple_Type;
4113 case List_kind:
4114 case ListComp_kind:
4115 return &PyList_Type;
4116 case Dict_kind:
4117 case DictComp_kind:
4118 return &PyDict_Type;
4119 case Set_kind:
4120 case SetComp_kind:
4121 return &PySet_Type;
4122 case GeneratorExp_kind:
4123 return &PyGen_Type;
4124 case Lambda_kind:
4125 return &PyFunction_Type;
4126 case JoinedStr_kind:
4127 case FormattedValue_kind:
4128 return &PyUnicode_Type;
4129 case Constant_kind:
Victor Stinnera102ed72020-02-07 02:24:48 +01004130 return Py_TYPE(e->v.Constant.value);
Serhiy Storchaka62e44812019-02-16 08:12:19 +02004131 default:
4132 return NULL;
4133 }
4134}
4135
4136static int
4137check_caller(struct compiler *c, expr_ty e)
4138{
4139 switch (e->kind) {
4140 case Constant_kind:
4141 case Tuple_kind:
4142 case List_kind:
4143 case ListComp_kind:
4144 case Dict_kind:
4145 case DictComp_kind:
4146 case Set_kind:
4147 case SetComp_kind:
4148 case GeneratorExp_kind:
4149 case JoinedStr_kind:
4150 case FormattedValue_kind:
4151 return compiler_warn(c, "'%.200s' object is not callable; "
4152 "perhaps you missed a comma?",
4153 infer_type(e)->tp_name);
4154 default:
4155 return 1;
4156 }
4157}
4158
4159static int
4160check_subscripter(struct compiler *c, expr_ty e)
4161{
4162 PyObject *v;
4163
4164 switch (e->kind) {
4165 case Constant_kind:
4166 v = e->v.Constant.value;
4167 if (!(v == Py_None || v == Py_Ellipsis ||
4168 PyLong_Check(v) || PyFloat_Check(v) || PyComplex_Check(v) ||
4169 PyAnySet_Check(v)))
4170 {
4171 return 1;
4172 }
4173 /* fall through */
4174 case Set_kind:
4175 case SetComp_kind:
4176 case GeneratorExp_kind:
4177 case Lambda_kind:
4178 return compiler_warn(c, "'%.200s' object is not subscriptable; "
4179 "perhaps you missed a comma?",
4180 infer_type(e)->tp_name);
4181 default:
4182 return 1;
4183 }
4184}
4185
4186static int
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02004187check_index(struct compiler *c, expr_ty e, expr_ty s)
Serhiy Storchaka62e44812019-02-16 08:12:19 +02004188{
4189 PyObject *v;
4190
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02004191 PyTypeObject *index_type = infer_type(s);
Serhiy Storchaka62e44812019-02-16 08:12:19 +02004192 if (index_type == NULL
4193 || PyType_FastSubclass(index_type, Py_TPFLAGS_LONG_SUBCLASS)
4194 || index_type == &PySlice_Type) {
4195 return 1;
4196 }
4197
4198 switch (e->kind) {
4199 case Constant_kind:
4200 v = e->v.Constant.value;
4201 if (!(PyUnicode_Check(v) || PyBytes_Check(v) || PyTuple_Check(v))) {
4202 return 1;
4203 }
4204 /* fall through */
4205 case Tuple_kind:
4206 case List_kind:
4207 case ListComp_kind:
4208 case JoinedStr_kind:
4209 case FormattedValue_kind:
4210 return compiler_warn(c, "%.200s indices must be integers or slices, "
4211 "not %.200s; "
4212 "perhaps you missed a comma?",
4213 infer_type(e)->tp_name,
4214 index_type->tp_name);
4215 default:
4216 return 1;
4217 }
4218}
4219
Zackery Spytz97f5de02019-03-22 01:30:32 -06004220// Return 1 if the method call was optimized, -1 if not, and 0 on error.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004221static int
Yury Selivanovf2392132016-12-13 19:03:51 -05004222maybe_optimize_method_call(struct compiler *c, expr_ty e)
4223{
4224 Py_ssize_t argsl, i;
4225 expr_ty meth = e->v.Call.func;
Pablo Galindoa5634c42020-09-16 19:42:00 +01004226 asdl_expr_seq *args = e->v.Call.args;
Yury Selivanovf2392132016-12-13 19:03:51 -05004227
4228 /* Check that the call node is an attribute access, and that
4229 the call doesn't have keyword parameters. */
4230 if (meth->kind != Attribute_kind || meth->v.Attribute.ctx != Load ||
Mark Shannon11e0b292021-04-15 14:28:56 +01004231 asdl_seq_LEN(e->v.Call.keywords)) {
Yury Selivanovf2392132016-12-13 19:03:51 -05004232 return -1;
Mark Shannon11e0b292021-04-15 14:28:56 +01004233 }
4234 /* Check that there aren't too many arguments */
Yury Selivanovf2392132016-12-13 19:03:51 -05004235 argsl = asdl_seq_LEN(args);
Mark Shannon11e0b292021-04-15 14:28:56 +01004236 if (argsl >= STACK_USE_GUIDELINE) {
4237 return -1;
4238 }
4239 /* Check that there are no *varargs types of arguments. */
Yury Selivanovf2392132016-12-13 19:03:51 -05004240 for (i = 0; i < argsl; i++) {
4241 expr_ty elt = asdl_seq_GET(args, i);
4242 if (elt->kind == Starred_kind) {
4243 return -1;
4244 }
4245 }
4246
4247 /* Alright, we can optimize the code. */
4248 VISIT(c, expr, meth->v.Attribute.value);
Mark Shannond48848c2021-03-14 18:01:30 +00004249 int old_lineno = c->u->u_lineno;
4250 c->u->u_lineno = meth->end_lineno;
Yury Selivanovf2392132016-12-13 19:03:51 -05004251 ADDOP_NAME(c, LOAD_METHOD, meth->v.Attribute.attr, names);
4252 VISIT_SEQ(c, expr, e->v.Call.args);
4253 ADDOP_I(c, CALL_METHOD, asdl_seq_LEN(e->v.Call.args));
Mark Shannond48848c2021-03-14 18:01:30 +00004254 c->u->u_lineno = old_lineno;
Yury Selivanovf2392132016-12-13 19:03:51 -05004255 return 1;
4256}
4257
4258static int
Pablo Galindoa5634c42020-09-16 19:42:00 +01004259validate_keywords(struct compiler *c, asdl_keyword_seq *keywords)
Zackery Spytz08050e92020-04-06 00:47:47 -06004260{
4261 Py_ssize_t nkeywords = asdl_seq_LEN(keywords);
4262 for (Py_ssize_t i = 0; i < nkeywords; i++) {
Pablo Galindo254ec782020-04-03 20:37:13 +01004263 keyword_ty key = ((keyword_ty)asdl_seq_GET(keywords, i));
4264 if (key->arg == NULL) {
4265 continue;
4266 }
Pablo Galindoc5fc1562020-04-22 23:29:27 +01004267 if (forbidden_name(c, key->arg, Store)) {
4268 return -1;
4269 }
Zackery Spytz08050e92020-04-06 00:47:47 -06004270 for (Py_ssize_t j = i + 1; j < nkeywords; j++) {
Pablo Galindo254ec782020-04-03 20:37:13 +01004271 keyword_ty other = ((keyword_ty)asdl_seq_GET(keywords, j));
4272 if (other->arg && !PyUnicode_Compare(key->arg, other->arg)) {
Miss Islington (bot)13de28f2021-05-07 13:40:09 -07004273 SET_LOC(c, other);
Brandt Bucher145bf262021-02-26 14:51:55 -08004274 compiler_error(c, "keyword argument repeated: %U", key->arg);
Pablo Galindo254ec782020-04-03 20:37:13 +01004275 return -1;
4276 }
4277 }
4278 }
4279 return 0;
4280}
4281
4282static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004283compiler_call(struct compiler *c, expr_ty e)
4284{
Zackery Spytz97f5de02019-03-22 01:30:32 -06004285 int ret = maybe_optimize_method_call(c, e);
4286 if (ret >= 0) {
4287 return ret;
4288 }
Serhiy Storchaka62e44812019-02-16 08:12:19 +02004289 if (!check_caller(c, e->v.Call.func)) {
4290 return 0;
4291 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004292 VISIT(c, expr, e->v.Call.func);
4293 return compiler_call_helper(c, 0,
4294 e->v.Call.args,
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004295 e->v.Call.keywords);
Guido van Rossum52cc1d82007-03-18 15:41:51 +00004296}
4297
Eric V. Smith235a6f02015-09-19 14:51:32 -04004298static int
4299compiler_joined_str(struct compiler *c, expr_ty e)
4300{
Mark Shannon11e0b292021-04-15 14:28:56 +01004301
4302 Py_ssize_t value_count = asdl_seq_LEN(e->v.JoinedStr.values);
4303 if (value_count > STACK_USE_GUIDELINE) {
4304 ADDOP_LOAD_CONST_NEW(c, _PyUnicode_FromASCII("", 0));
4305 PyObject *join = _PyUnicode_FromASCII("join", 4);
4306 if (join == NULL) {
4307 return 0;
4308 }
4309 ADDOP_NAME(c, LOAD_METHOD, join, names);
4310 Py_DECREF(join);
4311 ADDOP_I(c, BUILD_LIST, 0);
4312 for (Py_ssize_t i = 0; i < asdl_seq_LEN(e->v.JoinedStr.values); i++) {
4313 VISIT(c, expr, asdl_seq_GET(e->v.JoinedStr.values, i));
4314 ADDOP_I(c, LIST_APPEND, 1);
4315 }
4316 ADDOP_I(c, CALL_METHOD, 1);
4317 }
4318 else {
4319 VISIT_SEQ(c, expr, e->v.JoinedStr.values);
4320 if (asdl_seq_LEN(e->v.JoinedStr.values) != 1) {
4321 ADDOP_I(c, BUILD_STRING, asdl_seq_LEN(e->v.JoinedStr.values));
4322 }
4323 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04004324 return 1;
4325}
4326
Eric V. Smitha78c7952015-11-03 12:45:05 -05004327/* Used to implement f-strings. Format a single value. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04004328static int
4329compiler_formatted_value(struct compiler *c, expr_ty e)
4330{
Eric V. Smitha78c7952015-11-03 12:45:05 -05004331 /* Our oparg encodes 2 pieces of information: the conversion
4332 character, and whether or not a format_spec was provided.
Eric V. Smith235a6f02015-09-19 14:51:32 -04004333
Eric V. Smith9a4135e2019-05-08 16:28:48 -04004334 Convert the conversion char to 3 bits:
4335 : 000 0x0 FVC_NONE The default if nothing specified.
Eric V. Smitha78c7952015-11-03 12:45:05 -05004336 !s : 001 0x1 FVC_STR
4337 !r : 010 0x2 FVC_REPR
4338 !a : 011 0x3 FVC_ASCII
Eric V. Smith235a6f02015-09-19 14:51:32 -04004339
Eric V. Smitha78c7952015-11-03 12:45:05 -05004340 next bit is whether or not we have a format spec:
4341 yes : 100 0x4
4342 no : 000 0x0
4343 */
Eric V. Smith235a6f02015-09-19 14:51:32 -04004344
Eric V. Smith9a4135e2019-05-08 16:28:48 -04004345 int conversion = e->v.FormattedValue.conversion;
Eric V. Smitha78c7952015-11-03 12:45:05 -05004346 int oparg;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004347
Eric V. Smith9a4135e2019-05-08 16:28:48 -04004348 /* The expression to be formatted. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04004349 VISIT(c, expr, e->v.FormattedValue.value);
4350
Eric V. Smith9a4135e2019-05-08 16:28:48 -04004351 switch (conversion) {
Eric V. Smitha78c7952015-11-03 12:45:05 -05004352 case 's': oparg = FVC_STR; break;
4353 case 'r': oparg = FVC_REPR; break;
4354 case 'a': oparg = FVC_ASCII; break;
4355 case -1: oparg = FVC_NONE; break;
4356 default:
Eric V. Smith9a4135e2019-05-08 16:28:48 -04004357 PyErr_Format(PyExc_SystemError,
4358 "Unrecognized conversion character %d", conversion);
Eric V. Smitha78c7952015-11-03 12:45:05 -05004359 return 0;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004360 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04004361 if (e->v.FormattedValue.format_spec) {
Eric V. Smitha78c7952015-11-03 12:45:05 -05004362 /* Evaluate the format spec, and update our opcode arg. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04004363 VISIT(c, expr, e->v.FormattedValue.format_spec);
Eric V. Smitha78c7952015-11-03 12:45:05 -05004364 oparg |= FVS_HAVE_SPEC;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004365 }
4366
Eric V. Smitha78c7952015-11-03 12:45:05 -05004367 /* And push our opcode and oparg */
4368 ADDOP_I(c, FORMAT_VALUE, oparg);
Eric V. Smith9a4135e2019-05-08 16:28:48 -04004369
Eric V. Smith235a6f02015-09-19 14:51:32 -04004370 return 1;
4371}
4372
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03004373static int
Pablo Galindoa5634c42020-09-16 19:42:00 +01004374compiler_subkwargs(struct compiler *c, asdl_keyword_seq *keywords, Py_ssize_t begin, Py_ssize_t end)
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03004375{
4376 Py_ssize_t i, n = end - begin;
4377 keyword_ty kw;
4378 PyObject *keys, *key;
4379 assert(n > 0);
Mark Shannon11e0b292021-04-15 14:28:56 +01004380 int big = n*2 > STACK_USE_GUIDELINE;
4381 if (n > 1 && !big) {
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03004382 for (i = begin; i < end; i++) {
4383 kw = asdl_seq_GET(keywords, i);
4384 VISIT(c, expr, kw->value);
4385 }
4386 keys = PyTuple_New(n);
4387 if (keys == NULL) {
4388 return 0;
4389 }
4390 for (i = begin; i < end; i++) {
4391 key = ((keyword_ty) asdl_seq_GET(keywords, i))->arg;
4392 Py_INCREF(key);
4393 PyTuple_SET_ITEM(keys, i - begin, key);
4394 }
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03004395 ADDOP_LOAD_CONST_NEW(c, keys);
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03004396 ADDOP_I(c, BUILD_CONST_KEY_MAP, n);
Mark Shannon11e0b292021-04-15 14:28:56 +01004397 return 1;
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03004398 }
Mark Shannon11e0b292021-04-15 14:28:56 +01004399 if (big) {
4400 ADDOP_I_NOLINE(c, BUILD_MAP, 0);
4401 }
4402 for (i = begin; i < end; i++) {
4403 kw = asdl_seq_GET(keywords, i);
4404 ADDOP_LOAD_CONST(c, kw->arg);
4405 VISIT(c, expr, kw->value);
4406 if (big) {
4407 ADDOP_I_NOLINE(c, MAP_ADD, 1);
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03004408 }
Mark Shannon11e0b292021-04-15 14:28:56 +01004409 }
4410 if (!big) {
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03004411 ADDOP_I(c, BUILD_MAP, n);
4412 }
4413 return 1;
4414}
4415
Guido van Rossum52cc1d82007-03-18 15:41:51 +00004416/* shared code between compiler_call and compiler_class */
4417static int
4418compiler_call_helper(struct compiler *c,
Victor Stinner976bb402016-03-23 11:36:19 +01004419 int n, /* Args already pushed */
Pablo Galindoa5634c42020-09-16 19:42:00 +01004420 asdl_expr_seq *args,
4421 asdl_keyword_seq *keywords)
Guido van Rossum52cc1d82007-03-18 15:41:51 +00004422{
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004423 Py_ssize_t i, nseen, nelts, nkwelts;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004424
Pablo Galindo254ec782020-04-03 20:37:13 +01004425 if (validate_keywords(c, keywords) == -1) {
4426 return 0;
4427 }
4428
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004429 nelts = asdl_seq_LEN(args);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004430 nkwelts = asdl_seq_LEN(keywords);
4431
Mark Shannon11e0b292021-04-15 14:28:56 +01004432 if (nelts + nkwelts*2 > STACK_USE_GUIDELINE) {
4433 goto ex_call;
4434 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004435 for (i = 0; i < nelts; i++) {
4436 expr_ty elt = asdl_seq_GET(args, i);
4437 if (elt->kind == Starred_kind) {
Mark Shannon13bc1392020-01-23 09:25:17 +00004438 goto ex_call;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004439 }
Mark Shannon13bc1392020-01-23 09:25:17 +00004440 }
4441 for (i = 0; i < nkwelts; i++) {
4442 keyword_ty kw = asdl_seq_GET(keywords, i);
4443 if (kw->arg == NULL) {
4444 goto ex_call;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004445 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004446 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004447
Mark Shannon13bc1392020-01-23 09:25:17 +00004448 /* No * or ** args, so can use faster calling sequence */
4449 for (i = 0; i < nelts; i++) {
4450 expr_ty elt = asdl_seq_GET(args, i);
4451 assert(elt->kind != Starred_kind);
4452 VISIT(c, expr, elt);
4453 }
4454 if (nkwelts) {
4455 PyObject *names;
4456 VISIT_SEQ(c, keyword, keywords);
4457 names = PyTuple_New(nkwelts);
4458 if (names == NULL) {
4459 return 0;
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004460 }
Mark Shannon13bc1392020-01-23 09:25:17 +00004461 for (i = 0; i < nkwelts; i++) {
4462 keyword_ty kw = asdl_seq_GET(keywords, i);
4463 Py_INCREF(kw->arg);
4464 PyTuple_SET_ITEM(names, i, kw->arg);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004465 }
Mark Shannon13bc1392020-01-23 09:25:17 +00004466 ADDOP_LOAD_CONST_NEW(c, names);
4467 ADDOP_I(c, CALL_FUNCTION_KW, n + nelts + nkwelts);
4468 return 1;
4469 }
4470 else {
4471 ADDOP_I(c, CALL_FUNCTION, n + nelts);
4472 return 1;
4473 }
4474
4475ex_call:
4476
4477 /* Do positional arguments. */
4478 if (n ==0 && nelts == 1 && ((expr_ty)asdl_seq_GET(args, 0))->kind == Starred_kind) {
4479 VISIT(c, expr, ((expr_ty)asdl_seq_GET(args, 0))->v.Starred.value);
4480 }
4481 else if (starunpack_helper(c, args, n, BUILD_LIST,
4482 LIST_APPEND, LIST_EXTEND, 1) == 0) {
4483 return 0;
4484 }
4485 /* Then keyword arguments */
4486 if (nkwelts) {
Mark Shannon8a4cd702020-01-27 09:57:45 +00004487 /* Has a new dict been pushed */
4488 int have_dict = 0;
Mark Shannon13bc1392020-01-23 09:25:17 +00004489
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004490 nseen = 0; /* the number of keyword arguments on the stack following */
4491 for (i = 0; i < nkwelts; i++) {
4492 keyword_ty kw = asdl_seq_GET(keywords, i);
4493 if (kw->arg == NULL) {
4494 /* A keyword argument unpacking. */
4495 if (nseen) {
Mark Shannon8a4cd702020-01-27 09:57:45 +00004496 if (!compiler_subkwargs(c, keywords, i - nseen, i)) {
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03004497 return 0;
Mark Shannon8a4cd702020-01-27 09:57:45 +00004498 }
Mark Shannondb64f122020-06-01 10:42:42 +01004499 if (have_dict) {
4500 ADDOP_I(c, DICT_MERGE, 1);
4501 }
Mark Shannon8a4cd702020-01-27 09:57:45 +00004502 have_dict = 1;
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004503 nseen = 0;
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03004504 }
Mark Shannon8a4cd702020-01-27 09:57:45 +00004505 if (!have_dict) {
4506 ADDOP_I(c, BUILD_MAP, 0);
4507 have_dict = 1;
4508 }
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004509 VISIT(c, expr, kw->value);
Mark Shannon8a4cd702020-01-27 09:57:45 +00004510 ADDOP_I(c, DICT_MERGE, 1);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004511 }
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004512 else {
4513 nseen++;
4514 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004515 }
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004516 if (nseen) {
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03004517 /* Pack up any trailing keyword arguments. */
Mark Shannon8a4cd702020-01-27 09:57:45 +00004518 if (!compiler_subkwargs(c, keywords, nkwelts - nseen, nkwelts)) {
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03004519 return 0;
Mark Shannon8a4cd702020-01-27 09:57:45 +00004520 }
4521 if (have_dict) {
4522 ADDOP_I(c, DICT_MERGE, 1);
4523 }
4524 have_dict = 1;
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03004525 }
Mark Shannon8a4cd702020-01-27 09:57:45 +00004526 assert(have_dict);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004527 }
Mark Shannon13bc1392020-01-23 09:25:17 +00004528 ADDOP_I(c, CALL_FUNCTION_EX, nkwelts > 0);
4529 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004530}
4531
Nick Coghlan650f0d02007-04-15 12:05:43 +00004532
4533/* List and set comprehensions and generator expressions work by creating a
4534 nested function to perform the actual iteration. This means that the
4535 iteration variables don't leak into the current scope.
4536 The defined function is called immediately following its definition, with the
4537 result of that call being the result of the expression.
4538 The LC/SC version returns the populated container, while the GE version is
4539 flagged in symtable.c as a generator, so it returns the generator object
4540 when the function is called.
Nick Coghlan650f0d02007-04-15 12:05:43 +00004541
4542 Possible cleanups:
4543 - iterate over the generator sequence instead of using recursion
4544*/
4545
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004546
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004547static int
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004548compiler_comprehension_generator(struct compiler *c,
Pablo Galindoa5634c42020-09-16 19:42:00 +01004549 asdl_comprehension_seq *generators, int gen_index,
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004550 int depth,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004551 expr_ty elt, expr_ty val, int type)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004552{
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004553 comprehension_ty gen;
4554 gen = (comprehension_ty)asdl_seq_GET(generators, gen_index);
4555 if (gen->is_async) {
4556 return compiler_async_comprehension_generator(
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004557 c, generators, gen_index, depth, elt, val, type);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004558 } else {
4559 return compiler_sync_comprehension_generator(
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004560 c, generators, gen_index, depth, elt, val, type);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004561 }
4562}
4563
4564static int
4565compiler_sync_comprehension_generator(struct compiler *c,
Pablo Galindoa5634c42020-09-16 19:42:00 +01004566 asdl_comprehension_seq *generators, int gen_index,
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004567 int depth,
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004568 expr_ty elt, expr_ty val, int type)
4569{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004570 /* generate code for the iterator, then each of the ifs,
4571 and then write to the element */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004572
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004573 comprehension_ty gen;
4574 basicblock *start, *anchor, *skip, *if_cleanup;
Victor Stinnerad9a0662013-11-19 22:23:20 +01004575 Py_ssize_t i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004576
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004577 start = compiler_new_block(c);
4578 skip = compiler_new_block(c);
4579 if_cleanup = compiler_new_block(c);
4580 anchor = compiler_new_block(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004581
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004582 if (start == NULL || skip == NULL || if_cleanup == NULL ||
4583 anchor == NULL)
4584 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004585
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004586 gen = (comprehension_ty)asdl_seq_GET(generators, gen_index);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004587
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004588 if (gen_index == 0) {
4589 /* Receive outermost iter as an implicit argument */
4590 c->u->u_argcount = 1;
4591 ADDOP_I(c, LOAD_FAST, 0);
4592 }
4593 else {
4594 /* Sub-iter - calculate on the fly */
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004595 /* Fast path for the temporary variable assignment idiom:
4596 for y in [f(x)]
4597 */
Pablo Galindoa5634c42020-09-16 19:42:00 +01004598 asdl_expr_seq *elts;
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004599 switch (gen->iter->kind) {
4600 case List_kind:
4601 elts = gen->iter->v.List.elts;
4602 break;
4603 case Tuple_kind:
4604 elts = gen->iter->v.Tuple.elts;
4605 break;
4606 default:
4607 elts = NULL;
4608 }
4609 if (asdl_seq_LEN(elts) == 1) {
4610 expr_ty elt = asdl_seq_GET(elts, 0);
4611 if (elt->kind != Starred_kind) {
4612 VISIT(c, expr, elt);
4613 start = NULL;
4614 }
4615 }
4616 if (start) {
4617 VISIT(c, expr, gen->iter);
4618 ADDOP(c, GET_ITER);
4619 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004620 }
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004621 if (start) {
4622 depth++;
4623 compiler_use_next_block(c, start);
Mark Shannon582aaf12020-08-04 17:30:11 +01004624 ADDOP_JUMP(c, FOR_ITER, anchor);
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004625 NEXT_BLOCK(c);
4626 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004627 VISIT(c, expr, gen->target);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004628
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004629 /* XXX this needs to be cleaned up...a lot! */
4630 n = asdl_seq_LEN(gen->ifs);
4631 for (i = 0; i < n; i++) {
4632 expr_ty e = (expr_ty)asdl_seq_GET(gen->ifs, i);
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03004633 if (!compiler_jump_if(c, e, if_cleanup, 0))
4634 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004635 NEXT_BLOCK(c);
4636 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004637
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004638 if (++gen_index < asdl_seq_LEN(generators))
4639 if (!compiler_comprehension_generator(c,
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004640 generators, gen_index, depth,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004641 elt, val, type))
4642 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004643
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004644 /* only append after the last for generator */
4645 if (gen_index >= asdl_seq_LEN(generators)) {
4646 /* comprehension specific code */
4647 switch (type) {
4648 case COMP_GENEXP:
4649 VISIT(c, expr, elt);
4650 ADDOP(c, YIELD_VALUE);
4651 ADDOP(c, POP_TOP);
4652 break;
4653 case COMP_LISTCOMP:
4654 VISIT(c, expr, elt);
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004655 ADDOP_I(c, LIST_APPEND, depth + 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004656 break;
4657 case COMP_SETCOMP:
4658 VISIT(c, expr, elt);
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004659 ADDOP_I(c, SET_ADD, depth + 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004660 break;
4661 case COMP_DICTCOMP:
Jörn Heisslerc8a35412019-06-22 16:40:55 +02004662 /* With '{k: v}', k is evaluated before v, so we do
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004663 the same. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004664 VISIT(c, expr, elt);
Jörn Heisslerc8a35412019-06-22 16:40:55 +02004665 VISIT(c, expr, val);
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004666 ADDOP_I(c, MAP_ADD, depth + 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004667 break;
4668 default:
4669 return 0;
4670 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004671
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004672 compiler_use_next_block(c, skip);
4673 }
4674 compiler_use_next_block(c, if_cleanup);
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004675 if (start) {
Mark Shannon582aaf12020-08-04 17:30:11 +01004676 ADDOP_JUMP(c, JUMP_ABSOLUTE, start);
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004677 compiler_use_next_block(c, anchor);
4678 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004679
4680 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004681}
4682
4683static int
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004684compiler_async_comprehension_generator(struct compiler *c,
Pablo Galindoa5634c42020-09-16 19:42:00 +01004685 asdl_comprehension_seq *generators, int gen_index,
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004686 int depth,
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004687 expr_ty elt, expr_ty val, int type)
4688{
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004689 comprehension_ty gen;
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02004690 basicblock *start, *if_cleanup, *except;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004691 Py_ssize_t i, n;
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02004692 start = compiler_new_block(c);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004693 except = compiler_new_block(c);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004694 if_cleanup = compiler_new_block(c);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004695
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02004696 if (start == NULL || if_cleanup == NULL || except == NULL) {
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004697 return 0;
4698 }
4699
4700 gen = (comprehension_ty)asdl_seq_GET(generators, gen_index);
4701
4702 if (gen_index == 0) {
4703 /* Receive outermost iter as an implicit argument */
4704 c->u->u_argcount = 1;
4705 ADDOP_I(c, LOAD_FAST, 0);
4706 }
4707 else {
4708 /* Sub-iter - calculate on the fly */
4709 VISIT(c, expr, gen->iter);
4710 ADDOP(c, GET_AITER);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004711 }
4712
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02004713 compiler_use_next_block(c, start);
tomKPZ7a7ba3d2021-04-07 07:43:45 -07004714 /* Runtime will push a block here, so we need to account for that */
4715 if (!compiler_push_fblock(c, ASYNC_COMPREHENSION_GENERATOR, start,
4716 NULL, NULL)) {
4717 return 0;
4718 }
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004719
Mark Shannon582aaf12020-08-04 17:30:11 +01004720 ADDOP_JUMP(c, SETUP_FINALLY, except);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004721 ADDOP(c, GET_ANEXT);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03004722 ADDOP_LOAD_CONST(c, Py_None);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004723 ADDOP(c, YIELD_FROM);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004724 ADDOP(c, POP_BLOCK);
Serhiy Storchaka24d32012018-03-10 18:22:34 +02004725 VISIT(c, expr, gen->target);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004726
4727 n = asdl_seq_LEN(gen->ifs);
4728 for (i = 0; i < n; i++) {
4729 expr_ty e = (expr_ty)asdl_seq_GET(gen->ifs, i);
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03004730 if (!compiler_jump_if(c, e, if_cleanup, 0))
4731 return 0;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004732 NEXT_BLOCK(c);
4733 }
4734
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004735 depth++;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004736 if (++gen_index < asdl_seq_LEN(generators))
4737 if (!compiler_comprehension_generator(c,
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004738 generators, gen_index, depth,
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004739 elt, val, type))
4740 return 0;
4741
4742 /* only append after the last for generator */
4743 if (gen_index >= asdl_seq_LEN(generators)) {
4744 /* comprehension specific code */
4745 switch (type) {
4746 case COMP_GENEXP:
4747 VISIT(c, expr, elt);
4748 ADDOP(c, YIELD_VALUE);
4749 ADDOP(c, POP_TOP);
4750 break;
4751 case COMP_LISTCOMP:
4752 VISIT(c, expr, elt);
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004753 ADDOP_I(c, LIST_APPEND, depth + 1);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004754 break;
4755 case COMP_SETCOMP:
4756 VISIT(c, expr, elt);
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004757 ADDOP_I(c, SET_ADD, depth + 1);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004758 break;
4759 case COMP_DICTCOMP:
Jörn Heisslerc8a35412019-06-22 16:40:55 +02004760 /* With '{k: v}', k is evaluated before v, so we do
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004761 the same. */
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004762 VISIT(c, expr, elt);
Jörn Heisslerc8a35412019-06-22 16:40:55 +02004763 VISIT(c, expr, val);
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004764 ADDOP_I(c, MAP_ADD, depth + 1);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004765 break;
4766 default:
4767 return 0;
4768 }
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004769 }
4770 compiler_use_next_block(c, if_cleanup);
Mark Shannon582aaf12020-08-04 17:30:11 +01004771 ADDOP_JUMP(c, JUMP_ABSOLUTE, start);
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02004772
tomKPZ7a7ba3d2021-04-07 07:43:45 -07004773 compiler_pop_fblock(c, ASYNC_COMPREHENSION_GENERATOR, start);
4774
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02004775 compiler_use_next_block(c, except);
4776 ADDOP(c, END_ASYNC_FOR);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004777
4778 return 1;
4779}
4780
4781static int
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004782compiler_comprehension(struct compiler *c, expr_ty e, int type,
Pablo Galindoa5634c42020-09-16 19:42:00 +01004783 identifier name, asdl_comprehension_seq *generators, expr_ty elt,
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004784 expr_ty val)
Nick Coghlan650f0d02007-04-15 12:05:43 +00004785{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004786 PyCodeObject *co = NULL;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004787 comprehension_ty outermost;
Antoine Pitrou86a36b52011-11-25 18:56:07 +01004788 PyObject *qualname = NULL;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004789 int is_async_generator = 0;
Matthias Bussonnierbd461742020-07-06 14:26:52 -07004790 int top_level_await = IS_TOP_LEVEL_AWAIT(c);
Nick Coghlan650f0d02007-04-15 12:05:43 +00004791
Matthias Bussonnierbd461742020-07-06 14:26:52 -07004792
Batuhan TaÅŸkaya9052f7a2020-03-19 14:35:44 +03004793 int is_async_function = c->u->u_ste->ste_coroutine;
Nick Coghlan650f0d02007-04-15 12:05:43 +00004794
Batuhan TaÅŸkaya9052f7a2020-03-19 14:35:44 +03004795 outermost = (comprehension_ty) asdl_seq_GET(generators, 0);
Antoine Pitrou86a36b52011-11-25 18:56:07 +01004796 if (!compiler_enter_scope(c, name, COMPILER_SCOPE_COMPREHENSION,
4797 (void *)e, e->lineno))
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004798 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004799 goto error;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004800 }
Mark Shannon7674c832021-06-21 11:47:16 +01004801 SET_LOC(c, e);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004802
4803 is_async_generator = c->u->u_ste->ste_coroutine;
4804
Matthias Bussonnierbd461742020-07-06 14:26:52 -07004805 if (is_async_generator && !is_async_function && type != COMP_GENEXP && !top_level_await) {
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004806 compiler_error(c, "asynchronous comprehension outside of "
4807 "an asynchronous function");
4808 goto error_in_scope;
4809 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00004810
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004811 if (type != COMP_GENEXP) {
4812 int op;
4813 switch (type) {
4814 case COMP_LISTCOMP:
4815 op = BUILD_LIST;
4816 break;
4817 case COMP_SETCOMP:
4818 op = BUILD_SET;
4819 break;
4820 case COMP_DICTCOMP:
4821 op = BUILD_MAP;
4822 break;
4823 default:
4824 PyErr_Format(PyExc_SystemError,
4825 "unknown comprehension type %d", type);
4826 goto error_in_scope;
4827 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00004828
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004829 ADDOP_I(c, op, 0);
4830 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00004831
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004832 if (!compiler_comprehension_generator(c, generators, 0, 0, elt,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004833 val, type))
4834 goto error_in_scope;
Nick Coghlan650f0d02007-04-15 12:05:43 +00004835
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004836 if (type != COMP_GENEXP) {
4837 ADDOP(c, RETURN_VALUE);
4838 }
4839
4840 co = assemble(c, 1);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04004841 qualname = c->u->u_qualname;
4842 Py_INCREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004843 compiler_exit_scope(c);
Matthias Bussonnierbd461742020-07-06 14:26:52 -07004844 if (top_level_await && is_async_generator){
4845 c->u->u_ste->ste_coroutine = 1;
4846 }
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04004847 if (co == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004848 goto error;
4849
Victor Stinnerba7a99d2021-01-30 01:46:44 +01004850 if (!compiler_make_closure(c, co, 0, qualname)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004851 goto error;
Victor Stinnerba7a99d2021-01-30 01:46:44 +01004852 }
Antoine Pitrou86a36b52011-11-25 18:56:07 +01004853 Py_DECREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004854 Py_DECREF(co);
4855
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004856 VISIT(c, expr, outermost->iter);
4857
4858 if (outermost->is_async) {
4859 ADDOP(c, GET_AITER);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004860 } else {
4861 ADDOP(c, GET_ITER);
4862 }
4863
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004864 ADDOP_I(c, CALL_FUNCTION, 1);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004865
4866 if (is_async_generator && type != COMP_GENEXP) {
4867 ADDOP(c, GET_AWAITABLE);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03004868 ADDOP_LOAD_CONST(c, Py_None);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004869 ADDOP(c, YIELD_FROM);
4870 }
4871
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004872 return 1;
Nick Coghlan650f0d02007-04-15 12:05:43 +00004873error_in_scope:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004874 compiler_exit_scope(c);
Nick Coghlan650f0d02007-04-15 12:05:43 +00004875error:
Antoine Pitrou86a36b52011-11-25 18:56:07 +01004876 Py_XDECREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004877 Py_XDECREF(co);
4878 return 0;
Nick Coghlan650f0d02007-04-15 12:05:43 +00004879}
4880
4881static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004882compiler_genexp(struct compiler *c, expr_ty e)
4883{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004884 static identifier name;
4885 if (!name) {
Zackery Spytzf3036392018-04-15 16:12:29 -06004886 name = PyUnicode_InternFromString("<genexpr>");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004887 if (!name)
4888 return 0;
4889 }
4890 assert(e->kind == GeneratorExp_kind);
4891 return compiler_comprehension(c, e, COMP_GENEXP, name,
4892 e->v.GeneratorExp.generators,
4893 e->v.GeneratorExp.elt, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004894}
4895
4896static int
Nick Coghlan650f0d02007-04-15 12:05:43 +00004897compiler_listcomp(struct compiler *c, expr_ty e)
4898{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004899 static identifier name;
4900 if (!name) {
Zackery Spytzf3036392018-04-15 16:12:29 -06004901 name = PyUnicode_InternFromString("<listcomp>");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004902 if (!name)
4903 return 0;
4904 }
4905 assert(e->kind == ListComp_kind);
4906 return compiler_comprehension(c, e, COMP_LISTCOMP, name,
4907 e->v.ListComp.generators,
4908 e->v.ListComp.elt, NULL);
Nick Coghlan650f0d02007-04-15 12:05:43 +00004909}
4910
4911static int
4912compiler_setcomp(struct compiler *c, expr_ty e)
4913{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004914 static identifier name;
4915 if (!name) {
Zackery Spytzf3036392018-04-15 16:12:29 -06004916 name = PyUnicode_InternFromString("<setcomp>");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004917 if (!name)
4918 return 0;
4919 }
4920 assert(e->kind == SetComp_kind);
4921 return compiler_comprehension(c, e, COMP_SETCOMP, name,
4922 e->v.SetComp.generators,
4923 e->v.SetComp.elt, NULL);
Guido van Rossum992d4a32007-07-11 13:09:30 +00004924}
4925
4926
4927static int
4928compiler_dictcomp(struct compiler *c, expr_ty e)
4929{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004930 static identifier name;
4931 if (!name) {
Zackery Spytzf3036392018-04-15 16:12:29 -06004932 name = PyUnicode_InternFromString("<dictcomp>");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004933 if (!name)
4934 return 0;
4935 }
4936 assert(e->kind == DictComp_kind);
4937 return compiler_comprehension(c, e, COMP_DICTCOMP, name,
4938 e->v.DictComp.generators,
4939 e->v.DictComp.key, e->v.DictComp.value);
Nick Coghlan650f0d02007-04-15 12:05:43 +00004940}
4941
4942
4943static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004944compiler_visit_keyword(struct compiler *c, keyword_ty k)
4945{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004946 VISIT(c, expr, k->value);
4947 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004948}
4949
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004950/* Test whether expression is constant. For constants, report
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004951 whether they are true or false.
4952
4953 Return values: 1 for true, 0 for false, -1 for non-constant.
4954 */
4955
4956static int
Mark Shannonfee55262019-11-21 09:11:43 +00004957compiler_with_except_finish(struct compiler *c) {
4958 basicblock *exit;
4959 exit = compiler_new_block(c);
4960 if (exit == NULL)
4961 return 0;
Mark Shannon582aaf12020-08-04 17:30:11 +01004962 ADDOP_JUMP(c, POP_JUMP_IF_TRUE, exit);
Mark Shannon266b4622020-11-17 19:30:14 +00004963 NEXT_BLOCK(c);
Mark Shannonbf353f32020-12-17 13:55:28 +00004964 ADDOP_I(c, RERAISE, 1);
Mark Shannonfee55262019-11-21 09:11:43 +00004965 compiler_use_next_block(c, exit);
4966 ADDOP(c, POP_TOP);
4967 ADDOP(c, POP_TOP);
4968 ADDOP(c, POP_TOP);
4969 ADDOP(c, POP_EXCEPT);
4970 ADDOP(c, POP_TOP);
4971 return 1;
4972}
Yury Selivanov75445082015-05-11 22:57:16 -04004973
4974/*
4975 Implements the async with statement.
4976
4977 The semantics outlined in that PEP are as follows:
4978
4979 async with EXPR as VAR:
4980 BLOCK
4981
4982 It is implemented roughly as:
4983
4984 context = EXPR
4985 exit = context.__aexit__ # not calling it
4986 value = await context.__aenter__()
4987 try:
4988 VAR = value # if VAR present in the syntax
4989 BLOCK
4990 finally:
4991 if an exception was raised:
Serhiy Storchakaec466a12015-06-11 00:09:32 +03004992 exc = copy of (exception, instance, traceback)
Yury Selivanov75445082015-05-11 22:57:16 -04004993 else:
Serhiy Storchakaec466a12015-06-11 00:09:32 +03004994 exc = (None, None, None)
Yury Selivanov75445082015-05-11 22:57:16 -04004995 if not (await exit(*exc)):
4996 raise
4997 */
4998static int
4999compiler_async_with(struct compiler *c, stmt_ty s, int pos)
5000{
Mark Shannonfee55262019-11-21 09:11:43 +00005001 basicblock *block, *final, *exit;
Yury Selivanov75445082015-05-11 22:57:16 -04005002 withitem_ty item = asdl_seq_GET(s->v.AsyncWith.items, pos);
5003
5004 assert(s->kind == AsyncWith_kind);
Pablo Galindo90235812020-03-15 04:29:22 +00005005 if (IS_TOP_LEVEL_AWAIT(c)){
Matthias Bussonnier565b4f12019-05-21 13:12:03 -07005006 c->u->u_ste->ste_coroutine = 1;
5007 } else if (c->u->u_scope_type != COMPILER_SCOPE_ASYNC_FUNCTION){
Zsolt Dollensteine2396502018-04-27 08:58:56 -07005008 return compiler_error(c, "'async with' outside async function");
5009 }
Yury Selivanov75445082015-05-11 22:57:16 -04005010
5011 block = compiler_new_block(c);
Mark Shannonfee55262019-11-21 09:11:43 +00005012 final = compiler_new_block(c);
5013 exit = compiler_new_block(c);
5014 if (!block || !final || !exit)
Yury Selivanov75445082015-05-11 22:57:16 -04005015 return 0;
5016
5017 /* Evaluate EXPR */
5018 VISIT(c, expr, item->context_expr);
5019
5020 ADDOP(c, BEFORE_ASYNC_WITH);
5021 ADDOP(c, GET_AWAITABLE);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005022 ADDOP_LOAD_CONST(c, Py_None);
Yury Selivanov75445082015-05-11 22:57:16 -04005023 ADDOP(c, YIELD_FROM);
5024
Mark Shannon582aaf12020-08-04 17:30:11 +01005025 ADDOP_JUMP(c, SETUP_ASYNC_WITH, final);
Yury Selivanov75445082015-05-11 22:57:16 -04005026
5027 /* SETUP_ASYNC_WITH pushes a finally block. */
5028 compiler_use_next_block(c, block);
Mark Shannon5979e812021-04-30 14:32:47 +01005029 if (!compiler_push_fblock(c, ASYNC_WITH, block, final, s)) {
Yury Selivanov75445082015-05-11 22:57:16 -04005030 return 0;
5031 }
5032
5033 if (item->optional_vars) {
5034 VISIT(c, expr, item->optional_vars);
5035 }
5036 else {
5037 /* Discard result from context.__aenter__() */
5038 ADDOP(c, POP_TOP);
5039 }
5040
5041 pos++;
5042 if (pos == asdl_seq_LEN(s->v.AsyncWith.items))
5043 /* BLOCK code */
5044 VISIT_SEQ(c, stmt, s->v.AsyncWith.body)
5045 else if (!compiler_async_with(c, s, pos))
5046 return 0;
5047
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02005048 compiler_pop_fblock(c, ASYNC_WITH, block);
Mark Shannonfee55262019-11-21 09:11:43 +00005049 ADDOP(c, POP_BLOCK);
5050 /* End of body; start the cleanup */
Yury Selivanov75445082015-05-11 22:57:16 -04005051
Mark Shannonfee55262019-11-21 09:11:43 +00005052 /* For successful outcome:
5053 * call __exit__(None, None, None)
5054 */
Mark Shannon5979e812021-04-30 14:32:47 +01005055 SET_LOC(c, s);
Mark Shannonfee55262019-11-21 09:11:43 +00005056 if(!compiler_call_exit_with_nones(c))
Yury Selivanov75445082015-05-11 22:57:16 -04005057 return 0;
Mark Shannonfee55262019-11-21 09:11:43 +00005058 ADDOP(c, GET_AWAITABLE);
5059 ADDOP_O(c, LOAD_CONST, Py_None, consts);
5060 ADDOP(c, YIELD_FROM);
Yury Selivanov75445082015-05-11 22:57:16 -04005061
Mark Shannonfee55262019-11-21 09:11:43 +00005062 ADDOP(c, POP_TOP);
Yury Selivanov75445082015-05-11 22:57:16 -04005063
Mark Shannon582aaf12020-08-04 17:30:11 +01005064 ADDOP_JUMP(c, JUMP_ABSOLUTE, exit);
Mark Shannonfee55262019-11-21 09:11:43 +00005065
5066 /* For exceptional outcome: */
5067 compiler_use_next_block(c, final);
Mark Shannonfee55262019-11-21 09:11:43 +00005068 ADDOP(c, WITH_EXCEPT_START);
Yury Selivanov75445082015-05-11 22:57:16 -04005069 ADDOP(c, GET_AWAITABLE);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005070 ADDOP_LOAD_CONST(c, Py_None);
Yury Selivanov75445082015-05-11 22:57:16 -04005071 ADDOP(c, YIELD_FROM);
Mark Shannonfee55262019-11-21 09:11:43 +00005072 compiler_with_except_finish(c);
Yury Selivanov75445082015-05-11 22:57:16 -04005073
Mark Shannonfee55262019-11-21 09:11:43 +00005074compiler_use_next_block(c, exit);
Yury Selivanov75445082015-05-11 22:57:16 -04005075 return 1;
5076}
5077
5078
Guido van Rossumc2e20742006-02-27 22:32:47 +00005079/*
5080 Implements the with statement from PEP 343.
Guido van Rossumc2e20742006-02-27 22:32:47 +00005081 with EXPR as VAR:
5082 BLOCK
Mark Shannonfee55262019-11-21 09:11:43 +00005083 is implemented as:
5084 <code for EXPR>
5085 SETUP_WITH E
5086 <code to store to VAR> or POP_TOP
5087 <code for BLOCK>
5088 LOAD_CONST (None, None, None)
5089 CALL_FUNCTION_EX 0
5090 JUMP_FORWARD EXIT
5091 E: WITH_EXCEPT_START (calls EXPR.__exit__)
5092 POP_JUMP_IF_TRUE T:
5093 RERAISE
5094 T: POP_TOP * 3 (remove exception from stack)
5095 POP_EXCEPT
5096 POP_TOP
5097 EXIT:
Guido van Rossumc2e20742006-02-27 22:32:47 +00005098 */
Mark Shannonfee55262019-11-21 09:11:43 +00005099
Guido van Rossumc2e20742006-02-27 22:32:47 +00005100static int
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05005101compiler_with(struct compiler *c, stmt_ty s, int pos)
Guido van Rossumc2e20742006-02-27 22:32:47 +00005102{
Mark Shannonfee55262019-11-21 09:11:43 +00005103 basicblock *block, *final, *exit;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05005104 withitem_ty item = asdl_seq_GET(s->v.With.items, pos);
Guido van Rossumc2e20742006-02-27 22:32:47 +00005105
5106 assert(s->kind == With_kind);
5107
Guido van Rossumc2e20742006-02-27 22:32:47 +00005108 block = compiler_new_block(c);
Mark Shannonfee55262019-11-21 09:11:43 +00005109 final = compiler_new_block(c);
5110 exit = compiler_new_block(c);
5111 if (!block || !final || !exit)
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00005112 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00005113
Thomas Wouters477c8d52006-05-27 19:21:47 +00005114 /* Evaluate EXPR */
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05005115 VISIT(c, expr, item->context_expr);
Mark Shannonfee55262019-11-21 09:11:43 +00005116 /* Will push bound __exit__ */
Mark Shannon582aaf12020-08-04 17:30:11 +01005117 ADDOP_JUMP(c, SETUP_WITH, final);
Guido van Rossumc2e20742006-02-27 22:32:47 +00005118
Benjamin Peterson876b2f22009-06-28 03:18:59 +00005119 /* SETUP_WITH pushes a finally block. */
Guido van Rossumc2e20742006-02-27 22:32:47 +00005120 compiler_use_next_block(c, block);
Mark Shannon5979e812021-04-30 14:32:47 +01005121 if (!compiler_push_fblock(c, WITH, block, final, s)) {
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00005122 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00005123 }
5124
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05005125 if (item->optional_vars) {
5126 VISIT(c, expr, item->optional_vars);
Benjamin Peterson876b2f22009-06-28 03:18:59 +00005127 }
5128 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005129 /* Discard result from context.__enter__() */
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00005130 ADDOP(c, POP_TOP);
Guido van Rossumc2e20742006-02-27 22:32:47 +00005131 }
5132
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05005133 pos++;
5134 if (pos == asdl_seq_LEN(s->v.With.items))
5135 /* BLOCK code */
5136 VISIT_SEQ(c, stmt, s->v.With.body)
5137 else if (!compiler_with(c, s, pos))
5138 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00005139
Mark Shannon3bd60352021-01-13 12:05:43 +00005140
5141 /* Mark all following code as artificial */
5142 c->u->u_lineno = -1;
Guido van Rossumc2e20742006-02-27 22:32:47 +00005143 ADDOP(c, POP_BLOCK);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02005144 compiler_pop_fblock(c, WITH, block);
Mark Shannon13bc1392020-01-23 09:25:17 +00005145
Mark Shannonfee55262019-11-21 09:11:43 +00005146 /* End of body; start the cleanup. */
Mark Shannon13bc1392020-01-23 09:25:17 +00005147
Mark Shannonfee55262019-11-21 09:11:43 +00005148 /* For successful outcome:
5149 * call __exit__(None, None, None)
5150 */
Mark Shannon5979e812021-04-30 14:32:47 +01005151 SET_LOC(c, s);
Mark Shannonfee55262019-11-21 09:11:43 +00005152 if (!compiler_call_exit_with_nones(c))
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00005153 return 0;
Mark Shannonfee55262019-11-21 09:11:43 +00005154 ADDOP(c, POP_TOP);
Mark Shannon582aaf12020-08-04 17:30:11 +01005155 ADDOP_JUMP(c, JUMP_FORWARD, exit);
Guido van Rossumc2e20742006-02-27 22:32:47 +00005156
Mark Shannonfee55262019-11-21 09:11:43 +00005157 /* For exceptional outcome: */
5158 compiler_use_next_block(c, final);
Mark Shannonfee55262019-11-21 09:11:43 +00005159 ADDOP(c, WITH_EXCEPT_START);
5160 compiler_with_except_finish(c);
5161
5162 compiler_use_next_block(c, exit);
Guido van Rossumc2e20742006-02-27 22:32:47 +00005163 return 1;
5164}
5165
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005166static int
Serhiy Storchakada8d72c2018-09-17 15:17:29 +03005167compiler_visit_expr1(struct compiler *c, expr_ty e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005168{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005169 switch (e->kind) {
Emily Morehouse8f59ee02019-01-24 16:49:56 -07005170 case NamedExpr_kind:
5171 VISIT(c, expr, e->v.NamedExpr.value);
5172 ADDOP(c, DUP_TOP);
5173 VISIT(c, expr, e->v.NamedExpr.target);
5174 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005175 case BoolOp_kind:
5176 return compiler_boolop(c, e);
5177 case BinOp_kind:
5178 VISIT(c, expr, e->v.BinOp.left);
5179 VISIT(c, expr, e->v.BinOp.right);
Andy Lester76d58772020-03-10 21:18:12 -05005180 ADDOP(c, binop(e->v.BinOp.op));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005181 break;
5182 case UnaryOp_kind:
5183 VISIT(c, expr, e->v.UnaryOp.operand);
5184 ADDOP(c, unaryop(e->v.UnaryOp.op));
5185 break;
5186 case Lambda_kind:
5187 return compiler_lambda(c, e);
5188 case IfExp_kind:
5189 return compiler_ifexp(c, e);
5190 case Dict_kind:
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04005191 return compiler_dict(c, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005192 case Set_kind:
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04005193 return compiler_set(c, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005194 case GeneratorExp_kind:
5195 return compiler_genexp(c, e);
5196 case ListComp_kind:
5197 return compiler_listcomp(c, e);
5198 case SetComp_kind:
5199 return compiler_setcomp(c, e);
5200 case DictComp_kind:
5201 return compiler_dictcomp(c, e);
5202 case Yield_kind:
5203 if (c->u->u_ste->ste_type != FunctionBlock)
5204 return compiler_error(c, "'yield' outside function");
Mark Dickinsonded35ae2012-11-25 14:36:26 +00005205 if (e->v.Yield.value) {
5206 VISIT(c, expr, e->v.Yield.value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005207 }
5208 else {
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005209 ADDOP_LOAD_CONST(c, Py_None);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005210 }
Mark Dickinsonded35ae2012-11-25 14:36:26 +00005211 ADDOP(c, YIELD_VALUE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005212 break;
Mark Dickinsonded35ae2012-11-25 14:36:26 +00005213 case YieldFrom_kind:
5214 if (c->u->u_ste->ste_type != FunctionBlock)
5215 return compiler_error(c, "'yield' outside function");
Yury Selivanov75445082015-05-11 22:57:16 -04005216
5217 if (c->u->u_scope_type == COMPILER_SCOPE_ASYNC_FUNCTION)
5218 return compiler_error(c, "'yield from' inside async function");
5219
Mark Dickinsonded35ae2012-11-25 14:36:26 +00005220 VISIT(c, expr, e->v.YieldFrom.value);
Yury Selivanov5376ba92015-06-22 12:19:30 -04005221 ADDOP(c, GET_YIELD_FROM_ITER);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005222 ADDOP_LOAD_CONST(c, Py_None);
Mark Dickinsonded35ae2012-11-25 14:36:26 +00005223 ADDOP(c, YIELD_FROM);
5224 break;
Yury Selivanov75445082015-05-11 22:57:16 -04005225 case Await_kind:
Pablo Galindo90235812020-03-15 04:29:22 +00005226 if (!IS_TOP_LEVEL_AWAIT(c)){
Matthias Bussonnier565b4f12019-05-21 13:12:03 -07005227 if (c->u->u_ste->ste_type != FunctionBlock){
5228 return compiler_error(c, "'await' outside function");
5229 }
Yury Selivanov75445082015-05-11 22:57:16 -04005230
Victor Stinner331a6a52019-05-27 16:39:22 +02005231 if (c->u->u_scope_type != COMPILER_SCOPE_ASYNC_FUNCTION &&
Matthias Bussonnier565b4f12019-05-21 13:12:03 -07005232 c->u->u_scope_type != COMPILER_SCOPE_COMPREHENSION){
5233 return compiler_error(c, "'await' outside async function");
5234 }
5235 }
Yury Selivanov75445082015-05-11 22:57:16 -04005236
5237 VISIT(c, expr, e->v.Await.value);
5238 ADDOP(c, GET_AWAITABLE);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005239 ADDOP_LOAD_CONST(c, Py_None);
Yury Selivanov75445082015-05-11 22:57:16 -04005240 ADDOP(c, YIELD_FROM);
5241 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005242 case Compare_kind:
5243 return compiler_compare(c, e);
5244 case Call_kind:
5245 return compiler_call(c, e);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01005246 case Constant_kind:
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005247 ADDOP_LOAD_CONST(c, e->v.Constant.value);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01005248 break;
Eric V. Smith235a6f02015-09-19 14:51:32 -04005249 case JoinedStr_kind:
5250 return compiler_joined_str(c, e);
5251 case FormattedValue_kind:
5252 return compiler_formatted_value(c, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005253 /* The following exprs can be assignment targets. */
5254 case Attribute_kind:
Serhiy Storchaka6b975982020-03-17 23:41:08 +02005255 VISIT(c, expr, e->v.Attribute.value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005256 switch (e->v.Attribute.ctx) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005257 case Load:
Mark Shannond48848c2021-03-14 18:01:30 +00005258 {
5259 int old_lineno = c->u->u_lineno;
5260 c->u->u_lineno = e->end_lineno;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005261 ADDOP_NAME(c, LOAD_ATTR, e->v.Attribute.attr, names);
Mark Shannond48848c2021-03-14 18:01:30 +00005262 c->u->u_lineno = old_lineno;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005263 break;
Mark Shannond48848c2021-03-14 18:01:30 +00005264 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005265 case Store:
Mark Shannond48848c2021-03-14 18:01:30 +00005266 if (forbidden_name(c, e->v.Attribute.attr, e->v.Attribute.ctx)) {
Pablo Galindoc5fc1562020-04-22 23:29:27 +01005267 return 0;
Mark Shannond48848c2021-03-14 18:01:30 +00005268 }
5269 int old_lineno = c->u->u_lineno;
5270 c->u->u_lineno = e->end_lineno;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005271 ADDOP_NAME(c, STORE_ATTR, e->v.Attribute.attr, names);
Mark Shannond48848c2021-03-14 18:01:30 +00005272 c->u->u_lineno = old_lineno;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005273 break;
5274 case Del:
5275 ADDOP_NAME(c, DELETE_ATTR, e->v.Attribute.attr, names);
5276 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005277 }
5278 break;
5279 case Subscript_kind:
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005280 return compiler_subscript(c, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005281 case Starred_kind:
5282 switch (e->v.Starred.ctx) {
5283 case Store:
5284 /* In all legitimate cases, the Starred node was already replaced
5285 * by compiler_list/compiler_tuple. XXX: is that okay? */
5286 return compiler_error(c,
5287 "starred assignment target must be in a list or tuple");
5288 default:
5289 return compiler_error(c,
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04005290 "can't use starred expression here");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005291 }
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005292 break;
5293 case Slice_kind:
5294 return compiler_slice(c, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005295 case Name_kind:
5296 return compiler_nameop(c, e->v.Name.id, e->v.Name.ctx);
5297 /* child nodes of List and Tuple will have expr_context set */
5298 case List_kind:
5299 return compiler_list(c, e);
5300 case Tuple_kind:
5301 return compiler_tuple(c, e);
5302 }
5303 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005304}
5305
5306static int
Serhiy Storchakada8d72c2018-09-17 15:17:29 +03005307compiler_visit_expr(struct compiler *c, expr_ty e)
5308{
Serhiy Storchakada8d72c2018-09-17 15:17:29 +03005309 int old_lineno = c->u->u_lineno;
Miss Islington (bot)13de28f2021-05-07 13:40:09 -07005310 int old_end_lineno = c->u->u_end_lineno;
Serhiy Storchakada8d72c2018-09-17 15:17:29 +03005311 int old_col_offset = c->u->u_col_offset;
Miss Islington (bot)13de28f2021-05-07 13:40:09 -07005312 int old_end_col_offset = c->u->u_end_col_offset;
Serhiy Storchaka61cb3d02020-03-17 18:07:30 +02005313 SET_LOC(c, e);
Serhiy Storchakada8d72c2018-09-17 15:17:29 +03005314 int res = compiler_visit_expr1(c, e);
Serhiy Storchaka61cb3d02020-03-17 18:07:30 +02005315 c->u->u_lineno = old_lineno;
Miss Islington (bot)13de28f2021-05-07 13:40:09 -07005316 c->u->u_end_lineno = old_end_lineno;
Serhiy Storchakada8d72c2018-09-17 15:17:29 +03005317 c->u->u_col_offset = old_col_offset;
Miss Islington (bot)13de28f2021-05-07 13:40:09 -07005318 c->u->u_end_col_offset = old_end_col_offset;
Serhiy Storchakada8d72c2018-09-17 15:17:29 +03005319 return res;
5320}
5321
5322static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005323compiler_augassign(struct compiler *c, stmt_ty s)
5324{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005325 assert(s->kind == AugAssign_kind);
Serhiy Storchaka6b975982020-03-17 23:41:08 +02005326 expr_ty e = s->v.AugAssign.target;
5327
5328 int old_lineno = c->u->u_lineno;
Miss Islington (bot)13de28f2021-05-07 13:40:09 -07005329 int old_end_lineno = c->u->u_end_lineno;
Serhiy Storchaka6b975982020-03-17 23:41:08 +02005330 int old_col_offset = c->u->u_col_offset;
Miss Islington (bot)13de28f2021-05-07 13:40:09 -07005331 int old_end_col_offset = c->u->u_end_col_offset;
Serhiy Storchaka6b975982020-03-17 23:41:08 +02005332 SET_LOC(c, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005333
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005334 switch (e->kind) {
5335 case Attribute_kind:
Serhiy Storchaka6b975982020-03-17 23:41:08 +02005336 VISIT(c, expr, e->v.Attribute.value);
5337 ADDOP(c, DUP_TOP);
Mark Shannond48848c2021-03-14 18:01:30 +00005338 int old_lineno = c->u->u_lineno;
5339 c->u->u_lineno = e->end_lineno;
Serhiy Storchaka6b975982020-03-17 23:41:08 +02005340 ADDOP_NAME(c, LOAD_ATTR, e->v.Attribute.attr, names);
Mark Shannond48848c2021-03-14 18:01:30 +00005341 c->u->u_lineno = old_lineno;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005342 break;
5343 case Subscript_kind:
Serhiy Storchaka6b975982020-03-17 23:41:08 +02005344 VISIT(c, expr, e->v.Subscript.value);
5345 VISIT(c, expr, e->v.Subscript.slice);
5346 ADDOP(c, DUP_TOP_TWO);
5347 ADDOP(c, BINARY_SUBSCR);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005348 break;
5349 case Name_kind:
5350 if (!compiler_nameop(c, e->v.Name.id, Load))
5351 return 0;
Serhiy Storchaka6b975982020-03-17 23:41:08 +02005352 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005353 default:
5354 PyErr_Format(PyExc_SystemError,
5355 "invalid node type (%d) for augmented assignment",
5356 e->kind);
5357 return 0;
5358 }
Serhiy Storchaka6b975982020-03-17 23:41:08 +02005359
5360 c->u->u_lineno = old_lineno;
Miss Islington (bot)13de28f2021-05-07 13:40:09 -07005361 c->u->u_end_lineno = old_end_lineno;
Serhiy Storchaka6b975982020-03-17 23:41:08 +02005362 c->u->u_col_offset = old_col_offset;
Miss Islington (bot)13de28f2021-05-07 13:40:09 -07005363 c->u->u_end_col_offset = old_end_col_offset;
Serhiy Storchaka6b975982020-03-17 23:41:08 +02005364
5365 VISIT(c, expr, s->v.AugAssign.value);
5366 ADDOP(c, inplace_binop(s->v.AugAssign.op));
5367
5368 SET_LOC(c, e);
5369
5370 switch (e->kind) {
5371 case Attribute_kind:
Mark Shannond48848c2021-03-14 18:01:30 +00005372 c->u->u_lineno = e->end_lineno;
Serhiy Storchaka6b975982020-03-17 23:41:08 +02005373 ADDOP(c, ROT_TWO);
5374 ADDOP_NAME(c, STORE_ATTR, e->v.Attribute.attr, names);
5375 break;
5376 case Subscript_kind:
5377 ADDOP(c, ROT_THREE);
5378 ADDOP(c, STORE_SUBSCR);
5379 break;
5380 case Name_kind:
5381 return compiler_nameop(c, e->v.Name.id, Store);
5382 default:
5383 Py_UNREACHABLE();
5384 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005385 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005386}
5387
5388static int
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005389check_ann_expr(struct compiler *c, expr_ty e)
5390{
5391 VISIT(c, expr, e);
5392 ADDOP(c, POP_TOP);
5393 return 1;
5394}
5395
5396static int
5397check_annotation(struct compiler *c, stmt_ty s)
5398{
Batuhan Taskaya8cc3cfa2021-04-25 05:31:20 +03005399 /* Annotations of complex targets does not produce anything
5400 under annotations future */
5401 if (c->c_future->ff_features & CO_FUTURE_ANNOTATIONS) {
5402 return 1;
5403 }
5404
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005405 /* Annotations are only evaluated in a module or class. */
5406 if (c->u->u_scope_type == COMPILER_SCOPE_MODULE ||
5407 c->u->u_scope_type == COMPILER_SCOPE_CLASS) {
5408 return check_ann_expr(c, s->v.AnnAssign.annotation);
5409 }
5410 return 1;
5411}
5412
5413static int
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005414check_ann_subscr(struct compiler *c, expr_ty e)
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005415{
5416 /* We check that everything in a subscript is defined at runtime. */
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005417 switch (e->kind) {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005418 case Slice_kind:
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005419 if (e->v.Slice.lower && !check_ann_expr(c, e->v.Slice.lower)) {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005420 return 0;
5421 }
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005422 if (e->v.Slice.upper && !check_ann_expr(c, e->v.Slice.upper)) {
5423 return 0;
5424 }
5425 if (e->v.Slice.step && !check_ann_expr(c, e->v.Slice.step)) {
5426 return 0;
5427 }
5428 return 1;
5429 case Tuple_kind: {
5430 /* extended slice */
Pablo Galindoa5634c42020-09-16 19:42:00 +01005431 asdl_expr_seq *elts = e->v.Tuple.elts;
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005432 Py_ssize_t i, n = asdl_seq_LEN(elts);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005433 for (i = 0; i < n; i++) {
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005434 if (!check_ann_subscr(c, asdl_seq_GET(elts, i))) {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005435 return 0;
5436 }
5437 }
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005438 return 1;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005439 }
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005440 default:
5441 return check_ann_expr(c, e);
5442 }
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005443}
5444
5445static int
5446compiler_annassign(struct compiler *c, stmt_ty s)
5447{
5448 expr_ty targ = s->v.AnnAssign.target;
Guido van Rossum015d8742016-09-11 09:45:24 -07005449 PyObject* mangled;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005450
5451 assert(s->kind == AnnAssign_kind);
5452
5453 /* We perform the actual assignment first. */
5454 if (s->v.AnnAssign.value) {
5455 VISIT(c, expr, s->v.AnnAssign.value);
5456 VISIT(c, expr, targ);
5457 }
5458 switch (targ->kind) {
5459 case Name_kind:
Pablo Galindoc5fc1562020-04-22 23:29:27 +01005460 if (forbidden_name(c, targ->v.Name.id, Store))
5461 return 0;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005462 /* If we have a simple name in a module or class, store annotation. */
5463 if (s->v.AnnAssign.simple &&
5464 (c->u->u_scope_type == COMPILER_SCOPE_MODULE ||
5465 c->u->u_scope_type == COMPILER_SCOPE_CLASS)) {
Pablo Galindob0544ba2021-04-21 12:41:19 +01005466 if (c->c_future->ff_features & CO_FUTURE_ANNOTATIONS) {
5467 VISIT(c, annexpr, s->v.AnnAssign.annotation)
5468 }
5469 else {
5470 VISIT(c, expr, s->v.AnnAssign.annotation);
5471 }
Mark Shannon332cd5e2018-01-30 00:41:04 +00005472 ADDOP_NAME(c, LOAD_NAME, __annotations__, names);
Serhiy Storchakaa95d9862018-03-24 22:42:35 +02005473 mangled = _Py_Mangle(c->u->u_private, targ->v.Name.id);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005474 ADDOP_LOAD_CONST_NEW(c, mangled);
Mark Shannon332cd5e2018-01-30 00:41:04 +00005475 ADDOP(c, STORE_SUBSCR);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005476 }
5477 break;
5478 case Attribute_kind:
Pablo Galindoc5fc1562020-04-22 23:29:27 +01005479 if (forbidden_name(c, targ->v.Attribute.attr, Store))
5480 return 0;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005481 if (!s->v.AnnAssign.value &&
5482 !check_ann_expr(c, targ->v.Attribute.value)) {
5483 return 0;
5484 }
5485 break;
5486 case Subscript_kind:
5487 if (!s->v.AnnAssign.value &&
5488 (!check_ann_expr(c, targ->v.Subscript.value) ||
5489 !check_ann_subscr(c, targ->v.Subscript.slice))) {
5490 return 0;
5491 }
5492 break;
5493 default:
5494 PyErr_Format(PyExc_SystemError,
5495 "invalid node type (%d) for annotated assignment",
5496 targ->kind);
5497 return 0;
5498 }
5499 /* Annotation is evaluated last. */
5500 if (!s->v.AnnAssign.simple && !check_annotation(c, s)) {
5501 return 0;
5502 }
5503 return 1;
5504}
5505
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005506/* Raises a SyntaxError and returns 0.
5507 If something goes wrong, a different exception may be raised.
5508*/
5509
5510static int
Brandt Bucher145bf262021-02-26 14:51:55 -08005511compiler_error(struct compiler *c, const char *format, ...)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005512{
Brandt Bucher145bf262021-02-26 14:51:55 -08005513 va_list vargs;
5514#ifdef HAVE_STDARG_PROTOTYPES
5515 va_start(vargs, format);
5516#else
5517 va_start(vargs);
5518#endif
5519 PyObject *msg = PyUnicode_FromFormatV(format, vargs);
5520 va_end(vargs);
5521 if (msg == NULL) {
5522 return 0;
5523 }
5524 PyObject *loc = PyErr_ProgramTextObject(c->c_filename, c->u->u_lineno);
5525 if (loc == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005526 Py_INCREF(Py_None);
5527 loc = Py_None;
5528 }
Pablo Galindoa77aac42021-04-23 14:27:05 +01005529 PyObject *args = Py_BuildValue("O(OiiOii)", msg, c->c_filename,
5530 c->u->u_lineno, c->u->u_col_offset + 1, loc,
5531 c->u->u_end_lineno, c->u->u_end_col_offset + 1);
Brandt Bucher145bf262021-02-26 14:51:55 -08005532 Py_DECREF(msg);
5533 if (args == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005534 goto exit;
Brandt Bucher145bf262021-02-26 14:51:55 -08005535 }
5536 PyErr_SetObject(PyExc_SyntaxError, args);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005537 exit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005538 Py_DECREF(loc);
Brandt Bucher145bf262021-02-26 14:51:55 -08005539 Py_XDECREF(args);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005540 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005541}
5542
Serhiy Storchakad31e7732018-10-21 10:09:39 +03005543/* Emits a SyntaxWarning and returns 1 on success.
5544 If a SyntaxWarning raised as error, replaces it with a SyntaxError
5545 and returns 0.
5546*/
5547static int
Serhiy Storchaka62e44812019-02-16 08:12:19 +02005548compiler_warn(struct compiler *c, const char *format, ...)
Serhiy Storchakad31e7732018-10-21 10:09:39 +03005549{
Serhiy Storchaka62e44812019-02-16 08:12:19 +02005550 va_list vargs;
5551#ifdef HAVE_STDARG_PROTOTYPES
5552 va_start(vargs, format);
5553#else
5554 va_start(vargs);
5555#endif
5556 PyObject *msg = PyUnicode_FromFormatV(format, vargs);
5557 va_end(vargs);
Serhiy Storchakad31e7732018-10-21 10:09:39 +03005558 if (msg == NULL) {
5559 return 0;
5560 }
5561 if (PyErr_WarnExplicitObject(PyExc_SyntaxWarning, msg, c->c_filename,
5562 c->u->u_lineno, NULL, NULL) < 0)
5563 {
Serhiy Storchakad31e7732018-10-21 10:09:39 +03005564 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
Serhiy Storchaka62e44812019-02-16 08:12:19 +02005565 /* Replace the SyntaxWarning exception with a SyntaxError
5566 to get a more accurate error report */
Serhiy Storchakad31e7732018-10-21 10:09:39 +03005567 PyErr_Clear();
Serhiy Storchaka62e44812019-02-16 08:12:19 +02005568 assert(PyUnicode_AsUTF8(msg) != NULL);
5569 compiler_error(c, PyUnicode_AsUTF8(msg));
Serhiy Storchakad31e7732018-10-21 10:09:39 +03005570 }
Serhiy Storchaka62e44812019-02-16 08:12:19 +02005571 Py_DECREF(msg);
Serhiy Storchakad31e7732018-10-21 10:09:39 +03005572 return 0;
5573 }
5574 Py_DECREF(msg);
5575 return 1;
5576}
5577
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005578static int
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005579compiler_subscript(struct compiler *c, expr_ty e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005580{
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005581 expr_context_ty ctx = e->v.Subscript.ctx;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005582 int op = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005583
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005584 if (ctx == Load) {
5585 if (!check_subscripter(c, e->v.Subscript.value)) {
5586 return 0;
5587 }
5588 if (!check_index(c, e->v.Subscript.value, e->v.Subscript.slice)) {
5589 return 0;
5590 }
5591 }
5592
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005593 switch (ctx) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005594 case Load: op = BINARY_SUBSCR; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005595 case Store: op = STORE_SUBSCR; break;
5596 case Del: op = DELETE_SUBSCR; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005597 }
Serhiy Storchaka6b975982020-03-17 23:41:08 +02005598 assert(op);
5599 VISIT(c, expr, e->v.Subscript.value);
5600 VISIT(c, expr, e->v.Subscript.slice);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005601 ADDOP(c, op);
5602 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005603}
5604
5605static int
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005606compiler_slice(struct compiler *c, expr_ty s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005607{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005608 int n = 2;
5609 assert(s->kind == Slice_kind);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005610
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005611 /* only handles the cases where BUILD_SLICE is emitted */
5612 if (s->v.Slice.lower) {
5613 VISIT(c, expr, s->v.Slice.lower);
5614 }
5615 else {
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005616 ADDOP_LOAD_CONST(c, Py_None);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005617 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005618
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005619 if (s->v.Slice.upper) {
5620 VISIT(c, expr, s->v.Slice.upper);
5621 }
5622 else {
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005623 ADDOP_LOAD_CONST(c, Py_None);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005624 }
5625
5626 if (s->v.Slice.step) {
5627 n++;
5628 VISIT(c, expr, s->v.Slice.step);
5629 }
5630 ADDOP_I(c, BUILD_SLICE, n);
5631 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005632}
5633
Brandt Bucher145bf262021-02-26 14:51:55 -08005634
5635// PEP 634: Structural Pattern Matching
5636
Brandt Bucher0ad1e032021-05-02 13:02:10 -07005637// To keep things simple, all compiler_pattern_* and pattern_helper_* routines
5638// follow the convention of consuming TOS (the subject for the given pattern)
5639// and calling jump_to_fail_pop on failure (no match).
5640
5641// When calling into these routines, it's important that pc->on_top be kept
5642// updated to reflect the current number of items that we are using on the top
5643// of the stack: they will be popped on failure, and any name captures will be
5644// stored *underneath* them on success. This lets us defer all names stores
5645// until the *entire* pattern matches.
Brandt Bucher145bf262021-02-26 14:51:55 -08005646
Brandt Bucher145bf262021-02-26 14:51:55 -08005647#define WILDCARD_CHECK(N) \
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005648 ((N)->kind == MatchAs_kind && !(N)->v.MatchAs.name)
Brandt Bucher145bf262021-02-26 14:51:55 -08005649
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005650#define WILDCARD_STAR_CHECK(N) \
5651 ((N)->kind == MatchStar_kind && !(N)->v.MatchStar.name)
5652
5653// Limit permitted subexpressions, even if the parser & AST validator let them through
5654#define MATCH_VALUE_EXPR(N) \
5655 ((N)->kind == Constant_kind || (N)->kind == Attribute_kind)
Brandt Bucher145bf262021-02-26 14:51:55 -08005656
Brandt Bucher0ad1e032021-05-02 13:02:10 -07005657// Allocate or resize pc->fail_pop to allow for n items to be popped on failure.
5658static int
5659ensure_fail_pop(struct compiler *c, pattern_context *pc, Py_ssize_t n)
5660{
5661 Py_ssize_t size = n + 1;
5662 if (size <= pc->fail_pop_size) {
5663 return 1;
5664 }
5665 Py_ssize_t needed = sizeof(basicblock*) * size;
5666 basicblock **resized = PyObject_Realloc(pc->fail_pop, needed);
5667 if (resized == NULL) {
5668 PyErr_NoMemory();
5669 return 0;
5670 }
5671 pc->fail_pop = resized;
5672 while (pc->fail_pop_size < size) {
5673 basicblock *new_block;
5674 RETURN_IF_FALSE(new_block = compiler_new_block(c));
5675 pc->fail_pop[pc->fail_pop_size++] = new_block;
5676 }
5677 return 1;
5678}
5679
5680// Use op to jump to the correct fail_pop block.
5681static int
5682jump_to_fail_pop(struct compiler *c, pattern_context *pc, int op)
5683{
5684 // Pop any items on the top of the stack, plus any objects we were going to
5685 // capture on success:
5686 Py_ssize_t pops = pc->on_top + PyList_GET_SIZE(pc->stores);
5687 RETURN_IF_FALSE(ensure_fail_pop(c, pc, pops));
5688 ADDOP_JUMP(c, op, pc->fail_pop[pops]);
5689 NEXT_BLOCK(c);
5690 return 1;
5691}
5692
5693// Build all of the fail_pop blocks and reset fail_pop.
5694static int
5695emit_and_reset_fail_pop(struct compiler *c, pattern_context *pc)
5696{
5697 if (!pc->fail_pop_size) {
5698 assert(pc->fail_pop == NULL);
5699 NEXT_BLOCK(c);
5700 return 1;
5701 }
5702 while (--pc->fail_pop_size) {
5703 compiler_use_next_block(c, pc->fail_pop[pc->fail_pop_size]);
5704 if (!compiler_addop(c, POP_TOP)) {
5705 pc->fail_pop_size = 0;
5706 PyObject_Free(pc->fail_pop);
5707 pc->fail_pop = NULL;
5708 return 0;
5709 }
5710 }
5711 compiler_use_next_block(c, pc->fail_pop[0]);
5712 PyObject_Free(pc->fail_pop);
5713 pc->fail_pop = NULL;
5714 return 1;
5715}
5716
5717static int
5718compiler_error_duplicate_store(struct compiler *c, identifier n)
5719{
5720 return compiler_error(c, "multiple assignments to name %R in pattern", n);
5721}
5722
Brandt Bucher145bf262021-02-26 14:51:55 -08005723static int
5724pattern_helper_store_name(struct compiler *c, identifier n, pattern_context *pc)
5725{
Brandt Bucherdbe60ee2021-04-29 17:19:28 -07005726 if (n == NULL) {
5727 ADDOP(c, POP_TOP);
5728 return 1;
5729 }
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005730 if (forbidden_name(c, n, Store)) {
5731 return 0;
5732 }
Brandt Bucher145bf262021-02-26 14:51:55 -08005733 // Can't assign to the same name twice:
Brandt Bucher0ad1e032021-05-02 13:02:10 -07005734 int duplicate = PySequence_Contains(pc->stores, n);
5735 if (duplicate < 0) {
5736 return 0;
Brandt Bucher145bf262021-02-26 14:51:55 -08005737 }
Brandt Bucher0ad1e032021-05-02 13:02:10 -07005738 if (duplicate) {
5739 return compiler_error_duplicate_store(c, n);
Brandt Bucher145bf262021-02-26 14:51:55 -08005740 }
Brandt Bucher0ad1e032021-05-02 13:02:10 -07005741 // Rotate this object underneath any items we need to preserve:
5742 ADDOP_I(c, ROT_N, pc->on_top + PyList_GET_SIZE(pc->stores) + 1);
5743 return !PyList_Append(pc->stores, n);
Brandt Bucher145bf262021-02-26 14:51:55 -08005744}
5745
5746
5747static int
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005748pattern_unpack_helper(struct compiler *c, asdl_pattern_seq *elts)
5749{
5750 Py_ssize_t n = asdl_seq_LEN(elts);
5751 int seen_star = 0;
5752 for (Py_ssize_t i = 0; i < n; i++) {
5753 pattern_ty elt = asdl_seq_GET(elts, i);
5754 if (elt->kind == MatchStar_kind && !seen_star) {
5755 if ((i >= (1 << 8)) ||
5756 (n-i-1 >= (INT_MAX >> 8)))
5757 return compiler_error(c,
5758 "too many expressions in "
5759 "star-unpacking sequence pattern");
5760 ADDOP_I(c, UNPACK_EX, (i + ((n-i-1) << 8)));
5761 seen_star = 1;
5762 }
5763 else if (elt->kind == MatchStar_kind) {
5764 return compiler_error(c,
5765 "multiple starred expressions in sequence pattern");
5766 }
5767 }
5768 if (!seen_star) {
5769 ADDOP_I(c, UNPACK_SEQUENCE, n);
5770 }
5771 return 1;
5772}
5773
5774static int
5775pattern_helper_sequence_unpack(struct compiler *c, asdl_pattern_seq *patterns,
Brandt Bucher145bf262021-02-26 14:51:55 -08005776 Py_ssize_t star, pattern_context *pc)
5777{
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005778 RETURN_IF_FALSE(pattern_unpack_helper(c, patterns));
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005779 Py_ssize_t size = asdl_seq_LEN(patterns);
Brandt Bucher0ad1e032021-05-02 13:02:10 -07005780 // We've now got a bunch of new subjects on the stack. They need to remain
5781 // there after each subpattern match:
5782 pc->on_top += size;
Brandt Bucher145bf262021-02-26 14:51:55 -08005783 for (Py_ssize_t i = 0; i < size; i++) {
Brandt Bucher0ad1e032021-05-02 13:02:10 -07005784 // One less item to keep track of each time we loop through:
5785 pc->on_top--;
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005786 pattern_ty pattern = asdl_seq_GET(patterns, i);
Brandt Bucher0ad1e032021-05-02 13:02:10 -07005787 RETURN_IF_FALSE(compiler_pattern_subpattern(c, pattern, pc));
Brandt Bucher145bf262021-02-26 14:51:55 -08005788 }
Brandt Bucher145bf262021-02-26 14:51:55 -08005789 return 1;
Brandt Bucher145bf262021-02-26 14:51:55 -08005790}
5791
5792// Like pattern_helper_sequence_unpack, but uses BINARY_SUBSCR instead of
5793// UNPACK_SEQUENCE / UNPACK_EX. This is more efficient for patterns with a
5794// starred wildcard like [first, *_] / [first, *_, last] / [*_, last] / etc.
5795static int
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005796pattern_helper_sequence_subscr(struct compiler *c, asdl_pattern_seq *patterns,
Brandt Bucher145bf262021-02-26 14:51:55 -08005797 Py_ssize_t star, pattern_context *pc)
5798{
Brandt Bucher0ad1e032021-05-02 13:02:10 -07005799 // We need to keep the subject around for extracting elements:
5800 pc->on_top++;
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005801 Py_ssize_t size = asdl_seq_LEN(patterns);
Brandt Bucher145bf262021-02-26 14:51:55 -08005802 for (Py_ssize_t i = 0; i < size; i++) {
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005803 pattern_ty pattern = asdl_seq_GET(patterns, i);
5804 if (WILDCARD_CHECK(pattern)) {
Brandt Bucher145bf262021-02-26 14:51:55 -08005805 continue;
5806 }
5807 if (i == star) {
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005808 assert(WILDCARD_STAR_CHECK(pattern));
Brandt Bucher145bf262021-02-26 14:51:55 -08005809 continue;
5810 }
5811 ADDOP(c, DUP_TOP);
5812 if (i < star) {
5813 ADDOP_LOAD_CONST_NEW(c, PyLong_FromSsize_t(i));
5814 }
5815 else {
5816 // The subject may not support negative indexing! Compute a
5817 // nonnegative index:
5818 ADDOP(c, GET_LEN);
5819 ADDOP_LOAD_CONST_NEW(c, PyLong_FromSsize_t(size - i));
5820 ADDOP(c, BINARY_SUBTRACT);
5821 }
5822 ADDOP(c, BINARY_SUBSCR);
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005823 RETURN_IF_FALSE(compiler_pattern_subpattern(c, pattern, pc));
Brandt Bucher145bf262021-02-26 14:51:55 -08005824 }
Brandt Bucher0ad1e032021-05-02 13:02:10 -07005825 // Pop the subject, we're done with it:
5826 pc->on_top--;
Brandt Bucher145bf262021-02-26 14:51:55 -08005827 ADDOP(c, POP_TOP);
Brandt Bucher145bf262021-02-26 14:51:55 -08005828 return 1;
5829}
5830
Brandt Bucher145bf262021-02-26 14:51:55 -08005831// Like compiler_pattern, but turn off checks for irrefutability.
5832static int
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005833compiler_pattern_subpattern(struct compiler *c, pattern_ty p, pattern_context *pc)
Brandt Bucher145bf262021-02-26 14:51:55 -08005834{
5835 int allow_irrefutable = pc->allow_irrefutable;
5836 pc->allow_irrefutable = 1;
5837 RETURN_IF_FALSE(compiler_pattern(c, p, pc));
5838 pc->allow_irrefutable = allow_irrefutable;
5839 return 1;
5840}
5841
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005842static int
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005843compiler_pattern_as(struct compiler *c, pattern_ty p, pattern_context *pc)
5844{
5845 assert(p->kind == MatchAs_kind);
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005846 if (p->v.MatchAs.pattern == NULL) {
Brandt Bucherdbe60ee2021-04-29 17:19:28 -07005847 // An irrefutable match:
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005848 if (!pc->allow_irrefutable) {
Brandt Bucherdbe60ee2021-04-29 17:19:28 -07005849 if (p->v.MatchAs.name) {
5850 const char *e = "name capture %R makes remaining patterns unreachable";
5851 return compiler_error(c, e, p->v.MatchAs.name);
5852 }
5853 const char *e = "wildcard makes remaining patterns unreachable";
5854 return compiler_error(c, e);
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005855 }
Brandt Bucher0ad1e032021-05-02 13:02:10 -07005856 return pattern_helper_store_name(c, p->v.MatchAs.name, pc);
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005857 }
Brandt Bucher145bf262021-02-26 14:51:55 -08005858 // Need to make a copy for (possibly) storing later:
Brandt Bucher0ad1e032021-05-02 13:02:10 -07005859 pc->on_top++;
Brandt Bucher145bf262021-02-26 14:51:55 -08005860 ADDOP(c, DUP_TOP);
5861 RETURN_IF_FALSE(compiler_pattern(c, p->v.MatchAs.pattern, pc));
Brandt Bucher0ad1e032021-05-02 13:02:10 -07005862 // Success! Store it:
5863 pc->on_top--;
Brandt Bucher145bf262021-02-26 14:51:55 -08005864 RETURN_IF_FALSE(pattern_helper_store_name(c, p->v.MatchAs.name, pc));
Brandt Bucher145bf262021-02-26 14:51:55 -08005865 return 1;
5866}
5867
Brandt Bucher145bf262021-02-26 14:51:55 -08005868static int
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005869compiler_pattern_star(struct compiler *c, pattern_ty p, pattern_context *pc)
Brandt Bucher145bf262021-02-26 14:51:55 -08005870{
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005871 assert(p->kind == MatchStar_kind);
Brandt Bucherdbe60ee2021-04-29 17:19:28 -07005872 RETURN_IF_FALSE(pattern_helper_store_name(c, p->v.MatchStar.name, pc));
Brandt Bucherdbe60ee2021-04-29 17:19:28 -07005873 return 1;
Brandt Bucher145bf262021-02-26 14:51:55 -08005874}
5875
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005876static int
5877validate_kwd_attrs(struct compiler *c, asdl_identifier_seq *attrs, asdl_pattern_seq* patterns)
5878{
5879 // Any errors will point to the pattern rather than the arg name as the
5880 // parser is only supplying identifiers rather than Name or keyword nodes
5881 Py_ssize_t nattrs = asdl_seq_LEN(attrs);
5882 for (Py_ssize_t i = 0; i < nattrs; i++) {
5883 identifier attr = ((identifier)asdl_seq_GET(attrs, i));
Miss Islington (bot)13de28f2021-05-07 13:40:09 -07005884 SET_LOC(c, ((pattern_ty) asdl_seq_GET(patterns, i)));
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005885 if (forbidden_name(c, attr, Store)) {
5886 return -1;
5887 }
5888 for (Py_ssize_t j = i + 1; j < nattrs; j++) {
5889 identifier other = ((identifier)asdl_seq_GET(attrs, j));
5890 if (!PyUnicode_Compare(attr, other)) {
Miss Islington (bot)13de28f2021-05-07 13:40:09 -07005891 SET_LOC(c, ((pattern_ty) asdl_seq_GET(patterns, j)));
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005892 compiler_error(c, "attribute name repeated in class pattern: %U", attr);
5893 return -1;
5894 }
5895 }
5896 }
5897 return 0;
5898}
Brandt Bucher145bf262021-02-26 14:51:55 -08005899
5900static int
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005901compiler_pattern_class(struct compiler *c, pattern_ty p, pattern_context *pc)
Brandt Bucher145bf262021-02-26 14:51:55 -08005902{
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005903 assert(p->kind == MatchClass_kind);
5904 asdl_pattern_seq *patterns = p->v.MatchClass.patterns;
5905 asdl_identifier_seq *kwd_attrs = p->v.MatchClass.kwd_attrs;
5906 asdl_pattern_seq *kwd_patterns = p->v.MatchClass.kwd_patterns;
5907 Py_ssize_t nargs = asdl_seq_LEN(patterns);
5908 Py_ssize_t nattrs = asdl_seq_LEN(kwd_attrs);
5909 Py_ssize_t nkwd_patterns = asdl_seq_LEN(kwd_patterns);
5910 if (nattrs != nkwd_patterns) {
5911 // AST validator shouldn't let this happen, but if it does,
5912 // just fail, don't crash out of the interpreter
5913 const char * e = "kwd_attrs (%d) / kwd_patterns (%d) length mismatch in class pattern";
5914 return compiler_error(c, e, nattrs, nkwd_patterns);
Brandt Bucher145bf262021-02-26 14:51:55 -08005915 }
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005916 if (INT_MAX < nargs || INT_MAX < nargs + nattrs - 1) {
5917 const char *e = "too many sub-patterns in class pattern %R";
5918 return compiler_error(c, e, p->v.MatchClass.cls);
5919 }
5920 if (nattrs) {
5921 RETURN_IF_FALSE(!validate_kwd_attrs(c, kwd_attrs, kwd_patterns));
Miss Islington (bot)13de28f2021-05-07 13:40:09 -07005922 SET_LOC(c, p);
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005923 }
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005924 VISIT(c, expr, p->v.MatchClass.cls);
5925 PyObject *attr_names;
5926 RETURN_IF_FALSE(attr_names = PyTuple_New(nattrs));
Brandt Bucher145bf262021-02-26 14:51:55 -08005927 Py_ssize_t i;
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005928 for (i = 0; i < nattrs; i++) {
5929 PyObject *name = asdl_seq_GET(kwd_attrs, i);
Brandt Bucher145bf262021-02-26 14:51:55 -08005930 Py_INCREF(name);
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005931 PyTuple_SET_ITEM(attr_names, i, name);
Brandt Bucher145bf262021-02-26 14:51:55 -08005932 }
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005933 ADDOP_LOAD_CONST_NEW(c, attr_names);
Brandt Bucher145bf262021-02-26 14:51:55 -08005934 ADDOP_I(c, MATCH_CLASS, nargs);
Brandt Bucher0ad1e032021-05-02 13:02:10 -07005935 // TOS is now a tuple of (nargs + nattrs) attributes. Preserve it:
5936 pc->on_top++;
5937 RETURN_IF_FALSE(jump_to_fail_pop(c, pc, POP_JUMP_IF_FALSE));
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005938 for (i = 0; i < nargs + nattrs; i++) {
5939 pattern_ty pattern;
Brandt Bucher145bf262021-02-26 14:51:55 -08005940 if (i < nargs) {
5941 // Positional:
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005942 pattern = asdl_seq_GET(patterns, i);
Brandt Bucher145bf262021-02-26 14:51:55 -08005943 }
5944 else {
5945 // Keyword:
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005946 pattern = asdl_seq_GET(kwd_patterns, i - nargs);
Brandt Bucher145bf262021-02-26 14:51:55 -08005947 }
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005948 if (WILDCARD_CHECK(pattern)) {
Brandt Bucher145bf262021-02-26 14:51:55 -08005949 continue;
5950 }
5951 // Get the i-th attribute, and match it against the i-th pattern:
5952 ADDOP(c, DUP_TOP);
5953 ADDOP_LOAD_CONST_NEW(c, PyLong_FromSsize_t(i));
5954 ADDOP(c, BINARY_SUBSCR);
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005955 RETURN_IF_FALSE(compiler_pattern_subpattern(c, pattern, pc));
Brandt Bucher145bf262021-02-26 14:51:55 -08005956 }
5957 // Success! Pop the tuple of attributes:
Brandt Bucher0ad1e032021-05-02 13:02:10 -07005958 pc->on_top--;
Brandt Bucher145bf262021-02-26 14:51:55 -08005959 ADDOP(c, POP_TOP);
Brandt Bucher145bf262021-02-26 14:51:55 -08005960 return 1;
5961}
5962
Brandt Bucher145bf262021-02-26 14:51:55 -08005963static int
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005964compiler_pattern_mapping(struct compiler *c, pattern_ty p, pattern_context *pc)
Brandt Bucher145bf262021-02-26 14:51:55 -08005965{
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005966 assert(p->kind == MatchMapping_kind);
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005967 asdl_expr_seq *keys = p->v.MatchMapping.keys;
5968 asdl_pattern_seq *patterns = p->v.MatchMapping.patterns;
5969 Py_ssize_t size = asdl_seq_LEN(keys);
5970 Py_ssize_t npatterns = asdl_seq_LEN(patterns);
5971 if (size != npatterns) {
5972 // AST validator shouldn't let this happen, but if it does,
5973 // just fail, don't crash out of the interpreter
5974 const char * e = "keys (%d) / patterns (%d) length mismatch in mapping pattern";
5975 return compiler_error(c, e, size, npatterns);
5976 }
5977 // We have a double-star target if "rest" is set
5978 PyObject *star_target = p->v.MatchMapping.rest;
Brandt Bucher0ad1e032021-05-02 13:02:10 -07005979 // We need to keep the subject on top during the mapping and length checks:
5980 pc->on_top++;
Brandt Bucher145bf262021-02-26 14:51:55 -08005981 ADDOP(c, MATCH_MAPPING);
Brandt Bucher0ad1e032021-05-02 13:02:10 -07005982 RETURN_IF_FALSE(jump_to_fail_pop(c, pc, POP_JUMP_IF_FALSE));
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005983 if (!size && !star_target) {
Brandt Bucher0ad1e032021-05-02 13:02:10 -07005984 // If the pattern is just "{}", we're done! Pop the subject:
5985 pc->on_top--;
Brandt Bucher145bf262021-02-26 14:51:55 -08005986 ADDOP(c, POP_TOP);
Brandt Bucher145bf262021-02-26 14:51:55 -08005987 return 1;
5988 }
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005989 if (size) {
Brandt Bucher145bf262021-02-26 14:51:55 -08005990 // If the pattern has any keys in it, perform a length check:
5991 ADDOP(c, GET_LEN);
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005992 ADDOP_LOAD_CONST_NEW(c, PyLong_FromSsize_t(size));
Brandt Bucher145bf262021-02-26 14:51:55 -08005993 ADDOP_COMPARE(c, GtE);
Brandt Bucher0ad1e032021-05-02 13:02:10 -07005994 RETURN_IF_FALSE(jump_to_fail_pop(c, pc, POP_JUMP_IF_FALSE));
Brandt Bucher145bf262021-02-26 14:51:55 -08005995 }
Nick Coghlan1e7b8582021-04-29 15:58:44 +10005996 if (INT_MAX < size - 1) {
Brandt Bucher145bf262021-02-26 14:51:55 -08005997 return compiler_error(c, "too many sub-patterns in mapping pattern");
5998 }
5999 // Collect all of the keys into a tuple for MATCH_KEYS and
6000 // COPY_DICT_WITHOUT_KEYS. They can either be dotted names or literals:
Miss Islington (bot)016af142021-07-14 18:00:35 -07006001
6002 // Maintaining a set of Constant_kind kind keys allows us to raise a
6003 // SyntaxError in the case of duplicates.
6004 PyObject *seen = PySet_New(NULL);
6005 if (seen == NULL) {
6006 return 0;
6007 }
6008
6009 // NOTE: goto error on failure in the loop below to avoid leaking `seen`
Nick Coghlan1e7b8582021-04-29 15:58:44 +10006010 for (Py_ssize_t i = 0; i < size; i++) {
Brandt Bucher145bf262021-02-26 14:51:55 -08006011 expr_ty key = asdl_seq_GET(keys, i);
6012 if (key == NULL) {
Nick Coghlan1e7b8582021-04-29 15:58:44 +10006013 const char *e = "can't use NULL keys in MatchMapping "
6014 "(set 'rest' parameter instead)";
Miss Islington (bot)13de28f2021-05-07 13:40:09 -07006015 SET_LOC(c, ((pattern_ty) asdl_seq_GET(patterns, i)));
Miss Islington (bot)016af142021-07-14 18:00:35 -07006016 compiler_error(c, e);
6017 goto error;
Nick Coghlan1e7b8582021-04-29 15:58:44 +10006018 }
Miss Islington (bot)016af142021-07-14 18:00:35 -07006019
6020 if (key->kind == Constant_kind) {
6021 int in_seen = PySet_Contains(seen, key->v.Constant.value);
6022 if (in_seen < 0) {
6023 goto error;
6024 }
6025 if (in_seen) {
6026 const char *e = "mapping pattern checks duplicate key (%R)";
6027 compiler_error(c, e, key->v.Constant.value);
6028 goto error;
6029 }
6030 if (PySet_Add(seen, key->v.Constant.value)) {
6031 goto error;
6032 }
6033 }
6034
6035 else if (key->kind != Attribute_kind) {
Nick Coghlan1e7b8582021-04-29 15:58:44 +10006036 const char *e = "mapping pattern keys may only match literals and attribute lookups";
Miss Islington (bot)016af142021-07-14 18:00:35 -07006037 compiler_error(c, e);
6038 goto error;
Brandt Bucher145bf262021-02-26 14:51:55 -08006039 }
Miss Islington (bot)016af142021-07-14 18:00:35 -07006040 if (!compiler_visit_expr(c, key)) {
6041 goto error;
6042 }
Brandt Bucher145bf262021-02-26 14:51:55 -08006043 }
Miss Islington (bot)016af142021-07-14 18:00:35 -07006044
6045 // all keys have been checked; there are no duplicates
6046 Py_DECREF(seen);
6047
Nick Coghlan1e7b8582021-04-29 15:58:44 +10006048 ADDOP_I(c, BUILD_TUPLE, size);
Brandt Bucher145bf262021-02-26 14:51:55 -08006049 ADDOP(c, MATCH_KEYS);
Brandt Bucher0ad1e032021-05-02 13:02:10 -07006050 // There's now a tuple of keys and a tuple of values on top of the subject:
6051 pc->on_top += 2;
6052 RETURN_IF_FALSE(jump_to_fail_pop(c, pc, POP_JUMP_IF_FALSE));
6053 // So far so good. Use that tuple of values on the stack to match
Brandt Bucher145bf262021-02-26 14:51:55 -08006054 // sub-patterns against:
Nick Coghlan1e7b8582021-04-29 15:58:44 +10006055 for (Py_ssize_t i = 0; i < size; i++) {
6056 pattern_ty pattern = asdl_seq_GET(patterns, i);
6057 if (WILDCARD_CHECK(pattern)) {
Brandt Bucher145bf262021-02-26 14:51:55 -08006058 continue;
6059 }
6060 ADDOP(c, DUP_TOP);
6061 ADDOP_LOAD_CONST_NEW(c, PyLong_FromSsize_t(i));
6062 ADDOP(c, BINARY_SUBSCR);
Nick Coghlan1e7b8582021-04-29 15:58:44 +10006063 RETURN_IF_FALSE(compiler_pattern_subpattern(c, pattern, pc));
Brandt Bucher145bf262021-02-26 14:51:55 -08006064 }
Brandt Bucher0ad1e032021-05-02 13:02:10 -07006065 // If we get this far, it's a match! We're done with the tuple of values,
6066 // and whatever happens next should consume the tuple of keys underneath it:
6067 pc->on_top -= 2;
Brandt Bucher145bf262021-02-26 14:51:55 -08006068 ADDOP(c, POP_TOP);
Nick Coghlan1e7b8582021-04-29 15:58:44 +10006069 if (star_target) {
6070 // If we have a starred name, bind a dict of remaining items to it:
Brandt Bucher145bf262021-02-26 14:51:55 -08006071 ADDOP(c, COPY_DICT_WITHOUT_KEYS);
Nick Coghlan1e7b8582021-04-29 15:58:44 +10006072 RETURN_IF_FALSE(pattern_helper_store_name(c, star_target, pc));
Brandt Bucher145bf262021-02-26 14:51:55 -08006073 }
6074 else {
6075 // Otherwise, we don't care about this tuple of keys anymore:
6076 ADDOP(c, POP_TOP);
6077 }
6078 // Pop the subject:
Brandt Bucher0ad1e032021-05-02 13:02:10 -07006079 pc->on_top--;
Brandt Bucher145bf262021-02-26 14:51:55 -08006080 ADDOP(c, POP_TOP);
Brandt Bucher145bf262021-02-26 14:51:55 -08006081 return 1;
Miss Islington (bot)016af142021-07-14 18:00:35 -07006082
6083error:
6084 Py_DECREF(seen);
6085 return 0;
Brandt Bucher145bf262021-02-26 14:51:55 -08006086}
6087
Brandt Bucher145bf262021-02-26 14:51:55 -08006088static int
Nick Coghlan1e7b8582021-04-29 15:58:44 +10006089compiler_pattern_or(struct compiler *c, pattern_ty p, pattern_context *pc)
Brandt Bucher145bf262021-02-26 14:51:55 -08006090{
6091 assert(p->kind == MatchOr_kind);
Brandt Bucher0ad1e032021-05-02 13:02:10 -07006092 basicblock *end;
Brandt Bucher145bf262021-02-26 14:51:55 -08006093 RETURN_IF_FALSE(end = compiler_new_block(c));
Brandt Bucher145bf262021-02-26 14:51:55 -08006094 Py_ssize_t size = asdl_seq_LEN(p->v.MatchOr.patterns);
6095 assert(size > 1);
6096 // We're going to be messing with pc. Keep the original info handy:
Brandt Bucher0ad1e032021-05-02 13:02:10 -07006097 pattern_context old_pc = *pc;
6098 Py_INCREF(pc->stores);
6099 // control is the list of names bound by the first alternative. It is used
6100 // for checking different name bindings in alternatives, and for correcting
6101 // the order in which extracted elements are placed on the stack.
6102 PyObject *control = NULL;
6103 // NOTE: We can't use returning macros anymore! goto error on error.
Brandt Bucher145bf262021-02-26 14:51:55 -08006104 for (Py_ssize_t i = 0; i < size; i++) {
Nick Coghlan1e7b8582021-04-29 15:58:44 +10006105 pattern_ty alt = asdl_seq_GET(p->v.MatchOr.patterns, i);
Brandt Bucher145bf262021-02-26 14:51:55 -08006106 SET_LOC(c, alt);
Brandt Bucher0ad1e032021-05-02 13:02:10 -07006107 PyObject *pc_stores = PyList_New(0);
6108 if (pc_stores == NULL) {
6109 goto error;
Brandt Bucher145bf262021-02-26 14:51:55 -08006110 }
Brandt Bucher0ad1e032021-05-02 13:02:10 -07006111 Py_SETREF(pc->stores, pc_stores);
6112 // An irrefutable sub-pattern must be last, if it is allowed at all:
6113 pc->allow_irrefutable = (i == size - 1) && old_pc.allow_irrefutable;
6114 pc->fail_pop = NULL;
6115 pc->fail_pop_size = 0;
6116 pc->on_top = 0;
6117 if (!compiler_addop(c, DUP_TOP) || !compiler_pattern(c, alt, pc)) {
6118 goto error;
6119 }
6120 // Success!
6121 Py_ssize_t nstores = PyList_GET_SIZE(pc->stores);
Brandt Bucher145bf262021-02-26 14:51:55 -08006122 if (!i) {
Brandt Bucher0ad1e032021-05-02 13:02:10 -07006123 // This is the first alternative, so save its stores as a "control"
6124 // for the others (they can't bind a different set of names, and
6125 // might need to be reordered):
6126 assert(control == NULL);
Brandt Bucher145bf262021-02-26 14:51:55 -08006127 control = pc->stores;
Brandt Bucher0ad1e032021-05-02 13:02:10 -07006128 Py_INCREF(control);
Brandt Bucher145bf262021-02-26 14:51:55 -08006129 }
Brandt Bucher0ad1e032021-05-02 13:02:10 -07006130 else if (nstores != PyList_GET_SIZE(control)) {
6131 goto diff;
Brandt Bucher145bf262021-02-26 14:51:55 -08006132 }
Brandt Bucher0ad1e032021-05-02 13:02:10 -07006133 else if (nstores) {
6134 // There were captures. Check to see if we differ from control:
6135 Py_ssize_t icontrol = nstores;
6136 while (icontrol--) {
6137 PyObject *name = PyList_GET_ITEM(control, icontrol);
6138 Py_ssize_t istores = PySequence_Index(pc->stores, name);
6139 if (istores < 0) {
6140 PyErr_Clear();
6141 goto diff;
6142 }
6143 if (icontrol != istores) {
6144 // Reorder the names on the stack to match the order of the
6145 // names in control. There's probably a better way of doing
6146 // this; the current solution is potentially very
6147 // inefficient when each alternative subpattern binds lots
6148 // of names in different orders. It's fine for reasonable
6149 // cases, though.
6150 assert(istores < icontrol);
6151 Py_ssize_t rotations = istores + 1;
6152 // Perfom the same rotation on pc->stores:
6153 PyObject *rotated = PyList_GetSlice(pc->stores, 0,
6154 rotations);
6155 if (rotated == NULL ||
6156 PyList_SetSlice(pc->stores, 0, rotations, NULL) ||
6157 PyList_SetSlice(pc->stores, icontrol - istores,
6158 icontrol - istores, rotated))
6159 {
6160 Py_XDECREF(rotated);
6161 goto error;
6162 }
6163 Py_DECREF(rotated);
6164 // That just did:
6165 // rotated = pc_stores[:rotations]
6166 // del pc_stores[:rotations]
6167 // pc_stores[icontrol-istores:icontrol-istores] = rotated
6168 // Do the same thing to the stack, using several ROT_Ns:
6169 while (rotations--) {
6170 if (!compiler_addop_i(c, ROT_N, icontrol + 1)) {
6171 goto error;
6172 }
6173 }
6174 }
6175 }
6176 }
6177 assert(control);
6178 if (!compiler_addop_j(c, JUMP_FORWARD, end) ||
6179 !compiler_next_block(c) ||
6180 !emit_and_reset_fail_pop(c, pc))
6181 {
6182 goto error;
6183 }
Brandt Bucher145bf262021-02-26 14:51:55 -08006184 }
Brandt Bucher0ad1e032021-05-02 13:02:10 -07006185 Py_DECREF(pc->stores);
6186 *pc = old_pc;
6187 Py_INCREF(pc->stores);
6188 // Need to NULL this for the PyObject_Free call in the error block.
6189 old_pc.fail_pop = NULL;
6190 // No match. Pop the remaining copy of the subject and fail:
6191 if (!compiler_addop(c, POP_TOP) || !jump_to_fail_pop(c, pc, JUMP_FORWARD)) {
6192 goto error;
6193 }
Brandt Bucher145bf262021-02-26 14:51:55 -08006194 compiler_use_next_block(c, end);
Brandt Bucher0ad1e032021-05-02 13:02:10 -07006195 Py_ssize_t nstores = PyList_GET_SIZE(control);
6196 // There's a bunch of stuff on the stack between any where the new stores
6197 // are and where they need to be:
6198 // - The other stores.
6199 // - A copy of the subject.
6200 // - Anything else that may be on top of the stack.
6201 // - Any previous stores we've already stashed away on the stack.
Pablo Galindo39494282021-05-03 16:20:46 +01006202 Py_ssize_t nrots = nstores + 1 + pc->on_top + PyList_GET_SIZE(pc->stores);
Brandt Bucher0ad1e032021-05-02 13:02:10 -07006203 for (Py_ssize_t i = 0; i < nstores; i++) {
6204 // Rotate this capture to its proper place on the stack:
6205 if (!compiler_addop_i(c, ROT_N, nrots)) {
6206 goto error;
6207 }
6208 // Update the list of previous stores with this new name, checking for
6209 // duplicates:
6210 PyObject *name = PyList_GET_ITEM(control, i);
6211 int dupe = PySequence_Contains(pc->stores, name);
6212 if (dupe < 0) {
6213 goto error;
6214 }
6215 if (dupe) {
6216 compiler_error_duplicate_store(c, name);
6217 goto error;
6218 }
6219 if (PyList_Append(pc->stores, name)) {
6220 goto error;
6221 }
6222 }
6223 Py_DECREF(old_pc.stores);
6224 Py_DECREF(control);
6225 // NOTE: Returning macros are safe again.
6226 // Pop the copy of the subject:
6227 ADDOP(c, POP_TOP);
Brandt Bucher145bf262021-02-26 14:51:55 -08006228 return 1;
Brandt Bucher0ad1e032021-05-02 13:02:10 -07006229diff:
6230 compiler_error(c, "alternative patterns bind different names");
6231error:
6232 PyObject_Free(old_pc.fail_pop);
6233 Py_DECREF(old_pc.stores);
Brandt Bucher145bf262021-02-26 14:51:55 -08006234 Py_XDECREF(control);
6235 return 0;
6236}
6237
6238
6239static int
Nick Coghlan1e7b8582021-04-29 15:58:44 +10006240compiler_pattern_sequence(struct compiler *c, pattern_ty p, pattern_context *pc)
Brandt Bucher145bf262021-02-26 14:51:55 -08006241{
Nick Coghlan1e7b8582021-04-29 15:58:44 +10006242 assert(p->kind == MatchSequence_kind);
6243 asdl_pattern_seq *patterns = p->v.MatchSequence.patterns;
6244 Py_ssize_t size = asdl_seq_LEN(patterns);
Brandt Bucher145bf262021-02-26 14:51:55 -08006245 Py_ssize_t star = -1;
6246 int only_wildcard = 1;
6247 int star_wildcard = 0;
6248 // Find a starred name, if it exists. There may be at most one:
6249 for (Py_ssize_t i = 0; i < size; i++) {
Nick Coghlan1e7b8582021-04-29 15:58:44 +10006250 pattern_ty pattern = asdl_seq_GET(patterns, i);
6251 if (pattern->kind == MatchStar_kind) {
Brandt Bucher145bf262021-02-26 14:51:55 -08006252 if (star >= 0) {
6253 const char *e = "multiple starred names in sequence pattern";
6254 return compiler_error(c, e);
6255 }
Nick Coghlan1e7b8582021-04-29 15:58:44 +10006256 star_wildcard = WILDCARD_STAR_CHECK(pattern);
6257 only_wildcard &= star_wildcard;
Brandt Bucher145bf262021-02-26 14:51:55 -08006258 star = i;
Nick Coghlan1e7b8582021-04-29 15:58:44 +10006259 continue;
Brandt Bucher145bf262021-02-26 14:51:55 -08006260 }
Nick Coghlan1e7b8582021-04-29 15:58:44 +10006261 only_wildcard &= WILDCARD_CHECK(pattern);
Brandt Bucher145bf262021-02-26 14:51:55 -08006262 }
Brandt Bucher0ad1e032021-05-02 13:02:10 -07006263 // We need to keep the subject on top during the sequence and length checks:
6264 pc->on_top++;
Brandt Bucher145bf262021-02-26 14:51:55 -08006265 ADDOP(c, MATCH_SEQUENCE);
Brandt Bucher0ad1e032021-05-02 13:02:10 -07006266 RETURN_IF_FALSE(jump_to_fail_pop(c, pc, POP_JUMP_IF_FALSE));
Brandt Bucher145bf262021-02-26 14:51:55 -08006267 if (star < 0) {
6268 // No star: len(subject) == size
6269 ADDOP(c, GET_LEN);
6270 ADDOP_LOAD_CONST_NEW(c, PyLong_FromSsize_t(size));
6271 ADDOP_COMPARE(c, Eq);
Brandt Bucher0ad1e032021-05-02 13:02:10 -07006272 RETURN_IF_FALSE(jump_to_fail_pop(c, pc, POP_JUMP_IF_FALSE));
Brandt Bucher145bf262021-02-26 14:51:55 -08006273 }
6274 else if (size > 1) {
6275 // Star: len(subject) >= size - 1
6276 ADDOP(c, GET_LEN);
6277 ADDOP_LOAD_CONST_NEW(c, PyLong_FromSsize_t(size - 1));
6278 ADDOP_COMPARE(c, GtE);
Brandt Bucher0ad1e032021-05-02 13:02:10 -07006279 RETURN_IF_FALSE(jump_to_fail_pop(c, pc, POP_JUMP_IF_FALSE));
Brandt Bucher145bf262021-02-26 14:51:55 -08006280 }
Brandt Bucher0ad1e032021-05-02 13:02:10 -07006281 // Whatever comes next should consume the subject:
6282 pc->on_top--;
Brandt Bucher145bf262021-02-26 14:51:55 -08006283 if (only_wildcard) {
6284 // Patterns like: [] / [_] / [_, _] / [*_] / [_, *_] / [_, _, *_] / etc.
6285 ADDOP(c, POP_TOP);
Brandt Bucher145bf262021-02-26 14:51:55 -08006286 }
6287 else if (star_wildcard) {
Nick Coghlan1e7b8582021-04-29 15:58:44 +10006288 RETURN_IF_FALSE(pattern_helper_sequence_subscr(c, patterns, star, pc));
Brandt Bucher145bf262021-02-26 14:51:55 -08006289 }
6290 else {
Nick Coghlan1e7b8582021-04-29 15:58:44 +10006291 RETURN_IF_FALSE(pattern_helper_sequence_unpack(c, patterns, star, pc));
Brandt Bucher145bf262021-02-26 14:51:55 -08006292 }
Brandt Bucher145bf262021-02-26 14:51:55 -08006293 return 1;
6294}
6295
Brandt Bucher145bf262021-02-26 14:51:55 -08006296static int
Nick Coghlan1e7b8582021-04-29 15:58:44 +10006297compiler_pattern_value(struct compiler *c, pattern_ty p, pattern_context *pc)
Brandt Bucher145bf262021-02-26 14:51:55 -08006298{
Nick Coghlan1e7b8582021-04-29 15:58:44 +10006299 assert(p->kind == MatchValue_kind);
6300 expr_ty value = p->v.MatchValue.value;
6301 if (!MATCH_VALUE_EXPR(value)) {
6302 const char *e = "patterns may only match literals and attribute lookups";
6303 return compiler_error(c, e);
6304 }
6305 VISIT(c, expr, value);
Brandt Bucher145bf262021-02-26 14:51:55 -08006306 ADDOP_COMPARE(c, Eq);
Brandt Bucher0ad1e032021-05-02 13:02:10 -07006307 RETURN_IF_FALSE(jump_to_fail_pop(c, pc, POP_JUMP_IF_FALSE));
Brandt Bucher145bf262021-02-26 14:51:55 -08006308 return 1;
6309}
6310
Brandt Bucher145bf262021-02-26 14:51:55 -08006311static int
Brandt Bucherdbe60ee2021-04-29 17:19:28 -07006312compiler_pattern_singleton(struct compiler *c, pattern_ty p, pattern_context *pc)
Brandt Bucher145bf262021-02-26 14:51:55 -08006313{
Nick Coghlan1e7b8582021-04-29 15:58:44 +10006314 assert(p->kind == MatchSingleton_kind);
6315 ADDOP_LOAD_CONST(c, p->v.MatchSingleton.value);
6316 ADDOP_COMPARE(c, Is);
Brandt Bucher0ad1e032021-05-02 13:02:10 -07006317 RETURN_IF_FALSE(jump_to_fail_pop(c, pc, POP_JUMP_IF_FALSE));
Brandt Bucher145bf262021-02-26 14:51:55 -08006318 return 1;
6319}
6320
Brandt Bucher145bf262021-02-26 14:51:55 -08006321static int
Nick Coghlan1e7b8582021-04-29 15:58:44 +10006322compiler_pattern(struct compiler *c, pattern_ty p, pattern_context *pc)
Brandt Bucher145bf262021-02-26 14:51:55 -08006323{
6324 SET_LOC(c, p);
6325 switch (p->kind) {
Nick Coghlan1e7b8582021-04-29 15:58:44 +10006326 case MatchValue_kind:
Brandt Bucher145bf262021-02-26 14:51:55 -08006327 return compiler_pattern_value(c, p, pc);
Nick Coghlan1e7b8582021-04-29 15:58:44 +10006328 case MatchSingleton_kind:
Brandt Bucherdbe60ee2021-04-29 17:19:28 -07006329 return compiler_pattern_singleton(c, p, pc);
Nick Coghlan1e7b8582021-04-29 15:58:44 +10006330 case MatchSequence_kind:
Brandt Bucher145bf262021-02-26 14:51:55 -08006331 return compiler_pattern_sequence(c, p, pc);
Nick Coghlan1e7b8582021-04-29 15:58:44 +10006332 case MatchMapping_kind:
6333 return compiler_pattern_mapping(c, p, pc);
6334 case MatchClass_kind:
6335 return compiler_pattern_class(c, p, pc);
6336 case MatchStar_kind:
6337 return compiler_pattern_star(c, p, pc);
Brandt Bucher145bf262021-02-26 14:51:55 -08006338 case MatchAs_kind:
6339 return compiler_pattern_as(c, p, pc);
6340 case MatchOr_kind:
6341 return compiler_pattern_or(c, p, pc);
Brandt Bucher145bf262021-02-26 14:51:55 -08006342 }
Nick Coghlan1e7b8582021-04-29 15:58:44 +10006343 // AST validator shouldn't let this happen, but if it does,
6344 // just fail, don't crash out of the interpreter
6345 const char *e = "invalid match pattern node in AST (kind=%d)";
6346 return compiler_error(c, e, p->kind);
Brandt Bucher145bf262021-02-26 14:51:55 -08006347}
6348
Brandt Bucher145bf262021-02-26 14:51:55 -08006349static int
Brandt Bucher0ad1e032021-05-02 13:02:10 -07006350compiler_match_inner(struct compiler *c, stmt_ty s, pattern_context *pc)
Brandt Bucher145bf262021-02-26 14:51:55 -08006351{
6352 VISIT(c, expr, s->v.Match.subject);
Brandt Bucher0ad1e032021-05-02 13:02:10 -07006353 basicblock *end;
Brandt Bucher145bf262021-02-26 14:51:55 -08006354 RETURN_IF_FALSE(end = compiler_new_block(c));
6355 Py_ssize_t cases = asdl_seq_LEN(s->v.Match.cases);
Nick Coghlan1e7b8582021-04-29 15:58:44 +10006356 assert(cases > 0);
Brandt Bucher145bf262021-02-26 14:51:55 -08006357 match_case_ty m = asdl_seq_GET(s->v.Match.cases, cases - 1);
6358 int has_default = WILDCARD_CHECK(m->pattern) && 1 < cases;
6359 for (Py_ssize_t i = 0; i < cases - has_default; i++) {
6360 m = asdl_seq_GET(s->v.Match.cases, i);
6361 SET_LOC(c, m->pattern);
Brandt Bucher145bf262021-02-26 14:51:55 -08006362 // Only copy the subject if we're *not* on the last case:
6363 if (i != cases - has_default - 1) {
6364 ADDOP(c, DUP_TOP);
6365 }
Brandt Bucher0ad1e032021-05-02 13:02:10 -07006366 RETURN_IF_FALSE(pc->stores = PyList_New(0));
6367 // Irrefutable cases must be either guarded, last, or both:
6368 pc->allow_irrefutable = m->guard != NULL || i == cases - 1;
6369 pc->fail_pop = NULL;
6370 pc->fail_pop_size = 0;
6371 pc->on_top = 0;
6372 // NOTE: Can't use returning macros here (they'll leak pc->stores)!
6373 if (!compiler_pattern(c, m->pattern, pc)) {
6374 Py_DECREF(pc->stores);
6375 return 0;
6376 }
6377 assert(!pc->on_top);
6378 // It's a match! Store all of the captured names (they're on the stack).
6379 Py_ssize_t nstores = PyList_GET_SIZE(pc->stores);
6380 for (Py_ssize_t n = 0; n < nstores; n++) {
6381 PyObject *name = PyList_GET_ITEM(pc->stores, n);
6382 if (!compiler_nameop(c, name, Store)) {
6383 Py_DECREF(pc->stores);
6384 return 0;
6385 }
6386 }
6387 Py_DECREF(pc->stores);
6388 // NOTE: Returning macros are safe again.
Brandt Bucher145bf262021-02-26 14:51:55 -08006389 if (m->guard) {
Brandt Bucher0ad1e032021-05-02 13:02:10 -07006390 RETURN_IF_FALSE(ensure_fail_pop(c, pc, 0));
6391 RETURN_IF_FALSE(compiler_jump_if(c, m->guard, pc->fail_pop[0], 0));
Brandt Bucher145bf262021-02-26 14:51:55 -08006392 }
6393 // Success! Pop the subject off, we're done with it:
6394 if (i != cases - has_default - 1) {
6395 ADDOP(c, POP_TOP);
6396 }
6397 VISIT_SEQ(c, stmt, m->body);
6398 ADDOP_JUMP(c, JUMP_FORWARD, end);
Brandt Bucher0ad1e032021-05-02 13:02:10 -07006399 RETURN_IF_FALSE(emit_and_reset_fail_pop(c, pc));
Brandt Bucher145bf262021-02-26 14:51:55 -08006400 }
6401 if (has_default) {
6402 if (cases == 1) {
6403 // No matches. Done with the subject:
6404 ADDOP(c, POP_TOP);
6405 }
6406 // A trailing "case _" is common, and lets us save a bit of redundant
6407 // pushing and popping in the loop above:
6408 m = asdl_seq_GET(s->v.Match.cases, cases - 1);
6409 SET_LOC(c, m->pattern);
6410 if (m->guard) {
6411 RETURN_IF_FALSE(compiler_jump_if(c, m->guard, end, 0));
6412 }
6413 VISIT_SEQ(c, stmt, m->body);
6414 }
6415 compiler_use_next_block(c, end);
6416 return 1;
6417}
6418
Brandt Bucher0ad1e032021-05-02 13:02:10 -07006419static int
6420compiler_match(struct compiler *c, stmt_ty s)
6421{
6422 pattern_context pc;
6423 pc.fail_pop = NULL;
6424 int result = compiler_match_inner(c, s, &pc);
6425 PyObject_Free(pc.fail_pop);
6426 return result;
6427}
6428
Brandt Bucher145bf262021-02-26 14:51:55 -08006429#undef WILDCARD_CHECK
Nick Coghlan1e7b8582021-04-29 15:58:44 +10006430#undef WILDCARD_STAR_CHECK
Brandt Bucher145bf262021-02-26 14:51:55 -08006431
Thomas Wouters89f507f2006-12-13 04:49:30 +00006432/* End of the compiler section, beginning of the assembler section */
6433
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00006434/* do depth-first search of basic block graph, starting with block.
T. Wouters99b54d62019-09-12 07:05:33 -07006435 post records the block indices in post-order.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00006436
6437 XXX must handle implicit jumps from one block to next
6438*/
6439
Thomas Wouters89f507f2006-12-13 04:49:30 +00006440struct assembler {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006441 PyObject *a_bytecode; /* string containing bytecode */
6442 int a_offset; /* offset into bytecode */
6443 int a_nblocks; /* number of reachable blocks */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006444 PyObject *a_lnotab; /* string containing lnotab */
6445 int a_lnotab_off; /* offset into lnotab */
Mark Shannon877df852020-11-12 09:43:29 +00006446 int a_prevlineno; /* lineno of last emitted line in line table */
6447 int a_lineno; /* lineno of last emitted instruction */
6448 int a_lineno_start; /* bytecode start offset of current lineno */
Mark Shannoncc75ab72020-11-12 19:49:33 +00006449 basicblock *a_entry;
Thomas Wouters89f507f2006-12-13 04:49:30 +00006450};
6451
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02006452Py_LOCAL_INLINE(void)
6453stackdepth_push(basicblock ***sp, basicblock *b, int depth)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00006454{
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02006455 assert(b->b_startdepth < 0 || b->b_startdepth == depth);
Mark Shannonfee55262019-11-21 09:11:43 +00006456 if (b->b_startdepth < depth && b->b_startdepth < 100) {
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02006457 assert(b->b_startdepth < 0);
6458 b->b_startdepth = depth;
6459 *(*sp)++ = b;
Serhiy Storchakad4864c62018-01-09 21:54:52 +02006460 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00006461}
6462
6463/* Find the flow path that needs the largest stack. We assume that
6464 * cycles in the flow graph have no net effect on the stack depth.
6465 */
6466static int
6467stackdepth(struct compiler *c)
6468{
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02006469 basicblock *b, *entryblock = NULL;
6470 basicblock **stack, **sp;
6471 int nblocks = 0, maxdepth = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006472 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006473 b->b_startdepth = INT_MIN;
6474 entryblock = b;
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02006475 nblocks++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006476 }
Mark Shannon67969f52021-04-07 10:52:07 +01006477 assert(entryblock!= NULL);
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02006478 stack = (basicblock **)PyObject_Malloc(sizeof(basicblock *) * nblocks);
6479 if (!stack) {
6480 PyErr_NoMemory();
6481 return -1;
6482 }
6483
6484 sp = stack;
Mark Shannonb37181e2021-04-06 11:48:59 +01006485 if (c->u->u_ste->ste_generator || c->u->u_ste->ste_coroutine) {
6486 stackdepth_push(&sp, entryblock, 1);
6487 } else {
6488 stackdepth_push(&sp, entryblock, 0);
6489 }
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02006490 while (sp != stack) {
6491 b = *--sp;
6492 int depth = b->b_startdepth;
6493 assert(depth >= 0);
6494 basicblock *next = b->b_next;
6495 for (int i = 0; i < b->b_iused; i++) {
6496 struct instr *instr = &b->b_instr[i];
6497 int effect = stack_effect(instr->i_opcode, instr->i_oparg, 0);
6498 if (effect == PY_INVALID_STACK_EFFECT) {
Victor Stinnerba7a99d2021-01-30 01:46:44 +01006499 PyErr_Format(PyExc_SystemError,
6500 "compiler stack_effect(opcode=%d, arg=%i) failed",
6501 instr->i_opcode, instr->i_oparg);
6502 return -1;
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02006503 }
6504 int new_depth = depth + effect;
6505 if (new_depth > maxdepth) {
6506 maxdepth = new_depth;
6507 }
6508 assert(depth >= 0); /* invalid code or bug in stackdepth() */
Mark Shannon582aaf12020-08-04 17:30:11 +01006509 if (is_jump(instr)) {
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02006510 effect = stack_effect(instr->i_opcode, instr->i_oparg, 1);
6511 assert(effect != PY_INVALID_STACK_EFFECT);
6512 int target_depth = depth + effect;
6513 if (target_depth > maxdepth) {
6514 maxdepth = target_depth;
6515 }
6516 assert(target_depth >= 0); /* invalid code or bug in stackdepth() */
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02006517 stackdepth_push(&sp, instr->i_target, target_depth);
6518 }
6519 depth = new_depth;
6520 if (instr->i_opcode == JUMP_ABSOLUTE ||
6521 instr->i_opcode == JUMP_FORWARD ||
6522 instr->i_opcode == RETURN_VALUE ||
Mark Shannonfee55262019-11-21 09:11:43 +00006523 instr->i_opcode == RAISE_VARARGS ||
6524 instr->i_opcode == RERAISE)
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02006525 {
6526 /* remaining code is dead */
6527 next = NULL;
6528 break;
6529 }
6530 }
6531 if (next != NULL) {
Mark Shannon266b4622020-11-17 19:30:14 +00006532 assert(b->b_nofallthrough == 0);
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02006533 stackdepth_push(&sp, next, depth);
6534 }
6535 }
6536 PyObject_Free(stack);
6537 return maxdepth;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00006538}
6539
6540static int
6541assemble_init(struct assembler *a, int nblocks, int firstlineno)
6542{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006543 memset(a, 0, sizeof(struct assembler));
Mark Shannon877df852020-11-12 09:43:29 +00006544 a->a_prevlineno = a->a_lineno = firstlineno;
Mark Shannonfd009e62020-11-13 12:53:53 +00006545 a->a_lnotab = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006546 a->a_bytecode = PyBytes_FromStringAndSize(NULL, DEFAULT_CODE_SIZE);
Mark Shannonfd009e62020-11-13 12:53:53 +00006547 if (a->a_bytecode == NULL) {
6548 goto error;
6549 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006550 a->a_lnotab = PyBytes_FromStringAndSize(NULL, DEFAULT_LNOTAB_SIZE);
Mark Shannonfd009e62020-11-13 12:53:53 +00006551 if (a->a_lnotab == NULL) {
6552 goto error;
6553 }
Benjamin Peterson2f8bfef2016-09-07 09:26:18 -07006554 if ((size_t)nblocks > SIZE_MAX / sizeof(basicblock *)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006555 PyErr_NoMemory();
Mark Shannonfd009e62020-11-13 12:53:53 +00006556 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006557 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006558 return 1;
Mark Shannonfd009e62020-11-13 12:53:53 +00006559error:
6560 Py_XDECREF(a->a_bytecode);
6561 Py_XDECREF(a->a_lnotab);
6562 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00006563}
6564
6565static void
6566assemble_free(struct assembler *a)
6567{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006568 Py_XDECREF(a->a_bytecode);
6569 Py_XDECREF(a->a_lnotab);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00006570}
6571
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00006572static int
6573blocksize(basicblock *b)
6574{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006575 int i;
6576 int size = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00006577
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006578 for (i = 0; i < b->b_iused; i++)
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03006579 size += instrsize(b->b_instr[i].i_oparg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006580 return size;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00006581}
6582
Guido van Rossumf68d8e52001-04-14 17:55:09 +00006583static int
Mark Shannon877df852020-11-12 09:43:29 +00006584assemble_emit_linetable_pair(struct assembler *a, int bdelta, int ldelta)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006585{
Mark Shannon877df852020-11-12 09:43:29 +00006586 Py_ssize_t len = PyBytes_GET_SIZE(a->a_lnotab);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006587 if (a->a_lnotab_off + 2 >= len) {
6588 if (_PyBytes_Resize(&a->a_lnotab, len * 2) < 0)
6589 return 0;
6590 }
Pablo Galindo86e322f2021-01-30 13:54:22 +00006591 unsigned char *lnotab = (unsigned char *) PyBytes_AS_STRING(a->a_lnotab);
6592 lnotab += a->a_lnotab_off;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006593 a->a_lnotab_off += 2;
Mark Shannon877df852020-11-12 09:43:29 +00006594 *lnotab++ = bdelta;
6595 *lnotab++ = ldelta;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006596 return 1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006597}
6598
Mark Shannon877df852020-11-12 09:43:29 +00006599/* Appends a range to the end of the line number table. See
6600 * Objects/lnotab_notes.txt for the description of the line number table. */
6601
6602static int
6603assemble_line_range(struct assembler *a)
6604{
6605 int ldelta, bdelta;
6606 bdelta = (a->a_offset - a->a_lineno_start) * 2;
6607 if (bdelta == 0) {
6608 return 1;
6609 }
6610 if (a->a_lineno < 0) {
6611 ldelta = -128;
6612 }
6613 else {
6614 ldelta = a->a_lineno - a->a_prevlineno;
6615 a->a_prevlineno = a->a_lineno;
6616 while (ldelta > 127) {
6617 if (!assemble_emit_linetable_pair(a, 0, 127)) {
6618 return 0;
6619 }
6620 ldelta -= 127;
6621 }
6622 while (ldelta < -127) {
6623 if (!assemble_emit_linetable_pair(a, 0, -127)) {
6624 return 0;
6625 }
6626 ldelta += 127;
6627 }
6628 }
6629 assert(-128 <= ldelta && ldelta < 128);
6630 while (bdelta > 254) {
6631 if (!assemble_emit_linetable_pair(a, 254, ldelta)) {
6632 return 0;
6633 }
6634 ldelta = a->a_lineno < 0 ? -128 : 0;
6635 bdelta -= 254;
6636 }
6637 if (!assemble_emit_linetable_pair(a, bdelta, ldelta)) {
6638 return 0;
6639 }
6640 a->a_lineno_start = a->a_offset;
6641 return 1;
6642}
6643
6644static int
6645assemble_lnotab(struct assembler *a, struct instr *i)
6646{
6647 if (i->i_lineno == a->a_lineno) {
6648 return 1;
6649 }
6650 if (!assemble_line_range(a)) {
6651 return 0;
6652 }
6653 a->a_lineno = i->i_lineno;
6654 return 1;
6655}
6656
6657
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00006658/* assemble_emit()
6659 Extend the bytecode with a new instruction.
6660 Update lnotab if necessary.
Jeremy Hylton376e63d2003-08-28 14:42:14 +00006661*/
6662
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00006663static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00006664assemble_emit(struct assembler *a, struct instr *i)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00006665{
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03006666 int size, arg = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006667 Py_ssize_t len = PyBytes_GET_SIZE(a->a_bytecode);
Serhiy Storchakaab874002016-09-11 13:48:15 +03006668 _Py_CODEUNIT *code;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00006669
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03006670 arg = i->i_oparg;
6671 size = instrsize(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006672 if (i->i_lineno && !assemble_lnotab(a, i))
6673 return 0;
Serhiy Storchakaab874002016-09-11 13:48:15 +03006674 if (a->a_offset + size >= len / (int)sizeof(_Py_CODEUNIT)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006675 if (len > PY_SSIZE_T_MAX / 2)
6676 return 0;
6677 if (_PyBytes_Resize(&a->a_bytecode, len * 2) < 0)
6678 return 0;
6679 }
Serhiy Storchakaab874002016-09-11 13:48:15 +03006680 code = (_Py_CODEUNIT *)PyBytes_AS_STRING(a->a_bytecode) + a->a_offset;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006681 a->a_offset += size;
Serhiy Storchakaab874002016-09-11 13:48:15 +03006682 write_op_arg(code, i->i_opcode, arg, size);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006683 return 1;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00006684}
6685
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00006686static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00006687assemble_jump_offsets(struct assembler *a, struct compiler *c)
Anthony Baxterc2a5a632004-08-02 06:10:11 +00006688{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006689 basicblock *b;
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03006690 int bsize, totsize, extended_arg_recompile;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006691 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00006692
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006693 /* Compute the size of each block and fixup jump args.
6694 Replace block pointer with position in bytecode. */
6695 do {
6696 totsize = 0;
Mark Shannoncc75ab72020-11-12 19:49:33 +00006697 for (basicblock *b = a->a_entry; b != NULL; b = b->b_next) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006698 bsize = blocksize(b);
6699 b->b_offset = totsize;
6700 totsize += bsize;
6701 }
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03006702 extended_arg_recompile = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006703 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
6704 bsize = b->b_offset;
6705 for (i = 0; i < b->b_iused; i++) {
6706 struct instr *instr = &b->b_instr[i];
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03006707 int isize = instrsize(instr->i_oparg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006708 /* Relative jumps are computed relative to
6709 the instruction pointer after fetching
6710 the jump instruction.
6711 */
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03006712 bsize += isize;
Mark Shannon582aaf12020-08-04 17:30:11 +01006713 if (is_jump(instr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006714 instr->i_oparg = instr->i_target->b_offset;
Mark Shannon582aaf12020-08-04 17:30:11 +01006715 if (is_relative_jump(instr)) {
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03006716 instr->i_oparg -= bsize;
6717 }
6718 if (instrsize(instr->i_oparg) != isize) {
6719 extended_arg_recompile = 1;
6720 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006721 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006722 }
6723 }
Neal Norwitzf1d50682005-10-23 23:00:41 +00006724
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006725 /* XXX: This is an awful hack that could hurt performance, but
6726 on the bright side it should work until we come up
6727 with a better solution.
Neal Norwitzf1d50682005-10-23 23:00:41 +00006728
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006729 The issue is that in the first loop blocksize() is called
6730 which calls instrsize() which requires i_oparg be set
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03006731 appropriately. There is a bootstrap problem because
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006732 i_oparg is calculated in the second loop above.
Neal Norwitzf1d50682005-10-23 23:00:41 +00006733
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006734 So we loop until we stop seeing new EXTENDED_ARGs.
6735 The only EXTENDED_ARGs that could be popping up are
6736 ones in jump instructions. So this should converge
6737 fairly quickly.
6738 */
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03006739 } while (extended_arg_recompile);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00006740}
6741
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006742static PyObject *
Victor Stinnerad9a0662013-11-19 22:23:20 +01006743dict_keys_inorder(PyObject *dict, Py_ssize_t offset)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006744{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006745 PyObject *tuple, *k, *v;
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +02006746 Py_ssize_t i, pos = 0, size = PyDict_GET_SIZE(dict);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006747
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006748 tuple = PyTuple_New(size);
6749 if (tuple == NULL)
6750 return NULL;
6751 while (PyDict_Next(dict, &pos, &k, &v)) {
6752 i = PyLong_AS_LONG(v);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03006753 Py_INCREF(k);
6754 assert((i - offset) < size);
6755 assert((i - offset) >= 0);
6756 PyTuple_SET_ITEM(tuple, i - offset, k);
6757 }
6758 return tuple;
6759}
6760
6761static PyObject *
6762consts_dict_keys_inorder(PyObject *dict)
6763{
6764 PyObject *consts, *k, *v;
6765 Py_ssize_t i, pos = 0, size = PyDict_GET_SIZE(dict);
6766
6767 consts = PyList_New(size); /* PyCode_Optimize() requires a list */
6768 if (consts == NULL)
6769 return NULL;
6770 while (PyDict_Next(dict, &pos, &k, &v)) {
6771 i = PyLong_AS_LONG(v);
Serhiy Storchakab7e1eff2018-04-19 08:28:04 +03006772 /* The keys of the dictionary can be tuples wrapping a contant.
6773 * (see compiler_add_o and _PyCode_ConstantKey). In that case
6774 * the object we want is always second. */
6775 if (PyTuple_CheckExact(k)) {
6776 k = PyTuple_GET_ITEM(k, 1);
6777 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006778 Py_INCREF(k);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03006779 assert(i < size);
6780 assert(i >= 0);
6781 PyList_SET_ITEM(consts, i, k);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006782 }
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03006783 return consts;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006784}
6785
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006786static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00006787compute_code_flags(struct compiler *c)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006788{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006789 PySTEntryObject *ste = c->u->u_ste;
Victor Stinnerad9a0662013-11-19 22:23:20 +01006790 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006791 if (ste->ste_type == FunctionBlock) {
Benjamin Peterson1dfd2472015-04-27 21:44:22 -04006792 flags |= CO_NEWLOCALS | CO_OPTIMIZED;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006793 if (ste->ste_nested)
6794 flags |= CO_NESTED;
Yury Selivanoveb636452016-09-08 22:01:51 -07006795 if (ste->ste_generator && !ste->ste_coroutine)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006796 flags |= CO_GENERATOR;
Yury Selivanoveb636452016-09-08 22:01:51 -07006797 if (!ste->ste_generator && ste->ste_coroutine)
6798 flags |= CO_COROUTINE;
6799 if (ste->ste_generator && ste->ste_coroutine)
6800 flags |= CO_ASYNC_GENERATOR;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006801 if (ste->ste_varargs)
6802 flags |= CO_VARARGS;
6803 if (ste->ste_varkeywords)
6804 flags |= CO_VARKEYWORDS;
6805 }
Thomas Wouters5e9f1fa2006-02-28 20:02:27 +00006806
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006807 /* (Only) inherit compilerflags in PyCF_MASK */
6808 flags |= (c->c_flags->cf_flags & PyCF_MASK);
Thomas Wouters5e9f1fa2006-02-28 20:02:27 +00006809
Pablo Galindo90235812020-03-15 04:29:22 +00006810 if ((IS_TOP_LEVEL_AWAIT(c)) &&
Matthias Bussonnier565b4f12019-05-21 13:12:03 -07006811 ste->ste_coroutine &&
6812 !ste->ste_generator) {
6813 flags |= CO_COROUTINE;
6814 }
6815
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006816 return flags;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006817}
6818
Inada Naokibdb941b2021-02-10 09:20:42 +09006819// Merge *obj* with constant cache.
INADA Naokic2e16072018-11-26 21:23:22 +09006820// Unlike merge_consts_recursive(), this function doesn't work recursively.
6821static int
Inada Naokibdb941b2021-02-10 09:20:42 +09006822merge_const_one(struct compiler *c, PyObject **obj)
INADA Naokic2e16072018-11-26 21:23:22 +09006823{
Inada Naokibdb941b2021-02-10 09:20:42 +09006824 PyObject *key = _PyCode_ConstantKey(*obj);
INADA Naokic2e16072018-11-26 21:23:22 +09006825 if (key == NULL) {
6826 return 0;
6827 }
6828
6829 // t is borrowed reference
6830 PyObject *t = PyDict_SetDefault(c->c_const_cache, key, key);
6831 Py_DECREF(key);
6832 if (t == NULL) {
6833 return 0;
6834 }
Inada Naokibdb941b2021-02-10 09:20:42 +09006835 if (t == key) { // obj is new constant.
INADA Naokic2e16072018-11-26 21:23:22 +09006836 return 1;
6837 }
6838
Inada Naokibdb941b2021-02-10 09:20:42 +09006839 if (PyTuple_CheckExact(t)) {
6840 // t is still borrowed reference
6841 t = PyTuple_GET_ITEM(t, 1);
6842 }
6843
6844 Py_INCREF(t);
6845 Py_DECREF(*obj);
6846 *obj = t;
INADA Naokic2e16072018-11-26 21:23:22 +09006847 return 1;
6848}
6849
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00006850static PyCodeObject *
Mark Shannon6e8128f2020-07-30 10:03:00 +01006851makecode(struct compiler *c, struct assembler *a, PyObject *consts)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006852{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006853 PyCodeObject *co = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006854 PyObject *names = NULL;
6855 PyObject *varnames = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006856 PyObject *name = NULL;
6857 PyObject *freevars = NULL;
6858 PyObject *cellvars = NULL;
Victor Stinnerad9a0662013-11-19 22:23:20 +01006859 Py_ssize_t nlocals;
6860 int nlocals_int;
6861 int flags;
Pablo Galindocd74e662019-06-01 18:08:04 +01006862 int posorkeywordargcount, posonlyargcount, kwonlyargcount, maxdepth;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006863
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006864 names = dict_keys_inorder(c->u->u_names, 0);
6865 varnames = dict_keys_inorder(c->u->u_varnames, 0);
Mark Shannon6e8128f2020-07-30 10:03:00 +01006866 if (!names || !varnames) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006867 goto error;
Mark Shannon6e8128f2020-07-30 10:03:00 +01006868 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006869 cellvars = dict_keys_inorder(c->u->u_cellvars, 0);
6870 if (!cellvars)
6871 goto error;
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03006872 freevars = dict_keys_inorder(c->u->u_freevars, PyTuple_GET_SIZE(cellvars));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006873 if (!freevars)
6874 goto error;
Victor Stinnerad9a0662013-11-19 22:23:20 +01006875
Inada Naokibdb941b2021-02-10 09:20:42 +09006876 if (!merge_const_one(c, &names) ||
6877 !merge_const_one(c, &varnames) ||
6878 !merge_const_one(c, &cellvars) ||
6879 !merge_const_one(c, &freevars))
INADA Naokic2e16072018-11-26 21:23:22 +09006880 {
6881 goto error;
6882 }
6883
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +02006884 nlocals = PyDict_GET_SIZE(c->u->u_varnames);
Victor Stinnerad9a0662013-11-19 22:23:20 +01006885 assert(nlocals < INT_MAX);
6886 nlocals_int = Py_SAFE_DOWNCAST(nlocals, Py_ssize_t, int);
6887
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006888 flags = compute_code_flags(c);
6889 if (flags < 0)
6890 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00006891
Mark Shannon6e8128f2020-07-30 10:03:00 +01006892 consts = PyList_AsTuple(consts); /* PyCode_New requires a tuple */
6893 if (consts == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006894 goto error;
Mark Shannon6e8128f2020-07-30 10:03:00 +01006895 }
Inada Naokibdb941b2021-02-10 09:20:42 +09006896 if (!merge_const_one(c, &consts)) {
Mark Shannon6e8128f2020-07-30 10:03:00 +01006897 Py_DECREF(consts);
INADA Naokic2e16072018-11-26 21:23:22 +09006898 goto error;
6899 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006900
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01006901 posonlyargcount = Py_SAFE_DOWNCAST(c->u->u_posonlyargcount, Py_ssize_t, int);
Pablo Galindocd74e662019-06-01 18:08:04 +01006902 posorkeywordargcount = Py_SAFE_DOWNCAST(c->u->u_argcount, Py_ssize_t, int);
Victor Stinnerf8e32212013-11-19 23:56:34 +01006903 kwonlyargcount = Py_SAFE_DOWNCAST(c->u->u_kwonlyargcount, Py_ssize_t, int);
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02006904 maxdepth = stackdepth(c);
6905 if (maxdepth < 0) {
Mark Shannon6e8128f2020-07-30 10:03:00 +01006906 Py_DECREF(consts);
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02006907 goto error;
6908 }
Mark Shannon11e0b292021-04-15 14:28:56 +01006909 if (maxdepth > MAX_ALLOWED_STACK_USE) {
6910 PyErr_Format(PyExc_SystemError,
6911 "excessive stack use: stack is %d deep",
6912 maxdepth);
6913 Py_DECREF(consts);
6914 goto error;
6915 }
Pablo Galindo4a2edc32019-07-01 11:35:05 +01006916 co = PyCode_NewWithPosOnlyArgs(posonlyargcount+posorkeywordargcount,
Mark Shannon13bc1392020-01-23 09:25:17 +00006917 posonlyargcount, kwonlyargcount, nlocals_int,
Mark Shannon6e8128f2020-07-30 10:03:00 +01006918 maxdepth, flags, a->a_bytecode, consts, names,
Pablo Galindo4a2edc32019-07-01 11:35:05 +01006919 varnames, freevars, cellvars, c->c_filename,
6920 c->u->u_name, c->u->u_firstlineno, a->a_lnotab);
Mark Shannon6e8128f2020-07-30 10:03:00 +01006921 Py_DECREF(consts);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00006922 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006923 Py_XDECREF(names);
6924 Py_XDECREF(varnames);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006925 Py_XDECREF(name);
6926 Py_XDECREF(freevars);
6927 Py_XDECREF(cellvars);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006928 return co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006929}
6930
Thomas Wouters0e3f5912006-08-11 14:57:12 +00006931
6932/* For debugging purposes only */
6933#if 0
6934static void
6935dump_instr(const struct instr *i)
6936{
Mark Shannon582aaf12020-08-04 17:30:11 +01006937 const char *jrel = (is_relative_jump(instr)) ? "jrel " : "";
6938 const char *jabs = (is_jump(instr) && !is_relative_jump(instr))? "jabs " : "";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006939 char arg[128];
Thomas Wouters0e3f5912006-08-11 14:57:12 +00006940
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006941 *arg = '\0';
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03006942 if (HAS_ARG(i->i_opcode)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006943 sprintf(arg, "arg: %d ", i->i_oparg);
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03006944 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006945 fprintf(stderr, "line: %d, opcode: %d %s%s%s\n",
6946 i->i_lineno, i->i_opcode, arg, jabs, jrel);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00006947}
6948
6949static void
6950dump_basicblock(const basicblock *b)
6951{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006952 const char *b_return = b->b_return ? "return " : "";
Pablo Galindo60eb9f12020-06-28 01:55:47 +01006953 fprintf(stderr, "used: %d, depth: %d, offset: %d %s\n",
6954 b->b_iused, b->b_startdepth, b->b_offset, b_return);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006955 if (b->b_instr) {
6956 int i;
6957 for (i = 0; i < b->b_iused; i++) {
6958 fprintf(stderr, " [%02d] ", i);
6959 dump_instr(b->b_instr + i);
6960 }
6961 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00006962}
6963#endif
6964
Mark Shannon5977a792020-12-02 13:31:40 +00006965
6966static int
6967normalize_basic_block(basicblock *bb);
6968
Mark Shannon6e8128f2020-07-30 10:03:00 +01006969static int
Inada Naoki8a232c72021-04-16 14:01:04 +09006970optimize_cfg(struct compiler *c, struct assembler *a, PyObject *consts);
Mark Shannon6e8128f2020-07-30 10:03:00 +01006971
Mark Shannon5977a792020-12-02 13:31:40 +00006972static int
6973ensure_exits_have_lineno(struct compiler *c);
6974
Mark Shannonb37181e2021-04-06 11:48:59 +01006975static int
6976insert_generator_prefix(struct compiler *c, basicblock *entryblock) {
6977
6978 int flags = compute_code_flags(c);
6979 if (flags < 0) {
6980 return -1;
6981 }
6982 int kind;
6983 if (flags & (CO_GENERATOR | CO_COROUTINE | CO_ASYNC_GENERATOR)) {
6984 if (flags & CO_COROUTINE) {
6985 kind = 1;
6986 }
6987 else if (flags & CO_ASYNC_GENERATOR) {
6988 kind = 2;
6989 }
6990 else {
6991 kind = 0;
6992 }
6993 }
6994 else {
6995 return 0;
6996 }
6997 if (compiler_next_instr(entryblock) < 0) {
6998 return -1;
6999 }
7000 for (int i = entryblock->b_iused-1; i > 0; i--) {
7001 entryblock->b_instr[i] = entryblock->b_instr[i-1];
7002 }
7003 entryblock->b_instr[0].i_opcode = GEN_START;
7004 entryblock->b_instr[0].i_oparg = kind;
7005 entryblock->b_instr[0].i_lineno = -1;
7006 entryblock->b_instr[0].i_target = NULL;
7007 return 0;
7008}
7009
Mark Shannon0acdf252021-05-13 14:11:41 +01007010/* Make sure that all returns have a line number, even if early passes
7011 * have failed to propagate a correct line number.
7012 * The resulting line number may not be correct according to PEP 626,
7013 * but should be "good enough", and no worse than in older versions. */
7014static void
7015guarantee_lineno_for_exits(struct assembler *a, int firstlineno) {
7016 int lineno = firstlineno;
7017 assert(lineno > 0);
7018 for (basicblock *b = a->a_entry; b != NULL; b = b->b_next) {
7019 if (b->b_iused == 0) {
7020 continue;
7021 }
7022 struct instr *last = &b->b_instr[b->b_iused-1];
7023 if (last->i_lineno < 0) {
7024 if (last->i_opcode == RETURN_VALUE)
7025 {
7026 for (int i = 0; i < b->b_iused; i++) {
7027 assert(b->b_instr[i].i_lineno < 0);
7028 b->b_instr[i].i_lineno = lineno;
7029 }
7030 }
7031 }
7032 else {
7033 lineno = last->i_lineno;
7034 }
7035 }
7036}
7037
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00007038static PyCodeObject *
7039assemble(struct compiler *c, int addNone)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00007040{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007041 basicblock *b, *entryblock;
7042 struct assembler a;
Mark Shannoncc75ab72020-11-12 19:49:33 +00007043 int j, nblocks;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007044 PyCodeObject *co = NULL;
Mark Shannon6e8128f2020-07-30 10:03:00 +01007045 PyObject *consts = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00007046
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007047 /* Make sure every block that falls off the end returns None.
7048 XXX NEXT_BLOCK() isn't quite right, because if the last
7049 block ends with a jump or return b_next shouldn't set.
7050 */
7051 if (!c->u->u_curblock->b_return) {
Mark Shannon877df852020-11-12 09:43:29 +00007052 c->u->u_lineno = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007053 if (addNone)
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03007054 ADDOP_LOAD_CONST(c, Py_None);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007055 ADDOP(c, RETURN_VALUE);
7056 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00007057
Mark Shannon5977a792020-12-02 13:31:40 +00007058 for (basicblock *b = c->u->u_blocks; b != NULL; b = b->b_list) {
7059 if (normalize_basic_block(b)) {
Alex Henrie503627f2021-03-02 03:20:25 -07007060 return NULL;
Mark Shannon5977a792020-12-02 13:31:40 +00007061 }
7062 }
7063
7064 if (ensure_exits_have_lineno(c)) {
Alex Henrie503627f2021-03-02 03:20:25 -07007065 return NULL;
Mark Shannon5977a792020-12-02 13:31:40 +00007066 }
7067
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007068 nblocks = 0;
7069 entryblock = NULL;
7070 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
7071 nblocks++;
7072 entryblock = b;
7073 }
Mark Shannon67969f52021-04-07 10:52:07 +01007074 assert(entryblock != NULL);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00007075
Mark Shannonb37181e2021-04-06 11:48:59 +01007076 if (insert_generator_prefix(c, entryblock)) {
7077 goto error;
7078 }
7079
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007080 /* Set firstlineno if it wasn't explicitly set. */
7081 if (!c->u->u_firstlineno) {
Mark Shannon67969f52021-04-07 10:52:07 +01007082 if (entryblock->b_instr && entryblock->b_instr->i_lineno)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007083 c->u->u_firstlineno = entryblock->b_instr->i_lineno;
Mark Shannon877df852020-11-12 09:43:29 +00007084 else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007085 c->u->u_firstlineno = 1;
7086 }
Mark Shannon5977a792020-12-02 13:31:40 +00007087
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007088 if (!assemble_init(&a, nblocks, c->u->u_firstlineno))
7089 goto error;
Mark Shannoncc75ab72020-11-12 19:49:33 +00007090 a.a_entry = entryblock;
7091 a.a_nblocks = nblocks;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00007092
Mark Shannon6e8128f2020-07-30 10:03:00 +01007093 consts = consts_dict_keys_inorder(c->u->u_consts);
7094 if (consts == NULL) {
7095 goto error;
7096 }
Inada Naoki8a232c72021-04-16 14:01:04 +09007097 if (optimize_cfg(c, &a, consts)) {
Mark Shannon6e8128f2020-07-30 10:03:00 +01007098 goto error;
7099 }
Mark Shannon0acdf252021-05-13 14:11:41 +01007100 guarantee_lineno_for_exits(&a, c->u->u_firstlineno);
Mark Shannon6e8128f2020-07-30 10:03:00 +01007101
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007102 /* Can't modify the bytecode after computing jump offsets. */
7103 assemble_jump_offsets(&a, c);
Tim Petersb6c3cea2001-06-26 03:36:28 +00007104
Mark Shannoncc75ab72020-11-12 19:49:33 +00007105 /* Emit code. */
7106 for(b = entryblock; b != NULL; b = b->b_next) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007107 for (j = 0; j < b->b_iused; j++)
7108 if (!assemble_emit(&a, &b->b_instr[j]))
7109 goto error;
7110 }
Mark Shannon877df852020-11-12 09:43:29 +00007111 if (!assemble_line_range(&a)) {
7112 return 0;
7113 }
Tim Petersb6c3cea2001-06-26 03:36:28 +00007114
Inada Naokibdb941b2021-02-10 09:20:42 +09007115 if (_PyBytes_Resize(&a.a_lnotab, a.a_lnotab_off) < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007116 goto error;
Inada Naokibdb941b2021-02-10 09:20:42 +09007117 }
7118 if (!merge_const_one(c, &a.a_lnotab)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007119 goto error;
Inada Naokibdb941b2021-02-10 09:20:42 +09007120 }
7121 if (_PyBytes_Resize(&a.a_bytecode, a.a_offset * sizeof(_Py_CODEUNIT)) < 0) {
7122 goto error;
7123 }
7124 if (!merge_const_one(c, &a.a_bytecode)) {
7125 goto error;
7126 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00007127
Mark Shannon6e8128f2020-07-30 10:03:00 +01007128 co = makecode(c, &a, consts);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00007129 error:
Mark Shannon6e8128f2020-07-30 10:03:00 +01007130 Py_XDECREF(consts);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007131 assemble_free(&a);
7132 return co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00007133}
Georg Brandl8334fd92010-12-04 10:26:46 +00007134
Mark Shannon6e8128f2020-07-30 10:03:00 +01007135/* Replace LOAD_CONST c1, LOAD_CONST c2 ... LOAD_CONST cn, BUILD_TUPLE n
7136 with LOAD_CONST (c1, c2, ... cn).
7137 The consts table must still be in list form so that the
7138 new constant (c1, c2, ... cn) can be appended.
7139 Called with codestr pointing to the first LOAD_CONST.
7140*/
7141static int
Inada Naoki8a232c72021-04-16 14:01:04 +09007142fold_tuple_on_constants(struct compiler *c,
7143 struct instr *inst,
Mark Shannon6e8128f2020-07-30 10:03:00 +01007144 int n, PyObject *consts)
7145{
7146 /* Pre-conditions */
7147 assert(PyList_CheckExact(consts));
7148 assert(inst[n].i_opcode == BUILD_TUPLE);
7149 assert(inst[n].i_oparg == n);
7150
7151 for (int i = 0; i < n; i++) {
7152 if (inst[i].i_opcode != LOAD_CONST) {
7153 return 0;
7154 }
7155 }
7156
7157 /* Buildup new tuple of constants */
7158 PyObject *newconst = PyTuple_New(n);
7159 if (newconst == NULL) {
7160 return -1;
7161 }
7162 for (int i = 0; i < n; i++) {
7163 int arg = inst[i].i_oparg;
7164 PyObject *constant = PyList_GET_ITEM(consts, arg);
7165 Py_INCREF(constant);
7166 PyTuple_SET_ITEM(newconst, i, constant);
7167 }
Inada Naoki8a232c72021-04-16 14:01:04 +09007168 if (merge_const_one(c, &newconst) == 0) {
Mark Shannon6e8128f2020-07-30 10:03:00 +01007169 Py_DECREF(newconst);
Mark Shannon6e8128f2020-07-30 10:03:00 +01007170 return -1;
7171 }
Inada Naoki8a232c72021-04-16 14:01:04 +09007172
7173 Py_ssize_t index;
7174 for (index = 0; index < PyList_GET_SIZE(consts); index++) {
7175 if (PyList_GET_ITEM(consts, index) == newconst) {
7176 break;
7177 }
7178 }
7179 if (index == PyList_GET_SIZE(consts)) {
7180 if ((size_t)index >= (size_t)INT_MAX - 1) {
7181 Py_DECREF(newconst);
7182 PyErr_SetString(PyExc_OverflowError, "too many constants");
7183 return -1;
7184 }
7185 if (PyList_Append(consts, newconst)) {
7186 Py_DECREF(newconst);
7187 return -1;
7188 }
Mark Shannon6e8128f2020-07-30 10:03:00 +01007189 }
7190 Py_DECREF(newconst);
7191 for (int i = 0; i < n; i++) {
7192 inst[i].i_opcode = NOP;
7193 }
7194 inst[n].i_opcode = LOAD_CONST;
Victor Stinner71f2ff42020-09-23 14:06:55 +02007195 inst[n].i_oparg = (int)index;
Mark Shannon6e8128f2020-07-30 10:03:00 +01007196 return 0;
7197}
7198
Mark Shannon28b75c82020-12-23 11:43:10 +00007199
Brandt Bucher0ad1e032021-05-02 13:02:10 -07007200// Eliminate n * ROT_N(n).
7201static void
7202fold_rotations(struct instr *inst, int n)
7203{
7204 for (int i = 0; i < n; i++) {
7205 int rot;
7206 switch (inst[i].i_opcode) {
7207 case ROT_N:
7208 rot = inst[i].i_oparg;
7209 break;
7210 case ROT_FOUR:
7211 rot = 4;
7212 break;
7213 case ROT_THREE:
7214 rot = 3;
7215 break;
7216 case ROT_TWO:
7217 rot = 2;
7218 break;
7219 default:
7220 return;
7221 }
7222 if (rot != n) {
7223 return;
7224 }
7225 }
7226 for (int i = 0; i < n; i++) {
7227 inst[i].i_opcode = NOP;
7228 }
7229}
7230
7231
Mark Shannon28b75c82020-12-23 11:43:10 +00007232static int
7233eliminate_jump_to_jump(basicblock *bb, int opcode) {
7234 assert (bb->b_iused > 0);
7235 struct instr *inst = &bb->b_instr[bb->b_iused-1];
7236 assert (is_jump(inst));
7237 assert (inst->i_target->b_iused > 0);
7238 struct instr *target = &inst->i_target->b_instr[0];
7239 if (inst->i_target == target->i_target) {
7240 /* Nothing to do */
7241 return 0;
7242 }
7243 int lineno = target->i_lineno;
7244 if (add_jump_to_block(bb, opcode, lineno, target->i_target) == 0) {
7245 return -1;
7246 }
7247 assert (bb->b_iused >= 2);
7248 bb->b_instr[bb->b_iused-2].i_opcode = NOP;
7249 return 0;
7250}
7251
Mark Shannoncc75ab72020-11-12 19:49:33 +00007252/* Maximum size of basic block that should be copied in optimizer */
7253#define MAX_COPY_SIZE 4
Mark Shannon6e8128f2020-07-30 10:03:00 +01007254
7255/* Optimization */
7256static int
Inada Naoki8a232c72021-04-16 14:01:04 +09007257optimize_basic_block(struct compiler *c, basicblock *bb, PyObject *consts)
Mark Shannon6e8128f2020-07-30 10:03:00 +01007258{
7259 assert(PyList_CheckExact(consts));
7260 struct instr nop;
7261 nop.i_opcode = NOP;
7262 struct instr *target;
Mark Shannon6e8128f2020-07-30 10:03:00 +01007263 for (int i = 0; i < bb->b_iused; i++) {
7264 struct instr *inst = &bb->b_instr[i];
7265 int oparg = inst->i_oparg;
7266 int nextop = i+1 < bb->b_iused ? bb->b_instr[i+1].i_opcode : 0;
Mark Shannon582aaf12020-08-04 17:30:11 +01007267 if (is_jump(inst)) {
Mark Shannon6e8128f2020-07-30 10:03:00 +01007268 /* Skip over empty basic blocks. */
7269 while (inst->i_target->b_iused == 0) {
7270 inst->i_target = inst->i_target->b_next;
7271 }
7272 target = &inst->i_target->b_instr[0];
7273 }
7274 else {
7275 target = &nop;
7276 }
7277 switch (inst->i_opcode) {
Mark Shannon266b4622020-11-17 19:30:14 +00007278 /* Remove LOAD_CONST const; conditional jump */
Mark Shannon6e8128f2020-07-30 10:03:00 +01007279 case LOAD_CONST:
Mark Shannon266b4622020-11-17 19:30:14 +00007280 {
7281 PyObject* cnt;
7282 int is_true;
7283 int jump_if_true;
7284 switch(nextop) {
7285 case POP_JUMP_IF_FALSE:
7286 case POP_JUMP_IF_TRUE:
7287 cnt = PyList_GET_ITEM(consts, oparg);
7288 is_true = PyObject_IsTrue(cnt);
7289 if (is_true == -1) {
7290 goto error;
7291 }
7292 inst->i_opcode = NOP;
7293 jump_if_true = nextop == POP_JUMP_IF_TRUE;
7294 if (is_true == jump_if_true) {
7295 bb->b_instr[i+1].i_opcode = JUMP_ABSOLUTE;
7296 bb->b_nofallthrough = 1;
7297 }
7298 else {
7299 bb->b_instr[i+1].i_opcode = NOP;
7300 }
7301 break;
7302 case JUMP_IF_FALSE_OR_POP:
7303 case JUMP_IF_TRUE_OR_POP:
7304 cnt = PyList_GET_ITEM(consts, oparg);
7305 is_true = PyObject_IsTrue(cnt);
7306 if (is_true == -1) {
7307 goto error;
7308 }
7309 jump_if_true = nextop == JUMP_IF_TRUE_OR_POP;
7310 if (is_true == jump_if_true) {
7311 bb->b_instr[i+1].i_opcode = JUMP_ABSOLUTE;
7312 bb->b_nofallthrough = 1;
7313 }
7314 else {
7315 inst->i_opcode = NOP;
7316 bb->b_instr[i+1].i_opcode = NOP;
7317 }
7318 break;
Mark Shannon6e8128f2020-07-30 10:03:00 +01007319 }
7320 break;
Mark Shannon266b4622020-11-17 19:30:14 +00007321 }
Mark Shannon6e8128f2020-07-30 10:03:00 +01007322
7323 /* Try to fold tuples of constants.
7324 Skip over BUILD_SEQN 1 UNPACK_SEQN 1.
7325 Replace BUILD_SEQN 2 UNPACK_SEQN 2 with ROT2.
7326 Replace BUILD_SEQN 3 UNPACK_SEQN 3 with ROT3 ROT2. */
7327 case BUILD_TUPLE:
7328 if (nextop == UNPACK_SEQUENCE && oparg == bb->b_instr[i+1].i_oparg) {
7329 switch(oparg) {
7330 case 1:
7331 inst->i_opcode = NOP;
7332 bb->b_instr[i+1].i_opcode = NOP;
7333 break;
7334 case 2:
7335 inst->i_opcode = ROT_TWO;
7336 bb->b_instr[i+1].i_opcode = NOP;
7337 break;
7338 case 3:
7339 inst->i_opcode = ROT_THREE;
7340 bb->b_instr[i+1].i_opcode = ROT_TWO;
7341 }
7342 break;
7343 }
7344 if (i >= oparg) {
Inada Naoki8a232c72021-04-16 14:01:04 +09007345 if (fold_tuple_on_constants(c, inst-oparg, oparg, consts)) {
Mark Shannon6e8128f2020-07-30 10:03:00 +01007346 goto error;
7347 }
7348 }
7349 break;
7350
7351 /* Simplify conditional jump to conditional jump where the
7352 result of the first test implies the success of a similar
7353 test or the failure of the opposite test.
7354 Arises in code like:
7355 "a and b or c"
7356 "(a and b) and c"
7357 "(a or b) or c"
7358 "(a or b) and c"
7359 x:JUMP_IF_FALSE_OR_POP y y:JUMP_IF_FALSE_OR_POP z
7360 --> x:JUMP_IF_FALSE_OR_POP z
7361 x:JUMP_IF_FALSE_OR_POP y y:JUMP_IF_TRUE_OR_POP z
7362 --> x:POP_JUMP_IF_FALSE y+1
7363 where y+1 is the instruction following the second test.
7364 */
7365 case JUMP_IF_FALSE_OR_POP:
7366 switch(target->i_opcode) {
7367 case POP_JUMP_IF_FALSE:
Mark Shannon28b75c82020-12-23 11:43:10 +00007368 if (inst->i_lineno == target->i_lineno) {
7369 *inst = *target;
7370 i--;
7371 }
Mark Shannon6e8128f2020-07-30 10:03:00 +01007372 break;
7373 case JUMP_ABSOLUTE:
7374 case JUMP_FORWARD:
7375 case JUMP_IF_FALSE_OR_POP:
Mark Shannon28b75c82020-12-23 11:43:10 +00007376 if (inst->i_lineno == target->i_lineno &&
7377 inst->i_target != target->i_target) {
Mark Shannon266b4622020-11-17 19:30:14 +00007378 inst->i_target = target->i_target;
Mark Shannon28b75c82020-12-23 11:43:10 +00007379 i--;
Mark Shannon266b4622020-11-17 19:30:14 +00007380 }
Mark Shannon6e8128f2020-07-30 10:03:00 +01007381 break;
7382 case JUMP_IF_TRUE_OR_POP:
7383 assert (inst->i_target->b_iused == 1);
Mark Shannon28b75c82020-12-23 11:43:10 +00007384 if (inst->i_lineno == target->i_lineno) {
7385 inst->i_opcode = POP_JUMP_IF_FALSE;
7386 inst->i_target = inst->i_target->b_next;
7387 --i;
7388 }
Mark Shannon6e8128f2020-07-30 10:03:00 +01007389 break;
7390 }
7391 break;
7392
7393 case JUMP_IF_TRUE_OR_POP:
7394 switch(target->i_opcode) {
7395 case POP_JUMP_IF_TRUE:
Mark Shannon28b75c82020-12-23 11:43:10 +00007396 if (inst->i_lineno == target->i_lineno) {
7397 *inst = *target;
7398 i--;
7399 }
Mark Shannon6e8128f2020-07-30 10:03:00 +01007400 break;
7401 case JUMP_ABSOLUTE:
7402 case JUMP_FORWARD:
7403 case JUMP_IF_TRUE_OR_POP:
Mark Shannon28b75c82020-12-23 11:43:10 +00007404 if (inst->i_lineno == target->i_lineno &&
7405 inst->i_target != target->i_target) {
Mark Shannon266b4622020-11-17 19:30:14 +00007406 inst->i_target = target->i_target;
Mark Shannon28b75c82020-12-23 11:43:10 +00007407 i--;
Mark Shannon266b4622020-11-17 19:30:14 +00007408 }
Mark Shannon6e8128f2020-07-30 10:03:00 +01007409 break;
7410 case JUMP_IF_FALSE_OR_POP:
7411 assert (inst->i_target->b_iused == 1);
Mark Shannon28b75c82020-12-23 11:43:10 +00007412 if (inst->i_lineno == target->i_lineno) {
7413 inst->i_opcode = POP_JUMP_IF_TRUE;
7414 inst->i_target = inst->i_target->b_next;
7415 --i;
7416 }
Mark Shannon6e8128f2020-07-30 10:03:00 +01007417 break;
7418 }
7419 break;
7420
7421 case POP_JUMP_IF_FALSE:
7422 switch(target->i_opcode) {
7423 case JUMP_ABSOLUTE:
7424 case JUMP_FORWARD:
Mark Shannon28b75c82020-12-23 11:43:10 +00007425 if (inst->i_lineno == target->i_lineno) {
Mark Shannon266b4622020-11-17 19:30:14 +00007426 inst->i_target = target->i_target;
Mark Shannon28b75c82020-12-23 11:43:10 +00007427 i--;
Mark Shannon266b4622020-11-17 19:30:14 +00007428 }
Mark Shannon6e8128f2020-07-30 10:03:00 +01007429 break;
7430 }
7431 break;
7432
7433 case POP_JUMP_IF_TRUE:
7434 switch(target->i_opcode) {
7435 case JUMP_ABSOLUTE:
7436 case JUMP_FORWARD:
Mark Shannon28b75c82020-12-23 11:43:10 +00007437 if (inst->i_lineno == target->i_lineno) {
Mark Shannon266b4622020-11-17 19:30:14 +00007438 inst->i_target = target->i_target;
Mark Shannon28b75c82020-12-23 11:43:10 +00007439 i--;
Mark Shannon266b4622020-11-17 19:30:14 +00007440 }
Mark Shannon6e8128f2020-07-30 10:03:00 +01007441 break;
7442 }
7443 break;
7444
7445 case JUMP_ABSOLUTE:
7446 case JUMP_FORWARD:
Mark Shannoncc75ab72020-11-12 19:49:33 +00007447 assert (i == bb->b_iused-1);
Mark Shannon6e8128f2020-07-30 10:03:00 +01007448 switch(target->i_opcode) {
7449 case JUMP_FORWARD:
Mark Shannon28b75c82020-12-23 11:43:10 +00007450 if (eliminate_jump_to_jump(bb, inst->i_opcode)) {
7451 goto error;
Mark Shannon266b4622020-11-17 19:30:14 +00007452 }
Mark Shannon6e8128f2020-07-30 10:03:00 +01007453 break;
Mark Shannon28b75c82020-12-23 11:43:10 +00007454
Mark Shannon6e8128f2020-07-30 10:03:00 +01007455 case JUMP_ABSOLUTE:
Mark Shannon28b75c82020-12-23 11:43:10 +00007456 if (eliminate_jump_to_jump(bb, JUMP_ABSOLUTE)) {
7457 goto error;
Mark Shannon266b4622020-11-17 19:30:14 +00007458 }
Mark Shannon6e8128f2020-07-30 10:03:00 +01007459 break;
Mark Shannon28b75c82020-12-23 11:43:10 +00007460 default:
7461 if (inst->i_target->b_exit && inst->i_target->b_iused <= MAX_COPY_SIZE) {
7462 basicblock *to_copy = inst->i_target;
7463 inst->i_opcode = NOP;
7464 for (i = 0; i < to_copy->b_iused; i++) {
7465 int index = compiler_next_instr(bb);
7466 if (index < 0) {
7467 return -1;
7468 }
7469 bb->b_instr[index] = to_copy->b_instr[i];
7470 }
7471 bb->b_exit = 1;
Mark Shannoncc75ab72020-11-12 19:49:33 +00007472 }
Mark Shannoncc75ab72020-11-12 19:49:33 +00007473 }
Brandt Bucher0ad1e032021-05-02 13:02:10 -07007474 break;
7475 case ROT_N:
7476 switch (oparg) {
7477 case 0:
7478 case 1:
7479 inst->i_opcode = NOP;
7480 continue;
7481 case 2:
7482 inst->i_opcode = ROT_TWO;
7483 break;
7484 case 3:
7485 inst->i_opcode = ROT_THREE;
7486 break;
7487 case 4:
7488 inst->i_opcode = ROT_FOUR;
7489 break;
7490 }
7491 if (i >= oparg - 1) {
7492 fold_rotations(inst - oparg + 1, oparg);
7493 }
7494 break;
Mark Shannon6e8128f2020-07-30 10:03:00 +01007495 }
7496 }
7497 return 0;
7498error:
7499 return -1;
7500}
7501
7502
7503static void
Mark Shannon1659ad12021-01-13 15:05:04 +00007504clean_basic_block(basicblock *bb, int prev_lineno) {
7505 /* Remove NOPs when legal to do so. */
Mark Shannon6e8128f2020-07-30 10:03:00 +01007506 int dest = 0;
7507 for (int src = 0; src < bb->b_iused; src++) {
Mark Shannon877df852020-11-12 09:43:29 +00007508 int lineno = bb->b_instr[src].i_lineno;
Mark Shannoncc75ab72020-11-12 19:49:33 +00007509 if (bb->b_instr[src].i_opcode == NOP) {
Mark Shannon266b4622020-11-17 19:30:14 +00007510 /* Eliminate no-op if it doesn't have a line number */
Mark Shannoncc75ab72020-11-12 19:49:33 +00007511 if (lineno < 0) {
7512 continue;
7513 }
Mark Shannon266b4622020-11-17 19:30:14 +00007514 /* or, if the previous instruction had the same line number. */
Mark Shannoncc75ab72020-11-12 19:49:33 +00007515 if (prev_lineno == lineno) {
7516 continue;
7517 }
Mark Shannon266b4622020-11-17 19:30:14 +00007518 /* or, if the next instruction has same line number or no line number */
Mark Shannoncc75ab72020-11-12 19:49:33 +00007519 if (src < bb->b_iused - 1) {
7520 int next_lineno = bb->b_instr[src+1].i_lineno;
7521 if (next_lineno < 0 || next_lineno == lineno) {
7522 bb->b_instr[src+1].i_lineno = lineno;
7523 continue;
Mark Shannon877df852020-11-12 09:43:29 +00007524 }
7525 }
Mark Shannon266b4622020-11-17 19:30:14 +00007526 else {
7527 basicblock* next = bb->b_next;
7528 while (next && next->b_iused == 0) {
7529 next = next->b_next;
7530 }
7531 /* or if last instruction in BB and next BB has same line number */
7532 if (next) {
7533 if (lineno == next->b_instr[0].i_lineno) {
7534 continue;
7535 }
7536 }
7537 }
7538
Mark Shannon6e8128f2020-07-30 10:03:00 +01007539 }
Mark Shannoncc75ab72020-11-12 19:49:33 +00007540 if (dest != src) {
7541 bb->b_instr[dest] = bb->b_instr[src];
7542 }
7543 dest++;
7544 prev_lineno = lineno;
Mark Shannon6e8128f2020-07-30 10:03:00 +01007545 }
Mark Shannon6e8128f2020-07-30 10:03:00 +01007546 assert(dest <= bb->b_iused);
7547 bb->b_iused = dest;
7548}
7549
Mark Shannon266b4622020-11-17 19:30:14 +00007550static int
7551normalize_basic_block(basicblock *bb) {
7552 /* Mark blocks as exit and/or nofallthrough.
7553 Raise SystemError if CFG is malformed. */
Mark Shannoncc75ab72020-11-12 19:49:33 +00007554 for (int i = 0; i < bb->b_iused; i++) {
7555 switch(bb->b_instr[i].i_opcode) {
7556 case RETURN_VALUE:
7557 case RAISE_VARARGS:
7558 case RERAISE:
Mark Shannoncc75ab72020-11-12 19:49:33 +00007559 bb->b_exit = 1;
Mark Shannon5977a792020-12-02 13:31:40 +00007560 bb->b_nofallthrough = 1;
7561 break;
Mark Shannoncc75ab72020-11-12 19:49:33 +00007562 case JUMP_ABSOLUTE:
7563 case JUMP_FORWARD:
Mark Shannoncc75ab72020-11-12 19:49:33 +00007564 bb->b_nofallthrough = 1;
Mark Shannon266b4622020-11-17 19:30:14 +00007565 /* fall through */
7566 case POP_JUMP_IF_FALSE:
7567 case POP_JUMP_IF_TRUE:
7568 case JUMP_IF_FALSE_OR_POP:
7569 case JUMP_IF_TRUE_OR_POP:
Mark Shannon5977a792020-12-02 13:31:40 +00007570 case FOR_ITER:
Mark Shannon266b4622020-11-17 19:30:14 +00007571 if (i != bb->b_iused-1) {
7572 PyErr_SetString(PyExc_SystemError, "malformed control flow graph.");
7573 return -1;
7574 }
Mark Shannon5977a792020-12-02 13:31:40 +00007575 /* Skip over empty basic blocks. */
7576 while (bb->b_instr[i].i_target->b_iused == 0) {
7577 bb->b_instr[i].i_target = bb->b_instr[i].i_target->b_next;
7578 }
7579
Mark Shannoncc75ab72020-11-12 19:49:33 +00007580 }
7581 }
Mark Shannon266b4622020-11-17 19:30:14 +00007582 return 0;
Mark Shannoncc75ab72020-11-12 19:49:33 +00007583}
7584
Mark Shannon6e8128f2020-07-30 10:03:00 +01007585static int
7586mark_reachable(struct assembler *a) {
7587 basicblock **stack, **sp;
7588 sp = stack = (basicblock **)PyObject_Malloc(sizeof(basicblock *) * a->a_nblocks);
7589 if (stack == NULL) {
7590 return -1;
7591 }
Mark Shannon3bd60352021-01-13 12:05:43 +00007592 a->a_entry->b_predecessors = 1;
Mark Shannoncc75ab72020-11-12 19:49:33 +00007593 *sp++ = a->a_entry;
Mark Shannon6e8128f2020-07-30 10:03:00 +01007594 while (sp > stack) {
7595 basicblock *b = *(--sp);
Mark Shannon3bd60352021-01-13 12:05:43 +00007596 if (b->b_next && !b->b_nofallthrough) {
7597 if (b->b_next->b_predecessors == 0) {
7598 *sp++ = b->b_next;
7599 }
7600 b->b_next->b_predecessors++;
Mark Shannon6e8128f2020-07-30 10:03:00 +01007601 }
7602 for (int i = 0; i < b->b_iused; i++) {
7603 basicblock *target;
Mark Shannon582aaf12020-08-04 17:30:11 +01007604 if (is_jump(&b->b_instr[i])) {
Mark Shannon6e8128f2020-07-30 10:03:00 +01007605 target = b->b_instr[i].i_target;
Mark Shannon3bd60352021-01-13 12:05:43 +00007606 if (target->b_predecessors == 0) {
Mark Shannon6e8128f2020-07-30 10:03:00 +01007607 *sp++ = target;
7608 }
Mark Shannon3bd60352021-01-13 12:05:43 +00007609 target->b_predecessors++;
Mark Shannon6e8128f2020-07-30 10:03:00 +01007610 }
7611 }
7612 }
7613 PyObject_Free(stack);
7614 return 0;
7615}
7616
Mark Shannon3bd60352021-01-13 12:05:43 +00007617static void
7618eliminate_empty_basic_blocks(basicblock *entry) {
7619 /* Eliminate empty blocks */
7620 for (basicblock *b = entry; b != NULL; b = b->b_next) {
7621 basicblock *next = b->b_next;
7622 if (next) {
7623 while (next->b_iused == 0 && next->b_next) {
7624 next = next->b_next;
7625 }
7626 b->b_next = next;
7627 }
7628 }
7629 for (basicblock *b = entry; b != NULL; b = b->b_next) {
7630 if (b->b_iused == 0) {
7631 continue;
7632 }
7633 if (is_jump(&b->b_instr[b->b_iused-1])) {
7634 basicblock *target = b->b_instr[b->b_iused-1].i_target;
7635 while (target->b_iused == 0) {
7636 target = target->b_next;
7637 }
7638 b->b_instr[b->b_iused-1].i_target = target;
7639 }
7640 }
7641}
7642
7643
Mark Shannon5977a792020-12-02 13:31:40 +00007644/* If an instruction has no line number, but it's predecessor in the BB does,
Mark Shannon3bd60352021-01-13 12:05:43 +00007645 * then copy the line number. If a successor block has no line number, and only
7646 * one predecessor, then inherit the line number.
7647 * This ensures that all exit blocks (with one predecessor) receive a line number.
7648 * Also reduces the size of the line number table,
Mark Shannon5977a792020-12-02 13:31:40 +00007649 * but has no impact on the generated line number events.
7650 */
7651static void
Mark Shannon3bd60352021-01-13 12:05:43 +00007652propogate_line_numbers(struct assembler *a) {
Mark Shannon5977a792020-12-02 13:31:40 +00007653 for (basicblock *b = a->a_entry; b != NULL; b = b->b_next) {
Mark Shannon3bd60352021-01-13 12:05:43 +00007654 if (b->b_iused == 0) {
7655 continue;
7656 }
Mark Shannon5977a792020-12-02 13:31:40 +00007657 int prev_lineno = -1;
7658 for (int i = 0; i < b->b_iused; i++) {
7659 if (b->b_instr[i].i_lineno < 0) {
7660 b->b_instr[i].i_lineno = prev_lineno;
7661 }
7662 else {
7663 prev_lineno = b->b_instr[i].i_lineno;
7664 }
7665 }
Mark Shannon3bd60352021-01-13 12:05:43 +00007666 if (!b->b_nofallthrough && b->b_next->b_predecessors == 1) {
7667 assert(b->b_next->b_iused);
7668 if (b->b_next->b_instr[0].i_lineno < 0) {
7669 b->b_next->b_instr[0].i_lineno = prev_lineno;
7670 }
7671 }
7672 if (is_jump(&b->b_instr[b->b_iused-1])) {
7673 switch (b->b_instr[b->b_iused-1].i_opcode) {
7674 /* Note: Only actual jumps, not exception handlers */
7675 case SETUP_ASYNC_WITH:
7676 case SETUP_WITH:
7677 case SETUP_FINALLY:
7678 continue;
7679 }
7680 basicblock *target = b->b_instr[b->b_iused-1].i_target;
7681 if (target->b_predecessors == 1) {
7682 if (target->b_instr[0].i_lineno < 0) {
7683 target->b_instr[0].i_lineno = prev_lineno;
7684 }
7685 }
7686 }
Mark Shannon5977a792020-12-02 13:31:40 +00007687 }
7688}
7689
7690/* Perform optimizations on a control flow graph.
Mark Shannon6e8128f2020-07-30 10:03:00 +01007691 The consts object should still be in list form to allow new constants
7692 to be appended.
7693
7694 All transformations keep the code size the same or smaller.
7695 For those that reduce size, the gaps are initially filled with
7696 NOPs. Later those NOPs are removed.
7697*/
7698
7699static int
Inada Naoki8a232c72021-04-16 14:01:04 +09007700optimize_cfg(struct compiler *c, struct assembler *a, PyObject *consts)
Mark Shannon6e8128f2020-07-30 10:03:00 +01007701{
Mark Shannoncc75ab72020-11-12 19:49:33 +00007702 for (basicblock *b = a->a_entry; b != NULL; b = b->b_next) {
Inada Naoki8a232c72021-04-16 14:01:04 +09007703 if (optimize_basic_block(c, b, consts)) {
Mark Shannon6e8128f2020-07-30 10:03:00 +01007704 return -1;
7705 }
Mark Shannon1659ad12021-01-13 15:05:04 +00007706 clean_basic_block(b, -1);
Mark Shannon3bd60352021-01-13 12:05:43 +00007707 assert(b->b_predecessors == 0);
Mark Shannon6e8128f2020-07-30 10:03:00 +01007708 }
7709 if (mark_reachable(a)) {
7710 return -1;
7711 }
7712 /* Delete unreachable instructions */
Mark Shannoncc75ab72020-11-12 19:49:33 +00007713 for (basicblock *b = a->a_entry; b != NULL; b = b->b_next) {
Mark Shannon3bd60352021-01-13 12:05:43 +00007714 if (b->b_predecessors == 0) {
Mark Shannoncc75ab72020-11-12 19:49:33 +00007715 b->b_iused = 0;
Om Gc71581c2020-12-16 17:48:05 +05307716 b->b_nofallthrough = 0;
Mark Shannon6e8128f2020-07-30 10:03:00 +01007717 }
7718 }
Mark Shannon1659ad12021-01-13 15:05:04 +00007719 basicblock *pred = NULL;
7720 for (basicblock *b = a->a_entry; b != NULL; b = b->b_next) {
7721 int prev_lineno = -1;
7722 if (pred && pred->b_iused) {
7723 prev_lineno = pred->b_instr[pred->b_iused-1].i_lineno;
7724 }
7725 clean_basic_block(b, prev_lineno);
7726 pred = b->b_nofallthrough ? NULL : b;
7727 }
Mark Shannon3bd60352021-01-13 12:05:43 +00007728 eliminate_empty_basic_blocks(a->a_entry);
Om Gc71581c2020-12-16 17:48:05 +05307729 /* Delete jump instructions made redundant by previous step. If a non-empty
7730 block ends with a jump instruction, check if the next non-empty block
7731 reached through normal flow control is the target of that jump. If it
7732 is, then the jump instruction is redundant and can be deleted.
7733 */
Mark Shannon3bd60352021-01-13 12:05:43 +00007734 int maybe_empty_blocks = 0;
Om Gc71581c2020-12-16 17:48:05 +05307735 for (basicblock *b = a->a_entry; b != NULL; b = b->b_next) {
7736 if (b->b_iused > 0) {
7737 struct instr *b_last_instr = &b->b_instr[b->b_iused - 1];
Mark Shannon802b6452021-02-02 14:59:15 +00007738 if (b_last_instr->i_opcode == JUMP_ABSOLUTE ||
Om Gc71581c2020-12-16 17:48:05 +05307739 b_last_instr->i_opcode == JUMP_FORWARD) {
Mark Shannon3bd60352021-01-13 12:05:43 +00007740 if (b_last_instr->i_target == b->b_next) {
7741 assert(b->b_next->b_iused);
Om Gc71581c2020-12-16 17:48:05 +05307742 b->b_nofallthrough = 0;
Mark Shannon802b6452021-02-02 14:59:15 +00007743 b_last_instr->i_opcode = NOP;
7744 clean_basic_block(b, -1);
7745 maybe_empty_blocks = 1;
Om Gc71581c2020-12-16 17:48:05 +05307746 }
7747 }
7748 }
7749 }
Mark Shannon3bd60352021-01-13 12:05:43 +00007750 if (maybe_empty_blocks) {
7751 eliminate_empty_basic_blocks(a->a_entry);
7752 }
7753 propogate_line_numbers(a);
Mark Shannon6e8128f2020-07-30 10:03:00 +01007754 return 0;
7755}
7756
Mark Shannon5977a792020-12-02 13:31:40 +00007757static inline int
7758is_exit_without_lineno(basicblock *b) {
7759 return b->b_exit && b->b_instr[0].i_lineno < 0;
7760}
7761
7762/* PEP 626 mandates that the f_lineno of a frame is correct
7763 * after a frame terminates. It would be prohibitively expensive
7764 * to continuously update the f_lineno field at runtime,
7765 * so we make sure that all exiting instruction (raises and returns)
7766 * have a valid line number, allowing us to compute f_lineno lazily.
7767 * We can do this by duplicating the exit blocks without line number
7768 * so that none have more than one predecessor. We can then safely
7769 * copy the line number from the sole predecessor block.
7770 */
7771static int
7772ensure_exits_have_lineno(struct compiler *c)
7773{
Mark Shannoneaccc122020-12-04 15:22:12 +00007774 basicblock *entry = NULL;
Mark Shannon5977a792020-12-02 13:31:40 +00007775 /* Copy all exit blocks without line number that are targets of a jump.
7776 */
7777 for (basicblock *b = c->u->u_blocks; b != NULL; b = b->b_list) {
7778 if (b->b_iused > 0 && is_jump(&b->b_instr[b->b_iused-1])) {
7779 switch (b->b_instr[b->b_iused-1].i_opcode) {
7780 /* Note: Only actual jumps, not exception handlers */
7781 case SETUP_ASYNC_WITH:
7782 case SETUP_WITH:
7783 case SETUP_FINALLY:
7784 continue;
7785 }
7786 basicblock *target = b->b_instr[b->b_iused-1].i_target;
7787 if (is_exit_without_lineno(target)) {
7788 basicblock *new_target = compiler_copy_block(c, target);
7789 if (new_target == NULL) {
7790 return -1;
7791 }
7792 new_target->b_instr[0].i_lineno = b->b_instr[b->b_iused-1].i_lineno;
7793 b->b_instr[b->b_iused-1].i_target = new_target;
7794 }
7795 }
Mark Shannoneaccc122020-12-04 15:22:12 +00007796 entry = b;
7797 }
7798 assert(entry != NULL);
7799 if (is_exit_without_lineno(entry)) {
7800 entry->b_instr[0].i_lineno = c->u->u_firstlineno;
Mark Shannon5977a792020-12-02 13:31:40 +00007801 }
Mark Shannonee9f98d2021-01-05 12:04:10 +00007802 /* Eliminate empty blocks */
7803 for (basicblock *b = c->u->u_blocks; b != NULL; b = b->b_list) {
7804 while (b->b_next && b->b_next->b_iused == 0) {
7805 b->b_next = b->b_next->b_next;
7806 }
7807 }
Mark Shannon5977a792020-12-02 13:31:40 +00007808 /* Any remaining reachable exit blocks without line number can only be reached by
7809 * fall through, and thus can only have a single predecessor */
7810 for (basicblock *b = c->u->u_blocks; b != NULL; b = b->b_list) {
7811 if (!b->b_nofallthrough && b->b_next && b->b_iused > 0) {
7812 if (is_exit_without_lineno(b->b_next)) {
7813 assert(b->b_next->b_iused > 0);
7814 b->b_next->b_instr[0].i_lineno = b->b_instr[b->b_iused-1].i_lineno;
7815 }
7816 }
7817 }
7818 return 0;
7819}
7820
7821
Mark Shannon6e8128f2020-07-30 10:03:00 +01007822/* Retained for API compatibility.
7823 * Optimization is now done in optimize_cfg */
7824
7825PyObject *
7826PyCode_Optimize(PyObject *code, PyObject* Py_UNUSED(consts),
7827 PyObject *Py_UNUSED(names), PyObject *Py_UNUSED(lnotab_obj))
7828{
7829 Py_INCREF(code);
7830 return code;
7831}