blob: c7a0ae402bf2340d8fc13ccd351e289e58afd53a [file] [log] [blame]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001/*
2 * This file compiles an abstract syntax tree (AST) into Python bytecode.
3 *
4 * The primary entry point is PyAST_Compile(), which returns a
5 * PyCodeObject. The compiler makes several passes to build the code
6 * object:
7 * 1. Checks for future statements. See future.c
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 Stinnerc9bc2902020-10-27 02:24:34 +010025#include "pycore_long.h" // _PyLong_GetZero()
Guido van Rossum3f5da241990-12-20 15:06:42 +000026
Ammar Askare92d3932020-01-15 11:48:40 -050027#include "Python-ast.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000028#include "ast.h"
29#include "code.h"
Jeremy Hylton4b38da62001-02-02 18:19:15 +000030#include "symtable.h"
Mark Shannon582aaf12020-08-04 17:30:11 +010031#define NEED_OPCODE_JUMP_TABLES
Guido van Rossum10dc2e81990-11-18 17:27:39 +000032#include "opcode.h"
Serhiy Storchakab0f80b02016-05-24 09:15:14 +030033#include "wordcode_helpers.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000034
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000035#define DEFAULT_BLOCK_SIZE 16
36#define DEFAULT_BLOCKS 8
37#define DEFAULT_CODE_SIZE 128
38#define DEFAULT_LNOTAB_SIZE 16
Jeremy Hylton29906ee2001-02-27 04:23:34 +000039
Nick Coghlan650f0d02007-04-15 12:05:43 +000040#define COMP_GENEXP 0
41#define COMP_LISTCOMP 1
42#define COMP_SETCOMP 2
Guido van Rossum992d4a32007-07-11 13:09:30 +000043#define COMP_DICTCOMP 3
Nick Coghlan650f0d02007-04-15 12:05:43 +000044
Pablo Galindo90235812020-03-15 04:29:22 +000045#define IS_TOP_LEVEL_AWAIT(c) ( \
46 (c->c_flags->cf_flags & PyCF_ALLOW_TOP_LEVEL_AWAIT) \
47 && (c->u->u_ste->ste_type == ModuleBlock))
48
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000049struct instr {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000050 unsigned char i_opcode;
51 int i_oparg;
52 struct basicblock_ *i_target; /* target block (if jump instruction) */
53 int i_lineno;
Guido van Rossum3f5da241990-12-20 15:06:42 +000054};
55
Mark Shannon582aaf12020-08-04 17:30:11 +010056#define LOG_BITS_PER_INT 5
57#define MASK_LOW_LOG_BITS 31
58
59static inline int
60is_bit_set_in_table(uint32_t *table, int bitindex) {
61 /* Is the relevant bit set in the relevant word? */
62 /* 256 bits fit into 8 32-bits words.
63 * Word is indexed by (bitindex>>ln(size of int in bits)).
64 * Bit within word is the low bits of bitindex.
65 */
66 uint32_t word = table[bitindex >> LOG_BITS_PER_INT];
67 return (word >> (bitindex & MASK_LOW_LOG_BITS)) & 1;
68}
69
70static inline int
71is_relative_jump(struct instr *i)
72{
73 return is_bit_set_in_table(_PyOpcode_RelativeJump, i->i_opcode);
74}
75
76static inline int
77is_jump(struct instr *i)
78{
79 return is_bit_set_in_table(_PyOpcode_Jump, i->i_opcode);
80}
81
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000082typedef struct basicblock_ {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000083 /* Each basicblock in a compilation unit is linked via b_list in the
84 reverse order that the block are allocated. b_list points to the next
85 block, not to be confused with b_next, which is next by control flow. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000086 struct basicblock_ *b_list;
87 /* number of instructions used */
88 int b_iused;
89 /* length of instruction array (b_instr) */
90 int b_ialloc;
91 /* pointer to an array of instructions, initially NULL */
92 struct instr *b_instr;
93 /* If b_next is non-NULL, it is a pointer to the next
94 block reached by normal control flow. */
95 struct basicblock_ *b_next;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000096 /* b_return is true if a RETURN_VALUE opcode is inserted. */
97 unsigned b_return : 1;
Mark Shannon6e8128f2020-07-30 10:03:00 +010098 unsigned b_reachable : 1;
Mark Shannoncc75ab72020-11-12 19:49:33 +000099 /* Basic block has no fall through (it ends with a return, raise or jump) */
100 unsigned b_nofallthrough : 1;
101 /* Basic block exits scope (it ends with a return or raise) */
102 unsigned b_exit : 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000103 /* depth of stack upon entry of block, computed by stackdepth() */
104 int b_startdepth;
105 /* instruction offset for block, computed by assemble_jump_offsets() */
106 int b_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000107} basicblock;
108
109/* fblockinfo tracks the current frame block.
110
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000111A frame block is used to handle loops, try/except, and try/finally.
112It's called a frame block to distinguish it from a basic block in the
113compiler IR.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000114*/
115
Mark Shannon02d126a2020-09-25 14:04:19 +0100116enum fblocktype { WHILE_LOOP, FOR_LOOP, TRY_EXCEPT, FINALLY_TRY, FINALLY_END,
117 WITH, ASYNC_WITH, HANDLER_CLEANUP, POP_VALUE, EXCEPTION_HANDLER };
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000118
119struct fblockinfo {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000120 enum fblocktype fb_type;
121 basicblock *fb_block;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +0200122 /* (optional) type-specific exit or cleanup block */
123 basicblock *fb_exit;
Mark Shannonfee55262019-11-21 09:11:43 +0000124 /* (optional) additional information required for unwinding */
125 void *fb_datum;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000126};
127
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100128enum {
129 COMPILER_SCOPE_MODULE,
130 COMPILER_SCOPE_CLASS,
131 COMPILER_SCOPE_FUNCTION,
Yury Selivanov75445082015-05-11 22:57:16 -0400132 COMPILER_SCOPE_ASYNC_FUNCTION,
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400133 COMPILER_SCOPE_LAMBDA,
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100134 COMPILER_SCOPE_COMPREHENSION,
135};
136
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000137/* The following items change on entry and exit of code blocks.
138 They must be saved and restored when returning to a block.
139*/
140struct compiler_unit {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000141 PySTEntryObject *u_ste;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000142
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000143 PyObject *u_name;
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400144 PyObject *u_qualname; /* dot-separated qualified name (lazy) */
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100145 int u_scope_type;
146
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000147 /* The following fields are dicts that map objects to
148 the index of them in co_XXX. The index is used as
149 the argument for opcodes that refer to those collections.
150 */
151 PyObject *u_consts; /* all constants */
152 PyObject *u_names; /* all names */
153 PyObject *u_varnames; /* local variables */
154 PyObject *u_cellvars; /* cell variables */
155 PyObject *u_freevars; /* free variables */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000156
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000157 PyObject *u_private; /* for private name mangling */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000158
Victor Stinnerf8e32212013-11-19 23:56:34 +0100159 Py_ssize_t u_argcount; /* number of arguments for block */
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100160 Py_ssize_t u_posonlyargcount; /* number of positional only arguments for block */
Victor Stinnerf8e32212013-11-19 23:56:34 +0100161 Py_ssize_t u_kwonlyargcount; /* number of keyword only arguments for block */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000162 /* Pointer to the most recently allocated block. By following b_list
163 members, you can reach all early allocated blocks. */
164 basicblock *u_blocks;
165 basicblock *u_curblock; /* pointer to current block */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000166
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000167 int u_nfblocks;
168 struct fblockinfo u_fblock[CO_MAXBLOCKS];
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000169
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000170 int u_firstlineno; /* the first lineno of the block */
171 int u_lineno; /* the lineno for the current stmt */
Benjamin Petersond4efd9e2010-09-20 23:02:10 +0000172 int u_col_offset; /* the offset of the current stmt */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000173};
174
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000175/* This struct captures the global state of a compilation.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000176
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000177The u pointer points to the current compilation unit, while units
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000178for enclosing blocks are stored in c_stack. The u and c_stack are
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000179managed by compiler_enter_scope() and compiler_exit_scope().
Nick Coghlanaab9c2b2012-11-04 23:14:34 +1000180
181Note that we don't track recursion levels during compilation - the
182task of detecting and rejecting excessive levels of nesting is
183handled by the symbol analysis pass.
184
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000185*/
186
187struct compiler {
Victor Stinner14e461d2013-08-26 22:28:21 +0200188 PyObject *c_filename;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000189 struct symtable *c_st;
190 PyFutureFeatures *c_future; /* pointer to module's __future__ */
191 PyCompilerFlags *c_flags;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000192
Georg Brandl8334fd92010-12-04 10:26:46 +0000193 int c_optimize; /* optimization level */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000194 int c_interactive; /* true if in interactive mode */
195 int c_nestlevel;
Pablo Galindo18c5f9d2019-07-15 10:15:01 +0100196 int c_do_not_emit_bytecode; /* The compiler won't emit any bytecode
197 if this value is different from zero.
198 This can be used to temporarily visit
199 nodes without emitting bytecode to
200 check only errors. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000201
INADA Naokic2e16072018-11-26 21:23:22 +0900202 PyObject *c_const_cache; /* Python dict holding all constants,
203 including names tuple */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000204 struct compiler_unit *u; /* compiler state for current block */
205 PyObject *c_stack; /* Python list holding compiler_unit ptrs */
206 PyArena *c_arena; /* pointer to memory allocation arena */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000207};
208
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100209static int compiler_enter_scope(struct compiler *, identifier, int, void *, int);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000210static void compiler_free(struct compiler *);
211static basicblock *compiler_new_block(struct compiler *);
Andy Lester76d58772020-03-10 21:18:12 -0500212static int compiler_next_instr(basicblock *);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000213static int compiler_addop(struct compiler *, int);
Victor Stinnerf8e32212013-11-19 23:56:34 +0100214static int compiler_addop_i(struct compiler *, int, Py_ssize_t);
Mark Shannon582aaf12020-08-04 17:30:11 +0100215static int compiler_addop_j(struct compiler *, int, basicblock *);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000216static int compiler_error(struct compiler *, const char *);
Serhiy Storchaka62e44812019-02-16 08:12:19 +0200217static int compiler_warn(struct compiler *, const char *, ...);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000218static int compiler_nameop(struct compiler *, identifier, expr_context_ty);
219
220static PyCodeObject *compiler_mod(struct compiler *, mod_ty);
221static int compiler_visit_stmt(struct compiler *, stmt_ty);
222static int compiler_visit_keyword(struct compiler *, keyword_ty);
223static int compiler_visit_expr(struct compiler *, expr_ty);
224static int compiler_augassign(struct compiler *, stmt_ty);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -0700225static int compiler_annassign(struct compiler *, stmt_ty);
Serhiy Storchaka13d52c22020-03-10 18:52:34 +0200226static int compiler_subscript(struct compiler *, expr_ty);
227static int compiler_slice(struct compiler *, expr_ty);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000228
Andy Lester76d58772020-03-10 21:18:12 -0500229static int inplace_binop(operator_ty);
Pablo Galindoa5634c42020-09-16 19:42:00 +0100230static int are_all_items_const(asdl_expr_seq *, Py_ssize_t, Py_ssize_t);
Serhiy Storchaka3dfbaf52017-12-25 12:47:50 +0200231static int expr_constant(expr_ty);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000232
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -0500233static int compiler_with(struct compiler *, stmt_ty, int);
Yury Selivanov75445082015-05-11 22:57:16 -0400234static int compiler_async_with(struct compiler *, stmt_ty, int);
235static int compiler_async_for(struct compiler *, stmt_ty);
Victor Stinner976bb402016-03-23 11:36:19 +0100236static int compiler_call_helper(struct compiler *c, int n,
Pablo Galindoa5634c42020-09-16 19:42:00 +0100237 asdl_expr_seq *args,
238 asdl_keyword_seq *keywords);
Benjamin Peterson43af12b2011-05-29 11:43:10 -0500239static int compiler_try_except(struct compiler *, stmt_ty);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400240static int compiler_set_qualname(struct compiler *);
Guido van Rossumc2e20742006-02-27 22:32:47 +0000241
Yury Selivanov52c4e7c2016-09-09 10:36:01 -0700242static int compiler_sync_comprehension_generator(
243 struct compiler *c,
Pablo Galindoa5634c42020-09-16 19:42:00 +0100244 asdl_comprehension_seq *generators, int gen_index,
Serhiy Storchaka8c579b12020-02-12 12:18:59 +0200245 int depth,
Yury Selivanov52c4e7c2016-09-09 10:36:01 -0700246 expr_ty elt, expr_ty val, int type);
247
248static int compiler_async_comprehension_generator(
249 struct compiler *c,
Pablo Galindoa5634c42020-09-16 19:42:00 +0100250 asdl_comprehension_seq *generators, int gen_index,
Serhiy Storchaka8c579b12020-02-12 12:18:59 +0200251 int depth,
Yury Selivanov52c4e7c2016-09-09 10:36:01 -0700252 expr_ty elt, expr_ty val, int type);
253
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000254static PyCodeObject *assemble(struct compiler *, int addNone);
Mark Shannon332cd5e2018-01-30 00:41:04 +0000255static PyObject *__doc__, *__annotations__;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000256
Benjamin Peterson9e77f722015-05-07 18:41:47 -0400257#define CAPSULE_NAME "compile.c compiler unit"
Benjamin Petersonb173f782009-05-05 22:31:58 +0000258
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000259PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000260_Py_Mangle(PyObject *privateobj, PyObject *ident)
Michael W. Hudson60934622004-08-12 17:56:29 +0000261{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000262 /* Name mangling: __private becomes _classname__private.
263 This is independent from how the name is used. */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200264 PyObject *result;
265 size_t nlen, plen, ipriv;
266 Py_UCS4 maxchar;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000267 if (privateobj == NULL || !PyUnicode_Check(privateobj) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200268 PyUnicode_READ_CHAR(ident, 0) != '_' ||
269 PyUnicode_READ_CHAR(ident, 1) != '_') {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000270 Py_INCREF(ident);
271 return ident;
272 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200273 nlen = PyUnicode_GET_LENGTH(ident);
274 plen = PyUnicode_GET_LENGTH(privateobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000275 /* Don't mangle __id__ or names with dots.
Guido van Rossumd8faa362007-04-27 19:54:29 +0000276
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000277 The only time a name with a dot can occur is when
278 we are compiling an import statement that has a
279 package name.
Guido van Rossumd8faa362007-04-27 19:54:29 +0000280
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000281 TODO(jhylton): Decide whether we want to support
282 mangling of the module name, e.g. __M.X.
283 */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200284 if ((PyUnicode_READ_CHAR(ident, nlen-1) == '_' &&
285 PyUnicode_READ_CHAR(ident, nlen-2) == '_') ||
286 PyUnicode_FindChar(ident, '.', 0, nlen, 1) != -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000287 Py_INCREF(ident);
288 return ident; /* Don't mangle __whatever__ */
289 }
290 /* Strip leading underscores from class name */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200291 ipriv = 0;
292 while (PyUnicode_READ_CHAR(privateobj, ipriv) == '_')
293 ipriv++;
294 if (ipriv == plen) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000295 Py_INCREF(ident);
296 return ident; /* Don't mangle if class is just underscores */
297 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200298 plen -= ipriv;
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000299
Antoine Pitrou55bff892013-04-06 21:21:04 +0200300 if (plen + nlen >= PY_SSIZE_T_MAX - 1) {
301 PyErr_SetString(PyExc_OverflowError,
302 "private identifier too large to be mangled");
303 return NULL;
304 }
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000305
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200306 maxchar = PyUnicode_MAX_CHAR_VALUE(ident);
307 if (PyUnicode_MAX_CHAR_VALUE(privateobj) > maxchar)
308 maxchar = PyUnicode_MAX_CHAR_VALUE(privateobj);
309
310 result = PyUnicode_New(1 + nlen + plen, maxchar);
311 if (!result)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000312 return 0;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200313 /* ident = "_" + priv[ipriv:] + ident # i.e. 1+plen+nlen bytes */
314 PyUnicode_WRITE(PyUnicode_KIND(result), PyUnicode_DATA(result), 0, '_');
Victor Stinner6c7a52a2011-09-28 21:39:17 +0200315 if (PyUnicode_CopyCharacters(result, 1, privateobj, ipriv, plen) < 0) {
316 Py_DECREF(result);
317 return NULL;
318 }
319 if (PyUnicode_CopyCharacters(result, plen+1, ident, 0, nlen) < 0) {
320 Py_DECREF(result);
321 return NULL;
322 }
Victor Stinner8f825062012-04-27 13:55:39 +0200323 assert(_PyUnicode_CheckConsistency(result, 1));
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200324 return result;
Michael W. Hudson60934622004-08-12 17:56:29 +0000325}
326
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000327static int
328compiler_init(struct compiler *c)
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000329{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000330 memset(c, 0, sizeof(struct compiler));
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000331
INADA Naokic2e16072018-11-26 21:23:22 +0900332 c->c_const_cache = PyDict_New();
333 if (!c->c_const_cache) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000334 return 0;
INADA Naokic2e16072018-11-26 21:23:22 +0900335 }
336
337 c->c_stack = PyList_New(0);
338 if (!c->c_stack) {
339 Py_CLEAR(c->c_const_cache);
340 return 0;
341 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000342
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000343 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000344}
345
346PyCodeObject *
Victor Stinner14e461d2013-08-26 22:28:21 +0200347PyAST_CompileObject(mod_ty mod, PyObject *filename, PyCompilerFlags *flags,
348 int optimize, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000349{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000350 struct compiler c;
351 PyCodeObject *co = NULL;
Victor Stinner37d66d72019-06-13 02:16:41 +0200352 PyCompilerFlags local_flags = _PyCompilerFlags_INIT;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000353 int merged;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000354
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000355 if (!__doc__) {
356 __doc__ = PyUnicode_InternFromString("__doc__");
357 if (!__doc__)
358 return NULL;
359 }
Mark Shannon332cd5e2018-01-30 00:41:04 +0000360 if (!__annotations__) {
361 __annotations__ = PyUnicode_InternFromString("__annotations__");
362 if (!__annotations__)
363 return NULL;
364 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000365 if (!compiler_init(&c))
366 return NULL;
Victor Stinner14e461d2013-08-26 22:28:21 +0200367 Py_INCREF(filename);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000368 c.c_filename = filename;
369 c.c_arena = arena;
Victor Stinner14e461d2013-08-26 22:28:21 +0200370 c.c_future = PyFuture_FromASTObject(mod, filename);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000371 if (c.c_future == NULL)
372 goto finally;
373 if (!flags) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000374 flags = &local_flags;
375 }
376 merged = c.c_future->ff_features | flags->cf_flags;
377 c.c_future->ff_features = merged;
378 flags->cf_flags = merged;
379 c.c_flags = flags;
Victor Stinnerda7933e2020-04-13 03:04:28 +0200380 c.c_optimize = (optimize == -1) ? _Py_GetConfig()->optimization_level : optimize;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000381 c.c_nestlevel = 0;
Pablo Galindo18c5f9d2019-07-15 10:15:01 +0100382 c.c_do_not_emit_bytecode = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000383
Pablo Galindod112c602020-03-18 23:02:09 +0000384 _PyASTOptimizeState state;
385 state.optimize = c.c_optimize;
386 state.ff_features = merged;
387
388 if (!_PyAST_Optimize(mod, arena, &state)) {
INADA Naoki7ea143a2017-12-14 16:47:20 +0900389 goto finally;
390 }
391
Victor Stinner14e461d2013-08-26 22:28:21 +0200392 c.c_st = PySymtable_BuildObject(mod, filename, c.c_future);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000393 if (c.c_st == NULL) {
394 if (!PyErr_Occurred())
395 PyErr_SetString(PyExc_SystemError, "no symtable");
396 goto finally;
397 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000398
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000399 co = compiler_mod(&c, mod);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000400
Thomas Wouters1175c432006-02-27 22:49:54 +0000401 finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000402 compiler_free(&c);
403 assert(co || PyErr_Occurred());
404 return co;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000405}
406
407PyCodeObject *
Victor Stinner14e461d2013-08-26 22:28:21 +0200408PyAST_CompileEx(mod_ty mod, const char *filename_str, PyCompilerFlags *flags,
409 int optimize, PyArena *arena)
410{
411 PyObject *filename;
412 PyCodeObject *co;
413 filename = PyUnicode_DecodeFSDefault(filename_str);
414 if (filename == NULL)
415 return NULL;
416 co = PyAST_CompileObject(mod, filename, flags, optimize, arena);
417 Py_DECREF(filename);
418 return co;
419
420}
421
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000422static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000423compiler_free(struct compiler *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000424{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000425 if (c->c_st)
426 PySymtable_Free(c->c_st);
427 if (c->c_future)
428 PyObject_Free(c->c_future);
Victor Stinner14e461d2013-08-26 22:28:21 +0200429 Py_XDECREF(c->c_filename);
INADA Naokic2e16072018-11-26 21:23:22 +0900430 Py_DECREF(c->c_const_cache);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000431 Py_DECREF(c->c_stack);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000432}
433
Guido van Rossum79f25d91997-04-29 20:08:16 +0000434static PyObject *
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000435list2dict(PyObject *list)
Guido van Rossum2dff9911992-09-03 20:50:59 +0000436{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000437 Py_ssize_t i, n;
438 PyObject *v, *k;
439 PyObject *dict = PyDict_New();
440 if (!dict) return NULL;
Guido van Rossumd076c731998-10-07 19:42:25 +0000441
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000442 n = PyList_Size(list);
443 for (i = 0; i < n; i++) {
Victor Stinnerad9a0662013-11-19 22:23:20 +0100444 v = PyLong_FromSsize_t(i);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000445 if (!v) {
446 Py_DECREF(dict);
447 return NULL;
448 }
449 k = PyList_GET_ITEM(list, i);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +0300450 if (PyDict_SetItem(dict, k, v) < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000451 Py_DECREF(v);
452 Py_DECREF(dict);
453 return NULL;
454 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000455 Py_DECREF(v);
456 }
457 return dict;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000458}
459
460/* Return new dict containing names from src that match scope(s).
461
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000462src is a symbol table dictionary. If the scope of a name matches
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000463either scope_type or flag is set, insert it into the new dict. The
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000464values are integers, starting at offset and increasing by one for
465each key.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000466*/
467
468static PyObject *
Victor Stinnerad9a0662013-11-19 22:23:20 +0100469dictbytype(PyObject *src, int scope_type, int flag, Py_ssize_t offset)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000470{
Benjamin Peterson51ab2832012-07-18 15:12:47 -0700471 Py_ssize_t i = offset, scope, num_keys, key_i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000472 PyObject *k, *v, *dest = PyDict_New();
Meador Inge2ca63152012-07-18 14:20:11 -0500473 PyObject *sorted_keys;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000474
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000475 assert(offset >= 0);
476 if (dest == NULL)
477 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000478
Meador Inge2ca63152012-07-18 14:20:11 -0500479 /* Sort the keys so that we have a deterministic order on the indexes
480 saved in the returned dictionary. These indexes are used as indexes
481 into the free and cell var storage. Therefore if they aren't
482 deterministic, then the generated bytecode is not deterministic.
483 */
484 sorted_keys = PyDict_Keys(src);
485 if (sorted_keys == NULL)
486 return NULL;
487 if (PyList_Sort(sorted_keys) != 0) {
488 Py_DECREF(sorted_keys);
489 return NULL;
490 }
Meador Ingef69e24e2012-07-18 16:41:03 -0500491 num_keys = PyList_GET_SIZE(sorted_keys);
Meador Inge2ca63152012-07-18 14:20:11 -0500492
493 for (key_i = 0; key_i < num_keys; key_i++) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000494 /* XXX this should probably be a macro in symtable.h */
495 long vi;
Meador Inge2ca63152012-07-18 14:20:11 -0500496 k = PyList_GET_ITEM(sorted_keys, key_i);
Serhiy Storchakafb5db7e2020-10-26 08:43:39 +0200497 v = PyDict_GetItemWithError(src, k);
498 assert(v && PyLong_Check(v));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000499 vi = PyLong_AS_LONG(v);
500 scope = (vi >> SCOPE_OFFSET) & SCOPE_MASK;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000501
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000502 if (scope == scope_type || vi & flag) {
Serhiy Storchakad70c2a62018-04-20 16:01:25 +0300503 PyObject *item = PyLong_FromSsize_t(i);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000504 if (item == NULL) {
Meador Inge2ca63152012-07-18 14:20:11 -0500505 Py_DECREF(sorted_keys);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000506 Py_DECREF(dest);
507 return NULL;
508 }
509 i++;
Serhiy Storchakad70c2a62018-04-20 16:01:25 +0300510 if (PyDict_SetItem(dest, k, item) < 0) {
Meador Inge2ca63152012-07-18 14:20:11 -0500511 Py_DECREF(sorted_keys);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000512 Py_DECREF(item);
513 Py_DECREF(dest);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000514 return NULL;
515 }
516 Py_DECREF(item);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000517 }
518 }
Meador Inge2ca63152012-07-18 14:20:11 -0500519 Py_DECREF(sorted_keys);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000520 return dest;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000521}
522
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000523static void
524compiler_unit_check(struct compiler_unit *u)
525{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000526 basicblock *block;
527 for (block = u->u_blocks; block != NULL; block = block->b_list) {
Benjamin Petersonca470632016-09-06 13:47:26 -0700528 assert((uintptr_t)block != 0xcbcbcbcbU);
529 assert((uintptr_t)block != 0xfbfbfbfbU);
530 assert((uintptr_t)block != 0xdbdbdbdbU);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000531 if (block->b_instr != NULL) {
532 assert(block->b_ialloc > 0);
Mark Shannon6e8128f2020-07-30 10:03:00 +0100533 assert(block->b_iused >= 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000534 assert(block->b_ialloc >= block->b_iused);
535 }
536 else {
537 assert (block->b_iused == 0);
538 assert (block->b_ialloc == 0);
539 }
540 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000541}
542
543static void
544compiler_unit_free(struct compiler_unit *u)
545{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000546 basicblock *b, *next;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000547
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000548 compiler_unit_check(u);
549 b = u->u_blocks;
550 while (b != NULL) {
551 if (b->b_instr)
552 PyObject_Free((void *)b->b_instr);
553 next = b->b_list;
554 PyObject_Free((void *)b);
555 b = next;
556 }
557 Py_CLEAR(u->u_ste);
558 Py_CLEAR(u->u_name);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400559 Py_CLEAR(u->u_qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000560 Py_CLEAR(u->u_consts);
561 Py_CLEAR(u->u_names);
562 Py_CLEAR(u->u_varnames);
563 Py_CLEAR(u->u_freevars);
564 Py_CLEAR(u->u_cellvars);
565 Py_CLEAR(u->u_private);
566 PyObject_Free(u);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000567}
568
569static int
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100570compiler_enter_scope(struct compiler *c, identifier name,
571 int scope_type, void *key, int lineno)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000572{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000573 struct compiler_unit *u;
Victor Stinnerfc6f2ef2016-02-27 02:19:22 +0100574 basicblock *block;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000575
Andy Lester7668a8b2020-03-24 23:26:44 -0500576 u = (struct compiler_unit *)PyObject_Calloc(1, sizeof(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000577 struct compiler_unit));
578 if (!u) {
579 PyErr_NoMemory();
580 return 0;
581 }
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100582 u->u_scope_type = scope_type;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000583 u->u_argcount = 0;
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100584 u->u_posonlyargcount = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000585 u->u_kwonlyargcount = 0;
586 u->u_ste = PySymtable_Lookup(c->c_st, key);
587 if (!u->u_ste) {
588 compiler_unit_free(u);
589 return 0;
590 }
591 Py_INCREF(name);
592 u->u_name = name;
593 u->u_varnames = list2dict(u->u_ste->ste_varnames);
594 u->u_cellvars = dictbytype(u->u_ste->ste_symbols, CELL, 0, 0);
595 if (!u->u_varnames || !u->u_cellvars) {
596 compiler_unit_free(u);
597 return 0;
598 }
Benjamin Peterson312595c2013-05-15 15:26:42 -0500599 if (u->u_ste->ste_needs_class_closure) {
Martin Panter7462b6492015-11-02 03:37:02 +0000600 /* Cook up an implicit __class__ cell. */
Benjamin Peterson312595c2013-05-15 15:26:42 -0500601 _Py_IDENTIFIER(__class__);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +0300602 PyObject *name;
Benjamin Peterson312595c2013-05-15 15:26:42 -0500603 int res;
604 assert(u->u_scope_type == COMPILER_SCOPE_CLASS);
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +0200605 assert(PyDict_GET_SIZE(u->u_cellvars) == 0);
Benjamin Peterson312595c2013-05-15 15:26:42 -0500606 name = _PyUnicode_FromId(&PyId___class__);
607 if (!name) {
608 compiler_unit_free(u);
609 return 0;
610 }
Victor Stinnerc9bc2902020-10-27 02:24:34 +0100611 res = PyDict_SetItem(u->u_cellvars, name, _PyLong_GetZero());
Benjamin Peterson312595c2013-05-15 15:26:42 -0500612 if (res < 0) {
613 compiler_unit_free(u);
614 return 0;
615 }
616 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000617
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000618 u->u_freevars = dictbytype(u->u_ste->ste_symbols, FREE, DEF_FREE_CLASS,
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +0200619 PyDict_GET_SIZE(u->u_cellvars));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000620 if (!u->u_freevars) {
621 compiler_unit_free(u);
622 return 0;
623 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000624
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000625 u->u_blocks = NULL;
626 u->u_nfblocks = 0;
627 u->u_firstlineno = lineno;
628 u->u_lineno = 0;
Benjamin Petersond4efd9e2010-09-20 23:02:10 +0000629 u->u_col_offset = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000630 u->u_consts = PyDict_New();
631 if (!u->u_consts) {
632 compiler_unit_free(u);
633 return 0;
634 }
635 u->u_names = PyDict_New();
636 if (!u->u_names) {
637 compiler_unit_free(u);
638 return 0;
639 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000640
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000641 u->u_private = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000642
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000643 /* Push the old compiler_unit on the stack. */
644 if (c->u) {
Benjamin Peterson9e77f722015-05-07 18:41:47 -0400645 PyObject *capsule = PyCapsule_New(c->u, CAPSULE_NAME, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000646 if (!capsule || PyList_Append(c->c_stack, capsule) < 0) {
647 Py_XDECREF(capsule);
648 compiler_unit_free(u);
649 return 0;
650 }
651 Py_DECREF(capsule);
652 u->u_private = c->u->u_private;
653 Py_XINCREF(u->u_private);
654 }
655 c->u = u;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000656
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000657 c->c_nestlevel++;
Victor Stinnerfc6f2ef2016-02-27 02:19:22 +0100658
659 block = compiler_new_block(c);
660 if (block == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000661 return 0;
Victor Stinnerfc6f2ef2016-02-27 02:19:22 +0100662 c->u->u_curblock = block;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000663
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400664 if (u->u_scope_type != COMPILER_SCOPE_MODULE) {
665 if (!compiler_set_qualname(c))
666 return 0;
667 }
668
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000669 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000670}
671
Neil Schemenauerc396d9e2005-10-25 06:30:14 +0000672static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000673compiler_exit_scope(struct compiler *c)
674{
Victor Stinnerad9a0662013-11-19 22:23:20 +0100675 Py_ssize_t n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000676 PyObject *capsule;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000677
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000678 c->c_nestlevel--;
679 compiler_unit_free(c->u);
680 /* Restore c->u to the parent unit. */
681 n = PyList_GET_SIZE(c->c_stack) - 1;
682 if (n >= 0) {
683 capsule = PyList_GET_ITEM(c->c_stack, n);
Benjamin Peterson9e77f722015-05-07 18:41:47 -0400684 c->u = (struct compiler_unit *)PyCapsule_GetPointer(capsule, CAPSULE_NAME);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000685 assert(c->u);
686 /* we are deleting from a list so this really shouldn't fail */
687 if (PySequence_DelItem(c->c_stack, n) < 0)
688 Py_FatalError("compiler_exit_scope()");
689 compiler_unit_check(c->u);
690 }
691 else
692 c->u = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000693
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000694}
695
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400696static int
697compiler_set_qualname(struct compiler *c)
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100698{
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100699 _Py_static_string(dot, ".");
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400700 _Py_static_string(dot_locals, ".<locals>");
701 Py_ssize_t stack_size;
702 struct compiler_unit *u = c->u;
703 PyObject *name, *base, *dot_str, *dot_locals_str;
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100704
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400705 base = NULL;
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100706 stack_size = PyList_GET_SIZE(c->c_stack);
Benjamin Petersona8a38b82013-10-19 16:14:39 -0400707 assert(stack_size >= 1);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400708 if (stack_size > 1) {
709 int scope, force_global = 0;
710 struct compiler_unit *parent;
711 PyObject *mangled, *capsule;
712
Benjamin Peterson3d9e4812013-10-19 16:01:13 -0400713 capsule = PyList_GET_ITEM(c->c_stack, stack_size - 1);
Benjamin Peterson9e77f722015-05-07 18:41:47 -0400714 parent = (struct compiler_unit *)PyCapsule_GetPointer(capsule, CAPSULE_NAME);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400715 assert(parent);
716
Yury Selivanov75445082015-05-11 22:57:16 -0400717 if (u->u_scope_type == COMPILER_SCOPE_FUNCTION
718 || u->u_scope_type == COMPILER_SCOPE_ASYNC_FUNCTION
719 || u->u_scope_type == COMPILER_SCOPE_CLASS) {
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400720 assert(u->u_name);
721 mangled = _Py_Mangle(parent->u_private, u->u_name);
722 if (!mangled)
723 return 0;
724 scope = PyST_GetScope(parent->u_ste, mangled);
725 Py_DECREF(mangled);
726 assert(scope != GLOBAL_IMPLICIT);
727 if (scope == GLOBAL_EXPLICIT)
728 force_global = 1;
729 }
730
731 if (!force_global) {
732 if (parent->u_scope_type == COMPILER_SCOPE_FUNCTION
Yury Selivanov75445082015-05-11 22:57:16 -0400733 || parent->u_scope_type == COMPILER_SCOPE_ASYNC_FUNCTION
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400734 || parent->u_scope_type == COMPILER_SCOPE_LAMBDA) {
735 dot_locals_str = _PyUnicode_FromId(&dot_locals);
736 if (dot_locals_str == NULL)
737 return 0;
738 base = PyUnicode_Concat(parent->u_qualname, dot_locals_str);
739 if (base == NULL)
740 return 0;
741 }
742 else {
743 Py_INCREF(parent->u_qualname);
744 base = parent->u_qualname;
Benjamin Peterson3d9e4812013-10-19 16:01:13 -0400745 }
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100746 }
747 }
Benjamin Peterson3d9e4812013-10-19 16:01:13 -0400748
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400749 if (base != NULL) {
750 dot_str = _PyUnicode_FromId(&dot);
751 if (dot_str == NULL) {
752 Py_DECREF(base);
753 return 0;
754 }
755 name = PyUnicode_Concat(base, dot_str);
756 Py_DECREF(base);
757 if (name == NULL)
758 return 0;
759 PyUnicode_Append(&name, u->u_name);
760 if (name == NULL)
761 return 0;
762 }
763 else {
764 Py_INCREF(u->u_name);
765 name = u->u_name;
766 }
767 u->u_qualname = name;
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100768
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400769 return 1;
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100770}
771
Eric V. Smith235a6f02015-09-19 14:51:32 -0400772
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000773/* Allocate a new block and return a pointer to it.
774 Returns NULL on error.
775*/
776
777static basicblock *
778compiler_new_block(struct compiler *c)
779{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000780 basicblock *b;
781 struct compiler_unit *u;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000782
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000783 u = c->u;
Andy Lester7668a8b2020-03-24 23:26:44 -0500784 b = (basicblock *)PyObject_Calloc(1, sizeof(basicblock));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000785 if (b == NULL) {
786 PyErr_NoMemory();
787 return NULL;
788 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000789 /* Extend the singly linked list of blocks with new block. */
790 b->b_list = u->u_blocks;
791 u->u_blocks = b;
792 return b;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000793}
794
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000795static basicblock *
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000796compiler_next_block(struct compiler *c)
797{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000798 basicblock *block = compiler_new_block(c);
799 if (block == NULL)
800 return NULL;
801 c->u->u_curblock->b_next = block;
802 c->u->u_curblock = block;
803 return block;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000804}
805
806static basicblock *
807compiler_use_next_block(struct compiler *c, basicblock *block)
808{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000809 assert(block != NULL);
810 c->u->u_curblock->b_next = block;
811 c->u->u_curblock = block;
812 return block;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000813}
814
Mark Shannon5977a792020-12-02 13:31:40 +0000815static basicblock *
816compiler_copy_block(struct compiler *c, basicblock *block)
817{
818 /* Cannot copy a block if it has a fallthrough, since
819 * a block can only have one fallthrough predecessor.
820 */
821 assert(block->b_nofallthrough);
822 basicblock *result = compiler_next_block(c);
823 if (result == NULL) {
824 return NULL;
825 }
826 for (int i = 0; i < block->b_iused; i++) {
827 int n = compiler_next_instr(result);
828 if (n < 0) {
829 return NULL;
830 }
831 result->b_instr[n] = block->b_instr[i];
832 }
833 result->b_exit = block->b_exit;
834 return result;
835}
836
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000837/* Returns the offset of the next instruction in the current block's
838 b_instr array. Resizes the b_instr as necessary.
839 Returns -1 on failure.
Thomas Wouters89f507f2006-12-13 04:49:30 +0000840*/
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000841
842static int
Andy Lester76d58772020-03-10 21:18:12 -0500843compiler_next_instr(basicblock *b)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000844{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000845 assert(b != NULL);
846 if (b->b_instr == NULL) {
Andy Lester7668a8b2020-03-24 23:26:44 -0500847 b->b_instr = (struct instr *)PyObject_Calloc(
848 DEFAULT_BLOCK_SIZE, sizeof(struct instr));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000849 if (b->b_instr == NULL) {
850 PyErr_NoMemory();
851 return -1;
852 }
853 b->b_ialloc = DEFAULT_BLOCK_SIZE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000854 }
855 else if (b->b_iused == b->b_ialloc) {
856 struct instr *tmp;
857 size_t oldsize, newsize;
858 oldsize = b->b_ialloc * sizeof(struct instr);
859 newsize = oldsize << 1;
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000860
Benjamin Peterson2f8bfef2016-09-07 09:26:18 -0700861 if (oldsize > (SIZE_MAX >> 1)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000862 PyErr_NoMemory();
863 return -1;
864 }
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000865
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000866 if (newsize == 0) {
867 PyErr_NoMemory();
868 return -1;
869 }
870 b->b_ialloc <<= 1;
871 tmp = (struct instr *)PyObject_Realloc(
872 (void *)b->b_instr, newsize);
873 if (tmp == NULL) {
874 PyErr_NoMemory();
875 return -1;
876 }
877 b->b_instr = tmp;
878 memset((char *)b->b_instr + oldsize, 0, newsize - oldsize);
879 }
880 return b->b_iused++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000881}
882
Serhiy Storchaka61cb3d02020-03-17 18:07:30 +0200883/* Set the line number and column offset for the following instructions.
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000884
Christian Heimes2202f872008-02-06 14:31:34 +0000885 The line number is reset in the following cases:
886 - when entering a new scope
887 - on each statement
Serhiy Storchaka61cb3d02020-03-17 18:07:30 +0200888 - on each expression and sub-expression
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +0200889 - before the "except" and "finally" clauses
Thomas Wouters89f507f2006-12-13 04:49:30 +0000890*/
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000891
Serhiy Storchaka61cb3d02020-03-17 18:07:30 +0200892#define SET_LOC(c, x) \
893 (c)->u->u_lineno = (x)->lineno; \
894 (c)->u->u_col_offset = (x)->col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000895
Serhiy Storchakad4864c62018-01-09 21:54:52 +0200896/* Return the stack effect of opcode with argument oparg.
897
898 Some opcodes have different stack effect when jump to the target and
899 when not jump. The 'jump' parameter specifies the case:
900
901 * 0 -- when not jump
902 * 1 -- when jump
903 * -1 -- maximal
904 */
905/* XXX Make the stack effect of WITH_CLEANUP_START and
906 WITH_CLEANUP_FINISH deterministic. */
907static int
908stack_effect(int opcode, int oparg, int jump)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000909{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000910 switch (opcode) {
Serhiy Storchaka57faf342018-04-25 22:04:06 +0300911 case NOP:
912 case EXTENDED_ARG:
913 return 0;
914
Serhiy Storchakad4864c62018-01-09 21:54:52 +0200915 /* Stack manipulation */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000916 case POP_TOP:
917 return -1;
918 case ROT_TWO:
919 case ROT_THREE:
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +0200920 case ROT_FOUR:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000921 return 0;
922 case DUP_TOP:
923 return 1;
Antoine Pitrou74a69fa2010-09-04 18:43:52 +0000924 case DUP_TOP_TWO:
925 return 2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000926
Serhiy Storchakad4864c62018-01-09 21:54:52 +0200927 /* Unary operators */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000928 case UNARY_POSITIVE:
929 case UNARY_NEGATIVE:
930 case UNARY_NOT:
931 case UNARY_INVERT:
932 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000933
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000934 case SET_ADD:
935 case LIST_APPEND:
936 return -1;
937 case MAP_ADD:
938 return -2;
Neal Norwitz10be2ea2006-03-03 20:29:11 +0000939
Serhiy Storchakad4864c62018-01-09 21:54:52 +0200940 /* Binary operators */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000941 case BINARY_POWER:
942 case BINARY_MULTIPLY:
Benjamin Petersond51374e2014-04-09 23:55:56 -0400943 case BINARY_MATRIX_MULTIPLY:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000944 case BINARY_MODULO:
945 case BINARY_ADD:
946 case BINARY_SUBTRACT:
947 case BINARY_SUBSCR:
948 case BINARY_FLOOR_DIVIDE:
949 case BINARY_TRUE_DIVIDE:
950 return -1;
951 case INPLACE_FLOOR_DIVIDE:
952 case INPLACE_TRUE_DIVIDE:
953 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000954
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000955 case INPLACE_ADD:
956 case INPLACE_SUBTRACT:
957 case INPLACE_MULTIPLY:
Benjamin Petersond51374e2014-04-09 23:55:56 -0400958 case INPLACE_MATRIX_MULTIPLY:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000959 case INPLACE_MODULO:
960 return -1;
961 case STORE_SUBSCR:
962 return -3;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000963 case DELETE_SUBSCR:
964 return -2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000965
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000966 case BINARY_LSHIFT:
967 case BINARY_RSHIFT:
968 case BINARY_AND:
969 case BINARY_XOR:
970 case BINARY_OR:
971 return -1;
972 case INPLACE_POWER:
973 return -1;
974 case GET_ITER:
975 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000976
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000977 case PRINT_EXPR:
978 return -1;
979 case LOAD_BUILD_CLASS:
980 return 1;
981 case INPLACE_LSHIFT:
982 case INPLACE_RSHIFT:
983 case INPLACE_AND:
984 case INPLACE_XOR:
985 case INPLACE_OR:
986 return -1;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +0200987
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000988 case SETUP_WITH:
Serhiy Storchakad4864c62018-01-09 21:54:52 +0200989 /* 1 in the normal flow.
990 * Restore the stack position and push 6 values before jumping to
991 * the handler if an exception be raised. */
992 return jump ? 6 : 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000993 case RETURN_VALUE:
994 return -1;
995 case IMPORT_STAR:
996 return -1;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -0700997 case SETUP_ANNOTATIONS:
998 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000999 case YIELD_VALUE:
1000 return 0;
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -05001001 case YIELD_FROM:
1002 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001003 case POP_BLOCK:
1004 return 0;
1005 case POP_EXCEPT:
Serhiy Storchakad4864c62018-01-09 21:54:52 +02001006 return -3;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001007
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001008 case STORE_NAME:
1009 return -1;
1010 case DELETE_NAME:
1011 return 0;
1012 case UNPACK_SEQUENCE:
1013 return oparg-1;
1014 case UNPACK_EX:
1015 return (oparg&0xFF) + (oparg>>8);
1016 case FOR_ITER:
Serhiy Storchakad4864c62018-01-09 21:54:52 +02001017 /* -1 at end of iterator, 1 if continue iterating. */
1018 return jump > 0 ? -1 : 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001019
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001020 case STORE_ATTR:
1021 return -2;
1022 case DELETE_ATTR:
1023 return -1;
1024 case STORE_GLOBAL:
1025 return -1;
1026 case DELETE_GLOBAL:
1027 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001028 case LOAD_CONST:
1029 return 1;
1030 case LOAD_NAME:
1031 return 1;
1032 case BUILD_TUPLE:
1033 case BUILD_LIST:
1034 case BUILD_SET:
Serhiy Storchakaea525a22016-09-06 22:07:53 +03001035 case BUILD_STRING:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001036 return 1-oparg;
1037 case BUILD_MAP:
Benjamin Petersonb6855152015-09-10 21:02:39 -07001038 return 1 - 2*oparg;
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03001039 case BUILD_CONST_KEY_MAP:
1040 return -oparg;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001041 case LOAD_ATTR:
1042 return 0;
1043 case COMPARE_OP:
Mark Shannon9af0e472020-01-14 10:12:45 +00001044 case IS_OP:
1045 case CONTAINS_OP:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001046 return -1;
Mark Shannon9af0e472020-01-14 10:12:45 +00001047 case JUMP_IF_NOT_EXC_MATCH:
1048 return -2;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001049 case IMPORT_NAME:
1050 return -1;
1051 case IMPORT_FROM:
1052 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001053
Serhiy Storchakad4864c62018-01-09 21:54:52 +02001054 /* Jumps */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001055 case JUMP_FORWARD:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001056 case JUMP_ABSOLUTE:
1057 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001058
Serhiy Storchakad4864c62018-01-09 21:54:52 +02001059 case JUMP_IF_TRUE_OR_POP:
1060 case JUMP_IF_FALSE_OR_POP:
1061 return jump ? 0 : -1;
1062
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001063 case POP_JUMP_IF_FALSE:
1064 case POP_JUMP_IF_TRUE:
1065 return -1;
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00001066
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001067 case LOAD_GLOBAL:
1068 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001069
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001070 /* Exception handling */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001071 case SETUP_FINALLY:
Serhiy Storchakad4864c62018-01-09 21:54:52 +02001072 /* 0 in the normal flow.
1073 * Restore the stack position and push 6 values before jumping to
1074 * the handler if an exception be raised. */
1075 return jump ? 6 : 0;
Mark Shannonfee55262019-11-21 09:11:43 +00001076 case RERAISE:
1077 return -3;
1078
1079 case WITH_EXCEPT_START:
1080 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001081
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001082 case LOAD_FAST:
1083 return 1;
1084 case STORE_FAST:
1085 return -1;
1086 case DELETE_FAST:
1087 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001088
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001089 case RAISE_VARARGS:
1090 return -oparg;
Serhiy Storchakad4864c62018-01-09 21:54:52 +02001091
1092 /* Functions and calls */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001093 case CALL_FUNCTION:
Victor Stinnerf9b760f2016-09-09 10:17:08 -07001094 return -oparg;
Yury Selivanovf2392132016-12-13 19:03:51 -05001095 case CALL_METHOD:
1096 return -oparg-1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001097 case CALL_FUNCTION_KW:
Victor Stinnerf9b760f2016-09-09 10:17:08 -07001098 return -oparg-1;
1099 case CALL_FUNCTION_EX:
Matthieu Dartiailh3a9ac822017-02-21 14:25:22 +01001100 return -1 - ((oparg & 0x01) != 0);
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001101 case MAKE_FUNCTION:
1102 return -1 - ((oparg & 0x01) != 0) - ((oparg & 0x02) != 0) -
1103 ((oparg & 0x04) != 0) - ((oparg & 0x08) != 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001104 case BUILD_SLICE:
1105 if (oparg == 3)
1106 return -2;
1107 else
1108 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001109
Serhiy Storchakad4864c62018-01-09 21:54:52 +02001110 /* Closures */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001111 case LOAD_CLOSURE:
1112 return 1;
1113 case LOAD_DEREF:
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04001114 case LOAD_CLASSDEREF:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001115 return 1;
1116 case STORE_DEREF:
1117 return -1;
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00001118 case DELETE_DEREF:
1119 return 0;
Serhiy Storchakad4864c62018-01-09 21:54:52 +02001120
1121 /* Iterators and generators */
Yury Selivanov75445082015-05-11 22:57:16 -04001122 case GET_AWAITABLE:
1123 return 0;
1124 case SETUP_ASYNC_WITH:
Serhiy Storchakad4864c62018-01-09 21:54:52 +02001125 /* 0 in the normal flow.
1126 * Restore the stack position to the position before the result
1127 * of __aenter__ and push 6 values before jumping to the handler
1128 * if an exception be raised. */
1129 return jump ? -1 + 6 : 0;
Yury Selivanov75445082015-05-11 22:57:16 -04001130 case BEFORE_ASYNC_WITH:
1131 return 1;
1132 case GET_AITER:
1133 return 0;
1134 case GET_ANEXT:
1135 return 1;
Yury Selivanov5376ba92015-06-22 12:19:30 -04001136 case GET_YIELD_FROM_ITER:
1137 return 0;
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02001138 case END_ASYNC_FOR:
1139 return -7;
Eric V. Smitha78c7952015-11-03 12:45:05 -05001140 case FORMAT_VALUE:
1141 /* If there's a fmt_spec on the stack, we go from 2->1,
1142 else 1->1. */
1143 return (oparg & FVS_MASK) == FVS_HAVE_SPEC ? -1 : 0;
Yury Selivanovf2392132016-12-13 19:03:51 -05001144 case LOAD_METHOD:
1145 return 1;
Zackery Spytzce6a0702019-08-25 03:44:09 -06001146 case LOAD_ASSERTION_ERROR:
1147 return 1;
Mark Shannon13bc1392020-01-23 09:25:17 +00001148 case LIST_TO_TUPLE:
1149 return 0;
1150 case LIST_EXTEND:
1151 case SET_UPDATE:
Mark Shannon8a4cd702020-01-27 09:57:45 +00001152 case DICT_MERGE:
1153 case DICT_UPDATE:
Mark Shannon13bc1392020-01-23 09:25:17 +00001154 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001155 default:
Larry Hastings3a907972013-11-23 14:49:22 -08001156 return PY_INVALID_STACK_EFFECT;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001157 }
Larry Hastings3a907972013-11-23 14:49:22 -08001158 return PY_INVALID_STACK_EFFECT; /* not reachable */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001159}
1160
Serhiy Storchakad4864c62018-01-09 21:54:52 +02001161int
Serhiy Storchaka7bdf2822018-09-18 09:54:26 +03001162PyCompile_OpcodeStackEffectWithJump(int opcode, int oparg, int jump)
1163{
1164 return stack_effect(opcode, oparg, jump);
1165}
1166
1167int
Serhiy Storchakad4864c62018-01-09 21:54:52 +02001168PyCompile_OpcodeStackEffect(int opcode, int oparg)
1169{
1170 return stack_effect(opcode, oparg, -1);
1171}
1172
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001173/* Add an opcode with no argument.
1174 Returns 0 on failure, 1 on success.
1175*/
1176
1177static int
1178compiler_addop(struct compiler *c, int opcode)
1179{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001180 basicblock *b;
1181 struct instr *i;
1182 int off;
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001183 assert(!HAS_ARG(opcode));
Pablo Galindo18c5f9d2019-07-15 10:15:01 +01001184 if (c->c_do_not_emit_bytecode) {
1185 return 1;
1186 }
Andy Lester76d58772020-03-10 21:18:12 -05001187 off = compiler_next_instr(c->u->u_curblock);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001188 if (off < 0)
1189 return 0;
1190 b = c->u->u_curblock;
1191 i = &b->b_instr[off];
1192 i->i_opcode = opcode;
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001193 i->i_oparg = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001194 if (opcode == RETURN_VALUE)
1195 b->b_return = 1;
Serhiy Storchaka61cb3d02020-03-17 18:07:30 +02001196 i->i_lineno = c->u->u_lineno;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001197 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001198}
1199
Victor Stinnerf8e32212013-11-19 23:56:34 +01001200static Py_ssize_t
Andy Lester76d58772020-03-10 21:18:12 -05001201compiler_add_o(PyObject *dict, PyObject *o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001202{
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001203 PyObject *v;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001204 Py_ssize_t arg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001205
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001206 v = PyDict_GetItemWithError(dict, o);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001207 if (!v) {
Stefan Krahc0cbed12015-07-27 12:56:49 +02001208 if (PyErr_Occurred()) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001209 return -1;
Stefan Krahc0cbed12015-07-27 12:56:49 +02001210 }
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +02001211 arg = PyDict_GET_SIZE(dict);
Victor Stinnerad9a0662013-11-19 22:23:20 +01001212 v = PyLong_FromSsize_t(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001213 if (!v) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001214 return -1;
1215 }
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001216 if (PyDict_SetItem(dict, o, v) < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001217 Py_DECREF(v);
1218 return -1;
1219 }
1220 Py_DECREF(v);
1221 }
1222 else
1223 arg = PyLong_AsLong(v);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001224 return arg;
1225}
1226
INADA Naokic2e16072018-11-26 21:23:22 +09001227// Merge const *o* recursively and return constant key object.
1228static PyObject*
1229merge_consts_recursive(struct compiler *c, PyObject *o)
1230{
1231 // None and Ellipsis are singleton, and key is the singleton.
1232 // No need to merge object and key.
1233 if (o == Py_None || o == Py_Ellipsis) {
1234 Py_INCREF(o);
1235 return o;
1236 }
1237
1238 PyObject *key = _PyCode_ConstantKey(o);
1239 if (key == NULL) {
1240 return NULL;
1241 }
1242
1243 // t is borrowed reference
1244 PyObject *t = PyDict_SetDefault(c->c_const_cache, key, key);
1245 if (t != key) {
INADA Naokif7e4d362018-11-29 00:58:46 +09001246 // o is registered in c_const_cache. Just use it.
Zackery Spytz9b4a1b12019-03-20 03:16:25 -06001247 Py_XINCREF(t);
INADA Naokic2e16072018-11-26 21:23:22 +09001248 Py_DECREF(key);
1249 return t;
1250 }
1251
INADA Naokif7e4d362018-11-29 00:58:46 +09001252 // We registered o in c_const_cache.
Simeon63b5fc52019-04-09 19:36:57 -04001253 // When o is a tuple or frozenset, we want to merge its
INADA Naokif7e4d362018-11-29 00:58:46 +09001254 // items too.
INADA Naokic2e16072018-11-26 21:23:22 +09001255 if (PyTuple_CheckExact(o)) {
INADA Naokif7e4d362018-11-29 00:58:46 +09001256 Py_ssize_t len = PyTuple_GET_SIZE(o);
1257 for (Py_ssize_t i = 0; i < len; i++) {
INADA Naokic2e16072018-11-26 21:23:22 +09001258 PyObject *item = PyTuple_GET_ITEM(o, i);
1259 PyObject *u = merge_consts_recursive(c, item);
1260 if (u == NULL) {
1261 Py_DECREF(key);
1262 return NULL;
1263 }
1264
1265 // See _PyCode_ConstantKey()
1266 PyObject *v; // borrowed
1267 if (PyTuple_CheckExact(u)) {
1268 v = PyTuple_GET_ITEM(u, 1);
1269 }
1270 else {
1271 v = u;
1272 }
1273 if (v != item) {
1274 Py_INCREF(v);
1275 PyTuple_SET_ITEM(o, i, v);
1276 Py_DECREF(item);
1277 }
1278
1279 Py_DECREF(u);
1280 }
1281 }
INADA Naokif7e4d362018-11-29 00:58:46 +09001282 else if (PyFrozenSet_CheckExact(o)) {
Simeon63b5fc52019-04-09 19:36:57 -04001283 // *key* is tuple. And its first item is frozenset of
INADA Naokif7e4d362018-11-29 00:58:46 +09001284 // constant keys.
1285 // See _PyCode_ConstantKey() for detail.
1286 assert(PyTuple_CheckExact(key));
1287 assert(PyTuple_GET_SIZE(key) == 2);
1288
1289 Py_ssize_t len = PySet_GET_SIZE(o);
1290 if (len == 0) { // empty frozenset should not be re-created.
1291 return key;
1292 }
1293 PyObject *tuple = PyTuple_New(len);
1294 if (tuple == NULL) {
1295 Py_DECREF(key);
1296 return NULL;
1297 }
1298 Py_ssize_t i = 0, pos = 0;
1299 PyObject *item;
1300 Py_hash_t hash;
1301 while (_PySet_NextEntry(o, &pos, &item, &hash)) {
1302 PyObject *k = merge_consts_recursive(c, item);
1303 if (k == NULL) {
1304 Py_DECREF(tuple);
1305 Py_DECREF(key);
1306 return NULL;
1307 }
1308 PyObject *u;
1309 if (PyTuple_CheckExact(k)) {
1310 u = PyTuple_GET_ITEM(k, 1);
1311 Py_INCREF(u);
1312 Py_DECREF(k);
1313 }
1314 else {
1315 u = k;
1316 }
1317 PyTuple_SET_ITEM(tuple, i, u); // Steals reference of u.
1318 i++;
1319 }
1320
1321 // Instead of rewriting o, we create new frozenset and embed in the
1322 // key tuple. Caller should get merged frozenset from the key tuple.
1323 PyObject *new = PyFrozenSet_New(tuple);
1324 Py_DECREF(tuple);
1325 if (new == NULL) {
1326 Py_DECREF(key);
1327 return NULL;
1328 }
1329 assert(PyTuple_GET_ITEM(key, 1) == o);
1330 Py_DECREF(o);
1331 PyTuple_SET_ITEM(key, 1, new);
1332 }
INADA Naokic2e16072018-11-26 21:23:22 +09001333
1334 return key;
1335}
1336
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001337static Py_ssize_t
1338compiler_add_const(struct compiler *c, PyObject *o)
1339{
Pablo Galindo18c5f9d2019-07-15 10:15:01 +01001340 if (c->c_do_not_emit_bytecode) {
1341 return 0;
1342 }
1343
INADA Naokic2e16072018-11-26 21:23:22 +09001344 PyObject *key = merge_consts_recursive(c, o);
1345 if (key == NULL) {
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001346 return -1;
INADA Naokic2e16072018-11-26 21:23:22 +09001347 }
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001348
Andy Lester76d58772020-03-10 21:18:12 -05001349 Py_ssize_t arg = compiler_add_o(c->u->u_consts, key);
INADA Naokic2e16072018-11-26 21:23:22 +09001350 Py_DECREF(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001351 return arg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001352}
1353
1354static int
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001355compiler_addop_load_const(struct compiler *c, PyObject *o)
1356{
Pablo Galindo18c5f9d2019-07-15 10:15:01 +01001357 if (c->c_do_not_emit_bytecode) {
1358 return 1;
1359 }
1360
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001361 Py_ssize_t arg = compiler_add_const(c, o);
1362 if (arg < 0)
1363 return 0;
1364 return compiler_addop_i(c, LOAD_CONST, arg);
1365}
1366
1367static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001368compiler_addop_o(struct compiler *c, int opcode, PyObject *dict,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001369 PyObject *o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001370{
Pablo Galindo18c5f9d2019-07-15 10:15:01 +01001371 if (c->c_do_not_emit_bytecode) {
1372 return 1;
1373 }
1374
Andy Lester76d58772020-03-10 21:18:12 -05001375 Py_ssize_t arg = compiler_add_o(dict, o);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001376 if (arg < 0)
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00001377 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001378 return compiler_addop_i(c, opcode, arg);
1379}
1380
1381static int
1382compiler_addop_name(struct compiler *c, int opcode, PyObject *dict,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001383 PyObject *o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001384{
Victor Stinnerad9a0662013-11-19 22:23:20 +01001385 Py_ssize_t arg;
Pablo Galindo18c5f9d2019-07-15 10:15:01 +01001386
1387 if (c->c_do_not_emit_bytecode) {
1388 return 1;
1389 }
1390
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001391 PyObject *mangled = _Py_Mangle(c->u->u_private, o);
1392 if (!mangled)
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00001393 return 0;
Andy Lester76d58772020-03-10 21:18:12 -05001394 arg = compiler_add_o(dict, mangled);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001395 Py_DECREF(mangled);
1396 if (arg < 0)
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00001397 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001398 return compiler_addop_i(c, opcode, arg);
1399}
1400
1401/* Add an opcode with an integer argument.
1402 Returns 0 on failure, 1 on success.
1403*/
1404
1405static int
Victor Stinnerf8e32212013-11-19 23:56:34 +01001406compiler_addop_i(struct compiler *c, int opcode, Py_ssize_t oparg)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001407{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001408 struct instr *i;
1409 int off;
Victor Stinnerad9a0662013-11-19 22:23:20 +01001410
Pablo Galindo18c5f9d2019-07-15 10:15:01 +01001411 if (c->c_do_not_emit_bytecode) {
1412 return 1;
1413 }
1414
Victor Stinner2ad474b2016-03-01 23:34:47 +01001415 /* oparg value is unsigned, but a signed C int is usually used to store
1416 it in the C code (like Python/ceval.c).
1417
1418 Limit to 32-bit signed C int (rather than INT_MAX) for portability.
1419
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001420 The argument of a concrete bytecode instruction is limited to 8-bit.
1421 EXTENDED_ARG is used for 16, 24, and 32-bit arguments. */
1422 assert(HAS_ARG(opcode));
Victor Stinner2ad474b2016-03-01 23:34:47 +01001423 assert(0 <= oparg && oparg <= 2147483647);
Victor Stinnerad9a0662013-11-19 22:23:20 +01001424
Andy Lester76d58772020-03-10 21:18:12 -05001425 off = compiler_next_instr(c->u->u_curblock);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001426 if (off < 0)
1427 return 0;
1428 i = &c->u->u_curblock->b_instr[off];
Victor Stinnerf8e32212013-11-19 23:56:34 +01001429 i->i_opcode = opcode;
1430 i->i_oparg = Py_SAFE_DOWNCAST(oparg, Py_ssize_t, int);
Serhiy Storchaka61cb3d02020-03-17 18:07:30 +02001431 i->i_lineno = c->u->u_lineno;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001432 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001433}
1434
1435static int
Mark Shannon582aaf12020-08-04 17:30:11 +01001436compiler_addop_j(struct compiler *c, int opcode, basicblock *b)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001437{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001438 struct instr *i;
1439 int off;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001440
Pablo Galindo18c5f9d2019-07-15 10:15:01 +01001441 if (c->c_do_not_emit_bytecode) {
1442 return 1;
1443 }
1444
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001445 assert(HAS_ARG(opcode));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001446 assert(b != NULL);
Andy Lester76d58772020-03-10 21:18:12 -05001447 off = compiler_next_instr(c->u->u_curblock);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001448 if (off < 0)
1449 return 0;
1450 i = &c->u->u_curblock->b_instr[off];
1451 i->i_opcode = opcode;
1452 i->i_target = b;
Serhiy Storchaka61cb3d02020-03-17 18:07:30 +02001453 i->i_lineno = c->u->u_lineno;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001454 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001455}
1456
Victor Stinnerfc6f2ef2016-02-27 02:19:22 +01001457/* NEXT_BLOCK() creates an implicit jump from the current block
1458 to the new block.
1459
1460 The returns inside this macro make it impossible to decref objects
1461 created in the local function. Local objects should use the arena.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001462*/
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001463#define NEXT_BLOCK(C) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001464 if (compiler_next_block((C)) == NULL) \
1465 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001466}
1467
1468#define ADDOP(C, OP) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001469 if (!compiler_addop((C), (OP))) \
1470 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001471}
1472
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001473#define ADDOP_IN_SCOPE(C, OP) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001474 if (!compiler_addop((C), (OP))) { \
1475 compiler_exit_scope(c); \
1476 return 0; \
1477 } \
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001478}
1479
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001480#define ADDOP_LOAD_CONST(C, O) { \
1481 if (!compiler_addop_load_const((C), (O))) \
1482 return 0; \
1483}
1484
1485/* Same as ADDOP_LOAD_CONST, but steals a reference. */
1486#define ADDOP_LOAD_CONST_NEW(C, O) { \
1487 PyObject *__new_const = (O); \
1488 if (__new_const == NULL) { \
1489 return 0; \
1490 } \
1491 if (!compiler_addop_load_const((C), __new_const)) { \
1492 Py_DECREF(__new_const); \
1493 return 0; \
1494 } \
1495 Py_DECREF(__new_const); \
1496}
1497
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001498#define ADDOP_O(C, OP, O, TYPE) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001499 if (!compiler_addop_o((C), (OP), (C)->u->u_ ## TYPE, (O))) \
1500 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001501}
1502
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03001503/* Same as ADDOP_O, but steals a reference. */
1504#define ADDOP_N(C, OP, O, TYPE) { \
1505 if (!compiler_addop_o((C), (OP), (C)->u->u_ ## TYPE, (O))) { \
1506 Py_DECREF((O)); \
1507 return 0; \
1508 } \
1509 Py_DECREF((O)); \
1510}
1511
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001512#define ADDOP_NAME(C, OP, O, TYPE) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001513 if (!compiler_addop_name((C), (OP), (C)->u->u_ ## TYPE, (O))) \
1514 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001515}
1516
1517#define ADDOP_I(C, OP, O) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001518 if (!compiler_addop_i((C), (OP), (O))) \
1519 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001520}
1521
Mark Shannon582aaf12020-08-04 17:30:11 +01001522#define ADDOP_JUMP(C, OP, O) { \
1523 if (!compiler_addop_j((C), (OP), (O))) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001524 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001525}
1526
Mark Shannon9af0e472020-01-14 10:12:45 +00001527#define ADDOP_COMPARE(C, CMP) { \
1528 if (!compiler_addcompare((C), (cmpop_ty)(CMP))) \
1529 return 0; \
1530}
1531
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001532/* VISIT and VISIT_SEQ takes an ASDL type as their second argument. They use
1533 the ASDL name to synthesize the name of the C type and the visit function.
1534*/
1535
1536#define VISIT(C, TYPE, V) {\
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001537 if (!compiler_visit_ ## TYPE((C), (V))) \
1538 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001539}
1540
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001541#define VISIT_IN_SCOPE(C, TYPE, V) {\
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001542 if (!compiler_visit_ ## TYPE((C), (V))) { \
1543 compiler_exit_scope(c); \
1544 return 0; \
1545 } \
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001546}
1547
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001548#define VISIT_SLICE(C, V, CTX) {\
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001549 if (!compiler_visit_slice((C), (V), (CTX))) \
1550 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001551}
1552
1553#define VISIT_SEQ(C, TYPE, SEQ) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001554 int _i; \
Pablo Galindoa5634c42020-09-16 19:42:00 +01001555 asdl_ ## TYPE ## _seq *seq = (SEQ); /* avoid variable capture */ \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001556 for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \
1557 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \
1558 if (!compiler_visit_ ## TYPE((C), elt)) \
1559 return 0; \
1560 } \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001561}
1562
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001563#define VISIT_SEQ_IN_SCOPE(C, TYPE, SEQ) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001564 int _i; \
Pablo Galindoa5634c42020-09-16 19:42:00 +01001565 asdl_ ## TYPE ## _seq *seq = (SEQ); /* avoid variable capture */ \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001566 for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \
1567 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \
1568 if (!compiler_visit_ ## TYPE((C), elt)) { \
1569 compiler_exit_scope(c); \
1570 return 0; \
1571 } \
1572 } \
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001573}
1574
Pablo Galindo18c5f9d2019-07-15 10:15:01 +01001575/* These macros allows to check only for errors and not emmit bytecode
1576 * while visiting nodes.
1577*/
1578
1579#define BEGIN_DO_NOT_EMIT_BYTECODE { \
1580 c->c_do_not_emit_bytecode++;
1581
1582#define END_DO_NOT_EMIT_BYTECODE \
1583 c->c_do_not_emit_bytecode--; \
1584}
1585
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001586/* Search if variable annotations are present statically in a block. */
1587
1588static int
Pablo Galindoa5634c42020-09-16 19:42:00 +01001589find_ann(asdl_stmt_seq *stmts)
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001590{
1591 int i, j, res = 0;
1592 stmt_ty st;
1593
1594 for (i = 0; i < asdl_seq_LEN(stmts); i++) {
1595 st = (stmt_ty)asdl_seq_GET(stmts, i);
1596 switch (st->kind) {
1597 case AnnAssign_kind:
1598 return 1;
1599 case For_kind:
1600 res = find_ann(st->v.For.body) ||
1601 find_ann(st->v.For.orelse);
1602 break;
1603 case AsyncFor_kind:
1604 res = find_ann(st->v.AsyncFor.body) ||
1605 find_ann(st->v.AsyncFor.orelse);
1606 break;
1607 case While_kind:
1608 res = find_ann(st->v.While.body) ||
1609 find_ann(st->v.While.orelse);
1610 break;
1611 case If_kind:
1612 res = find_ann(st->v.If.body) ||
1613 find_ann(st->v.If.orelse);
1614 break;
1615 case With_kind:
1616 res = find_ann(st->v.With.body);
1617 break;
1618 case AsyncWith_kind:
1619 res = find_ann(st->v.AsyncWith.body);
1620 break;
1621 case Try_kind:
1622 for (j = 0; j < asdl_seq_LEN(st->v.Try.handlers); j++) {
1623 excepthandler_ty handler = (excepthandler_ty)asdl_seq_GET(
1624 st->v.Try.handlers, j);
1625 if (find_ann(handler->v.ExceptHandler.body)) {
1626 return 1;
1627 }
1628 }
1629 res = find_ann(st->v.Try.body) ||
1630 find_ann(st->v.Try.finalbody) ||
1631 find_ann(st->v.Try.orelse);
1632 break;
1633 default:
1634 res = 0;
1635 }
1636 if (res) {
1637 break;
1638 }
1639 }
1640 return res;
1641}
1642
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001643/*
1644 * Frame block handling functions
1645 */
1646
1647static int
1648compiler_push_fblock(struct compiler *c, enum fblocktype t, basicblock *b,
Mark Shannonfee55262019-11-21 09:11:43 +00001649 basicblock *exit, void *datum)
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001650{
1651 struct fblockinfo *f;
1652 if (c->u->u_nfblocks >= CO_MAXBLOCKS) {
Mark Shannon02d126a2020-09-25 14:04:19 +01001653 return compiler_error(c, "too many statically nested blocks");
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001654 }
1655 f = &c->u->u_fblock[c->u->u_nfblocks++];
1656 f->fb_type = t;
1657 f->fb_block = b;
1658 f->fb_exit = exit;
Mark Shannonfee55262019-11-21 09:11:43 +00001659 f->fb_datum = datum;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001660 return 1;
1661}
1662
1663static void
1664compiler_pop_fblock(struct compiler *c, enum fblocktype t, basicblock *b)
1665{
1666 struct compiler_unit *u = c->u;
1667 assert(u->u_nfblocks > 0);
1668 u->u_nfblocks--;
1669 assert(u->u_fblock[u->u_nfblocks].fb_type == t);
1670 assert(u->u_fblock[u->u_nfblocks].fb_block == b);
1671}
1672
Mark Shannonfee55262019-11-21 09:11:43 +00001673static int
1674compiler_call_exit_with_nones(struct compiler *c) {
1675 ADDOP_O(c, LOAD_CONST, Py_None, consts);
1676 ADDOP(c, DUP_TOP);
1677 ADDOP(c, DUP_TOP);
1678 ADDOP_I(c, CALL_FUNCTION, 3);
1679 return 1;
1680}
1681
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001682/* Unwind a frame block. If preserve_tos is true, the TOS before
Mark Shannonfee55262019-11-21 09:11:43 +00001683 * popping the blocks will be restored afterwards, unless another
1684 * return, break or continue is found. In which case, the TOS will
1685 * be popped.
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001686 */
1687static int
1688compiler_unwind_fblock(struct compiler *c, struct fblockinfo *info,
1689 int preserve_tos)
1690{
1691 switch (info->fb_type) {
1692 case WHILE_LOOP:
Mark Shannon02d126a2020-09-25 14:04:19 +01001693 case EXCEPTION_HANDLER:
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001694 return 1;
1695
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001696 case FOR_LOOP:
1697 /* Pop the iterator */
1698 if (preserve_tos) {
1699 ADDOP(c, ROT_TWO);
1700 }
1701 ADDOP(c, POP_TOP);
1702 return 1;
1703
Mark Shannon02d126a2020-09-25 14:04:19 +01001704 case TRY_EXCEPT:
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001705 ADDOP(c, POP_BLOCK);
1706 return 1;
1707
1708 case FINALLY_TRY:
1709 ADDOP(c, POP_BLOCK);
Serhiy Storchakaef61c522019-08-24 13:11:52 +03001710 if (preserve_tos) {
Mark Shannonfee55262019-11-21 09:11:43 +00001711 if (!compiler_push_fblock(c, POP_VALUE, NULL, NULL, NULL)) {
1712 return 0;
1713 }
Serhiy Storchakaef61c522019-08-24 13:11:52 +03001714 }
Mark Shannon88dce262019-12-30 09:53:36 +00001715 /* Emit the finally block, restoring the line number when done */
1716 int saved_lineno = c->u->u_lineno;
Mark Shannonfee55262019-11-21 09:11:43 +00001717 VISIT_SEQ(c, stmt, info->fb_datum);
Mark Shannon88dce262019-12-30 09:53:36 +00001718 c->u->u_lineno = saved_lineno;
Mark Shannonfee55262019-11-21 09:11:43 +00001719 if (preserve_tos) {
1720 compiler_pop_fblock(c, POP_VALUE, NULL);
Serhiy Storchakaef61c522019-08-24 13:11:52 +03001721 }
1722 return 1;
Mark Shannon13bc1392020-01-23 09:25:17 +00001723
Mark Shannonfee55262019-11-21 09:11:43 +00001724 case FINALLY_END:
1725 if (preserve_tos) {
1726 ADDOP(c, ROT_FOUR);
1727 }
1728 ADDOP(c, POP_TOP);
1729 ADDOP(c, POP_TOP);
1730 ADDOP(c, POP_TOP);
1731 if (preserve_tos) {
1732 ADDOP(c, ROT_FOUR);
1733 }
1734 ADDOP(c, POP_EXCEPT);
1735 return 1;
Serhiy Storchakaef61c522019-08-24 13:11:52 +03001736
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001737 case WITH:
1738 case ASYNC_WITH:
1739 ADDOP(c, POP_BLOCK);
1740 if (preserve_tos) {
1741 ADDOP(c, ROT_TWO);
1742 }
Mark Shannonfee55262019-11-21 09:11:43 +00001743 if(!compiler_call_exit_with_nones(c)) {
1744 return 0;
1745 }
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001746 if (info->fb_type == ASYNC_WITH) {
1747 ADDOP(c, GET_AWAITABLE);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001748 ADDOP_LOAD_CONST(c, Py_None);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001749 ADDOP(c, YIELD_FROM);
1750 }
Mark Shannonfee55262019-11-21 09:11:43 +00001751 ADDOP(c, POP_TOP);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001752 return 1;
1753
1754 case HANDLER_CLEANUP:
Mark Shannonfee55262019-11-21 09:11:43 +00001755 if (info->fb_datum) {
1756 ADDOP(c, POP_BLOCK);
1757 }
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001758 if (preserve_tos) {
1759 ADDOP(c, ROT_FOUR);
1760 }
Mark Shannonfee55262019-11-21 09:11:43 +00001761 ADDOP(c, POP_EXCEPT);
1762 if (info->fb_datum) {
1763 ADDOP_LOAD_CONST(c, Py_None);
1764 compiler_nameop(c, info->fb_datum, Store);
1765 compiler_nameop(c, info->fb_datum, Del);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001766 }
Mark Shannonfee55262019-11-21 09:11:43 +00001767 return 1;
1768
1769 case POP_VALUE:
1770 if (preserve_tos) {
1771 ADDOP(c, ROT_TWO);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001772 }
Mark Shannonfee55262019-11-21 09:11:43 +00001773 ADDOP(c, POP_TOP);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001774 return 1;
1775 }
1776 Py_UNREACHABLE();
1777}
1778
Mark Shannonfee55262019-11-21 09:11:43 +00001779/** Unwind block stack. If loop is not NULL, then stop when the first loop is encountered. */
1780static int
1781compiler_unwind_fblock_stack(struct compiler *c, int preserve_tos, struct fblockinfo **loop) {
1782 if (c->u->u_nfblocks == 0) {
1783 return 1;
1784 }
1785 struct fblockinfo *top = &c->u->u_fblock[c->u->u_nfblocks-1];
1786 if (loop != NULL && (top->fb_type == WHILE_LOOP || top->fb_type == FOR_LOOP)) {
1787 *loop = top;
1788 return 1;
1789 }
1790 struct fblockinfo copy = *top;
1791 c->u->u_nfblocks--;
1792 if (!compiler_unwind_fblock(c, &copy, preserve_tos)) {
1793 return 0;
1794 }
1795 if (!compiler_unwind_fblock_stack(c, preserve_tos, loop)) {
1796 return 0;
1797 }
1798 c->u->u_fblock[c->u->u_nfblocks] = copy;
1799 c->u->u_nfblocks++;
1800 return 1;
1801}
1802
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001803/* Compile a sequence of statements, checking for a docstring
1804 and for annotations. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001805
1806static int
Pablo Galindoa5634c42020-09-16 19:42:00 +01001807compiler_body(struct compiler *c, asdl_stmt_seq *stmts)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001808{
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001809 int i = 0;
1810 stmt_ty st;
Serhiy Storchaka143ce5c2018-05-30 10:56:16 +03001811 PyObject *docstring;
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001812
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001813 /* Set current line number to the line number of first statement.
1814 This way line number for SETUP_ANNOTATIONS will always
1815 coincide with the line number of first "real" statement in module.
Hansraj Das01171eb2019-10-09 07:54:02 +05301816 If body is empty, then lineno will be set later in assemble. */
Serhiy Storchaka61cb3d02020-03-17 18:07:30 +02001817 if (c->u->u_scope_type == COMPILER_SCOPE_MODULE && asdl_seq_LEN(stmts)) {
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001818 st = (stmt_ty)asdl_seq_GET(stmts, 0);
Serhiy Storchaka61cb3d02020-03-17 18:07:30 +02001819 SET_LOC(c, st);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001820 }
1821 /* Every annotated class and module should have __annotations__. */
1822 if (find_ann(stmts)) {
1823 ADDOP(c, SETUP_ANNOTATIONS);
1824 }
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001825 if (!asdl_seq_LEN(stmts))
1826 return 1;
INADA Naokicb41b272017-02-23 00:31:59 +09001827 /* if not -OO mode, set docstring */
Serhiy Storchaka143ce5c2018-05-30 10:56:16 +03001828 if (c->c_optimize < 2) {
1829 docstring = _PyAST_GetDocString(stmts);
1830 if (docstring) {
1831 i = 1;
1832 st = (stmt_ty)asdl_seq_GET(stmts, 0);
1833 assert(st->kind == Expr_kind);
1834 VISIT(c, expr, st->v.Expr.value);
1835 if (!compiler_nameop(c, __doc__, Store))
1836 return 0;
1837 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001838 }
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001839 for (; i < asdl_seq_LEN(stmts); i++)
1840 VISIT(c, stmt, (stmt_ty)asdl_seq_GET(stmts, i));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001841 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001842}
1843
1844static PyCodeObject *
1845compiler_mod(struct compiler *c, mod_ty mod)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001846{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001847 PyCodeObject *co;
1848 int addNone = 1;
1849 static PyObject *module;
1850 if (!module) {
1851 module = PyUnicode_InternFromString("<module>");
1852 if (!module)
1853 return NULL;
1854 }
1855 /* Use 0 for firstlineno initially, will fixup in assemble(). */
Mark Shannon877df852020-11-12 09:43:29 +00001856 if (!compiler_enter_scope(c, module, COMPILER_SCOPE_MODULE, mod, 1))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001857 return NULL;
1858 switch (mod->kind) {
1859 case Module_kind:
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001860 if (!compiler_body(c, mod->v.Module.body)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001861 compiler_exit_scope(c);
1862 return 0;
1863 }
1864 break;
1865 case Interactive_kind:
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001866 if (find_ann(mod->v.Interactive.body)) {
1867 ADDOP(c, SETUP_ANNOTATIONS);
1868 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001869 c->c_interactive = 1;
Pablo Galindoa5634c42020-09-16 19:42:00 +01001870 VISIT_SEQ_IN_SCOPE(c, stmt, mod->v.Interactive.body);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001871 break;
1872 case Expression_kind:
1873 VISIT_IN_SCOPE(c, expr, mod->v.Expression.body);
1874 addNone = 0;
1875 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001876 default:
1877 PyErr_Format(PyExc_SystemError,
1878 "module kind %d should not be possible",
1879 mod->kind);
1880 return 0;
1881 }
1882 co = assemble(c, addNone);
1883 compiler_exit_scope(c);
1884 return co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001885}
1886
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001887/* The test for LOCAL must come before the test for FREE in order to
1888 handle classes where name is both local and free. The local var is
1889 a method and the free var is a free var referenced within a method.
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001890*/
1891
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001892static int
1893get_ref_type(struct compiler *c, PyObject *name)
1894{
Victor Stinner0b1bc562013-05-16 22:17:17 +02001895 int scope;
Benjamin Peterson312595c2013-05-15 15:26:42 -05001896 if (c->u->u_scope_type == COMPILER_SCOPE_CLASS &&
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02001897 _PyUnicode_EqualToASCIIString(name, "__class__"))
Benjamin Peterson312595c2013-05-15 15:26:42 -05001898 return CELL;
Victor Stinner0b1bc562013-05-16 22:17:17 +02001899 scope = PyST_GetScope(c->u->u_ste, name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001900 if (scope == 0) {
Victor Stinner87d3b9d2020-03-25 19:27:36 +01001901 _Py_FatalErrorFormat(__func__,
1902 "unknown scope for %.100s in %.100s(%s)\n"
1903 "symbols: %s\nlocals: %s\nglobals: %s",
1904 PyUnicode_AsUTF8(name),
1905 PyUnicode_AsUTF8(c->u->u_name),
1906 PyUnicode_AsUTF8(PyObject_Repr(c->u->u_ste->ste_id)),
1907 PyUnicode_AsUTF8(PyObject_Repr(c->u->u_ste->ste_symbols)),
1908 PyUnicode_AsUTF8(PyObject_Repr(c->u->u_varnames)),
1909 PyUnicode_AsUTF8(PyObject_Repr(c->u->u_names)));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001910 }
Tim Peters2a7f3842001-06-09 09:26:21 +00001911
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001912 return scope;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001913}
1914
1915static int
1916compiler_lookup_arg(PyObject *dict, PyObject *name)
1917{
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001918 PyObject *v;
Serhiy Storchakafb5db7e2020-10-26 08:43:39 +02001919 v = PyDict_GetItemWithError(dict, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001920 if (v == NULL)
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00001921 return -1;
Christian Heimes217cfd12007-12-02 14:31:20 +00001922 return PyLong_AS_LONG(v);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001923}
1924
1925static int
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001926compiler_make_closure(struct compiler *c, PyCodeObject *co, Py_ssize_t flags, PyObject *qualname)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001927{
Victor Stinnerad9a0662013-11-19 22:23:20 +01001928 Py_ssize_t i, free = PyCode_GetNumFree(co);
Antoine Pitrou86a36b52011-11-25 18:56:07 +01001929 if (qualname == NULL)
1930 qualname = co->co_name;
1931
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001932 if (free) {
1933 for (i = 0; i < free; ++i) {
1934 /* Bypass com_addop_varname because it will generate
1935 LOAD_DEREF but LOAD_CLOSURE is needed.
1936 */
1937 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
1938 int arg, reftype;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001939
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001940 /* Special case: If a class contains a method with a
1941 free variable that has the same name as a method,
1942 the name will be considered free *and* local in the
1943 class. It should be handled by the closure, as
Min ho Kimc4cacc82019-07-31 08:16:13 +10001944 well as by the normal name lookup logic.
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001945 */
1946 reftype = get_ref_type(c, name);
1947 if (reftype == CELL)
1948 arg = compiler_lookup_arg(c->u->u_cellvars, name);
1949 else /* (reftype == FREE) */
1950 arg = compiler_lookup_arg(c->u->u_freevars, name);
1951 if (arg == -1) {
Victor Stinner87d3b9d2020-03-25 19:27:36 +01001952 _Py_FatalErrorFormat(__func__,
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001953 "lookup %s in %s %d %d\n"
1954 "freevars of %s: %s\n",
1955 PyUnicode_AsUTF8(PyObject_Repr(name)),
1956 PyUnicode_AsUTF8(c->u->u_name),
1957 reftype, arg,
1958 PyUnicode_AsUTF8(co->co_name),
1959 PyUnicode_AsUTF8(PyObject_Repr(co->co_freevars)));
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001960 }
1961 ADDOP_I(c, LOAD_CLOSURE, arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001962 }
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001963 flags |= 0x08;
1964 ADDOP_I(c, BUILD_TUPLE, free);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001965 }
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001966 ADDOP_LOAD_CONST(c, (PyObject*)co);
1967 ADDOP_LOAD_CONST(c, qualname);
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001968 ADDOP_I(c, MAKE_FUNCTION, flags);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001969 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001970}
1971
1972static int
Pablo Galindoa5634c42020-09-16 19:42:00 +01001973compiler_decorators(struct compiler *c, asdl_expr_seq* decos)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001974{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001975 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001976
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001977 if (!decos)
1978 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001979
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001980 for (i = 0; i < asdl_seq_LEN(decos); i++) {
1981 VISIT(c, expr, (expr_ty)asdl_seq_GET(decos, i));
1982 }
1983 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001984}
1985
1986static int
Pablo Galindoa5634c42020-09-16 19:42:00 +01001987compiler_visit_kwonlydefaults(struct compiler *c, asdl_arg_seq *kwonlyargs,
1988 asdl_expr_seq *kw_defaults)
Guido van Rossum4f72a782006-10-27 23:31:49 +00001989{
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03001990 /* Push a dict of keyword-only default values.
1991
1992 Return 0 on error, -1 if no dict pushed, 1 if a dict is pushed.
1993 */
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001994 int i;
1995 PyObject *keys = NULL;
1996
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001997 for (i = 0; i < asdl_seq_LEN(kwonlyargs); i++) {
1998 arg_ty arg = asdl_seq_GET(kwonlyargs, i);
1999 expr_ty default_ = asdl_seq_GET(kw_defaults, i);
2000 if (default_) {
Benjamin Peterson32c59b62012-04-17 19:53:21 -04002001 PyObject *mangled = _Py_Mangle(c->u->u_private, arg->arg);
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002002 if (!mangled) {
2003 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002004 }
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002005 if (keys == NULL) {
2006 keys = PyList_New(1);
2007 if (keys == NULL) {
2008 Py_DECREF(mangled);
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03002009 return 0;
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002010 }
2011 PyList_SET_ITEM(keys, 0, mangled);
2012 }
2013 else {
2014 int res = PyList_Append(keys, mangled);
2015 Py_DECREF(mangled);
2016 if (res == -1) {
2017 goto error;
2018 }
2019 }
2020 if (!compiler_visit_expr(c, default_)) {
2021 goto error;
2022 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002023 }
2024 }
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002025 if (keys != NULL) {
2026 Py_ssize_t default_count = PyList_GET_SIZE(keys);
2027 PyObject *keys_tuple = PyList_AsTuple(keys);
2028 Py_DECREF(keys);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03002029 ADDOP_LOAD_CONST_NEW(c, keys_tuple);
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002030 ADDOP_I(c, BUILD_CONST_KEY_MAP, default_count);
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03002031 assert(default_count > 0);
2032 return 1;
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002033 }
2034 else {
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03002035 return -1;
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002036 }
2037
2038error:
2039 Py_XDECREF(keys);
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03002040 return 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +00002041}
2042
2043static int
Guido van Rossum95e4d582018-01-26 08:20:18 -08002044compiler_visit_annexpr(struct compiler *c, expr_ty annotation)
2045{
Serhiy Storchaka64fddc42018-05-17 06:17:48 +03002046 ADDOP_LOAD_CONST_NEW(c, _PyAST_ExprAsUnicode(annotation));
Guido van Rossum95e4d582018-01-26 08:20:18 -08002047 return 1;
2048}
2049
2050static int
Neal Norwitzc1505362006-12-28 06:47:50 +00002051compiler_visit_argannotation(struct compiler *c, identifier id,
Yurii Karabas73019792020-11-25 12:43:18 +02002052 expr_ty annotation, Py_ssize_t *annotations_len)
Neal Norwitzc1505362006-12-28 06:47:50 +00002053{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002054 if (annotation) {
Yurii Karabas73019792020-11-25 12:43:18 +02002055 PyObject *mangled = _Py_Mangle(c->u->u_private, id);
Yury Selivanov34ce99f2014-02-18 12:49:41 -05002056 if (!mangled)
Yury Selivanovf315c1c2015-07-23 09:10:44 +03002057 return 0;
Yurii Karabas73019792020-11-25 12:43:18 +02002058
2059 ADDOP_LOAD_CONST(c, mangled);
Yury Selivanov34ce99f2014-02-18 12:49:41 -05002060 Py_DECREF(mangled);
Yurii Karabas73019792020-11-25 12:43:18 +02002061 VISIT(c, annexpr, annotation);
2062 *annotations_len += 2;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002063 }
Yury Selivanovf315c1c2015-07-23 09:10:44 +03002064 return 1;
Neal Norwitzc1505362006-12-28 06:47:50 +00002065}
2066
2067static int
Pablo Galindoa5634c42020-09-16 19:42:00 +01002068compiler_visit_argannotations(struct compiler *c, asdl_arg_seq* args,
Yurii Karabas73019792020-11-25 12:43:18 +02002069 Py_ssize_t *annotations_len)
Neal Norwitzc1505362006-12-28 06:47:50 +00002070{
Yury Selivanovf315c1c2015-07-23 09:10:44 +03002071 int i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002072 for (i = 0; i < asdl_seq_LEN(args); i++) {
2073 arg_ty arg = (arg_ty)asdl_seq_GET(args, i);
Yury Selivanovf315c1c2015-07-23 09:10:44 +03002074 if (!compiler_visit_argannotation(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002075 c,
2076 arg->arg,
2077 arg->annotation,
Yurii Karabas73019792020-11-25 12:43:18 +02002078 annotations_len))
Yury Selivanovf315c1c2015-07-23 09:10:44 +03002079 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002080 }
Yury Selivanovf315c1c2015-07-23 09:10:44 +03002081 return 1;
Neal Norwitzc1505362006-12-28 06:47:50 +00002082}
2083
2084static int
2085compiler_visit_annotations(struct compiler *c, arguments_ty args,
2086 expr_ty returns)
2087{
Yurii Karabas73019792020-11-25 12:43:18 +02002088 /* Push arg annotation names and values.
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002089 The expressions are evaluated out-of-order wrt the source code.
Neal Norwitzc1505362006-12-28 06:47:50 +00002090
Yurii Karabas73019792020-11-25 12:43:18 +02002091 Return 0 on error, -1 if no annotations pushed, 1 if a annotations is pushed.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002092 */
2093 static identifier return_str;
Yurii Karabas73019792020-11-25 12:43:18 +02002094 Py_ssize_t annotations_len = 0;
Neal Norwitzc1505362006-12-28 06:47:50 +00002095
Yurii Karabas73019792020-11-25 12:43:18 +02002096 if (!compiler_visit_argannotations(c, args->args, &annotations_len))
2097 return 0;
2098 if (!compiler_visit_argannotations(c, args->posonlyargs, &annotations_len))
2099 return 0;
Benjamin Petersoncda75be2013-03-18 10:48:58 -07002100 if (args->vararg && args->vararg->annotation &&
Yury Selivanovf315c1c2015-07-23 09:10:44 +03002101 !compiler_visit_argannotation(c, args->vararg->arg,
Yurii Karabas73019792020-11-25 12:43:18 +02002102 args->vararg->annotation, &annotations_len))
2103 return 0;
2104 if (!compiler_visit_argannotations(c, args->kwonlyargs, &annotations_len))
2105 return 0;
Benjamin Petersoncda75be2013-03-18 10:48:58 -07002106 if (args->kwarg && args->kwarg->annotation &&
Yury Selivanovf315c1c2015-07-23 09:10:44 +03002107 !compiler_visit_argannotation(c, args->kwarg->arg,
Yurii Karabas73019792020-11-25 12:43:18 +02002108 args->kwarg->annotation, &annotations_len))
2109 return 0;
Neal Norwitzc1505362006-12-28 06:47:50 +00002110
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002111 if (!return_str) {
2112 return_str = PyUnicode_InternFromString("return");
2113 if (!return_str)
Yurii Karabas73019792020-11-25 12:43:18 +02002114 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002115 }
Yurii Karabas73019792020-11-25 12:43:18 +02002116 if (!compiler_visit_argannotation(c, return_str, returns, &annotations_len)) {
2117 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002118 }
2119
Yurii Karabas73019792020-11-25 12:43:18 +02002120 if (annotations_len) {
2121 ADDOP_I(c, BUILD_TUPLE, annotations_len);
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03002122 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002123 }
Neal Norwitzc1505362006-12-28 06:47:50 +00002124
Yurii Karabas73019792020-11-25 12:43:18 +02002125 return -1;
Neal Norwitzc1505362006-12-28 06:47:50 +00002126}
2127
2128static int
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03002129compiler_visit_defaults(struct compiler *c, arguments_ty args)
2130{
2131 VISIT_SEQ(c, expr, args->defaults);
2132 ADDOP_I(c, BUILD_TUPLE, asdl_seq_LEN(args->defaults));
2133 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002134}
2135
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002136static Py_ssize_t
2137compiler_default_arguments(struct compiler *c, arguments_ty args)
2138{
2139 Py_ssize_t funcflags = 0;
2140 if (args->defaults && asdl_seq_LEN(args->defaults) > 0) {
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03002141 if (!compiler_visit_defaults(c, args))
2142 return -1;
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002143 funcflags |= 0x01;
2144 }
2145 if (args->kwonlyargs) {
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03002146 int res = compiler_visit_kwonlydefaults(c, args->kwonlyargs,
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002147 args->kw_defaults);
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03002148 if (res == 0) {
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002149 return -1;
2150 }
2151 else if (res > 0) {
2152 funcflags |= 0x02;
2153 }
2154 }
2155 return funcflags;
2156}
2157
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002158static int
Pablo Galindoc5fc1562020-04-22 23:29:27 +01002159forbidden_name(struct compiler *c, identifier name, expr_context_ty ctx)
2160{
2161
2162 if (ctx == Store && _PyUnicode_EqualToASCIIString(name, "__debug__")) {
2163 compiler_error(c, "cannot assign to __debug__");
2164 return 1;
2165 }
2166 return 0;
2167}
2168
2169static int
2170compiler_check_debug_one_arg(struct compiler *c, arg_ty arg)
2171{
2172 if (arg != NULL) {
2173 if (forbidden_name(c, arg->arg, Store))
2174 return 0;
2175 }
2176 return 1;
2177}
2178
2179static int
Pablo Galindoa5634c42020-09-16 19:42:00 +01002180compiler_check_debug_args_seq(struct compiler *c, asdl_arg_seq *args)
Pablo Galindoc5fc1562020-04-22 23:29:27 +01002181{
2182 if (args != NULL) {
Pablo Galindoee40e4b2020-04-23 03:43:08 +01002183 for (Py_ssize_t i = 0, n = asdl_seq_LEN(args); i < n; i++) {
Pablo Galindoc5fc1562020-04-22 23:29:27 +01002184 if (!compiler_check_debug_one_arg(c, asdl_seq_GET(args, i)))
2185 return 0;
2186 }
2187 }
2188 return 1;
2189}
2190
2191static int
2192compiler_check_debug_args(struct compiler *c, arguments_ty args)
2193{
2194 if (!compiler_check_debug_args_seq(c, args->posonlyargs))
2195 return 0;
2196 if (!compiler_check_debug_args_seq(c, args->args))
2197 return 0;
2198 if (!compiler_check_debug_one_arg(c, args->vararg))
2199 return 0;
2200 if (!compiler_check_debug_args_seq(c, args->kwonlyargs))
2201 return 0;
2202 if (!compiler_check_debug_one_arg(c, args->kwarg))
2203 return 0;
2204 return 1;
2205}
2206
2207static int
Yury Selivanov75445082015-05-11 22:57:16 -04002208compiler_function(struct compiler *c, stmt_ty s, int is_async)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002209{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002210 PyCodeObject *co;
Serhiy Storchaka143ce5c2018-05-30 10:56:16 +03002211 PyObject *qualname, *docstring = NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04002212 arguments_ty args;
2213 expr_ty returns;
2214 identifier name;
Pablo Galindoa5634c42020-09-16 19:42:00 +01002215 asdl_expr_seq* decos;
2216 asdl_stmt_seq *body;
INADA Naokicb41b272017-02-23 00:31:59 +09002217 Py_ssize_t i, funcflags;
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03002218 int annotations;
Yury Selivanov75445082015-05-11 22:57:16 -04002219 int scope_type;
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +02002220 int firstlineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002221
Yury Selivanov75445082015-05-11 22:57:16 -04002222 if (is_async) {
2223 assert(s->kind == AsyncFunctionDef_kind);
2224
2225 args = s->v.AsyncFunctionDef.args;
2226 returns = s->v.AsyncFunctionDef.returns;
2227 decos = s->v.AsyncFunctionDef.decorator_list;
2228 name = s->v.AsyncFunctionDef.name;
2229 body = s->v.AsyncFunctionDef.body;
2230
2231 scope_type = COMPILER_SCOPE_ASYNC_FUNCTION;
2232 } else {
2233 assert(s->kind == FunctionDef_kind);
2234
2235 args = s->v.FunctionDef.args;
2236 returns = s->v.FunctionDef.returns;
2237 decos = s->v.FunctionDef.decorator_list;
2238 name = s->v.FunctionDef.name;
2239 body = s->v.FunctionDef.body;
2240
2241 scope_type = COMPILER_SCOPE_FUNCTION;
2242 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002243
Pablo Galindoc5fc1562020-04-22 23:29:27 +01002244 if (!compiler_check_debug_args(c, args))
2245 return 0;
2246
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002247 if (!compiler_decorators(c, decos))
2248 return 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +00002249
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +02002250 firstlineno = s->lineno;
2251 if (asdl_seq_LEN(decos)) {
2252 firstlineno = ((expr_ty)asdl_seq_GET(decos, 0))->lineno;
2253 }
2254
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002255 funcflags = compiler_default_arguments(c, args);
2256 if (funcflags == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002257 return 0;
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002258 }
2259
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03002260 annotations = compiler_visit_annotations(c, args, returns);
2261 if (annotations == 0) {
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002262 return 0;
2263 }
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03002264 else if (annotations > 0) {
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002265 funcflags |= 0x04;
2266 }
2267
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +02002268 if (!compiler_enter_scope(c, name, scope_type, (void *)s, firstlineno)) {
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002269 return 0;
2270 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002271
INADA Naokicb41b272017-02-23 00:31:59 +09002272 /* if not -OO mode, add docstring */
Serhiy Storchaka143ce5c2018-05-30 10:56:16 +03002273 if (c->c_optimize < 2) {
2274 docstring = _PyAST_GetDocString(body);
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03002275 }
Serhiy Storchaka143ce5c2018-05-30 10:56:16 +03002276 if (compiler_add_const(c, docstring ? docstring : Py_None) < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002277 compiler_exit_scope(c);
2278 return 0;
2279 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002280
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002281 c->u->u_argcount = asdl_seq_LEN(args->args);
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01002282 c->u->u_posonlyargcount = asdl_seq_LEN(args->posonlyargs);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002283 c->u->u_kwonlyargcount = asdl_seq_LEN(args->kwonlyargs);
Mark Shannon877df852020-11-12 09:43:29 +00002284 for (i = docstring ? 1 : 0; i < asdl_seq_LEN(body); i++) {
Mark Shannonfd009e62020-11-13 12:53:53 +00002285 VISIT_IN_SCOPE(c, stmt, (stmt_ty)asdl_seq_GET(body, i));
Mark Shannon877df852020-11-12 09:43:29 +00002286 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002287 co = assemble(c, 1);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04002288 qualname = c->u->u_qualname;
2289 Py_INCREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002290 compiler_exit_scope(c);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04002291 if (co == NULL) {
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002292 Py_XDECREF(qualname);
2293 Py_XDECREF(co);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002294 return 0;
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002295 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002296
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002297 compiler_make_closure(c, co, funcflags, qualname);
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002298 Py_DECREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002299 Py_DECREF(co);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002300
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002301 /* decorators */
2302 for (i = 0; i < asdl_seq_LEN(decos); i++) {
2303 ADDOP_I(c, CALL_FUNCTION, 1);
2304 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002305
Yury Selivanov75445082015-05-11 22:57:16 -04002306 return compiler_nameop(c, name, Store);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002307}
2308
2309static int
2310compiler_class(struct compiler *c, stmt_ty s)
2311{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002312 PyCodeObject *co;
2313 PyObject *str;
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +02002314 int i, firstlineno;
Pablo Galindoa5634c42020-09-16 19:42:00 +01002315 asdl_expr_seq *decos = s->v.ClassDef.decorator_list;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002316
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002317 if (!compiler_decorators(c, decos))
2318 return 0;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002319
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +02002320 firstlineno = s->lineno;
2321 if (asdl_seq_LEN(decos)) {
2322 firstlineno = ((expr_ty)asdl_seq_GET(decos, 0))->lineno;
2323 }
2324
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002325 /* ultimately generate code for:
2326 <name> = __build_class__(<func>, <name>, *<bases>, **<keywords>)
2327 where:
2328 <func> is a function/closure created from the class body;
2329 it has a single argument (__locals__) where the dict
2330 (or MutableSequence) representing the locals is passed
2331 <name> is the class name
2332 <bases> is the positional arguments and *varargs argument
2333 <keywords> is the keyword arguments and **kwds argument
2334 This borrows from compiler_call.
2335 */
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002336
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002337 /* 1. compile the class body into a code object */
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002338 if (!compiler_enter_scope(c, s->v.ClassDef.name,
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +02002339 COMPILER_SCOPE_CLASS, (void *)s, firstlineno))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002340 return 0;
2341 /* this block represents what we do in the new scope */
2342 {
2343 /* use the class name for name mangling */
2344 Py_INCREF(s->v.ClassDef.name);
Serhiy Storchaka48842712016-04-06 09:45:48 +03002345 Py_XSETREF(c->u->u_private, s->v.ClassDef.name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002346 /* load (global) __name__ ... */
2347 str = PyUnicode_InternFromString("__name__");
2348 if (!str || !compiler_nameop(c, str, Load)) {
2349 Py_XDECREF(str);
2350 compiler_exit_scope(c);
2351 return 0;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002352 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002353 Py_DECREF(str);
2354 /* ... and store it as __module__ */
2355 str = PyUnicode_InternFromString("__module__");
2356 if (!str || !compiler_nameop(c, str, Store)) {
2357 Py_XDECREF(str);
2358 compiler_exit_scope(c);
2359 return 0;
2360 }
2361 Py_DECREF(str);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04002362 assert(c->u->u_qualname);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03002363 ADDOP_LOAD_CONST(c, c->u->u_qualname);
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002364 str = PyUnicode_InternFromString("__qualname__");
2365 if (!str || !compiler_nameop(c, str, Store)) {
2366 Py_XDECREF(str);
2367 compiler_exit_scope(c);
2368 return 0;
2369 }
2370 Py_DECREF(str);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002371 /* compile the body proper */
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03002372 if (!compiler_body(c, s->v.ClassDef.body)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002373 compiler_exit_scope(c);
2374 return 0;
2375 }
Nick Coghlan19d24672016-12-05 16:47:55 +10002376 /* Return __classcell__ if it is referenced, otherwise return None */
Benjamin Peterson312595c2013-05-15 15:26:42 -05002377 if (c->u->u_ste->ste_needs_class_closure) {
Nick Coghlan19d24672016-12-05 16:47:55 +10002378 /* Store __classcell__ into class namespace & return it */
Benjamin Peterson312595c2013-05-15 15:26:42 -05002379 str = PyUnicode_InternFromString("__class__");
2380 if (str == NULL) {
2381 compiler_exit_scope(c);
2382 return 0;
2383 }
2384 i = compiler_lookup_arg(c->u->u_cellvars, str);
2385 Py_DECREF(str);
Victor Stinner98e818b2013-11-05 18:07:34 +01002386 if (i < 0) {
2387 compiler_exit_scope(c);
2388 return 0;
2389 }
Benjamin Peterson312595c2013-05-15 15:26:42 -05002390 assert(i == 0);
Nick Coghlan944368e2016-09-11 14:45:49 +10002391
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002392 ADDOP_I(c, LOAD_CLOSURE, i);
Nick Coghlan19d24672016-12-05 16:47:55 +10002393 ADDOP(c, DUP_TOP);
Nick Coghlan944368e2016-09-11 14:45:49 +10002394 str = PyUnicode_InternFromString("__classcell__");
2395 if (!str || !compiler_nameop(c, str, Store)) {
2396 Py_XDECREF(str);
2397 compiler_exit_scope(c);
2398 return 0;
2399 }
2400 Py_DECREF(str);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002401 }
Benjamin Peterson312595c2013-05-15 15:26:42 -05002402 else {
Nick Coghlan19d24672016-12-05 16:47:55 +10002403 /* No methods referenced __class__, so just return None */
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +02002404 assert(PyDict_GET_SIZE(c->u->u_cellvars) == 0);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03002405 ADDOP_LOAD_CONST(c, Py_None);
Benjamin Peterson312595c2013-05-15 15:26:42 -05002406 }
Nick Coghlan19d24672016-12-05 16:47:55 +10002407 ADDOP_IN_SCOPE(c, RETURN_VALUE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002408 /* create the code object */
2409 co = assemble(c, 1);
2410 }
2411 /* leave the new scope */
2412 compiler_exit_scope(c);
2413 if (co == NULL)
2414 return 0;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002415
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002416 /* 2. load the 'build_class' function */
2417 ADDOP(c, LOAD_BUILD_CLASS);
2418
2419 /* 3. load a function (or closure) made from the code object */
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002420 compiler_make_closure(c, co, 0, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002421 Py_DECREF(co);
2422
2423 /* 4. load class name */
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03002424 ADDOP_LOAD_CONST(c, s->v.ClassDef.name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002425
2426 /* 5. generate the rest of the code for the call */
Pablo Galindoa5634c42020-09-16 19:42:00 +01002427 if (!compiler_call_helper(c, 2, s->v.ClassDef.bases, s->v.ClassDef.keywords))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002428 return 0;
2429
2430 /* 6. apply decorators */
2431 for (i = 0; i < asdl_seq_LEN(decos); i++) {
2432 ADDOP_I(c, CALL_FUNCTION, 1);
2433 }
2434
2435 /* 7. store into <name> */
2436 if (!compiler_nameop(c, s->v.ClassDef.name, Store))
2437 return 0;
2438 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002439}
2440
Serhiy Storchaka3bcbedc2019-01-18 07:47:48 +02002441/* Return 0 if the expression is a constant value except named singletons.
2442 Return 1 otherwise. */
2443static int
2444check_is_arg(expr_ty e)
2445{
2446 if (e->kind != Constant_kind) {
2447 return 1;
2448 }
2449 PyObject *value = e->v.Constant.value;
2450 return (value == Py_None
2451 || value == Py_False
2452 || value == Py_True
2453 || value == Py_Ellipsis);
2454}
2455
2456/* Check operands of identity chacks ("is" and "is not").
2457 Emit a warning if any operand is a constant except named singletons.
2458 Return 0 on error.
2459 */
2460static int
2461check_compare(struct compiler *c, expr_ty e)
2462{
2463 Py_ssize_t i, n;
2464 int left = check_is_arg(e->v.Compare.left);
2465 n = asdl_seq_LEN(e->v.Compare.ops);
2466 for (i = 0; i < n; i++) {
2467 cmpop_ty op = (cmpop_ty)asdl_seq_GET(e->v.Compare.ops, i);
2468 int right = check_is_arg((expr_ty)asdl_seq_GET(e->v.Compare.comparators, i));
2469 if (op == Is || op == IsNot) {
2470 if (!right || !left) {
2471 const char *msg = (op == Is)
2472 ? "\"is\" with a literal. Did you mean \"==\"?"
2473 : "\"is not\" with a literal. Did you mean \"!=\"?";
2474 return compiler_warn(c, msg);
2475 }
2476 }
2477 left = right;
2478 }
2479 return 1;
2480}
2481
Mark Shannon9af0e472020-01-14 10:12:45 +00002482static int compiler_addcompare(struct compiler *c, cmpop_ty op)
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002483{
Mark Shannon9af0e472020-01-14 10:12:45 +00002484 int cmp;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002485 switch (op) {
2486 case Eq:
Mark Shannon9af0e472020-01-14 10:12:45 +00002487 cmp = Py_EQ;
2488 break;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002489 case NotEq:
Mark Shannon9af0e472020-01-14 10:12:45 +00002490 cmp = Py_NE;
2491 break;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002492 case Lt:
Mark Shannon9af0e472020-01-14 10:12:45 +00002493 cmp = Py_LT;
2494 break;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002495 case LtE:
Mark Shannon9af0e472020-01-14 10:12:45 +00002496 cmp = Py_LE;
2497 break;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002498 case Gt:
Mark Shannon9af0e472020-01-14 10:12:45 +00002499 cmp = Py_GT;
2500 break;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002501 case GtE:
Mark Shannon9af0e472020-01-14 10:12:45 +00002502 cmp = Py_GE;
2503 break;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002504 case Is:
Mark Shannon9af0e472020-01-14 10:12:45 +00002505 ADDOP_I(c, IS_OP, 0);
2506 return 1;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002507 case IsNot:
Mark Shannon9af0e472020-01-14 10:12:45 +00002508 ADDOP_I(c, IS_OP, 1);
2509 return 1;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002510 case In:
Mark Shannon9af0e472020-01-14 10:12:45 +00002511 ADDOP_I(c, CONTAINS_OP, 0);
2512 return 1;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002513 case NotIn:
Mark Shannon9af0e472020-01-14 10:12:45 +00002514 ADDOP_I(c, CONTAINS_OP, 1);
2515 return 1;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002516 default:
Mark Shannon9af0e472020-01-14 10:12:45 +00002517 Py_UNREACHABLE();
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002518 }
Mark Shannon9af0e472020-01-14 10:12:45 +00002519 ADDOP_I(c, COMPARE_OP, cmp);
2520 return 1;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002521}
2522
Mark Shannon9af0e472020-01-14 10:12:45 +00002523
2524
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002525static int
2526compiler_jump_if(struct compiler *c, expr_ty e, basicblock *next, int cond)
2527{
2528 switch (e->kind) {
2529 case UnaryOp_kind:
2530 if (e->v.UnaryOp.op == Not)
2531 return compiler_jump_if(c, e->v.UnaryOp.operand, next, !cond);
2532 /* fallback to general implementation */
2533 break;
2534 case BoolOp_kind: {
Pablo Galindoa5634c42020-09-16 19:42:00 +01002535 asdl_expr_seq *s = e->v.BoolOp.values;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002536 Py_ssize_t i, n = asdl_seq_LEN(s) - 1;
2537 assert(n >= 0);
2538 int cond2 = e->v.BoolOp.op == Or;
2539 basicblock *next2 = next;
2540 if (!cond2 != !cond) {
2541 next2 = compiler_new_block(c);
2542 if (next2 == NULL)
2543 return 0;
2544 }
2545 for (i = 0; i < n; ++i) {
2546 if (!compiler_jump_if(c, (expr_ty)asdl_seq_GET(s, i), next2, cond2))
2547 return 0;
2548 }
2549 if (!compiler_jump_if(c, (expr_ty)asdl_seq_GET(s, n), next, cond))
2550 return 0;
2551 if (next2 != next)
2552 compiler_use_next_block(c, next2);
2553 return 1;
2554 }
2555 case IfExp_kind: {
2556 basicblock *end, *next2;
2557 end = compiler_new_block(c);
2558 if (end == NULL)
2559 return 0;
2560 next2 = compiler_new_block(c);
2561 if (next2 == NULL)
2562 return 0;
2563 if (!compiler_jump_if(c, e->v.IfExp.test, next2, 0))
2564 return 0;
2565 if (!compiler_jump_if(c, e->v.IfExp.body, next, cond))
2566 return 0;
Mark Shannon582aaf12020-08-04 17:30:11 +01002567 ADDOP_JUMP(c, JUMP_FORWARD, end);
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002568 compiler_use_next_block(c, next2);
2569 if (!compiler_jump_if(c, e->v.IfExp.orelse, next, cond))
2570 return 0;
2571 compiler_use_next_block(c, end);
2572 return 1;
2573 }
2574 case Compare_kind: {
2575 Py_ssize_t i, n = asdl_seq_LEN(e->v.Compare.ops) - 1;
2576 if (n > 0) {
Serhiy Storchaka45835252019-02-16 08:29:46 +02002577 if (!check_compare(c, e)) {
2578 return 0;
2579 }
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002580 basicblock *cleanup = compiler_new_block(c);
2581 if (cleanup == NULL)
2582 return 0;
2583 VISIT(c, expr, e->v.Compare.left);
2584 for (i = 0; i < n; i++) {
2585 VISIT(c, expr,
2586 (expr_ty)asdl_seq_GET(e->v.Compare.comparators, i));
2587 ADDOP(c, DUP_TOP);
2588 ADDOP(c, ROT_THREE);
Mark Shannon9af0e472020-01-14 10:12:45 +00002589 ADDOP_COMPARE(c, asdl_seq_GET(e->v.Compare.ops, i));
Mark Shannon582aaf12020-08-04 17:30:11 +01002590 ADDOP_JUMP(c, POP_JUMP_IF_FALSE, cleanup);
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002591 NEXT_BLOCK(c);
2592 }
2593 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, n));
Mark Shannon9af0e472020-01-14 10:12:45 +00002594 ADDOP_COMPARE(c, asdl_seq_GET(e->v.Compare.ops, n));
Mark Shannon582aaf12020-08-04 17:30:11 +01002595 ADDOP_JUMP(c, cond ? POP_JUMP_IF_TRUE : POP_JUMP_IF_FALSE, next);
Mark Shannon266b4622020-11-17 19:30:14 +00002596 NEXT_BLOCK(c);
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002597 basicblock *end = compiler_new_block(c);
2598 if (end == NULL)
2599 return 0;
Mark Shannon582aaf12020-08-04 17:30:11 +01002600 ADDOP_JUMP(c, JUMP_FORWARD, end);
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002601 compiler_use_next_block(c, cleanup);
2602 ADDOP(c, POP_TOP);
2603 if (!cond) {
Mark Shannon582aaf12020-08-04 17:30:11 +01002604 ADDOP_JUMP(c, JUMP_FORWARD, next);
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002605 }
2606 compiler_use_next_block(c, end);
2607 return 1;
2608 }
2609 /* fallback to general implementation */
2610 break;
2611 }
2612 default:
2613 /* fallback to general implementation */
2614 break;
2615 }
2616
2617 /* general implementation */
2618 VISIT(c, expr, e);
Mark Shannon582aaf12020-08-04 17:30:11 +01002619 ADDOP_JUMP(c, cond ? POP_JUMP_IF_TRUE : POP_JUMP_IF_FALSE, next);
Mark Shannon266b4622020-11-17 19:30:14 +00002620 NEXT_BLOCK(c);
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002621 return 1;
2622}
2623
2624static int
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002625compiler_ifexp(struct compiler *c, expr_ty e)
2626{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002627 basicblock *end, *next;
2628
2629 assert(e->kind == IfExp_kind);
2630 end = compiler_new_block(c);
2631 if (end == NULL)
2632 return 0;
2633 next = compiler_new_block(c);
2634 if (next == NULL)
2635 return 0;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002636 if (!compiler_jump_if(c, e->v.IfExp.test, next, 0))
2637 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002638 VISIT(c, expr, e->v.IfExp.body);
Mark Shannon582aaf12020-08-04 17:30:11 +01002639 ADDOP_JUMP(c, JUMP_FORWARD, end);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002640 compiler_use_next_block(c, next);
2641 VISIT(c, expr, e->v.IfExp.orelse);
2642 compiler_use_next_block(c, end);
2643 return 1;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002644}
2645
2646static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002647compiler_lambda(struct compiler *c, expr_ty e)
2648{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002649 PyCodeObject *co;
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002650 PyObject *qualname;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002651 static identifier name;
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002652 Py_ssize_t funcflags;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002653 arguments_ty args = e->v.Lambda.args;
2654 assert(e->kind == Lambda_kind);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002655
Pablo Galindoc5fc1562020-04-22 23:29:27 +01002656 if (!compiler_check_debug_args(c, args))
2657 return 0;
2658
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002659 if (!name) {
2660 name = PyUnicode_InternFromString("<lambda>");
2661 if (!name)
2662 return 0;
2663 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002664
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002665 funcflags = compiler_default_arguments(c, args);
2666 if (funcflags == -1) {
2667 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002668 }
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002669
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04002670 if (!compiler_enter_scope(c, name, COMPILER_SCOPE_LAMBDA,
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002671 (void *)e, e->lineno))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002672 return 0;
Neal Norwitz4737b232005-11-19 23:58:29 +00002673
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002674 /* Make None the first constant, so the lambda can't have a
2675 docstring. */
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03002676 if (compiler_add_const(c, Py_None) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002677 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002678
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002679 c->u->u_argcount = asdl_seq_LEN(args->args);
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01002680 c->u->u_posonlyargcount = asdl_seq_LEN(args->posonlyargs);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002681 c->u->u_kwonlyargcount = asdl_seq_LEN(args->kwonlyargs);
2682 VISIT_IN_SCOPE(c, expr, e->v.Lambda.body);
2683 if (c->u->u_ste->ste_generator) {
Serhiy Storchakac775ad62015-03-11 18:20:35 +02002684 co = assemble(c, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002685 }
2686 else {
2687 ADDOP_IN_SCOPE(c, RETURN_VALUE);
Serhiy Storchakac775ad62015-03-11 18:20:35 +02002688 co = assemble(c, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002689 }
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04002690 qualname = c->u->u_qualname;
2691 Py_INCREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002692 compiler_exit_scope(c);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04002693 if (co == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002694 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002695
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002696 compiler_make_closure(c, co, funcflags, qualname);
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002697 Py_DECREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002698 Py_DECREF(co);
2699
2700 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002701}
2702
2703static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002704compiler_if(struct compiler *c, stmt_ty s)
2705{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002706 basicblock *end, *next;
2707 int constant;
2708 assert(s->kind == If_kind);
2709 end = compiler_new_block(c);
2710 if (end == NULL)
2711 return 0;
2712
Serhiy Storchaka3dfbaf52017-12-25 12:47:50 +02002713 constant = expr_constant(s->v.If.test);
Pablo Galindo18c5f9d2019-07-15 10:15:01 +01002714 /* constant = 0: "if 0"
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002715 * constant = 1: "if 1", "if 2", ...
2716 * constant = -1: rest */
Pablo Galindo18c5f9d2019-07-15 10:15:01 +01002717 if (constant == 0) {
2718 BEGIN_DO_NOT_EMIT_BYTECODE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002719 VISIT_SEQ(c, stmt, s->v.If.body);
Pablo Galindo18c5f9d2019-07-15 10:15:01 +01002720 END_DO_NOT_EMIT_BYTECODE
2721 if (s->v.If.orelse) {
2722 VISIT_SEQ(c, stmt, s->v.If.orelse);
2723 }
2724 } else if (constant == 1) {
2725 VISIT_SEQ(c, stmt, s->v.If.body);
2726 if (s->v.If.orelse) {
2727 BEGIN_DO_NOT_EMIT_BYTECODE
2728 VISIT_SEQ(c, stmt, s->v.If.orelse);
2729 END_DO_NOT_EMIT_BYTECODE
2730 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002731 } else {
Antoine Pitroue7811fc2014-09-18 03:06:50 +02002732 if (asdl_seq_LEN(s->v.If.orelse)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002733 next = compiler_new_block(c);
2734 if (next == NULL)
2735 return 0;
2736 }
Mark Shannonfee55262019-11-21 09:11:43 +00002737 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002738 next = end;
Mark Shannonfee55262019-11-21 09:11:43 +00002739 }
2740 if (!compiler_jump_if(c, s->v.If.test, next, 0)) {
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002741 return 0;
Mark Shannonfee55262019-11-21 09:11:43 +00002742 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002743 VISIT_SEQ(c, stmt, s->v.If.body);
Antoine Pitroue7811fc2014-09-18 03:06:50 +02002744 if (asdl_seq_LEN(s->v.If.orelse)) {
Mark Shannon582aaf12020-08-04 17:30:11 +01002745 ADDOP_JUMP(c, JUMP_FORWARD, end);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002746 compiler_use_next_block(c, next);
2747 VISIT_SEQ(c, stmt, s->v.If.orelse);
2748 }
2749 }
2750 compiler_use_next_block(c, end);
2751 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002752}
2753
2754static int
2755compiler_for(struct compiler *c, stmt_ty s)
2756{
Mark Shannon5977a792020-12-02 13:31:40 +00002757 basicblock *start, *body, *cleanup, *end;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002758
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002759 start = compiler_new_block(c);
Mark Shannon5977a792020-12-02 13:31:40 +00002760 body = compiler_new_block(c);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002761 cleanup = compiler_new_block(c);
2762 end = compiler_new_block(c);
Mark Shannon5977a792020-12-02 13:31:40 +00002763 if (start == NULL || body == NULL || end == NULL || cleanup == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002764 return 0;
Mark Shannonfee55262019-11-21 09:11:43 +00002765 }
2766 if (!compiler_push_fblock(c, FOR_LOOP, start, end, NULL)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002767 return 0;
Mark Shannonfee55262019-11-21 09:11:43 +00002768 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002769 VISIT(c, expr, s->v.For.iter);
2770 ADDOP(c, GET_ITER);
2771 compiler_use_next_block(c, start);
Mark Shannon582aaf12020-08-04 17:30:11 +01002772 ADDOP_JUMP(c, FOR_ITER, cleanup);
Mark Shannon5977a792020-12-02 13:31:40 +00002773 compiler_use_next_block(c, body);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002774 VISIT(c, expr, s->v.For.target);
2775 VISIT_SEQ(c, stmt, s->v.For.body);
Mark Shannonf5e97b72020-12-14 11:28:39 +00002776 /* Mark jump as artificial */
2777 c->u->u_lineno = -1;
Mark Shannon582aaf12020-08-04 17:30:11 +01002778 ADDOP_JUMP(c, JUMP_ABSOLUTE, start);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002779 compiler_use_next_block(c, cleanup);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002780
2781 compiler_pop_fblock(c, FOR_LOOP, start);
2782
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002783 VISIT_SEQ(c, stmt, s->v.For.orelse);
2784 compiler_use_next_block(c, end);
2785 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002786}
2787
Yury Selivanov75445082015-05-11 22:57:16 -04002788
2789static int
2790compiler_async_for(struct compiler *c, stmt_ty s)
2791{
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002792 basicblock *start, *except, *end;
Pablo Galindo90235812020-03-15 04:29:22 +00002793 if (IS_TOP_LEVEL_AWAIT(c)){
Matthias Bussonnier565b4f12019-05-21 13:12:03 -07002794 c->u->u_ste->ste_coroutine = 1;
2795 } else if (c->u->u_scope_type != COMPILER_SCOPE_ASYNC_FUNCTION) {
Zsolt Dollensteine2396502018-04-27 08:58:56 -07002796 return compiler_error(c, "'async for' outside async function");
2797 }
2798
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002799 start = compiler_new_block(c);
Yury Selivanov75445082015-05-11 22:57:16 -04002800 except = compiler_new_block(c);
2801 end = compiler_new_block(c);
Yury Selivanov75445082015-05-11 22:57:16 -04002802
Mark Shannonfee55262019-11-21 09:11:43 +00002803 if (start == NULL || except == NULL || end == NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04002804 return 0;
Mark Shannonfee55262019-11-21 09:11:43 +00002805 }
Yury Selivanov75445082015-05-11 22:57:16 -04002806 VISIT(c, expr, s->v.AsyncFor.iter);
2807 ADDOP(c, GET_AITER);
Yury Selivanov75445082015-05-11 22:57:16 -04002808
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002809 compiler_use_next_block(c, start);
Mark Shannonfee55262019-11-21 09:11:43 +00002810 if (!compiler_push_fblock(c, FOR_LOOP, start, end, NULL)) {
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002811 return 0;
Mark Shannonfee55262019-11-21 09:11:43 +00002812 }
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002813 /* SETUP_FINALLY to guard the __anext__ call */
Mark Shannon582aaf12020-08-04 17:30:11 +01002814 ADDOP_JUMP(c, SETUP_FINALLY, except);
Yury Selivanov75445082015-05-11 22:57:16 -04002815 ADDOP(c, GET_ANEXT);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03002816 ADDOP_LOAD_CONST(c, Py_None);
Yury Selivanov75445082015-05-11 22:57:16 -04002817 ADDOP(c, YIELD_FROM);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002818 ADDOP(c, POP_BLOCK); /* for SETUP_FINALLY */
Yury Selivanov75445082015-05-11 22:57:16 -04002819
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002820 /* Success block for __anext__ */
2821 VISIT(c, expr, s->v.AsyncFor.target);
2822 VISIT_SEQ(c, stmt, s->v.AsyncFor.body);
Mark Shannon582aaf12020-08-04 17:30:11 +01002823 ADDOP_JUMP(c, JUMP_ABSOLUTE, start);
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002824
2825 compiler_pop_fblock(c, FOR_LOOP, start);
Yury Selivanov75445082015-05-11 22:57:16 -04002826
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002827 /* Except block for __anext__ */
Yury Selivanov75445082015-05-11 22:57:16 -04002828 compiler_use_next_block(c, except);
Mark Shannon877df852020-11-12 09:43:29 +00002829
2830 c->u->u_lineno = -1;
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002831 ADDOP(c, END_ASYNC_FOR);
Yury Selivanov75445082015-05-11 22:57:16 -04002832
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002833 /* `else` block */
Yury Selivanov75445082015-05-11 22:57:16 -04002834 VISIT_SEQ(c, stmt, s->v.For.orelse);
2835
2836 compiler_use_next_block(c, end);
2837
2838 return 1;
2839}
2840
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002841static int
2842compiler_while(struct compiler *c, stmt_ty s)
2843{
Mark Shannon266b4622020-11-17 19:30:14 +00002844 basicblock *loop, *body, *end, *anchor = NULL;
Serhiy Storchaka3dfbaf52017-12-25 12:47:50 +02002845 int constant = expr_constant(s->v.While.test);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002846
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002847 if (constant == 0) {
Pablo Galindo18c5f9d2019-07-15 10:15:01 +01002848 BEGIN_DO_NOT_EMIT_BYTECODE
Pablo Galindo6c3e66a2019-10-30 11:53:26 +00002849 // Push a dummy block so the VISIT_SEQ knows that we are
2850 // inside a while loop so it can correctly evaluate syntax
2851 // errors.
Mark Shannonfee55262019-11-21 09:11:43 +00002852 if (!compiler_push_fblock(c, WHILE_LOOP, NULL, NULL, NULL)) {
Pablo Galindo6c3e66a2019-10-30 11:53:26 +00002853 return 0;
2854 }
Pablo Galindo18c5f9d2019-07-15 10:15:01 +01002855 VISIT_SEQ(c, stmt, s->v.While.body);
Pablo Galindo6c3e66a2019-10-30 11:53:26 +00002856 // Remove the dummy block now that is not needed.
2857 compiler_pop_fblock(c, WHILE_LOOP, NULL);
Pablo Galindo18c5f9d2019-07-15 10:15:01 +01002858 END_DO_NOT_EMIT_BYTECODE
2859 if (s->v.While.orelse) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002860 VISIT_SEQ(c, stmt, s->v.While.orelse);
Pablo Galindo18c5f9d2019-07-15 10:15:01 +01002861 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002862 return 1;
2863 }
2864 loop = compiler_new_block(c);
Mark Shannon266b4622020-11-17 19:30:14 +00002865 body = compiler_new_block(c);
2866 anchor = compiler_new_block(c);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002867 end = compiler_new_block(c);
Mark Shannon266b4622020-11-17 19:30:14 +00002868 if (loop == NULL || body == NULL || anchor == NULL || end == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002869 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002870 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002871 compiler_use_next_block(c, loop);
Mark Shannon266b4622020-11-17 19:30:14 +00002872 if (!compiler_push_fblock(c, WHILE_LOOP, loop, end, NULL)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002873 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002874 }
Mark Shannon266b4622020-11-17 19:30:14 +00002875 if (constant == -1) {
2876 if (!compiler_jump_if(c, s->v.While.test, anchor, 0)) {
2877 return 0;
2878 }
2879 }
2880
2881 compiler_use_next_block(c, body);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002882 VISIT_SEQ(c, stmt, s->v.While.body);
Mark Shannon582aaf12020-08-04 17:30:11 +01002883 ADDOP_JUMP(c, JUMP_ABSOLUTE, loop);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002884
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002885 compiler_pop_fblock(c, WHILE_LOOP, loop);
2886
Mark Shannon266b4622020-11-17 19:30:14 +00002887 compiler_use_next_block(c, anchor);
2888 if (s->v.While.orelse) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002889 VISIT_SEQ(c, stmt, s->v.While.orelse);
Mark Shannon266b4622020-11-17 19:30:14 +00002890 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002891 compiler_use_next_block(c, end);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002892
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002893 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002894}
2895
2896static int
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002897compiler_return(struct compiler *c, stmt_ty s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002898{
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002899 int preserve_tos = ((s->v.Return.value != NULL) &&
Serhiy Storchaka3f228112018-09-27 17:42:37 +03002900 (s->v.Return.value->kind != Constant_kind));
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002901 if (c->u->u_ste->ste_type != FunctionBlock)
2902 return compiler_error(c, "'return' outside function");
2903 if (s->v.Return.value != NULL &&
2904 c->u->u_ste->ste_coroutine && c->u->u_ste->ste_generator)
2905 {
2906 return compiler_error(
2907 c, "'return' with value in async generator");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002908 }
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002909 if (preserve_tos) {
2910 VISIT(c, expr, s->v.Return.value);
2911 }
Mark Shannonfee55262019-11-21 09:11:43 +00002912 if (!compiler_unwind_fblock_stack(c, preserve_tos, NULL))
2913 return 0;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002914 if (s->v.Return.value == NULL) {
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03002915 ADDOP_LOAD_CONST(c, Py_None);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002916 }
2917 else if (!preserve_tos) {
2918 VISIT(c, expr, s->v.Return.value);
2919 }
2920 ADDOP(c, RETURN_VALUE);
Mark Shannon266b4622020-11-17 19:30:14 +00002921 NEXT_BLOCK(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002922
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002923 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002924}
2925
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002926static int
2927compiler_break(struct compiler *c)
2928{
Mark Shannonfee55262019-11-21 09:11:43 +00002929 struct fblockinfo *loop = NULL;
2930 if (!compiler_unwind_fblock_stack(c, 0, &loop)) {
2931 return 0;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002932 }
Mark Shannonfee55262019-11-21 09:11:43 +00002933 if (loop == NULL) {
2934 return compiler_error(c, "'break' outside loop");
2935 }
2936 if (!compiler_unwind_fblock(c, loop, 0)) {
2937 return 0;
2938 }
Mark Shannon582aaf12020-08-04 17:30:11 +01002939 ADDOP_JUMP(c, JUMP_ABSOLUTE, loop->fb_exit);
Mark Shannon266b4622020-11-17 19:30:14 +00002940 NEXT_BLOCK(c);
Mark Shannonfee55262019-11-21 09:11:43 +00002941 return 1;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002942}
2943
2944static int
2945compiler_continue(struct compiler *c)
2946{
Mark Shannonfee55262019-11-21 09:11:43 +00002947 struct fblockinfo *loop = NULL;
2948 if (!compiler_unwind_fblock_stack(c, 0, &loop)) {
2949 return 0;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002950 }
Mark Shannonfee55262019-11-21 09:11:43 +00002951 if (loop == NULL) {
2952 return compiler_error(c, "'continue' not properly in loop");
2953 }
Mark Shannon582aaf12020-08-04 17:30:11 +01002954 ADDOP_JUMP(c, JUMP_ABSOLUTE, loop->fb_block);
Mark Shannon266b4622020-11-17 19:30:14 +00002955 NEXT_BLOCK(c)
Mark Shannonfee55262019-11-21 09:11:43 +00002956 return 1;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002957}
2958
2959
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002960/* Code generated for "try: <body> finally: <finalbody>" is as follows:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002961
2962 SETUP_FINALLY L
2963 <code for body>
2964 POP_BLOCK
Mark Shannonfee55262019-11-21 09:11:43 +00002965 <code for finalbody>
2966 JUMP E
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002967 L:
2968 <code for finalbody>
Mark Shannonfee55262019-11-21 09:11:43 +00002969 E:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002970
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002971 The special instructions use the block stack. Each block
2972 stack entry contains the instruction that created it (here
2973 SETUP_FINALLY), the level of the value stack at the time the
2974 block stack entry was created, and a label (here L).
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002975
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002976 SETUP_FINALLY:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002977 Pushes the current value stack level and the label
2978 onto the block stack.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002979 POP_BLOCK:
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002980 Pops en entry from the block stack.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002981
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002982 The block stack is unwound when an exception is raised:
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002983 when a SETUP_FINALLY entry is found, the raised and the caught
2984 exceptions are pushed onto the value stack (and the exception
2985 condition is cleared), and the interpreter jumps to the label
2986 gotten from the block stack.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002987*/
2988
2989static int
2990compiler_try_finally(struct compiler *c, stmt_ty s)
2991{
Mark Shannonfee55262019-11-21 09:11:43 +00002992 basicblock *body, *end, *exit;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002993
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002994 body = compiler_new_block(c);
2995 end = compiler_new_block(c);
Mark Shannonfee55262019-11-21 09:11:43 +00002996 exit = compiler_new_block(c);
2997 if (body == NULL || end == NULL || exit == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002998 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002999
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003000 /* `try` block */
Mark Shannon582aaf12020-08-04 17:30:11 +01003001 ADDOP_JUMP(c, SETUP_FINALLY, end);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003002 compiler_use_next_block(c, body);
Mark Shannonfee55262019-11-21 09:11:43 +00003003 if (!compiler_push_fblock(c, FINALLY_TRY, body, end, s->v.Try.finalbody))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003004 return 0;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003005 if (s->v.Try.handlers && asdl_seq_LEN(s->v.Try.handlers)) {
3006 if (!compiler_try_except(c, s))
3007 return 0;
3008 }
3009 else {
3010 VISIT_SEQ(c, stmt, s->v.Try.body);
3011 }
Mark Shannon56aa20f2020-12-14 10:19:10 +00003012 /* Mark code as artificial */
3013 c->u->u_lineno = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003014 ADDOP(c, POP_BLOCK);
Mark Shannonfee55262019-11-21 09:11:43 +00003015 compiler_pop_fblock(c, FINALLY_TRY, body);
3016 VISIT_SEQ(c, stmt, s->v.Try.finalbody);
Mark Shannon582aaf12020-08-04 17:30:11 +01003017 ADDOP_JUMP(c, JUMP_FORWARD, exit);
Mark Shannonfee55262019-11-21 09:11:43 +00003018 /* `finally` block */
3019 compiler_use_next_block(c, end);
3020 if (!compiler_push_fblock(c, FINALLY_END, end, NULL, NULL))
3021 return 0;
3022 VISIT_SEQ(c, stmt, s->v.Try.finalbody);
3023 compiler_pop_fblock(c, FINALLY_END, end);
3024 ADDOP(c, RERAISE);
3025 compiler_use_next_block(c, exit);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003026 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003027}
3028
3029/*
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00003030 Code generated for "try: S except E1 as V1: S1 except E2 as V2: S2 ...":
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003031 (The contents of the value stack is shown in [], with the top
3032 at the right; 'tb' is trace-back info, 'val' the exception's
3033 associated value, and 'exc' the exception.)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003034
3035 Value stack Label Instruction Argument
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003036 [] SETUP_FINALLY L1
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003037 [] <code for S>
3038 [] POP_BLOCK
3039 [] JUMP_FORWARD L0
3040
3041 [tb, val, exc] L1: DUP )
3042 [tb, val, exc, exc] <evaluate E1> )
Mark Shannon9af0e472020-01-14 10:12:45 +00003043 [tb, val, exc, exc, E1] JUMP_IF_NOT_EXC_MATCH L2 ) only if E1
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003044 [tb, val, exc] POP
3045 [tb, val] <assign to V1> (or POP if no V1)
3046 [tb] POP
3047 [] <code for S1>
3048 JUMP_FORWARD L0
3049
3050 [tb, val, exc] L2: DUP
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003051 .............................etc.......................
3052
Mark Shannonfee55262019-11-21 09:11:43 +00003053 [tb, val, exc] Ln+1: RERAISE # re-raise exception
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003054
3055 [] L0: <next statement>
3056
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003057 Of course, parts are not generated if Vi or Ei is not present.
3058*/
3059static int
3060compiler_try_except(struct compiler *c, stmt_ty s)
3061{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003062 basicblock *body, *orelse, *except, *end;
Victor Stinnerad9a0662013-11-19 22:23:20 +01003063 Py_ssize_t i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003064
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003065 body = compiler_new_block(c);
3066 except = compiler_new_block(c);
3067 orelse = compiler_new_block(c);
3068 end = compiler_new_block(c);
3069 if (body == NULL || except == NULL || orelse == NULL || end == NULL)
3070 return 0;
Mark Shannon582aaf12020-08-04 17:30:11 +01003071 ADDOP_JUMP(c, SETUP_FINALLY, except);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003072 compiler_use_next_block(c, body);
Mark Shannon02d126a2020-09-25 14:04:19 +01003073 if (!compiler_push_fblock(c, TRY_EXCEPT, body, NULL, NULL))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003074 return 0;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003075 VISIT_SEQ(c, stmt, s->v.Try.body);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003076 ADDOP(c, POP_BLOCK);
Mark Shannon02d126a2020-09-25 14:04:19 +01003077 compiler_pop_fblock(c, TRY_EXCEPT, body);
Mark Shannon582aaf12020-08-04 17:30:11 +01003078 ADDOP_JUMP(c, JUMP_FORWARD, orelse);
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003079 n = asdl_seq_LEN(s->v.Try.handlers);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003080 compiler_use_next_block(c, except);
Mark Shannon02d126a2020-09-25 14:04:19 +01003081 /* Runtime will push a block here, so we need to account for that */
3082 if (!compiler_push_fblock(c, EXCEPTION_HANDLER, NULL, NULL, NULL))
3083 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003084 for (i = 0; i < n; i++) {
3085 excepthandler_ty handler = (excepthandler_ty)asdl_seq_GET(
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003086 s->v.Try.handlers, i);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003087 if (!handler->v.ExceptHandler.type && i < n-1)
3088 return compiler_error(c, "default 'except:' must be last");
Serhiy Storchaka61cb3d02020-03-17 18:07:30 +02003089 SET_LOC(c, handler);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003090 except = compiler_new_block(c);
3091 if (except == NULL)
3092 return 0;
3093 if (handler->v.ExceptHandler.type) {
3094 ADDOP(c, DUP_TOP);
3095 VISIT(c, expr, handler->v.ExceptHandler.type);
Mark Shannon582aaf12020-08-04 17:30:11 +01003096 ADDOP_JUMP(c, JUMP_IF_NOT_EXC_MATCH, except);
Mark Shannon266b4622020-11-17 19:30:14 +00003097 NEXT_BLOCK(c);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003098 }
3099 ADDOP(c, POP_TOP);
3100 if (handler->v.ExceptHandler.name) {
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003101 basicblock *cleanup_end, *cleanup_body;
Guido van Rossumb940e112007-01-10 16:19:56 +00003102
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003103 cleanup_end = compiler_new_block(c);
3104 cleanup_body = compiler_new_block(c);
Zackery Spytz53ebf4b2018-10-11 23:54:03 -06003105 if (cleanup_end == NULL || cleanup_body == NULL) {
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003106 return 0;
Zackery Spytz53ebf4b2018-10-11 23:54:03 -06003107 }
Guido van Rossumb940e112007-01-10 16:19:56 +00003108
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003109 compiler_nameop(c, handler->v.ExceptHandler.name, Store);
3110 ADDOP(c, POP_TOP);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003111
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003112 /*
3113 try:
Ezio Melotti1b6424f2013-04-19 07:10:09 +03003114 # body
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003115 except type as name:
Ezio Melotti1b6424f2013-04-19 07:10:09 +03003116 try:
3117 # body
3118 finally:
Chris Angelicoad098b62019-05-21 23:34:19 +10003119 name = None # in case body contains "del name"
Ezio Melotti1b6424f2013-04-19 07:10:09 +03003120 del name
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003121 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003122
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003123 /* second try: */
Mark Shannon582aaf12020-08-04 17:30:11 +01003124 ADDOP_JUMP(c, SETUP_FINALLY, cleanup_end);
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003125 compiler_use_next_block(c, cleanup_body);
Mark Shannonfee55262019-11-21 09:11:43 +00003126 if (!compiler_push_fblock(c, HANDLER_CLEANUP, cleanup_body, NULL, handler->v.ExceptHandler.name))
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003127 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003128
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003129 /* second # body */
3130 VISIT_SEQ(c, stmt, handler->v.ExceptHandler.body);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003131 compiler_pop_fblock(c, HANDLER_CLEANUP, cleanup_body);
Mark Shannonfee55262019-11-21 09:11:43 +00003132 ADDOP(c, POP_BLOCK);
3133 ADDOP(c, POP_EXCEPT);
Mark Shannon877df852020-11-12 09:43:29 +00003134 /* name = None; del name; # Mark as artificial */
3135 c->u->u_lineno = -1;
Mark Shannonfee55262019-11-21 09:11:43 +00003136 ADDOP_LOAD_CONST(c, Py_None);
3137 compiler_nameop(c, handler->v.ExceptHandler.name, Store);
3138 compiler_nameop(c, handler->v.ExceptHandler.name, Del);
Mark Shannon582aaf12020-08-04 17:30:11 +01003139 ADDOP_JUMP(c, JUMP_FORWARD, end);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003140
Mark Shannonfee55262019-11-21 09:11:43 +00003141 /* except: */
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003142 compiler_use_next_block(c, cleanup_end);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003143
Mark Shannon877df852020-11-12 09:43:29 +00003144 /* name = None; del name; # Mark as artificial */
3145 c->u->u_lineno = -1;
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03003146 ADDOP_LOAD_CONST(c, Py_None);
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003147 compiler_nameop(c, handler->v.ExceptHandler.name, Store);
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003148 compiler_nameop(c, handler->v.ExceptHandler.name, Del);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003149
Mark Shannonfee55262019-11-21 09:11:43 +00003150 ADDOP(c, RERAISE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003151 }
3152 else {
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003153 basicblock *cleanup_body;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003154
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003155 cleanup_body = compiler_new_block(c);
Benjamin Peterson0a5dad92011-05-27 14:17:04 -05003156 if (!cleanup_body)
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003157 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003158
Guido van Rossumb940e112007-01-10 16:19:56 +00003159 ADDOP(c, POP_TOP);
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003160 ADDOP(c, POP_TOP);
3161 compiler_use_next_block(c, cleanup_body);
Mark Shannonfee55262019-11-21 09:11:43 +00003162 if (!compiler_push_fblock(c, HANDLER_CLEANUP, cleanup_body, NULL, NULL))
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003163 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003164 VISIT_SEQ(c, stmt, handler->v.ExceptHandler.body);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003165 compiler_pop_fblock(c, HANDLER_CLEANUP, cleanup_body);
Mark Shannonfee55262019-11-21 09:11:43 +00003166 ADDOP(c, POP_EXCEPT);
Mark Shannon582aaf12020-08-04 17:30:11 +01003167 ADDOP_JUMP(c, JUMP_FORWARD, end);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003168 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003169 compiler_use_next_block(c, except);
3170 }
Mark Shannon02d126a2020-09-25 14:04:19 +01003171 compiler_pop_fblock(c, EXCEPTION_HANDLER, NULL);
Mark Shannonfee55262019-11-21 09:11:43 +00003172 ADDOP(c, RERAISE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003173 compiler_use_next_block(c, orelse);
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003174 VISIT_SEQ(c, stmt, s->v.Try.orelse);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003175 compiler_use_next_block(c, end);
3176 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003177}
3178
3179static int
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003180compiler_try(struct compiler *c, stmt_ty s) {
3181 if (s->v.Try.finalbody && asdl_seq_LEN(s->v.Try.finalbody))
3182 return compiler_try_finally(c, s);
3183 else
3184 return compiler_try_except(c, s);
3185}
3186
3187
3188static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003189compiler_import_as(struct compiler *c, identifier name, identifier asname)
3190{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003191 /* The IMPORT_NAME opcode was already generated. This function
3192 merely needs to bind the result to a name.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003193
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003194 If there is a dot in name, we need to split it and emit a
Serhiy Storchakaf93234b2017-05-09 22:31:05 +03003195 IMPORT_FROM for each name.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003196 */
Serhiy Storchaka265fcc52017-08-29 15:47:44 +03003197 Py_ssize_t len = PyUnicode_GET_LENGTH(name);
3198 Py_ssize_t dot = PyUnicode_FindChar(name, '.', 0, len, 1);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003199 if (dot == -2)
Serhiy Storchaka694de3b2016-06-15 20:06:07 +03003200 return 0;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003201 if (dot != -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003202 /* Consume the base module name to get the first attribute */
Serhiy Storchaka265fcc52017-08-29 15:47:44 +03003203 while (1) {
3204 Py_ssize_t pos = dot + 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003205 PyObject *attr;
Serhiy Storchaka265fcc52017-08-29 15:47:44 +03003206 dot = PyUnicode_FindChar(name, '.', pos, len, 1);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003207 if (dot == -2)
Serhiy Storchaka694de3b2016-06-15 20:06:07 +03003208 return 0;
Serhiy Storchaka265fcc52017-08-29 15:47:44 +03003209 attr = PyUnicode_Substring(name, pos, (dot != -1) ? dot : len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003210 if (!attr)
Serhiy Storchaka694de3b2016-06-15 20:06:07 +03003211 return 0;
Serhiy Storchakaaa8e51f2018-04-01 00:29:37 +03003212 ADDOP_N(c, IMPORT_FROM, attr, names);
Serhiy Storchaka265fcc52017-08-29 15:47:44 +03003213 if (dot == -1) {
3214 break;
3215 }
3216 ADDOP(c, ROT_TWO);
3217 ADDOP(c, POP_TOP);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003218 }
Serhiy Storchaka265fcc52017-08-29 15:47:44 +03003219 if (!compiler_nameop(c, asname, Store)) {
3220 return 0;
3221 }
3222 ADDOP(c, POP_TOP);
3223 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003224 }
3225 return compiler_nameop(c, asname, Store);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003226}
3227
3228static int
3229compiler_import(struct compiler *c, stmt_ty s)
3230{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003231 /* The Import node stores a module name like a.b.c as a single
3232 string. This is convenient for all cases except
3233 import a.b.c as d
3234 where we need to parse that string to extract the individual
3235 module names.
3236 XXX Perhaps change the representation to make this case simpler?
3237 */
Victor Stinnerad9a0662013-11-19 22:23:20 +01003238 Py_ssize_t i, n = asdl_seq_LEN(s->v.Import.names);
Thomas Woutersf7f438b2006-02-28 16:09:29 +00003239
Victor Stinnerc9bc2902020-10-27 02:24:34 +01003240 PyObject *zero = _PyLong_GetZero(); // borrowed reference
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003241 for (i = 0; i < n; i++) {
3242 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.Import.names, i);
3243 int r;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003244
Victor Stinnerc9bc2902020-10-27 02:24:34 +01003245 ADDOP_LOAD_CONST(c, zero);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03003246 ADDOP_LOAD_CONST(c, Py_None);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003247 ADDOP_NAME(c, IMPORT_NAME, alias->name, names);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003248
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003249 if (alias->asname) {
3250 r = compiler_import_as(c, alias->name, alias->asname);
3251 if (!r)
3252 return r;
3253 }
3254 else {
3255 identifier tmp = alias->name;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003256 Py_ssize_t dot = PyUnicode_FindChar(
3257 alias->name, '.', 0, PyUnicode_GET_LENGTH(alias->name), 1);
Victor Stinner6b64a682013-07-11 22:50:45 +02003258 if (dot != -1) {
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003259 tmp = PyUnicode_Substring(alias->name, 0, dot);
Victor Stinner6b64a682013-07-11 22:50:45 +02003260 if (tmp == NULL)
3261 return 0;
3262 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003263 r = compiler_nameop(c, tmp, Store);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003264 if (dot != -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003265 Py_DECREF(tmp);
3266 }
3267 if (!r)
3268 return r;
3269 }
3270 }
3271 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003272}
3273
3274static int
3275compiler_from_import(struct compiler *c, stmt_ty s)
3276{
Victor Stinnerad9a0662013-11-19 22:23:20 +01003277 Py_ssize_t i, n = asdl_seq_LEN(s->v.ImportFrom.names);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03003278 PyObject *names;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003279 static PyObject *empty_string;
Benjamin Peterson78565b22009-06-28 19:19:51 +00003280
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003281 if (!empty_string) {
3282 empty_string = PyUnicode_FromString("");
3283 if (!empty_string)
3284 return 0;
3285 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003286
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03003287 ADDOP_LOAD_CONST_NEW(c, PyLong_FromLong(s->v.ImportFrom.level));
Serhiy Storchakaa95d9862018-03-24 22:42:35 +02003288
3289 names = PyTuple_New(n);
3290 if (!names)
3291 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003292
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003293 /* build up the names */
3294 for (i = 0; i < n; i++) {
3295 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);
3296 Py_INCREF(alias->name);
3297 PyTuple_SET_ITEM(names, i, alias->name);
3298 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003299
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003300 if (s->lineno > c->c_future->ff_lineno && s->v.ImportFrom.module &&
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02003301 _PyUnicode_EqualToASCIIString(s->v.ImportFrom.module, "__future__")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003302 Py_DECREF(names);
3303 return compiler_error(c, "from __future__ imports must occur "
3304 "at the beginning of the file");
3305 }
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03003306 ADDOP_LOAD_CONST_NEW(c, names);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003307
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003308 if (s->v.ImportFrom.module) {
3309 ADDOP_NAME(c, IMPORT_NAME, s->v.ImportFrom.module, names);
3310 }
3311 else {
3312 ADDOP_NAME(c, IMPORT_NAME, empty_string, names);
3313 }
3314 for (i = 0; i < n; i++) {
3315 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);
3316 identifier store_name;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003317
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003318 if (i == 0 && PyUnicode_READ_CHAR(alias->name, 0) == '*') {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003319 assert(n == 1);
3320 ADDOP(c, IMPORT_STAR);
3321 return 1;
3322 }
3323
3324 ADDOP_NAME(c, IMPORT_FROM, alias->name, names);
3325 store_name = alias->name;
3326 if (alias->asname)
3327 store_name = alias->asname;
3328
3329 if (!compiler_nameop(c, store_name, Store)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003330 return 0;
3331 }
3332 }
3333 /* remove imported module */
3334 ADDOP(c, POP_TOP);
3335 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003336}
3337
3338static int
3339compiler_assert(struct compiler *c, stmt_ty s)
3340{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003341 basicblock *end;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003342
Georg Brandl8334fd92010-12-04 10:26:46 +00003343 if (c->c_optimize)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003344 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003345 if (s->v.Assert.test->kind == Tuple_kind &&
Serhiy Storchakad31e7732018-10-21 10:09:39 +03003346 asdl_seq_LEN(s->v.Assert.test->v.Tuple.elts) > 0)
3347 {
3348 if (!compiler_warn(c, "assertion is always true, "
3349 "perhaps remove parentheses?"))
3350 {
Victor Stinner14e461d2013-08-26 22:28:21 +02003351 return 0;
3352 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003353 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003354 end = compiler_new_block(c);
3355 if (end == NULL)
3356 return 0;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03003357 if (!compiler_jump_if(c, s->v.Assert.test, end, 1))
3358 return 0;
Zackery Spytzce6a0702019-08-25 03:44:09 -06003359 ADDOP(c, LOAD_ASSERTION_ERROR);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003360 if (s->v.Assert.msg) {
3361 VISIT(c, expr, s->v.Assert.msg);
3362 ADDOP_I(c, CALL_FUNCTION, 1);
3363 }
3364 ADDOP_I(c, RAISE_VARARGS, 1);
3365 compiler_use_next_block(c, end);
3366 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003367}
3368
3369static int
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01003370compiler_visit_stmt_expr(struct compiler *c, expr_ty value)
3371{
3372 if (c->c_interactive && c->c_nestlevel <= 1) {
3373 VISIT(c, expr, value);
3374 ADDOP(c, PRINT_EXPR);
3375 return 1;
3376 }
3377
Serhiy Storchaka3f228112018-09-27 17:42:37 +03003378 if (value->kind == Constant_kind) {
Victor Stinner15a30952016-02-08 22:45:06 +01003379 /* ignore constant statement */
Mark Shannon877df852020-11-12 09:43:29 +00003380 ADDOP(c, NOP);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01003381 return 1;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01003382 }
3383
3384 VISIT(c, expr, value);
3385 ADDOP(c, POP_TOP);
3386 return 1;
3387}
3388
3389static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003390compiler_visit_stmt(struct compiler *c, stmt_ty s)
3391{
Victor Stinnerad9a0662013-11-19 22:23:20 +01003392 Py_ssize_t i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003393
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003394 /* Always assign a lineno to the next instruction for a stmt. */
Serhiy Storchaka61cb3d02020-03-17 18:07:30 +02003395 SET_LOC(c, s);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003396
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003397 switch (s->kind) {
3398 case FunctionDef_kind:
Yury Selivanov75445082015-05-11 22:57:16 -04003399 return compiler_function(c, s, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003400 case ClassDef_kind:
3401 return compiler_class(c, s);
3402 case Return_kind:
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003403 return compiler_return(c, s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003404 case Delete_kind:
3405 VISIT_SEQ(c, expr, s->v.Delete.targets)
3406 break;
3407 case Assign_kind:
3408 n = asdl_seq_LEN(s->v.Assign.targets);
3409 VISIT(c, expr, s->v.Assign.value);
3410 for (i = 0; i < n; i++) {
3411 if (i < n - 1)
3412 ADDOP(c, DUP_TOP);
3413 VISIT(c, expr,
3414 (expr_ty)asdl_seq_GET(s->v.Assign.targets, i));
3415 }
3416 break;
3417 case AugAssign_kind:
3418 return compiler_augassign(c, s);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003419 case AnnAssign_kind:
3420 return compiler_annassign(c, s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003421 case For_kind:
3422 return compiler_for(c, s);
3423 case While_kind:
3424 return compiler_while(c, s);
3425 case If_kind:
3426 return compiler_if(c, s);
3427 case Raise_kind:
3428 n = 0;
3429 if (s->v.Raise.exc) {
3430 VISIT(c, expr, s->v.Raise.exc);
3431 n++;
Victor Stinnerad9a0662013-11-19 22:23:20 +01003432 if (s->v.Raise.cause) {
3433 VISIT(c, expr, s->v.Raise.cause);
3434 n++;
3435 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003436 }
Victor Stinnerad9a0662013-11-19 22:23:20 +01003437 ADDOP_I(c, RAISE_VARARGS, (int)n);
Mark Shannon266b4622020-11-17 19:30:14 +00003438 NEXT_BLOCK(c);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003439 break;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003440 case Try_kind:
3441 return compiler_try(c, s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003442 case Assert_kind:
3443 return compiler_assert(c, s);
3444 case Import_kind:
3445 return compiler_import(c, s);
3446 case ImportFrom_kind:
3447 return compiler_from_import(c, s);
3448 case Global_kind:
3449 case Nonlocal_kind:
3450 break;
3451 case Expr_kind:
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01003452 return compiler_visit_stmt_expr(c, s->v.Expr.value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003453 case Pass_kind:
Mark Shannon877df852020-11-12 09:43:29 +00003454 ADDOP(c, NOP);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003455 break;
3456 case Break_kind:
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003457 return compiler_break(c);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003458 case Continue_kind:
3459 return compiler_continue(c);
3460 case With_kind:
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003461 return compiler_with(c, s, 0);
Yury Selivanov75445082015-05-11 22:57:16 -04003462 case AsyncFunctionDef_kind:
3463 return compiler_function(c, s, 1);
3464 case AsyncWith_kind:
3465 return compiler_async_with(c, s, 0);
3466 case AsyncFor_kind:
3467 return compiler_async_for(c, s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003468 }
Yury Selivanov75445082015-05-11 22:57:16 -04003469
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003470 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003471}
3472
3473static int
3474unaryop(unaryop_ty op)
3475{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003476 switch (op) {
3477 case Invert:
3478 return UNARY_INVERT;
3479 case Not:
3480 return UNARY_NOT;
3481 case UAdd:
3482 return UNARY_POSITIVE;
3483 case USub:
3484 return UNARY_NEGATIVE;
3485 default:
3486 PyErr_Format(PyExc_SystemError,
3487 "unary op %d should not be possible", op);
3488 return 0;
3489 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003490}
3491
3492static int
Andy Lester76d58772020-03-10 21:18:12 -05003493binop(operator_ty op)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003494{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003495 switch (op) {
3496 case Add:
3497 return BINARY_ADD;
3498 case Sub:
3499 return BINARY_SUBTRACT;
3500 case Mult:
3501 return BINARY_MULTIPLY;
Benjamin Petersond51374e2014-04-09 23:55:56 -04003502 case MatMult:
3503 return BINARY_MATRIX_MULTIPLY;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003504 case Div:
3505 return BINARY_TRUE_DIVIDE;
3506 case Mod:
3507 return BINARY_MODULO;
3508 case Pow:
3509 return BINARY_POWER;
3510 case LShift:
3511 return BINARY_LSHIFT;
3512 case RShift:
3513 return BINARY_RSHIFT;
3514 case BitOr:
3515 return BINARY_OR;
3516 case BitXor:
3517 return BINARY_XOR;
3518 case BitAnd:
3519 return BINARY_AND;
3520 case FloorDiv:
3521 return BINARY_FLOOR_DIVIDE;
3522 default:
3523 PyErr_Format(PyExc_SystemError,
3524 "binary op %d should not be possible", op);
3525 return 0;
3526 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003527}
3528
3529static int
Andy Lester76d58772020-03-10 21:18:12 -05003530inplace_binop(operator_ty op)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003531{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003532 switch (op) {
3533 case Add:
3534 return INPLACE_ADD;
3535 case Sub:
3536 return INPLACE_SUBTRACT;
3537 case Mult:
3538 return INPLACE_MULTIPLY;
Benjamin Petersond51374e2014-04-09 23:55:56 -04003539 case MatMult:
3540 return INPLACE_MATRIX_MULTIPLY;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003541 case Div:
3542 return INPLACE_TRUE_DIVIDE;
3543 case Mod:
3544 return INPLACE_MODULO;
3545 case Pow:
3546 return INPLACE_POWER;
3547 case LShift:
3548 return INPLACE_LSHIFT;
3549 case RShift:
3550 return INPLACE_RSHIFT;
3551 case BitOr:
3552 return INPLACE_OR;
3553 case BitXor:
3554 return INPLACE_XOR;
3555 case BitAnd:
3556 return INPLACE_AND;
3557 case FloorDiv:
3558 return INPLACE_FLOOR_DIVIDE;
3559 default:
3560 PyErr_Format(PyExc_SystemError,
3561 "inplace binary op %d should not be possible", op);
3562 return 0;
3563 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003564}
3565
3566static int
3567compiler_nameop(struct compiler *c, identifier name, expr_context_ty ctx)
3568{
Victor Stinnerad9a0662013-11-19 22:23:20 +01003569 int op, scope;
3570 Py_ssize_t arg;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003571 enum { OP_FAST, OP_GLOBAL, OP_DEREF, OP_NAME } optype;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003572
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003573 PyObject *dict = c->u->u_names;
3574 PyObject *mangled;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003575
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02003576 assert(!_PyUnicode_EqualToASCIIString(name, "None") &&
3577 !_PyUnicode_EqualToASCIIString(name, "True") &&
3578 !_PyUnicode_EqualToASCIIString(name, "False"));
Benjamin Peterson70b224d2012-12-06 17:49:58 -05003579
Pablo Galindoc5fc1562020-04-22 23:29:27 +01003580 if (forbidden_name(c, name, ctx))
3581 return 0;
3582
Serhiy Storchakabd6ec4d2017-12-18 14:29:12 +02003583 mangled = _Py_Mangle(c->u->u_private, name);
3584 if (!mangled)
3585 return 0;
3586
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003587 op = 0;
3588 optype = OP_NAME;
3589 scope = PyST_GetScope(c->u->u_ste, mangled);
3590 switch (scope) {
3591 case FREE:
3592 dict = c->u->u_freevars;
3593 optype = OP_DEREF;
3594 break;
3595 case CELL:
3596 dict = c->u->u_cellvars;
3597 optype = OP_DEREF;
3598 break;
3599 case LOCAL:
3600 if (c->u->u_ste->ste_type == FunctionBlock)
3601 optype = OP_FAST;
3602 break;
3603 case GLOBAL_IMPLICIT:
Benjamin Peterson1dfd2472015-04-27 21:44:22 -04003604 if (c->u->u_ste->ste_type == FunctionBlock)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003605 optype = OP_GLOBAL;
3606 break;
3607 case GLOBAL_EXPLICIT:
3608 optype = OP_GLOBAL;
3609 break;
3610 default:
3611 /* scope can be 0 */
3612 break;
3613 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003614
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003615 /* XXX Leave assert here, but handle __doc__ and the like better */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003616 assert(scope || PyUnicode_READ_CHAR(name, 0) == '_');
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003617
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003618 switch (optype) {
3619 case OP_DEREF:
3620 switch (ctx) {
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04003621 case Load:
3622 op = (c->u->u_ste->ste_type == ClassBlock) ? LOAD_CLASSDEREF : LOAD_DEREF;
3623 break;
Serhiy Storchaka6b975982020-03-17 23:41:08 +02003624 case Store: op = STORE_DEREF; break;
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00003625 case Del: op = DELETE_DEREF; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003626 }
3627 break;
3628 case OP_FAST:
3629 switch (ctx) {
3630 case Load: op = LOAD_FAST; break;
Serhiy Storchaka6b975982020-03-17 23:41:08 +02003631 case Store: op = STORE_FAST; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003632 case Del: op = DELETE_FAST; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003633 }
Serhiy Storchakaaa8e51f2018-04-01 00:29:37 +03003634 ADDOP_N(c, op, mangled, varnames);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003635 return 1;
3636 case OP_GLOBAL:
3637 switch (ctx) {
3638 case Load: op = LOAD_GLOBAL; break;
Serhiy Storchaka6b975982020-03-17 23:41:08 +02003639 case Store: op = STORE_GLOBAL; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003640 case Del: op = DELETE_GLOBAL; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003641 }
3642 break;
3643 case OP_NAME:
3644 switch (ctx) {
Benjamin Peterson20f9c3c2010-07-20 22:39:34 +00003645 case Load: op = LOAD_NAME; break;
Serhiy Storchaka6b975982020-03-17 23:41:08 +02003646 case Store: op = STORE_NAME; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003647 case Del: op = DELETE_NAME; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003648 }
3649 break;
3650 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003651
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003652 assert(op);
Andy Lester76d58772020-03-10 21:18:12 -05003653 arg = compiler_add_o(dict, mangled);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003654 Py_DECREF(mangled);
3655 if (arg < 0)
3656 return 0;
3657 return compiler_addop_i(c, op, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003658}
3659
3660static int
3661compiler_boolop(struct compiler *c, expr_ty e)
3662{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003663 basicblock *end;
Victor Stinnerad9a0662013-11-19 22:23:20 +01003664 int jumpi;
3665 Py_ssize_t i, n;
Pablo Galindoa5634c42020-09-16 19:42:00 +01003666 asdl_expr_seq *s;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003667
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003668 assert(e->kind == BoolOp_kind);
3669 if (e->v.BoolOp.op == And)
3670 jumpi = JUMP_IF_FALSE_OR_POP;
3671 else
3672 jumpi = JUMP_IF_TRUE_OR_POP;
3673 end = compiler_new_block(c);
3674 if (end == NULL)
3675 return 0;
3676 s = e->v.BoolOp.values;
3677 n = asdl_seq_LEN(s) - 1;
3678 assert(n >= 0);
3679 for (i = 0; i < n; ++i) {
3680 VISIT(c, expr, (expr_ty)asdl_seq_GET(s, i));
Mark Shannon582aaf12020-08-04 17:30:11 +01003681 ADDOP_JUMP(c, jumpi, end);
Mark Shannon6e8128f2020-07-30 10:03:00 +01003682 basicblock *next = compiler_new_block(c);
3683 if (next == NULL) {
3684 return 0;
3685 }
3686 compiler_use_next_block(c, next);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003687 }
3688 VISIT(c, expr, (expr_ty)asdl_seq_GET(s, n));
3689 compiler_use_next_block(c, end);
3690 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003691}
3692
3693static int
Pablo Galindoa5634c42020-09-16 19:42:00 +01003694starunpack_helper(struct compiler *c, asdl_expr_seq *elts, int pushed,
Mark Shannon13bc1392020-01-23 09:25:17 +00003695 int build, int add, int extend, int tuple)
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003696{
3697 Py_ssize_t n = asdl_seq_LEN(elts);
Mark Shannon13bc1392020-01-23 09:25:17 +00003698 Py_ssize_t i, seen_star = 0;
Brandt Bucher6dd9b642019-11-25 22:16:53 -08003699 if (n > 2 && are_all_items_const(elts, 0, n)) {
3700 PyObject *folded = PyTuple_New(n);
3701 if (folded == NULL) {
3702 return 0;
3703 }
3704 PyObject *val;
3705 for (i = 0; i < n; i++) {
3706 val = ((expr_ty)asdl_seq_GET(elts, i))->v.Constant.value;
3707 Py_INCREF(val);
3708 PyTuple_SET_ITEM(folded, i, val);
3709 }
Mark Shannon13bc1392020-01-23 09:25:17 +00003710 if (tuple) {
3711 ADDOP_LOAD_CONST_NEW(c, folded);
3712 } else {
3713 if (add == SET_ADD) {
3714 Py_SETREF(folded, PyFrozenSet_New(folded));
3715 if (folded == NULL) {
3716 return 0;
3717 }
Brandt Bucher6dd9b642019-11-25 22:16:53 -08003718 }
Mark Shannon13bc1392020-01-23 09:25:17 +00003719 ADDOP_I(c, build, pushed);
3720 ADDOP_LOAD_CONST_NEW(c, folded);
3721 ADDOP_I(c, extend, 1);
Brandt Bucher6dd9b642019-11-25 22:16:53 -08003722 }
Brandt Bucher6dd9b642019-11-25 22:16:53 -08003723 return 1;
3724 }
Mark Shannon13bc1392020-01-23 09:25:17 +00003725
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003726 for (i = 0; i < n; i++) {
3727 expr_ty elt = asdl_seq_GET(elts, i);
3728 if (elt->kind == Starred_kind) {
Mark Shannon13bc1392020-01-23 09:25:17 +00003729 seen_star = 1;
3730 }
3731 }
3732 if (seen_star) {
3733 seen_star = 0;
3734 for (i = 0; i < n; i++) {
3735 expr_ty elt = asdl_seq_GET(elts, i);
3736 if (elt->kind == Starred_kind) {
3737 if (seen_star == 0) {
3738 ADDOP_I(c, build, i+pushed);
3739 seen_star = 1;
3740 }
3741 VISIT(c, expr, elt->v.Starred.value);
3742 ADDOP_I(c, extend, 1);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003743 }
Mark Shannon13bc1392020-01-23 09:25:17 +00003744 else {
3745 VISIT(c, expr, elt);
3746 if (seen_star) {
3747 ADDOP_I(c, add, 1);
3748 }
3749 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003750 }
Mark Shannon13bc1392020-01-23 09:25:17 +00003751 assert(seen_star);
3752 if (tuple) {
3753 ADDOP(c, LIST_TO_TUPLE);
3754 }
3755 }
3756 else {
3757 for (i = 0; i < n; i++) {
3758 expr_ty elt = asdl_seq_GET(elts, i);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003759 VISIT(c, expr, elt);
Mark Shannon13bc1392020-01-23 09:25:17 +00003760 }
3761 if (tuple) {
3762 ADDOP_I(c, BUILD_TUPLE, n+pushed);
3763 } else {
3764 ADDOP_I(c, build, n+pushed);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003765 }
3766 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003767 return 1;
3768}
3769
3770static int
Pablo Galindoa5634c42020-09-16 19:42:00 +01003771assignment_helper(struct compiler *c, asdl_expr_seq *elts)
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003772{
3773 Py_ssize_t n = asdl_seq_LEN(elts);
3774 Py_ssize_t i;
3775 int seen_star = 0;
3776 for (i = 0; i < n; i++) {
3777 expr_ty elt = asdl_seq_GET(elts, i);
3778 if (elt->kind == Starred_kind && !seen_star) {
3779 if ((i >= (1 << 8)) ||
3780 (n-i-1 >= (INT_MAX >> 8)))
3781 return compiler_error(c,
3782 "too many expressions in "
3783 "star-unpacking assignment");
3784 ADDOP_I(c, UNPACK_EX, (i + ((n-i-1) << 8)));
3785 seen_star = 1;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003786 }
3787 else if (elt->kind == Starred_kind) {
3788 return compiler_error(c,
Furkan Öndercb6534e2020-03-26 04:54:31 +03003789 "multiple starred expressions in assignment");
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003790 }
3791 }
3792 if (!seen_star) {
3793 ADDOP_I(c, UNPACK_SEQUENCE, n);
3794 }
Brandt Bucherd5aa2e92020-03-07 19:44:18 -08003795 for (i = 0; i < n; i++) {
3796 expr_ty elt = asdl_seq_GET(elts, i);
3797 VISIT(c, expr, elt->kind != Starred_kind ? elt : elt->v.Starred.value);
3798 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003799 return 1;
3800}
3801
3802static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003803compiler_list(struct compiler *c, expr_ty e)
3804{
Pablo Galindoa5634c42020-09-16 19:42:00 +01003805 asdl_expr_seq *elts = e->v.List.elts;
Serhiy Storchakad8b3a982019-03-05 20:42:06 +02003806 if (e->v.List.ctx == Store) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003807 return assignment_helper(c, elts);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003808 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003809 else if (e->v.List.ctx == Load) {
Mark Shannon13bc1392020-01-23 09:25:17 +00003810 return starunpack_helper(c, elts, 0, BUILD_LIST,
3811 LIST_APPEND, LIST_EXTEND, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003812 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003813 else
3814 VISIT_SEQ(c, expr, elts);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003815 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003816}
3817
3818static int
3819compiler_tuple(struct compiler *c, expr_ty e)
3820{
Pablo Galindoa5634c42020-09-16 19:42:00 +01003821 asdl_expr_seq *elts = e->v.Tuple.elts;
Serhiy Storchakad8b3a982019-03-05 20:42:06 +02003822 if (e->v.Tuple.ctx == Store) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003823 return assignment_helper(c, elts);
3824 }
3825 else if (e->v.Tuple.ctx == Load) {
Mark Shannon13bc1392020-01-23 09:25:17 +00003826 return starunpack_helper(c, elts, 0, BUILD_LIST,
3827 LIST_APPEND, LIST_EXTEND, 1);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003828 }
3829 else
3830 VISIT_SEQ(c, expr, elts);
3831 return 1;
3832}
3833
3834static int
3835compiler_set(struct compiler *c, expr_ty e)
3836{
Mark Shannon13bc1392020-01-23 09:25:17 +00003837 return starunpack_helper(c, e->v.Set.elts, 0, BUILD_SET,
3838 SET_ADD, SET_UPDATE, 0);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003839}
3840
3841static int
Pablo Galindoa5634c42020-09-16 19:42:00 +01003842are_all_items_const(asdl_expr_seq *seq, Py_ssize_t begin, Py_ssize_t end)
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003843{
3844 Py_ssize_t i;
3845 for (i = begin; i < end; i++) {
3846 expr_ty key = (expr_ty)asdl_seq_GET(seq, i);
Serhiy Storchaka3f228112018-09-27 17:42:37 +03003847 if (key == NULL || key->kind != Constant_kind)
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003848 return 0;
3849 }
3850 return 1;
3851}
3852
3853static int
3854compiler_subdict(struct compiler *c, expr_ty e, Py_ssize_t begin, Py_ssize_t end)
3855{
3856 Py_ssize_t i, n = end - begin;
3857 PyObject *keys, *key;
3858 if (n > 1 && are_all_items_const(e->v.Dict.keys, begin, end)) {
3859 for (i = begin; i < end; i++) {
3860 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Dict.values, i));
3861 }
3862 keys = PyTuple_New(n);
3863 if (keys == NULL) {
3864 return 0;
3865 }
3866 for (i = begin; i < end; i++) {
Serhiy Storchaka3f228112018-09-27 17:42:37 +03003867 key = ((expr_ty)asdl_seq_GET(e->v.Dict.keys, i))->v.Constant.value;
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003868 Py_INCREF(key);
3869 PyTuple_SET_ITEM(keys, i - begin, key);
3870 }
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03003871 ADDOP_LOAD_CONST_NEW(c, keys);
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003872 ADDOP_I(c, BUILD_CONST_KEY_MAP, n);
3873 }
3874 else {
3875 for (i = begin; i < end; i++) {
3876 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Dict.keys, i));
3877 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Dict.values, i));
3878 }
3879 ADDOP_I(c, BUILD_MAP, n);
3880 }
3881 return 1;
3882}
3883
3884static int
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003885compiler_dict(struct compiler *c, expr_ty e)
3886{
Victor Stinner976bb402016-03-23 11:36:19 +01003887 Py_ssize_t i, n, elements;
Mark Shannon8a4cd702020-01-27 09:57:45 +00003888 int have_dict;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003889 int is_unpacking = 0;
3890 n = asdl_seq_LEN(e->v.Dict.values);
Mark Shannon8a4cd702020-01-27 09:57:45 +00003891 have_dict = 0;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003892 elements = 0;
3893 for (i = 0; i < n; i++) {
3894 is_unpacking = (expr_ty)asdl_seq_GET(e->v.Dict.keys, i) == NULL;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003895 if (is_unpacking) {
Mark Shannon8a4cd702020-01-27 09:57:45 +00003896 if (elements) {
3897 if (!compiler_subdict(c, e, i - elements, i)) {
3898 return 0;
3899 }
3900 if (have_dict) {
3901 ADDOP_I(c, DICT_UPDATE, 1);
3902 }
3903 have_dict = 1;
3904 elements = 0;
3905 }
3906 if (have_dict == 0) {
3907 ADDOP_I(c, BUILD_MAP, 0);
3908 have_dict = 1;
3909 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003910 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Dict.values, i));
Mark Shannon8a4cd702020-01-27 09:57:45 +00003911 ADDOP_I(c, DICT_UPDATE, 1);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003912 }
3913 else {
Mark Shannon8a4cd702020-01-27 09:57:45 +00003914 if (elements == 0xFFFF) {
Pablo Galindoc51db0e2020-08-13 09:48:41 +01003915 if (!compiler_subdict(c, e, i - elements, i + 1)) {
Mark Shannon8a4cd702020-01-27 09:57:45 +00003916 return 0;
3917 }
3918 if (have_dict) {
3919 ADDOP_I(c, DICT_UPDATE, 1);
3920 }
3921 have_dict = 1;
3922 elements = 0;
3923 }
3924 else {
3925 elements++;
3926 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003927 }
3928 }
Mark Shannon8a4cd702020-01-27 09:57:45 +00003929 if (elements) {
3930 if (!compiler_subdict(c, e, n - elements, n)) {
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003931 return 0;
Mark Shannon8a4cd702020-01-27 09:57:45 +00003932 }
3933 if (have_dict) {
3934 ADDOP_I(c, DICT_UPDATE, 1);
3935 }
3936 have_dict = 1;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003937 }
Mark Shannon8a4cd702020-01-27 09:57:45 +00003938 if (!have_dict) {
3939 ADDOP_I(c, BUILD_MAP, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003940 }
3941 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003942}
3943
3944static int
3945compiler_compare(struct compiler *c, expr_ty e)
3946{
Victor Stinnerad9a0662013-11-19 22:23:20 +01003947 Py_ssize_t i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003948
Serhiy Storchaka3bcbedc2019-01-18 07:47:48 +02003949 if (!check_compare(c, e)) {
3950 return 0;
3951 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003952 VISIT(c, expr, e->v.Compare.left);
Serhiy Storchaka02b9ef22017-12-30 09:47:42 +02003953 assert(asdl_seq_LEN(e->v.Compare.ops) > 0);
3954 n = asdl_seq_LEN(e->v.Compare.ops) - 1;
3955 if (n == 0) {
3956 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, 0));
Mark Shannon9af0e472020-01-14 10:12:45 +00003957 ADDOP_COMPARE(c, asdl_seq_GET(e->v.Compare.ops, 0));
Serhiy Storchaka02b9ef22017-12-30 09:47:42 +02003958 }
3959 else {
3960 basicblock *cleanup = compiler_new_block(c);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003961 if (cleanup == NULL)
3962 return 0;
Serhiy Storchaka02b9ef22017-12-30 09:47:42 +02003963 for (i = 0; i < n; i++) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003964 VISIT(c, expr,
3965 (expr_ty)asdl_seq_GET(e->v.Compare.comparators, i));
Serhiy Storchaka02b9ef22017-12-30 09:47:42 +02003966 ADDOP(c, DUP_TOP);
3967 ADDOP(c, ROT_THREE);
Mark Shannon9af0e472020-01-14 10:12:45 +00003968 ADDOP_COMPARE(c, asdl_seq_GET(e->v.Compare.ops, i));
Mark Shannon582aaf12020-08-04 17:30:11 +01003969 ADDOP_JUMP(c, JUMP_IF_FALSE_OR_POP, cleanup);
Serhiy Storchaka02b9ef22017-12-30 09:47:42 +02003970 NEXT_BLOCK(c);
3971 }
3972 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, n));
Mark Shannon9af0e472020-01-14 10:12:45 +00003973 ADDOP_COMPARE(c, asdl_seq_GET(e->v.Compare.ops, n));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003974 basicblock *end = compiler_new_block(c);
3975 if (end == NULL)
3976 return 0;
Mark Shannon582aaf12020-08-04 17:30:11 +01003977 ADDOP_JUMP(c, JUMP_FORWARD, end);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003978 compiler_use_next_block(c, cleanup);
3979 ADDOP(c, ROT_TWO);
3980 ADDOP(c, POP_TOP);
3981 compiler_use_next_block(c, end);
3982 }
3983 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003984}
3985
Serhiy Storchaka62e44812019-02-16 08:12:19 +02003986static PyTypeObject *
3987infer_type(expr_ty e)
3988{
3989 switch (e->kind) {
3990 case Tuple_kind:
3991 return &PyTuple_Type;
3992 case List_kind:
3993 case ListComp_kind:
3994 return &PyList_Type;
3995 case Dict_kind:
3996 case DictComp_kind:
3997 return &PyDict_Type;
3998 case Set_kind:
3999 case SetComp_kind:
4000 return &PySet_Type;
4001 case GeneratorExp_kind:
4002 return &PyGen_Type;
4003 case Lambda_kind:
4004 return &PyFunction_Type;
4005 case JoinedStr_kind:
4006 case FormattedValue_kind:
4007 return &PyUnicode_Type;
4008 case Constant_kind:
Victor Stinnera102ed72020-02-07 02:24:48 +01004009 return Py_TYPE(e->v.Constant.value);
Serhiy Storchaka62e44812019-02-16 08:12:19 +02004010 default:
4011 return NULL;
4012 }
4013}
4014
4015static int
4016check_caller(struct compiler *c, expr_ty e)
4017{
4018 switch (e->kind) {
4019 case Constant_kind:
4020 case Tuple_kind:
4021 case List_kind:
4022 case ListComp_kind:
4023 case Dict_kind:
4024 case DictComp_kind:
4025 case Set_kind:
4026 case SetComp_kind:
4027 case GeneratorExp_kind:
4028 case JoinedStr_kind:
4029 case FormattedValue_kind:
4030 return compiler_warn(c, "'%.200s' object is not callable; "
4031 "perhaps you missed a comma?",
4032 infer_type(e)->tp_name);
4033 default:
4034 return 1;
4035 }
4036}
4037
4038static int
4039check_subscripter(struct compiler *c, expr_ty e)
4040{
4041 PyObject *v;
4042
4043 switch (e->kind) {
4044 case Constant_kind:
4045 v = e->v.Constant.value;
4046 if (!(v == Py_None || v == Py_Ellipsis ||
4047 PyLong_Check(v) || PyFloat_Check(v) || PyComplex_Check(v) ||
4048 PyAnySet_Check(v)))
4049 {
4050 return 1;
4051 }
4052 /* fall through */
4053 case Set_kind:
4054 case SetComp_kind:
4055 case GeneratorExp_kind:
4056 case Lambda_kind:
4057 return compiler_warn(c, "'%.200s' object is not subscriptable; "
4058 "perhaps you missed a comma?",
4059 infer_type(e)->tp_name);
4060 default:
4061 return 1;
4062 }
4063}
4064
4065static int
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02004066check_index(struct compiler *c, expr_ty e, expr_ty s)
Serhiy Storchaka62e44812019-02-16 08:12:19 +02004067{
4068 PyObject *v;
4069
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02004070 PyTypeObject *index_type = infer_type(s);
Serhiy Storchaka62e44812019-02-16 08:12:19 +02004071 if (index_type == NULL
4072 || PyType_FastSubclass(index_type, Py_TPFLAGS_LONG_SUBCLASS)
4073 || index_type == &PySlice_Type) {
4074 return 1;
4075 }
4076
4077 switch (e->kind) {
4078 case Constant_kind:
4079 v = e->v.Constant.value;
4080 if (!(PyUnicode_Check(v) || PyBytes_Check(v) || PyTuple_Check(v))) {
4081 return 1;
4082 }
4083 /* fall through */
4084 case Tuple_kind:
4085 case List_kind:
4086 case ListComp_kind:
4087 case JoinedStr_kind:
4088 case FormattedValue_kind:
4089 return compiler_warn(c, "%.200s indices must be integers or slices, "
4090 "not %.200s; "
4091 "perhaps you missed a comma?",
4092 infer_type(e)->tp_name,
4093 index_type->tp_name);
4094 default:
4095 return 1;
4096 }
4097}
4098
Zackery Spytz97f5de02019-03-22 01:30:32 -06004099// Return 1 if the method call was optimized, -1 if not, and 0 on error.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004100static int
Yury Selivanovf2392132016-12-13 19:03:51 -05004101maybe_optimize_method_call(struct compiler *c, expr_ty e)
4102{
4103 Py_ssize_t argsl, i;
4104 expr_ty meth = e->v.Call.func;
Pablo Galindoa5634c42020-09-16 19:42:00 +01004105 asdl_expr_seq *args = e->v.Call.args;
Yury Selivanovf2392132016-12-13 19:03:51 -05004106
4107 /* Check that the call node is an attribute access, and that
4108 the call doesn't have keyword parameters. */
4109 if (meth->kind != Attribute_kind || meth->v.Attribute.ctx != Load ||
4110 asdl_seq_LEN(e->v.Call.keywords))
4111 return -1;
4112
4113 /* Check that there are no *varargs types of arguments. */
4114 argsl = asdl_seq_LEN(args);
4115 for (i = 0; i < argsl; i++) {
4116 expr_ty elt = asdl_seq_GET(args, i);
4117 if (elt->kind == Starred_kind) {
4118 return -1;
4119 }
4120 }
4121
4122 /* Alright, we can optimize the code. */
4123 VISIT(c, expr, meth->v.Attribute.value);
4124 ADDOP_NAME(c, LOAD_METHOD, meth->v.Attribute.attr, names);
4125 VISIT_SEQ(c, expr, e->v.Call.args);
4126 ADDOP_I(c, CALL_METHOD, asdl_seq_LEN(e->v.Call.args));
4127 return 1;
4128}
4129
4130static int
Pablo Galindoa5634c42020-09-16 19:42:00 +01004131validate_keywords(struct compiler *c, asdl_keyword_seq *keywords)
Zackery Spytz08050e92020-04-06 00:47:47 -06004132{
4133 Py_ssize_t nkeywords = asdl_seq_LEN(keywords);
4134 for (Py_ssize_t i = 0; i < nkeywords; i++) {
Pablo Galindo254ec782020-04-03 20:37:13 +01004135 keyword_ty key = ((keyword_ty)asdl_seq_GET(keywords, i));
4136 if (key->arg == NULL) {
4137 continue;
4138 }
Pablo Galindoc5fc1562020-04-22 23:29:27 +01004139 if (forbidden_name(c, key->arg, Store)) {
4140 return -1;
4141 }
Zackery Spytz08050e92020-04-06 00:47:47 -06004142 for (Py_ssize_t j = i + 1; j < nkeywords; j++) {
Pablo Galindo254ec782020-04-03 20:37:13 +01004143 keyword_ty other = ((keyword_ty)asdl_seq_GET(keywords, j));
4144 if (other->arg && !PyUnicode_Compare(key->arg, other->arg)) {
4145 PyObject *msg = PyUnicode_FromFormat("keyword argument repeated: %U", key->arg);
4146 if (msg == NULL) {
4147 return -1;
4148 }
4149 c->u->u_col_offset = other->col_offset;
4150 compiler_error(c, PyUnicode_AsUTF8(msg));
4151 Py_DECREF(msg);
4152 return -1;
4153 }
4154 }
4155 }
4156 return 0;
4157}
4158
4159static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004160compiler_call(struct compiler *c, expr_ty e)
4161{
Zackery Spytz97f5de02019-03-22 01:30:32 -06004162 int ret = maybe_optimize_method_call(c, e);
4163 if (ret >= 0) {
4164 return ret;
4165 }
Serhiy Storchaka62e44812019-02-16 08:12:19 +02004166 if (!check_caller(c, e->v.Call.func)) {
4167 return 0;
4168 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004169 VISIT(c, expr, e->v.Call.func);
4170 return compiler_call_helper(c, 0,
4171 e->v.Call.args,
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004172 e->v.Call.keywords);
Guido van Rossum52cc1d82007-03-18 15:41:51 +00004173}
4174
Eric V. Smith235a6f02015-09-19 14:51:32 -04004175static int
4176compiler_joined_str(struct compiler *c, expr_ty e)
4177{
Eric V. Smith235a6f02015-09-19 14:51:32 -04004178 VISIT_SEQ(c, expr, e->v.JoinedStr.values);
Serhiy Storchaka4cc30ae2016-12-11 19:37:19 +02004179 if (asdl_seq_LEN(e->v.JoinedStr.values) != 1)
4180 ADDOP_I(c, BUILD_STRING, asdl_seq_LEN(e->v.JoinedStr.values));
Eric V. Smith235a6f02015-09-19 14:51:32 -04004181 return 1;
4182}
4183
Eric V. Smitha78c7952015-11-03 12:45:05 -05004184/* Used to implement f-strings. Format a single value. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04004185static int
4186compiler_formatted_value(struct compiler *c, expr_ty e)
4187{
Eric V. Smitha78c7952015-11-03 12:45:05 -05004188 /* Our oparg encodes 2 pieces of information: the conversion
4189 character, and whether or not a format_spec was provided.
Eric V. Smith235a6f02015-09-19 14:51:32 -04004190
Eric V. Smith9a4135e2019-05-08 16:28:48 -04004191 Convert the conversion char to 3 bits:
4192 : 000 0x0 FVC_NONE The default if nothing specified.
Eric V. Smitha78c7952015-11-03 12:45:05 -05004193 !s : 001 0x1 FVC_STR
4194 !r : 010 0x2 FVC_REPR
4195 !a : 011 0x3 FVC_ASCII
Eric V. Smith235a6f02015-09-19 14:51:32 -04004196
Eric V. Smitha78c7952015-11-03 12:45:05 -05004197 next bit is whether or not we have a format spec:
4198 yes : 100 0x4
4199 no : 000 0x0
4200 */
Eric V. Smith235a6f02015-09-19 14:51:32 -04004201
Eric V. Smith9a4135e2019-05-08 16:28:48 -04004202 int conversion = e->v.FormattedValue.conversion;
Eric V. Smitha78c7952015-11-03 12:45:05 -05004203 int oparg;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004204
Eric V. Smith9a4135e2019-05-08 16:28:48 -04004205 /* The expression to be formatted. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04004206 VISIT(c, expr, e->v.FormattedValue.value);
4207
Eric V. Smith9a4135e2019-05-08 16:28:48 -04004208 switch (conversion) {
Eric V. Smitha78c7952015-11-03 12:45:05 -05004209 case 's': oparg = FVC_STR; break;
4210 case 'r': oparg = FVC_REPR; break;
4211 case 'a': oparg = FVC_ASCII; break;
4212 case -1: oparg = FVC_NONE; break;
4213 default:
Eric V. Smith9a4135e2019-05-08 16:28:48 -04004214 PyErr_Format(PyExc_SystemError,
4215 "Unrecognized conversion character %d", conversion);
Eric V. Smitha78c7952015-11-03 12:45:05 -05004216 return 0;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004217 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04004218 if (e->v.FormattedValue.format_spec) {
Eric V. Smitha78c7952015-11-03 12:45:05 -05004219 /* Evaluate the format spec, and update our opcode arg. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04004220 VISIT(c, expr, e->v.FormattedValue.format_spec);
Eric V. Smitha78c7952015-11-03 12:45:05 -05004221 oparg |= FVS_HAVE_SPEC;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004222 }
4223
Eric V. Smitha78c7952015-11-03 12:45:05 -05004224 /* And push our opcode and oparg */
4225 ADDOP_I(c, FORMAT_VALUE, oparg);
Eric V. Smith9a4135e2019-05-08 16:28:48 -04004226
Eric V. Smith235a6f02015-09-19 14:51:32 -04004227 return 1;
4228}
4229
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03004230static int
Pablo Galindoa5634c42020-09-16 19:42:00 +01004231compiler_subkwargs(struct compiler *c, asdl_keyword_seq *keywords, Py_ssize_t begin, Py_ssize_t end)
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03004232{
4233 Py_ssize_t i, n = end - begin;
4234 keyword_ty kw;
4235 PyObject *keys, *key;
4236 assert(n > 0);
4237 if (n > 1) {
4238 for (i = begin; i < end; i++) {
4239 kw = asdl_seq_GET(keywords, i);
4240 VISIT(c, expr, kw->value);
4241 }
4242 keys = PyTuple_New(n);
4243 if (keys == NULL) {
4244 return 0;
4245 }
4246 for (i = begin; i < end; i++) {
4247 key = ((keyword_ty) asdl_seq_GET(keywords, i))->arg;
4248 Py_INCREF(key);
4249 PyTuple_SET_ITEM(keys, i - begin, key);
4250 }
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03004251 ADDOP_LOAD_CONST_NEW(c, keys);
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03004252 ADDOP_I(c, BUILD_CONST_KEY_MAP, n);
4253 }
4254 else {
4255 /* a for loop only executes once */
4256 for (i = begin; i < end; i++) {
4257 kw = asdl_seq_GET(keywords, i);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03004258 ADDOP_LOAD_CONST(c, kw->arg);
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03004259 VISIT(c, expr, kw->value);
4260 }
4261 ADDOP_I(c, BUILD_MAP, n);
4262 }
4263 return 1;
4264}
4265
Guido van Rossum52cc1d82007-03-18 15:41:51 +00004266/* shared code between compiler_call and compiler_class */
4267static int
4268compiler_call_helper(struct compiler *c,
Victor Stinner976bb402016-03-23 11:36:19 +01004269 int n, /* Args already pushed */
Pablo Galindoa5634c42020-09-16 19:42:00 +01004270 asdl_expr_seq *args,
4271 asdl_keyword_seq *keywords)
Guido van Rossum52cc1d82007-03-18 15:41:51 +00004272{
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004273 Py_ssize_t i, nseen, nelts, nkwelts;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004274
Pablo Galindo254ec782020-04-03 20:37:13 +01004275 if (validate_keywords(c, keywords) == -1) {
4276 return 0;
4277 }
4278
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004279 nelts = asdl_seq_LEN(args);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004280 nkwelts = asdl_seq_LEN(keywords);
4281
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004282 for (i = 0; i < nelts; i++) {
4283 expr_ty elt = asdl_seq_GET(args, i);
4284 if (elt->kind == Starred_kind) {
Mark Shannon13bc1392020-01-23 09:25:17 +00004285 goto ex_call;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004286 }
Mark Shannon13bc1392020-01-23 09:25:17 +00004287 }
4288 for (i = 0; i < nkwelts; i++) {
4289 keyword_ty kw = asdl_seq_GET(keywords, i);
4290 if (kw->arg == NULL) {
4291 goto ex_call;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004292 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004293 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004294
Mark Shannon13bc1392020-01-23 09:25:17 +00004295 /* No * or ** args, so can use faster calling sequence */
4296 for (i = 0; i < nelts; i++) {
4297 expr_ty elt = asdl_seq_GET(args, i);
4298 assert(elt->kind != Starred_kind);
4299 VISIT(c, expr, elt);
4300 }
4301 if (nkwelts) {
4302 PyObject *names;
4303 VISIT_SEQ(c, keyword, keywords);
4304 names = PyTuple_New(nkwelts);
4305 if (names == NULL) {
4306 return 0;
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004307 }
Mark Shannon13bc1392020-01-23 09:25:17 +00004308 for (i = 0; i < nkwelts; i++) {
4309 keyword_ty kw = asdl_seq_GET(keywords, i);
4310 Py_INCREF(kw->arg);
4311 PyTuple_SET_ITEM(names, i, kw->arg);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004312 }
Mark Shannon13bc1392020-01-23 09:25:17 +00004313 ADDOP_LOAD_CONST_NEW(c, names);
4314 ADDOP_I(c, CALL_FUNCTION_KW, n + nelts + nkwelts);
4315 return 1;
4316 }
4317 else {
4318 ADDOP_I(c, CALL_FUNCTION, n + nelts);
4319 return 1;
4320 }
4321
4322ex_call:
4323
4324 /* Do positional arguments. */
4325 if (n ==0 && nelts == 1 && ((expr_ty)asdl_seq_GET(args, 0))->kind == Starred_kind) {
4326 VISIT(c, expr, ((expr_ty)asdl_seq_GET(args, 0))->v.Starred.value);
4327 }
4328 else if (starunpack_helper(c, args, n, BUILD_LIST,
4329 LIST_APPEND, LIST_EXTEND, 1) == 0) {
4330 return 0;
4331 }
4332 /* Then keyword arguments */
4333 if (nkwelts) {
Mark Shannon8a4cd702020-01-27 09:57:45 +00004334 /* Has a new dict been pushed */
4335 int have_dict = 0;
Mark Shannon13bc1392020-01-23 09:25:17 +00004336
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004337 nseen = 0; /* the number of keyword arguments on the stack following */
4338 for (i = 0; i < nkwelts; i++) {
4339 keyword_ty kw = asdl_seq_GET(keywords, i);
4340 if (kw->arg == NULL) {
4341 /* A keyword argument unpacking. */
4342 if (nseen) {
Mark Shannon8a4cd702020-01-27 09:57:45 +00004343 if (!compiler_subkwargs(c, keywords, i - nseen, i)) {
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03004344 return 0;
Mark Shannon8a4cd702020-01-27 09:57:45 +00004345 }
Mark Shannondb64f122020-06-01 10:42:42 +01004346 if (have_dict) {
4347 ADDOP_I(c, DICT_MERGE, 1);
4348 }
Mark Shannon8a4cd702020-01-27 09:57:45 +00004349 have_dict = 1;
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004350 nseen = 0;
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03004351 }
Mark Shannon8a4cd702020-01-27 09:57:45 +00004352 if (!have_dict) {
4353 ADDOP_I(c, BUILD_MAP, 0);
4354 have_dict = 1;
4355 }
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004356 VISIT(c, expr, kw->value);
Mark Shannon8a4cd702020-01-27 09:57:45 +00004357 ADDOP_I(c, DICT_MERGE, 1);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004358 }
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004359 else {
4360 nseen++;
4361 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004362 }
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004363 if (nseen) {
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03004364 /* Pack up any trailing keyword arguments. */
Mark Shannon8a4cd702020-01-27 09:57:45 +00004365 if (!compiler_subkwargs(c, keywords, nkwelts - nseen, nkwelts)) {
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03004366 return 0;
Mark Shannon8a4cd702020-01-27 09:57:45 +00004367 }
4368 if (have_dict) {
4369 ADDOP_I(c, DICT_MERGE, 1);
4370 }
4371 have_dict = 1;
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03004372 }
Mark Shannon8a4cd702020-01-27 09:57:45 +00004373 assert(have_dict);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004374 }
Mark Shannon13bc1392020-01-23 09:25:17 +00004375 ADDOP_I(c, CALL_FUNCTION_EX, nkwelts > 0);
4376 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004377}
4378
Nick Coghlan650f0d02007-04-15 12:05:43 +00004379
4380/* List and set comprehensions and generator expressions work by creating a
4381 nested function to perform the actual iteration. This means that the
4382 iteration variables don't leak into the current scope.
4383 The defined function is called immediately following its definition, with the
4384 result of that call being the result of the expression.
4385 The LC/SC version returns the populated container, while the GE version is
4386 flagged in symtable.c as a generator, so it returns the generator object
4387 when the function is called.
Nick Coghlan650f0d02007-04-15 12:05:43 +00004388
4389 Possible cleanups:
4390 - iterate over the generator sequence instead of using recursion
4391*/
4392
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004393
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004394static int
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004395compiler_comprehension_generator(struct compiler *c,
Pablo Galindoa5634c42020-09-16 19:42:00 +01004396 asdl_comprehension_seq *generators, int gen_index,
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004397 int depth,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004398 expr_ty elt, expr_ty val, int type)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004399{
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004400 comprehension_ty gen;
4401 gen = (comprehension_ty)asdl_seq_GET(generators, gen_index);
4402 if (gen->is_async) {
4403 return compiler_async_comprehension_generator(
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004404 c, generators, gen_index, depth, elt, val, type);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004405 } else {
4406 return compiler_sync_comprehension_generator(
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004407 c, generators, gen_index, depth, elt, val, type);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004408 }
4409}
4410
4411static int
4412compiler_sync_comprehension_generator(struct compiler *c,
Pablo Galindoa5634c42020-09-16 19:42:00 +01004413 asdl_comprehension_seq *generators, int gen_index,
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004414 int depth,
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004415 expr_ty elt, expr_ty val, int type)
4416{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004417 /* generate code for the iterator, then each of the ifs,
4418 and then write to the element */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004419
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004420 comprehension_ty gen;
4421 basicblock *start, *anchor, *skip, *if_cleanup;
Victor Stinnerad9a0662013-11-19 22:23:20 +01004422 Py_ssize_t i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004423
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004424 start = compiler_new_block(c);
4425 skip = compiler_new_block(c);
4426 if_cleanup = compiler_new_block(c);
4427 anchor = compiler_new_block(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004428
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004429 if (start == NULL || skip == NULL || if_cleanup == NULL ||
4430 anchor == NULL)
4431 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004432
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004433 gen = (comprehension_ty)asdl_seq_GET(generators, gen_index);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004434
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004435 if (gen_index == 0) {
4436 /* Receive outermost iter as an implicit argument */
4437 c->u->u_argcount = 1;
4438 ADDOP_I(c, LOAD_FAST, 0);
4439 }
4440 else {
4441 /* Sub-iter - calculate on the fly */
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004442 /* Fast path for the temporary variable assignment idiom:
4443 for y in [f(x)]
4444 */
Pablo Galindoa5634c42020-09-16 19:42:00 +01004445 asdl_expr_seq *elts;
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004446 switch (gen->iter->kind) {
4447 case List_kind:
4448 elts = gen->iter->v.List.elts;
4449 break;
4450 case Tuple_kind:
4451 elts = gen->iter->v.Tuple.elts;
4452 break;
4453 default:
4454 elts = NULL;
4455 }
4456 if (asdl_seq_LEN(elts) == 1) {
4457 expr_ty elt = asdl_seq_GET(elts, 0);
4458 if (elt->kind != Starred_kind) {
4459 VISIT(c, expr, elt);
4460 start = NULL;
4461 }
4462 }
4463 if (start) {
4464 VISIT(c, expr, gen->iter);
4465 ADDOP(c, GET_ITER);
4466 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004467 }
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004468 if (start) {
4469 depth++;
4470 compiler_use_next_block(c, start);
Mark Shannon582aaf12020-08-04 17:30:11 +01004471 ADDOP_JUMP(c, FOR_ITER, anchor);
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004472 NEXT_BLOCK(c);
4473 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004474 VISIT(c, expr, gen->target);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004475
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004476 /* XXX this needs to be cleaned up...a lot! */
4477 n = asdl_seq_LEN(gen->ifs);
4478 for (i = 0; i < n; i++) {
4479 expr_ty e = (expr_ty)asdl_seq_GET(gen->ifs, i);
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03004480 if (!compiler_jump_if(c, e, if_cleanup, 0))
4481 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004482 NEXT_BLOCK(c);
4483 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004484
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004485 if (++gen_index < asdl_seq_LEN(generators))
4486 if (!compiler_comprehension_generator(c,
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004487 generators, gen_index, depth,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004488 elt, val, type))
4489 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004490
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004491 /* only append after the last for generator */
4492 if (gen_index >= asdl_seq_LEN(generators)) {
4493 /* comprehension specific code */
4494 switch (type) {
4495 case COMP_GENEXP:
4496 VISIT(c, expr, elt);
4497 ADDOP(c, YIELD_VALUE);
4498 ADDOP(c, POP_TOP);
4499 break;
4500 case COMP_LISTCOMP:
4501 VISIT(c, expr, elt);
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004502 ADDOP_I(c, LIST_APPEND, depth + 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004503 break;
4504 case COMP_SETCOMP:
4505 VISIT(c, expr, elt);
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004506 ADDOP_I(c, SET_ADD, depth + 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004507 break;
4508 case COMP_DICTCOMP:
Jörn Heisslerc8a35412019-06-22 16:40:55 +02004509 /* With '{k: v}', k is evaluated before v, so we do
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004510 the same. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004511 VISIT(c, expr, elt);
Jörn Heisslerc8a35412019-06-22 16:40:55 +02004512 VISIT(c, expr, val);
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004513 ADDOP_I(c, MAP_ADD, depth + 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004514 break;
4515 default:
4516 return 0;
4517 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004518
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004519 compiler_use_next_block(c, skip);
4520 }
4521 compiler_use_next_block(c, if_cleanup);
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004522 if (start) {
Mark Shannon582aaf12020-08-04 17:30:11 +01004523 ADDOP_JUMP(c, JUMP_ABSOLUTE, start);
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004524 compiler_use_next_block(c, anchor);
4525 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004526
4527 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004528}
4529
4530static int
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004531compiler_async_comprehension_generator(struct compiler *c,
Pablo Galindoa5634c42020-09-16 19:42:00 +01004532 asdl_comprehension_seq *generators, int gen_index,
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004533 int depth,
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004534 expr_ty elt, expr_ty val, int type)
4535{
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004536 comprehension_ty gen;
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02004537 basicblock *start, *if_cleanup, *except;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004538 Py_ssize_t i, n;
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02004539 start = compiler_new_block(c);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004540 except = compiler_new_block(c);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004541 if_cleanup = compiler_new_block(c);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004542
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02004543 if (start == NULL || if_cleanup == NULL || except == NULL) {
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004544 return 0;
4545 }
4546
4547 gen = (comprehension_ty)asdl_seq_GET(generators, gen_index);
4548
4549 if (gen_index == 0) {
4550 /* Receive outermost iter as an implicit argument */
4551 c->u->u_argcount = 1;
4552 ADDOP_I(c, LOAD_FAST, 0);
4553 }
4554 else {
4555 /* Sub-iter - calculate on the fly */
4556 VISIT(c, expr, gen->iter);
4557 ADDOP(c, GET_AITER);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004558 }
4559
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02004560 compiler_use_next_block(c, start);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004561
Mark Shannon582aaf12020-08-04 17:30:11 +01004562 ADDOP_JUMP(c, SETUP_FINALLY, except);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004563 ADDOP(c, GET_ANEXT);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03004564 ADDOP_LOAD_CONST(c, Py_None);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004565 ADDOP(c, YIELD_FROM);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004566 ADDOP(c, POP_BLOCK);
Serhiy Storchaka24d32012018-03-10 18:22:34 +02004567 VISIT(c, expr, gen->target);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004568
4569 n = asdl_seq_LEN(gen->ifs);
4570 for (i = 0; i < n; i++) {
4571 expr_ty e = (expr_ty)asdl_seq_GET(gen->ifs, i);
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03004572 if (!compiler_jump_if(c, e, if_cleanup, 0))
4573 return 0;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004574 NEXT_BLOCK(c);
4575 }
4576
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004577 depth++;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004578 if (++gen_index < asdl_seq_LEN(generators))
4579 if (!compiler_comprehension_generator(c,
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004580 generators, gen_index, depth,
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004581 elt, val, type))
4582 return 0;
4583
4584 /* only append after the last for generator */
4585 if (gen_index >= asdl_seq_LEN(generators)) {
4586 /* comprehension specific code */
4587 switch (type) {
4588 case COMP_GENEXP:
4589 VISIT(c, expr, elt);
4590 ADDOP(c, YIELD_VALUE);
4591 ADDOP(c, POP_TOP);
4592 break;
4593 case COMP_LISTCOMP:
4594 VISIT(c, expr, elt);
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004595 ADDOP_I(c, LIST_APPEND, depth + 1);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004596 break;
4597 case COMP_SETCOMP:
4598 VISIT(c, expr, elt);
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004599 ADDOP_I(c, SET_ADD, depth + 1);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004600 break;
4601 case COMP_DICTCOMP:
Jörn Heisslerc8a35412019-06-22 16:40:55 +02004602 /* With '{k: v}', k is evaluated before v, so we do
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004603 the same. */
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004604 VISIT(c, expr, elt);
Jörn Heisslerc8a35412019-06-22 16:40:55 +02004605 VISIT(c, expr, val);
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004606 ADDOP_I(c, MAP_ADD, depth + 1);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004607 break;
4608 default:
4609 return 0;
4610 }
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004611 }
4612 compiler_use_next_block(c, if_cleanup);
Mark Shannon582aaf12020-08-04 17:30:11 +01004613 ADDOP_JUMP(c, JUMP_ABSOLUTE, start);
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02004614
4615 compiler_use_next_block(c, except);
4616 ADDOP(c, END_ASYNC_FOR);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004617
4618 return 1;
4619}
4620
4621static int
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004622compiler_comprehension(struct compiler *c, expr_ty e, int type,
Pablo Galindoa5634c42020-09-16 19:42:00 +01004623 identifier name, asdl_comprehension_seq *generators, expr_ty elt,
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004624 expr_ty val)
Nick Coghlan650f0d02007-04-15 12:05:43 +00004625{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004626 PyCodeObject *co = NULL;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004627 comprehension_ty outermost;
Antoine Pitrou86a36b52011-11-25 18:56:07 +01004628 PyObject *qualname = NULL;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004629 int is_async_generator = 0;
Matthias Bussonnierbd461742020-07-06 14:26:52 -07004630 int top_level_await = IS_TOP_LEVEL_AWAIT(c);
Nick Coghlan650f0d02007-04-15 12:05:43 +00004631
Matthias Bussonnierbd461742020-07-06 14:26:52 -07004632
Batuhan TaÅŸkaya9052f7a2020-03-19 14:35:44 +03004633 int is_async_function = c->u->u_ste->ste_coroutine;
Nick Coghlan650f0d02007-04-15 12:05:43 +00004634
Batuhan TaÅŸkaya9052f7a2020-03-19 14:35:44 +03004635 outermost = (comprehension_ty) asdl_seq_GET(generators, 0);
Antoine Pitrou86a36b52011-11-25 18:56:07 +01004636 if (!compiler_enter_scope(c, name, COMPILER_SCOPE_COMPREHENSION,
4637 (void *)e, e->lineno))
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004638 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004639 goto error;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004640 }
4641
4642 is_async_generator = c->u->u_ste->ste_coroutine;
4643
Matthias Bussonnierbd461742020-07-06 14:26:52 -07004644 if (is_async_generator && !is_async_function && type != COMP_GENEXP && !top_level_await) {
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004645 compiler_error(c, "asynchronous comprehension outside of "
4646 "an asynchronous function");
4647 goto error_in_scope;
4648 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00004649
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004650 if (type != COMP_GENEXP) {
4651 int op;
4652 switch (type) {
4653 case COMP_LISTCOMP:
4654 op = BUILD_LIST;
4655 break;
4656 case COMP_SETCOMP:
4657 op = BUILD_SET;
4658 break;
4659 case COMP_DICTCOMP:
4660 op = BUILD_MAP;
4661 break;
4662 default:
4663 PyErr_Format(PyExc_SystemError,
4664 "unknown comprehension type %d", type);
4665 goto error_in_scope;
4666 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00004667
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004668 ADDOP_I(c, op, 0);
4669 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00004670
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004671 if (!compiler_comprehension_generator(c, generators, 0, 0, elt,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004672 val, type))
4673 goto error_in_scope;
Nick Coghlan650f0d02007-04-15 12:05:43 +00004674
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004675 if (type != COMP_GENEXP) {
4676 ADDOP(c, RETURN_VALUE);
4677 }
4678
4679 co = assemble(c, 1);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04004680 qualname = c->u->u_qualname;
4681 Py_INCREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004682 compiler_exit_scope(c);
Matthias Bussonnierbd461742020-07-06 14:26:52 -07004683 if (top_level_await && is_async_generator){
4684 c->u->u_ste->ste_coroutine = 1;
4685 }
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04004686 if (co == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004687 goto error;
4688
Antoine Pitrou86a36b52011-11-25 18:56:07 +01004689 if (!compiler_make_closure(c, co, 0, qualname))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004690 goto error;
Antoine Pitrou86a36b52011-11-25 18:56:07 +01004691 Py_DECREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004692 Py_DECREF(co);
4693
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004694 VISIT(c, expr, outermost->iter);
4695
4696 if (outermost->is_async) {
4697 ADDOP(c, GET_AITER);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004698 } else {
4699 ADDOP(c, GET_ITER);
4700 }
4701
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004702 ADDOP_I(c, CALL_FUNCTION, 1);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004703
4704 if (is_async_generator && type != COMP_GENEXP) {
4705 ADDOP(c, GET_AWAITABLE);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03004706 ADDOP_LOAD_CONST(c, Py_None);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004707 ADDOP(c, YIELD_FROM);
4708 }
4709
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004710 return 1;
Nick Coghlan650f0d02007-04-15 12:05:43 +00004711error_in_scope:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004712 compiler_exit_scope(c);
Nick Coghlan650f0d02007-04-15 12:05:43 +00004713error:
Antoine Pitrou86a36b52011-11-25 18:56:07 +01004714 Py_XDECREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004715 Py_XDECREF(co);
4716 return 0;
Nick Coghlan650f0d02007-04-15 12:05:43 +00004717}
4718
4719static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004720compiler_genexp(struct compiler *c, expr_ty e)
4721{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004722 static identifier name;
4723 if (!name) {
Zackery Spytzf3036392018-04-15 16:12:29 -06004724 name = PyUnicode_InternFromString("<genexpr>");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004725 if (!name)
4726 return 0;
4727 }
4728 assert(e->kind == GeneratorExp_kind);
4729 return compiler_comprehension(c, e, COMP_GENEXP, name,
4730 e->v.GeneratorExp.generators,
4731 e->v.GeneratorExp.elt, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004732}
4733
4734static int
Nick Coghlan650f0d02007-04-15 12:05:43 +00004735compiler_listcomp(struct compiler *c, expr_ty e)
4736{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004737 static identifier name;
4738 if (!name) {
Zackery Spytzf3036392018-04-15 16:12:29 -06004739 name = PyUnicode_InternFromString("<listcomp>");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004740 if (!name)
4741 return 0;
4742 }
4743 assert(e->kind == ListComp_kind);
4744 return compiler_comprehension(c, e, COMP_LISTCOMP, name,
4745 e->v.ListComp.generators,
4746 e->v.ListComp.elt, NULL);
Nick Coghlan650f0d02007-04-15 12:05:43 +00004747}
4748
4749static int
4750compiler_setcomp(struct compiler *c, expr_ty e)
4751{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004752 static identifier name;
4753 if (!name) {
Zackery Spytzf3036392018-04-15 16:12:29 -06004754 name = PyUnicode_InternFromString("<setcomp>");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004755 if (!name)
4756 return 0;
4757 }
4758 assert(e->kind == SetComp_kind);
4759 return compiler_comprehension(c, e, COMP_SETCOMP, name,
4760 e->v.SetComp.generators,
4761 e->v.SetComp.elt, NULL);
Guido van Rossum992d4a32007-07-11 13:09:30 +00004762}
4763
4764
4765static int
4766compiler_dictcomp(struct compiler *c, expr_ty e)
4767{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004768 static identifier name;
4769 if (!name) {
Zackery Spytzf3036392018-04-15 16:12:29 -06004770 name = PyUnicode_InternFromString("<dictcomp>");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004771 if (!name)
4772 return 0;
4773 }
4774 assert(e->kind == DictComp_kind);
4775 return compiler_comprehension(c, e, COMP_DICTCOMP, name,
4776 e->v.DictComp.generators,
4777 e->v.DictComp.key, e->v.DictComp.value);
Nick Coghlan650f0d02007-04-15 12:05:43 +00004778}
4779
4780
4781static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004782compiler_visit_keyword(struct compiler *c, keyword_ty k)
4783{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004784 VISIT(c, expr, k->value);
4785 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004786}
4787
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004788/* Test whether expression is constant. For constants, report
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004789 whether they are true or false.
4790
4791 Return values: 1 for true, 0 for false, -1 for non-constant.
4792 */
4793
4794static int
Serhiy Storchaka3dfbaf52017-12-25 12:47:50 +02004795expr_constant(expr_ty e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004796{
Serhiy Storchaka3f228112018-09-27 17:42:37 +03004797 if (e->kind == Constant_kind) {
4798 return PyObject_IsTrue(e->v.Constant.value);
Benjamin Peterson442f2092012-12-06 17:41:04 -05004799 }
Serhiy Storchaka3325a672017-12-15 12:35:48 +02004800 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004801}
4802
Mark Shannonfee55262019-11-21 09:11:43 +00004803static int
4804compiler_with_except_finish(struct compiler *c) {
4805 basicblock *exit;
4806 exit = compiler_new_block(c);
4807 if (exit == NULL)
4808 return 0;
Mark Shannon582aaf12020-08-04 17:30:11 +01004809 ADDOP_JUMP(c, POP_JUMP_IF_TRUE, exit);
Mark Shannon266b4622020-11-17 19:30:14 +00004810 NEXT_BLOCK(c);
Mark Shannonfee55262019-11-21 09:11:43 +00004811 ADDOP(c, RERAISE);
4812 compiler_use_next_block(c, exit);
4813 ADDOP(c, POP_TOP);
4814 ADDOP(c, POP_TOP);
4815 ADDOP(c, POP_TOP);
4816 ADDOP(c, POP_EXCEPT);
4817 ADDOP(c, POP_TOP);
4818 return 1;
4819}
Yury Selivanov75445082015-05-11 22:57:16 -04004820
4821/*
4822 Implements the async with statement.
4823
4824 The semantics outlined in that PEP are as follows:
4825
4826 async with EXPR as VAR:
4827 BLOCK
4828
4829 It is implemented roughly as:
4830
4831 context = EXPR
4832 exit = context.__aexit__ # not calling it
4833 value = await context.__aenter__()
4834 try:
4835 VAR = value # if VAR present in the syntax
4836 BLOCK
4837 finally:
4838 if an exception was raised:
Serhiy Storchakaec466a12015-06-11 00:09:32 +03004839 exc = copy of (exception, instance, traceback)
Yury Selivanov75445082015-05-11 22:57:16 -04004840 else:
Serhiy Storchakaec466a12015-06-11 00:09:32 +03004841 exc = (None, None, None)
Yury Selivanov75445082015-05-11 22:57:16 -04004842 if not (await exit(*exc)):
4843 raise
4844 */
4845static int
4846compiler_async_with(struct compiler *c, stmt_ty s, int pos)
4847{
Mark Shannonfee55262019-11-21 09:11:43 +00004848 basicblock *block, *final, *exit;
Yury Selivanov75445082015-05-11 22:57:16 -04004849 withitem_ty item = asdl_seq_GET(s->v.AsyncWith.items, pos);
4850
4851 assert(s->kind == AsyncWith_kind);
Pablo Galindo90235812020-03-15 04:29:22 +00004852 if (IS_TOP_LEVEL_AWAIT(c)){
Matthias Bussonnier565b4f12019-05-21 13:12:03 -07004853 c->u->u_ste->ste_coroutine = 1;
4854 } else if (c->u->u_scope_type != COMPILER_SCOPE_ASYNC_FUNCTION){
Zsolt Dollensteine2396502018-04-27 08:58:56 -07004855 return compiler_error(c, "'async with' outside async function");
4856 }
Yury Selivanov75445082015-05-11 22:57:16 -04004857
4858 block = compiler_new_block(c);
Mark Shannonfee55262019-11-21 09:11:43 +00004859 final = compiler_new_block(c);
4860 exit = compiler_new_block(c);
4861 if (!block || !final || !exit)
Yury Selivanov75445082015-05-11 22:57:16 -04004862 return 0;
4863
4864 /* Evaluate EXPR */
4865 VISIT(c, expr, item->context_expr);
4866
4867 ADDOP(c, BEFORE_ASYNC_WITH);
4868 ADDOP(c, GET_AWAITABLE);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03004869 ADDOP_LOAD_CONST(c, Py_None);
Yury Selivanov75445082015-05-11 22:57:16 -04004870 ADDOP(c, YIELD_FROM);
4871
Mark Shannon582aaf12020-08-04 17:30:11 +01004872 ADDOP_JUMP(c, SETUP_ASYNC_WITH, final);
Yury Selivanov75445082015-05-11 22:57:16 -04004873
4874 /* SETUP_ASYNC_WITH pushes a finally block. */
4875 compiler_use_next_block(c, block);
Mark Shannonfee55262019-11-21 09:11:43 +00004876 if (!compiler_push_fblock(c, ASYNC_WITH, block, final, NULL)) {
Yury Selivanov75445082015-05-11 22:57:16 -04004877 return 0;
4878 }
4879
4880 if (item->optional_vars) {
4881 VISIT(c, expr, item->optional_vars);
4882 }
4883 else {
4884 /* Discard result from context.__aenter__() */
4885 ADDOP(c, POP_TOP);
4886 }
4887
4888 pos++;
4889 if (pos == asdl_seq_LEN(s->v.AsyncWith.items))
4890 /* BLOCK code */
4891 VISIT_SEQ(c, stmt, s->v.AsyncWith.body)
4892 else if (!compiler_async_with(c, s, pos))
4893 return 0;
4894
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004895 compiler_pop_fblock(c, ASYNC_WITH, block);
Mark Shannonfee55262019-11-21 09:11:43 +00004896 ADDOP(c, POP_BLOCK);
4897 /* End of body; start the cleanup */
Yury Selivanov75445082015-05-11 22:57:16 -04004898
Mark Shannonfee55262019-11-21 09:11:43 +00004899 /* For successful outcome:
4900 * call __exit__(None, None, None)
4901 */
4902 if(!compiler_call_exit_with_nones(c))
Yury Selivanov75445082015-05-11 22:57:16 -04004903 return 0;
Mark Shannonfee55262019-11-21 09:11:43 +00004904 ADDOP(c, GET_AWAITABLE);
4905 ADDOP_O(c, LOAD_CONST, Py_None, consts);
4906 ADDOP(c, YIELD_FROM);
Yury Selivanov75445082015-05-11 22:57:16 -04004907
Mark Shannonfee55262019-11-21 09:11:43 +00004908 ADDOP(c, POP_TOP);
Yury Selivanov75445082015-05-11 22:57:16 -04004909
Mark Shannon582aaf12020-08-04 17:30:11 +01004910 ADDOP_JUMP(c, JUMP_ABSOLUTE, exit);
Mark Shannonfee55262019-11-21 09:11:43 +00004911
4912 /* For exceptional outcome: */
4913 compiler_use_next_block(c, final);
4914
4915 ADDOP(c, WITH_EXCEPT_START);
Yury Selivanov75445082015-05-11 22:57:16 -04004916 ADDOP(c, GET_AWAITABLE);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03004917 ADDOP_LOAD_CONST(c, Py_None);
Yury Selivanov75445082015-05-11 22:57:16 -04004918 ADDOP(c, YIELD_FROM);
Mark Shannonfee55262019-11-21 09:11:43 +00004919 compiler_with_except_finish(c);
Yury Selivanov75445082015-05-11 22:57:16 -04004920
Mark Shannonfee55262019-11-21 09:11:43 +00004921compiler_use_next_block(c, exit);
Yury Selivanov75445082015-05-11 22:57:16 -04004922 return 1;
4923}
4924
4925
Guido van Rossumc2e20742006-02-27 22:32:47 +00004926/*
4927 Implements the with statement from PEP 343.
Guido van Rossumc2e20742006-02-27 22:32:47 +00004928 with EXPR as VAR:
4929 BLOCK
Mark Shannonfee55262019-11-21 09:11:43 +00004930 is implemented as:
4931 <code for EXPR>
4932 SETUP_WITH E
4933 <code to store to VAR> or POP_TOP
4934 <code for BLOCK>
4935 LOAD_CONST (None, None, None)
4936 CALL_FUNCTION_EX 0
4937 JUMP_FORWARD EXIT
4938 E: WITH_EXCEPT_START (calls EXPR.__exit__)
4939 POP_JUMP_IF_TRUE T:
4940 RERAISE
4941 T: POP_TOP * 3 (remove exception from stack)
4942 POP_EXCEPT
4943 POP_TOP
4944 EXIT:
Guido van Rossumc2e20742006-02-27 22:32:47 +00004945 */
Mark Shannonfee55262019-11-21 09:11:43 +00004946
Guido van Rossumc2e20742006-02-27 22:32:47 +00004947static int
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004948compiler_with(struct compiler *c, stmt_ty s, int pos)
Guido van Rossumc2e20742006-02-27 22:32:47 +00004949{
Mark Shannonfee55262019-11-21 09:11:43 +00004950 basicblock *block, *final, *exit;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004951 withitem_ty item = asdl_seq_GET(s->v.With.items, pos);
Guido van Rossumc2e20742006-02-27 22:32:47 +00004952
4953 assert(s->kind == With_kind);
4954
Guido van Rossumc2e20742006-02-27 22:32:47 +00004955 block = compiler_new_block(c);
Mark Shannonfee55262019-11-21 09:11:43 +00004956 final = compiler_new_block(c);
4957 exit = compiler_new_block(c);
4958 if (!block || !final || !exit)
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00004959 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00004960
Thomas Wouters477c8d52006-05-27 19:21:47 +00004961 /* Evaluate EXPR */
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004962 VISIT(c, expr, item->context_expr);
Mark Shannonfee55262019-11-21 09:11:43 +00004963 /* Will push bound __exit__ */
Mark Shannon582aaf12020-08-04 17:30:11 +01004964 ADDOP_JUMP(c, SETUP_WITH, final);
Guido van Rossumc2e20742006-02-27 22:32:47 +00004965
Benjamin Peterson876b2f22009-06-28 03:18:59 +00004966 /* SETUP_WITH pushes a finally block. */
Guido van Rossumc2e20742006-02-27 22:32:47 +00004967 compiler_use_next_block(c, block);
Mark Shannonfee55262019-11-21 09:11:43 +00004968 if (!compiler_push_fblock(c, WITH, block, final, NULL)) {
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00004969 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00004970 }
4971
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004972 if (item->optional_vars) {
4973 VISIT(c, expr, item->optional_vars);
Benjamin Peterson876b2f22009-06-28 03:18:59 +00004974 }
4975 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004976 /* Discard result from context.__enter__() */
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00004977 ADDOP(c, POP_TOP);
Guido van Rossumc2e20742006-02-27 22:32:47 +00004978 }
4979
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004980 pos++;
4981 if (pos == asdl_seq_LEN(s->v.With.items))
4982 /* BLOCK code */
4983 VISIT_SEQ(c, stmt, s->v.With.body)
4984 else if (!compiler_with(c, s, pos))
4985 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00004986
Guido van Rossumc2e20742006-02-27 22:32:47 +00004987 ADDOP(c, POP_BLOCK);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004988 compiler_pop_fblock(c, WITH, block);
Mark Shannon13bc1392020-01-23 09:25:17 +00004989
Mark Shannonfee55262019-11-21 09:11:43 +00004990 /* End of body; start the cleanup. */
Mark Shannon13bc1392020-01-23 09:25:17 +00004991
Mark Shannonfee55262019-11-21 09:11:43 +00004992 /* For successful outcome:
4993 * call __exit__(None, None, None)
4994 */
4995 if (!compiler_call_exit_with_nones(c))
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00004996 return 0;
Mark Shannonfee55262019-11-21 09:11:43 +00004997 ADDOP(c, POP_TOP);
Mark Shannon582aaf12020-08-04 17:30:11 +01004998 ADDOP_JUMP(c, JUMP_FORWARD, exit);
Guido van Rossumc2e20742006-02-27 22:32:47 +00004999
Mark Shannonfee55262019-11-21 09:11:43 +00005000 /* For exceptional outcome: */
5001 compiler_use_next_block(c, final);
Guido van Rossumc2e20742006-02-27 22:32:47 +00005002
Mark Shannonfee55262019-11-21 09:11:43 +00005003 ADDOP(c, WITH_EXCEPT_START);
5004 compiler_with_except_finish(c);
5005
5006 compiler_use_next_block(c, exit);
Guido van Rossumc2e20742006-02-27 22:32:47 +00005007 return 1;
5008}
5009
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005010static int
Serhiy Storchakada8d72c2018-09-17 15:17:29 +03005011compiler_visit_expr1(struct compiler *c, expr_ty e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005012{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005013 switch (e->kind) {
Emily Morehouse8f59ee02019-01-24 16:49:56 -07005014 case NamedExpr_kind:
5015 VISIT(c, expr, e->v.NamedExpr.value);
5016 ADDOP(c, DUP_TOP);
5017 VISIT(c, expr, e->v.NamedExpr.target);
5018 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005019 case BoolOp_kind:
5020 return compiler_boolop(c, e);
5021 case BinOp_kind:
5022 VISIT(c, expr, e->v.BinOp.left);
5023 VISIT(c, expr, e->v.BinOp.right);
Andy Lester76d58772020-03-10 21:18:12 -05005024 ADDOP(c, binop(e->v.BinOp.op));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005025 break;
5026 case UnaryOp_kind:
5027 VISIT(c, expr, e->v.UnaryOp.operand);
5028 ADDOP(c, unaryop(e->v.UnaryOp.op));
5029 break;
5030 case Lambda_kind:
5031 return compiler_lambda(c, e);
5032 case IfExp_kind:
5033 return compiler_ifexp(c, e);
5034 case Dict_kind:
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04005035 return compiler_dict(c, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005036 case Set_kind:
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04005037 return compiler_set(c, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005038 case GeneratorExp_kind:
5039 return compiler_genexp(c, e);
5040 case ListComp_kind:
5041 return compiler_listcomp(c, e);
5042 case SetComp_kind:
5043 return compiler_setcomp(c, e);
5044 case DictComp_kind:
5045 return compiler_dictcomp(c, e);
5046 case Yield_kind:
5047 if (c->u->u_ste->ste_type != FunctionBlock)
5048 return compiler_error(c, "'yield' outside function");
Mark Dickinsonded35ae2012-11-25 14:36:26 +00005049 if (e->v.Yield.value) {
5050 VISIT(c, expr, e->v.Yield.value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005051 }
5052 else {
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005053 ADDOP_LOAD_CONST(c, Py_None);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005054 }
Mark Dickinsonded35ae2012-11-25 14:36:26 +00005055 ADDOP(c, YIELD_VALUE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005056 break;
Mark Dickinsonded35ae2012-11-25 14:36:26 +00005057 case YieldFrom_kind:
5058 if (c->u->u_ste->ste_type != FunctionBlock)
5059 return compiler_error(c, "'yield' outside function");
Yury Selivanov75445082015-05-11 22:57:16 -04005060
5061 if (c->u->u_scope_type == COMPILER_SCOPE_ASYNC_FUNCTION)
5062 return compiler_error(c, "'yield from' inside async function");
5063
Mark Dickinsonded35ae2012-11-25 14:36:26 +00005064 VISIT(c, expr, e->v.YieldFrom.value);
Yury Selivanov5376ba92015-06-22 12:19:30 -04005065 ADDOP(c, GET_YIELD_FROM_ITER);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005066 ADDOP_LOAD_CONST(c, Py_None);
Mark Dickinsonded35ae2012-11-25 14:36:26 +00005067 ADDOP(c, YIELD_FROM);
5068 break;
Yury Selivanov75445082015-05-11 22:57:16 -04005069 case Await_kind:
Pablo Galindo90235812020-03-15 04:29:22 +00005070 if (!IS_TOP_LEVEL_AWAIT(c)){
Matthias Bussonnier565b4f12019-05-21 13:12:03 -07005071 if (c->u->u_ste->ste_type != FunctionBlock){
5072 return compiler_error(c, "'await' outside function");
5073 }
Yury Selivanov75445082015-05-11 22:57:16 -04005074
Victor Stinner331a6a52019-05-27 16:39:22 +02005075 if (c->u->u_scope_type != COMPILER_SCOPE_ASYNC_FUNCTION &&
Matthias Bussonnier565b4f12019-05-21 13:12:03 -07005076 c->u->u_scope_type != COMPILER_SCOPE_COMPREHENSION){
5077 return compiler_error(c, "'await' outside async function");
5078 }
5079 }
Yury Selivanov75445082015-05-11 22:57:16 -04005080
5081 VISIT(c, expr, e->v.Await.value);
5082 ADDOP(c, GET_AWAITABLE);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005083 ADDOP_LOAD_CONST(c, Py_None);
Yury Selivanov75445082015-05-11 22:57:16 -04005084 ADDOP(c, YIELD_FROM);
5085 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005086 case Compare_kind:
5087 return compiler_compare(c, e);
5088 case Call_kind:
5089 return compiler_call(c, e);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01005090 case Constant_kind:
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005091 ADDOP_LOAD_CONST(c, e->v.Constant.value);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01005092 break;
Eric V. Smith235a6f02015-09-19 14:51:32 -04005093 case JoinedStr_kind:
5094 return compiler_joined_str(c, e);
5095 case FormattedValue_kind:
5096 return compiler_formatted_value(c, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005097 /* The following exprs can be assignment targets. */
5098 case Attribute_kind:
Serhiy Storchaka6b975982020-03-17 23:41:08 +02005099 VISIT(c, expr, e->v.Attribute.value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005100 switch (e->v.Attribute.ctx) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005101 case Load:
5102 ADDOP_NAME(c, LOAD_ATTR, e->v.Attribute.attr, names);
5103 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005104 case Store:
Pablo Galindoc5fc1562020-04-22 23:29:27 +01005105 if (forbidden_name(c, e->v.Attribute.attr, e->v.Attribute.ctx))
5106 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005107 ADDOP_NAME(c, STORE_ATTR, e->v.Attribute.attr, names);
5108 break;
5109 case Del:
5110 ADDOP_NAME(c, DELETE_ATTR, e->v.Attribute.attr, names);
5111 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005112 }
5113 break;
5114 case Subscript_kind:
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005115 return compiler_subscript(c, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005116 case Starred_kind:
5117 switch (e->v.Starred.ctx) {
5118 case Store:
5119 /* In all legitimate cases, the Starred node was already replaced
5120 * by compiler_list/compiler_tuple. XXX: is that okay? */
5121 return compiler_error(c,
5122 "starred assignment target must be in a list or tuple");
5123 default:
5124 return compiler_error(c,
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04005125 "can't use starred expression here");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005126 }
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005127 break;
5128 case Slice_kind:
5129 return compiler_slice(c, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005130 case Name_kind:
5131 return compiler_nameop(c, e->v.Name.id, e->v.Name.ctx);
5132 /* child nodes of List and Tuple will have expr_context set */
5133 case List_kind:
5134 return compiler_list(c, e);
5135 case Tuple_kind:
5136 return compiler_tuple(c, e);
5137 }
5138 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005139}
5140
5141static int
Serhiy Storchakada8d72c2018-09-17 15:17:29 +03005142compiler_visit_expr(struct compiler *c, expr_ty e)
5143{
Serhiy Storchakada8d72c2018-09-17 15:17:29 +03005144 int old_lineno = c->u->u_lineno;
5145 int old_col_offset = c->u->u_col_offset;
Serhiy Storchaka61cb3d02020-03-17 18:07:30 +02005146 SET_LOC(c, e);
Serhiy Storchakada8d72c2018-09-17 15:17:29 +03005147 int res = compiler_visit_expr1(c, e);
Serhiy Storchaka61cb3d02020-03-17 18:07:30 +02005148 c->u->u_lineno = old_lineno;
Serhiy Storchakada8d72c2018-09-17 15:17:29 +03005149 c->u->u_col_offset = old_col_offset;
5150 return res;
5151}
5152
5153static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005154compiler_augassign(struct compiler *c, stmt_ty s)
5155{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005156 assert(s->kind == AugAssign_kind);
Serhiy Storchaka6b975982020-03-17 23:41:08 +02005157 expr_ty e = s->v.AugAssign.target;
5158
5159 int old_lineno = c->u->u_lineno;
5160 int old_col_offset = c->u->u_col_offset;
5161 SET_LOC(c, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005162
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005163 switch (e->kind) {
5164 case Attribute_kind:
Serhiy Storchaka6b975982020-03-17 23:41:08 +02005165 VISIT(c, expr, e->v.Attribute.value);
5166 ADDOP(c, DUP_TOP);
5167 ADDOP_NAME(c, LOAD_ATTR, e->v.Attribute.attr, names);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005168 break;
5169 case Subscript_kind:
Serhiy Storchaka6b975982020-03-17 23:41:08 +02005170 VISIT(c, expr, e->v.Subscript.value);
5171 VISIT(c, expr, e->v.Subscript.slice);
5172 ADDOP(c, DUP_TOP_TWO);
5173 ADDOP(c, BINARY_SUBSCR);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005174 break;
5175 case Name_kind:
5176 if (!compiler_nameop(c, e->v.Name.id, Load))
5177 return 0;
Serhiy Storchaka6b975982020-03-17 23:41:08 +02005178 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005179 default:
5180 PyErr_Format(PyExc_SystemError,
5181 "invalid node type (%d) for augmented assignment",
5182 e->kind);
5183 return 0;
5184 }
Serhiy Storchaka6b975982020-03-17 23:41:08 +02005185
5186 c->u->u_lineno = old_lineno;
5187 c->u->u_col_offset = old_col_offset;
5188
5189 VISIT(c, expr, s->v.AugAssign.value);
5190 ADDOP(c, inplace_binop(s->v.AugAssign.op));
5191
5192 SET_LOC(c, e);
5193
5194 switch (e->kind) {
5195 case Attribute_kind:
5196 ADDOP(c, ROT_TWO);
5197 ADDOP_NAME(c, STORE_ATTR, e->v.Attribute.attr, names);
5198 break;
5199 case Subscript_kind:
5200 ADDOP(c, ROT_THREE);
5201 ADDOP(c, STORE_SUBSCR);
5202 break;
5203 case Name_kind:
5204 return compiler_nameop(c, e->v.Name.id, Store);
5205 default:
5206 Py_UNREACHABLE();
5207 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005208 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005209}
5210
5211static int
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005212check_ann_expr(struct compiler *c, expr_ty e)
5213{
5214 VISIT(c, expr, e);
5215 ADDOP(c, POP_TOP);
5216 return 1;
5217}
5218
5219static int
5220check_annotation(struct compiler *c, stmt_ty s)
5221{
5222 /* Annotations are only evaluated in a module or class. */
5223 if (c->u->u_scope_type == COMPILER_SCOPE_MODULE ||
5224 c->u->u_scope_type == COMPILER_SCOPE_CLASS) {
5225 return check_ann_expr(c, s->v.AnnAssign.annotation);
5226 }
5227 return 1;
5228}
5229
5230static int
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005231check_ann_subscr(struct compiler *c, expr_ty e)
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005232{
5233 /* We check that everything in a subscript is defined at runtime. */
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005234 switch (e->kind) {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005235 case Slice_kind:
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005236 if (e->v.Slice.lower && !check_ann_expr(c, e->v.Slice.lower)) {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005237 return 0;
5238 }
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005239 if (e->v.Slice.upper && !check_ann_expr(c, e->v.Slice.upper)) {
5240 return 0;
5241 }
5242 if (e->v.Slice.step && !check_ann_expr(c, e->v.Slice.step)) {
5243 return 0;
5244 }
5245 return 1;
5246 case Tuple_kind: {
5247 /* extended slice */
Pablo Galindoa5634c42020-09-16 19:42:00 +01005248 asdl_expr_seq *elts = e->v.Tuple.elts;
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005249 Py_ssize_t i, n = asdl_seq_LEN(elts);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005250 for (i = 0; i < n; i++) {
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005251 if (!check_ann_subscr(c, asdl_seq_GET(elts, i))) {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005252 return 0;
5253 }
5254 }
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005255 return 1;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005256 }
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005257 default:
5258 return check_ann_expr(c, e);
5259 }
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005260}
5261
5262static int
5263compiler_annassign(struct compiler *c, stmt_ty s)
5264{
5265 expr_ty targ = s->v.AnnAssign.target;
Guido van Rossum015d8742016-09-11 09:45:24 -07005266 PyObject* mangled;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005267
5268 assert(s->kind == AnnAssign_kind);
5269
5270 /* We perform the actual assignment first. */
5271 if (s->v.AnnAssign.value) {
5272 VISIT(c, expr, s->v.AnnAssign.value);
5273 VISIT(c, expr, targ);
5274 }
5275 switch (targ->kind) {
5276 case Name_kind:
Pablo Galindoc5fc1562020-04-22 23:29:27 +01005277 if (forbidden_name(c, targ->v.Name.id, Store))
5278 return 0;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005279 /* If we have a simple name in a module or class, store annotation. */
5280 if (s->v.AnnAssign.simple &&
5281 (c->u->u_scope_type == COMPILER_SCOPE_MODULE ||
5282 c->u->u_scope_type == COMPILER_SCOPE_CLASS)) {
Batuhan Taskaya044a1042020-10-06 23:03:02 +03005283 VISIT(c, annexpr, s->v.AnnAssign.annotation);
Mark Shannon332cd5e2018-01-30 00:41:04 +00005284 ADDOP_NAME(c, LOAD_NAME, __annotations__, names);
Serhiy Storchakaa95d9862018-03-24 22:42:35 +02005285 mangled = _Py_Mangle(c->u->u_private, targ->v.Name.id);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005286 ADDOP_LOAD_CONST_NEW(c, mangled);
Mark Shannon332cd5e2018-01-30 00:41:04 +00005287 ADDOP(c, STORE_SUBSCR);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005288 }
5289 break;
5290 case Attribute_kind:
Pablo Galindoc5fc1562020-04-22 23:29:27 +01005291 if (forbidden_name(c, targ->v.Attribute.attr, Store))
5292 return 0;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005293 if (!s->v.AnnAssign.value &&
5294 !check_ann_expr(c, targ->v.Attribute.value)) {
5295 return 0;
5296 }
5297 break;
5298 case Subscript_kind:
5299 if (!s->v.AnnAssign.value &&
5300 (!check_ann_expr(c, targ->v.Subscript.value) ||
5301 !check_ann_subscr(c, targ->v.Subscript.slice))) {
5302 return 0;
5303 }
5304 break;
5305 default:
5306 PyErr_Format(PyExc_SystemError,
5307 "invalid node type (%d) for annotated assignment",
5308 targ->kind);
5309 return 0;
5310 }
5311 /* Annotation is evaluated last. */
5312 if (!s->v.AnnAssign.simple && !check_annotation(c, s)) {
5313 return 0;
5314 }
5315 return 1;
5316}
5317
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005318/* Raises a SyntaxError and returns 0.
5319 If something goes wrong, a different exception may be raised.
5320*/
5321
5322static int
5323compiler_error(struct compiler *c, const char *errstr)
5324{
Benjamin Peterson43b06862011-05-27 09:08:01 -05005325 PyObject *loc;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005326 PyObject *u = NULL, *v = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005327
Victor Stinner14e461d2013-08-26 22:28:21 +02005328 loc = PyErr_ProgramTextObject(c->c_filename, c->u->u_lineno);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005329 if (!loc) {
5330 Py_INCREF(Py_None);
5331 loc = Py_None;
5332 }
Victor Stinner14e461d2013-08-26 22:28:21 +02005333 u = Py_BuildValue("(OiiO)", c->c_filename, c->u->u_lineno,
Ammar Askar025eb982018-09-24 17:12:49 -04005334 c->u->u_col_offset + 1, loc);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005335 if (!u)
5336 goto exit;
5337 v = Py_BuildValue("(zO)", errstr, u);
5338 if (!v)
5339 goto exit;
5340 PyErr_SetObject(PyExc_SyntaxError, v);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005341 exit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005342 Py_DECREF(loc);
5343 Py_XDECREF(u);
5344 Py_XDECREF(v);
5345 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005346}
5347
Serhiy Storchakad31e7732018-10-21 10:09:39 +03005348/* Emits a SyntaxWarning and returns 1 on success.
5349 If a SyntaxWarning raised as error, replaces it with a SyntaxError
5350 and returns 0.
5351*/
5352static int
Serhiy Storchaka62e44812019-02-16 08:12:19 +02005353compiler_warn(struct compiler *c, const char *format, ...)
Serhiy Storchakad31e7732018-10-21 10:09:39 +03005354{
Serhiy Storchaka62e44812019-02-16 08:12:19 +02005355 va_list vargs;
5356#ifdef HAVE_STDARG_PROTOTYPES
5357 va_start(vargs, format);
5358#else
5359 va_start(vargs);
5360#endif
5361 PyObject *msg = PyUnicode_FromFormatV(format, vargs);
5362 va_end(vargs);
Serhiy Storchakad31e7732018-10-21 10:09:39 +03005363 if (msg == NULL) {
5364 return 0;
5365 }
5366 if (PyErr_WarnExplicitObject(PyExc_SyntaxWarning, msg, c->c_filename,
5367 c->u->u_lineno, NULL, NULL) < 0)
5368 {
Serhiy Storchakad31e7732018-10-21 10:09:39 +03005369 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
Serhiy Storchaka62e44812019-02-16 08:12:19 +02005370 /* Replace the SyntaxWarning exception with a SyntaxError
5371 to get a more accurate error report */
Serhiy Storchakad31e7732018-10-21 10:09:39 +03005372 PyErr_Clear();
Serhiy Storchaka62e44812019-02-16 08:12:19 +02005373 assert(PyUnicode_AsUTF8(msg) != NULL);
5374 compiler_error(c, PyUnicode_AsUTF8(msg));
Serhiy Storchakad31e7732018-10-21 10:09:39 +03005375 }
Serhiy Storchaka62e44812019-02-16 08:12:19 +02005376 Py_DECREF(msg);
Serhiy Storchakad31e7732018-10-21 10:09:39 +03005377 return 0;
5378 }
5379 Py_DECREF(msg);
5380 return 1;
5381}
5382
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005383static int
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005384compiler_subscript(struct compiler *c, expr_ty e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005385{
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005386 expr_context_ty ctx = e->v.Subscript.ctx;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005387 int op = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005388
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005389 if (ctx == Load) {
5390 if (!check_subscripter(c, e->v.Subscript.value)) {
5391 return 0;
5392 }
5393 if (!check_index(c, e->v.Subscript.value, e->v.Subscript.slice)) {
5394 return 0;
5395 }
5396 }
5397
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005398 switch (ctx) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005399 case Load: op = BINARY_SUBSCR; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005400 case Store: op = STORE_SUBSCR; break;
5401 case Del: op = DELETE_SUBSCR; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005402 }
Serhiy Storchaka6b975982020-03-17 23:41:08 +02005403 assert(op);
5404 VISIT(c, expr, e->v.Subscript.value);
5405 VISIT(c, expr, e->v.Subscript.slice);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005406 ADDOP(c, op);
5407 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005408}
5409
5410static int
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005411compiler_slice(struct compiler *c, expr_ty s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005412{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005413 int n = 2;
5414 assert(s->kind == Slice_kind);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005415
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005416 /* only handles the cases where BUILD_SLICE is emitted */
5417 if (s->v.Slice.lower) {
5418 VISIT(c, expr, s->v.Slice.lower);
5419 }
5420 else {
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005421 ADDOP_LOAD_CONST(c, Py_None);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005422 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005423
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005424 if (s->v.Slice.upper) {
5425 VISIT(c, expr, s->v.Slice.upper);
5426 }
5427 else {
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005428 ADDOP_LOAD_CONST(c, Py_None);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005429 }
5430
5431 if (s->v.Slice.step) {
5432 n++;
5433 VISIT(c, expr, s->v.Slice.step);
5434 }
5435 ADDOP_I(c, BUILD_SLICE, n);
5436 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005437}
5438
Thomas Wouters89f507f2006-12-13 04:49:30 +00005439/* End of the compiler section, beginning of the assembler section */
5440
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005441/* do depth-first search of basic block graph, starting with block.
T. Wouters99b54d62019-09-12 07:05:33 -07005442 post records the block indices in post-order.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005443
5444 XXX must handle implicit jumps from one block to next
5445*/
5446
Thomas Wouters89f507f2006-12-13 04:49:30 +00005447struct assembler {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005448 PyObject *a_bytecode; /* string containing bytecode */
5449 int a_offset; /* offset into bytecode */
5450 int a_nblocks; /* number of reachable blocks */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005451 PyObject *a_lnotab; /* string containing lnotab */
5452 int a_lnotab_off; /* offset into lnotab */
Mark Shannon877df852020-11-12 09:43:29 +00005453 int a_prevlineno; /* lineno of last emitted line in line table */
5454 int a_lineno; /* lineno of last emitted instruction */
5455 int a_lineno_start; /* bytecode start offset of current lineno */
Mark Shannoncc75ab72020-11-12 19:49:33 +00005456 basicblock *a_entry;
Thomas Wouters89f507f2006-12-13 04:49:30 +00005457};
5458
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005459Py_LOCAL_INLINE(void)
5460stackdepth_push(basicblock ***sp, basicblock *b, int depth)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005461{
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02005462 assert(b->b_startdepth < 0 || b->b_startdepth == depth);
Mark Shannonfee55262019-11-21 09:11:43 +00005463 if (b->b_startdepth < depth && b->b_startdepth < 100) {
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005464 assert(b->b_startdepth < 0);
5465 b->b_startdepth = depth;
5466 *(*sp)++ = b;
Serhiy Storchakad4864c62018-01-09 21:54:52 +02005467 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005468}
5469
5470/* Find the flow path that needs the largest stack. We assume that
5471 * cycles in the flow graph have no net effect on the stack depth.
5472 */
5473static int
5474stackdepth(struct compiler *c)
5475{
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005476 basicblock *b, *entryblock = NULL;
5477 basicblock **stack, **sp;
5478 int nblocks = 0, maxdepth = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005479 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005480 b->b_startdepth = INT_MIN;
5481 entryblock = b;
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005482 nblocks++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005483 }
5484 if (!entryblock)
5485 return 0;
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005486 stack = (basicblock **)PyObject_Malloc(sizeof(basicblock *) * nblocks);
5487 if (!stack) {
5488 PyErr_NoMemory();
5489 return -1;
5490 }
5491
5492 sp = stack;
5493 stackdepth_push(&sp, entryblock, 0);
5494 while (sp != stack) {
5495 b = *--sp;
5496 int depth = b->b_startdepth;
5497 assert(depth >= 0);
5498 basicblock *next = b->b_next;
5499 for (int i = 0; i < b->b_iused; i++) {
5500 struct instr *instr = &b->b_instr[i];
5501 int effect = stack_effect(instr->i_opcode, instr->i_oparg, 0);
5502 if (effect == PY_INVALID_STACK_EFFECT) {
Victor Stinner87d3b9d2020-03-25 19:27:36 +01005503 _Py_FatalErrorFormat(__func__,
5504 "opcode = %d", instr->i_opcode);
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005505 }
5506 int new_depth = depth + effect;
5507 if (new_depth > maxdepth) {
5508 maxdepth = new_depth;
5509 }
5510 assert(depth >= 0); /* invalid code or bug in stackdepth() */
Mark Shannon582aaf12020-08-04 17:30:11 +01005511 if (is_jump(instr)) {
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005512 effect = stack_effect(instr->i_opcode, instr->i_oparg, 1);
5513 assert(effect != PY_INVALID_STACK_EFFECT);
5514 int target_depth = depth + effect;
5515 if (target_depth > maxdepth) {
5516 maxdepth = target_depth;
5517 }
5518 assert(target_depth >= 0); /* invalid code or bug in stackdepth() */
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005519 stackdepth_push(&sp, instr->i_target, target_depth);
5520 }
5521 depth = new_depth;
5522 if (instr->i_opcode == JUMP_ABSOLUTE ||
5523 instr->i_opcode == JUMP_FORWARD ||
5524 instr->i_opcode == RETURN_VALUE ||
Mark Shannonfee55262019-11-21 09:11:43 +00005525 instr->i_opcode == RAISE_VARARGS ||
5526 instr->i_opcode == RERAISE)
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005527 {
5528 /* remaining code is dead */
5529 next = NULL;
5530 break;
5531 }
5532 }
5533 if (next != NULL) {
Mark Shannon266b4622020-11-17 19:30:14 +00005534 assert(b->b_nofallthrough == 0);
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005535 stackdepth_push(&sp, next, depth);
5536 }
5537 }
5538 PyObject_Free(stack);
5539 return maxdepth;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005540}
5541
5542static int
5543assemble_init(struct assembler *a, int nblocks, int firstlineno)
5544{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005545 memset(a, 0, sizeof(struct assembler));
Mark Shannon877df852020-11-12 09:43:29 +00005546 a->a_prevlineno = a->a_lineno = firstlineno;
Mark Shannonfd009e62020-11-13 12:53:53 +00005547 a->a_lnotab = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005548 a->a_bytecode = PyBytes_FromStringAndSize(NULL, DEFAULT_CODE_SIZE);
Mark Shannonfd009e62020-11-13 12:53:53 +00005549 if (a->a_bytecode == NULL) {
5550 goto error;
5551 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005552 a->a_lnotab = PyBytes_FromStringAndSize(NULL, DEFAULT_LNOTAB_SIZE);
Mark Shannonfd009e62020-11-13 12:53:53 +00005553 if (a->a_lnotab == NULL) {
5554 goto error;
5555 }
Benjamin Peterson2f8bfef2016-09-07 09:26:18 -07005556 if ((size_t)nblocks > SIZE_MAX / sizeof(basicblock *)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005557 PyErr_NoMemory();
Mark Shannonfd009e62020-11-13 12:53:53 +00005558 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005559 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005560 return 1;
Mark Shannonfd009e62020-11-13 12:53:53 +00005561error:
5562 Py_XDECREF(a->a_bytecode);
5563 Py_XDECREF(a->a_lnotab);
5564 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005565}
5566
5567static void
5568assemble_free(struct assembler *a)
5569{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005570 Py_XDECREF(a->a_bytecode);
5571 Py_XDECREF(a->a_lnotab);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005572}
5573
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005574static int
5575blocksize(basicblock *b)
5576{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005577 int i;
5578 int size = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005579
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005580 for (i = 0; i < b->b_iused; i++)
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005581 size += instrsize(b->b_instr[i].i_oparg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005582 return size;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005583}
5584
Guido van Rossumf68d8e52001-04-14 17:55:09 +00005585static int
Mark Shannon877df852020-11-12 09:43:29 +00005586assemble_emit_linetable_pair(struct assembler *a, int bdelta, int ldelta)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005587{
Mark Shannon877df852020-11-12 09:43:29 +00005588 Py_ssize_t len = PyBytes_GET_SIZE(a->a_lnotab);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005589 if (a->a_lnotab_off + 2 >= len) {
5590 if (_PyBytes_Resize(&a->a_lnotab, len * 2) < 0)
5591 return 0;
5592 }
Mark Shannon877df852020-11-12 09:43:29 +00005593 unsigned char *lnotab = (unsigned char *)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005594 PyBytes_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
Tim Peters51e26512001-09-07 08:45:55 +00005595
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005596 a->a_lnotab_off += 2;
Mark Shannon877df852020-11-12 09:43:29 +00005597 *lnotab++ = bdelta;
5598 *lnotab++ = ldelta;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005599 return 1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005600}
5601
Mark Shannon877df852020-11-12 09:43:29 +00005602/* Appends a range to the end of the line number table. See
5603 * Objects/lnotab_notes.txt for the description of the line number table. */
5604
5605static int
5606assemble_line_range(struct assembler *a)
5607{
5608 int ldelta, bdelta;
5609 bdelta = (a->a_offset - a->a_lineno_start) * 2;
5610 if (bdelta == 0) {
5611 return 1;
5612 }
5613 if (a->a_lineno < 0) {
5614 ldelta = -128;
5615 }
5616 else {
5617 ldelta = a->a_lineno - a->a_prevlineno;
5618 a->a_prevlineno = a->a_lineno;
5619 while (ldelta > 127) {
5620 if (!assemble_emit_linetable_pair(a, 0, 127)) {
5621 return 0;
5622 }
5623 ldelta -= 127;
5624 }
5625 while (ldelta < -127) {
5626 if (!assemble_emit_linetable_pair(a, 0, -127)) {
5627 return 0;
5628 }
5629 ldelta += 127;
5630 }
5631 }
5632 assert(-128 <= ldelta && ldelta < 128);
5633 while (bdelta > 254) {
5634 if (!assemble_emit_linetable_pair(a, 254, ldelta)) {
5635 return 0;
5636 }
5637 ldelta = a->a_lineno < 0 ? -128 : 0;
5638 bdelta -= 254;
5639 }
5640 if (!assemble_emit_linetable_pair(a, bdelta, ldelta)) {
5641 return 0;
5642 }
5643 a->a_lineno_start = a->a_offset;
5644 return 1;
5645}
5646
5647static int
5648assemble_lnotab(struct assembler *a, struct instr *i)
5649{
5650 if (i->i_lineno == a->a_lineno) {
5651 return 1;
5652 }
5653 if (!assemble_line_range(a)) {
5654 return 0;
5655 }
5656 a->a_lineno = i->i_lineno;
5657 return 1;
5658}
5659
5660
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005661/* assemble_emit()
5662 Extend the bytecode with a new instruction.
5663 Update lnotab if necessary.
Jeremy Hylton376e63d2003-08-28 14:42:14 +00005664*/
5665
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00005666static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005667assemble_emit(struct assembler *a, struct instr *i)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00005668{
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005669 int size, arg = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005670 Py_ssize_t len = PyBytes_GET_SIZE(a->a_bytecode);
Serhiy Storchakaab874002016-09-11 13:48:15 +03005671 _Py_CODEUNIT *code;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005672
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005673 arg = i->i_oparg;
5674 size = instrsize(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005675 if (i->i_lineno && !assemble_lnotab(a, i))
5676 return 0;
Serhiy Storchakaab874002016-09-11 13:48:15 +03005677 if (a->a_offset + size >= len / (int)sizeof(_Py_CODEUNIT)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005678 if (len > PY_SSIZE_T_MAX / 2)
5679 return 0;
5680 if (_PyBytes_Resize(&a->a_bytecode, len * 2) < 0)
5681 return 0;
5682 }
Serhiy Storchakaab874002016-09-11 13:48:15 +03005683 code = (_Py_CODEUNIT *)PyBytes_AS_STRING(a->a_bytecode) + a->a_offset;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005684 a->a_offset += size;
Serhiy Storchakaab874002016-09-11 13:48:15 +03005685 write_op_arg(code, i->i_opcode, arg, size);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005686 return 1;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00005687}
5688
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00005689static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005690assemble_jump_offsets(struct assembler *a, struct compiler *c)
Anthony Baxterc2a5a632004-08-02 06:10:11 +00005691{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005692 basicblock *b;
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005693 int bsize, totsize, extended_arg_recompile;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005694 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00005695
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005696 /* Compute the size of each block and fixup jump args.
5697 Replace block pointer with position in bytecode. */
5698 do {
5699 totsize = 0;
Mark Shannoncc75ab72020-11-12 19:49:33 +00005700 for (basicblock *b = a->a_entry; b != NULL; b = b->b_next) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005701 bsize = blocksize(b);
5702 b->b_offset = totsize;
5703 totsize += bsize;
5704 }
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005705 extended_arg_recompile = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005706 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
5707 bsize = b->b_offset;
5708 for (i = 0; i < b->b_iused; i++) {
5709 struct instr *instr = &b->b_instr[i];
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005710 int isize = instrsize(instr->i_oparg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005711 /* Relative jumps are computed relative to
5712 the instruction pointer after fetching
5713 the jump instruction.
5714 */
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005715 bsize += isize;
Mark Shannon582aaf12020-08-04 17:30:11 +01005716 if (is_jump(instr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005717 instr->i_oparg = instr->i_target->b_offset;
Mark Shannon582aaf12020-08-04 17:30:11 +01005718 if (is_relative_jump(instr)) {
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005719 instr->i_oparg -= bsize;
5720 }
Serhiy Storchakaab874002016-09-11 13:48:15 +03005721 instr->i_oparg *= sizeof(_Py_CODEUNIT);
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005722 if (instrsize(instr->i_oparg) != isize) {
5723 extended_arg_recompile = 1;
5724 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005725 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005726 }
5727 }
Neal Norwitzf1d50682005-10-23 23:00:41 +00005728
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005729 /* XXX: This is an awful hack that could hurt performance, but
5730 on the bright side it should work until we come up
5731 with a better solution.
Neal Norwitzf1d50682005-10-23 23:00:41 +00005732
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005733 The issue is that in the first loop blocksize() is called
5734 which calls instrsize() which requires i_oparg be set
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005735 appropriately. There is a bootstrap problem because
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005736 i_oparg is calculated in the second loop above.
Neal Norwitzf1d50682005-10-23 23:00:41 +00005737
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005738 So we loop until we stop seeing new EXTENDED_ARGs.
5739 The only EXTENDED_ARGs that could be popping up are
5740 ones in jump instructions. So this should converge
5741 fairly quickly.
5742 */
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005743 } while (extended_arg_recompile);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005744}
5745
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005746static PyObject *
Victor Stinnerad9a0662013-11-19 22:23:20 +01005747dict_keys_inorder(PyObject *dict, Py_ssize_t offset)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005748{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005749 PyObject *tuple, *k, *v;
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +02005750 Py_ssize_t i, pos = 0, size = PyDict_GET_SIZE(dict);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005751
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005752 tuple = PyTuple_New(size);
5753 if (tuple == NULL)
5754 return NULL;
5755 while (PyDict_Next(dict, &pos, &k, &v)) {
5756 i = PyLong_AS_LONG(v);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005757 Py_INCREF(k);
5758 assert((i - offset) < size);
5759 assert((i - offset) >= 0);
5760 PyTuple_SET_ITEM(tuple, i - offset, k);
5761 }
5762 return tuple;
5763}
5764
5765static PyObject *
5766consts_dict_keys_inorder(PyObject *dict)
5767{
5768 PyObject *consts, *k, *v;
5769 Py_ssize_t i, pos = 0, size = PyDict_GET_SIZE(dict);
5770
5771 consts = PyList_New(size); /* PyCode_Optimize() requires a list */
5772 if (consts == NULL)
5773 return NULL;
5774 while (PyDict_Next(dict, &pos, &k, &v)) {
5775 i = PyLong_AS_LONG(v);
Serhiy Storchakab7e1eff2018-04-19 08:28:04 +03005776 /* The keys of the dictionary can be tuples wrapping a contant.
5777 * (see compiler_add_o and _PyCode_ConstantKey). In that case
5778 * the object we want is always second. */
5779 if (PyTuple_CheckExact(k)) {
5780 k = PyTuple_GET_ITEM(k, 1);
5781 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005782 Py_INCREF(k);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005783 assert(i < size);
5784 assert(i >= 0);
5785 PyList_SET_ITEM(consts, i, k);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005786 }
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005787 return consts;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005788}
5789
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005790static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005791compute_code_flags(struct compiler *c)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005792{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005793 PySTEntryObject *ste = c->u->u_ste;
Victor Stinnerad9a0662013-11-19 22:23:20 +01005794 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005795 if (ste->ste_type == FunctionBlock) {
Benjamin Peterson1dfd2472015-04-27 21:44:22 -04005796 flags |= CO_NEWLOCALS | CO_OPTIMIZED;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005797 if (ste->ste_nested)
5798 flags |= CO_NESTED;
Yury Selivanoveb636452016-09-08 22:01:51 -07005799 if (ste->ste_generator && !ste->ste_coroutine)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005800 flags |= CO_GENERATOR;
Yury Selivanoveb636452016-09-08 22:01:51 -07005801 if (!ste->ste_generator && ste->ste_coroutine)
5802 flags |= CO_COROUTINE;
5803 if (ste->ste_generator && ste->ste_coroutine)
5804 flags |= CO_ASYNC_GENERATOR;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005805 if (ste->ste_varargs)
5806 flags |= CO_VARARGS;
5807 if (ste->ste_varkeywords)
5808 flags |= CO_VARKEYWORDS;
5809 }
Thomas Wouters5e9f1fa2006-02-28 20:02:27 +00005810
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005811 /* (Only) inherit compilerflags in PyCF_MASK */
5812 flags |= (c->c_flags->cf_flags & PyCF_MASK);
Thomas Wouters5e9f1fa2006-02-28 20:02:27 +00005813
Pablo Galindo90235812020-03-15 04:29:22 +00005814 if ((IS_TOP_LEVEL_AWAIT(c)) &&
Matthias Bussonnier565b4f12019-05-21 13:12:03 -07005815 ste->ste_coroutine &&
5816 !ste->ste_generator) {
5817 flags |= CO_COROUTINE;
5818 }
5819
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005820 return flags;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005821}
5822
INADA Naokic2e16072018-11-26 21:23:22 +09005823// Merge *tuple* with constant cache.
5824// Unlike merge_consts_recursive(), this function doesn't work recursively.
5825static int
5826merge_const_tuple(struct compiler *c, PyObject **tuple)
5827{
5828 assert(PyTuple_CheckExact(*tuple));
5829
5830 PyObject *key = _PyCode_ConstantKey(*tuple);
5831 if (key == NULL) {
5832 return 0;
5833 }
5834
5835 // t is borrowed reference
5836 PyObject *t = PyDict_SetDefault(c->c_const_cache, key, key);
5837 Py_DECREF(key);
5838 if (t == NULL) {
5839 return 0;
5840 }
5841 if (t == key) { // tuple is new constant.
5842 return 1;
5843 }
5844
5845 PyObject *u = PyTuple_GET_ITEM(t, 1);
5846 Py_INCREF(u);
5847 Py_DECREF(*tuple);
5848 *tuple = u;
5849 return 1;
5850}
5851
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005852static PyCodeObject *
Mark Shannon6e8128f2020-07-30 10:03:00 +01005853makecode(struct compiler *c, struct assembler *a, PyObject *consts)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005854{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005855 PyCodeObject *co = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005856 PyObject *names = NULL;
5857 PyObject *varnames = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005858 PyObject *name = NULL;
5859 PyObject *freevars = NULL;
5860 PyObject *cellvars = NULL;
Victor Stinnerad9a0662013-11-19 22:23:20 +01005861 Py_ssize_t nlocals;
5862 int nlocals_int;
5863 int flags;
Pablo Galindocd74e662019-06-01 18:08:04 +01005864 int posorkeywordargcount, posonlyargcount, kwonlyargcount, maxdepth;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005865
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005866 names = dict_keys_inorder(c->u->u_names, 0);
5867 varnames = dict_keys_inorder(c->u->u_varnames, 0);
Mark Shannon6e8128f2020-07-30 10:03:00 +01005868 if (!names || !varnames) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005869 goto error;
Mark Shannon6e8128f2020-07-30 10:03:00 +01005870 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005871 cellvars = dict_keys_inorder(c->u->u_cellvars, 0);
5872 if (!cellvars)
5873 goto error;
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005874 freevars = dict_keys_inorder(c->u->u_freevars, PyTuple_GET_SIZE(cellvars));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005875 if (!freevars)
5876 goto error;
Victor Stinnerad9a0662013-11-19 22:23:20 +01005877
INADA Naokic2e16072018-11-26 21:23:22 +09005878 if (!merge_const_tuple(c, &names) ||
5879 !merge_const_tuple(c, &varnames) ||
5880 !merge_const_tuple(c, &cellvars) ||
5881 !merge_const_tuple(c, &freevars))
5882 {
5883 goto error;
5884 }
5885
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +02005886 nlocals = PyDict_GET_SIZE(c->u->u_varnames);
Victor Stinnerad9a0662013-11-19 22:23:20 +01005887 assert(nlocals < INT_MAX);
5888 nlocals_int = Py_SAFE_DOWNCAST(nlocals, Py_ssize_t, int);
5889
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005890 flags = compute_code_flags(c);
5891 if (flags < 0)
5892 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005893
Mark Shannon6e8128f2020-07-30 10:03:00 +01005894 consts = PyList_AsTuple(consts); /* PyCode_New requires a tuple */
5895 if (consts == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005896 goto error;
Mark Shannon6e8128f2020-07-30 10:03:00 +01005897 }
INADA Naokic2e16072018-11-26 21:23:22 +09005898 if (!merge_const_tuple(c, &consts)) {
Mark Shannon6e8128f2020-07-30 10:03:00 +01005899 Py_DECREF(consts);
INADA Naokic2e16072018-11-26 21:23:22 +09005900 goto error;
5901 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005902
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01005903 posonlyargcount = Py_SAFE_DOWNCAST(c->u->u_posonlyargcount, Py_ssize_t, int);
Pablo Galindocd74e662019-06-01 18:08:04 +01005904 posorkeywordargcount = Py_SAFE_DOWNCAST(c->u->u_argcount, Py_ssize_t, int);
Victor Stinnerf8e32212013-11-19 23:56:34 +01005905 kwonlyargcount = Py_SAFE_DOWNCAST(c->u->u_kwonlyargcount, Py_ssize_t, int);
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005906 maxdepth = stackdepth(c);
5907 if (maxdepth < 0) {
Mark Shannon6e8128f2020-07-30 10:03:00 +01005908 Py_DECREF(consts);
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005909 goto error;
5910 }
Pablo Galindo4a2edc32019-07-01 11:35:05 +01005911 co = PyCode_NewWithPosOnlyArgs(posonlyargcount+posorkeywordargcount,
Mark Shannon13bc1392020-01-23 09:25:17 +00005912 posonlyargcount, kwonlyargcount, nlocals_int,
Mark Shannon6e8128f2020-07-30 10:03:00 +01005913 maxdepth, flags, a->a_bytecode, consts, names,
Pablo Galindo4a2edc32019-07-01 11:35:05 +01005914 varnames, freevars, cellvars, c->c_filename,
5915 c->u->u_name, c->u->u_firstlineno, a->a_lnotab);
Mark Shannon6e8128f2020-07-30 10:03:00 +01005916 Py_DECREF(consts);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005917 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005918 Py_XDECREF(names);
5919 Py_XDECREF(varnames);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005920 Py_XDECREF(name);
5921 Py_XDECREF(freevars);
5922 Py_XDECREF(cellvars);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005923 return co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005924}
5925
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005926
5927/* For debugging purposes only */
5928#if 0
5929static void
5930dump_instr(const struct instr *i)
5931{
Mark Shannon582aaf12020-08-04 17:30:11 +01005932 const char *jrel = (is_relative_jump(instr)) ? "jrel " : "";
5933 const char *jabs = (is_jump(instr) && !is_relative_jump(instr))? "jabs " : "";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005934 char arg[128];
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005935
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005936 *arg = '\0';
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005937 if (HAS_ARG(i->i_opcode)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005938 sprintf(arg, "arg: %d ", i->i_oparg);
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005939 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005940 fprintf(stderr, "line: %d, opcode: %d %s%s%s\n",
5941 i->i_lineno, i->i_opcode, arg, jabs, jrel);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005942}
5943
5944static void
5945dump_basicblock(const basicblock *b)
5946{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005947 const char *b_return = b->b_return ? "return " : "";
Pablo Galindo60eb9f12020-06-28 01:55:47 +01005948 fprintf(stderr, "used: %d, depth: %d, offset: %d %s\n",
5949 b->b_iused, b->b_startdepth, b->b_offset, b_return);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005950 if (b->b_instr) {
5951 int i;
5952 for (i = 0; i < b->b_iused; i++) {
5953 fprintf(stderr, " [%02d] ", i);
5954 dump_instr(b->b_instr + i);
5955 }
5956 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005957}
5958#endif
5959
Mark Shannon5977a792020-12-02 13:31:40 +00005960
5961static int
5962normalize_basic_block(basicblock *bb);
5963
Mark Shannon6e8128f2020-07-30 10:03:00 +01005964static int
5965optimize_cfg(struct assembler *a, PyObject *consts);
5966
Mark Shannon5977a792020-12-02 13:31:40 +00005967static int
5968ensure_exits_have_lineno(struct compiler *c);
5969
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005970static PyCodeObject *
5971assemble(struct compiler *c, int addNone)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005972{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005973 basicblock *b, *entryblock;
5974 struct assembler a;
Mark Shannoncc75ab72020-11-12 19:49:33 +00005975 int j, nblocks;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005976 PyCodeObject *co = NULL;
Mark Shannon6e8128f2020-07-30 10:03:00 +01005977 PyObject *consts = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005978
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005979 /* Make sure every block that falls off the end returns None.
5980 XXX NEXT_BLOCK() isn't quite right, because if the last
5981 block ends with a jump or return b_next shouldn't set.
5982 */
5983 if (!c->u->u_curblock->b_return) {
Mark Shannon877df852020-11-12 09:43:29 +00005984 c->u->u_lineno = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005985 if (addNone)
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005986 ADDOP_LOAD_CONST(c, Py_None);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005987 ADDOP(c, RETURN_VALUE);
5988 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005989
Mark Shannon5977a792020-12-02 13:31:40 +00005990 for (basicblock *b = c->u->u_blocks; b != NULL; b = b->b_list) {
5991 if (normalize_basic_block(b)) {
5992 goto error;
5993 }
5994 }
5995
5996 if (ensure_exits_have_lineno(c)) {
5997 goto error;
5998 }
5999
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006000 nblocks = 0;
6001 entryblock = NULL;
6002 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
6003 nblocks++;
6004 entryblock = b;
6005 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006006
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006007 /* Set firstlineno if it wasn't explicitly set. */
6008 if (!c->u->u_firstlineno) {
Ned Deilydc35cda2016-08-17 17:18:33 -04006009 if (entryblock && entryblock->b_instr && entryblock->b_instr->i_lineno)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006010 c->u->u_firstlineno = entryblock->b_instr->i_lineno;
Mark Shannon877df852020-11-12 09:43:29 +00006011 else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006012 c->u->u_firstlineno = 1;
6013 }
Mark Shannon5977a792020-12-02 13:31:40 +00006014
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006015 if (!assemble_init(&a, nblocks, c->u->u_firstlineno))
6016 goto error;
Mark Shannoncc75ab72020-11-12 19:49:33 +00006017 a.a_entry = entryblock;
6018 a.a_nblocks = nblocks;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006019
Mark Shannon6e8128f2020-07-30 10:03:00 +01006020 consts = consts_dict_keys_inorder(c->u->u_consts);
6021 if (consts == NULL) {
6022 goto error;
6023 }
6024 if (optimize_cfg(&a, consts)) {
6025 goto error;
6026 }
6027
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006028 /* Can't modify the bytecode after computing jump offsets. */
6029 assemble_jump_offsets(&a, c);
Tim Petersb6c3cea2001-06-26 03:36:28 +00006030
Mark Shannoncc75ab72020-11-12 19:49:33 +00006031 /* Emit code. */
6032 for(b = entryblock; b != NULL; b = b->b_next) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006033 for (j = 0; j < b->b_iused; j++)
6034 if (!assemble_emit(&a, &b->b_instr[j]))
6035 goto error;
6036 }
Mark Shannon877df852020-11-12 09:43:29 +00006037 if (!assemble_line_range(&a)) {
6038 return 0;
6039 }
6040 /* Emit sentinel at end of line number table */
6041 if (!assemble_emit_linetable_pair(&a, 255, -128)) {
6042 goto error;
6043 }
Tim Petersb6c3cea2001-06-26 03:36:28 +00006044
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006045 if (_PyBytes_Resize(&a.a_lnotab, a.a_lnotab_off) < 0)
6046 goto error;
Serhiy Storchakaab874002016-09-11 13:48:15 +03006047 if (_PyBytes_Resize(&a.a_bytecode, a.a_offset * sizeof(_Py_CODEUNIT)) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006048 goto error;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006049
Mark Shannon6e8128f2020-07-30 10:03:00 +01006050 co = makecode(c, &a, consts);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00006051 error:
Mark Shannon6e8128f2020-07-30 10:03:00 +01006052 Py_XDECREF(consts);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006053 assemble_free(&a);
6054 return co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006055}
Georg Brandl8334fd92010-12-04 10:26:46 +00006056
6057#undef PyAST_Compile
Benjamin Petersone5024512018-09-12 12:06:42 -07006058PyCodeObject *
Georg Brandl8334fd92010-12-04 10:26:46 +00006059PyAST_Compile(mod_ty mod, const char *filename, PyCompilerFlags *flags,
6060 PyArena *arena)
6061{
6062 return PyAST_CompileEx(mod, filename, flags, -1, arena);
6063}
Mark Shannon6e8128f2020-07-30 10:03:00 +01006064
6065
6066/* Replace LOAD_CONST c1, LOAD_CONST c2 ... LOAD_CONST cn, BUILD_TUPLE n
6067 with LOAD_CONST (c1, c2, ... cn).
6068 The consts table must still be in list form so that the
6069 new constant (c1, c2, ... cn) can be appended.
6070 Called with codestr pointing to the first LOAD_CONST.
6071*/
6072static int
6073fold_tuple_on_constants(struct instr *inst,
6074 int n, PyObject *consts)
6075{
6076 /* Pre-conditions */
6077 assert(PyList_CheckExact(consts));
6078 assert(inst[n].i_opcode == BUILD_TUPLE);
6079 assert(inst[n].i_oparg == n);
6080
6081 for (int i = 0; i < n; i++) {
6082 if (inst[i].i_opcode != LOAD_CONST) {
6083 return 0;
6084 }
6085 }
6086
6087 /* Buildup new tuple of constants */
6088 PyObject *newconst = PyTuple_New(n);
6089 if (newconst == NULL) {
6090 return -1;
6091 }
6092 for (int i = 0; i < n; i++) {
6093 int arg = inst[i].i_oparg;
6094 PyObject *constant = PyList_GET_ITEM(consts, arg);
6095 Py_INCREF(constant);
6096 PyTuple_SET_ITEM(newconst, i, constant);
6097 }
6098 Py_ssize_t index = PyList_GET_SIZE(consts);
Victor Stinner71f2ff42020-09-23 14:06:55 +02006099 if ((size_t)index >= (size_t)INT_MAX - 1) {
Mark Shannon6e8128f2020-07-30 10:03:00 +01006100 Py_DECREF(newconst);
6101 PyErr_SetString(PyExc_OverflowError, "too many constants");
6102 return -1;
6103 }
Mark Shannon6e8128f2020-07-30 10:03:00 +01006104 if (PyList_Append(consts, newconst)) {
6105 Py_DECREF(newconst);
6106 return -1;
6107 }
6108 Py_DECREF(newconst);
6109 for (int i = 0; i < n; i++) {
6110 inst[i].i_opcode = NOP;
6111 }
6112 inst[n].i_opcode = LOAD_CONST;
Victor Stinner71f2ff42020-09-23 14:06:55 +02006113 inst[n].i_oparg = (int)index;
Mark Shannon6e8128f2020-07-30 10:03:00 +01006114 return 0;
6115}
6116
Mark Shannoncc75ab72020-11-12 19:49:33 +00006117/* Maximum size of basic block that should be copied in optimizer */
6118#define MAX_COPY_SIZE 4
Mark Shannon6e8128f2020-07-30 10:03:00 +01006119
6120/* Optimization */
6121static int
6122optimize_basic_block(basicblock *bb, PyObject *consts)
6123{
6124 assert(PyList_CheckExact(consts));
6125 struct instr nop;
6126 nop.i_opcode = NOP;
6127 struct instr *target;
Mark Shannon6e8128f2020-07-30 10:03:00 +01006128 for (int i = 0; i < bb->b_iused; i++) {
6129 struct instr *inst = &bb->b_instr[i];
6130 int oparg = inst->i_oparg;
6131 int nextop = i+1 < bb->b_iused ? bb->b_instr[i+1].i_opcode : 0;
Mark Shannon582aaf12020-08-04 17:30:11 +01006132 if (is_jump(inst)) {
Mark Shannon6e8128f2020-07-30 10:03:00 +01006133 /* Skip over empty basic blocks. */
6134 while (inst->i_target->b_iused == 0) {
6135 inst->i_target = inst->i_target->b_next;
6136 }
6137 target = &inst->i_target->b_instr[0];
6138 }
6139 else {
6140 target = &nop;
6141 }
6142 switch (inst->i_opcode) {
Mark Shannon266b4622020-11-17 19:30:14 +00006143 /* Remove LOAD_CONST const; conditional jump */
Mark Shannon6e8128f2020-07-30 10:03:00 +01006144 case LOAD_CONST:
Mark Shannon266b4622020-11-17 19:30:14 +00006145 {
6146 PyObject* cnt;
6147 int is_true;
6148 int jump_if_true;
6149 switch(nextop) {
6150 case POP_JUMP_IF_FALSE:
6151 case POP_JUMP_IF_TRUE:
6152 cnt = PyList_GET_ITEM(consts, oparg);
6153 is_true = PyObject_IsTrue(cnt);
6154 if (is_true == -1) {
6155 goto error;
6156 }
6157 inst->i_opcode = NOP;
6158 jump_if_true = nextop == POP_JUMP_IF_TRUE;
6159 if (is_true == jump_if_true) {
6160 bb->b_instr[i+1].i_opcode = JUMP_ABSOLUTE;
6161 bb->b_nofallthrough = 1;
6162 }
6163 else {
6164 bb->b_instr[i+1].i_opcode = NOP;
6165 }
6166 break;
6167 case JUMP_IF_FALSE_OR_POP:
6168 case JUMP_IF_TRUE_OR_POP:
6169 cnt = PyList_GET_ITEM(consts, oparg);
6170 is_true = PyObject_IsTrue(cnt);
6171 if (is_true == -1) {
6172 goto error;
6173 }
6174 jump_if_true = nextop == JUMP_IF_TRUE_OR_POP;
6175 if (is_true == jump_if_true) {
6176 bb->b_instr[i+1].i_opcode = JUMP_ABSOLUTE;
6177 bb->b_nofallthrough = 1;
6178 }
6179 else {
6180 inst->i_opcode = NOP;
6181 bb->b_instr[i+1].i_opcode = NOP;
6182 }
6183 break;
Mark Shannon6e8128f2020-07-30 10:03:00 +01006184 }
6185 break;
Mark Shannon266b4622020-11-17 19:30:14 +00006186 }
Mark Shannon6e8128f2020-07-30 10:03:00 +01006187
6188 /* Try to fold tuples of constants.
6189 Skip over BUILD_SEQN 1 UNPACK_SEQN 1.
6190 Replace BUILD_SEQN 2 UNPACK_SEQN 2 with ROT2.
6191 Replace BUILD_SEQN 3 UNPACK_SEQN 3 with ROT3 ROT2. */
6192 case BUILD_TUPLE:
6193 if (nextop == UNPACK_SEQUENCE && oparg == bb->b_instr[i+1].i_oparg) {
6194 switch(oparg) {
6195 case 1:
6196 inst->i_opcode = NOP;
6197 bb->b_instr[i+1].i_opcode = NOP;
6198 break;
6199 case 2:
6200 inst->i_opcode = ROT_TWO;
6201 bb->b_instr[i+1].i_opcode = NOP;
6202 break;
6203 case 3:
6204 inst->i_opcode = ROT_THREE;
6205 bb->b_instr[i+1].i_opcode = ROT_TWO;
6206 }
6207 break;
6208 }
6209 if (i >= oparg) {
6210 if (fold_tuple_on_constants(inst-oparg, oparg, consts)) {
6211 goto error;
6212 }
6213 }
6214 break;
6215
6216 /* Simplify conditional jump to conditional jump where the
6217 result of the first test implies the success of a similar
6218 test or the failure of the opposite test.
6219 Arises in code like:
6220 "a and b or c"
6221 "(a and b) and c"
6222 "(a or b) or c"
6223 "(a or b) and c"
6224 x:JUMP_IF_FALSE_OR_POP y y:JUMP_IF_FALSE_OR_POP z
6225 --> x:JUMP_IF_FALSE_OR_POP z
6226 x:JUMP_IF_FALSE_OR_POP y y:JUMP_IF_TRUE_OR_POP z
6227 --> x:POP_JUMP_IF_FALSE y+1
6228 where y+1 is the instruction following the second test.
6229 */
6230 case JUMP_IF_FALSE_OR_POP:
6231 switch(target->i_opcode) {
6232 case POP_JUMP_IF_FALSE:
6233 *inst = *target;
Mark Shannon266b4622020-11-17 19:30:14 +00006234 --i;
Mark Shannon6e8128f2020-07-30 10:03:00 +01006235 break;
6236 case JUMP_ABSOLUTE:
6237 case JUMP_FORWARD:
6238 case JUMP_IF_FALSE_OR_POP:
Mark Shannon266b4622020-11-17 19:30:14 +00006239 if (inst->i_target != target->i_target) {
6240 inst->i_target = target->i_target;
6241 --i;
6242 }
Mark Shannon6e8128f2020-07-30 10:03:00 +01006243 break;
6244 case JUMP_IF_TRUE_OR_POP:
6245 assert (inst->i_target->b_iused == 1);
6246 inst->i_opcode = POP_JUMP_IF_FALSE;
6247 inst->i_target = inst->i_target->b_next;
Mark Shannon266b4622020-11-17 19:30:14 +00006248 --i;
Mark Shannon6e8128f2020-07-30 10:03:00 +01006249 break;
6250 }
6251 break;
6252
6253 case JUMP_IF_TRUE_OR_POP:
6254 switch(target->i_opcode) {
6255 case POP_JUMP_IF_TRUE:
6256 *inst = *target;
Mark Shannon266b4622020-11-17 19:30:14 +00006257 --i;
Mark Shannon6e8128f2020-07-30 10:03:00 +01006258 break;
6259 case JUMP_ABSOLUTE:
6260 case JUMP_FORWARD:
6261 case JUMP_IF_TRUE_OR_POP:
Mark Shannon266b4622020-11-17 19:30:14 +00006262 if (inst->i_target != target->i_target) {
6263 inst->i_target = target->i_target;
6264 --i;
6265 }
Mark Shannon6e8128f2020-07-30 10:03:00 +01006266 break;
6267 case JUMP_IF_FALSE_OR_POP:
6268 assert (inst->i_target->b_iused == 1);
6269 inst->i_opcode = POP_JUMP_IF_TRUE;
6270 inst->i_target = inst->i_target->b_next;
Mark Shannon266b4622020-11-17 19:30:14 +00006271 --i;
Mark Shannon6e8128f2020-07-30 10:03:00 +01006272 break;
6273 }
6274 break;
6275
6276 case POP_JUMP_IF_FALSE:
6277 switch(target->i_opcode) {
6278 case JUMP_ABSOLUTE:
6279 case JUMP_FORWARD:
Mark Shannon266b4622020-11-17 19:30:14 +00006280 if (inst->i_target != target->i_target) {
6281 inst->i_target = target->i_target;
6282 --i;
6283 }
Mark Shannon6e8128f2020-07-30 10:03:00 +01006284 break;
6285 }
6286 break;
6287
6288 case POP_JUMP_IF_TRUE:
6289 switch(target->i_opcode) {
6290 case JUMP_ABSOLUTE:
6291 case JUMP_FORWARD:
Mark Shannon266b4622020-11-17 19:30:14 +00006292 if (inst->i_target != target->i_target) {
6293 inst->i_target = target->i_target;
6294 --i;
6295 }
Mark Shannon6e8128f2020-07-30 10:03:00 +01006296 break;
6297 }
6298 break;
6299
6300 case JUMP_ABSOLUTE:
6301 case JUMP_FORWARD:
Mark Shannoncc75ab72020-11-12 19:49:33 +00006302 assert (i == bb->b_iused-1);
Mark Shannon6e8128f2020-07-30 10:03:00 +01006303 switch(target->i_opcode) {
6304 case JUMP_FORWARD:
Mark Shannon266b4622020-11-17 19:30:14 +00006305 if (inst->i_target != target->i_target) {
6306 inst->i_target = target->i_target;
6307 --i;
6308 }
Mark Shannon6e8128f2020-07-30 10:03:00 +01006309 break;
6310 case JUMP_ABSOLUTE:
Mark Shannon266b4622020-11-17 19:30:14 +00006311 if (inst->i_target != target->i_target) {
6312 inst->i_target = target->i_target;
6313 inst->i_opcode = target->i_opcode;
6314 --i;
6315 }
Mark Shannon6e8128f2020-07-30 10:03:00 +01006316 break;
6317 }
Mark Shannoncc75ab72020-11-12 19:49:33 +00006318 if (inst->i_target->b_exit && inst->i_target->b_iused <= MAX_COPY_SIZE) {
6319 basicblock *to_copy = inst->i_target;
6320 *inst = to_copy->b_instr[0];
6321 for (i = 1; i < to_copy->b_iused; i++) {
6322 int index = compiler_next_instr(bb);
6323 if (index < 0) {
6324 return -1;
6325 }
6326 bb->b_instr[index] = to_copy->b_instr[i];
6327 }
6328 bb->b_exit = 1;
6329 }
Mark Shannon6e8128f2020-07-30 10:03:00 +01006330 break;
6331 }
6332 }
6333 return 0;
6334error:
6335 return -1;
6336}
6337
6338
6339static void
6340clean_basic_block(basicblock *bb) {
Mark Shannoncc75ab72020-11-12 19:49:33 +00006341 /* Remove NOPs. */
Mark Shannon6e8128f2020-07-30 10:03:00 +01006342 int dest = 0;
Mark Shannon877df852020-11-12 09:43:29 +00006343 int prev_lineno = -1;
Mark Shannon6e8128f2020-07-30 10:03:00 +01006344 for (int src = 0; src < bb->b_iused; src++) {
Mark Shannon877df852020-11-12 09:43:29 +00006345 int lineno = bb->b_instr[src].i_lineno;
Mark Shannoncc75ab72020-11-12 19:49:33 +00006346 if (bb->b_instr[src].i_opcode == NOP) {
Mark Shannon266b4622020-11-17 19:30:14 +00006347 /* Eliminate no-op if it doesn't have a line number */
Mark Shannoncc75ab72020-11-12 19:49:33 +00006348 if (lineno < 0) {
6349 continue;
6350 }
Mark Shannon266b4622020-11-17 19:30:14 +00006351 /* or, if the previous instruction had the same line number. */
Mark Shannoncc75ab72020-11-12 19:49:33 +00006352 if (prev_lineno == lineno) {
6353 continue;
6354 }
Mark Shannon266b4622020-11-17 19:30:14 +00006355 /* or, if the next instruction has same line number or no line number */
Mark Shannoncc75ab72020-11-12 19:49:33 +00006356 if (src < bb->b_iused - 1) {
6357 int next_lineno = bb->b_instr[src+1].i_lineno;
6358 if (next_lineno < 0 || next_lineno == lineno) {
6359 bb->b_instr[src+1].i_lineno = lineno;
6360 continue;
Mark Shannon877df852020-11-12 09:43:29 +00006361 }
6362 }
Mark Shannon266b4622020-11-17 19:30:14 +00006363 else {
6364 basicblock* next = bb->b_next;
6365 while (next && next->b_iused == 0) {
6366 next = next->b_next;
6367 }
6368 /* or if last instruction in BB and next BB has same line number */
6369 if (next) {
6370 if (lineno == next->b_instr[0].i_lineno) {
6371 continue;
6372 }
6373 }
6374 }
6375
Mark Shannon6e8128f2020-07-30 10:03:00 +01006376 }
Mark Shannoncc75ab72020-11-12 19:49:33 +00006377 if (dest != src) {
6378 bb->b_instr[dest] = bb->b_instr[src];
6379 }
6380 dest++;
6381 prev_lineno = lineno;
Mark Shannon6e8128f2020-07-30 10:03:00 +01006382 }
Mark Shannon6e8128f2020-07-30 10:03:00 +01006383 assert(dest <= bb->b_iused);
6384 bb->b_iused = dest;
6385}
6386
Mark Shannon266b4622020-11-17 19:30:14 +00006387static int
6388normalize_basic_block(basicblock *bb) {
6389 /* Mark blocks as exit and/or nofallthrough.
6390 Raise SystemError if CFG is malformed. */
Mark Shannoncc75ab72020-11-12 19:49:33 +00006391 for (int i = 0; i < bb->b_iused; i++) {
6392 switch(bb->b_instr[i].i_opcode) {
6393 case RETURN_VALUE:
6394 case RAISE_VARARGS:
6395 case RERAISE:
Mark Shannoncc75ab72020-11-12 19:49:33 +00006396 bb->b_exit = 1;
Mark Shannon5977a792020-12-02 13:31:40 +00006397 bb->b_nofallthrough = 1;
6398 break;
Mark Shannoncc75ab72020-11-12 19:49:33 +00006399 case JUMP_ABSOLUTE:
6400 case JUMP_FORWARD:
Mark Shannoncc75ab72020-11-12 19:49:33 +00006401 bb->b_nofallthrough = 1;
Mark Shannon266b4622020-11-17 19:30:14 +00006402 /* fall through */
6403 case POP_JUMP_IF_FALSE:
6404 case POP_JUMP_IF_TRUE:
6405 case JUMP_IF_FALSE_OR_POP:
6406 case JUMP_IF_TRUE_OR_POP:
Mark Shannon5977a792020-12-02 13:31:40 +00006407 case FOR_ITER:
Mark Shannon266b4622020-11-17 19:30:14 +00006408 if (i != bb->b_iused-1) {
6409 PyErr_SetString(PyExc_SystemError, "malformed control flow graph.");
6410 return -1;
6411 }
Mark Shannon5977a792020-12-02 13:31:40 +00006412 /* Skip over empty basic blocks. */
6413 while (bb->b_instr[i].i_target->b_iused == 0) {
6414 bb->b_instr[i].i_target = bb->b_instr[i].i_target->b_next;
6415 }
6416
Mark Shannoncc75ab72020-11-12 19:49:33 +00006417 }
6418 }
Mark Shannon266b4622020-11-17 19:30:14 +00006419 return 0;
Mark Shannoncc75ab72020-11-12 19:49:33 +00006420}
6421
Mark Shannon6e8128f2020-07-30 10:03:00 +01006422static int
6423mark_reachable(struct assembler *a) {
6424 basicblock **stack, **sp;
6425 sp = stack = (basicblock **)PyObject_Malloc(sizeof(basicblock *) * a->a_nblocks);
6426 if (stack == NULL) {
6427 return -1;
6428 }
Mark Shannoncc75ab72020-11-12 19:49:33 +00006429 a->a_entry->b_reachable = 1;
6430 *sp++ = a->a_entry;
Mark Shannon6e8128f2020-07-30 10:03:00 +01006431 while (sp > stack) {
6432 basicblock *b = *(--sp);
Mark Shannoncc75ab72020-11-12 19:49:33 +00006433 if (b->b_next && !b->b_nofallthrough && b->b_next->b_reachable == 0) {
Mark Shannon6e8128f2020-07-30 10:03:00 +01006434 b->b_next->b_reachable = 1;
6435 *sp++ = b->b_next;
6436 }
6437 for (int i = 0; i < b->b_iused; i++) {
6438 basicblock *target;
Mark Shannon582aaf12020-08-04 17:30:11 +01006439 if (is_jump(&b->b_instr[i])) {
Mark Shannon6e8128f2020-07-30 10:03:00 +01006440 target = b->b_instr[i].i_target;
6441 if (target->b_reachable == 0) {
6442 target->b_reachable = 1;
6443 *sp++ = target;
6444 }
6445 }
6446 }
6447 }
6448 PyObject_Free(stack);
6449 return 0;
6450}
6451
Mark Shannon5977a792020-12-02 13:31:40 +00006452/* If an instruction has no line number, but it's predecessor in the BB does,
6453 * then copy the line number. This reduces the size of the line number table,
6454 * but has no impact on the generated line number events.
6455 */
6456static void
6457minimize_lineno_table(struct assembler *a) {
6458 for (basicblock *b = a->a_entry; b != NULL; b = b->b_next) {
6459 int prev_lineno = -1;
6460 for (int i = 0; i < b->b_iused; i++) {
6461 if (b->b_instr[i].i_lineno < 0) {
6462 b->b_instr[i].i_lineno = prev_lineno;
6463 }
6464 else {
6465 prev_lineno = b->b_instr[i].i_lineno;
6466 }
6467 }
Mark Shannon6e8128f2020-07-30 10:03:00 +01006468
Mark Shannon5977a792020-12-02 13:31:40 +00006469 }
6470}
6471
6472/* Perform optimizations on a control flow graph.
Mark Shannon6e8128f2020-07-30 10:03:00 +01006473 The consts object should still be in list form to allow new constants
6474 to be appended.
6475
6476 All transformations keep the code size the same or smaller.
6477 For those that reduce size, the gaps are initially filled with
6478 NOPs. Later those NOPs are removed.
6479*/
6480
6481static int
6482optimize_cfg(struct assembler *a, PyObject *consts)
6483{
Mark Shannoncc75ab72020-11-12 19:49:33 +00006484 for (basicblock *b = a->a_entry; b != NULL; b = b->b_next) {
Mark Shannoncc75ab72020-11-12 19:49:33 +00006485 if (optimize_basic_block(b, consts)) {
Mark Shannon6e8128f2020-07-30 10:03:00 +01006486 return -1;
6487 }
Mark Shannoncc75ab72020-11-12 19:49:33 +00006488 clean_basic_block(b);
6489 assert(b->b_reachable == 0);
Mark Shannon6e8128f2020-07-30 10:03:00 +01006490 }
6491 if (mark_reachable(a)) {
6492 return -1;
6493 }
6494 /* Delete unreachable instructions */
Mark Shannoncc75ab72020-11-12 19:49:33 +00006495 for (basicblock *b = a->a_entry; b != NULL; b = b->b_next) {
6496 if (b->b_reachable == 0) {
6497 b->b_iused = 0;
Mark Shannon6e8128f2020-07-30 10:03:00 +01006498 }
6499 }
Mark Shannon5977a792020-12-02 13:31:40 +00006500 minimize_lineno_table(a);
Mark Shannon6e8128f2020-07-30 10:03:00 +01006501 return 0;
6502}
6503
Mark Shannon5977a792020-12-02 13:31:40 +00006504static inline int
6505is_exit_without_lineno(basicblock *b) {
6506 return b->b_exit && b->b_instr[0].i_lineno < 0;
6507}
6508
6509/* PEP 626 mandates that the f_lineno of a frame is correct
6510 * after a frame terminates. It would be prohibitively expensive
6511 * to continuously update the f_lineno field at runtime,
6512 * so we make sure that all exiting instruction (raises and returns)
6513 * have a valid line number, allowing us to compute f_lineno lazily.
6514 * We can do this by duplicating the exit blocks without line number
6515 * so that none have more than one predecessor. We can then safely
6516 * copy the line number from the sole predecessor block.
6517 */
6518static int
6519ensure_exits_have_lineno(struct compiler *c)
6520{
Mark Shannoneaccc122020-12-04 15:22:12 +00006521 basicblock *entry = NULL;
Mark Shannon5977a792020-12-02 13:31:40 +00006522 /* Copy all exit blocks without line number that are targets of a jump.
6523 */
6524 for (basicblock *b = c->u->u_blocks; b != NULL; b = b->b_list) {
6525 if (b->b_iused > 0 && is_jump(&b->b_instr[b->b_iused-1])) {
6526 switch (b->b_instr[b->b_iused-1].i_opcode) {
6527 /* Note: Only actual jumps, not exception handlers */
6528 case SETUP_ASYNC_WITH:
6529 case SETUP_WITH:
6530 case SETUP_FINALLY:
6531 continue;
6532 }
6533 basicblock *target = b->b_instr[b->b_iused-1].i_target;
6534 if (is_exit_without_lineno(target)) {
6535 basicblock *new_target = compiler_copy_block(c, target);
6536 if (new_target == NULL) {
6537 return -1;
6538 }
6539 new_target->b_instr[0].i_lineno = b->b_instr[b->b_iused-1].i_lineno;
6540 b->b_instr[b->b_iused-1].i_target = new_target;
6541 }
6542 }
Mark Shannoneaccc122020-12-04 15:22:12 +00006543 entry = b;
6544 }
6545 assert(entry != NULL);
6546 if (is_exit_without_lineno(entry)) {
6547 entry->b_instr[0].i_lineno = c->u->u_firstlineno;
Mark Shannon5977a792020-12-02 13:31:40 +00006548 }
6549 /* Any remaining reachable exit blocks without line number can only be reached by
6550 * fall through, and thus can only have a single predecessor */
6551 for (basicblock *b = c->u->u_blocks; b != NULL; b = b->b_list) {
6552 if (!b->b_nofallthrough && b->b_next && b->b_iused > 0) {
6553 if (is_exit_without_lineno(b->b_next)) {
6554 assert(b->b_next->b_iused > 0);
6555 b->b_next->b_instr[0].i_lineno = b->b_instr[b->b_iused-1].i_lineno;
6556 }
6557 }
6558 }
6559 return 0;
6560}
6561
6562
Mark Shannon6e8128f2020-07-30 10:03:00 +01006563/* Retained for API compatibility.
6564 * Optimization is now done in optimize_cfg */
6565
6566PyObject *
6567PyCode_Optimize(PyObject *code, PyObject* Py_UNUSED(consts),
6568 PyObject *Py_UNUSED(names), PyObject *Py_UNUSED(lnotab_obj))
6569{
6570 Py_INCREF(code);
6571 return code;
6572}
6573