blob: ae92869fc9565b412c9f7e8717fadefc9a8c0e5d [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);
Mark Shannon8473cf82020-12-15 11:07:50 +0000231
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
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001575/* Search if variable annotations are present statically in a block. */
1576
1577static int
Pablo Galindoa5634c42020-09-16 19:42:00 +01001578find_ann(asdl_stmt_seq *stmts)
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001579{
1580 int i, j, res = 0;
1581 stmt_ty st;
1582
1583 for (i = 0; i < asdl_seq_LEN(stmts); i++) {
1584 st = (stmt_ty)asdl_seq_GET(stmts, i);
1585 switch (st->kind) {
1586 case AnnAssign_kind:
1587 return 1;
1588 case For_kind:
1589 res = find_ann(st->v.For.body) ||
1590 find_ann(st->v.For.orelse);
1591 break;
1592 case AsyncFor_kind:
1593 res = find_ann(st->v.AsyncFor.body) ||
1594 find_ann(st->v.AsyncFor.orelse);
1595 break;
1596 case While_kind:
1597 res = find_ann(st->v.While.body) ||
1598 find_ann(st->v.While.orelse);
1599 break;
1600 case If_kind:
1601 res = find_ann(st->v.If.body) ||
1602 find_ann(st->v.If.orelse);
1603 break;
1604 case With_kind:
1605 res = find_ann(st->v.With.body);
1606 break;
1607 case AsyncWith_kind:
1608 res = find_ann(st->v.AsyncWith.body);
1609 break;
1610 case Try_kind:
1611 for (j = 0; j < asdl_seq_LEN(st->v.Try.handlers); j++) {
1612 excepthandler_ty handler = (excepthandler_ty)asdl_seq_GET(
1613 st->v.Try.handlers, j);
1614 if (find_ann(handler->v.ExceptHandler.body)) {
1615 return 1;
1616 }
1617 }
1618 res = find_ann(st->v.Try.body) ||
1619 find_ann(st->v.Try.finalbody) ||
1620 find_ann(st->v.Try.orelse);
1621 break;
1622 default:
1623 res = 0;
1624 }
1625 if (res) {
1626 break;
1627 }
1628 }
1629 return res;
1630}
1631
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001632/*
1633 * Frame block handling functions
1634 */
1635
1636static int
1637compiler_push_fblock(struct compiler *c, enum fblocktype t, basicblock *b,
Mark Shannonfee55262019-11-21 09:11:43 +00001638 basicblock *exit, void *datum)
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001639{
1640 struct fblockinfo *f;
1641 if (c->u->u_nfblocks >= CO_MAXBLOCKS) {
Mark Shannon02d126a2020-09-25 14:04:19 +01001642 return compiler_error(c, "too many statically nested blocks");
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001643 }
1644 f = &c->u->u_fblock[c->u->u_nfblocks++];
1645 f->fb_type = t;
1646 f->fb_block = b;
1647 f->fb_exit = exit;
Mark Shannonfee55262019-11-21 09:11:43 +00001648 f->fb_datum = datum;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001649 return 1;
1650}
1651
1652static void
1653compiler_pop_fblock(struct compiler *c, enum fblocktype t, basicblock *b)
1654{
1655 struct compiler_unit *u = c->u;
1656 assert(u->u_nfblocks > 0);
1657 u->u_nfblocks--;
1658 assert(u->u_fblock[u->u_nfblocks].fb_type == t);
1659 assert(u->u_fblock[u->u_nfblocks].fb_block == b);
1660}
1661
Mark Shannonfee55262019-11-21 09:11:43 +00001662static int
1663compiler_call_exit_with_nones(struct compiler *c) {
1664 ADDOP_O(c, LOAD_CONST, Py_None, consts);
1665 ADDOP(c, DUP_TOP);
1666 ADDOP(c, DUP_TOP);
1667 ADDOP_I(c, CALL_FUNCTION, 3);
1668 return 1;
1669}
1670
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001671/* Unwind a frame block. If preserve_tos is true, the TOS before
Mark Shannonfee55262019-11-21 09:11:43 +00001672 * popping the blocks will be restored afterwards, unless another
1673 * return, break or continue is found. In which case, the TOS will
1674 * be popped.
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001675 */
1676static int
1677compiler_unwind_fblock(struct compiler *c, struct fblockinfo *info,
1678 int preserve_tos)
1679{
1680 switch (info->fb_type) {
1681 case WHILE_LOOP:
Mark Shannon02d126a2020-09-25 14:04:19 +01001682 case EXCEPTION_HANDLER:
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001683 return 1;
1684
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001685 case FOR_LOOP:
1686 /* Pop the iterator */
1687 if (preserve_tos) {
1688 ADDOP(c, ROT_TWO);
1689 }
1690 ADDOP(c, POP_TOP);
1691 return 1;
1692
Mark Shannon02d126a2020-09-25 14:04:19 +01001693 case TRY_EXCEPT:
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001694 ADDOP(c, POP_BLOCK);
1695 return 1;
1696
1697 case FINALLY_TRY:
1698 ADDOP(c, POP_BLOCK);
Serhiy Storchakaef61c522019-08-24 13:11:52 +03001699 if (preserve_tos) {
Mark Shannonfee55262019-11-21 09:11:43 +00001700 if (!compiler_push_fblock(c, POP_VALUE, NULL, NULL, NULL)) {
1701 return 0;
1702 }
Serhiy Storchakaef61c522019-08-24 13:11:52 +03001703 }
Mark Shannon88dce262019-12-30 09:53:36 +00001704 /* Emit the finally block, restoring the line number when done */
1705 int saved_lineno = c->u->u_lineno;
Mark Shannonfee55262019-11-21 09:11:43 +00001706 VISIT_SEQ(c, stmt, info->fb_datum);
Mark Shannon88dce262019-12-30 09:53:36 +00001707 c->u->u_lineno = saved_lineno;
Mark Shannonfee55262019-11-21 09:11:43 +00001708 if (preserve_tos) {
1709 compiler_pop_fblock(c, POP_VALUE, NULL);
Serhiy Storchakaef61c522019-08-24 13:11:52 +03001710 }
1711 return 1;
Mark Shannon13bc1392020-01-23 09:25:17 +00001712
Mark Shannonfee55262019-11-21 09:11:43 +00001713 case FINALLY_END:
1714 if (preserve_tos) {
1715 ADDOP(c, ROT_FOUR);
1716 }
1717 ADDOP(c, POP_TOP);
1718 ADDOP(c, POP_TOP);
1719 ADDOP(c, POP_TOP);
1720 if (preserve_tos) {
1721 ADDOP(c, ROT_FOUR);
1722 }
1723 ADDOP(c, POP_EXCEPT);
1724 return 1;
Serhiy Storchakaef61c522019-08-24 13:11:52 +03001725
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001726 case WITH:
1727 case ASYNC_WITH:
1728 ADDOP(c, POP_BLOCK);
1729 if (preserve_tos) {
1730 ADDOP(c, ROT_TWO);
1731 }
Mark Shannonfee55262019-11-21 09:11:43 +00001732 if(!compiler_call_exit_with_nones(c)) {
1733 return 0;
1734 }
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001735 if (info->fb_type == ASYNC_WITH) {
1736 ADDOP(c, GET_AWAITABLE);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001737 ADDOP_LOAD_CONST(c, Py_None);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001738 ADDOP(c, YIELD_FROM);
1739 }
Mark Shannonfee55262019-11-21 09:11:43 +00001740 ADDOP(c, POP_TOP);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001741 return 1;
1742
1743 case HANDLER_CLEANUP:
Mark Shannonfee55262019-11-21 09:11:43 +00001744 if (info->fb_datum) {
1745 ADDOP(c, POP_BLOCK);
1746 }
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001747 if (preserve_tos) {
1748 ADDOP(c, ROT_FOUR);
1749 }
Mark Shannonfee55262019-11-21 09:11:43 +00001750 ADDOP(c, POP_EXCEPT);
1751 if (info->fb_datum) {
1752 ADDOP_LOAD_CONST(c, Py_None);
1753 compiler_nameop(c, info->fb_datum, Store);
1754 compiler_nameop(c, info->fb_datum, Del);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001755 }
Mark Shannonfee55262019-11-21 09:11:43 +00001756 return 1;
1757
1758 case POP_VALUE:
1759 if (preserve_tos) {
1760 ADDOP(c, ROT_TWO);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001761 }
Mark Shannonfee55262019-11-21 09:11:43 +00001762 ADDOP(c, POP_TOP);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001763 return 1;
1764 }
1765 Py_UNREACHABLE();
1766}
1767
Mark Shannonfee55262019-11-21 09:11:43 +00001768/** Unwind block stack. If loop is not NULL, then stop when the first loop is encountered. */
1769static int
1770compiler_unwind_fblock_stack(struct compiler *c, int preserve_tos, struct fblockinfo **loop) {
1771 if (c->u->u_nfblocks == 0) {
1772 return 1;
1773 }
1774 struct fblockinfo *top = &c->u->u_fblock[c->u->u_nfblocks-1];
1775 if (loop != NULL && (top->fb_type == WHILE_LOOP || top->fb_type == FOR_LOOP)) {
1776 *loop = top;
1777 return 1;
1778 }
1779 struct fblockinfo copy = *top;
1780 c->u->u_nfblocks--;
1781 if (!compiler_unwind_fblock(c, &copy, preserve_tos)) {
1782 return 0;
1783 }
1784 if (!compiler_unwind_fblock_stack(c, preserve_tos, loop)) {
1785 return 0;
1786 }
1787 c->u->u_fblock[c->u->u_nfblocks] = copy;
1788 c->u->u_nfblocks++;
1789 return 1;
1790}
1791
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001792/* Compile a sequence of statements, checking for a docstring
1793 and for annotations. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001794
1795static int
Pablo Galindoa5634c42020-09-16 19:42:00 +01001796compiler_body(struct compiler *c, asdl_stmt_seq *stmts)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001797{
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001798 int i = 0;
1799 stmt_ty st;
Serhiy Storchaka143ce5c2018-05-30 10:56:16 +03001800 PyObject *docstring;
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001801
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001802 /* Set current line number to the line number of first statement.
1803 This way line number for SETUP_ANNOTATIONS will always
1804 coincide with the line number of first "real" statement in module.
Hansraj Das01171eb2019-10-09 07:54:02 +05301805 If body is empty, then lineno will be set later in assemble. */
Serhiy Storchaka61cb3d02020-03-17 18:07:30 +02001806 if (c->u->u_scope_type == COMPILER_SCOPE_MODULE && asdl_seq_LEN(stmts)) {
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001807 st = (stmt_ty)asdl_seq_GET(stmts, 0);
Serhiy Storchaka61cb3d02020-03-17 18:07:30 +02001808 SET_LOC(c, st);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001809 }
1810 /* Every annotated class and module should have __annotations__. */
1811 if (find_ann(stmts)) {
1812 ADDOP(c, SETUP_ANNOTATIONS);
1813 }
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001814 if (!asdl_seq_LEN(stmts))
1815 return 1;
INADA Naokicb41b272017-02-23 00:31:59 +09001816 /* if not -OO mode, set docstring */
Serhiy Storchaka143ce5c2018-05-30 10:56:16 +03001817 if (c->c_optimize < 2) {
1818 docstring = _PyAST_GetDocString(stmts);
1819 if (docstring) {
1820 i = 1;
1821 st = (stmt_ty)asdl_seq_GET(stmts, 0);
1822 assert(st->kind == Expr_kind);
1823 VISIT(c, expr, st->v.Expr.value);
1824 if (!compiler_nameop(c, __doc__, Store))
1825 return 0;
1826 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001827 }
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001828 for (; i < asdl_seq_LEN(stmts); i++)
1829 VISIT(c, stmt, (stmt_ty)asdl_seq_GET(stmts, i));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001830 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001831}
1832
1833static PyCodeObject *
1834compiler_mod(struct compiler *c, mod_ty mod)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001835{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001836 PyCodeObject *co;
1837 int addNone = 1;
1838 static PyObject *module;
1839 if (!module) {
1840 module = PyUnicode_InternFromString("<module>");
1841 if (!module)
1842 return NULL;
1843 }
1844 /* Use 0 for firstlineno initially, will fixup in assemble(). */
Mark Shannon877df852020-11-12 09:43:29 +00001845 if (!compiler_enter_scope(c, module, COMPILER_SCOPE_MODULE, mod, 1))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001846 return NULL;
1847 switch (mod->kind) {
1848 case Module_kind:
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001849 if (!compiler_body(c, mod->v.Module.body)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001850 compiler_exit_scope(c);
1851 return 0;
1852 }
1853 break;
1854 case Interactive_kind:
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001855 if (find_ann(mod->v.Interactive.body)) {
1856 ADDOP(c, SETUP_ANNOTATIONS);
1857 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001858 c->c_interactive = 1;
Pablo Galindoa5634c42020-09-16 19:42:00 +01001859 VISIT_SEQ_IN_SCOPE(c, stmt, mod->v.Interactive.body);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001860 break;
1861 case Expression_kind:
1862 VISIT_IN_SCOPE(c, expr, mod->v.Expression.body);
1863 addNone = 0;
1864 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001865 default:
1866 PyErr_Format(PyExc_SystemError,
1867 "module kind %d should not be possible",
1868 mod->kind);
1869 return 0;
1870 }
1871 co = assemble(c, addNone);
1872 compiler_exit_scope(c);
1873 return co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001874}
1875
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001876/* The test for LOCAL must come before the test for FREE in order to
1877 handle classes where name is both local and free. The local var is
1878 a method and the free var is a free var referenced within a method.
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001879*/
1880
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001881static int
1882get_ref_type(struct compiler *c, PyObject *name)
1883{
Victor Stinner0b1bc562013-05-16 22:17:17 +02001884 int scope;
Benjamin Peterson312595c2013-05-15 15:26:42 -05001885 if (c->u->u_scope_type == COMPILER_SCOPE_CLASS &&
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02001886 _PyUnicode_EqualToASCIIString(name, "__class__"))
Benjamin Peterson312595c2013-05-15 15:26:42 -05001887 return CELL;
Victor Stinner0b1bc562013-05-16 22:17:17 +02001888 scope = PyST_GetScope(c->u->u_ste, name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001889 if (scope == 0) {
Victor Stinner87d3b9d2020-03-25 19:27:36 +01001890 _Py_FatalErrorFormat(__func__,
1891 "unknown scope for %.100s in %.100s(%s)\n"
1892 "symbols: %s\nlocals: %s\nglobals: %s",
1893 PyUnicode_AsUTF8(name),
1894 PyUnicode_AsUTF8(c->u->u_name),
1895 PyUnicode_AsUTF8(PyObject_Repr(c->u->u_ste->ste_id)),
1896 PyUnicode_AsUTF8(PyObject_Repr(c->u->u_ste->ste_symbols)),
1897 PyUnicode_AsUTF8(PyObject_Repr(c->u->u_varnames)),
1898 PyUnicode_AsUTF8(PyObject_Repr(c->u->u_names)));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001899 }
Tim Peters2a7f3842001-06-09 09:26:21 +00001900
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001901 return scope;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001902}
1903
1904static int
1905compiler_lookup_arg(PyObject *dict, PyObject *name)
1906{
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001907 PyObject *v;
Serhiy Storchakafb5db7e2020-10-26 08:43:39 +02001908 v = PyDict_GetItemWithError(dict, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001909 if (v == NULL)
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00001910 return -1;
Christian Heimes217cfd12007-12-02 14:31:20 +00001911 return PyLong_AS_LONG(v);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001912}
1913
1914static int
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001915compiler_make_closure(struct compiler *c, PyCodeObject *co, Py_ssize_t flags, PyObject *qualname)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001916{
Victor Stinnerad9a0662013-11-19 22:23:20 +01001917 Py_ssize_t i, free = PyCode_GetNumFree(co);
Antoine Pitrou86a36b52011-11-25 18:56:07 +01001918 if (qualname == NULL)
1919 qualname = co->co_name;
1920
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001921 if (free) {
1922 for (i = 0; i < free; ++i) {
1923 /* Bypass com_addop_varname because it will generate
1924 LOAD_DEREF but LOAD_CLOSURE is needed.
1925 */
1926 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
1927 int arg, reftype;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001928
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001929 /* Special case: If a class contains a method with a
1930 free variable that has the same name as a method,
1931 the name will be considered free *and* local in the
1932 class. It should be handled by the closure, as
Min ho Kimc4cacc82019-07-31 08:16:13 +10001933 well as by the normal name lookup logic.
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001934 */
1935 reftype = get_ref_type(c, name);
1936 if (reftype == CELL)
1937 arg = compiler_lookup_arg(c->u->u_cellvars, name);
1938 else /* (reftype == FREE) */
1939 arg = compiler_lookup_arg(c->u->u_freevars, name);
1940 if (arg == -1) {
Victor Stinner87d3b9d2020-03-25 19:27:36 +01001941 _Py_FatalErrorFormat(__func__,
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001942 "lookup %s in %s %d %d\n"
1943 "freevars of %s: %s\n",
1944 PyUnicode_AsUTF8(PyObject_Repr(name)),
1945 PyUnicode_AsUTF8(c->u->u_name),
1946 reftype, arg,
1947 PyUnicode_AsUTF8(co->co_name),
1948 PyUnicode_AsUTF8(PyObject_Repr(co->co_freevars)));
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001949 }
1950 ADDOP_I(c, LOAD_CLOSURE, arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001951 }
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001952 flags |= 0x08;
1953 ADDOP_I(c, BUILD_TUPLE, free);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001954 }
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001955 ADDOP_LOAD_CONST(c, (PyObject*)co);
1956 ADDOP_LOAD_CONST(c, qualname);
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001957 ADDOP_I(c, MAKE_FUNCTION, flags);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001958 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001959}
1960
1961static int
Pablo Galindoa5634c42020-09-16 19:42:00 +01001962compiler_decorators(struct compiler *c, asdl_expr_seq* decos)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001963{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001964 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001965
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001966 if (!decos)
1967 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001968
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001969 for (i = 0; i < asdl_seq_LEN(decos); i++) {
1970 VISIT(c, expr, (expr_ty)asdl_seq_GET(decos, i));
1971 }
1972 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001973}
1974
1975static int
Pablo Galindoa5634c42020-09-16 19:42:00 +01001976compiler_visit_kwonlydefaults(struct compiler *c, asdl_arg_seq *kwonlyargs,
1977 asdl_expr_seq *kw_defaults)
Guido van Rossum4f72a782006-10-27 23:31:49 +00001978{
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03001979 /* Push a dict of keyword-only default values.
1980
1981 Return 0 on error, -1 if no dict pushed, 1 if a dict is pushed.
1982 */
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001983 int i;
1984 PyObject *keys = NULL;
1985
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001986 for (i = 0; i < asdl_seq_LEN(kwonlyargs); i++) {
1987 arg_ty arg = asdl_seq_GET(kwonlyargs, i);
1988 expr_ty default_ = asdl_seq_GET(kw_defaults, i);
1989 if (default_) {
Benjamin Peterson32c59b62012-04-17 19:53:21 -04001990 PyObject *mangled = _Py_Mangle(c->u->u_private, arg->arg);
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001991 if (!mangled) {
1992 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001993 }
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001994 if (keys == NULL) {
1995 keys = PyList_New(1);
1996 if (keys == NULL) {
1997 Py_DECREF(mangled);
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03001998 return 0;
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001999 }
2000 PyList_SET_ITEM(keys, 0, mangled);
2001 }
2002 else {
2003 int res = PyList_Append(keys, mangled);
2004 Py_DECREF(mangled);
2005 if (res == -1) {
2006 goto error;
2007 }
2008 }
2009 if (!compiler_visit_expr(c, default_)) {
2010 goto error;
2011 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002012 }
2013 }
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002014 if (keys != NULL) {
2015 Py_ssize_t default_count = PyList_GET_SIZE(keys);
2016 PyObject *keys_tuple = PyList_AsTuple(keys);
2017 Py_DECREF(keys);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03002018 ADDOP_LOAD_CONST_NEW(c, keys_tuple);
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002019 ADDOP_I(c, BUILD_CONST_KEY_MAP, default_count);
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03002020 assert(default_count > 0);
2021 return 1;
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002022 }
2023 else {
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03002024 return -1;
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002025 }
2026
2027error:
2028 Py_XDECREF(keys);
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03002029 return 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +00002030}
2031
2032static int
Guido van Rossum95e4d582018-01-26 08:20:18 -08002033compiler_visit_annexpr(struct compiler *c, expr_ty annotation)
2034{
Serhiy Storchaka64fddc42018-05-17 06:17:48 +03002035 ADDOP_LOAD_CONST_NEW(c, _PyAST_ExprAsUnicode(annotation));
Guido van Rossum95e4d582018-01-26 08:20:18 -08002036 return 1;
2037}
2038
2039static int
Neal Norwitzc1505362006-12-28 06:47:50 +00002040compiler_visit_argannotation(struct compiler *c, identifier id,
Yurii Karabas73019792020-11-25 12:43:18 +02002041 expr_ty annotation, Py_ssize_t *annotations_len)
Neal Norwitzc1505362006-12-28 06:47:50 +00002042{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002043 if (annotation) {
Yurii Karabas73019792020-11-25 12:43:18 +02002044 PyObject *mangled = _Py_Mangle(c->u->u_private, id);
Yury Selivanov34ce99f2014-02-18 12:49:41 -05002045 if (!mangled)
Yury Selivanovf315c1c2015-07-23 09:10:44 +03002046 return 0;
Yurii Karabas73019792020-11-25 12:43:18 +02002047
2048 ADDOP_LOAD_CONST(c, mangled);
Yury Selivanov34ce99f2014-02-18 12:49:41 -05002049 Py_DECREF(mangled);
Yurii Karabas73019792020-11-25 12:43:18 +02002050 VISIT(c, annexpr, annotation);
2051 *annotations_len += 2;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002052 }
Yury Selivanovf315c1c2015-07-23 09:10:44 +03002053 return 1;
Neal Norwitzc1505362006-12-28 06:47:50 +00002054}
2055
2056static int
Pablo Galindoa5634c42020-09-16 19:42:00 +01002057compiler_visit_argannotations(struct compiler *c, asdl_arg_seq* args,
Yurii Karabas73019792020-11-25 12:43:18 +02002058 Py_ssize_t *annotations_len)
Neal Norwitzc1505362006-12-28 06:47:50 +00002059{
Yury Selivanovf315c1c2015-07-23 09:10:44 +03002060 int i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002061 for (i = 0; i < asdl_seq_LEN(args); i++) {
2062 arg_ty arg = (arg_ty)asdl_seq_GET(args, i);
Yury Selivanovf315c1c2015-07-23 09:10:44 +03002063 if (!compiler_visit_argannotation(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002064 c,
2065 arg->arg,
2066 arg->annotation,
Yurii Karabas73019792020-11-25 12:43:18 +02002067 annotations_len))
Yury Selivanovf315c1c2015-07-23 09:10:44 +03002068 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002069 }
Yury Selivanovf315c1c2015-07-23 09:10:44 +03002070 return 1;
Neal Norwitzc1505362006-12-28 06:47:50 +00002071}
2072
2073static int
2074compiler_visit_annotations(struct compiler *c, arguments_ty args,
2075 expr_ty returns)
2076{
Yurii Karabas73019792020-11-25 12:43:18 +02002077 /* Push arg annotation names and values.
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002078 The expressions are evaluated out-of-order wrt the source code.
Neal Norwitzc1505362006-12-28 06:47:50 +00002079
Yurii Karabas73019792020-11-25 12:43:18 +02002080 Return 0 on error, -1 if no annotations pushed, 1 if a annotations is pushed.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002081 */
2082 static identifier return_str;
Yurii Karabas73019792020-11-25 12:43:18 +02002083 Py_ssize_t annotations_len = 0;
Neal Norwitzc1505362006-12-28 06:47:50 +00002084
Yurii Karabas73019792020-11-25 12:43:18 +02002085 if (!compiler_visit_argannotations(c, args->args, &annotations_len))
2086 return 0;
2087 if (!compiler_visit_argannotations(c, args->posonlyargs, &annotations_len))
2088 return 0;
Benjamin Petersoncda75be2013-03-18 10:48:58 -07002089 if (args->vararg && args->vararg->annotation &&
Yury Selivanovf315c1c2015-07-23 09:10:44 +03002090 !compiler_visit_argannotation(c, args->vararg->arg,
Yurii Karabas73019792020-11-25 12:43:18 +02002091 args->vararg->annotation, &annotations_len))
2092 return 0;
2093 if (!compiler_visit_argannotations(c, args->kwonlyargs, &annotations_len))
2094 return 0;
Benjamin Petersoncda75be2013-03-18 10:48:58 -07002095 if (args->kwarg && args->kwarg->annotation &&
Yury Selivanovf315c1c2015-07-23 09:10:44 +03002096 !compiler_visit_argannotation(c, args->kwarg->arg,
Yurii Karabas73019792020-11-25 12:43:18 +02002097 args->kwarg->annotation, &annotations_len))
2098 return 0;
Neal Norwitzc1505362006-12-28 06:47:50 +00002099
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002100 if (!return_str) {
2101 return_str = PyUnicode_InternFromString("return");
2102 if (!return_str)
Yurii Karabas73019792020-11-25 12:43:18 +02002103 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002104 }
Yurii Karabas73019792020-11-25 12:43:18 +02002105 if (!compiler_visit_argannotation(c, return_str, returns, &annotations_len)) {
2106 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002107 }
2108
Yurii Karabas73019792020-11-25 12:43:18 +02002109 if (annotations_len) {
2110 ADDOP_I(c, BUILD_TUPLE, annotations_len);
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03002111 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002112 }
Neal Norwitzc1505362006-12-28 06:47:50 +00002113
Yurii Karabas73019792020-11-25 12:43:18 +02002114 return -1;
Neal Norwitzc1505362006-12-28 06:47:50 +00002115}
2116
2117static int
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03002118compiler_visit_defaults(struct compiler *c, arguments_ty args)
2119{
2120 VISIT_SEQ(c, expr, args->defaults);
2121 ADDOP_I(c, BUILD_TUPLE, asdl_seq_LEN(args->defaults));
2122 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002123}
2124
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002125static Py_ssize_t
2126compiler_default_arguments(struct compiler *c, arguments_ty args)
2127{
2128 Py_ssize_t funcflags = 0;
2129 if (args->defaults && asdl_seq_LEN(args->defaults) > 0) {
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03002130 if (!compiler_visit_defaults(c, args))
2131 return -1;
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002132 funcflags |= 0x01;
2133 }
2134 if (args->kwonlyargs) {
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03002135 int res = compiler_visit_kwonlydefaults(c, args->kwonlyargs,
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002136 args->kw_defaults);
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03002137 if (res == 0) {
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002138 return -1;
2139 }
2140 else if (res > 0) {
2141 funcflags |= 0x02;
2142 }
2143 }
2144 return funcflags;
2145}
2146
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002147static int
Pablo Galindoc5fc1562020-04-22 23:29:27 +01002148forbidden_name(struct compiler *c, identifier name, expr_context_ty ctx)
2149{
2150
2151 if (ctx == Store && _PyUnicode_EqualToASCIIString(name, "__debug__")) {
2152 compiler_error(c, "cannot assign to __debug__");
2153 return 1;
2154 }
2155 return 0;
2156}
2157
2158static int
2159compiler_check_debug_one_arg(struct compiler *c, arg_ty arg)
2160{
2161 if (arg != NULL) {
2162 if (forbidden_name(c, arg->arg, Store))
2163 return 0;
2164 }
2165 return 1;
2166}
2167
2168static int
Pablo Galindoa5634c42020-09-16 19:42:00 +01002169compiler_check_debug_args_seq(struct compiler *c, asdl_arg_seq *args)
Pablo Galindoc5fc1562020-04-22 23:29:27 +01002170{
2171 if (args != NULL) {
Pablo Galindoee40e4b2020-04-23 03:43:08 +01002172 for (Py_ssize_t i = 0, n = asdl_seq_LEN(args); i < n; i++) {
Pablo Galindoc5fc1562020-04-22 23:29:27 +01002173 if (!compiler_check_debug_one_arg(c, asdl_seq_GET(args, i)))
2174 return 0;
2175 }
2176 }
2177 return 1;
2178}
2179
2180static int
2181compiler_check_debug_args(struct compiler *c, arguments_ty args)
2182{
2183 if (!compiler_check_debug_args_seq(c, args->posonlyargs))
2184 return 0;
2185 if (!compiler_check_debug_args_seq(c, args->args))
2186 return 0;
2187 if (!compiler_check_debug_one_arg(c, args->vararg))
2188 return 0;
2189 if (!compiler_check_debug_args_seq(c, args->kwonlyargs))
2190 return 0;
2191 if (!compiler_check_debug_one_arg(c, args->kwarg))
2192 return 0;
2193 return 1;
2194}
2195
2196static int
Yury Selivanov75445082015-05-11 22:57:16 -04002197compiler_function(struct compiler *c, stmt_ty s, int is_async)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002198{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002199 PyCodeObject *co;
Serhiy Storchaka143ce5c2018-05-30 10:56:16 +03002200 PyObject *qualname, *docstring = NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04002201 arguments_ty args;
2202 expr_ty returns;
2203 identifier name;
Pablo Galindoa5634c42020-09-16 19:42:00 +01002204 asdl_expr_seq* decos;
2205 asdl_stmt_seq *body;
INADA Naokicb41b272017-02-23 00:31:59 +09002206 Py_ssize_t i, funcflags;
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03002207 int annotations;
Yury Selivanov75445082015-05-11 22:57:16 -04002208 int scope_type;
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +02002209 int firstlineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002210
Yury Selivanov75445082015-05-11 22:57:16 -04002211 if (is_async) {
2212 assert(s->kind == AsyncFunctionDef_kind);
2213
2214 args = s->v.AsyncFunctionDef.args;
2215 returns = s->v.AsyncFunctionDef.returns;
2216 decos = s->v.AsyncFunctionDef.decorator_list;
2217 name = s->v.AsyncFunctionDef.name;
2218 body = s->v.AsyncFunctionDef.body;
2219
2220 scope_type = COMPILER_SCOPE_ASYNC_FUNCTION;
2221 } else {
2222 assert(s->kind == FunctionDef_kind);
2223
2224 args = s->v.FunctionDef.args;
2225 returns = s->v.FunctionDef.returns;
2226 decos = s->v.FunctionDef.decorator_list;
2227 name = s->v.FunctionDef.name;
2228 body = s->v.FunctionDef.body;
2229
2230 scope_type = COMPILER_SCOPE_FUNCTION;
2231 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002232
Pablo Galindoc5fc1562020-04-22 23:29:27 +01002233 if (!compiler_check_debug_args(c, args))
2234 return 0;
2235
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002236 if (!compiler_decorators(c, decos))
2237 return 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +00002238
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +02002239 firstlineno = s->lineno;
2240 if (asdl_seq_LEN(decos)) {
2241 firstlineno = ((expr_ty)asdl_seq_GET(decos, 0))->lineno;
2242 }
2243
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002244 funcflags = compiler_default_arguments(c, args);
2245 if (funcflags == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002246 return 0;
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002247 }
2248
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03002249 annotations = compiler_visit_annotations(c, args, returns);
2250 if (annotations == 0) {
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002251 return 0;
2252 }
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03002253 else if (annotations > 0) {
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002254 funcflags |= 0x04;
2255 }
2256
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +02002257 if (!compiler_enter_scope(c, name, scope_type, (void *)s, firstlineno)) {
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002258 return 0;
2259 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002260
INADA Naokicb41b272017-02-23 00:31:59 +09002261 /* if not -OO mode, add docstring */
Serhiy Storchaka143ce5c2018-05-30 10:56:16 +03002262 if (c->c_optimize < 2) {
2263 docstring = _PyAST_GetDocString(body);
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03002264 }
Serhiy Storchaka143ce5c2018-05-30 10:56:16 +03002265 if (compiler_add_const(c, docstring ? docstring : Py_None) < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002266 compiler_exit_scope(c);
2267 return 0;
2268 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002269
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002270 c->u->u_argcount = asdl_seq_LEN(args->args);
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01002271 c->u->u_posonlyargcount = asdl_seq_LEN(args->posonlyargs);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002272 c->u->u_kwonlyargcount = asdl_seq_LEN(args->kwonlyargs);
Mark Shannon877df852020-11-12 09:43:29 +00002273 for (i = docstring ? 1 : 0; i < asdl_seq_LEN(body); i++) {
Mark Shannonfd009e62020-11-13 12:53:53 +00002274 VISIT_IN_SCOPE(c, stmt, (stmt_ty)asdl_seq_GET(body, i));
Mark Shannon877df852020-11-12 09:43:29 +00002275 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002276 co = assemble(c, 1);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04002277 qualname = c->u->u_qualname;
2278 Py_INCREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002279 compiler_exit_scope(c);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04002280 if (co == NULL) {
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002281 Py_XDECREF(qualname);
2282 Py_XDECREF(co);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002283 return 0;
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002284 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002285
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002286 compiler_make_closure(c, co, funcflags, qualname);
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002287 Py_DECREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002288 Py_DECREF(co);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002289
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002290 /* decorators */
2291 for (i = 0; i < asdl_seq_LEN(decos); i++) {
2292 ADDOP_I(c, CALL_FUNCTION, 1);
2293 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002294
Yury Selivanov75445082015-05-11 22:57:16 -04002295 return compiler_nameop(c, name, Store);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002296}
2297
2298static int
2299compiler_class(struct compiler *c, stmt_ty s)
2300{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002301 PyCodeObject *co;
2302 PyObject *str;
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +02002303 int i, firstlineno;
Pablo Galindoa5634c42020-09-16 19:42:00 +01002304 asdl_expr_seq *decos = s->v.ClassDef.decorator_list;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002305
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002306 if (!compiler_decorators(c, decos))
2307 return 0;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002308
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +02002309 firstlineno = s->lineno;
2310 if (asdl_seq_LEN(decos)) {
2311 firstlineno = ((expr_ty)asdl_seq_GET(decos, 0))->lineno;
2312 }
2313
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002314 /* ultimately generate code for:
2315 <name> = __build_class__(<func>, <name>, *<bases>, **<keywords>)
2316 where:
2317 <func> is a function/closure created from the class body;
2318 it has a single argument (__locals__) where the dict
2319 (or MutableSequence) representing the locals is passed
2320 <name> is the class name
2321 <bases> is the positional arguments and *varargs argument
2322 <keywords> is the keyword arguments and **kwds argument
2323 This borrows from compiler_call.
2324 */
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002325
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002326 /* 1. compile the class body into a code object */
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002327 if (!compiler_enter_scope(c, s->v.ClassDef.name,
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +02002328 COMPILER_SCOPE_CLASS, (void *)s, firstlineno))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002329 return 0;
2330 /* this block represents what we do in the new scope */
2331 {
2332 /* use the class name for name mangling */
2333 Py_INCREF(s->v.ClassDef.name);
Serhiy Storchaka48842712016-04-06 09:45:48 +03002334 Py_XSETREF(c->u->u_private, s->v.ClassDef.name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002335 /* load (global) __name__ ... */
2336 str = PyUnicode_InternFromString("__name__");
2337 if (!str || !compiler_nameop(c, str, Load)) {
2338 Py_XDECREF(str);
2339 compiler_exit_scope(c);
2340 return 0;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002341 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002342 Py_DECREF(str);
2343 /* ... and store it as __module__ */
2344 str = PyUnicode_InternFromString("__module__");
2345 if (!str || !compiler_nameop(c, str, Store)) {
2346 Py_XDECREF(str);
2347 compiler_exit_scope(c);
2348 return 0;
2349 }
2350 Py_DECREF(str);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04002351 assert(c->u->u_qualname);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03002352 ADDOP_LOAD_CONST(c, c->u->u_qualname);
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002353 str = PyUnicode_InternFromString("__qualname__");
2354 if (!str || !compiler_nameop(c, str, Store)) {
2355 Py_XDECREF(str);
2356 compiler_exit_scope(c);
2357 return 0;
2358 }
2359 Py_DECREF(str);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002360 /* compile the body proper */
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03002361 if (!compiler_body(c, s->v.ClassDef.body)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002362 compiler_exit_scope(c);
2363 return 0;
2364 }
Nick Coghlan19d24672016-12-05 16:47:55 +10002365 /* Return __classcell__ if it is referenced, otherwise return None */
Benjamin Peterson312595c2013-05-15 15:26:42 -05002366 if (c->u->u_ste->ste_needs_class_closure) {
Nick Coghlan19d24672016-12-05 16:47:55 +10002367 /* Store __classcell__ into class namespace & return it */
Benjamin Peterson312595c2013-05-15 15:26:42 -05002368 str = PyUnicode_InternFromString("__class__");
2369 if (str == NULL) {
2370 compiler_exit_scope(c);
2371 return 0;
2372 }
2373 i = compiler_lookup_arg(c->u->u_cellvars, str);
2374 Py_DECREF(str);
Victor Stinner98e818b2013-11-05 18:07:34 +01002375 if (i < 0) {
2376 compiler_exit_scope(c);
2377 return 0;
2378 }
Benjamin Peterson312595c2013-05-15 15:26:42 -05002379 assert(i == 0);
Nick Coghlan944368e2016-09-11 14:45:49 +10002380
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002381 ADDOP_I(c, LOAD_CLOSURE, i);
Nick Coghlan19d24672016-12-05 16:47:55 +10002382 ADDOP(c, DUP_TOP);
Nick Coghlan944368e2016-09-11 14:45:49 +10002383 str = PyUnicode_InternFromString("__classcell__");
2384 if (!str || !compiler_nameop(c, str, Store)) {
2385 Py_XDECREF(str);
2386 compiler_exit_scope(c);
2387 return 0;
2388 }
2389 Py_DECREF(str);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002390 }
Benjamin Peterson312595c2013-05-15 15:26:42 -05002391 else {
Nick Coghlan19d24672016-12-05 16:47:55 +10002392 /* No methods referenced __class__, so just return None */
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +02002393 assert(PyDict_GET_SIZE(c->u->u_cellvars) == 0);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03002394 ADDOP_LOAD_CONST(c, Py_None);
Benjamin Peterson312595c2013-05-15 15:26:42 -05002395 }
Nick Coghlan19d24672016-12-05 16:47:55 +10002396 ADDOP_IN_SCOPE(c, RETURN_VALUE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002397 /* create the code object */
2398 co = assemble(c, 1);
2399 }
2400 /* leave the new scope */
2401 compiler_exit_scope(c);
2402 if (co == NULL)
2403 return 0;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002404
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002405 /* 2. load the 'build_class' function */
2406 ADDOP(c, LOAD_BUILD_CLASS);
2407
2408 /* 3. load a function (or closure) made from the code object */
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002409 compiler_make_closure(c, co, 0, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002410 Py_DECREF(co);
2411
2412 /* 4. load class name */
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03002413 ADDOP_LOAD_CONST(c, s->v.ClassDef.name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002414
2415 /* 5. generate the rest of the code for the call */
Pablo Galindoa5634c42020-09-16 19:42:00 +01002416 if (!compiler_call_helper(c, 2, s->v.ClassDef.bases, s->v.ClassDef.keywords))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002417 return 0;
2418
2419 /* 6. apply decorators */
2420 for (i = 0; i < asdl_seq_LEN(decos); i++) {
2421 ADDOP_I(c, CALL_FUNCTION, 1);
2422 }
2423
2424 /* 7. store into <name> */
2425 if (!compiler_nameop(c, s->v.ClassDef.name, Store))
2426 return 0;
2427 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002428}
2429
Serhiy Storchaka3bcbedc2019-01-18 07:47:48 +02002430/* Return 0 if the expression is a constant value except named singletons.
2431 Return 1 otherwise. */
2432static int
2433check_is_arg(expr_ty e)
2434{
2435 if (e->kind != Constant_kind) {
2436 return 1;
2437 }
2438 PyObject *value = e->v.Constant.value;
2439 return (value == Py_None
2440 || value == Py_False
2441 || value == Py_True
2442 || value == Py_Ellipsis);
2443}
2444
2445/* Check operands of identity chacks ("is" and "is not").
2446 Emit a warning if any operand is a constant except named singletons.
2447 Return 0 on error.
2448 */
2449static int
2450check_compare(struct compiler *c, expr_ty e)
2451{
2452 Py_ssize_t i, n;
2453 int left = check_is_arg(e->v.Compare.left);
2454 n = asdl_seq_LEN(e->v.Compare.ops);
2455 for (i = 0; i < n; i++) {
2456 cmpop_ty op = (cmpop_ty)asdl_seq_GET(e->v.Compare.ops, i);
2457 int right = check_is_arg((expr_ty)asdl_seq_GET(e->v.Compare.comparators, i));
2458 if (op == Is || op == IsNot) {
2459 if (!right || !left) {
2460 const char *msg = (op == Is)
2461 ? "\"is\" with a literal. Did you mean \"==\"?"
2462 : "\"is not\" with a literal. Did you mean \"!=\"?";
2463 return compiler_warn(c, msg);
2464 }
2465 }
2466 left = right;
2467 }
2468 return 1;
2469}
2470
Mark Shannon9af0e472020-01-14 10:12:45 +00002471static int compiler_addcompare(struct compiler *c, cmpop_ty op)
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002472{
Mark Shannon9af0e472020-01-14 10:12:45 +00002473 int cmp;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002474 switch (op) {
2475 case Eq:
Mark Shannon9af0e472020-01-14 10:12:45 +00002476 cmp = Py_EQ;
2477 break;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002478 case NotEq:
Mark Shannon9af0e472020-01-14 10:12:45 +00002479 cmp = Py_NE;
2480 break;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002481 case Lt:
Mark Shannon9af0e472020-01-14 10:12:45 +00002482 cmp = Py_LT;
2483 break;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002484 case LtE:
Mark Shannon9af0e472020-01-14 10:12:45 +00002485 cmp = Py_LE;
2486 break;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002487 case Gt:
Mark Shannon9af0e472020-01-14 10:12:45 +00002488 cmp = Py_GT;
2489 break;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002490 case GtE:
Mark Shannon9af0e472020-01-14 10:12:45 +00002491 cmp = Py_GE;
2492 break;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002493 case Is:
Mark Shannon9af0e472020-01-14 10:12:45 +00002494 ADDOP_I(c, IS_OP, 0);
2495 return 1;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002496 case IsNot:
Mark Shannon9af0e472020-01-14 10:12:45 +00002497 ADDOP_I(c, IS_OP, 1);
2498 return 1;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002499 case In:
Mark Shannon9af0e472020-01-14 10:12:45 +00002500 ADDOP_I(c, CONTAINS_OP, 0);
2501 return 1;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002502 case NotIn:
Mark Shannon9af0e472020-01-14 10:12:45 +00002503 ADDOP_I(c, CONTAINS_OP, 1);
2504 return 1;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002505 default:
Mark Shannon9af0e472020-01-14 10:12:45 +00002506 Py_UNREACHABLE();
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002507 }
Mark Shannon9af0e472020-01-14 10:12:45 +00002508 ADDOP_I(c, COMPARE_OP, cmp);
2509 return 1;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002510}
2511
Mark Shannon9af0e472020-01-14 10:12:45 +00002512
2513
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002514static int
2515compiler_jump_if(struct compiler *c, expr_ty e, basicblock *next, int cond)
2516{
2517 switch (e->kind) {
2518 case UnaryOp_kind:
2519 if (e->v.UnaryOp.op == Not)
2520 return compiler_jump_if(c, e->v.UnaryOp.operand, next, !cond);
2521 /* fallback to general implementation */
2522 break;
2523 case BoolOp_kind: {
Pablo Galindoa5634c42020-09-16 19:42:00 +01002524 asdl_expr_seq *s = e->v.BoolOp.values;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002525 Py_ssize_t i, n = asdl_seq_LEN(s) - 1;
2526 assert(n >= 0);
2527 int cond2 = e->v.BoolOp.op == Or;
2528 basicblock *next2 = next;
2529 if (!cond2 != !cond) {
2530 next2 = compiler_new_block(c);
2531 if (next2 == NULL)
2532 return 0;
2533 }
2534 for (i = 0; i < n; ++i) {
2535 if (!compiler_jump_if(c, (expr_ty)asdl_seq_GET(s, i), next2, cond2))
2536 return 0;
2537 }
2538 if (!compiler_jump_if(c, (expr_ty)asdl_seq_GET(s, n), next, cond))
2539 return 0;
2540 if (next2 != next)
2541 compiler_use_next_block(c, next2);
2542 return 1;
2543 }
2544 case IfExp_kind: {
2545 basicblock *end, *next2;
2546 end = compiler_new_block(c);
2547 if (end == NULL)
2548 return 0;
2549 next2 = compiler_new_block(c);
2550 if (next2 == NULL)
2551 return 0;
2552 if (!compiler_jump_if(c, e->v.IfExp.test, next2, 0))
2553 return 0;
2554 if (!compiler_jump_if(c, e->v.IfExp.body, next, cond))
2555 return 0;
Mark Shannon582aaf12020-08-04 17:30:11 +01002556 ADDOP_JUMP(c, JUMP_FORWARD, end);
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002557 compiler_use_next_block(c, next2);
2558 if (!compiler_jump_if(c, e->v.IfExp.orelse, next, cond))
2559 return 0;
2560 compiler_use_next_block(c, end);
2561 return 1;
2562 }
2563 case Compare_kind: {
2564 Py_ssize_t i, n = asdl_seq_LEN(e->v.Compare.ops) - 1;
2565 if (n > 0) {
Serhiy Storchaka45835252019-02-16 08:29:46 +02002566 if (!check_compare(c, e)) {
2567 return 0;
2568 }
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002569 basicblock *cleanup = compiler_new_block(c);
2570 if (cleanup == NULL)
2571 return 0;
2572 VISIT(c, expr, e->v.Compare.left);
2573 for (i = 0; i < n; i++) {
2574 VISIT(c, expr,
2575 (expr_ty)asdl_seq_GET(e->v.Compare.comparators, i));
2576 ADDOP(c, DUP_TOP);
2577 ADDOP(c, ROT_THREE);
Mark Shannon9af0e472020-01-14 10:12:45 +00002578 ADDOP_COMPARE(c, asdl_seq_GET(e->v.Compare.ops, i));
Mark Shannon582aaf12020-08-04 17:30:11 +01002579 ADDOP_JUMP(c, POP_JUMP_IF_FALSE, cleanup);
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002580 NEXT_BLOCK(c);
2581 }
2582 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, n));
Mark Shannon9af0e472020-01-14 10:12:45 +00002583 ADDOP_COMPARE(c, asdl_seq_GET(e->v.Compare.ops, n));
Mark Shannon582aaf12020-08-04 17:30:11 +01002584 ADDOP_JUMP(c, cond ? POP_JUMP_IF_TRUE : POP_JUMP_IF_FALSE, next);
Mark Shannon266b4622020-11-17 19:30:14 +00002585 NEXT_BLOCK(c);
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002586 basicblock *end = compiler_new_block(c);
2587 if (end == NULL)
2588 return 0;
Mark Shannon582aaf12020-08-04 17:30:11 +01002589 ADDOP_JUMP(c, JUMP_FORWARD, end);
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002590 compiler_use_next_block(c, cleanup);
2591 ADDOP(c, POP_TOP);
2592 if (!cond) {
Mark Shannon582aaf12020-08-04 17:30:11 +01002593 ADDOP_JUMP(c, JUMP_FORWARD, next);
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002594 }
2595 compiler_use_next_block(c, end);
2596 return 1;
2597 }
2598 /* fallback to general implementation */
2599 break;
2600 }
2601 default:
2602 /* fallback to general implementation */
2603 break;
2604 }
2605
2606 /* general implementation */
2607 VISIT(c, expr, e);
Mark Shannon582aaf12020-08-04 17:30:11 +01002608 ADDOP_JUMP(c, cond ? POP_JUMP_IF_TRUE : POP_JUMP_IF_FALSE, next);
Mark Shannon266b4622020-11-17 19:30:14 +00002609 NEXT_BLOCK(c);
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002610 return 1;
2611}
2612
2613static int
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002614compiler_ifexp(struct compiler *c, expr_ty e)
2615{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002616 basicblock *end, *next;
2617
2618 assert(e->kind == IfExp_kind);
2619 end = compiler_new_block(c);
2620 if (end == NULL)
2621 return 0;
2622 next = compiler_new_block(c);
2623 if (next == NULL)
2624 return 0;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002625 if (!compiler_jump_if(c, e->v.IfExp.test, next, 0))
2626 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002627 VISIT(c, expr, e->v.IfExp.body);
Mark Shannon582aaf12020-08-04 17:30:11 +01002628 ADDOP_JUMP(c, JUMP_FORWARD, end);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002629 compiler_use_next_block(c, next);
2630 VISIT(c, expr, e->v.IfExp.orelse);
2631 compiler_use_next_block(c, end);
2632 return 1;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002633}
2634
2635static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002636compiler_lambda(struct compiler *c, expr_ty e)
2637{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002638 PyCodeObject *co;
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002639 PyObject *qualname;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002640 static identifier name;
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002641 Py_ssize_t funcflags;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002642 arguments_ty args = e->v.Lambda.args;
2643 assert(e->kind == Lambda_kind);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002644
Pablo Galindoc5fc1562020-04-22 23:29:27 +01002645 if (!compiler_check_debug_args(c, args))
2646 return 0;
2647
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002648 if (!name) {
2649 name = PyUnicode_InternFromString("<lambda>");
2650 if (!name)
2651 return 0;
2652 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002653
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002654 funcflags = compiler_default_arguments(c, args);
2655 if (funcflags == -1) {
2656 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002657 }
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002658
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04002659 if (!compiler_enter_scope(c, name, COMPILER_SCOPE_LAMBDA,
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002660 (void *)e, e->lineno))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002661 return 0;
Neal Norwitz4737b232005-11-19 23:58:29 +00002662
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002663 /* Make None the first constant, so the lambda can't have a
2664 docstring. */
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03002665 if (compiler_add_const(c, Py_None) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002666 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002667
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002668 c->u->u_argcount = asdl_seq_LEN(args->args);
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01002669 c->u->u_posonlyargcount = asdl_seq_LEN(args->posonlyargs);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002670 c->u->u_kwonlyargcount = asdl_seq_LEN(args->kwonlyargs);
2671 VISIT_IN_SCOPE(c, expr, e->v.Lambda.body);
2672 if (c->u->u_ste->ste_generator) {
Serhiy Storchakac775ad62015-03-11 18:20:35 +02002673 co = assemble(c, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002674 }
2675 else {
2676 ADDOP_IN_SCOPE(c, RETURN_VALUE);
Serhiy Storchakac775ad62015-03-11 18:20:35 +02002677 co = assemble(c, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002678 }
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04002679 qualname = c->u->u_qualname;
2680 Py_INCREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002681 compiler_exit_scope(c);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04002682 if (co == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002683 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002684
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002685 compiler_make_closure(c, co, funcflags, qualname);
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002686 Py_DECREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002687 Py_DECREF(co);
2688
2689 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002690}
2691
2692static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002693compiler_if(struct compiler *c, stmt_ty s)
2694{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002695 basicblock *end, *next;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002696 assert(s->kind == If_kind);
2697 end = compiler_new_block(c);
Mark Shannon8473cf82020-12-15 11:07:50 +00002698 if (end == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002699 return 0;
Mark Shannon8473cf82020-12-15 11:07:50 +00002700 }
2701 if (asdl_seq_LEN(s->v.If.orelse)) {
2702 next = compiler_new_block(c);
2703 if (next == NULL) {
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002704 return 0;
Mark Shannonfee55262019-11-21 09:11:43 +00002705 }
Mark Shannon8473cf82020-12-15 11:07:50 +00002706 }
2707 else {
2708 next = end;
2709 }
2710 if (!compiler_jump_if(c, s->v.If.test, next, 0)) {
2711 return 0;
2712 }
2713 VISIT_SEQ(c, stmt, s->v.If.body);
2714 if (asdl_seq_LEN(s->v.If.orelse)) {
2715 ADDOP_JUMP(c, JUMP_FORWARD, end);
2716 compiler_use_next_block(c, next);
2717 VISIT_SEQ(c, stmt, s->v.If.orelse);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002718 }
2719 compiler_use_next_block(c, end);
2720 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002721}
2722
2723static int
2724compiler_for(struct compiler *c, stmt_ty s)
2725{
Mark Shannon5977a792020-12-02 13:31:40 +00002726 basicblock *start, *body, *cleanup, *end;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002727
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002728 start = compiler_new_block(c);
Mark Shannon5977a792020-12-02 13:31:40 +00002729 body = compiler_new_block(c);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002730 cleanup = compiler_new_block(c);
2731 end = compiler_new_block(c);
Mark Shannon5977a792020-12-02 13:31:40 +00002732 if (start == NULL || body == NULL || end == NULL || cleanup == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002733 return 0;
Mark Shannonfee55262019-11-21 09:11:43 +00002734 }
2735 if (!compiler_push_fblock(c, FOR_LOOP, start, end, NULL)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002736 return 0;
Mark Shannonfee55262019-11-21 09:11:43 +00002737 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002738 VISIT(c, expr, s->v.For.iter);
2739 ADDOP(c, GET_ITER);
2740 compiler_use_next_block(c, start);
Mark Shannon582aaf12020-08-04 17:30:11 +01002741 ADDOP_JUMP(c, FOR_ITER, cleanup);
Mark Shannon5977a792020-12-02 13:31:40 +00002742 compiler_use_next_block(c, body);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002743 VISIT(c, expr, s->v.For.target);
2744 VISIT_SEQ(c, stmt, s->v.For.body);
Mark Shannonf5e97b72020-12-14 11:28:39 +00002745 /* Mark jump as artificial */
2746 c->u->u_lineno = -1;
Mark Shannon582aaf12020-08-04 17:30:11 +01002747 ADDOP_JUMP(c, JUMP_ABSOLUTE, start);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002748 compiler_use_next_block(c, cleanup);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002749
2750 compiler_pop_fblock(c, FOR_LOOP, start);
2751
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002752 VISIT_SEQ(c, stmt, s->v.For.orelse);
2753 compiler_use_next_block(c, end);
2754 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002755}
2756
Yury Selivanov75445082015-05-11 22:57:16 -04002757
2758static int
2759compiler_async_for(struct compiler *c, stmt_ty s)
2760{
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002761 basicblock *start, *except, *end;
Pablo Galindo90235812020-03-15 04:29:22 +00002762 if (IS_TOP_LEVEL_AWAIT(c)){
Matthias Bussonnier565b4f12019-05-21 13:12:03 -07002763 c->u->u_ste->ste_coroutine = 1;
2764 } else if (c->u->u_scope_type != COMPILER_SCOPE_ASYNC_FUNCTION) {
Zsolt Dollensteine2396502018-04-27 08:58:56 -07002765 return compiler_error(c, "'async for' outside async function");
2766 }
2767
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002768 start = compiler_new_block(c);
Yury Selivanov75445082015-05-11 22:57:16 -04002769 except = compiler_new_block(c);
2770 end = compiler_new_block(c);
Yury Selivanov75445082015-05-11 22:57:16 -04002771
Mark Shannonfee55262019-11-21 09:11:43 +00002772 if (start == NULL || except == NULL || end == NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04002773 return 0;
Mark Shannonfee55262019-11-21 09:11:43 +00002774 }
Yury Selivanov75445082015-05-11 22:57:16 -04002775 VISIT(c, expr, s->v.AsyncFor.iter);
2776 ADDOP(c, GET_AITER);
Yury Selivanov75445082015-05-11 22:57:16 -04002777
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002778 compiler_use_next_block(c, start);
Mark Shannonfee55262019-11-21 09:11:43 +00002779 if (!compiler_push_fblock(c, FOR_LOOP, start, end, NULL)) {
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002780 return 0;
Mark Shannonfee55262019-11-21 09:11:43 +00002781 }
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002782 /* SETUP_FINALLY to guard the __anext__ call */
Mark Shannon582aaf12020-08-04 17:30:11 +01002783 ADDOP_JUMP(c, SETUP_FINALLY, except);
Yury Selivanov75445082015-05-11 22:57:16 -04002784 ADDOP(c, GET_ANEXT);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03002785 ADDOP_LOAD_CONST(c, Py_None);
Yury Selivanov75445082015-05-11 22:57:16 -04002786 ADDOP(c, YIELD_FROM);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002787 ADDOP(c, POP_BLOCK); /* for SETUP_FINALLY */
Yury Selivanov75445082015-05-11 22:57:16 -04002788
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002789 /* Success block for __anext__ */
2790 VISIT(c, expr, s->v.AsyncFor.target);
2791 VISIT_SEQ(c, stmt, s->v.AsyncFor.body);
Mark Shannon582aaf12020-08-04 17:30:11 +01002792 ADDOP_JUMP(c, JUMP_ABSOLUTE, start);
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002793
2794 compiler_pop_fblock(c, FOR_LOOP, start);
Yury Selivanov75445082015-05-11 22:57:16 -04002795
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002796 /* Except block for __anext__ */
Yury Selivanov75445082015-05-11 22:57:16 -04002797 compiler_use_next_block(c, except);
Mark Shannon877df852020-11-12 09:43:29 +00002798
2799 c->u->u_lineno = -1;
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002800 ADDOP(c, END_ASYNC_FOR);
Yury Selivanov75445082015-05-11 22:57:16 -04002801
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002802 /* `else` block */
Yury Selivanov75445082015-05-11 22:57:16 -04002803 VISIT_SEQ(c, stmt, s->v.For.orelse);
2804
2805 compiler_use_next_block(c, end);
2806
2807 return 1;
2808}
2809
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002810static int
2811compiler_while(struct compiler *c, stmt_ty s)
2812{
Mark Shannon266b4622020-11-17 19:30:14 +00002813 basicblock *loop, *body, *end, *anchor = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002814 loop = compiler_new_block(c);
Mark Shannon266b4622020-11-17 19:30:14 +00002815 body = compiler_new_block(c);
2816 anchor = compiler_new_block(c);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002817 end = compiler_new_block(c);
Mark Shannon266b4622020-11-17 19:30:14 +00002818 if (loop == NULL || body == NULL || anchor == NULL || end == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002819 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002820 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002821 compiler_use_next_block(c, loop);
Mark Shannon266b4622020-11-17 19:30:14 +00002822 if (!compiler_push_fblock(c, WHILE_LOOP, loop, end, NULL)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002823 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002824 }
Mark Shannon8473cf82020-12-15 11:07:50 +00002825 if (!compiler_jump_if(c, s->v.While.test, anchor, 0)) {
2826 return 0;
Mark Shannon266b4622020-11-17 19:30:14 +00002827 }
2828
2829 compiler_use_next_block(c, body);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002830 VISIT_SEQ(c, stmt, s->v.While.body);
Mark Shannon8473cf82020-12-15 11:07:50 +00002831 SET_LOC(c, s);
2832 if (!compiler_jump_if(c, s->v.While.test, body, 1)) {
2833 return 0;
2834 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002835
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002836 compiler_pop_fblock(c, WHILE_LOOP, loop);
2837
Mark Shannon266b4622020-11-17 19:30:14 +00002838 compiler_use_next_block(c, anchor);
2839 if (s->v.While.orelse) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002840 VISIT_SEQ(c, stmt, s->v.While.orelse);
Mark Shannon266b4622020-11-17 19:30:14 +00002841 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002842 compiler_use_next_block(c, end);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002843
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002844 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002845}
2846
2847static int
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002848compiler_return(struct compiler *c, stmt_ty s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002849{
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002850 int preserve_tos = ((s->v.Return.value != NULL) &&
Serhiy Storchaka3f228112018-09-27 17:42:37 +03002851 (s->v.Return.value->kind != Constant_kind));
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002852 if (c->u->u_ste->ste_type != FunctionBlock)
2853 return compiler_error(c, "'return' outside function");
2854 if (s->v.Return.value != NULL &&
2855 c->u->u_ste->ste_coroutine && c->u->u_ste->ste_generator)
2856 {
2857 return compiler_error(
2858 c, "'return' with value in async generator");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002859 }
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002860 if (preserve_tos) {
2861 VISIT(c, expr, s->v.Return.value);
2862 }
Mark Shannonfee55262019-11-21 09:11:43 +00002863 if (!compiler_unwind_fblock_stack(c, preserve_tos, NULL))
2864 return 0;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002865 if (s->v.Return.value == NULL) {
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03002866 ADDOP_LOAD_CONST(c, Py_None);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002867 }
2868 else if (!preserve_tos) {
2869 VISIT(c, expr, s->v.Return.value);
2870 }
2871 ADDOP(c, RETURN_VALUE);
Mark Shannon266b4622020-11-17 19:30:14 +00002872 NEXT_BLOCK(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002873
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002874 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002875}
2876
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002877static int
2878compiler_break(struct compiler *c)
2879{
Mark Shannonfee55262019-11-21 09:11:43 +00002880 struct fblockinfo *loop = NULL;
2881 if (!compiler_unwind_fblock_stack(c, 0, &loop)) {
2882 return 0;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002883 }
Mark Shannonfee55262019-11-21 09:11:43 +00002884 if (loop == NULL) {
2885 return compiler_error(c, "'break' outside loop");
2886 }
2887 if (!compiler_unwind_fblock(c, loop, 0)) {
2888 return 0;
2889 }
Mark Shannon582aaf12020-08-04 17:30:11 +01002890 ADDOP_JUMP(c, JUMP_ABSOLUTE, loop->fb_exit);
Mark Shannon266b4622020-11-17 19:30:14 +00002891 NEXT_BLOCK(c);
Mark Shannonfee55262019-11-21 09:11:43 +00002892 return 1;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002893}
2894
2895static int
2896compiler_continue(struct compiler *c)
2897{
Mark Shannonfee55262019-11-21 09:11:43 +00002898 struct fblockinfo *loop = NULL;
2899 if (!compiler_unwind_fblock_stack(c, 0, &loop)) {
2900 return 0;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002901 }
Mark Shannonfee55262019-11-21 09:11:43 +00002902 if (loop == NULL) {
2903 return compiler_error(c, "'continue' not properly in loop");
2904 }
Mark Shannon582aaf12020-08-04 17:30:11 +01002905 ADDOP_JUMP(c, JUMP_ABSOLUTE, loop->fb_block);
Mark Shannon266b4622020-11-17 19:30:14 +00002906 NEXT_BLOCK(c)
Mark Shannonfee55262019-11-21 09:11:43 +00002907 return 1;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002908}
2909
2910
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002911/* Code generated for "try: <body> finally: <finalbody>" is as follows:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002912
2913 SETUP_FINALLY L
2914 <code for body>
2915 POP_BLOCK
Mark Shannonfee55262019-11-21 09:11:43 +00002916 <code for finalbody>
2917 JUMP E
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002918 L:
2919 <code for finalbody>
Mark Shannonfee55262019-11-21 09:11:43 +00002920 E:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002921
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002922 The special instructions use the block stack. Each block
2923 stack entry contains the instruction that created it (here
2924 SETUP_FINALLY), the level of the value stack at the time the
2925 block stack entry was created, and a label (here L).
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002926
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002927 SETUP_FINALLY:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002928 Pushes the current value stack level and the label
2929 onto the block stack.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002930 POP_BLOCK:
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002931 Pops en entry from the block stack.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002932
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002933 The block stack is unwound when an exception is raised:
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002934 when a SETUP_FINALLY entry is found, the raised and the caught
2935 exceptions are pushed onto the value stack (and the exception
2936 condition is cleared), and the interpreter jumps to the label
2937 gotten from the block stack.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002938*/
2939
2940static int
2941compiler_try_finally(struct compiler *c, stmt_ty s)
2942{
Mark Shannonfee55262019-11-21 09:11:43 +00002943 basicblock *body, *end, *exit;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002944
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002945 body = compiler_new_block(c);
2946 end = compiler_new_block(c);
Mark Shannonfee55262019-11-21 09:11:43 +00002947 exit = compiler_new_block(c);
2948 if (body == NULL || end == NULL || exit == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002949 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002950
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002951 /* `try` block */
Mark Shannon582aaf12020-08-04 17:30:11 +01002952 ADDOP_JUMP(c, SETUP_FINALLY, end);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002953 compiler_use_next_block(c, body);
Mark Shannonfee55262019-11-21 09:11:43 +00002954 if (!compiler_push_fblock(c, FINALLY_TRY, body, end, s->v.Try.finalbody))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002955 return 0;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002956 if (s->v.Try.handlers && asdl_seq_LEN(s->v.Try.handlers)) {
2957 if (!compiler_try_except(c, s))
2958 return 0;
2959 }
2960 else {
2961 VISIT_SEQ(c, stmt, s->v.Try.body);
2962 }
Mark Shannon56aa20f2020-12-14 10:19:10 +00002963 /* Mark code as artificial */
2964 c->u->u_lineno = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002965 ADDOP(c, POP_BLOCK);
Mark Shannonfee55262019-11-21 09:11:43 +00002966 compiler_pop_fblock(c, FINALLY_TRY, body);
2967 VISIT_SEQ(c, stmt, s->v.Try.finalbody);
Mark Shannon582aaf12020-08-04 17:30:11 +01002968 ADDOP_JUMP(c, JUMP_FORWARD, exit);
Mark Shannonfee55262019-11-21 09:11:43 +00002969 /* `finally` block */
2970 compiler_use_next_block(c, end);
2971 if (!compiler_push_fblock(c, FINALLY_END, end, NULL, NULL))
2972 return 0;
2973 VISIT_SEQ(c, stmt, s->v.Try.finalbody);
2974 compiler_pop_fblock(c, FINALLY_END, end);
2975 ADDOP(c, RERAISE);
2976 compiler_use_next_block(c, exit);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002977 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002978}
2979
2980/*
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00002981 Code generated for "try: S except E1 as V1: S1 except E2 as V2: S2 ...":
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002982 (The contents of the value stack is shown in [], with the top
2983 at the right; 'tb' is trace-back info, 'val' the exception's
2984 associated value, and 'exc' the exception.)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002985
2986 Value stack Label Instruction Argument
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002987 [] SETUP_FINALLY L1
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002988 [] <code for S>
2989 [] POP_BLOCK
2990 [] JUMP_FORWARD L0
2991
2992 [tb, val, exc] L1: DUP )
2993 [tb, val, exc, exc] <evaluate E1> )
Mark Shannon9af0e472020-01-14 10:12:45 +00002994 [tb, val, exc, exc, E1] JUMP_IF_NOT_EXC_MATCH L2 ) only if E1
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002995 [tb, val, exc] POP
2996 [tb, val] <assign to V1> (or POP if no V1)
2997 [tb] POP
2998 [] <code for S1>
2999 JUMP_FORWARD L0
3000
3001 [tb, val, exc] L2: DUP
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003002 .............................etc.......................
3003
Mark Shannonfee55262019-11-21 09:11:43 +00003004 [tb, val, exc] Ln+1: RERAISE # re-raise exception
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003005
3006 [] L0: <next statement>
3007
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003008 Of course, parts are not generated if Vi or Ei is not present.
3009*/
3010static int
3011compiler_try_except(struct compiler *c, stmt_ty s)
3012{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003013 basicblock *body, *orelse, *except, *end;
Victor Stinnerad9a0662013-11-19 22:23:20 +01003014 Py_ssize_t i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003015
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003016 body = compiler_new_block(c);
3017 except = compiler_new_block(c);
3018 orelse = compiler_new_block(c);
3019 end = compiler_new_block(c);
3020 if (body == NULL || except == NULL || orelse == NULL || end == NULL)
3021 return 0;
Mark Shannon582aaf12020-08-04 17:30:11 +01003022 ADDOP_JUMP(c, SETUP_FINALLY, except);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003023 compiler_use_next_block(c, body);
Mark Shannon02d126a2020-09-25 14:04:19 +01003024 if (!compiler_push_fblock(c, TRY_EXCEPT, body, NULL, NULL))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003025 return 0;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003026 VISIT_SEQ(c, stmt, s->v.Try.body);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003027 ADDOP(c, POP_BLOCK);
Mark Shannon02d126a2020-09-25 14:04:19 +01003028 compiler_pop_fblock(c, TRY_EXCEPT, body);
Mark Shannon582aaf12020-08-04 17:30:11 +01003029 ADDOP_JUMP(c, JUMP_FORWARD, orelse);
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003030 n = asdl_seq_LEN(s->v.Try.handlers);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003031 compiler_use_next_block(c, except);
Mark Shannon02d126a2020-09-25 14:04:19 +01003032 /* Runtime will push a block here, so we need to account for that */
3033 if (!compiler_push_fblock(c, EXCEPTION_HANDLER, NULL, NULL, NULL))
3034 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003035 for (i = 0; i < n; i++) {
3036 excepthandler_ty handler = (excepthandler_ty)asdl_seq_GET(
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003037 s->v.Try.handlers, i);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003038 if (!handler->v.ExceptHandler.type && i < n-1)
3039 return compiler_error(c, "default 'except:' must be last");
Serhiy Storchaka61cb3d02020-03-17 18:07:30 +02003040 SET_LOC(c, handler);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003041 except = compiler_new_block(c);
3042 if (except == NULL)
3043 return 0;
3044 if (handler->v.ExceptHandler.type) {
3045 ADDOP(c, DUP_TOP);
3046 VISIT(c, expr, handler->v.ExceptHandler.type);
Mark Shannon582aaf12020-08-04 17:30:11 +01003047 ADDOP_JUMP(c, JUMP_IF_NOT_EXC_MATCH, except);
Mark Shannon266b4622020-11-17 19:30:14 +00003048 NEXT_BLOCK(c);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003049 }
3050 ADDOP(c, POP_TOP);
3051 if (handler->v.ExceptHandler.name) {
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003052 basicblock *cleanup_end, *cleanup_body;
Guido van Rossumb940e112007-01-10 16:19:56 +00003053
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003054 cleanup_end = compiler_new_block(c);
3055 cleanup_body = compiler_new_block(c);
Zackery Spytz53ebf4b2018-10-11 23:54:03 -06003056 if (cleanup_end == NULL || cleanup_body == NULL) {
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003057 return 0;
Zackery Spytz53ebf4b2018-10-11 23:54:03 -06003058 }
Guido van Rossumb940e112007-01-10 16:19:56 +00003059
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003060 compiler_nameop(c, handler->v.ExceptHandler.name, Store);
3061 ADDOP(c, POP_TOP);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003062
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003063 /*
3064 try:
Ezio Melotti1b6424f2013-04-19 07:10:09 +03003065 # body
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003066 except type as name:
Ezio Melotti1b6424f2013-04-19 07:10:09 +03003067 try:
3068 # body
3069 finally:
Chris Angelicoad098b62019-05-21 23:34:19 +10003070 name = None # in case body contains "del name"
Ezio Melotti1b6424f2013-04-19 07:10:09 +03003071 del name
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003072 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003073
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003074 /* second try: */
Mark Shannon582aaf12020-08-04 17:30:11 +01003075 ADDOP_JUMP(c, SETUP_FINALLY, cleanup_end);
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003076 compiler_use_next_block(c, cleanup_body);
Mark Shannonfee55262019-11-21 09:11:43 +00003077 if (!compiler_push_fblock(c, HANDLER_CLEANUP, cleanup_body, NULL, handler->v.ExceptHandler.name))
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003078 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003079
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003080 /* second # body */
3081 VISIT_SEQ(c, stmt, handler->v.ExceptHandler.body);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003082 compiler_pop_fblock(c, HANDLER_CLEANUP, cleanup_body);
Mark Shannonfee55262019-11-21 09:11:43 +00003083 ADDOP(c, POP_BLOCK);
3084 ADDOP(c, POP_EXCEPT);
Mark Shannon877df852020-11-12 09:43:29 +00003085 /* name = None; del name; # Mark as artificial */
3086 c->u->u_lineno = -1;
Mark Shannonfee55262019-11-21 09:11:43 +00003087 ADDOP_LOAD_CONST(c, Py_None);
3088 compiler_nameop(c, handler->v.ExceptHandler.name, Store);
3089 compiler_nameop(c, handler->v.ExceptHandler.name, Del);
Mark Shannon582aaf12020-08-04 17:30:11 +01003090 ADDOP_JUMP(c, JUMP_FORWARD, end);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003091
Mark Shannonfee55262019-11-21 09:11:43 +00003092 /* except: */
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003093 compiler_use_next_block(c, cleanup_end);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003094
Mark Shannon877df852020-11-12 09:43:29 +00003095 /* name = None; del name; # Mark as artificial */
3096 c->u->u_lineno = -1;
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03003097 ADDOP_LOAD_CONST(c, Py_None);
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003098 compiler_nameop(c, handler->v.ExceptHandler.name, Store);
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003099 compiler_nameop(c, handler->v.ExceptHandler.name, Del);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003100
Mark Shannonfee55262019-11-21 09:11:43 +00003101 ADDOP(c, RERAISE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003102 }
3103 else {
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003104 basicblock *cleanup_body;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003105
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003106 cleanup_body = compiler_new_block(c);
Benjamin Peterson0a5dad92011-05-27 14:17:04 -05003107 if (!cleanup_body)
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003108 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003109
Guido van Rossumb940e112007-01-10 16:19:56 +00003110 ADDOP(c, POP_TOP);
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003111 ADDOP(c, POP_TOP);
3112 compiler_use_next_block(c, cleanup_body);
Mark Shannonfee55262019-11-21 09:11:43 +00003113 if (!compiler_push_fblock(c, HANDLER_CLEANUP, cleanup_body, NULL, NULL))
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003114 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003115 VISIT_SEQ(c, stmt, handler->v.ExceptHandler.body);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003116 compiler_pop_fblock(c, HANDLER_CLEANUP, cleanup_body);
Mark Shannonfee55262019-11-21 09:11:43 +00003117 ADDOP(c, POP_EXCEPT);
Mark Shannon582aaf12020-08-04 17:30:11 +01003118 ADDOP_JUMP(c, JUMP_FORWARD, end);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003119 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003120 compiler_use_next_block(c, except);
3121 }
Mark Shannon02d126a2020-09-25 14:04:19 +01003122 compiler_pop_fblock(c, EXCEPTION_HANDLER, NULL);
Mark Shannonfee55262019-11-21 09:11:43 +00003123 ADDOP(c, RERAISE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003124 compiler_use_next_block(c, orelse);
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003125 VISIT_SEQ(c, stmt, s->v.Try.orelse);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003126 compiler_use_next_block(c, end);
3127 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003128}
3129
3130static int
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003131compiler_try(struct compiler *c, stmt_ty s) {
3132 if (s->v.Try.finalbody && asdl_seq_LEN(s->v.Try.finalbody))
3133 return compiler_try_finally(c, s);
3134 else
3135 return compiler_try_except(c, s);
3136}
3137
3138
3139static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003140compiler_import_as(struct compiler *c, identifier name, identifier asname)
3141{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003142 /* The IMPORT_NAME opcode was already generated. This function
3143 merely needs to bind the result to a name.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003144
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003145 If there is a dot in name, we need to split it and emit a
Serhiy Storchakaf93234b2017-05-09 22:31:05 +03003146 IMPORT_FROM for each name.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003147 */
Serhiy Storchaka265fcc52017-08-29 15:47:44 +03003148 Py_ssize_t len = PyUnicode_GET_LENGTH(name);
3149 Py_ssize_t dot = PyUnicode_FindChar(name, '.', 0, len, 1);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003150 if (dot == -2)
Serhiy Storchaka694de3b2016-06-15 20:06:07 +03003151 return 0;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003152 if (dot != -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003153 /* Consume the base module name to get the first attribute */
Serhiy Storchaka265fcc52017-08-29 15:47:44 +03003154 while (1) {
3155 Py_ssize_t pos = dot + 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003156 PyObject *attr;
Serhiy Storchaka265fcc52017-08-29 15:47:44 +03003157 dot = PyUnicode_FindChar(name, '.', pos, len, 1);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003158 if (dot == -2)
Serhiy Storchaka694de3b2016-06-15 20:06:07 +03003159 return 0;
Serhiy Storchaka265fcc52017-08-29 15:47:44 +03003160 attr = PyUnicode_Substring(name, pos, (dot != -1) ? dot : len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003161 if (!attr)
Serhiy Storchaka694de3b2016-06-15 20:06:07 +03003162 return 0;
Serhiy Storchakaaa8e51f2018-04-01 00:29:37 +03003163 ADDOP_N(c, IMPORT_FROM, attr, names);
Serhiy Storchaka265fcc52017-08-29 15:47:44 +03003164 if (dot == -1) {
3165 break;
3166 }
3167 ADDOP(c, ROT_TWO);
3168 ADDOP(c, POP_TOP);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003169 }
Serhiy Storchaka265fcc52017-08-29 15:47:44 +03003170 if (!compiler_nameop(c, asname, Store)) {
3171 return 0;
3172 }
3173 ADDOP(c, POP_TOP);
3174 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003175 }
3176 return compiler_nameop(c, asname, Store);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003177}
3178
3179static int
3180compiler_import(struct compiler *c, stmt_ty s)
3181{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003182 /* The Import node stores a module name like a.b.c as a single
3183 string. This is convenient for all cases except
3184 import a.b.c as d
3185 where we need to parse that string to extract the individual
3186 module names.
3187 XXX Perhaps change the representation to make this case simpler?
3188 */
Victor Stinnerad9a0662013-11-19 22:23:20 +01003189 Py_ssize_t i, n = asdl_seq_LEN(s->v.Import.names);
Thomas Woutersf7f438b2006-02-28 16:09:29 +00003190
Victor Stinnerc9bc2902020-10-27 02:24:34 +01003191 PyObject *zero = _PyLong_GetZero(); // borrowed reference
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003192 for (i = 0; i < n; i++) {
3193 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.Import.names, i);
3194 int r;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003195
Victor Stinnerc9bc2902020-10-27 02:24:34 +01003196 ADDOP_LOAD_CONST(c, zero);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03003197 ADDOP_LOAD_CONST(c, Py_None);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003198 ADDOP_NAME(c, IMPORT_NAME, alias->name, names);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003199
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003200 if (alias->asname) {
3201 r = compiler_import_as(c, alias->name, alias->asname);
3202 if (!r)
3203 return r;
3204 }
3205 else {
3206 identifier tmp = alias->name;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003207 Py_ssize_t dot = PyUnicode_FindChar(
3208 alias->name, '.', 0, PyUnicode_GET_LENGTH(alias->name), 1);
Victor Stinner6b64a682013-07-11 22:50:45 +02003209 if (dot != -1) {
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003210 tmp = PyUnicode_Substring(alias->name, 0, dot);
Victor Stinner6b64a682013-07-11 22:50:45 +02003211 if (tmp == NULL)
3212 return 0;
3213 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003214 r = compiler_nameop(c, tmp, Store);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003215 if (dot != -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003216 Py_DECREF(tmp);
3217 }
3218 if (!r)
3219 return r;
3220 }
3221 }
3222 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003223}
3224
3225static int
3226compiler_from_import(struct compiler *c, stmt_ty s)
3227{
Victor Stinnerad9a0662013-11-19 22:23:20 +01003228 Py_ssize_t i, n = asdl_seq_LEN(s->v.ImportFrom.names);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03003229 PyObject *names;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003230 static PyObject *empty_string;
Benjamin Peterson78565b22009-06-28 19:19:51 +00003231
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003232 if (!empty_string) {
3233 empty_string = PyUnicode_FromString("");
3234 if (!empty_string)
3235 return 0;
3236 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003237
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03003238 ADDOP_LOAD_CONST_NEW(c, PyLong_FromLong(s->v.ImportFrom.level));
Serhiy Storchakaa95d9862018-03-24 22:42:35 +02003239
3240 names = PyTuple_New(n);
3241 if (!names)
3242 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003243
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003244 /* build up the names */
3245 for (i = 0; i < n; i++) {
3246 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);
3247 Py_INCREF(alias->name);
3248 PyTuple_SET_ITEM(names, i, alias->name);
3249 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003250
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003251 if (s->lineno > c->c_future->ff_lineno && s->v.ImportFrom.module &&
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02003252 _PyUnicode_EqualToASCIIString(s->v.ImportFrom.module, "__future__")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003253 Py_DECREF(names);
3254 return compiler_error(c, "from __future__ imports must occur "
3255 "at the beginning of the file");
3256 }
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03003257 ADDOP_LOAD_CONST_NEW(c, names);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003258
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003259 if (s->v.ImportFrom.module) {
3260 ADDOP_NAME(c, IMPORT_NAME, s->v.ImportFrom.module, names);
3261 }
3262 else {
3263 ADDOP_NAME(c, IMPORT_NAME, empty_string, names);
3264 }
3265 for (i = 0; i < n; i++) {
3266 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);
3267 identifier store_name;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003268
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003269 if (i == 0 && PyUnicode_READ_CHAR(alias->name, 0) == '*') {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003270 assert(n == 1);
3271 ADDOP(c, IMPORT_STAR);
3272 return 1;
3273 }
3274
3275 ADDOP_NAME(c, IMPORT_FROM, alias->name, names);
3276 store_name = alias->name;
3277 if (alias->asname)
3278 store_name = alias->asname;
3279
3280 if (!compiler_nameop(c, store_name, Store)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003281 return 0;
3282 }
3283 }
3284 /* remove imported module */
3285 ADDOP(c, POP_TOP);
3286 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003287}
3288
3289static int
3290compiler_assert(struct compiler *c, stmt_ty s)
3291{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003292 basicblock *end;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003293
Georg Brandl8334fd92010-12-04 10:26:46 +00003294 if (c->c_optimize)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003295 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003296 if (s->v.Assert.test->kind == Tuple_kind &&
Serhiy Storchakad31e7732018-10-21 10:09:39 +03003297 asdl_seq_LEN(s->v.Assert.test->v.Tuple.elts) > 0)
3298 {
3299 if (!compiler_warn(c, "assertion is always true, "
3300 "perhaps remove parentheses?"))
3301 {
Victor Stinner14e461d2013-08-26 22:28:21 +02003302 return 0;
3303 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003304 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003305 end = compiler_new_block(c);
3306 if (end == NULL)
3307 return 0;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03003308 if (!compiler_jump_if(c, s->v.Assert.test, end, 1))
3309 return 0;
Zackery Spytzce6a0702019-08-25 03:44:09 -06003310 ADDOP(c, LOAD_ASSERTION_ERROR);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003311 if (s->v.Assert.msg) {
3312 VISIT(c, expr, s->v.Assert.msg);
3313 ADDOP_I(c, CALL_FUNCTION, 1);
3314 }
3315 ADDOP_I(c, RAISE_VARARGS, 1);
3316 compiler_use_next_block(c, end);
3317 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003318}
3319
3320static int
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01003321compiler_visit_stmt_expr(struct compiler *c, expr_ty value)
3322{
3323 if (c->c_interactive && c->c_nestlevel <= 1) {
3324 VISIT(c, expr, value);
3325 ADDOP(c, PRINT_EXPR);
3326 return 1;
3327 }
3328
Serhiy Storchaka3f228112018-09-27 17:42:37 +03003329 if (value->kind == Constant_kind) {
Victor Stinner15a30952016-02-08 22:45:06 +01003330 /* ignore constant statement */
Mark Shannon877df852020-11-12 09:43:29 +00003331 ADDOP(c, NOP);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01003332 return 1;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01003333 }
3334
3335 VISIT(c, expr, value);
3336 ADDOP(c, POP_TOP);
3337 return 1;
3338}
3339
3340static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003341compiler_visit_stmt(struct compiler *c, stmt_ty s)
3342{
Victor Stinnerad9a0662013-11-19 22:23:20 +01003343 Py_ssize_t i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003344
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003345 /* Always assign a lineno to the next instruction for a stmt. */
Serhiy Storchaka61cb3d02020-03-17 18:07:30 +02003346 SET_LOC(c, s);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003347
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003348 switch (s->kind) {
3349 case FunctionDef_kind:
Yury Selivanov75445082015-05-11 22:57:16 -04003350 return compiler_function(c, s, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003351 case ClassDef_kind:
3352 return compiler_class(c, s);
3353 case Return_kind:
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003354 return compiler_return(c, s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003355 case Delete_kind:
3356 VISIT_SEQ(c, expr, s->v.Delete.targets)
3357 break;
3358 case Assign_kind:
3359 n = asdl_seq_LEN(s->v.Assign.targets);
3360 VISIT(c, expr, s->v.Assign.value);
3361 for (i = 0; i < n; i++) {
3362 if (i < n - 1)
3363 ADDOP(c, DUP_TOP);
3364 VISIT(c, expr,
3365 (expr_ty)asdl_seq_GET(s->v.Assign.targets, i));
3366 }
3367 break;
3368 case AugAssign_kind:
3369 return compiler_augassign(c, s);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003370 case AnnAssign_kind:
3371 return compiler_annassign(c, s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003372 case For_kind:
3373 return compiler_for(c, s);
3374 case While_kind:
3375 return compiler_while(c, s);
3376 case If_kind:
3377 return compiler_if(c, s);
3378 case Raise_kind:
3379 n = 0;
3380 if (s->v.Raise.exc) {
3381 VISIT(c, expr, s->v.Raise.exc);
3382 n++;
Victor Stinnerad9a0662013-11-19 22:23:20 +01003383 if (s->v.Raise.cause) {
3384 VISIT(c, expr, s->v.Raise.cause);
3385 n++;
3386 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003387 }
Victor Stinnerad9a0662013-11-19 22:23:20 +01003388 ADDOP_I(c, RAISE_VARARGS, (int)n);
Mark Shannon266b4622020-11-17 19:30:14 +00003389 NEXT_BLOCK(c);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003390 break;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003391 case Try_kind:
3392 return compiler_try(c, s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003393 case Assert_kind:
3394 return compiler_assert(c, s);
3395 case Import_kind:
3396 return compiler_import(c, s);
3397 case ImportFrom_kind:
3398 return compiler_from_import(c, s);
3399 case Global_kind:
3400 case Nonlocal_kind:
3401 break;
3402 case Expr_kind:
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01003403 return compiler_visit_stmt_expr(c, s->v.Expr.value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003404 case Pass_kind:
Mark Shannon877df852020-11-12 09:43:29 +00003405 ADDOP(c, NOP);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003406 break;
3407 case Break_kind:
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003408 return compiler_break(c);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003409 case Continue_kind:
3410 return compiler_continue(c);
3411 case With_kind:
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003412 return compiler_with(c, s, 0);
Yury Selivanov75445082015-05-11 22:57:16 -04003413 case AsyncFunctionDef_kind:
3414 return compiler_function(c, s, 1);
3415 case AsyncWith_kind:
3416 return compiler_async_with(c, s, 0);
3417 case AsyncFor_kind:
3418 return compiler_async_for(c, s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003419 }
Yury Selivanov75445082015-05-11 22:57:16 -04003420
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003421 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003422}
3423
3424static int
3425unaryop(unaryop_ty op)
3426{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003427 switch (op) {
3428 case Invert:
3429 return UNARY_INVERT;
3430 case Not:
3431 return UNARY_NOT;
3432 case UAdd:
3433 return UNARY_POSITIVE;
3434 case USub:
3435 return UNARY_NEGATIVE;
3436 default:
3437 PyErr_Format(PyExc_SystemError,
3438 "unary op %d should not be possible", op);
3439 return 0;
3440 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003441}
3442
3443static int
Andy Lester76d58772020-03-10 21:18:12 -05003444binop(operator_ty op)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003445{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003446 switch (op) {
3447 case Add:
3448 return BINARY_ADD;
3449 case Sub:
3450 return BINARY_SUBTRACT;
3451 case Mult:
3452 return BINARY_MULTIPLY;
Benjamin Petersond51374e2014-04-09 23:55:56 -04003453 case MatMult:
3454 return BINARY_MATRIX_MULTIPLY;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003455 case Div:
3456 return BINARY_TRUE_DIVIDE;
3457 case Mod:
3458 return BINARY_MODULO;
3459 case Pow:
3460 return BINARY_POWER;
3461 case LShift:
3462 return BINARY_LSHIFT;
3463 case RShift:
3464 return BINARY_RSHIFT;
3465 case BitOr:
3466 return BINARY_OR;
3467 case BitXor:
3468 return BINARY_XOR;
3469 case BitAnd:
3470 return BINARY_AND;
3471 case FloorDiv:
3472 return BINARY_FLOOR_DIVIDE;
3473 default:
3474 PyErr_Format(PyExc_SystemError,
3475 "binary op %d should not be possible", op);
3476 return 0;
3477 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003478}
3479
3480static int
Andy Lester76d58772020-03-10 21:18:12 -05003481inplace_binop(operator_ty op)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003482{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003483 switch (op) {
3484 case Add:
3485 return INPLACE_ADD;
3486 case Sub:
3487 return INPLACE_SUBTRACT;
3488 case Mult:
3489 return INPLACE_MULTIPLY;
Benjamin Petersond51374e2014-04-09 23:55:56 -04003490 case MatMult:
3491 return INPLACE_MATRIX_MULTIPLY;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003492 case Div:
3493 return INPLACE_TRUE_DIVIDE;
3494 case Mod:
3495 return INPLACE_MODULO;
3496 case Pow:
3497 return INPLACE_POWER;
3498 case LShift:
3499 return INPLACE_LSHIFT;
3500 case RShift:
3501 return INPLACE_RSHIFT;
3502 case BitOr:
3503 return INPLACE_OR;
3504 case BitXor:
3505 return INPLACE_XOR;
3506 case BitAnd:
3507 return INPLACE_AND;
3508 case FloorDiv:
3509 return INPLACE_FLOOR_DIVIDE;
3510 default:
3511 PyErr_Format(PyExc_SystemError,
3512 "inplace binary op %d should not be possible", op);
3513 return 0;
3514 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003515}
3516
3517static int
3518compiler_nameop(struct compiler *c, identifier name, expr_context_ty ctx)
3519{
Victor Stinnerad9a0662013-11-19 22:23:20 +01003520 int op, scope;
3521 Py_ssize_t arg;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003522 enum { OP_FAST, OP_GLOBAL, OP_DEREF, OP_NAME } optype;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003523
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003524 PyObject *dict = c->u->u_names;
3525 PyObject *mangled;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003526
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02003527 assert(!_PyUnicode_EqualToASCIIString(name, "None") &&
3528 !_PyUnicode_EqualToASCIIString(name, "True") &&
3529 !_PyUnicode_EqualToASCIIString(name, "False"));
Benjamin Peterson70b224d2012-12-06 17:49:58 -05003530
Pablo Galindoc5fc1562020-04-22 23:29:27 +01003531 if (forbidden_name(c, name, ctx))
3532 return 0;
3533
Serhiy Storchakabd6ec4d2017-12-18 14:29:12 +02003534 mangled = _Py_Mangle(c->u->u_private, name);
3535 if (!mangled)
3536 return 0;
3537
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003538 op = 0;
3539 optype = OP_NAME;
3540 scope = PyST_GetScope(c->u->u_ste, mangled);
3541 switch (scope) {
3542 case FREE:
3543 dict = c->u->u_freevars;
3544 optype = OP_DEREF;
3545 break;
3546 case CELL:
3547 dict = c->u->u_cellvars;
3548 optype = OP_DEREF;
3549 break;
3550 case LOCAL:
3551 if (c->u->u_ste->ste_type == FunctionBlock)
3552 optype = OP_FAST;
3553 break;
3554 case GLOBAL_IMPLICIT:
Benjamin Peterson1dfd2472015-04-27 21:44:22 -04003555 if (c->u->u_ste->ste_type == FunctionBlock)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003556 optype = OP_GLOBAL;
3557 break;
3558 case GLOBAL_EXPLICIT:
3559 optype = OP_GLOBAL;
3560 break;
3561 default:
3562 /* scope can be 0 */
3563 break;
3564 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003565
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003566 /* XXX Leave assert here, but handle __doc__ and the like better */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003567 assert(scope || PyUnicode_READ_CHAR(name, 0) == '_');
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003568
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003569 switch (optype) {
3570 case OP_DEREF:
3571 switch (ctx) {
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04003572 case Load:
3573 op = (c->u->u_ste->ste_type == ClassBlock) ? LOAD_CLASSDEREF : LOAD_DEREF;
3574 break;
Serhiy Storchaka6b975982020-03-17 23:41:08 +02003575 case Store: op = STORE_DEREF; break;
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00003576 case Del: op = DELETE_DEREF; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003577 }
3578 break;
3579 case OP_FAST:
3580 switch (ctx) {
3581 case Load: op = LOAD_FAST; break;
Serhiy Storchaka6b975982020-03-17 23:41:08 +02003582 case Store: op = STORE_FAST; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003583 case Del: op = DELETE_FAST; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003584 }
Serhiy Storchakaaa8e51f2018-04-01 00:29:37 +03003585 ADDOP_N(c, op, mangled, varnames);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003586 return 1;
3587 case OP_GLOBAL:
3588 switch (ctx) {
3589 case Load: op = LOAD_GLOBAL; break;
Serhiy Storchaka6b975982020-03-17 23:41:08 +02003590 case Store: op = STORE_GLOBAL; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003591 case Del: op = DELETE_GLOBAL; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003592 }
3593 break;
3594 case OP_NAME:
3595 switch (ctx) {
Benjamin Peterson20f9c3c2010-07-20 22:39:34 +00003596 case Load: op = LOAD_NAME; break;
Serhiy Storchaka6b975982020-03-17 23:41:08 +02003597 case Store: op = STORE_NAME; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003598 case Del: op = DELETE_NAME; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003599 }
3600 break;
3601 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003602
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003603 assert(op);
Andy Lester76d58772020-03-10 21:18:12 -05003604 arg = compiler_add_o(dict, mangled);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003605 Py_DECREF(mangled);
3606 if (arg < 0)
3607 return 0;
3608 return compiler_addop_i(c, op, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003609}
3610
3611static int
3612compiler_boolop(struct compiler *c, expr_ty e)
3613{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003614 basicblock *end;
Victor Stinnerad9a0662013-11-19 22:23:20 +01003615 int jumpi;
3616 Py_ssize_t i, n;
Pablo Galindoa5634c42020-09-16 19:42:00 +01003617 asdl_expr_seq *s;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003618
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003619 assert(e->kind == BoolOp_kind);
3620 if (e->v.BoolOp.op == And)
3621 jumpi = JUMP_IF_FALSE_OR_POP;
3622 else
3623 jumpi = JUMP_IF_TRUE_OR_POP;
3624 end = compiler_new_block(c);
3625 if (end == NULL)
3626 return 0;
3627 s = e->v.BoolOp.values;
3628 n = asdl_seq_LEN(s) - 1;
3629 assert(n >= 0);
3630 for (i = 0; i < n; ++i) {
3631 VISIT(c, expr, (expr_ty)asdl_seq_GET(s, i));
Mark Shannon582aaf12020-08-04 17:30:11 +01003632 ADDOP_JUMP(c, jumpi, end);
Mark Shannon6e8128f2020-07-30 10:03:00 +01003633 basicblock *next = compiler_new_block(c);
3634 if (next == NULL) {
3635 return 0;
3636 }
3637 compiler_use_next_block(c, next);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003638 }
3639 VISIT(c, expr, (expr_ty)asdl_seq_GET(s, n));
3640 compiler_use_next_block(c, end);
3641 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003642}
3643
3644static int
Pablo Galindoa5634c42020-09-16 19:42:00 +01003645starunpack_helper(struct compiler *c, asdl_expr_seq *elts, int pushed,
Mark Shannon13bc1392020-01-23 09:25:17 +00003646 int build, int add, int extend, int tuple)
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003647{
3648 Py_ssize_t n = asdl_seq_LEN(elts);
Mark Shannon13bc1392020-01-23 09:25:17 +00003649 Py_ssize_t i, seen_star = 0;
Brandt Bucher6dd9b642019-11-25 22:16:53 -08003650 if (n > 2 && are_all_items_const(elts, 0, n)) {
3651 PyObject *folded = PyTuple_New(n);
3652 if (folded == NULL) {
3653 return 0;
3654 }
3655 PyObject *val;
3656 for (i = 0; i < n; i++) {
3657 val = ((expr_ty)asdl_seq_GET(elts, i))->v.Constant.value;
3658 Py_INCREF(val);
3659 PyTuple_SET_ITEM(folded, i, val);
3660 }
Mark Shannon13bc1392020-01-23 09:25:17 +00003661 if (tuple) {
3662 ADDOP_LOAD_CONST_NEW(c, folded);
3663 } else {
3664 if (add == SET_ADD) {
3665 Py_SETREF(folded, PyFrozenSet_New(folded));
3666 if (folded == NULL) {
3667 return 0;
3668 }
Brandt Bucher6dd9b642019-11-25 22:16:53 -08003669 }
Mark Shannon13bc1392020-01-23 09:25:17 +00003670 ADDOP_I(c, build, pushed);
3671 ADDOP_LOAD_CONST_NEW(c, folded);
3672 ADDOP_I(c, extend, 1);
Brandt Bucher6dd9b642019-11-25 22:16:53 -08003673 }
Brandt Bucher6dd9b642019-11-25 22:16:53 -08003674 return 1;
3675 }
Mark Shannon13bc1392020-01-23 09:25:17 +00003676
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003677 for (i = 0; i < n; i++) {
3678 expr_ty elt = asdl_seq_GET(elts, i);
3679 if (elt->kind == Starred_kind) {
Mark Shannon13bc1392020-01-23 09:25:17 +00003680 seen_star = 1;
3681 }
3682 }
3683 if (seen_star) {
3684 seen_star = 0;
3685 for (i = 0; i < n; i++) {
3686 expr_ty elt = asdl_seq_GET(elts, i);
3687 if (elt->kind == Starred_kind) {
3688 if (seen_star == 0) {
3689 ADDOP_I(c, build, i+pushed);
3690 seen_star = 1;
3691 }
3692 VISIT(c, expr, elt->v.Starred.value);
3693 ADDOP_I(c, extend, 1);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003694 }
Mark Shannon13bc1392020-01-23 09:25:17 +00003695 else {
3696 VISIT(c, expr, elt);
3697 if (seen_star) {
3698 ADDOP_I(c, add, 1);
3699 }
3700 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003701 }
Mark Shannon13bc1392020-01-23 09:25:17 +00003702 assert(seen_star);
3703 if (tuple) {
3704 ADDOP(c, LIST_TO_TUPLE);
3705 }
3706 }
3707 else {
3708 for (i = 0; i < n; i++) {
3709 expr_ty elt = asdl_seq_GET(elts, i);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003710 VISIT(c, expr, elt);
Mark Shannon13bc1392020-01-23 09:25:17 +00003711 }
3712 if (tuple) {
3713 ADDOP_I(c, BUILD_TUPLE, n+pushed);
3714 } else {
3715 ADDOP_I(c, build, n+pushed);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003716 }
3717 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003718 return 1;
3719}
3720
3721static int
Pablo Galindoa5634c42020-09-16 19:42:00 +01003722assignment_helper(struct compiler *c, asdl_expr_seq *elts)
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003723{
3724 Py_ssize_t n = asdl_seq_LEN(elts);
3725 Py_ssize_t i;
3726 int seen_star = 0;
3727 for (i = 0; i < n; i++) {
3728 expr_ty elt = asdl_seq_GET(elts, i);
3729 if (elt->kind == Starred_kind && !seen_star) {
3730 if ((i >= (1 << 8)) ||
3731 (n-i-1 >= (INT_MAX >> 8)))
3732 return compiler_error(c,
3733 "too many expressions in "
3734 "star-unpacking assignment");
3735 ADDOP_I(c, UNPACK_EX, (i + ((n-i-1) << 8)));
3736 seen_star = 1;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003737 }
3738 else if (elt->kind == Starred_kind) {
3739 return compiler_error(c,
Furkan Öndercb6534e2020-03-26 04:54:31 +03003740 "multiple starred expressions in assignment");
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003741 }
3742 }
3743 if (!seen_star) {
3744 ADDOP_I(c, UNPACK_SEQUENCE, n);
3745 }
Brandt Bucherd5aa2e92020-03-07 19:44:18 -08003746 for (i = 0; i < n; i++) {
3747 expr_ty elt = asdl_seq_GET(elts, i);
3748 VISIT(c, expr, elt->kind != Starred_kind ? elt : elt->v.Starred.value);
3749 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003750 return 1;
3751}
3752
3753static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003754compiler_list(struct compiler *c, expr_ty e)
3755{
Pablo Galindoa5634c42020-09-16 19:42:00 +01003756 asdl_expr_seq *elts = e->v.List.elts;
Serhiy Storchakad8b3a982019-03-05 20:42:06 +02003757 if (e->v.List.ctx == Store) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003758 return assignment_helper(c, elts);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003759 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003760 else if (e->v.List.ctx == Load) {
Mark Shannon13bc1392020-01-23 09:25:17 +00003761 return starunpack_helper(c, elts, 0, BUILD_LIST,
3762 LIST_APPEND, LIST_EXTEND, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003763 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003764 else
3765 VISIT_SEQ(c, expr, elts);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003766 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003767}
3768
3769static int
3770compiler_tuple(struct compiler *c, expr_ty e)
3771{
Pablo Galindoa5634c42020-09-16 19:42:00 +01003772 asdl_expr_seq *elts = e->v.Tuple.elts;
Serhiy Storchakad8b3a982019-03-05 20:42:06 +02003773 if (e->v.Tuple.ctx == Store) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003774 return assignment_helper(c, elts);
3775 }
3776 else if (e->v.Tuple.ctx == Load) {
Mark Shannon13bc1392020-01-23 09:25:17 +00003777 return starunpack_helper(c, elts, 0, BUILD_LIST,
3778 LIST_APPEND, LIST_EXTEND, 1);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003779 }
3780 else
3781 VISIT_SEQ(c, expr, elts);
3782 return 1;
3783}
3784
3785static int
3786compiler_set(struct compiler *c, expr_ty e)
3787{
Mark Shannon13bc1392020-01-23 09:25:17 +00003788 return starunpack_helper(c, e->v.Set.elts, 0, BUILD_SET,
3789 SET_ADD, SET_UPDATE, 0);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003790}
3791
3792static int
Pablo Galindoa5634c42020-09-16 19:42:00 +01003793are_all_items_const(asdl_expr_seq *seq, Py_ssize_t begin, Py_ssize_t end)
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003794{
3795 Py_ssize_t i;
3796 for (i = begin; i < end; i++) {
3797 expr_ty key = (expr_ty)asdl_seq_GET(seq, i);
Serhiy Storchaka3f228112018-09-27 17:42:37 +03003798 if (key == NULL || key->kind != Constant_kind)
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003799 return 0;
3800 }
3801 return 1;
3802}
3803
3804static int
3805compiler_subdict(struct compiler *c, expr_ty e, Py_ssize_t begin, Py_ssize_t end)
3806{
3807 Py_ssize_t i, n = end - begin;
3808 PyObject *keys, *key;
3809 if (n > 1 && are_all_items_const(e->v.Dict.keys, begin, end)) {
3810 for (i = begin; i < end; i++) {
3811 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Dict.values, i));
3812 }
3813 keys = PyTuple_New(n);
3814 if (keys == NULL) {
3815 return 0;
3816 }
3817 for (i = begin; i < end; i++) {
Serhiy Storchaka3f228112018-09-27 17:42:37 +03003818 key = ((expr_ty)asdl_seq_GET(e->v.Dict.keys, i))->v.Constant.value;
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003819 Py_INCREF(key);
3820 PyTuple_SET_ITEM(keys, i - begin, key);
3821 }
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03003822 ADDOP_LOAD_CONST_NEW(c, keys);
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003823 ADDOP_I(c, BUILD_CONST_KEY_MAP, n);
3824 }
3825 else {
3826 for (i = begin; i < end; i++) {
3827 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Dict.keys, i));
3828 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Dict.values, i));
3829 }
3830 ADDOP_I(c, BUILD_MAP, n);
3831 }
3832 return 1;
3833}
3834
3835static int
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003836compiler_dict(struct compiler *c, expr_ty e)
3837{
Victor Stinner976bb402016-03-23 11:36:19 +01003838 Py_ssize_t i, n, elements;
Mark Shannon8a4cd702020-01-27 09:57:45 +00003839 int have_dict;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003840 int is_unpacking = 0;
3841 n = asdl_seq_LEN(e->v.Dict.values);
Mark Shannon8a4cd702020-01-27 09:57:45 +00003842 have_dict = 0;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003843 elements = 0;
3844 for (i = 0; i < n; i++) {
3845 is_unpacking = (expr_ty)asdl_seq_GET(e->v.Dict.keys, i) == NULL;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003846 if (is_unpacking) {
Mark Shannon8a4cd702020-01-27 09:57:45 +00003847 if (elements) {
3848 if (!compiler_subdict(c, e, i - elements, i)) {
3849 return 0;
3850 }
3851 if (have_dict) {
3852 ADDOP_I(c, DICT_UPDATE, 1);
3853 }
3854 have_dict = 1;
3855 elements = 0;
3856 }
3857 if (have_dict == 0) {
3858 ADDOP_I(c, BUILD_MAP, 0);
3859 have_dict = 1;
3860 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003861 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Dict.values, i));
Mark Shannon8a4cd702020-01-27 09:57:45 +00003862 ADDOP_I(c, DICT_UPDATE, 1);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003863 }
3864 else {
Mark Shannon8a4cd702020-01-27 09:57:45 +00003865 if (elements == 0xFFFF) {
Pablo Galindoc51db0e2020-08-13 09:48:41 +01003866 if (!compiler_subdict(c, e, i - elements, i + 1)) {
Mark Shannon8a4cd702020-01-27 09:57:45 +00003867 return 0;
3868 }
3869 if (have_dict) {
3870 ADDOP_I(c, DICT_UPDATE, 1);
3871 }
3872 have_dict = 1;
3873 elements = 0;
3874 }
3875 else {
3876 elements++;
3877 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003878 }
3879 }
Mark Shannon8a4cd702020-01-27 09:57:45 +00003880 if (elements) {
3881 if (!compiler_subdict(c, e, n - elements, n)) {
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003882 return 0;
Mark Shannon8a4cd702020-01-27 09:57:45 +00003883 }
3884 if (have_dict) {
3885 ADDOP_I(c, DICT_UPDATE, 1);
3886 }
3887 have_dict = 1;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003888 }
Mark Shannon8a4cd702020-01-27 09:57:45 +00003889 if (!have_dict) {
3890 ADDOP_I(c, BUILD_MAP, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003891 }
3892 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003893}
3894
3895static int
3896compiler_compare(struct compiler *c, expr_ty e)
3897{
Victor Stinnerad9a0662013-11-19 22:23:20 +01003898 Py_ssize_t i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003899
Serhiy Storchaka3bcbedc2019-01-18 07:47:48 +02003900 if (!check_compare(c, e)) {
3901 return 0;
3902 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003903 VISIT(c, expr, e->v.Compare.left);
Serhiy Storchaka02b9ef22017-12-30 09:47:42 +02003904 assert(asdl_seq_LEN(e->v.Compare.ops) > 0);
3905 n = asdl_seq_LEN(e->v.Compare.ops) - 1;
3906 if (n == 0) {
3907 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, 0));
Mark Shannon9af0e472020-01-14 10:12:45 +00003908 ADDOP_COMPARE(c, asdl_seq_GET(e->v.Compare.ops, 0));
Serhiy Storchaka02b9ef22017-12-30 09:47:42 +02003909 }
3910 else {
3911 basicblock *cleanup = compiler_new_block(c);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003912 if (cleanup == NULL)
3913 return 0;
Serhiy Storchaka02b9ef22017-12-30 09:47:42 +02003914 for (i = 0; i < n; i++) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003915 VISIT(c, expr,
3916 (expr_ty)asdl_seq_GET(e->v.Compare.comparators, i));
Serhiy Storchaka02b9ef22017-12-30 09:47:42 +02003917 ADDOP(c, DUP_TOP);
3918 ADDOP(c, ROT_THREE);
Mark Shannon9af0e472020-01-14 10:12:45 +00003919 ADDOP_COMPARE(c, asdl_seq_GET(e->v.Compare.ops, i));
Mark Shannon582aaf12020-08-04 17:30:11 +01003920 ADDOP_JUMP(c, JUMP_IF_FALSE_OR_POP, cleanup);
Serhiy Storchaka02b9ef22017-12-30 09:47:42 +02003921 NEXT_BLOCK(c);
3922 }
3923 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, n));
Mark Shannon9af0e472020-01-14 10:12:45 +00003924 ADDOP_COMPARE(c, asdl_seq_GET(e->v.Compare.ops, n));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003925 basicblock *end = compiler_new_block(c);
3926 if (end == NULL)
3927 return 0;
Mark Shannon582aaf12020-08-04 17:30:11 +01003928 ADDOP_JUMP(c, JUMP_FORWARD, end);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003929 compiler_use_next_block(c, cleanup);
3930 ADDOP(c, ROT_TWO);
3931 ADDOP(c, POP_TOP);
3932 compiler_use_next_block(c, end);
3933 }
3934 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003935}
3936
Serhiy Storchaka62e44812019-02-16 08:12:19 +02003937static PyTypeObject *
3938infer_type(expr_ty e)
3939{
3940 switch (e->kind) {
3941 case Tuple_kind:
3942 return &PyTuple_Type;
3943 case List_kind:
3944 case ListComp_kind:
3945 return &PyList_Type;
3946 case Dict_kind:
3947 case DictComp_kind:
3948 return &PyDict_Type;
3949 case Set_kind:
3950 case SetComp_kind:
3951 return &PySet_Type;
3952 case GeneratorExp_kind:
3953 return &PyGen_Type;
3954 case Lambda_kind:
3955 return &PyFunction_Type;
3956 case JoinedStr_kind:
3957 case FormattedValue_kind:
3958 return &PyUnicode_Type;
3959 case Constant_kind:
Victor Stinnera102ed72020-02-07 02:24:48 +01003960 return Py_TYPE(e->v.Constant.value);
Serhiy Storchaka62e44812019-02-16 08:12:19 +02003961 default:
3962 return NULL;
3963 }
3964}
3965
3966static int
3967check_caller(struct compiler *c, expr_ty e)
3968{
3969 switch (e->kind) {
3970 case Constant_kind:
3971 case Tuple_kind:
3972 case List_kind:
3973 case ListComp_kind:
3974 case Dict_kind:
3975 case DictComp_kind:
3976 case Set_kind:
3977 case SetComp_kind:
3978 case GeneratorExp_kind:
3979 case JoinedStr_kind:
3980 case FormattedValue_kind:
3981 return compiler_warn(c, "'%.200s' object is not callable; "
3982 "perhaps you missed a comma?",
3983 infer_type(e)->tp_name);
3984 default:
3985 return 1;
3986 }
3987}
3988
3989static int
3990check_subscripter(struct compiler *c, expr_ty e)
3991{
3992 PyObject *v;
3993
3994 switch (e->kind) {
3995 case Constant_kind:
3996 v = e->v.Constant.value;
3997 if (!(v == Py_None || v == Py_Ellipsis ||
3998 PyLong_Check(v) || PyFloat_Check(v) || PyComplex_Check(v) ||
3999 PyAnySet_Check(v)))
4000 {
4001 return 1;
4002 }
4003 /* fall through */
4004 case Set_kind:
4005 case SetComp_kind:
4006 case GeneratorExp_kind:
4007 case Lambda_kind:
4008 return compiler_warn(c, "'%.200s' object is not subscriptable; "
4009 "perhaps you missed a comma?",
4010 infer_type(e)->tp_name);
4011 default:
4012 return 1;
4013 }
4014}
4015
4016static int
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02004017check_index(struct compiler *c, expr_ty e, expr_ty s)
Serhiy Storchaka62e44812019-02-16 08:12:19 +02004018{
4019 PyObject *v;
4020
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02004021 PyTypeObject *index_type = infer_type(s);
Serhiy Storchaka62e44812019-02-16 08:12:19 +02004022 if (index_type == NULL
4023 || PyType_FastSubclass(index_type, Py_TPFLAGS_LONG_SUBCLASS)
4024 || index_type == &PySlice_Type) {
4025 return 1;
4026 }
4027
4028 switch (e->kind) {
4029 case Constant_kind:
4030 v = e->v.Constant.value;
4031 if (!(PyUnicode_Check(v) || PyBytes_Check(v) || PyTuple_Check(v))) {
4032 return 1;
4033 }
4034 /* fall through */
4035 case Tuple_kind:
4036 case List_kind:
4037 case ListComp_kind:
4038 case JoinedStr_kind:
4039 case FormattedValue_kind:
4040 return compiler_warn(c, "%.200s indices must be integers or slices, "
4041 "not %.200s; "
4042 "perhaps you missed a comma?",
4043 infer_type(e)->tp_name,
4044 index_type->tp_name);
4045 default:
4046 return 1;
4047 }
4048}
4049
Zackery Spytz97f5de02019-03-22 01:30:32 -06004050// Return 1 if the method call was optimized, -1 if not, and 0 on error.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004051static int
Yury Selivanovf2392132016-12-13 19:03:51 -05004052maybe_optimize_method_call(struct compiler *c, expr_ty e)
4053{
4054 Py_ssize_t argsl, i;
4055 expr_ty meth = e->v.Call.func;
Pablo Galindoa5634c42020-09-16 19:42:00 +01004056 asdl_expr_seq *args = e->v.Call.args;
Yury Selivanovf2392132016-12-13 19:03:51 -05004057
4058 /* Check that the call node is an attribute access, and that
4059 the call doesn't have keyword parameters. */
4060 if (meth->kind != Attribute_kind || meth->v.Attribute.ctx != Load ||
4061 asdl_seq_LEN(e->v.Call.keywords))
4062 return -1;
4063
4064 /* Check that there are no *varargs types of arguments. */
4065 argsl = asdl_seq_LEN(args);
4066 for (i = 0; i < argsl; i++) {
4067 expr_ty elt = asdl_seq_GET(args, i);
4068 if (elt->kind == Starred_kind) {
4069 return -1;
4070 }
4071 }
4072
4073 /* Alright, we can optimize the code. */
4074 VISIT(c, expr, meth->v.Attribute.value);
4075 ADDOP_NAME(c, LOAD_METHOD, meth->v.Attribute.attr, names);
4076 VISIT_SEQ(c, expr, e->v.Call.args);
4077 ADDOP_I(c, CALL_METHOD, asdl_seq_LEN(e->v.Call.args));
4078 return 1;
4079}
4080
4081static int
Pablo Galindoa5634c42020-09-16 19:42:00 +01004082validate_keywords(struct compiler *c, asdl_keyword_seq *keywords)
Zackery Spytz08050e92020-04-06 00:47:47 -06004083{
4084 Py_ssize_t nkeywords = asdl_seq_LEN(keywords);
4085 for (Py_ssize_t i = 0; i < nkeywords; i++) {
Pablo Galindo254ec782020-04-03 20:37:13 +01004086 keyword_ty key = ((keyword_ty)asdl_seq_GET(keywords, i));
4087 if (key->arg == NULL) {
4088 continue;
4089 }
Pablo Galindoc5fc1562020-04-22 23:29:27 +01004090 if (forbidden_name(c, key->arg, Store)) {
4091 return -1;
4092 }
Zackery Spytz08050e92020-04-06 00:47:47 -06004093 for (Py_ssize_t j = i + 1; j < nkeywords; j++) {
Pablo Galindo254ec782020-04-03 20:37:13 +01004094 keyword_ty other = ((keyword_ty)asdl_seq_GET(keywords, j));
4095 if (other->arg && !PyUnicode_Compare(key->arg, other->arg)) {
4096 PyObject *msg = PyUnicode_FromFormat("keyword argument repeated: %U", key->arg);
4097 if (msg == NULL) {
4098 return -1;
4099 }
4100 c->u->u_col_offset = other->col_offset;
4101 compiler_error(c, PyUnicode_AsUTF8(msg));
4102 Py_DECREF(msg);
4103 return -1;
4104 }
4105 }
4106 }
4107 return 0;
4108}
4109
4110static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004111compiler_call(struct compiler *c, expr_ty e)
4112{
Zackery Spytz97f5de02019-03-22 01:30:32 -06004113 int ret = maybe_optimize_method_call(c, e);
4114 if (ret >= 0) {
4115 return ret;
4116 }
Serhiy Storchaka62e44812019-02-16 08:12:19 +02004117 if (!check_caller(c, e->v.Call.func)) {
4118 return 0;
4119 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004120 VISIT(c, expr, e->v.Call.func);
4121 return compiler_call_helper(c, 0,
4122 e->v.Call.args,
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004123 e->v.Call.keywords);
Guido van Rossum52cc1d82007-03-18 15:41:51 +00004124}
4125
Eric V. Smith235a6f02015-09-19 14:51:32 -04004126static int
4127compiler_joined_str(struct compiler *c, expr_ty e)
4128{
Eric V. Smith235a6f02015-09-19 14:51:32 -04004129 VISIT_SEQ(c, expr, e->v.JoinedStr.values);
Serhiy Storchaka4cc30ae2016-12-11 19:37:19 +02004130 if (asdl_seq_LEN(e->v.JoinedStr.values) != 1)
4131 ADDOP_I(c, BUILD_STRING, asdl_seq_LEN(e->v.JoinedStr.values));
Eric V. Smith235a6f02015-09-19 14:51:32 -04004132 return 1;
4133}
4134
Eric V. Smitha78c7952015-11-03 12:45:05 -05004135/* Used to implement f-strings. Format a single value. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04004136static int
4137compiler_formatted_value(struct compiler *c, expr_ty e)
4138{
Eric V. Smitha78c7952015-11-03 12:45:05 -05004139 /* Our oparg encodes 2 pieces of information: the conversion
4140 character, and whether or not a format_spec was provided.
Eric V. Smith235a6f02015-09-19 14:51:32 -04004141
Eric V. Smith9a4135e2019-05-08 16:28:48 -04004142 Convert the conversion char to 3 bits:
4143 : 000 0x0 FVC_NONE The default if nothing specified.
Eric V. Smitha78c7952015-11-03 12:45:05 -05004144 !s : 001 0x1 FVC_STR
4145 !r : 010 0x2 FVC_REPR
4146 !a : 011 0x3 FVC_ASCII
Eric V. Smith235a6f02015-09-19 14:51:32 -04004147
Eric V. Smitha78c7952015-11-03 12:45:05 -05004148 next bit is whether or not we have a format spec:
4149 yes : 100 0x4
4150 no : 000 0x0
4151 */
Eric V. Smith235a6f02015-09-19 14:51:32 -04004152
Eric V. Smith9a4135e2019-05-08 16:28:48 -04004153 int conversion = e->v.FormattedValue.conversion;
Eric V. Smitha78c7952015-11-03 12:45:05 -05004154 int oparg;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004155
Eric V. Smith9a4135e2019-05-08 16:28:48 -04004156 /* The expression to be formatted. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04004157 VISIT(c, expr, e->v.FormattedValue.value);
4158
Eric V. Smith9a4135e2019-05-08 16:28:48 -04004159 switch (conversion) {
Eric V. Smitha78c7952015-11-03 12:45:05 -05004160 case 's': oparg = FVC_STR; break;
4161 case 'r': oparg = FVC_REPR; break;
4162 case 'a': oparg = FVC_ASCII; break;
4163 case -1: oparg = FVC_NONE; break;
4164 default:
Eric V. Smith9a4135e2019-05-08 16:28:48 -04004165 PyErr_Format(PyExc_SystemError,
4166 "Unrecognized conversion character %d", conversion);
Eric V. Smitha78c7952015-11-03 12:45:05 -05004167 return 0;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004168 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04004169 if (e->v.FormattedValue.format_spec) {
Eric V. Smitha78c7952015-11-03 12:45:05 -05004170 /* Evaluate the format spec, and update our opcode arg. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04004171 VISIT(c, expr, e->v.FormattedValue.format_spec);
Eric V. Smitha78c7952015-11-03 12:45:05 -05004172 oparg |= FVS_HAVE_SPEC;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004173 }
4174
Eric V. Smitha78c7952015-11-03 12:45:05 -05004175 /* And push our opcode and oparg */
4176 ADDOP_I(c, FORMAT_VALUE, oparg);
Eric V. Smith9a4135e2019-05-08 16:28:48 -04004177
Eric V. Smith235a6f02015-09-19 14:51:32 -04004178 return 1;
4179}
4180
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03004181static int
Pablo Galindoa5634c42020-09-16 19:42:00 +01004182compiler_subkwargs(struct compiler *c, asdl_keyword_seq *keywords, Py_ssize_t begin, Py_ssize_t end)
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03004183{
4184 Py_ssize_t i, n = end - begin;
4185 keyword_ty kw;
4186 PyObject *keys, *key;
4187 assert(n > 0);
4188 if (n > 1) {
4189 for (i = begin; i < end; i++) {
4190 kw = asdl_seq_GET(keywords, i);
4191 VISIT(c, expr, kw->value);
4192 }
4193 keys = PyTuple_New(n);
4194 if (keys == NULL) {
4195 return 0;
4196 }
4197 for (i = begin; i < end; i++) {
4198 key = ((keyword_ty) asdl_seq_GET(keywords, i))->arg;
4199 Py_INCREF(key);
4200 PyTuple_SET_ITEM(keys, i - begin, key);
4201 }
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03004202 ADDOP_LOAD_CONST_NEW(c, keys);
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03004203 ADDOP_I(c, BUILD_CONST_KEY_MAP, n);
4204 }
4205 else {
4206 /* a for loop only executes once */
4207 for (i = begin; i < end; i++) {
4208 kw = asdl_seq_GET(keywords, i);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03004209 ADDOP_LOAD_CONST(c, kw->arg);
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03004210 VISIT(c, expr, kw->value);
4211 }
4212 ADDOP_I(c, BUILD_MAP, n);
4213 }
4214 return 1;
4215}
4216
Guido van Rossum52cc1d82007-03-18 15:41:51 +00004217/* shared code between compiler_call and compiler_class */
4218static int
4219compiler_call_helper(struct compiler *c,
Victor Stinner976bb402016-03-23 11:36:19 +01004220 int n, /* Args already pushed */
Pablo Galindoa5634c42020-09-16 19:42:00 +01004221 asdl_expr_seq *args,
4222 asdl_keyword_seq *keywords)
Guido van Rossum52cc1d82007-03-18 15:41:51 +00004223{
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004224 Py_ssize_t i, nseen, nelts, nkwelts;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004225
Pablo Galindo254ec782020-04-03 20:37:13 +01004226 if (validate_keywords(c, keywords) == -1) {
4227 return 0;
4228 }
4229
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004230 nelts = asdl_seq_LEN(args);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004231 nkwelts = asdl_seq_LEN(keywords);
4232
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004233 for (i = 0; i < nelts; i++) {
4234 expr_ty elt = asdl_seq_GET(args, i);
4235 if (elt->kind == Starred_kind) {
Mark Shannon13bc1392020-01-23 09:25:17 +00004236 goto ex_call;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004237 }
Mark Shannon13bc1392020-01-23 09:25:17 +00004238 }
4239 for (i = 0; i < nkwelts; i++) {
4240 keyword_ty kw = asdl_seq_GET(keywords, i);
4241 if (kw->arg == NULL) {
4242 goto ex_call;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004243 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004244 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004245
Mark Shannon13bc1392020-01-23 09:25:17 +00004246 /* No * or ** args, so can use faster calling sequence */
4247 for (i = 0; i < nelts; i++) {
4248 expr_ty elt = asdl_seq_GET(args, i);
4249 assert(elt->kind != Starred_kind);
4250 VISIT(c, expr, elt);
4251 }
4252 if (nkwelts) {
4253 PyObject *names;
4254 VISIT_SEQ(c, keyword, keywords);
4255 names = PyTuple_New(nkwelts);
4256 if (names == NULL) {
4257 return 0;
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004258 }
Mark Shannon13bc1392020-01-23 09:25:17 +00004259 for (i = 0; i < nkwelts; i++) {
4260 keyword_ty kw = asdl_seq_GET(keywords, i);
4261 Py_INCREF(kw->arg);
4262 PyTuple_SET_ITEM(names, i, kw->arg);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004263 }
Mark Shannon13bc1392020-01-23 09:25:17 +00004264 ADDOP_LOAD_CONST_NEW(c, names);
4265 ADDOP_I(c, CALL_FUNCTION_KW, n + nelts + nkwelts);
4266 return 1;
4267 }
4268 else {
4269 ADDOP_I(c, CALL_FUNCTION, n + nelts);
4270 return 1;
4271 }
4272
4273ex_call:
4274
4275 /* Do positional arguments. */
4276 if (n ==0 && nelts == 1 && ((expr_ty)asdl_seq_GET(args, 0))->kind == Starred_kind) {
4277 VISIT(c, expr, ((expr_ty)asdl_seq_GET(args, 0))->v.Starred.value);
4278 }
4279 else if (starunpack_helper(c, args, n, BUILD_LIST,
4280 LIST_APPEND, LIST_EXTEND, 1) == 0) {
4281 return 0;
4282 }
4283 /* Then keyword arguments */
4284 if (nkwelts) {
Mark Shannon8a4cd702020-01-27 09:57:45 +00004285 /* Has a new dict been pushed */
4286 int have_dict = 0;
Mark Shannon13bc1392020-01-23 09:25:17 +00004287
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004288 nseen = 0; /* the number of keyword arguments on the stack following */
4289 for (i = 0; i < nkwelts; i++) {
4290 keyword_ty kw = asdl_seq_GET(keywords, i);
4291 if (kw->arg == NULL) {
4292 /* A keyword argument unpacking. */
4293 if (nseen) {
Mark Shannon8a4cd702020-01-27 09:57:45 +00004294 if (!compiler_subkwargs(c, keywords, i - nseen, i)) {
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03004295 return 0;
Mark Shannon8a4cd702020-01-27 09:57:45 +00004296 }
Mark Shannondb64f122020-06-01 10:42:42 +01004297 if (have_dict) {
4298 ADDOP_I(c, DICT_MERGE, 1);
4299 }
Mark Shannon8a4cd702020-01-27 09:57:45 +00004300 have_dict = 1;
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004301 nseen = 0;
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03004302 }
Mark Shannon8a4cd702020-01-27 09:57:45 +00004303 if (!have_dict) {
4304 ADDOP_I(c, BUILD_MAP, 0);
4305 have_dict = 1;
4306 }
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004307 VISIT(c, expr, kw->value);
Mark Shannon8a4cd702020-01-27 09:57:45 +00004308 ADDOP_I(c, DICT_MERGE, 1);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004309 }
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004310 else {
4311 nseen++;
4312 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004313 }
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004314 if (nseen) {
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03004315 /* Pack up any trailing keyword arguments. */
Mark Shannon8a4cd702020-01-27 09:57:45 +00004316 if (!compiler_subkwargs(c, keywords, nkwelts - nseen, nkwelts)) {
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03004317 return 0;
Mark Shannon8a4cd702020-01-27 09:57:45 +00004318 }
4319 if (have_dict) {
4320 ADDOP_I(c, DICT_MERGE, 1);
4321 }
4322 have_dict = 1;
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03004323 }
Mark Shannon8a4cd702020-01-27 09:57:45 +00004324 assert(have_dict);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004325 }
Mark Shannon13bc1392020-01-23 09:25:17 +00004326 ADDOP_I(c, CALL_FUNCTION_EX, nkwelts > 0);
4327 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004328}
4329
Nick Coghlan650f0d02007-04-15 12:05:43 +00004330
4331/* List and set comprehensions and generator expressions work by creating a
4332 nested function to perform the actual iteration. This means that the
4333 iteration variables don't leak into the current scope.
4334 The defined function is called immediately following its definition, with the
4335 result of that call being the result of the expression.
4336 The LC/SC version returns the populated container, while the GE version is
4337 flagged in symtable.c as a generator, so it returns the generator object
4338 when the function is called.
Nick Coghlan650f0d02007-04-15 12:05:43 +00004339
4340 Possible cleanups:
4341 - iterate over the generator sequence instead of using recursion
4342*/
4343
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004344
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004345static int
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004346compiler_comprehension_generator(struct compiler *c,
Pablo Galindoa5634c42020-09-16 19:42:00 +01004347 asdl_comprehension_seq *generators, int gen_index,
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004348 int depth,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004349 expr_ty elt, expr_ty val, int type)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004350{
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004351 comprehension_ty gen;
4352 gen = (comprehension_ty)asdl_seq_GET(generators, gen_index);
4353 if (gen->is_async) {
4354 return compiler_async_comprehension_generator(
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004355 c, generators, gen_index, depth, elt, val, type);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004356 } else {
4357 return compiler_sync_comprehension_generator(
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004358 c, generators, gen_index, depth, elt, val, type);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004359 }
4360}
4361
4362static int
4363compiler_sync_comprehension_generator(struct compiler *c,
Pablo Galindoa5634c42020-09-16 19:42:00 +01004364 asdl_comprehension_seq *generators, int gen_index,
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004365 int depth,
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004366 expr_ty elt, expr_ty val, int type)
4367{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004368 /* generate code for the iterator, then each of the ifs,
4369 and then write to the element */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004370
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004371 comprehension_ty gen;
4372 basicblock *start, *anchor, *skip, *if_cleanup;
Victor Stinnerad9a0662013-11-19 22:23:20 +01004373 Py_ssize_t i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004374
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004375 start = compiler_new_block(c);
4376 skip = compiler_new_block(c);
4377 if_cleanup = compiler_new_block(c);
4378 anchor = compiler_new_block(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004379
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004380 if (start == NULL || skip == NULL || if_cleanup == NULL ||
4381 anchor == NULL)
4382 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004383
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004384 gen = (comprehension_ty)asdl_seq_GET(generators, gen_index);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004385
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004386 if (gen_index == 0) {
4387 /* Receive outermost iter as an implicit argument */
4388 c->u->u_argcount = 1;
4389 ADDOP_I(c, LOAD_FAST, 0);
4390 }
4391 else {
4392 /* Sub-iter - calculate on the fly */
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004393 /* Fast path for the temporary variable assignment idiom:
4394 for y in [f(x)]
4395 */
Pablo Galindoa5634c42020-09-16 19:42:00 +01004396 asdl_expr_seq *elts;
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004397 switch (gen->iter->kind) {
4398 case List_kind:
4399 elts = gen->iter->v.List.elts;
4400 break;
4401 case Tuple_kind:
4402 elts = gen->iter->v.Tuple.elts;
4403 break;
4404 default:
4405 elts = NULL;
4406 }
4407 if (asdl_seq_LEN(elts) == 1) {
4408 expr_ty elt = asdl_seq_GET(elts, 0);
4409 if (elt->kind != Starred_kind) {
4410 VISIT(c, expr, elt);
4411 start = NULL;
4412 }
4413 }
4414 if (start) {
4415 VISIT(c, expr, gen->iter);
4416 ADDOP(c, GET_ITER);
4417 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004418 }
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004419 if (start) {
4420 depth++;
4421 compiler_use_next_block(c, start);
Mark Shannon582aaf12020-08-04 17:30:11 +01004422 ADDOP_JUMP(c, FOR_ITER, anchor);
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004423 NEXT_BLOCK(c);
4424 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004425 VISIT(c, expr, gen->target);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004426
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004427 /* XXX this needs to be cleaned up...a lot! */
4428 n = asdl_seq_LEN(gen->ifs);
4429 for (i = 0; i < n; i++) {
4430 expr_ty e = (expr_ty)asdl_seq_GET(gen->ifs, i);
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03004431 if (!compiler_jump_if(c, e, if_cleanup, 0))
4432 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004433 NEXT_BLOCK(c);
4434 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004435
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004436 if (++gen_index < asdl_seq_LEN(generators))
4437 if (!compiler_comprehension_generator(c,
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004438 generators, gen_index, depth,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004439 elt, val, type))
4440 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004441
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004442 /* only append after the last for generator */
4443 if (gen_index >= asdl_seq_LEN(generators)) {
4444 /* comprehension specific code */
4445 switch (type) {
4446 case COMP_GENEXP:
4447 VISIT(c, expr, elt);
4448 ADDOP(c, YIELD_VALUE);
4449 ADDOP(c, POP_TOP);
4450 break;
4451 case COMP_LISTCOMP:
4452 VISIT(c, expr, elt);
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004453 ADDOP_I(c, LIST_APPEND, depth + 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004454 break;
4455 case COMP_SETCOMP:
4456 VISIT(c, expr, elt);
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004457 ADDOP_I(c, SET_ADD, depth + 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004458 break;
4459 case COMP_DICTCOMP:
Jörn Heisslerc8a35412019-06-22 16:40:55 +02004460 /* With '{k: v}', k is evaluated before v, so we do
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004461 the same. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004462 VISIT(c, expr, elt);
Jörn Heisslerc8a35412019-06-22 16:40:55 +02004463 VISIT(c, expr, val);
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004464 ADDOP_I(c, MAP_ADD, depth + 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004465 break;
4466 default:
4467 return 0;
4468 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004469
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004470 compiler_use_next_block(c, skip);
4471 }
4472 compiler_use_next_block(c, if_cleanup);
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004473 if (start) {
Mark Shannon582aaf12020-08-04 17:30:11 +01004474 ADDOP_JUMP(c, JUMP_ABSOLUTE, start);
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004475 compiler_use_next_block(c, anchor);
4476 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004477
4478 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004479}
4480
4481static int
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004482compiler_async_comprehension_generator(struct compiler *c,
Pablo Galindoa5634c42020-09-16 19:42:00 +01004483 asdl_comprehension_seq *generators, int gen_index,
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004484 int depth,
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004485 expr_ty elt, expr_ty val, int type)
4486{
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004487 comprehension_ty gen;
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02004488 basicblock *start, *if_cleanup, *except;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004489 Py_ssize_t i, n;
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02004490 start = compiler_new_block(c);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004491 except = compiler_new_block(c);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004492 if_cleanup = compiler_new_block(c);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004493
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02004494 if (start == NULL || if_cleanup == NULL || except == NULL) {
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004495 return 0;
4496 }
4497
4498 gen = (comprehension_ty)asdl_seq_GET(generators, gen_index);
4499
4500 if (gen_index == 0) {
4501 /* Receive outermost iter as an implicit argument */
4502 c->u->u_argcount = 1;
4503 ADDOP_I(c, LOAD_FAST, 0);
4504 }
4505 else {
4506 /* Sub-iter - calculate on the fly */
4507 VISIT(c, expr, gen->iter);
4508 ADDOP(c, GET_AITER);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004509 }
4510
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02004511 compiler_use_next_block(c, start);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004512
Mark Shannon582aaf12020-08-04 17:30:11 +01004513 ADDOP_JUMP(c, SETUP_FINALLY, except);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004514 ADDOP(c, GET_ANEXT);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03004515 ADDOP_LOAD_CONST(c, Py_None);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004516 ADDOP(c, YIELD_FROM);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004517 ADDOP(c, POP_BLOCK);
Serhiy Storchaka24d32012018-03-10 18:22:34 +02004518 VISIT(c, expr, gen->target);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004519
4520 n = asdl_seq_LEN(gen->ifs);
4521 for (i = 0; i < n; i++) {
4522 expr_ty e = (expr_ty)asdl_seq_GET(gen->ifs, i);
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03004523 if (!compiler_jump_if(c, e, if_cleanup, 0))
4524 return 0;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004525 NEXT_BLOCK(c);
4526 }
4527
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004528 depth++;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004529 if (++gen_index < asdl_seq_LEN(generators))
4530 if (!compiler_comprehension_generator(c,
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004531 generators, gen_index, depth,
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004532 elt, val, type))
4533 return 0;
4534
4535 /* only append after the last for generator */
4536 if (gen_index >= asdl_seq_LEN(generators)) {
4537 /* comprehension specific code */
4538 switch (type) {
4539 case COMP_GENEXP:
4540 VISIT(c, expr, elt);
4541 ADDOP(c, YIELD_VALUE);
4542 ADDOP(c, POP_TOP);
4543 break;
4544 case COMP_LISTCOMP:
4545 VISIT(c, expr, elt);
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004546 ADDOP_I(c, LIST_APPEND, depth + 1);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004547 break;
4548 case COMP_SETCOMP:
4549 VISIT(c, expr, elt);
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004550 ADDOP_I(c, SET_ADD, depth + 1);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004551 break;
4552 case COMP_DICTCOMP:
Jörn Heisslerc8a35412019-06-22 16:40:55 +02004553 /* With '{k: v}', k is evaluated before v, so we do
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004554 the same. */
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004555 VISIT(c, expr, elt);
Jörn Heisslerc8a35412019-06-22 16:40:55 +02004556 VISIT(c, expr, val);
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004557 ADDOP_I(c, MAP_ADD, depth + 1);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004558 break;
4559 default:
4560 return 0;
4561 }
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004562 }
4563 compiler_use_next_block(c, if_cleanup);
Mark Shannon582aaf12020-08-04 17:30:11 +01004564 ADDOP_JUMP(c, JUMP_ABSOLUTE, start);
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02004565
4566 compiler_use_next_block(c, except);
4567 ADDOP(c, END_ASYNC_FOR);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004568
4569 return 1;
4570}
4571
4572static int
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004573compiler_comprehension(struct compiler *c, expr_ty e, int type,
Pablo Galindoa5634c42020-09-16 19:42:00 +01004574 identifier name, asdl_comprehension_seq *generators, expr_ty elt,
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004575 expr_ty val)
Nick Coghlan650f0d02007-04-15 12:05:43 +00004576{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004577 PyCodeObject *co = NULL;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004578 comprehension_ty outermost;
Antoine Pitrou86a36b52011-11-25 18:56:07 +01004579 PyObject *qualname = NULL;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004580 int is_async_generator = 0;
Matthias Bussonnierbd461742020-07-06 14:26:52 -07004581 int top_level_await = IS_TOP_LEVEL_AWAIT(c);
Nick Coghlan650f0d02007-04-15 12:05:43 +00004582
Matthias Bussonnierbd461742020-07-06 14:26:52 -07004583
Batuhan TaÅŸkaya9052f7a2020-03-19 14:35:44 +03004584 int is_async_function = c->u->u_ste->ste_coroutine;
Nick Coghlan650f0d02007-04-15 12:05:43 +00004585
Batuhan TaÅŸkaya9052f7a2020-03-19 14:35:44 +03004586 outermost = (comprehension_ty) asdl_seq_GET(generators, 0);
Antoine Pitrou86a36b52011-11-25 18:56:07 +01004587 if (!compiler_enter_scope(c, name, COMPILER_SCOPE_COMPREHENSION,
4588 (void *)e, e->lineno))
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004589 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004590 goto error;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004591 }
4592
4593 is_async_generator = c->u->u_ste->ste_coroutine;
4594
Matthias Bussonnierbd461742020-07-06 14:26:52 -07004595 if (is_async_generator && !is_async_function && type != COMP_GENEXP && !top_level_await) {
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004596 compiler_error(c, "asynchronous comprehension outside of "
4597 "an asynchronous function");
4598 goto error_in_scope;
4599 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00004600
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004601 if (type != COMP_GENEXP) {
4602 int op;
4603 switch (type) {
4604 case COMP_LISTCOMP:
4605 op = BUILD_LIST;
4606 break;
4607 case COMP_SETCOMP:
4608 op = BUILD_SET;
4609 break;
4610 case COMP_DICTCOMP:
4611 op = BUILD_MAP;
4612 break;
4613 default:
4614 PyErr_Format(PyExc_SystemError,
4615 "unknown comprehension type %d", type);
4616 goto error_in_scope;
4617 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00004618
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004619 ADDOP_I(c, op, 0);
4620 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00004621
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004622 if (!compiler_comprehension_generator(c, generators, 0, 0, elt,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004623 val, type))
4624 goto error_in_scope;
Nick Coghlan650f0d02007-04-15 12:05:43 +00004625
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004626 if (type != COMP_GENEXP) {
4627 ADDOP(c, RETURN_VALUE);
4628 }
4629
4630 co = assemble(c, 1);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04004631 qualname = c->u->u_qualname;
4632 Py_INCREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004633 compiler_exit_scope(c);
Matthias Bussonnierbd461742020-07-06 14:26:52 -07004634 if (top_level_await && is_async_generator){
4635 c->u->u_ste->ste_coroutine = 1;
4636 }
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04004637 if (co == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004638 goto error;
4639
Antoine Pitrou86a36b52011-11-25 18:56:07 +01004640 if (!compiler_make_closure(c, co, 0, qualname))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004641 goto error;
Antoine Pitrou86a36b52011-11-25 18:56:07 +01004642 Py_DECREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004643 Py_DECREF(co);
4644
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004645 VISIT(c, expr, outermost->iter);
4646
4647 if (outermost->is_async) {
4648 ADDOP(c, GET_AITER);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004649 } else {
4650 ADDOP(c, GET_ITER);
4651 }
4652
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004653 ADDOP_I(c, CALL_FUNCTION, 1);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004654
4655 if (is_async_generator && type != COMP_GENEXP) {
4656 ADDOP(c, GET_AWAITABLE);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03004657 ADDOP_LOAD_CONST(c, Py_None);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004658 ADDOP(c, YIELD_FROM);
4659 }
4660
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004661 return 1;
Nick Coghlan650f0d02007-04-15 12:05:43 +00004662error_in_scope:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004663 compiler_exit_scope(c);
Nick Coghlan650f0d02007-04-15 12:05:43 +00004664error:
Antoine Pitrou86a36b52011-11-25 18:56:07 +01004665 Py_XDECREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004666 Py_XDECREF(co);
4667 return 0;
Nick Coghlan650f0d02007-04-15 12:05:43 +00004668}
4669
4670static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004671compiler_genexp(struct compiler *c, expr_ty e)
4672{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004673 static identifier name;
4674 if (!name) {
Zackery Spytzf3036392018-04-15 16:12:29 -06004675 name = PyUnicode_InternFromString("<genexpr>");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004676 if (!name)
4677 return 0;
4678 }
4679 assert(e->kind == GeneratorExp_kind);
4680 return compiler_comprehension(c, e, COMP_GENEXP, name,
4681 e->v.GeneratorExp.generators,
4682 e->v.GeneratorExp.elt, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004683}
4684
4685static int
Nick Coghlan650f0d02007-04-15 12:05:43 +00004686compiler_listcomp(struct compiler *c, expr_ty e)
4687{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004688 static identifier name;
4689 if (!name) {
Zackery Spytzf3036392018-04-15 16:12:29 -06004690 name = PyUnicode_InternFromString("<listcomp>");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004691 if (!name)
4692 return 0;
4693 }
4694 assert(e->kind == ListComp_kind);
4695 return compiler_comprehension(c, e, COMP_LISTCOMP, name,
4696 e->v.ListComp.generators,
4697 e->v.ListComp.elt, NULL);
Nick Coghlan650f0d02007-04-15 12:05:43 +00004698}
4699
4700static int
4701compiler_setcomp(struct compiler *c, expr_ty e)
4702{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004703 static identifier name;
4704 if (!name) {
Zackery Spytzf3036392018-04-15 16:12:29 -06004705 name = PyUnicode_InternFromString("<setcomp>");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004706 if (!name)
4707 return 0;
4708 }
4709 assert(e->kind == SetComp_kind);
4710 return compiler_comprehension(c, e, COMP_SETCOMP, name,
4711 e->v.SetComp.generators,
4712 e->v.SetComp.elt, NULL);
Guido van Rossum992d4a32007-07-11 13:09:30 +00004713}
4714
4715
4716static int
4717compiler_dictcomp(struct compiler *c, expr_ty e)
4718{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004719 static identifier name;
4720 if (!name) {
Zackery Spytzf3036392018-04-15 16:12:29 -06004721 name = PyUnicode_InternFromString("<dictcomp>");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004722 if (!name)
4723 return 0;
4724 }
4725 assert(e->kind == DictComp_kind);
4726 return compiler_comprehension(c, e, COMP_DICTCOMP, name,
4727 e->v.DictComp.generators,
4728 e->v.DictComp.key, e->v.DictComp.value);
Nick Coghlan650f0d02007-04-15 12:05:43 +00004729}
4730
4731
4732static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004733compiler_visit_keyword(struct compiler *c, keyword_ty k)
4734{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004735 VISIT(c, expr, k->value);
4736 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004737}
4738
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004739/* Test whether expression is constant. For constants, report
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004740 whether they are true or false.
4741
4742 Return values: 1 for true, 0 for false, -1 for non-constant.
4743 */
4744
4745static int
Mark Shannonfee55262019-11-21 09:11:43 +00004746compiler_with_except_finish(struct compiler *c) {
4747 basicblock *exit;
4748 exit = compiler_new_block(c);
4749 if (exit == NULL)
4750 return 0;
Mark Shannon582aaf12020-08-04 17:30:11 +01004751 ADDOP_JUMP(c, POP_JUMP_IF_TRUE, exit);
Mark Shannon266b4622020-11-17 19:30:14 +00004752 NEXT_BLOCK(c);
Mark Shannonfee55262019-11-21 09:11:43 +00004753 ADDOP(c, RERAISE);
4754 compiler_use_next_block(c, exit);
4755 ADDOP(c, POP_TOP);
4756 ADDOP(c, POP_TOP);
4757 ADDOP(c, POP_TOP);
4758 ADDOP(c, POP_EXCEPT);
4759 ADDOP(c, POP_TOP);
4760 return 1;
4761}
Yury Selivanov75445082015-05-11 22:57:16 -04004762
4763/*
4764 Implements the async with statement.
4765
4766 The semantics outlined in that PEP are as follows:
4767
4768 async with EXPR as VAR:
4769 BLOCK
4770
4771 It is implemented roughly as:
4772
4773 context = EXPR
4774 exit = context.__aexit__ # not calling it
4775 value = await context.__aenter__()
4776 try:
4777 VAR = value # if VAR present in the syntax
4778 BLOCK
4779 finally:
4780 if an exception was raised:
Serhiy Storchakaec466a12015-06-11 00:09:32 +03004781 exc = copy of (exception, instance, traceback)
Yury Selivanov75445082015-05-11 22:57:16 -04004782 else:
Serhiy Storchakaec466a12015-06-11 00:09:32 +03004783 exc = (None, None, None)
Yury Selivanov75445082015-05-11 22:57:16 -04004784 if not (await exit(*exc)):
4785 raise
4786 */
4787static int
4788compiler_async_with(struct compiler *c, stmt_ty s, int pos)
4789{
Mark Shannonfee55262019-11-21 09:11:43 +00004790 basicblock *block, *final, *exit;
Yury Selivanov75445082015-05-11 22:57:16 -04004791 withitem_ty item = asdl_seq_GET(s->v.AsyncWith.items, pos);
4792
4793 assert(s->kind == AsyncWith_kind);
Pablo Galindo90235812020-03-15 04:29:22 +00004794 if (IS_TOP_LEVEL_AWAIT(c)){
Matthias Bussonnier565b4f12019-05-21 13:12:03 -07004795 c->u->u_ste->ste_coroutine = 1;
4796 } else if (c->u->u_scope_type != COMPILER_SCOPE_ASYNC_FUNCTION){
Zsolt Dollensteine2396502018-04-27 08:58:56 -07004797 return compiler_error(c, "'async with' outside async function");
4798 }
Yury Selivanov75445082015-05-11 22:57:16 -04004799
4800 block = compiler_new_block(c);
Mark Shannonfee55262019-11-21 09:11:43 +00004801 final = compiler_new_block(c);
4802 exit = compiler_new_block(c);
4803 if (!block || !final || !exit)
Yury Selivanov75445082015-05-11 22:57:16 -04004804 return 0;
4805
4806 /* Evaluate EXPR */
4807 VISIT(c, expr, item->context_expr);
4808
4809 ADDOP(c, BEFORE_ASYNC_WITH);
4810 ADDOP(c, GET_AWAITABLE);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03004811 ADDOP_LOAD_CONST(c, Py_None);
Yury Selivanov75445082015-05-11 22:57:16 -04004812 ADDOP(c, YIELD_FROM);
4813
Mark Shannon582aaf12020-08-04 17:30:11 +01004814 ADDOP_JUMP(c, SETUP_ASYNC_WITH, final);
Yury Selivanov75445082015-05-11 22:57:16 -04004815
4816 /* SETUP_ASYNC_WITH pushes a finally block. */
4817 compiler_use_next_block(c, block);
Mark Shannonfee55262019-11-21 09:11:43 +00004818 if (!compiler_push_fblock(c, ASYNC_WITH, block, final, NULL)) {
Yury Selivanov75445082015-05-11 22:57:16 -04004819 return 0;
4820 }
4821
4822 if (item->optional_vars) {
4823 VISIT(c, expr, item->optional_vars);
4824 }
4825 else {
4826 /* Discard result from context.__aenter__() */
4827 ADDOP(c, POP_TOP);
4828 }
4829
4830 pos++;
4831 if (pos == asdl_seq_LEN(s->v.AsyncWith.items))
4832 /* BLOCK code */
4833 VISIT_SEQ(c, stmt, s->v.AsyncWith.body)
4834 else if (!compiler_async_with(c, s, pos))
4835 return 0;
4836
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004837 compiler_pop_fblock(c, ASYNC_WITH, block);
Mark Shannonfee55262019-11-21 09:11:43 +00004838 ADDOP(c, POP_BLOCK);
4839 /* End of body; start the cleanup */
Yury Selivanov75445082015-05-11 22:57:16 -04004840
Mark Shannonfee55262019-11-21 09:11:43 +00004841 /* For successful outcome:
4842 * call __exit__(None, None, None)
4843 */
4844 if(!compiler_call_exit_with_nones(c))
Yury Selivanov75445082015-05-11 22:57:16 -04004845 return 0;
Mark Shannonfee55262019-11-21 09:11:43 +00004846 ADDOP(c, GET_AWAITABLE);
4847 ADDOP_O(c, LOAD_CONST, Py_None, consts);
4848 ADDOP(c, YIELD_FROM);
Yury Selivanov75445082015-05-11 22:57:16 -04004849
Mark Shannonfee55262019-11-21 09:11:43 +00004850 ADDOP(c, POP_TOP);
Yury Selivanov75445082015-05-11 22:57:16 -04004851
Mark Shannon582aaf12020-08-04 17:30:11 +01004852 ADDOP_JUMP(c, JUMP_ABSOLUTE, exit);
Mark Shannonfee55262019-11-21 09:11:43 +00004853
4854 /* For exceptional outcome: */
4855 compiler_use_next_block(c, final);
4856
4857 ADDOP(c, WITH_EXCEPT_START);
Yury Selivanov75445082015-05-11 22:57:16 -04004858 ADDOP(c, GET_AWAITABLE);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03004859 ADDOP_LOAD_CONST(c, Py_None);
Yury Selivanov75445082015-05-11 22:57:16 -04004860 ADDOP(c, YIELD_FROM);
Mark Shannonfee55262019-11-21 09:11:43 +00004861 compiler_with_except_finish(c);
Yury Selivanov75445082015-05-11 22:57:16 -04004862
Mark Shannonfee55262019-11-21 09:11:43 +00004863compiler_use_next_block(c, exit);
Yury Selivanov75445082015-05-11 22:57:16 -04004864 return 1;
4865}
4866
4867
Guido van Rossumc2e20742006-02-27 22:32:47 +00004868/*
4869 Implements the with statement from PEP 343.
Guido van Rossumc2e20742006-02-27 22:32:47 +00004870 with EXPR as VAR:
4871 BLOCK
Mark Shannonfee55262019-11-21 09:11:43 +00004872 is implemented as:
4873 <code for EXPR>
4874 SETUP_WITH E
4875 <code to store to VAR> or POP_TOP
4876 <code for BLOCK>
4877 LOAD_CONST (None, None, None)
4878 CALL_FUNCTION_EX 0
4879 JUMP_FORWARD EXIT
4880 E: WITH_EXCEPT_START (calls EXPR.__exit__)
4881 POP_JUMP_IF_TRUE T:
4882 RERAISE
4883 T: POP_TOP * 3 (remove exception from stack)
4884 POP_EXCEPT
4885 POP_TOP
4886 EXIT:
Guido van Rossumc2e20742006-02-27 22:32:47 +00004887 */
Mark Shannonfee55262019-11-21 09:11:43 +00004888
Guido van Rossumc2e20742006-02-27 22:32:47 +00004889static int
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004890compiler_with(struct compiler *c, stmt_ty s, int pos)
Guido van Rossumc2e20742006-02-27 22:32:47 +00004891{
Mark Shannonfee55262019-11-21 09:11:43 +00004892 basicblock *block, *final, *exit;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004893 withitem_ty item = asdl_seq_GET(s->v.With.items, pos);
Guido van Rossumc2e20742006-02-27 22:32:47 +00004894
4895 assert(s->kind == With_kind);
4896
Guido van Rossumc2e20742006-02-27 22:32:47 +00004897 block = compiler_new_block(c);
Mark Shannonfee55262019-11-21 09:11:43 +00004898 final = compiler_new_block(c);
4899 exit = compiler_new_block(c);
4900 if (!block || !final || !exit)
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00004901 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00004902
Thomas Wouters477c8d52006-05-27 19:21:47 +00004903 /* Evaluate EXPR */
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004904 VISIT(c, expr, item->context_expr);
Mark Shannonfee55262019-11-21 09:11:43 +00004905 /* Will push bound __exit__ */
Mark Shannon582aaf12020-08-04 17:30:11 +01004906 ADDOP_JUMP(c, SETUP_WITH, final);
Guido van Rossumc2e20742006-02-27 22:32:47 +00004907
Benjamin Peterson876b2f22009-06-28 03:18:59 +00004908 /* SETUP_WITH pushes a finally block. */
Guido van Rossumc2e20742006-02-27 22:32:47 +00004909 compiler_use_next_block(c, block);
Mark Shannonfee55262019-11-21 09:11:43 +00004910 if (!compiler_push_fblock(c, WITH, block, final, NULL)) {
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00004911 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00004912 }
4913
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004914 if (item->optional_vars) {
4915 VISIT(c, expr, item->optional_vars);
Benjamin Peterson876b2f22009-06-28 03:18:59 +00004916 }
4917 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004918 /* Discard result from context.__enter__() */
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00004919 ADDOP(c, POP_TOP);
Guido van Rossumc2e20742006-02-27 22:32:47 +00004920 }
4921
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004922 pos++;
4923 if (pos == asdl_seq_LEN(s->v.With.items))
4924 /* BLOCK code */
4925 VISIT_SEQ(c, stmt, s->v.With.body)
4926 else if (!compiler_with(c, s, pos))
4927 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00004928
Guido van Rossumc2e20742006-02-27 22:32:47 +00004929 ADDOP(c, POP_BLOCK);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004930 compiler_pop_fblock(c, WITH, block);
Mark Shannon13bc1392020-01-23 09:25:17 +00004931
Mark Shannonfee55262019-11-21 09:11:43 +00004932 /* End of body; start the cleanup. */
Mark Shannon13bc1392020-01-23 09:25:17 +00004933
Mark Shannonfee55262019-11-21 09:11:43 +00004934 /* For successful outcome:
4935 * call __exit__(None, None, None)
4936 */
4937 if (!compiler_call_exit_with_nones(c))
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00004938 return 0;
Mark Shannonfee55262019-11-21 09:11:43 +00004939 ADDOP(c, POP_TOP);
Mark Shannon582aaf12020-08-04 17:30:11 +01004940 ADDOP_JUMP(c, JUMP_FORWARD, exit);
Guido van Rossumc2e20742006-02-27 22:32:47 +00004941
Mark Shannonfee55262019-11-21 09:11:43 +00004942 /* For exceptional outcome: */
4943 compiler_use_next_block(c, final);
Guido van Rossumc2e20742006-02-27 22:32:47 +00004944
Mark Shannonfee55262019-11-21 09:11:43 +00004945 ADDOP(c, WITH_EXCEPT_START);
4946 compiler_with_except_finish(c);
4947
4948 compiler_use_next_block(c, exit);
Guido van Rossumc2e20742006-02-27 22:32:47 +00004949 return 1;
4950}
4951
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004952static int
Serhiy Storchakada8d72c2018-09-17 15:17:29 +03004953compiler_visit_expr1(struct compiler *c, expr_ty e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004954{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004955 switch (e->kind) {
Emily Morehouse8f59ee02019-01-24 16:49:56 -07004956 case NamedExpr_kind:
4957 VISIT(c, expr, e->v.NamedExpr.value);
4958 ADDOP(c, DUP_TOP);
4959 VISIT(c, expr, e->v.NamedExpr.target);
4960 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004961 case BoolOp_kind:
4962 return compiler_boolop(c, e);
4963 case BinOp_kind:
4964 VISIT(c, expr, e->v.BinOp.left);
4965 VISIT(c, expr, e->v.BinOp.right);
Andy Lester76d58772020-03-10 21:18:12 -05004966 ADDOP(c, binop(e->v.BinOp.op));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004967 break;
4968 case UnaryOp_kind:
4969 VISIT(c, expr, e->v.UnaryOp.operand);
4970 ADDOP(c, unaryop(e->v.UnaryOp.op));
4971 break;
4972 case Lambda_kind:
4973 return compiler_lambda(c, e);
4974 case IfExp_kind:
4975 return compiler_ifexp(c, e);
4976 case Dict_kind:
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004977 return compiler_dict(c, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004978 case Set_kind:
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004979 return compiler_set(c, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004980 case GeneratorExp_kind:
4981 return compiler_genexp(c, e);
4982 case ListComp_kind:
4983 return compiler_listcomp(c, e);
4984 case SetComp_kind:
4985 return compiler_setcomp(c, e);
4986 case DictComp_kind:
4987 return compiler_dictcomp(c, e);
4988 case Yield_kind:
4989 if (c->u->u_ste->ste_type != FunctionBlock)
4990 return compiler_error(c, "'yield' outside function");
Mark Dickinsonded35ae2012-11-25 14:36:26 +00004991 if (e->v.Yield.value) {
4992 VISIT(c, expr, e->v.Yield.value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004993 }
4994 else {
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03004995 ADDOP_LOAD_CONST(c, Py_None);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004996 }
Mark Dickinsonded35ae2012-11-25 14:36:26 +00004997 ADDOP(c, YIELD_VALUE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004998 break;
Mark Dickinsonded35ae2012-11-25 14:36:26 +00004999 case YieldFrom_kind:
5000 if (c->u->u_ste->ste_type != FunctionBlock)
5001 return compiler_error(c, "'yield' outside function");
Yury Selivanov75445082015-05-11 22:57:16 -04005002
5003 if (c->u->u_scope_type == COMPILER_SCOPE_ASYNC_FUNCTION)
5004 return compiler_error(c, "'yield from' inside async function");
5005
Mark Dickinsonded35ae2012-11-25 14:36:26 +00005006 VISIT(c, expr, e->v.YieldFrom.value);
Yury Selivanov5376ba92015-06-22 12:19:30 -04005007 ADDOP(c, GET_YIELD_FROM_ITER);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005008 ADDOP_LOAD_CONST(c, Py_None);
Mark Dickinsonded35ae2012-11-25 14:36:26 +00005009 ADDOP(c, YIELD_FROM);
5010 break;
Yury Selivanov75445082015-05-11 22:57:16 -04005011 case Await_kind:
Pablo Galindo90235812020-03-15 04:29:22 +00005012 if (!IS_TOP_LEVEL_AWAIT(c)){
Matthias Bussonnier565b4f12019-05-21 13:12:03 -07005013 if (c->u->u_ste->ste_type != FunctionBlock){
5014 return compiler_error(c, "'await' outside function");
5015 }
Yury Selivanov75445082015-05-11 22:57:16 -04005016
Victor Stinner331a6a52019-05-27 16:39:22 +02005017 if (c->u->u_scope_type != COMPILER_SCOPE_ASYNC_FUNCTION &&
Matthias Bussonnier565b4f12019-05-21 13:12:03 -07005018 c->u->u_scope_type != COMPILER_SCOPE_COMPREHENSION){
5019 return compiler_error(c, "'await' outside async function");
5020 }
5021 }
Yury Selivanov75445082015-05-11 22:57:16 -04005022
5023 VISIT(c, expr, e->v.Await.value);
5024 ADDOP(c, GET_AWAITABLE);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005025 ADDOP_LOAD_CONST(c, Py_None);
Yury Selivanov75445082015-05-11 22:57:16 -04005026 ADDOP(c, YIELD_FROM);
5027 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005028 case Compare_kind:
5029 return compiler_compare(c, e);
5030 case Call_kind:
5031 return compiler_call(c, e);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01005032 case Constant_kind:
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005033 ADDOP_LOAD_CONST(c, e->v.Constant.value);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01005034 break;
Eric V. Smith235a6f02015-09-19 14:51:32 -04005035 case JoinedStr_kind:
5036 return compiler_joined_str(c, e);
5037 case FormattedValue_kind:
5038 return compiler_formatted_value(c, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005039 /* The following exprs can be assignment targets. */
5040 case Attribute_kind:
Serhiy Storchaka6b975982020-03-17 23:41:08 +02005041 VISIT(c, expr, e->v.Attribute.value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005042 switch (e->v.Attribute.ctx) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005043 case Load:
5044 ADDOP_NAME(c, LOAD_ATTR, e->v.Attribute.attr, names);
5045 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005046 case Store:
Pablo Galindoc5fc1562020-04-22 23:29:27 +01005047 if (forbidden_name(c, e->v.Attribute.attr, e->v.Attribute.ctx))
5048 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005049 ADDOP_NAME(c, STORE_ATTR, e->v.Attribute.attr, names);
5050 break;
5051 case Del:
5052 ADDOP_NAME(c, DELETE_ATTR, e->v.Attribute.attr, names);
5053 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005054 }
5055 break;
5056 case Subscript_kind:
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005057 return compiler_subscript(c, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005058 case Starred_kind:
5059 switch (e->v.Starred.ctx) {
5060 case Store:
5061 /* In all legitimate cases, the Starred node was already replaced
5062 * by compiler_list/compiler_tuple. XXX: is that okay? */
5063 return compiler_error(c,
5064 "starred assignment target must be in a list or tuple");
5065 default:
5066 return compiler_error(c,
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04005067 "can't use starred expression here");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005068 }
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005069 break;
5070 case Slice_kind:
5071 return compiler_slice(c, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005072 case Name_kind:
5073 return compiler_nameop(c, e->v.Name.id, e->v.Name.ctx);
5074 /* child nodes of List and Tuple will have expr_context set */
5075 case List_kind:
5076 return compiler_list(c, e);
5077 case Tuple_kind:
5078 return compiler_tuple(c, e);
5079 }
5080 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005081}
5082
5083static int
Serhiy Storchakada8d72c2018-09-17 15:17:29 +03005084compiler_visit_expr(struct compiler *c, expr_ty e)
5085{
Serhiy Storchakada8d72c2018-09-17 15:17:29 +03005086 int old_lineno = c->u->u_lineno;
5087 int old_col_offset = c->u->u_col_offset;
Serhiy Storchaka61cb3d02020-03-17 18:07:30 +02005088 SET_LOC(c, e);
Serhiy Storchakada8d72c2018-09-17 15:17:29 +03005089 int res = compiler_visit_expr1(c, e);
Serhiy Storchaka61cb3d02020-03-17 18:07:30 +02005090 c->u->u_lineno = old_lineno;
Serhiy Storchakada8d72c2018-09-17 15:17:29 +03005091 c->u->u_col_offset = old_col_offset;
5092 return res;
5093}
5094
5095static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005096compiler_augassign(struct compiler *c, stmt_ty s)
5097{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005098 assert(s->kind == AugAssign_kind);
Serhiy Storchaka6b975982020-03-17 23:41:08 +02005099 expr_ty e = s->v.AugAssign.target;
5100
5101 int old_lineno = c->u->u_lineno;
5102 int old_col_offset = c->u->u_col_offset;
5103 SET_LOC(c, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005104
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005105 switch (e->kind) {
5106 case Attribute_kind:
Serhiy Storchaka6b975982020-03-17 23:41:08 +02005107 VISIT(c, expr, e->v.Attribute.value);
5108 ADDOP(c, DUP_TOP);
5109 ADDOP_NAME(c, LOAD_ATTR, e->v.Attribute.attr, names);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005110 break;
5111 case Subscript_kind:
Serhiy Storchaka6b975982020-03-17 23:41:08 +02005112 VISIT(c, expr, e->v.Subscript.value);
5113 VISIT(c, expr, e->v.Subscript.slice);
5114 ADDOP(c, DUP_TOP_TWO);
5115 ADDOP(c, BINARY_SUBSCR);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005116 break;
5117 case Name_kind:
5118 if (!compiler_nameop(c, e->v.Name.id, Load))
5119 return 0;
Serhiy Storchaka6b975982020-03-17 23:41:08 +02005120 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005121 default:
5122 PyErr_Format(PyExc_SystemError,
5123 "invalid node type (%d) for augmented assignment",
5124 e->kind);
5125 return 0;
5126 }
Serhiy Storchaka6b975982020-03-17 23:41:08 +02005127
5128 c->u->u_lineno = old_lineno;
5129 c->u->u_col_offset = old_col_offset;
5130
5131 VISIT(c, expr, s->v.AugAssign.value);
5132 ADDOP(c, inplace_binop(s->v.AugAssign.op));
5133
5134 SET_LOC(c, e);
5135
5136 switch (e->kind) {
5137 case Attribute_kind:
5138 ADDOP(c, ROT_TWO);
5139 ADDOP_NAME(c, STORE_ATTR, e->v.Attribute.attr, names);
5140 break;
5141 case Subscript_kind:
5142 ADDOP(c, ROT_THREE);
5143 ADDOP(c, STORE_SUBSCR);
5144 break;
5145 case Name_kind:
5146 return compiler_nameop(c, e->v.Name.id, Store);
5147 default:
5148 Py_UNREACHABLE();
5149 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005150 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005151}
5152
5153static int
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005154check_ann_expr(struct compiler *c, expr_ty e)
5155{
5156 VISIT(c, expr, e);
5157 ADDOP(c, POP_TOP);
5158 return 1;
5159}
5160
5161static int
5162check_annotation(struct compiler *c, stmt_ty s)
5163{
5164 /* Annotations are only evaluated in a module or class. */
5165 if (c->u->u_scope_type == COMPILER_SCOPE_MODULE ||
5166 c->u->u_scope_type == COMPILER_SCOPE_CLASS) {
5167 return check_ann_expr(c, s->v.AnnAssign.annotation);
5168 }
5169 return 1;
5170}
5171
5172static int
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005173check_ann_subscr(struct compiler *c, expr_ty e)
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005174{
5175 /* We check that everything in a subscript is defined at runtime. */
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005176 switch (e->kind) {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005177 case Slice_kind:
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005178 if (e->v.Slice.lower && !check_ann_expr(c, e->v.Slice.lower)) {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005179 return 0;
5180 }
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005181 if (e->v.Slice.upper && !check_ann_expr(c, e->v.Slice.upper)) {
5182 return 0;
5183 }
5184 if (e->v.Slice.step && !check_ann_expr(c, e->v.Slice.step)) {
5185 return 0;
5186 }
5187 return 1;
5188 case Tuple_kind: {
5189 /* extended slice */
Pablo Galindoa5634c42020-09-16 19:42:00 +01005190 asdl_expr_seq *elts = e->v.Tuple.elts;
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005191 Py_ssize_t i, n = asdl_seq_LEN(elts);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005192 for (i = 0; i < n; i++) {
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005193 if (!check_ann_subscr(c, asdl_seq_GET(elts, i))) {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005194 return 0;
5195 }
5196 }
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005197 return 1;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005198 }
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005199 default:
5200 return check_ann_expr(c, e);
5201 }
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005202}
5203
5204static int
5205compiler_annassign(struct compiler *c, stmt_ty s)
5206{
5207 expr_ty targ = s->v.AnnAssign.target;
Guido van Rossum015d8742016-09-11 09:45:24 -07005208 PyObject* mangled;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005209
5210 assert(s->kind == AnnAssign_kind);
5211
5212 /* We perform the actual assignment first. */
5213 if (s->v.AnnAssign.value) {
5214 VISIT(c, expr, s->v.AnnAssign.value);
5215 VISIT(c, expr, targ);
5216 }
5217 switch (targ->kind) {
5218 case Name_kind:
Pablo Galindoc5fc1562020-04-22 23:29:27 +01005219 if (forbidden_name(c, targ->v.Name.id, Store))
5220 return 0;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005221 /* If we have a simple name in a module or class, store annotation. */
5222 if (s->v.AnnAssign.simple &&
5223 (c->u->u_scope_type == COMPILER_SCOPE_MODULE ||
5224 c->u->u_scope_type == COMPILER_SCOPE_CLASS)) {
Batuhan Taskaya044a1042020-10-06 23:03:02 +03005225 VISIT(c, annexpr, s->v.AnnAssign.annotation);
Mark Shannon332cd5e2018-01-30 00:41:04 +00005226 ADDOP_NAME(c, LOAD_NAME, __annotations__, names);
Serhiy Storchakaa95d9862018-03-24 22:42:35 +02005227 mangled = _Py_Mangle(c->u->u_private, targ->v.Name.id);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005228 ADDOP_LOAD_CONST_NEW(c, mangled);
Mark Shannon332cd5e2018-01-30 00:41:04 +00005229 ADDOP(c, STORE_SUBSCR);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005230 }
5231 break;
5232 case Attribute_kind:
Pablo Galindoc5fc1562020-04-22 23:29:27 +01005233 if (forbidden_name(c, targ->v.Attribute.attr, Store))
5234 return 0;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005235 if (!s->v.AnnAssign.value &&
5236 !check_ann_expr(c, targ->v.Attribute.value)) {
5237 return 0;
5238 }
5239 break;
5240 case Subscript_kind:
5241 if (!s->v.AnnAssign.value &&
5242 (!check_ann_expr(c, targ->v.Subscript.value) ||
5243 !check_ann_subscr(c, targ->v.Subscript.slice))) {
5244 return 0;
5245 }
5246 break;
5247 default:
5248 PyErr_Format(PyExc_SystemError,
5249 "invalid node type (%d) for annotated assignment",
5250 targ->kind);
5251 return 0;
5252 }
5253 /* Annotation is evaluated last. */
5254 if (!s->v.AnnAssign.simple && !check_annotation(c, s)) {
5255 return 0;
5256 }
5257 return 1;
5258}
5259
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005260/* Raises a SyntaxError and returns 0.
5261 If something goes wrong, a different exception may be raised.
5262*/
5263
5264static int
5265compiler_error(struct compiler *c, const char *errstr)
5266{
Benjamin Peterson43b06862011-05-27 09:08:01 -05005267 PyObject *loc;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005268 PyObject *u = NULL, *v = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005269
Victor Stinner14e461d2013-08-26 22:28:21 +02005270 loc = PyErr_ProgramTextObject(c->c_filename, c->u->u_lineno);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005271 if (!loc) {
5272 Py_INCREF(Py_None);
5273 loc = Py_None;
5274 }
Victor Stinner14e461d2013-08-26 22:28:21 +02005275 u = Py_BuildValue("(OiiO)", c->c_filename, c->u->u_lineno,
Ammar Askar025eb982018-09-24 17:12:49 -04005276 c->u->u_col_offset + 1, loc);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005277 if (!u)
5278 goto exit;
5279 v = Py_BuildValue("(zO)", errstr, u);
5280 if (!v)
5281 goto exit;
5282 PyErr_SetObject(PyExc_SyntaxError, v);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005283 exit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005284 Py_DECREF(loc);
5285 Py_XDECREF(u);
5286 Py_XDECREF(v);
5287 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005288}
5289
Serhiy Storchakad31e7732018-10-21 10:09:39 +03005290/* Emits a SyntaxWarning and returns 1 on success.
5291 If a SyntaxWarning raised as error, replaces it with a SyntaxError
5292 and returns 0.
5293*/
5294static int
Serhiy Storchaka62e44812019-02-16 08:12:19 +02005295compiler_warn(struct compiler *c, const char *format, ...)
Serhiy Storchakad31e7732018-10-21 10:09:39 +03005296{
Serhiy Storchaka62e44812019-02-16 08:12:19 +02005297 va_list vargs;
5298#ifdef HAVE_STDARG_PROTOTYPES
5299 va_start(vargs, format);
5300#else
5301 va_start(vargs);
5302#endif
5303 PyObject *msg = PyUnicode_FromFormatV(format, vargs);
5304 va_end(vargs);
Serhiy Storchakad31e7732018-10-21 10:09:39 +03005305 if (msg == NULL) {
5306 return 0;
5307 }
5308 if (PyErr_WarnExplicitObject(PyExc_SyntaxWarning, msg, c->c_filename,
5309 c->u->u_lineno, NULL, NULL) < 0)
5310 {
Serhiy Storchakad31e7732018-10-21 10:09:39 +03005311 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
Serhiy Storchaka62e44812019-02-16 08:12:19 +02005312 /* Replace the SyntaxWarning exception with a SyntaxError
5313 to get a more accurate error report */
Serhiy Storchakad31e7732018-10-21 10:09:39 +03005314 PyErr_Clear();
Serhiy Storchaka62e44812019-02-16 08:12:19 +02005315 assert(PyUnicode_AsUTF8(msg) != NULL);
5316 compiler_error(c, PyUnicode_AsUTF8(msg));
Serhiy Storchakad31e7732018-10-21 10:09:39 +03005317 }
Serhiy Storchaka62e44812019-02-16 08:12:19 +02005318 Py_DECREF(msg);
Serhiy Storchakad31e7732018-10-21 10:09:39 +03005319 return 0;
5320 }
5321 Py_DECREF(msg);
5322 return 1;
5323}
5324
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005325static int
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005326compiler_subscript(struct compiler *c, expr_ty e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005327{
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005328 expr_context_ty ctx = e->v.Subscript.ctx;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005329 int op = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005330
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005331 if (ctx == Load) {
5332 if (!check_subscripter(c, e->v.Subscript.value)) {
5333 return 0;
5334 }
5335 if (!check_index(c, e->v.Subscript.value, e->v.Subscript.slice)) {
5336 return 0;
5337 }
5338 }
5339
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005340 switch (ctx) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005341 case Load: op = BINARY_SUBSCR; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005342 case Store: op = STORE_SUBSCR; break;
5343 case Del: op = DELETE_SUBSCR; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005344 }
Serhiy Storchaka6b975982020-03-17 23:41:08 +02005345 assert(op);
5346 VISIT(c, expr, e->v.Subscript.value);
5347 VISIT(c, expr, e->v.Subscript.slice);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005348 ADDOP(c, op);
5349 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005350}
5351
5352static int
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005353compiler_slice(struct compiler *c, expr_ty s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005354{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005355 int n = 2;
5356 assert(s->kind == Slice_kind);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005357
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005358 /* only handles the cases where BUILD_SLICE is emitted */
5359 if (s->v.Slice.lower) {
5360 VISIT(c, expr, s->v.Slice.lower);
5361 }
5362 else {
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005363 ADDOP_LOAD_CONST(c, Py_None);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005364 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005365
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005366 if (s->v.Slice.upper) {
5367 VISIT(c, expr, s->v.Slice.upper);
5368 }
5369 else {
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005370 ADDOP_LOAD_CONST(c, Py_None);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005371 }
5372
5373 if (s->v.Slice.step) {
5374 n++;
5375 VISIT(c, expr, s->v.Slice.step);
5376 }
5377 ADDOP_I(c, BUILD_SLICE, n);
5378 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005379}
5380
Thomas Wouters89f507f2006-12-13 04:49:30 +00005381/* End of the compiler section, beginning of the assembler section */
5382
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005383/* do depth-first search of basic block graph, starting with block.
T. Wouters99b54d62019-09-12 07:05:33 -07005384 post records the block indices in post-order.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005385
5386 XXX must handle implicit jumps from one block to next
5387*/
5388
Thomas Wouters89f507f2006-12-13 04:49:30 +00005389struct assembler {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005390 PyObject *a_bytecode; /* string containing bytecode */
5391 int a_offset; /* offset into bytecode */
5392 int a_nblocks; /* number of reachable blocks */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005393 PyObject *a_lnotab; /* string containing lnotab */
5394 int a_lnotab_off; /* offset into lnotab */
Mark Shannon877df852020-11-12 09:43:29 +00005395 int a_prevlineno; /* lineno of last emitted line in line table */
5396 int a_lineno; /* lineno of last emitted instruction */
5397 int a_lineno_start; /* bytecode start offset of current lineno */
Mark Shannoncc75ab72020-11-12 19:49:33 +00005398 basicblock *a_entry;
Thomas Wouters89f507f2006-12-13 04:49:30 +00005399};
5400
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005401Py_LOCAL_INLINE(void)
5402stackdepth_push(basicblock ***sp, basicblock *b, int depth)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005403{
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02005404 assert(b->b_startdepth < 0 || b->b_startdepth == depth);
Mark Shannonfee55262019-11-21 09:11:43 +00005405 if (b->b_startdepth < depth && b->b_startdepth < 100) {
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005406 assert(b->b_startdepth < 0);
5407 b->b_startdepth = depth;
5408 *(*sp)++ = b;
Serhiy Storchakad4864c62018-01-09 21:54:52 +02005409 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005410}
5411
5412/* Find the flow path that needs the largest stack. We assume that
5413 * cycles in the flow graph have no net effect on the stack depth.
5414 */
5415static int
5416stackdepth(struct compiler *c)
5417{
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005418 basicblock *b, *entryblock = NULL;
5419 basicblock **stack, **sp;
5420 int nblocks = 0, maxdepth = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005421 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005422 b->b_startdepth = INT_MIN;
5423 entryblock = b;
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005424 nblocks++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005425 }
5426 if (!entryblock)
5427 return 0;
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005428 stack = (basicblock **)PyObject_Malloc(sizeof(basicblock *) * nblocks);
5429 if (!stack) {
5430 PyErr_NoMemory();
5431 return -1;
5432 }
5433
5434 sp = stack;
5435 stackdepth_push(&sp, entryblock, 0);
5436 while (sp != stack) {
5437 b = *--sp;
5438 int depth = b->b_startdepth;
5439 assert(depth >= 0);
5440 basicblock *next = b->b_next;
5441 for (int i = 0; i < b->b_iused; i++) {
5442 struct instr *instr = &b->b_instr[i];
5443 int effect = stack_effect(instr->i_opcode, instr->i_oparg, 0);
5444 if (effect == PY_INVALID_STACK_EFFECT) {
Victor Stinner87d3b9d2020-03-25 19:27:36 +01005445 _Py_FatalErrorFormat(__func__,
5446 "opcode = %d", instr->i_opcode);
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005447 }
5448 int new_depth = depth + effect;
5449 if (new_depth > maxdepth) {
5450 maxdepth = new_depth;
5451 }
5452 assert(depth >= 0); /* invalid code or bug in stackdepth() */
Mark Shannon582aaf12020-08-04 17:30:11 +01005453 if (is_jump(instr)) {
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005454 effect = stack_effect(instr->i_opcode, instr->i_oparg, 1);
5455 assert(effect != PY_INVALID_STACK_EFFECT);
5456 int target_depth = depth + effect;
5457 if (target_depth > maxdepth) {
5458 maxdepth = target_depth;
5459 }
5460 assert(target_depth >= 0); /* invalid code or bug in stackdepth() */
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005461 stackdepth_push(&sp, instr->i_target, target_depth);
5462 }
5463 depth = new_depth;
5464 if (instr->i_opcode == JUMP_ABSOLUTE ||
5465 instr->i_opcode == JUMP_FORWARD ||
5466 instr->i_opcode == RETURN_VALUE ||
Mark Shannonfee55262019-11-21 09:11:43 +00005467 instr->i_opcode == RAISE_VARARGS ||
5468 instr->i_opcode == RERAISE)
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005469 {
5470 /* remaining code is dead */
5471 next = NULL;
5472 break;
5473 }
5474 }
5475 if (next != NULL) {
Mark Shannon266b4622020-11-17 19:30:14 +00005476 assert(b->b_nofallthrough == 0);
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005477 stackdepth_push(&sp, next, depth);
5478 }
5479 }
5480 PyObject_Free(stack);
5481 return maxdepth;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005482}
5483
5484static int
5485assemble_init(struct assembler *a, int nblocks, int firstlineno)
5486{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005487 memset(a, 0, sizeof(struct assembler));
Mark Shannon877df852020-11-12 09:43:29 +00005488 a->a_prevlineno = a->a_lineno = firstlineno;
Mark Shannonfd009e62020-11-13 12:53:53 +00005489 a->a_lnotab = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005490 a->a_bytecode = PyBytes_FromStringAndSize(NULL, DEFAULT_CODE_SIZE);
Mark Shannonfd009e62020-11-13 12:53:53 +00005491 if (a->a_bytecode == NULL) {
5492 goto error;
5493 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005494 a->a_lnotab = PyBytes_FromStringAndSize(NULL, DEFAULT_LNOTAB_SIZE);
Mark Shannonfd009e62020-11-13 12:53:53 +00005495 if (a->a_lnotab == NULL) {
5496 goto error;
5497 }
Benjamin Peterson2f8bfef2016-09-07 09:26:18 -07005498 if ((size_t)nblocks > SIZE_MAX / sizeof(basicblock *)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005499 PyErr_NoMemory();
Mark Shannonfd009e62020-11-13 12:53:53 +00005500 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005501 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005502 return 1;
Mark Shannonfd009e62020-11-13 12:53:53 +00005503error:
5504 Py_XDECREF(a->a_bytecode);
5505 Py_XDECREF(a->a_lnotab);
5506 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005507}
5508
5509static void
5510assemble_free(struct assembler *a)
5511{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005512 Py_XDECREF(a->a_bytecode);
5513 Py_XDECREF(a->a_lnotab);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005514}
5515
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005516static int
5517blocksize(basicblock *b)
5518{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005519 int i;
5520 int size = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005521
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005522 for (i = 0; i < b->b_iused; i++)
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005523 size += instrsize(b->b_instr[i].i_oparg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005524 return size;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005525}
5526
Guido van Rossumf68d8e52001-04-14 17:55:09 +00005527static int
Mark Shannon877df852020-11-12 09:43:29 +00005528assemble_emit_linetable_pair(struct assembler *a, int bdelta, int ldelta)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005529{
Mark Shannon877df852020-11-12 09:43:29 +00005530 Py_ssize_t len = PyBytes_GET_SIZE(a->a_lnotab);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005531 if (a->a_lnotab_off + 2 >= len) {
5532 if (_PyBytes_Resize(&a->a_lnotab, len * 2) < 0)
5533 return 0;
5534 }
Mark Shannon877df852020-11-12 09:43:29 +00005535 unsigned char *lnotab = (unsigned char *)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005536 PyBytes_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
Tim Peters51e26512001-09-07 08:45:55 +00005537
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005538 a->a_lnotab_off += 2;
Mark Shannon877df852020-11-12 09:43:29 +00005539 *lnotab++ = bdelta;
5540 *lnotab++ = ldelta;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005541 return 1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005542}
5543
Mark Shannon877df852020-11-12 09:43:29 +00005544/* Appends a range to the end of the line number table. See
5545 * Objects/lnotab_notes.txt for the description of the line number table. */
5546
5547static int
5548assemble_line_range(struct assembler *a)
5549{
5550 int ldelta, bdelta;
5551 bdelta = (a->a_offset - a->a_lineno_start) * 2;
5552 if (bdelta == 0) {
5553 return 1;
5554 }
5555 if (a->a_lineno < 0) {
5556 ldelta = -128;
5557 }
5558 else {
5559 ldelta = a->a_lineno - a->a_prevlineno;
5560 a->a_prevlineno = a->a_lineno;
5561 while (ldelta > 127) {
5562 if (!assemble_emit_linetable_pair(a, 0, 127)) {
5563 return 0;
5564 }
5565 ldelta -= 127;
5566 }
5567 while (ldelta < -127) {
5568 if (!assemble_emit_linetable_pair(a, 0, -127)) {
5569 return 0;
5570 }
5571 ldelta += 127;
5572 }
5573 }
5574 assert(-128 <= ldelta && ldelta < 128);
5575 while (bdelta > 254) {
5576 if (!assemble_emit_linetable_pair(a, 254, ldelta)) {
5577 return 0;
5578 }
5579 ldelta = a->a_lineno < 0 ? -128 : 0;
5580 bdelta -= 254;
5581 }
5582 if (!assemble_emit_linetable_pair(a, bdelta, ldelta)) {
5583 return 0;
5584 }
5585 a->a_lineno_start = a->a_offset;
5586 return 1;
5587}
5588
5589static int
5590assemble_lnotab(struct assembler *a, struct instr *i)
5591{
5592 if (i->i_lineno == a->a_lineno) {
5593 return 1;
5594 }
5595 if (!assemble_line_range(a)) {
5596 return 0;
5597 }
5598 a->a_lineno = i->i_lineno;
5599 return 1;
5600}
5601
5602
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005603/* assemble_emit()
5604 Extend the bytecode with a new instruction.
5605 Update lnotab if necessary.
Jeremy Hylton376e63d2003-08-28 14:42:14 +00005606*/
5607
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00005608static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005609assemble_emit(struct assembler *a, struct instr *i)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00005610{
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005611 int size, arg = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005612 Py_ssize_t len = PyBytes_GET_SIZE(a->a_bytecode);
Serhiy Storchakaab874002016-09-11 13:48:15 +03005613 _Py_CODEUNIT *code;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005614
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005615 arg = i->i_oparg;
5616 size = instrsize(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005617 if (i->i_lineno && !assemble_lnotab(a, i))
5618 return 0;
Serhiy Storchakaab874002016-09-11 13:48:15 +03005619 if (a->a_offset + size >= len / (int)sizeof(_Py_CODEUNIT)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005620 if (len > PY_SSIZE_T_MAX / 2)
5621 return 0;
5622 if (_PyBytes_Resize(&a->a_bytecode, len * 2) < 0)
5623 return 0;
5624 }
Serhiy Storchakaab874002016-09-11 13:48:15 +03005625 code = (_Py_CODEUNIT *)PyBytes_AS_STRING(a->a_bytecode) + a->a_offset;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005626 a->a_offset += size;
Serhiy Storchakaab874002016-09-11 13:48:15 +03005627 write_op_arg(code, i->i_opcode, arg, size);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005628 return 1;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00005629}
5630
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00005631static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005632assemble_jump_offsets(struct assembler *a, struct compiler *c)
Anthony Baxterc2a5a632004-08-02 06:10:11 +00005633{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005634 basicblock *b;
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005635 int bsize, totsize, extended_arg_recompile;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005636 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00005637
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005638 /* Compute the size of each block and fixup jump args.
5639 Replace block pointer with position in bytecode. */
5640 do {
5641 totsize = 0;
Mark Shannoncc75ab72020-11-12 19:49:33 +00005642 for (basicblock *b = a->a_entry; b != NULL; b = b->b_next) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005643 bsize = blocksize(b);
5644 b->b_offset = totsize;
5645 totsize += bsize;
5646 }
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005647 extended_arg_recompile = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005648 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
5649 bsize = b->b_offset;
5650 for (i = 0; i < b->b_iused; i++) {
5651 struct instr *instr = &b->b_instr[i];
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005652 int isize = instrsize(instr->i_oparg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005653 /* Relative jumps are computed relative to
5654 the instruction pointer after fetching
5655 the jump instruction.
5656 */
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005657 bsize += isize;
Mark Shannon582aaf12020-08-04 17:30:11 +01005658 if (is_jump(instr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005659 instr->i_oparg = instr->i_target->b_offset;
Mark Shannon582aaf12020-08-04 17:30:11 +01005660 if (is_relative_jump(instr)) {
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005661 instr->i_oparg -= bsize;
5662 }
Serhiy Storchakaab874002016-09-11 13:48:15 +03005663 instr->i_oparg *= sizeof(_Py_CODEUNIT);
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005664 if (instrsize(instr->i_oparg) != isize) {
5665 extended_arg_recompile = 1;
5666 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005667 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005668 }
5669 }
Neal Norwitzf1d50682005-10-23 23:00:41 +00005670
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005671 /* XXX: This is an awful hack that could hurt performance, but
5672 on the bright side it should work until we come up
5673 with a better solution.
Neal Norwitzf1d50682005-10-23 23:00:41 +00005674
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005675 The issue is that in the first loop blocksize() is called
5676 which calls instrsize() which requires i_oparg be set
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005677 appropriately. There is a bootstrap problem because
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005678 i_oparg is calculated in the second loop above.
Neal Norwitzf1d50682005-10-23 23:00:41 +00005679
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005680 So we loop until we stop seeing new EXTENDED_ARGs.
5681 The only EXTENDED_ARGs that could be popping up are
5682 ones in jump instructions. So this should converge
5683 fairly quickly.
5684 */
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005685 } while (extended_arg_recompile);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005686}
5687
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005688static PyObject *
Victor Stinnerad9a0662013-11-19 22:23:20 +01005689dict_keys_inorder(PyObject *dict, Py_ssize_t offset)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005690{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005691 PyObject *tuple, *k, *v;
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +02005692 Py_ssize_t i, pos = 0, size = PyDict_GET_SIZE(dict);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005693
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005694 tuple = PyTuple_New(size);
5695 if (tuple == NULL)
5696 return NULL;
5697 while (PyDict_Next(dict, &pos, &k, &v)) {
5698 i = PyLong_AS_LONG(v);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005699 Py_INCREF(k);
5700 assert((i - offset) < size);
5701 assert((i - offset) >= 0);
5702 PyTuple_SET_ITEM(tuple, i - offset, k);
5703 }
5704 return tuple;
5705}
5706
5707static PyObject *
5708consts_dict_keys_inorder(PyObject *dict)
5709{
5710 PyObject *consts, *k, *v;
5711 Py_ssize_t i, pos = 0, size = PyDict_GET_SIZE(dict);
5712
5713 consts = PyList_New(size); /* PyCode_Optimize() requires a list */
5714 if (consts == NULL)
5715 return NULL;
5716 while (PyDict_Next(dict, &pos, &k, &v)) {
5717 i = PyLong_AS_LONG(v);
Serhiy Storchakab7e1eff2018-04-19 08:28:04 +03005718 /* The keys of the dictionary can be tuples wrapping a contant.
5719 * (see compiler_add_o and _PyCode_ConstantKey). In that case
5720 * the object we want is always second. */
5721 if (PyTuple_CheckExact(k)) {
5722 k = PyTuple_GET_ITEM(k, 1);
5723 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005724 Py_INCREF(k);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005725 assert(i < size);
5726 assert(i >= 0);
5727 PyList_SET_ITEM(consts, i, k);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005728 }
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005729 return consts;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005730}
5731
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005732static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005733compute_code_flags(struct compiler *c)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005734{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005735 PySTEntryObject *ste = c->u->u_ste;
Victor Stinnerad9a0662013-11-19 22:23:20 +01005736 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005737 if (ste->ste_type == FunctionBlock) {
Benjamin Peterson1dfd2472015-04-27 21:44:22 -04005738 flags |= CO_NEWLOCALS | CO_OPTIMIZED;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005739 if (ste->ste_nested)
5740 flags |= CO_NESTED;
Yury Selivanoveb636452016-09-08 22:01:51 -07005741 if (ste->ste_generator && !ste->ste_coroutine)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005742 flags |= CO_GENERATOR;
Yury Selivanoveb636452016-09-08 22:01:51 -07005743 if (!ste->ste_generator && ste->ste_coroutine)
5744 flags |= CO_COROUTINE;
5745 if (ste->ste_generator && ste->ste_coroutine)
5746 flags |= CO_ASYNC_GENERATOR;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005747 if (ste->ste_varargs)
5748 flags |= CO_VARARGS;
5749 if (ste->ste_varkeywords)
5750 flags |= CO_VARKEYWORDS;
5751 }
Thomas Wouters5e9f1fa2006-02-28 20:02:27 +00005752
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005753 /* (Only) inherit compilerflags in PyCF_MASK */
5754 flags |= (c->c_flags->cf_flags & PyCF_MASK);
Thomas Wouters5e9f1fa2006-02-28 20:02:27 +00005755
Pablo Galindo90235812020-03-15 04:29:22 +00005756 if ((IS_TOP_LEVEL_AWAIT(c)) &&
Matthias Bussonnier565b4f12019-05-21 13:12:03 -07005757 ste->ste_coroutine &&
5758 !ste->ste_generator) {
5759 flags |= CO_COROUTINE;
5760 }
5761
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005762 return flags;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005763}
5764
INADA Naokic2e16072018-11-26 21:23:22 +09005765// Merge *tuple* with constant cache.
5766// Unlike merge_consts_recursive(), this function doesn't work recursively.
5767static int
5768merge_const_tuple(struct compiler *c, PyObject **tuple)
5769{
5770 assert(PyTuple_CheckExact(*tuple));
5771
5772 PyObject *key = _PyCode_ConstantKey(*tuple);
5773 if (key == NULL) {
5774 return 0;
5775 }
5776
5777 // t is borrowed reference
5778 PyObject *t = PyDict_SetDefault(c->c_const_cache, key, key);
5779 Py_DECREF(key);
5780 if (t == NULL) {
5781 return 0;
5782 }
5783 if (t == key) { // tuple is new constant.
5784 return 1;
5785 }
5786
5787 PyObject *u = PyTuple_GET_ITEM(t, 1);
5788 Py_INCREF(u);
5789 Py_DECREF(*tuple);
5790 *tuple = u;
5791 return 1;
5792}
5793
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005794static PyCodeObject *
Mark Shannon6e8128f2020-07-30 10:03:00 +01005795makecode(struct compiler *c, struct assembler *a, PyObject *consts)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005796{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005797 PyCodeObject *co = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005798 PyObject *names = NULL;
5799 PyObject *varnames = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005800 PyObject *name = NULL;
5801 PyObject *freevars = NULL;
5802 PyObject *cellvars = NULL;
Victor Stinnerad9a0662013-11-19 22:23:20 +01005803 Py_ssize_t nlocals;
5804 int nlocals_int;
5805 int flags;
Pablo Galindocd74e662019-06-01 18:08:04 +01005806 int posorkeywordargcount, posonlyargcount, kwonlyargcount, maxdepth;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005807
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005808 names = dict_keys_inorder(c->u->u_names, 0);
5809 varnames = dict_keys_inorder(c->u->u_varnames, 0);
Mark Shannon6e8128f2020-07-30 10:03:00 +01005810 if (!names || !varnames) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005811 goto error;
Mark Shannon6e8128f2020-07-30 10:03:00 +01005812 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005813 cellvars = dict_keys_inorder(c->u->u_cellvars, 0);
5814 if (!cellvars)
5815 goto error;
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005816 freevars = dict_keys_inorder(c->u->u_freevars, PyTuple_GET_SIZE(cellvars));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005817 if (!freevars)
5818 goto error;
Victor Stinnerad9a0662013-11-19 22:23:20 +01005819
INADA Naokic2e16072018-11-26 21:23:22 +09005820 if (!merge_const_tuple(c, &names) ||
5821 !merge_const_tuple(c, &varnames) ||
5822 !merge_const_tuple(c, &cellvars) ||
5823 !merge_const_tuple(c, &freevars))
5824 {
5825 goto error;
5826 }
5827
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +02005828 nlocals = PyDict_GET_SIZE(c->u->u_varnames);
Victor Stinnerad9a0662013-11-19 22:23:20 +01005829 assert(nlocals < INT_MAX);
5830 nlocals_int = Py_SAFE_DOWNCAST(nlocals, Py_ssize_t, int);
5831
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005832 flags = compute_code_flags(c);
5833 if (flags < 0)
5834 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005835
Mark Shannon6e8128f2020-07-30 10:03:00 +01005836 consts = PyList_AsTuple(consts); /* PyCode_New requires a tuple */
5837 if (consts == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005838 goto error;
Mark Shannon6e8128f2020-07-30 10:03:00 +01005839 }
INADA Naokic2e16072018-11-26 21:23:22 +09005840 if (!merge_const_tuple(c, &consts)) {
Mark Shannon6e8128f2020-07-30 10:03:00 +01005841 Py_DECREF(consts);
INADA Naokic2e16072018-11-26 21:23:22 +09005842 goto error;
5843 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005844
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01005845 posonlyargcount = Py_SAFE_DOWNCAST(c->u->u_posonlyargcount, Py_ssize_t, int);
Pablo Galindocd74e662019-06-01 18:08:04 +01005846 posorkeywordargcount = Py_SAFE_DOWNCAST(c->u->u_argcount, Py_ssize_t, int);
Victor Stinnerf8e32212013-11-19 23:56:34 +01005847 kwonlyargcount = Py_SAFE_DOWNCAST(c->u->u_kwonlyargcount, Py_ssize_t, int);
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005848 maxdepth = stackdepth(c);
5849 if (maxdepth < 0) {
Mark Shannon6e8128f2020-07-30 10:03:00 +01005850 Py_DECREF(consts);
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005851 goto error;
5852 }
Pablo Galindo4a2edc32019-07-01 11:35:05 +01005853 co = PyCode_NewWithPosOnlyArgs(posonlyargcount+posorkeywordargcount,
Mark Shannon13bc1392020-01-23 09:25:17 +00005854 posonlyargcount, kwonlyargcount, nlocals_int,
Mark Shannon6e8128f2020-07-30 10:03:00 +01005855 maxdepth, flags, a->a_bytecode, consts, names,
Pablo Galindo4a2edc32019-07-01 11:35:05 +01005856 varnames, freevars, cellvars, c->c_filename,
5857 c->u->u_name, c->u->u_firstlineno, a->a_lnotab);
Mark Shannon6e8128f2020-07-30 10:03:00 +01005858 Py_DECREF(consts);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005859 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005860 Py_XDECREF(names);
5861 Py_XDECREF(varnames);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005862 Py_XDECREF(name);
5863 Py_XDECREF(freevars);
5864 Py_XDECREF(cellvars);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005865 return co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005866}
5867
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005868
5869/* For debugging purposes only */
5870#if 0
5871static void
5872dump_instr(const struct instr *i)
5873{
Mark Shannon582aaf12020-08-04 17:30:11 +01005874 const char *jrel = (is_relative_jump(instr)) ? "jrel " : "";
5875 const char *jabs = (is_jump(instr) && !is_relative_jump(instr))? "jabs " : "";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005876 char arg[128];
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005877
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005878 *arg = '\0';
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005879 if (HAS_ARG(i->i_opcode)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005880 sprintf(arg, "arg: %d ", i->i_oparg);
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005881 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005882 fprintf(stderr, "line: %d, opcode: %d %s%s%s\n",
5883 i->i_lineno, i->i_opcode, arg, jabs, jrel);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005884}
5885
5886static void
5887dump_basicblock(const basicblock *b)
5888{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005889 const char *b_return = b->b_return ? "return " : "";
Pablo Galindo60eb9f12020-06-28 01:55:47 +01005890 fprintf(stderr, "used: %d, depth: %d, offset: %d %s\n",
5891 b->b_iused, b->b_startdepth, b->b_offset, b_return);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005892 if (b->b_instr) {
5893 int i;
5894 for (i = 0; i < b->b_iused; i++) {
5895 fprintf(stderr, " [%02d] ", i);
5896 dump_instr(b->b_instr + i);
5897 }
5898 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005899}
5900#endif
5901
Mark Shannon5977a792020-12-02 13:31:40 +00005902
5903static int
5904normalize_basic_block(basicblock *bb);
5905
Mark Shannon6e8128f2020-07-30 10:03:00 +01005906static int
5907optimize_cfg(struct assembler *a, PyObject *consts);
5908
Mark Shannon5977a792020-12-02 13:31:40 +00005909static int
5910ensure_exits_have_lineno(struct compiler *c);
5911
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005912static PyCodeObject *
5913assemble(struct compiler *c, int addNone)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005914{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005915 basicblock *b, *entryblock;
5916 struct assembler a;
Mark Shannoncc75ab72020-11-12 19:49:33 +00005917 int j, nblocks;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005918 PyCodeObject *co = NULL;
Mark Shannon6e8128f2020-07-30 10:03:00 +01005919 PyObject *consts = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005920
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005921 /* Make sure every block that falls off the end returns None.
5922 XXX NEXT_BLOCK() isn't quite right, because if the last
5923 block ends with a jump or return b_next shouldn't set.
5924 */
5925 if (!c->u->u_curblock->b_return) {
Mark Shannon877df852020-11-12 09:43:29 +00005926 c->u->u_lineno = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005927 if (addNone)
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005928 ADDOP_LOAD_CONST(c, Py_None);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005929 ADDOP(c, RETURN_VALUE);
5930 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005931
Mark Shannon5977a792020-12-02 13:31:40 +00005932 for (basicblock *b = c->u->u_blocks; b != NULL; b = b->b_list) {
5933 if (normalize_basic_block(b)) {
5934 goto error;
5935 }
5936 }
5937
5938 if (ensure_exits_have_lineno(c)) {
5939 goto error;
5940 }
5941
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005942 nblocks = 0;
5943 entryblock = NULL;
5944 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
5945 nblocks++;
5946 entryblock = b;
5947 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005948
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005949 /* Set firstlineno if it wasn't explicitly set. */
5950 if (!c->u->u_firstlineno) {
Ned Deilydc35cda2016-08-17 17:18:33 -04005951 if (entryblock && entryblock->b_instr && entryblock->b_instr->i_lineno)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005952 c->u->u_firstlineno = entryblock->b_instr->i_lineno;
Mark Shannon877df852020-11-12 09:43:29 +00005953 else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005954 c->u->u_firstlineno = 1;
5955 }
Mark Shannon5977a792020-12-02 13:31:40 +00005956
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005957 if (!assemble_init(&a, nblocks, c->u->u_firstlineno))
5958 goto error;
Mark Shannoncc75ab72020-11-12 19:49:33 +00005959 a.a_entry = entryblock;
5960 a.a_nblocks = nblocks;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005961
Mark Shannon6e8128f2020-07-30 10:03:00 +01005962 consts = consts_dict_keys_inorder(c->u->u_consts);
5963 if (consts == NULL) {
5964 goto error;
5965 }
5966 if (optimize_cfg(&a, consts)) {
5967 goto error;
5968 }
5969
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005970 /* Can't modify the bytecode after computing jump offsets. */
5971 assemble_jump_offsets(&a, c);
Tim Petersb6c3cea2001-06-26 03:36:28 +00005972
Mark Shannoncc75ab72020-11-12 19:49:33 +00005973 /* Emit code. */
5974 for(b = entryblock; b != NULL; b = b->b_next) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005975 for (j = 0; j < b->b_iused; j++)
5976 if (!assemble_emit(&a, &b->b_instr[j]))
5977 goto error;
5978 }
Mark Shannon877df852020-11-12 09:43:29 +00005979 if (!assemble_line_range(&a)) {
5980 return 0;
5981 }
5982 /* Emit sentinel at end of line number table */
5983 if (!assemble_emit_linetable_pair(&a, 255, -128)) {
5984 goto error;
5985 }
Tim Petersb6c3cea2001-06-26 03:36:28 +00005986
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005987 if (_PyBytes_Resize(&a.a_lnotab, a.a_lnotab_off) < 0)
5988 goto error;
Serhiy Storchakaab874002016-09-11 13:48:15 +03005989 if (_PyBytes_Resize(&a.a_bytecode, a.a_offset * sizeof(_Py_CODEUNIT)) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005990 goto error;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005991
Mark Shannon6e8128f2020-07-30 10:03:00 +01005992 co = makecode(c, &a, consts);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005993 error:
Mark Shannon6e8128f2020-07-30 10:03:00 +01005994 Py_XDECREF(consts);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005995 assemble_free(&a);
5996 return co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005997}
Georg Brandl8334fd92010-12-04 10:26:46 +00005998
5999#undef PyAST_Compile
Benjamin Petersone5024512018-09-12 12:06:42 -07006000PyCodeObject *
Georg Brandl8334fd92010-12-04 10:26:46 +00006001PyAST_Compile(mod_ty mod, const char *filename, PyCompilerFlags *flags,
6002 PyArena *arena)
6003{
6004 return PyAST_CompileEx(mod, filename, flags, -1, arena);
6005}
Mark Shannon6e8128f2020-07-30 10:03:00 +01006006
6007
6008/* Replace LOAD_CONST c1, LOAD_CONST c2 ... LOAD_CONST cn, BUILD_TUPLE n
6009 with LOAD_CONST (c1, c2, ... cn).
6010 The consts table must still be in list form so that the
6011 new constant (c1, c2, ... cn) can be appended.
6012 Called with codestr pointing to the first LOAD_CONST.
6013*/
6014static int
6015fold_tuple_on_constants(struct instr *inst,
6016 int n, PyObject *consts)
6017{
6018 /* Pre-conditions */
6019 assert(PyList_CheckExact(consts));
6020 assert(inst[n].i_opcode == BUILD_TUPLE);
6021 assert(inst[n].i_oparg == n);
6022
6023 for (int i = 0; i < n; i++) {
6024 if (inst[i].i_opcode != LOAD_CONST) {
6025 return 0;
6026 }
6027 }
6028
6029 /* Buildup new tuple of constants */
6030 PyObject *newconst = PyTuple_New(n);
6031 if (newconst == NULL) {
6032 return -1;
6033 }
6034 for (int i = 0; i < n; i++) {
6035 int arg = inst[i].i_oparg;
6036 PyObject *constant = PyList_GET_ITEM(consts, arg);
6037 Py_INCREF(constant);
6038 PyTuple_SET_ITEM(newconst, i, constant);
6039 }
6040 Py_ssize_t index = PyList_GET_SIZE(consts);
Victor Stinner71f2ff42020-09-23 14:06:55 +02006041 if ((size_t)index >= (size_t)INT_MAX - 1) {
Mark Shannon6e8128f2020-07-30 10:03:00 +01006042 Py_DECREF(newconst);
6043 PyErr_SetString(PyExc_OverflowError, "too many constants");
6044 return -1;
6045 }
Mark Shannon6e8128f2020-07-30 10:03:00 +01006046 if (PyList_Append(consts, newconst)) {
6047 Py_DECREF(newconst);
6048 return -1;
6049 }
6050 Py_DECREF(newconst);
6051 for (int i = 0; i < n; i++) {
6052 inst[i].i_opcode = NOP;
6053 }
6054 inst[n].i_opcode = LOAD_CONST;
Victor Stinner71f2ff42020-09-23 14:06:55 +02006055 inst[n].i_oparg = (int)index;
Mark Shannon6e8128f2020-07-30 10:03:00 +01006056 return 0;
6057}
6058
Mark Shannoncc75ab72020-11-12 19:49:33 +00006059/* Maximum size of basic block that should be copied in optimizer */
6060#define MAX_COPY_SIZE 4
Mark Shannon6e8128f2020-07-30 10:03:00 +01006061
6062/* Optimization */
6063static int
6064optimize_basic_block(basicblock *bb, PyObject *consts)
6065{
6066 assert(PyList_CheckExact(consts));
6067 struct instr nop;
6068 nop.i_opcode = NOP;
6069 struct instr *target;
Mark Shannon6e8128f2020-07-30 10:03:00 +01006070 for (int i = 0; i < bb->b_iused; i++) {
6071 struct instr *inst = &bb->b_instr[i];
6072 int oparg = inst->i_oparg;
6073 int nextop = i+1 < bb->b_iused ? bb->b_instr[i+1].i_opcode : 0;
Mark Shannon582aaf12020-08-04 17:30:11 +01006074 if (is_jump(inst)) {
Mark Shannon6e8128f2020-07-30 10:03:00 +01006075 /* Skip over empty basic blocks. */
6076 while (inst->i_target->b_iused == 0) {
6077 inst->i_target = inst->i_target->b_next;
6078 }
6079 target = &inst->i_target->b_instr[0];
6080 }
6081 else {
6082 target = &nop;
6083 }
6084 switch (inst->i_opcode) {
Mark Shannon266b4622020-11-17 19:30:14 +00006085 /* Remove LOAD_CONST const; conditional jump */
Mark Shannon6e8128f2020-07-30 10:03:00 +01006086 case LOAD_CONST:
Mark Shannon266b4622020-11-17 19:30:14 +00006087 {
6088 PyObject* cnt;
6089 int is_true;
6090 int jump_if_true;
6091 switch(nextop) {
6092 case POP_JUMP_IF_FALSE:
6093 case POP_JUMP_IF_TRUE:
6094 cnt = PyList_GET_ITEM(consts, oparg);
6095 is_true = PyObject_IsTrue(cnt);
6096 if (is_true == -1) {
6097 goto error;
6098 }
6099 inst->i_opcode = NOP;
6100 jump_if_true = nextop == POP_JUMP_IF_TRUE;
6101 if (is_true == jump_if_true) {
6102 bb->b_instr[i+1].i_opcode = JUMP_ABSOLUTE;
6103 bb->b_nofallthrough = 1;
6104 }
6105 else {
6106 bb->b_instr[i+1].i_opcode = NOP;
6107 }
6108 break;
6109 case JUMP_IF_FALSE_OR_POP:
6110 case JUMP_IF_TRUE_OR_POP:
6111 cnt = PyList_GET_ITEM(consts, oparg);
6112 is_true = PyObject_IsTrue(cnt);
6113 if (is_true == -1) {
6114 goto error;
6115 }
6116 jump_if_true = nextop == JUMP_IF_TRUE_OR_POP;
6117 if (is_true == jump_if_true) {
6118 bb->b_instr[i+1].i_opcode = JUMP_ABSOLUTE;
6119 bb->b_nofallthrough = 1;
6120 }
6121 else {
6122 inst->i_opcode = NOP;
6123 bb->b_instr[i+1].i_opcode = NOP;
6124 }
6125 break;
Mark Shannon6e8128f2020-07-30 10:03:00 +01006126 }
6127 break;
Mark Shannon266b4622020-11-17 19:30:14 +00006128 }
Mark Shannon6e8128f2020-07-30 10:03:00 +01006129
6130 /* Try to fold tuples of constants.
6131 Skip over BUILD_SEQN 1 UNPACK_SEQN 1.
6132 Replace BUILD_SEQN 2 UNPACK_SEQN 2 with ROT2.
6133 Replace BUILD_SEQN 3 UNPACK_SEQN 3 with ROT3 ROT2. */
6134 case BUILD_TUPLE:
6135 if (nextop == UNPACK_SEQUENCE && oparg == bb->b_instr[i+1].i_oparg) {
6136 switch(oparg) {
6137 case 1:
6138 inst->i_opcode = NOP;
6139 bb->b_instr[i+1].i_opcode = NOP;
6140 break;
6141 case 2:
6142 inst->i_opcode = ROT_TWO;
6143 bb->b_instr[i+1].i_opcode = NOP;
6144 break;
6145 case 3:
6146 inst->i_opcode = ROT_THREE;
6147 bb->b_instr[i+1].i_opcode = ROT_TWO;
6148 }
6149 break;
6150 }
6151 if (i >= oparg) {
6152 if (fold_tuple_on_constants(inst-oparg, oparg, consts)) {
6153 goto error;
6154 }
6155 }
6156 break;
6157
6158 /* Simplify conditional jump to conditional jump where the
6159 result of the first test implies the success of a similar
6160 test or the failure of the opposite test.
6161 Arises in code like:
6162 "a and b or c"
6163 "(a and b) and c"
6164 "(a or b) or c"
6165 "(a or b) and c"
6166 x:JUMP_IF_FALSE_OR_POP y y:JUMP_IF_FALSE_OR_POP z
6167 --> x:JUMP_IF_FALSE_OR_POP z
6168 x:JUMP_IF_FALSE_OR_POP y y:JUMP_IF_TRUE_OR_POP z
6169 --> x:POP_JUMP_IF_FALSE y+1
6170 where y+1 is the instruction following the second test.
6171 */
6172 case JUMP_IF_FALSE_OR_POP:
6173 switch(target->i_opcode) {
6174 case POP_JUMP_IF_FALSE:
6175 *inst = *target;
Mark Shannon266b4622020-11-17 19:30:14 +00006176 --i;
Mark Shannon6e8128f2020-07-30 10:03:00 +01006177 break;
6178 case JUMP_ABSOLUTE:
6179 case JUMP_FORWARD:
6180 case JUMP_IF_FALSE_OR_POP:
Mark Shannon266b4622020-11-17 19:30:14 +00006181 if (inst->i_target != target->i_target) {
6182 inst->i_target = target->i_target;
6183 --i;
6184 }
Mark Shannon6e8128f2020-07-30 10:03:00 +01006185 break;
6186 case JUMP_IF_TRUE_OR_POP:
6187 assert (inst->i_target->b_iused == 1);
6188 inst->i_opcode = POP_JUMP_IF_FALSE;
6189 inst->i_target = inst->i_target->b_next;
Mark Shannon266b4622020-11-17 19:30:14 +00006190 --i;
Mark Shannon6e8128f2020-07-30 10:03:00 +01006191 break;
6192 }
6193 break;
6194
6195 case JUMP_IF_TRUE_OR_POP:
6196 switch(target->i_opcode) {
6197 case POP_JUMP_IF_TRUE:
6198 *inst = *target;
Mark Shannon266b4622020-11-17 19:30:14 +00006199 --i;
Mark Shannon6e8128f2020-07-30 10:03:00 +01006200 break;
6201 case JUMP_ABSOLUTE:
6202 case JUMP_FORWARD:
6203 case JUMP_IF_TRUE_OR_POP:
Mark Shannon266b4622020-11-17 19:30:14 +00006204 if (inst->i_target != target->i_target) {
6205 inst->i_target = target->i_target;
6206 --i;
6207 }
Mark Shannon6e8128f2020-07-30 10:03:00 +01006208 break;
6209 case JUMP_IF_FALSE_OR_POP:
6210 assert (inst->i_target->b_iused == 1);
6211 inst->i_opcode = POP_JUMP_IF_TRUE;
6212 inst->i_target = inst->i_target->b_next;
Mark Shannon266b4622020-11-17 19:30:14 +00006213 --i;
Mark Shannon6e8128f2020-07-30 10:03:00 +01006214 break;
6215 }
6216 break;
6217
6218 case POP_JUMP_IF_FALSE:
6219 switch(target->i_opcode) {
6220 case JUMP_ABSOLUTE:
6221 case JUMP_FORWARD:
Mark Shannon266b4622020-11-17 19:30:14 +00006222 if (inst->i_target != target->i_target) {
6223 inst->i_target = target->i_target;
6224 --i;
6225 }
Mark Shannon6e8128f2020-07-30 10:03:00 +01006226 break;
6227 }
6228 break;
6229
6230 case POP_JUMP_IF_TRUE:
6231 switch(target->i_opcode) {
6232 case JUMP_ABSOLUTE:
6233 case JUMP_FORWARD:
Mark Shannon266b4622020-11-17 19:30:14 +00006234 if (inst->i_target != target->i_target) {
6235 inst->i_target = target->i_target;
6236 --i;
6237 }
Mark Shannon6e8128f2020-07-30 10:03:00 +01006238 break;
6239 }
6240 break;
6241
6242 case JUMP_ABSOLUTE:
6243 case JUMP_FORWARD:
Mark Shannoncc75ab72020-11-12 19:49:33 +00006244 assert (i == bb->b_iused-1);
Mark Shannon6e8128f2020-07-30 10:03:00 +01006245 switch(target->i_opcode) {
6246 case JUMP_FORWARD:
Mark Shannon266b4622020-11-17 19:30:14 +00006247 if (inst->i_target != target->i_target) {
6248 inst->i_target = target->i_target;
Mark Shannon8473cf82020-12-15 11:07:50 +00006249// --i;
Mark Shannon266b4622020-11-17 19:30:14 +00006250 }
Mark Shannon6e8128f2020-07-30 10:03:00 +01006251 break;
6252 case JUMP_ABSOLUTE:
Mark Shannon266b4622020-11-17 19:30:14 +00006253 if (inst->i_target != target->i_target) {
6254 inst->i_target = target->i_target;
6255 inst->i_opcode = target->i_opcode;
6256 --i;
6257 }
Mark Shannon6e8128f2020-07-30 10:03:00 +01006258 break;
6259 }
Mark Shannoncc75ab72020-11-12 19:49:33 +00006260 if (inst->i_target->b_exit && inst->i_target->b_iused <= MAX_COPY_SIZE) {
6261 basicblock *to_copy = inst->i_target;
Mark Shannon8473cf82020-12-15 11:07:50 +00006262 inst->i_opcode = NOP;
6263 for (i = 0; i < to_copy->b_iused; i++) {
Mark Shannoncc75ab72020-11-12 19:49:33 +00006264 int index = compiler_next_instr(bb);
6265 if (index < 0) {
6266 return -1;
6267 }
6268 bb->b_instr[index] = to_copy->b_instr[i];
6269 }
6270 bb->b_exit = 1;
6271 }
Mark Shannon6e8128f2020-07-30 10:03:00 +01006272 break;
6273 }
6274 }
6275 return 0;
6276error:
6277 return -1;
6278}
6279
6280
6281static void
6282clean_basic_block(basicblock *bb) {
Mark Shannoncc75ab72020-11-12 19:49:33 +00006283 /* Remove NOPs. */
Mark Shannon6e8128f2020-07-30 10:03:00 +01006284 int dest = 0;
Mark Shannon877df852020-11-12 09:43:29 +00006285 int prev_lineno = -1;
Mark Shannon6e8128f2020-07-30 10:03:00 +01006286 for (int src = 0; src < bb->b_iused; src++) {
Mark Shannon877df852020-11-12 09:43:29 +00006287 int lineno = bb->b_instr[src].i_lineno;
Mark Shannoncc75ab72020-11-12 19:49:33 +00006288 if (bb->b_instr[src].i_opcode == NOP) {
Mark Shannon266b4622020-11-17 19:30:14 +00006289 /* Eliminate no-op if it doesn't have a line number */
Mark Shannoncc75ab72020-11-12 19:49:33 +00006290 if (lineno < 0) {
6291 continue;
6292 }
Mark Shannon266b4622020-11-17 19:30:14 +00006293 /* or, if the previous instruction had the same line number. */
Mark Shannoncc75ab72020-11-12 19:49:33 +00006294 if (prev_lineno == lineno) {
6295 continue;
6296 }
Mark Shannon266b4622020-11-17 19:30:14 +00006297 /* or, if the next instruction has same line number or no line number */
Mark Shannoncc75ab72020-11-12 19:49:33 +00006298 if (src < bb->b_iused - 1) {
6299 int next_lineno = bb->b_instr[src+1].i_lineno;
6300 if (next_lineno < 0 || next_lineno == lineno) {
6301 bb->b_instr[src+1].i_lineno = lineno;
6302 continue;
Mark Shannon877df852020-11-12 09:43:29 +00006303 }
6304 }
Mark Shannon266b4622020-11-17 19:30:14 +00006305 else {
6306 basicblock* next = bb->b_next;
6307 while (next && next->b_iused == 0) {
6308 next = next->b_next;
6309 }
6310 /* or if last instruction in BB and next BB has same line number */
6311 if (next) {
6312 if (lineno == next->b_instr[0].i_lineno) {
6313 continue;
6314 }
6315 }
6316 }
6317
Mark Shannon6e8128f2020-07-30 10:03:00 +01006318 }
Mark Shannoncc75ab72020-11-12 19:49:33 +00006319 if (dest != src) {
6320 bb->b_instr[dest] = bb->b_instr[src];
6321 }
6322 dest++;
6323 prev_lineno = lineno;
Mark Shannon6e8128f2020-07-30 10:03:00 +01006324 }
Mark Shannon6e8128f2020-07-30 10:03:00 +01006325 assert(dest <= bb->b_iused);
6326 bb->b_iused = dest;
6327}
6328
Mark Shannon266b4622020-11-17 19:30:14 +00006329static int
6330normalize_basic_block(basicblock *bb) {
6331 /* Mark blocks as exit and/or nofallthrough.
6332 Raise SystemError if CFG is malformed. */
Mark Shannoncc75ab72020-11-12 19:49:33 +00006333 for (int i = 0; i < bb->b_iused; i++) {
6334 switch(bb->b_instr[i].i_opcode) {
6335 case RETURN_VALUE:
6336 case RAISE_VARARGS:
6337 case RERAISE:
Mark Shannoncc75ab72020-11-12 19:49:33 +00006338 bb->b_exit = 1;
Mark Shannon5977a792020-12-02 13:31:40 +00006339 bb->b_nofallthrough = 1;
6340 break;
Mark Shannoncc75ab72020-11-12 19:49:33 +00006341 case JUMP_ABSOLUTE:
6342 case JUMP_FORWARD:
Mark Shannoncc75ab72020-11-12 19:49:33 +00006343 bb->b_nofallthrough = 1;
Mark Shannon266b4622020-11-17 19:30:14 +00006344 /* fall through */
6345 case POP_JUMP_IF_FALSE:
6346 case POP_JUMP_IF_TRUE:
6347 case JUMP_IF_FALSE_OR_POP:
6348 case JUMP_IF_TRUE_OR_POP:
Mark Shannon5977a792020-12-02 13:31:40 +00006349 case FOR_ITER:
Mark Shannon266b4622020-11-17 19:30:14 +00006350 if (i != bb->b_iused-1) {
6351 PyErr_SetString(PyExc_SystemError, "malformed control flow graph.");
6352 return -1;
6353 }
Mark Shannon5977a792020-12-02 13:31:40 +00006354 /* Skip over empty basic blocks. */
6355 while (bb->b_instr[i].i_target->b_iused == 0) {
6356 bb->b_instr[i].i_target = bb->b_instr[i].i_target->b_next;
6357 }
6358
Mark Shannoncc75ab72020-11-12 19:49:33 +00006359 }
6360 }
Mark Shannon266b4622020-11-17 19:30:14 +00006361 return 0;
Mark Shannoncc75ab72020-11-12 19:49:33 +00006362}
6363
Mark Shannon6e8128f2020-07-30 10:03:00 +01006364static int
6365mark_reachable(struct assembler *a) {
6366 basicblock **stack, **sp;
6367 sp = stack = (basicblock **)PyObject_Malloc(sizeof(basicblock *) * a->a_nblocks);
6368 if (stack == NULL) {
6369 return -1;
6370 }
Mark Shannoncc75ab72020-11-12 19:49:33 +00006371 a->a_entry->b_reachable = 1;
6372 *sp++ = a->a_entry;
Mark Shannon6e8128f2020-07-30 10:03:00 +01006373 while (sp > stack) {
6374 basicblock *b = *(--sp);
Mark Shannoncc75ab72020-11-12 19:49:33 +00006375 if (b->b_next && !b->b_nofallthrough && b->b_next->b_reachable == 0) {
Mark Shannon6e8128f2020-07-30 10:03:00 +01006376 b->b_next->b_reachable = 1;
6377 *sp++ = b->b_next;
6378 }
6379 for (int i = 0; i < b->b_iused; i++) {
6380 basicblock *target;
Mark Shannon582aaf12020-08-04 17:30:11 +01006381 if (is_jump(&b->b_instr[i])) {
Mark Shannon6e8128f2020-07-30 10:03:00 +01006382 target = b->b_instr[i].i_target;
6383 if (target->b_reachable == 0) {
6384 target->b_reachable = 1;
6385 *sp++ = target;
6386 }
6387 }
6388 }
6389 }
6390 PyObject_Free(stack);
6391 return 0;
6392}
6393
Mark Shannon5977a792020-12-02 13:31:40 +00006394/* If an instruction has no line number, but it's predecessor in the BB does,
6395 * then copy the line number. This reduces the size of the line number table,
6396 * but has no impact on the generated line number events.
6397 */
6398static void
6399minimize_lineno_table(struct assembler *a) {
6400 for (basicblock *b = a->a_entry; b != NULL; b = b->b_next) {
6401 int prev_lineno = -1;
6402 for (int i = 0; i < b->b_iused; i++) {
6403 if (b->b_instr[i].i_lineno < 0) {
6404 b->b_instr[i].i_lineno = prev_lineno;
6405 }
6406 else {
6407 prev_lineno = b->b_instr[i].i_lineno;
6408 }
6409 }
Mark Shannon6e8128f2020-07-30 10:03:00 +01006410
Mark Shannon5977a792020-12-02 13:31:40 +00006411 }
6412}
6413
6414/* Perform optimizations on a control flow graph.
Mark Shannon6e8128f2020-07-30 10:03:00 +01006415 The consts object should still be in list form to allow new constants
6416 to be appended.
6417
6418 All transformations keep the code size the same or smaller.
6419 For those that reduce size, the gaps are initially filled with
6420 NOPs. Later those NOPs are removed.
6421*/
6422
6423static int
6424optimize_cfg(struct assembler *a, PyObject *consts)
6425{
Mark Shannoncc75ab72020-11-12 19:49:33 +00006426 for (basicblock *b = a->a_entry; b != NULL; b = b->b_next) {
Mark Shannoncc75ab72020-11-12 19:49:33 +00006427 if (optimize_basic_block(b, consts)) {
Mark Shannon6e8128f2020-07-30 10:03:00 +01006428 return -1;
6429 }
Mark Shannoncc75ab72020-11-12 19:49:33 +00006430 clean_basic_block(b);
6431 assert(b->b_reachable == 0);
Mark Shannon6e8128f2020-07-30 10:03:00 +01006432 }
6433 if (mark_reachable(a)) {
6434 return -1;
6435 }
6436 /* Delete unreachable instructions */
Mark Shannoncc75ab72020-11-12 19:49:33 +00006437 for (basicblock *b = a->a_entry; b != NULL; b = b->b_next) {
6438 if (b->b_reachable == 0) {
6439 b->b_iused = 0;
Mark Shannon6e8128f2020-07-30 10:03:00 +01006440 }
6441 }
Mark Shannon5977a792020-12-02 13:31:40 +00006442 minimize_lineno_table(a);
Mark Shannon6e8128f2020-07-30 10:03:00 +01006443 return 0;
6444}
6445
Mark Shannon5977a792020-12-02 13:31:40 +00006446static inline int
6447is_exit_without_lineno(basicblock *b) {
6448 return b->b_exit && b->b_instr[0].i_lineno < 0;
6449}
6450
6451/* PEP 626 mandates that the f_lineno of a frame is correct
6452 * after a frame terminates. It would be prohibitively expensive
6453 * to continuously update the f_lineno field at runtime,
6454 * so we make sure that all exiting instruction (raises and returns)
6455 * have a valid line number, allowing us to compute f_lineno lazily.
6456 * We can do this by duplicating the exit blocks without line number
6457 * so that none have more than one predecessor. We can then safely
6458 * copy the line number from the sole predecessor block.
6459 */
6460static int
6461ensure_exits_have_lineno(struct compiler *c)
6462{
Mark Shannoneaccc122020-12-04 15:22:12 +00006463 basicblock *entry = NULL;
Mark Shannon5977a792020-12-02 13:31:40 +00006464 /* Copy all exit blocks without line number that are targets of a jump.
6465 */
6466 for (basicblock *b = c->u->u_blocks; b != NULL; b = b->b_list) {
6467 if (b->b_iused > 0 && is_jump(&b->b_instr[b->b_iused-1])) {
6468 switch (b->b_instr[b->b_iused-1].i_opcode) {
6469 /* Note: Only actual jumps, not exception handlers */
6470 case SETUP_ASYNC_WITH:
6471 case SETUP_WITH:
6472 case SETUP_FINALLY:
6473 continue;
6474 }
6475 basicblock *target = b->b_instr[b->b_iused-1].i_target;
6476 if (is_exit_without_lineno(target)) {
6477 basicblock *new_target = compiler_copy_block(c, target);
6478 if (new_target == NULL) {
6479 return -1;
6480 }
6481 new_target->b_instr[0].i_lineno = b->b_instr[b->b_iused-1].i_lineno;
6482 b->b_instr[b->b_iused-1].i_target = new_target;
6483 }
6484 }
Mark Shannoneaccc122020-12-04 15:22:12 +00006485 entry = b;
6486 }
6487 assert(entry != NULL);
6488 if (is_exit_without_lineno(entry)) {
6489 entry->b_instr[0].i_lineno = c->u->u_firstlineno;
Mark Shannon5977a792020-12-02 13:31:40 +00006490 }
6491 /* Any remaining reachable exit blocks without line number can only be reached by
6492 * fall through, and thus can only have a single predecessor */
6493 for (basicblock *b = c->u->u_blocks; b != NULL; b = b->b_list) {
6494 if (!b->b_nofallthrough && b->b_next && b->b_iused > 0) {
6495 if (is_exit_without_lineno(b->b_next)) {
6496 assert(b->b_next->b_iused > 0);
6497 b->b_next->b_instr[0].i_lineno = b->b_instr[b->b_iused-1].i_lineno;
6498 }
6499 }
6500 }
6501 return 0;
6502}
6503
6504
Mark Shannon6e8128f2020-07-30 10:03:00 +01006505/* Retained for API compatibility.
6506 * Optimization is now done in optimize_cfg */
6507
6508PyObject *
6509PyCode_Optimize(PyObject *code, PyObject* Py_UNUSED(consts),
6510 PyObject *Py_UNUSED(names), PyObject *Py_UNUSED(lnotab_obj))
6511{
6512 Py_INCREF(code);
6513 return code;
6514}
6515