blob: 329add9d068babf0a95a09ce2d414c9ebf8bb421 [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.
Thomas Wouters89f507f2006-12-13 04:49:30 +000012 * 5. Optimize the byte code (peephole optimizations). See peephole.c
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"
Guido van Rossum3f5da241990-12-20 15:06:42 +000025
Victor Stinnerc96be812019-05-14 17:34:56 +020026#include "pycore_pystate.h" /* _PyInterpreterState_GET_UNSAFE() */
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"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000031#include "opcode.h"
Serhiy Storchakab0f80b02016-05-24 09:15:14 +030032#include "wordcode_helpers.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000033
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000034#define DEFAULT_BLOCK_SIZE 16
35#define DEFAULT_BLOCKS 8
36#define DEFAULT_CODE_SIZE 128
37#define DEFAULT_LNOTAB_SIZE 16
Jeremy Hylton29906ee2001-02-27 04:23:34 +000038
Nick Coghlan650f0d02007-04-15 12:05:43 +000039#define COMP_GENEXP 0
40#define COMP_LISTCOMP 1
41#define COMP_SETCOMP 2
Guido van Rossum992d4a32007-07-11 13:09:30 +000042#define COMP_DICTCOMP 3
Nick Coghlan650f0d02007-04-15 12:05:43 +000043
Pablo Galindo90235812020-03-15 04:29:22 +000044#define IS_TOP_LEVEL_AWAIT(c) ( \
45 (c->c_flags->cf_flags & PyCF_ALLOW_TOP_LEVEL_AWAIT) \
46 && (c->u->u_ste->ste_type == ModuleBlock))
47
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000048struct instr {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000049 unsigned i_jabs : 1;
50 unsigned i_jrel : 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000051 unsigned char i_opcode;
52 int i_oparg;
53 struct basicblock_ *i_target; /* target block (if jump instruction) */
54 int i_lineno;
Guido van Rossum3f5da241990-12-20 15:06:42 +000055};
56
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000057typedef struct basicblock_ {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000058 /* Each basicblock in a compilation unit is linked via b_list in the
59 reverse order that the block are allocated. b_list points to the next
60 block, not to be confused with b_next, which is next by control flow. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000061 struct basicblock_ *b_list;
62 /* number of instructions used */
63 int b_iused;
64 /* length of instruction array (b_instr) */
65 int b_ialloc;
66 /* pointer to an array of instructions, initially NULL */
67 struct instr *b_instr;
68 /* If b_next is non-NULL, it is a pointer to the next
69 block reached by normal control flow. */
70 struct basicblock_ *b_next;
71 /* b_seen is used to perform a DFS of basicblocks. */
72 unsigned b_seen : 1;
73 /* b_return is true if a RETURN_VALUE opcode is inserted. */
74 unsigned b_return : 1;
75 /* depth of stack upon entry of block, computed by stackdepth() */
76 int b_startdepth;
77 /* instruction offset for block, computed by assemble_jump_offsets() */
78 int b_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000079} basicblock;
80
81/* fblockinfo tracks the current frame block.
82
Jeremy Hyltone9357b22006-03-01 15:47:05 +000083A frame block is used to handle loops, try/except, and try/finally.
84It's called a frame block to distinguish it from a basic block in the
85compiler IR.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000086*/
87
Mark Shannonfee55262019-11-21 09:11:43 +000088enum fblocktype { WHILE_LOOP, FOR_LOOP, EXCEPT, FINALLY_TRY, FINALLY_END,
89 WITH, ASYNC_WITH, HANDLER_CLEANUP, POP_VALUE };
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000090
91struct fblockinfo {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000092 enum fblocktype fb_type;
93 basicblock *fb_block;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +020094 /* (optional) type-specific exit or cleanup block */
95 basicblock *fb_exit;
Mark Shannonfee55262019-11-21 09:11:43 +000096 /* (optional) additional information required for unwinding */
97 void *fb_datum;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000098};
99
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100100enum {
101 COMPILER_SCOPE_MODULE,
102 COMPILER_SCOPE_CLASS,
103 COMPILER_SCOPE_FUNCTION,
Yury Selivanov75445082015-05-11 22:57:16 -0400104 COMPILER_SCOPE_ASYNC_FUNCTION,
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400105 COMPILER_SCOPE_LAMBDA,
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100106 COMPILER_SCOPE_COMPREHENSION,
107};
108
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000109/* The following items change on entry and exit of code blocks.
110 They must be saved and restored when returning to a block.
111*/
112struct compiler_unit {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000113 PySTEntryObject *u_ste;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000114
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000115 PyObject *u_name;
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400116 PyObject *u_qualname; /* dot-separated qualified name (lazy) */
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100117 int u_scope_type;
118
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000119 /* The following fields are dicts that map objects to
120 the index of them in co_XXX. The index is used as
121 the argument for opcodes that refer to those collections.
122 */
123 PyObject *u_consts; /* all constants */
124 PyObject *u_names; /* all names */
125 PyObject *u_varnames; /* local variables */
126 PyObject *u_cellvars; /* cell variables */
127 PyObject *u_freevars; /* free variables */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000128
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000129 PyObject *u_private; /* for private name mangling */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000130
Victor Stinnerf8e32212013-11-19 23:56:34 +0100131 Py_ssize_t u_argcount; /* number of arguments for block */
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100132 Py_ssize_t u_posonlyargcount; /* number of positional only arguments for block */
Victor Stinnerf8e32212013-11-19 23:56:34 +0100133 Py_ssize_t u_kwonlyargcount; /* number of keyword only arguments for block */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000134 /* Pointer to the most recently allocated block. By following b_list
135 members, you can reach all early allocated blocks. */
136 basicblock *u_blocks;
137 basicblock *u_curblock; /* pointer to current block */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000138
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000139 int u_nfblocks;
140 struct fblockinfo u_fblock[CO_MAXBLOCKS];
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000141
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000142 int u_firstlineno; /* the first lineno of the block */
143 int u_lineno; /* the lineno for the current stmt */
Benjamin Petersond4efd9e2010-09-20 23:02:10 +0000144 int u_col_offset; /* the offset of the current stmt */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000145};
146
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000147/* This struct captures the global state of a compilation.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000148
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000149The u pointer points to the current compilation unit, while units
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000150for enclosing blocks are stored in c_stack. The u and c_stack are
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000151managed by compiler_enter_scope() and compiler_exit_scope().
Nick Coghlanaab9c2b2012-11-04 23:14:34 +1000152
153Note that we don't track recursion levels during compilation - the
154task of detecting and rejecting excessive levels of nesting is
155handled by the symbol analysis pass.
156
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000157*/
158
159struct compiler {
Victor Stinner14e461d2013-08-26 22:28:21 +0200160 PyObject *c_filename;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000161 struct symtable *c_st;
162 PyFutureFeatures *c_future; /* pointer to module's __future__ */
163 PyCompilerFlags *c_flags;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000164
Georg Brandl8334fd92010-12-04 10:26:46 +0000165 int c_optimize; /* optimization level */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000166 int c_interactive; /* true if in interactive mode */
167 int c_nestlevel;
Pablo Galindo18c5f9d2019-07-15 10:15:01 +0100168 int c_do_not_emit_bytecode; /* The compiler won't emit any bytecode
169 if this value is different from zero.
170 This can be used to temporarily visit
171 nodes without emitting bytecode to
172 check only errors. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000173
INADA Naokic2e16072018-11-26 21:23:22 +0900174 PyObject *c_const_cache; /* Python dict holding all constants,
175 including names tuple */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000176 struct compiler_unit *u; /* compiler state for current block */
177 PyObject *c_stack; /* Python list holding compiler_unit ptrs */
178 PyArena *c_arena; /* pointer to memory allocation arena */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000179};
180
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100181static int compiler_enter_scope(struct compiler *, identifier, int, void *, int);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000182static void compiler_free(struct compiler *);
183static basicblock *compiler_new_block(struct compiler *);
Andy Lester76d58772020-03-10 21:18:12 -0500184static int compiler_next_instr(basicblock *);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000185static int compiler_addop(struct compiler *, int);
Victor Stinnerf8e32212013-11-19 23:56:34 +0100186static int compiler_addop_i(struct compiler *, int, Py_ssize_t);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000187static int compiler_addop_j(struct compiler *, int, basicblock *, int);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000188static int compiler_error(struct compiler *, const char *);
Serhiy Storchaka62e44812019-02-16 08:12:19 +0200189static int compiler_warn(struct compiler *, const char *, ...);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000190static int compiler_nameop(struct compiler *, identifier, expr_context_ty);
191
192static PyCodeObject *compiler_mod(struct compiler *, mod_ty);
193static int compiler_visit_stmt(struct compiler *, stmt_ty);
194static int compiler_visit_keyword(struct compiler *, keyword_ty);
195static int compiler_visit_expr(struct compiler *, expr_ty);
196static int compiler_augassign(struct compiler *, stmt_ty);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -0700197static int compiler_annassign(struct compiler *, stmt_ty);
Serhiy Storchaka13d52c22020-03-10 18:52:34 +0200198static int compiler_subscript(struct compiler *, expr_ty);
199static int compiler_slice(struct compiler *, expr_ty);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000200
Andy Lester76d58772020-03-10 21:18:12 -0500201static int inplace_binop(operator_ty);
Brandt Bucher6dd9b642019-11-25 22:16:53 -0800202static int are_all_items_const(asdl_seq *, Py_ssize_t, Py_ssize_t);
Serhiy Storchaka3dfbaf52017-12-25 12:47:50 +0200203static int expr_constant(expr_ty);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000204
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -0500205static int compiler_with(struct compiler *, stmt_ty, int);
Yury Selivanov75445082015-05-11 22:57:16 -0400206static int compiler_async_with(struct compiler *, stmt_ty, int);
207static int compiler_async_for(struct compiler *, stmt_ty);
Victor Stinner976bb402016-03-23 11:36:19 +0100208static int compiler_call_helper(struct compiler *c, int n,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000209 asdl_seq *args,
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400210 asdl_seq *keywords);
Benjamin Peterson43af12b2011-05-29 11:43:10 -0500211static int compiler_try_except(struct compiler *, stmt_ty);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400212static int compiler_set_qualname(struct compiler *);
Guido van Rossumc2e20742006-02-27 22:32:47 +0000213
Yury Selivanov52c4e7c2016-09-09 10:36:01 -0700214static int compiler_sync_comprehension_generator(
215 struct compiler *c,
216 asdl_seq *generators, int gen_index,
Serhiy Storchaka8c579b12020-02-12 12:18:59 +0200217 int depth,
Yury Selivanov52c4e7c2016-09-09 10:36:01 -0700218 expr_ty elt, expr_ty val, int type);
219
220static int compiler_async_comprehension_generator(
221 struct compiler *c,
222 asdl_seq *generators, int gen_index,
Serhiy Storchaka8c579b12020-02-12 12:18:59 +0200223 int depth,
Yury Selivanov52c4e7c2016-09-09 10:36:01 -0700224 expr_ty elt, expr_ty val, int type);
225
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000226static PyCodeObject *assemble(struct compiler *, int addNone);
Mark Shannon332cd5e2018-01-30 00:41:04 +0000227static PyObject *__doc__, *__annotations__;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000228
Benjamin Peterson9e77f722015-05-07 18:41:47 -0400229#define CAPSULE_NAME "compile.c compiler unit"
Benjamin Petersonb173f782009-05-05 22:31:58 +0000230
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000231PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000232_Py_Mangle(PyObject *privateobj, PyObject *ident)
Michael W. Hudson60934622004-08-12 17:56:29 +0000233{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000234 /* Name mangling: __private becomes _classname__private.
235 This is independent from how the name is used. */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200236 PyObject *result;
237 size_t nlen, plen, ipriv;
238 Py_UCS4 maxchar;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000239 if (privateobj == NULL || !PyUnicode_Check(privateobj) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200240 PyUnicode_READ_CHAR(ident, 0) != '_' ||
241 PyUnicode_READ_CHAR(ident, 1) != '_') {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000242 Py_INCREF(ident);
243 return ident;
244 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200245 nlen = PyUnicode_GET_LENGTH(ident);
246 plen = PyUnicode_GET_LENGTH(privateobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000247 /* Don't mangle __id__ or names with dots.
Guido van Rossumd8faa362007-04-27 19:54:29 +0000248
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000249 The only time a name with a dot can occur is when
250 we are compiling an import statement that has a
251 package name.
Guido van Rossumd8faa362007-04-27 19:54:29 +0000252
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000253 TODO(jhylton): Decide whether we want to support
254 mangling of the module name, e.g. __M.X.
255 */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200256 if ((PyUnicode_READ_CHAR(ident, nlen-1) == '_' &&
257 PyUnicode_READ_CHAR(ident, nlen-2) == '_') ||
258 PyUnicode_FindChar(ident, '.', 0, nlen, 1) != -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000259 Py_INCREF(ident);
260 return ident; /* Don't mangle __whatever__ */
261 }
262 /* Strip leading underscores from class name */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200263 ipriv = 0;
264 while (PyUnicode_READ_CHAR(privateobj, ipriv) == '_')
265 ipriv++;
266 if (ipriv == plen) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000267 Py_INCREF(ident);
268 return ident; /* Don't mangle if class is just underscores */
269 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200270 plen -= ipriv;
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000271
Antoine Pitrou55bff892013-04-06 21:21:04 +0200272 if (plen + nlen >= PY_SSIZE_T_MAX - 1) {
273 PyErr_SetString(PyExc_OverflowError,
274 "private identifier too large to be mangled");
275 return NULL;
276 }
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000277
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200278 maxchar = PyUnicode_MAX_CHAR_VALUE(ident);
279 if (PyUnicode_MAX_CHAR_VALUE(privateobj) > maxchar)
280 maxchar = PyUnicode_MAX_CHAR_VALUE(privateobj);
281
282 result = PyUnicode_New(1 + nlen + plen, maxchar);
283 if (!result)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000284 return 0;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200285 /* ident = "_" + priv[ipriv:] + ident # i.e. 1+plen+nlen bytes */
286 PyUnicode_WRITE(PyUnicode_KIND(result), PyUnicode_DATA(result), 0, '_');
Victor Stinner6c7a52a2011-09-28 21:39:17 +0200287 if (PyUnicode_CopyCharacters(result, 1, privateobj, ipriv, plen) < 0) {
288 Py_DECREF(result);
289 return NULL;
290 }
291 if (PyUnicode_CopyCharacters(result, plen+1, ident, 0, nlen) < 0) {
292 Py_DECREF(result);
293 return NULL;
294 }
Victor Stinner8f825062012-04-27 13:55:39 +0200295 assert(_PyUnicode_CheckConsistency(result, 1));
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200296 return result;
Michael W. Hudson60934622004-08-12 17:56:29 +0000297}
298
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000299static int
300compiler_init(struct compiler *c)
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000301{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000302 memset(c, 0, sizeof(struct compiler));
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000303
INADA Naokic2e16072018-11-26 21:23:22 +0900304 c->c_const_cache = PyDict_New();
305 if (!c->c_const_cache) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000306 return 0;
INADA Naokic2e16072018-11-26 21:23:22 +0900307 }
308
309 c->c_stack = PyList_New(0);
310 if (!c->c_stack) {
311 Py_CLEAR(c->c_const_cache);
312 return 0;
313 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000314
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000315 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000316}
317
318PyCodeObject *
Victor Stinner14e461d2013-08-26 22:28:21 +0200319PyAST_CompileObject(mod_ty mod, PyObject *filename, PyCompilerFlags *flags,
320 int optimize, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000321{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000322 struct compiler c;
323 PyCodeObject *co = NULL;
Victor Stinner37d66d72019-06-13 02:16:41 +0200324 PyCompilerFlags local_flags = _PyCompilerFlags_INIT;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000325 int merged;
Victor Stinner331a6a52019-05-27 16:39:22 +0200326 PyConfig *config = &_PyInterpreterState_GET_UNSAFE()->config;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000327
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000328 if (!__doc__) {
329 __doc__ = PyUnicode_InternFromString("__doc__");
330 if (!__doc__)
331 return NULL;
332 }
Mark Shannon332cd5e2018-01-30 00:41:04 +0000333 if (!__annotations__) {
334 __annotations__ = PyUnicode_InternFromString("__annotations__");
335 if (!__annotations__)
336 return NULL;
337 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000338 if (!compiler_init(&c))
339 return NULL;
Victor Stinner14e461d2013-08-26 22:28:21 +0200340 Py_INCREF(filename);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000341 c.c_filename = filename;
342 c.c_arena = arena;
Victor Stinner14e461d2013-08-26 22:28:21 +0200343 c.c_future = PyFuture_FromASTObject(mod, filename);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000344 if (c.c_future == NULL)
345 goto finally;
346 if (!flags) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000347 flags = &local_flags;
348 }
349 merged = c.c_future->ff_features | flags->cf_flags;
350 c.c_future->ff_features = merged;
351 flags->cf_flags = merged;
352 c.c_flags = flags;
Victor Stinnerc96be812019-05-14 17:34:56 +0200353 c.c_optimize = (optimize == -1) ? config->optimization_level : optimize;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000354 c.c_nestlevel = 0;
Pablo Galindo18c5f9d2019-07-15 10:15:01 +0100355 c.c_do_not_emit_bytecode = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000356
Pablo Galindod112c602020-03-18 23:02:09 +0000357 _PyASTOptimizeState state;
358 state.optimize = c.c_optimize;
359 state.ff_features = merged;
360
361 if (!_PyAST_Optimize(mod, arena, &state)) {
INADA Naoki7ea143a2017-12-14 16:47:20 +0900362 goto finally;
363 }
364
Victor Stinner14e461d2013-08-26 22:28:21 +0200365 c.c_st = PySymtable_BuildObject(mod, filename, c.c_future);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000366 if (c.c_st == NULL) {
367 if (!PyErr_Occurred())
368 PyErr_SetString(PyExc_SystemError, "no symtable");
369 goto finally;
370 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000371
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000372 co = compiler_mod(&c, mod);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000373
Thomas Wouters1175c432006-02-27 22:49:54 +0000374 finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000375 compiler_free(&c);
376 assert(co || PyErr_Occurred());
377 return co;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000378}
379
380PyCodeObject *
Victor Stinner14e461d2013-08-26 22:28:21 +0200381PyAST_CompileEx(mod_ty mod, const char *filename_str, PyCompilerFlags *flags,
382 int optimize, PyArena *arena)
383{
384 PyObject *filename;
385 PyCodeObject *co;
386 filename = PyUnicode_DecodeFSDefault(filename_str);
387 if (filename == NULL)
388 return NULL;
389 co = PyAST_CompileObject(mod, filename, flags, optimize, arena);
390 Py_DECREF(filename);
391 return co;
392
393}
394
395PyCodeObject *
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000396PyNode_Compile(struct _node *n, const char *filename)
397{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000398 PyCodeObject *co = NULL;
399 mod_ty mod;
400 PyArena *arena = PyArena_New();
401 if (!arena)
402 return NULL;
403 mod = PyAST_FromNode(n, NULL, filename, arena);
404 if (mod)
405 co = PyAST_Compile(mod, filename, NULL, arena);
406 PyArena_Free(arena);
407 return co;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000408}
409
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000410static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000411compiler_free(struct compiler *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000412{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000413 if (c->c_st)
414 PySymtable_Free(c->c_st);
415 if (c->c_future)
416 PyObject_Free(c->c_future);
Victor Stinner14e461d2013-08-26 22:28:21 +0200417 Py_XDECREF(c->c_filename);
INADA Naokic2e16072018-11-26 21:23:22 +0900418 Py_DECREF(c->c_const_cache);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000419 Py_DECREF(c->c_stack);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000420}
421
Guido van Rossum79f25d91997-04-29 20:08:16 +0000422static PyObject *
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000423list2dict(PyObject *list)
Guido van Rossum2dff9911992-09-03 20:50:59 +0000424{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000425 Py_ssize_t i, n;
426 PyObject *v, *k;
427 PyObject *dict = PyDict_New();
428 if (!dict) return NULL;
Guido van Rossumd076c731998-10-07 19:42:25 +0000429
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000430 n = PyList_Size(list);
431 for (i = 0; i < n; i++) {
Victor Stinnerad9a0662013-11-19 22:23:20 +0100432 v = PyLong_FromSsize_t(i);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000433 if (!v) {
434 Py_DECREF(dict);
435 return NULL;
436 }
437 k = PyList_GET_ITEM(list, i);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +0300438 if (PyDict_SetItem(dict, k, v) < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000439 Py_DECREF(v);
440 Py_DECREF(dict);
441 return NULL;
442 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000443 Py_DECREF(v);
444 }
445 return dict;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000446}
447
448/* Return new dict containing names from src that match scope(s).
449
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000450src is a symbol table dictionary. If the scope of a name matches
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000451either scope_type or flag is set, insert it into the new dict. The
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000452values are integers, starting at offset and increasing by one for
453each key.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000454*/
455
456static PyObject *
Victor Stinnerad9a0662013-11-19 22:23:20 +0100457dictbytype(PyObject *src, int scope_type, int flag, Py_ssize_t offset)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000458{
Benjamin Peterson51ab2832012-07-18 15:12:47 -0700459 Py_ssize_t i = offset, scope, num_keys, key_i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000460 PyObject *k, *v, *dest = PyDict_New();
Meador Inge2ca63152012-07-18 14:20:11 -0500461 PyObject *sorted_keys;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000462
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000463 assert(offset >= 0);
464 if (dest == NULL)
465 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000466
Meador Inge2ca63152012-07-18 14:20:11 -0500467 /* Sort the keys so that we have a deterministic order on the indexes
468 saved in the returned dictionary. These indexes are used as indexes
469 into the free and cell var storage. Therefore if they aren't
470 deterministic, then the generated bytecode is not deterministic.
471 */
472 sorted_keys = PyDict_Keys(src);
473 if (sorted_keys == NULL)
474 return NULL;
475 if (PyList_Sort(sorted_keys) != 0) {
476 Py_DECREF(sorted_keys);
477 return NULL;
478 }
Meador Ingef69e24e2012-07-18 16:41:03 -0500479 num_keys = PyList_GET_SIZE(sorted_keys);
Meador Inge2ca63152012-07-18 14:20:11 -0500480
481 for (key_i = 0; key_i < num_keys; key_i++) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000482 /* XXX this should probably be a macro in symtable.h */
483 long vi;
Meador Inge2ca63152012-07-18 14:20:11 -0500484 k = PyList_GET_ITEM(sorted_keys, key_i);
485 v = PyDict_GetItem(src, k);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000486 assert(PyLong_Check(v));
487 vi = PyLong_AS_LONG(v);
488 scope = (vi >> SCOPE_OFFSET) & SCOPE_MASK;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000489
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000490 if (scope == scope_type || vi & flag) {
Serhiy Storchakad70c2a62018-04-20 16:01:25 +0300491 PyObject *item = PyLong_FromSsize_t(i);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000492 if (item == NULL) {
Meador Inge2ca63152012-07-18 14:20:11 -0500493 Py_DECREF(sorted_keys);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000494 Py_DECREF(dest);
495 return NULL;
496 }
497 i++;
Serhiy Storchakad70c2a62018-04-20 16:01:25 +0300498 if (PyDict_SetItem(dest, k, item) < 0) {
Meador Inge2ca63152012-07-18 14:20:11 -0500499 Py_DECREF(sorted_keys);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000500 Py_DECREF(item);
501 Py_DECREF(dest);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000502 return NULL;
503 }
504 Py_DECREF(item);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000505 }
506 }
Meador Inge2ca63152012-07-18 14:20:11 -0500507 Py_DECREF(sorted_keys);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000508 return dest;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000509}
510
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000511static void
512compiler_unit_check(struct compiler_unit *u)
513{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000514 basicblock *block;
515 for (block = u->u_blocks; block != NULL; block = block->b_list) {
Benjamin Petersonca470632016-09-06 13:47:26 -0700516 assert((uintptr_t)block != 0xcbcbcbcbU);
517 assert((uintptr_t)block != 0xfbfbfbfbU);
518 assert((uintptr_t)block != 0xdbdbdbdbU);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000519 if (block->b_instr != NULL) {
520 assert(block->b_ialloc > 0);
521 assert(block->b_iused > 0);
522 assert(block->b_ialloc >= block->b_iused);
523 }
524 else {
525 assert (block->b_iused == 0);
526 assert (block->b_ialloc == 0);
527 }
528 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000529}
530
531static void
532compiler_unit_free(struct compiler_unit *u)
533{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000534 basicblock *b, *next;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000535
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000536 compiler_unit_check(u);
537 b = u->u_blocks;
538 while (b != NULL) {
539 if (b->b_instr)
540 PyObject_Free((void *)b->b_instr);
541 next = b->b_list;
542 PyObject_Free((void *)b);
543 b = next;
544 }
545 Py_CLEAR(u->u_ste);
546 Py_CLEAR(u->u_name);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400547 Py_CLEAR(u->u_qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000548 Py_CLEAR(u->u_consts);
549 Py_CLEAR(u->u_names);
550 Py_CLEAR(u->u_varnames);
551 Py_CLEAR(u->u_freevars);
552 Py_CLEAR(u->u_cellvars);
553 Py_CLEAR(u->u_private);
554 PyObject_Free(u);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000555}
556
557static int
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100558compiler_enter_scope(struct compiler *c, identifier name,
559 int scope_type, void *key, int lineno)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000560{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000561 struct compiler_unit *u;
Victor Stinnerfc6f2ef2016-02-27 02:19:22 +0100562 basicblock *block;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000563
Andy Lester7668a8b2020-03-24 23:26:44 -0500564 u = (struct compiler_unit *)PyObject_Calloc(1, sizeof(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000565 struct compiler_unit));
566 if (!u) {
567 PyErr_NoMemory();
568 return 0;
569 }
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100570 u->u_scope_type = scope_type;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000571 u->u_argcount = 0;
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100572 u->u_posonlyargcount = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000573 u->u_kwonlyargcount = 0;
574 u->u_ste = PySymtable_Lookup(c->c_st, key);
575 if (!u->u_ste) {
576 compiler_unit_free(u);
577 return 0;
578 }
579 Py_INCREF(name);
580 u->u_name = name;
581 u->u_varnames = list2dict(u->u_ste->ste_varnames);
582 u->u_cellvars = dictbytype(u->u_ste->ste_symbols, CELL, 0, 0);
583 if (!u->u_varnames || !u->u_cellvars) {
584 compiler_unit_free(u);
585 return 0;
586 }
Benjamin Peterson312595c2013-05-15 15:26:42 -0500587 if (u->u_ste->ste_needs_class_closure) {
Martin Panter7462b6492015-11-02 03:37:02 +0000588 /* Cook up an implicit __class__ cell. */
Benjamin Peterson312595c2013-05-15 15:26:42 -0500589 _Py_IDENTIFIER(__class__);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +0300590 PyObject *name;
Benjamin Peterson312595c2013-05-15 15:26:42 -0500591 int res;
592 assert(u->u_scope_type == COMPILER_SCOPE_CLASS);
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +0200593 assert(PyDict_GET_SIZE(u->u_cellvars) == 0);
Benjamin Peterson312595c2013-05-15 15:26:42 -0500594 name = _PyUnicode_FromId(&PyId___class__);
595 if (!name) {
596 compiler_unit_free(u);
597 return 0;
598 }
Serhiy Storchakad70c2a62018-04-20 16:01:25 +0300599 res = PyDict_SetItem(u->u_cellvars, name, _PyLong_Zero);
Benjamin Peterson312595c2013-05-15 15:26:42 -0500600 if (res < 0) {
601 compiler_unit_free(u);
602 return 0;
603 }
604 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000605
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000606 u->u_freevars = dictbytype(u->u_ste->ste_symbols, FREE, DEF_FREE_CLASS,
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +0200607 PyDict_GET_SIZE(u->u_cellvars));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000608 if (!u->u_freevars) {
609 compiler_unit_free(u);
610 return 0;
611 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000612
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000613 u->u_blocks = NULL;
614 u->u_nfblocks = 0;
615 u->u_firstlineno = lineno;
616 u->u_lineno = 0;
Benjamin Petersond4efd9e2010-09-20 23:02:10 +0000617 u->u_col_offset = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000618 u->u_consts = PyDict_New();
619 if (!u->u_consts) {
620 compiler_unit_free(u);
621 return 0;
622 }
623 u->u_names = PyDict_New();
624 if (!u->u_names) {
625 compiler_unit_free(u);
626 return 0;
627 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000628
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000629 u->u_private = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000630
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000631 /* Push the old compiler_unit on the stack. */
632 if (c->u) {
Benjamin Peterson9e77f722015-05-07 18:41:47 -0400633 PyObject *capsule = PyCapsule_New(c->u, CAPSULE_NAME, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000634 if (!capsule || PyList_Append(c->c_stack, capsule) < 0) {
635 Py_XDECREF(capsule);
636 compiler_unit_free(u);
637 return 0;
638 }
639 Py_DECREF(capsule);
640 u->u_private = c->u->u_private;
641 Py_XINCREF(u->u_private);
642 }
643 c->u = u;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000644
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000645 c->c_nestlevel++;
Victor Stinnerfc6f2ef2016-02-27 02:19:22 +0100646
647 block = compiler_new_block(c);
648 if (block == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000649 return 0;
Victor Stinnerfc6f2ef2016-02-27 02:19:22 +0100650 c->u->u_curblock = block;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000651
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400652 if (u->u_scope_type != COMPILER_SCOPE_MODULE) {
653 if (!compiler_set_qualname(c))
654 return 0;
655 }
656
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000657 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000658}
659
Neil Schemenauerc396d9e2005-10-25 06:30:14 +0000660static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000661compiler_exit_scope(struct compiler *c)
662{
Victor Stinnerad9a0662013-11-19 22:23:20 +0100663 Py_ssize_t n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000664 PyObject *capsule;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000665
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000666 c->c_nestlevel--;
667 compiler_unit_free(c->u);
668 /* Restore c->u to the parent unit. */
669 n = PyList_GET_SIZE(c->c_stack) - 1;
670 if (n >= 0) {
671 capsule = PyList_GET_ITEM(c->c_stack, n);
Benjamin Peterson9e77f722015-05-07 18:41:47 -0400672 c->u = (struct compiler_unit *)PyCapsule_GetPointer(capsule, CAPSULE_NAME);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000673 assert(c->u);
674 /* we are deleting from a list so this really shouldn't fail */
675 if (PySequence_DelItem(c->c_stack, n) < 0)
676 Py_FatalError("compiler_exit_scope()");
677 compiler_unit_check(c->u);
678 }
679 else
680 c->u = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000681
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000682}
683
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400684static int
685compiler_set_qualname(struct compiler *c)
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100686{
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100687 _Py_static_string(dot, ".");
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400688 _Py_static_string(dot_locals, ".<locals>");
689 Py_ssize_t stack_size;
690 struct compiler_unit *u = c->u;
691 PyObject *name, *base, *dot_str, *dot_locals_str;
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100692
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400693 base = NULL;
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100694 stack_size = PyList_GET_SIZE(c->c_stack);
Benjamin Petersona8a38b82013-10-19 16:14:39 -0400695 assert(stack_size >= 1);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400696 if (stack_size > 1) {
697 int scope, force_global = 0;
698 struct compiler_unit *parent;
699 PyObject *mangled, *capsule;
700
Benjamin Peterson3d9e4812013-10-19 16:01:13 -0400701 capsule = PyList_GET_ITEM(c->c_stack, stack_size - 1);
Benjamin Peterson9e77f722015-05-07 18:41:47 -0400702 parent = (struct compiler_unit *)PyCapsule_GetPointer(capsule, CAPSULE_NAME);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400703 assert(parent);
704
Yury Selivanov75445082015-05-11 22:57:16 -0400705 if (u->u_scope_type == COMPILER_SCOPE_FUNCTION
706 || u->u_scope_type == COMPILER_SCOPE_ASYNC_FUNCTION
707 || u->u_scope_type == COMPILER_SCOPE_CLASS) {
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400708 assert(u->u_name);
709 mangled = _Py_Mangle(parent->u_private, u->u_name);
710 if (!mangled)
711 return 0;
712 scope = PyST_GetScope(parent->u_ste, mangled);
713 Py_DECREF(mangled);
714 assert(scope != GLOBAL_IMPLICIT);
715 if (scope == GLOBAL_EXPLICIT)
716 force_global = 1;
717 }
718
719 if (!force_global) {
720 if (parent->u_scope_type == COMPILER_SCOPE_FUNCTION
Yury Selivanov75445082015-05-11 22:57:16 -0400721 || parent->u_scope_type == COMPILER_SCOPE_ASYNC_FUNCTION
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400722 || parent->u_scope_type == COMPILER_SCOPE_LAMBDA) {
723 dot_locals_str = _PyUnicode_FromId(&dot_locals);
724 if (dot_locals_str == NULL)
725 return 0;
726 base = PyUnicode_Concat(parent->u_qualname, dot_locals_str);
727 if (base == NULL)
728 return 0;
729 }
730 else {
731 Py_INCREF(parent->u_qualname);
732 base = parent->u_qualname;
Benjamin Peterson3d9e4812013-10-19 16:01:13 -0400733 }
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100734 }
735 }
Benjamin Peterson3d9e4812013-10-19 16:01:13 -0400736
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400737 if (base != NULL) {
738 dot_str = _PyUnicode_FromId(&dot);
739 if (dot_str == NULL) {
740 Py_DECREF(base);
741 return 0;
742 }
743 name = PyUnicode_Concat(base, dot_str);
744 Py_DECREF(base);
745 if (name == NULL)
746 return 0;
747 PyUnicode_Append(&name, u->u_name);
748 if (name == NULL)
749 return 0;
750 }
751 else {
752 Py_INCREF(u->u_name);
753 name = u->u_name;
754 }
755 u->u_qualname = name;
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100756
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400757 return 1;
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100758}
759
Eric V. Smith235a6f02015-09-19 14:51:32 -0400760
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000761/* Allocate a new block and return a pointer to it.
762 Returns NULL on error.
763*/
764
765static basicblock *
766compiler_new_block(struct compiler *c)
767{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000768 basicblock *b;
769 struct compiler_unit *u;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000770
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000771 u = c->u;
Andy Lester7668a8b2020-03-24 23:26:44 -0500772 b = (basicblock *)PyObject_Calloc(1, sizeof(basicblock));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000773 if (b == NULL) {
774 PyErr_NoMemory();
775 return NULL;
776 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000777 /* Extend the singly linked list of blocks with new block. */
778 b->b_list = u->u_blocks;
779 u->u_blocks = b;
780 return b;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000781}
782
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000783static basicblock *
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000784compiler_next_block(struct compiler *c)
785{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000786 basicblock *block = compiler_new_block(c);
787 if (block == NULL)
788 return NULL;
789 c->u->u_curblock->b_next = block;
790 c->u->u_curblock = block;
791 return block;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000792}
793
794static basicblock *
795compiler_use_next_block(struct compiler *c, basicblock *block)
796{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000797 assert(block != NULL);
798 c->u->u_curblock->b_next = block;
799 c->u->u_curblock = block;
800 return block;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000801}
802
803/* Returns the offset of the next instruction in the current block's
804 b_instr array. Resizes the b_instr as necessary.
805 Returns -1 on failure.
Thomas Wouters89f507f2006-12-13 04:49:30 +0000806*/
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000807
808static int
Andy Lester76d58772020-03-10 21:18:12 -0500809compiler_next_instr(basicblock *b)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000810{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000811 assert(b != NULL);
812 if (b->b_instr == NULL) {
Andy Lester7668a8b2020-03-24 23:26:44 -0500813 b->b_instr = (struct instr *)PyObject_Calloc(
814 DEFAULT_BLOCK_SIZE, sizeof(struct instr));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000815 if (b->b_instr == NULL) {
816 PyErr_NoMemory();
817 return -1;
818 }
819 b->b_ialloc = DEFAULT_BLOCK_SIZE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000820 }
821 else if (b->b_iused == b->b_ialloc) {
822 struct instr *tmp;
823 size_t oldsize, newsize;
824 oldsize = b->b_ialloc * sizeof(struct instr);
825 newsize = oldsize << 1;
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000826
Benjamin Peterson2f8bfef2016-09-07 09:26:18 -0700827 if (oldsize > (SIZE_MAX >> 1)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000828 PyErr_NoMemory();
829 return -1;
830 }
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000831
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000832 if (newsize == 0) {
833 PyErr_NoMemory();
834 return -1;
835 }
836 b->b_ialloc <<= 1;
837 tmp = (struct instr *)PyObject_Realloc(
838 (void *)b->b_instr, newsize);
839 if (tmp == NULL) {
840 PyErr_NoMemory();
841 return -1;
842 }
843 b->b_instr = tmp;
844 memset((char *)b->b_instr + oldsize, 0, newsize - oldsize);
845 }
846 return b->b_iused++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000847}
848
Serhiy Storchaka61cb3d02020-03-17 18:07:30 +0200849/* Set the line number and column offset for the following instructions.
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000850
Christian Heimes2202f872008-02-06 14:31:34 +0000851 The line number is reset in the following cases:
852 - when entering a new scope
853 - on each statement
Serhiy Storchaka61cb3d02020-03-17 18:07:30 +0200854 - on each expression and sub-expression
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +0200855 - before the "except" and "finally" clauses
Thomas Wouters89f507f2006-12-13 04:49:30 +0000856*/
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000857
Serhiy Storchaka61cb3d02020-03-17 18:07:30 +0200858#define SET_LOC(c, x) \
859 (c)->u->u_lineno = (x)->lineno; \
860 (c)->u->u_col_offset = (x)->col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000861
Serhiy Storchakad4864c62018-01-09 21:54:52 +0200862/* Return the stack effect of opcode with argument oparg.
863
864 Some opcodes have different stack effect when jump to the target and
865 when not jump. The 'jump' parameter specifies the case:
866
867 * 0 -- when not jump
868 * 1 -- when jump
869 * -1 -- maximal
870 */
871/* XXX Make the stack effect of WITH_CLEANUP_START and
872 WITH_CLEANUP_FINISH deterministic. */
873static int
874stack_effect(int opcode, int oparg, int jump)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000875{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000876 switch (opcode) {
Serhiy Storchaka57faf342018-04-25 22:04:06 +0300877 case NOP:
878 case EXTENDED_ARG:
879 return 0;
880
Serhiy Storchakad4864c62018-01-09 21:54:52 +0200881 /* Stack manipulation */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000882 case POP_TOP:
883 return -1;
884 case ROT_TWO:
885 case ROT_THREE:
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +0200886 case ROT_FOUR:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000887 return 0;
888 case DUP_TOP:
889 return 1;
Antoine Pitrou74a69fa2010-09-04 18:43:52 +0000890 case DUP_TOP_TWO:
891 return 2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000892
Serhiy Storchakad4864c62018-01-09 21:54:52 +0200893 /* Unary operators */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000894 case UNARY_POSITIVE:
895 case UNARY_NEGATIVE:
896 case UNARY_NOT:
897 case UNARY_INVERT:
898 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000899
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000900 case SET_ADD:
901 case LIST_APPEND:
902 return -1;
903 case MAP_ADD:
904 return -2;
Neal Norwitz10be2ea2006-03-03 20:29:11 +0000905
Serhiy Storchakad4864c62018-01-09 21:54:52 +0200906 /* Binary operators */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000907 case BINARY_POWER:
908 case BINARY_MULTIPLY:
Benjamin Petersond51374e2014-04-09 23:55:56 -0400909 case BINARY_MATRIX_MULTIPLY:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000910 case BINARY_MODULO:
911 case BINARY_ADD:
912 case BINARY_SUBTRACT:
913 case BINARY_SUBSCR:
914 case BINARY_FLOOR_DIVIDE:
915 case BINARY_TRUE_DIVIDE:
916 return -1;
917 case INPLACE_FLOOR_DIVIDE:
918 case INPLACE_TRUE_DIVIDE:
919 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000920
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000921 case INPLACE_ADD:
922 case INPLACE_SUBTRACT:
923 case INPLACE_MULTIPLY:
Benjamin Petersond51374e2014-04-09 23:55:56 -0400924 case INPLACE_MATRIX_MULTIPLY:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000925 case INPLACE_MODULO:
926 return -1;
927 case STORE_SUBSCR:
928 return -3;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000929 case DELETE_SUBSCR:
930 return -2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000931
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000932 case BINARY_LSHIFT:
933 case BINARY_RSHIFT:
934 case BINARY_AND:
935 case BINARY_XOR:
936 case BINARY_OR:
937 return -1;
938 case INPLACE_POWER:
939 return -1;
940 case GET_ITER:
941 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000942
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000943 case PRINT_EXPR:
944 return -1;
945 case LOAD_BUILD_CLASS:
946 return 1;
947 case INPLACE_LSHIFT:
948 case INPLACE_RSHIFT:
949 case INPLACE_AND:
950 case INPLACE_XOR:
951 case INPLACE_OR:
952 return -1;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +0200953
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000954 case SETUP_WITH:
Serhiy Storchakad4864c62018-01-09 21:54:52 +0200955 /* 1 in the normal flow.
956 * Restore the stack position and push 6 values before jumping to
957 * the handler if an exception be raised. */
958 return jump ? 6 : 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000959 case RETURN_VALUE:
960 return -1;
961 case IMPORT_STAR:
962 return -1;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -0700963 case SETUP_ANNOTATIONS:
964 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000965 case YIELD_VALUE:
966 return 0;
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -0500967 case YIELD_FROM:
968 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000969 case POP_BLOCK:
970 return 0;
971 case POP_EXCEPT:
Serhiy Storchakad4864c62018-01-09 21:54:52 +0200972 return -3;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000973
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000974 case STORE_NAME:
975 return -1;
976 case DELETE_NAME:
977 return 0;
978 case UNPACK_SEQUENCE:
979 return oparg-1;
980 case UNPACK_EX:
981 return (oparg&0xFF) + (oparg>>8);
982 case FOR_ITER:
Serhiy Storchakad4864c62018-01-09 21:54:52 +0200983 /* -1 at end of iterator, 1 if continue iterating. */
984 return jump > 0 ? -1 : 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000985
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000986 case STORE_ATTR:
987 return -2;
988 case DELETE_ATTR:
989 return -1;
990 case STORE_GLOBAL:
991 return -1;
992 case DELETE_GLOBAL:
993 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000994 case LOAD_CONST:
995 return 1;
996 case LOAD_NAME:
997 return 1;
998 case BUILD_TUPLE:
999 case BUILD_LIST:
1000 case BUILD_SET:
Serhiy Storchakaea525a22016-09-06 22:07:53 +03001001 case BUILD_STRING:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001002 return 1-oparg;
1003 case BUILD_MAP:
Benjamin Petersonb6855152015-09-10 21:02:39 -07001004 return 1 - 2*oparg;
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03001005 case BUILD_CONST_KEY_MAP:
1006 return -oparg;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001007 case LOAD_ATTR:
1008 return 0;
1009 case COMPARE_OP:
Mark Shannon9af0e472020-01-14 10:12:45 +00001010 case IS_OP:
1011 case CONTAINS_OP:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001012 return -1;
Mark Shannon9af0e472020-01-14 10:12:45 +00001013 case JUMP_IF_NOT_EXC_MATCH:
1014 return -2;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001015 case IMPORT_NAME:
1016 return -1;
1017 case IMPORT_FROM:
1018 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001019
Serhiy Storchakad4864c62018-01-09 21:54:52 +02001020 /* Jumps */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001021 case JUMP_FORWARD:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001022 case JUMP_ABSOLUTE:
1023 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001024
Serhiy Storchakad4864c62018-01-09 21:54:52 +02001025 case JUMP_IF_TRUE_OR_POP:
1026 case JUMP_IF_FALSE_OR_POP:
1027 return jump ? 0 : -1;
1028
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001029 case POP_JUMP_IF_FALSE:
1030 case POP_JUMP_IF_TRUE:
1031 return -1;
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00001032
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001033 case LOAD_GLOBAL:
1034 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001035
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001036 /* Exception handling */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001037 case SETUP_FINALLY:
Serhiy Storchakad4864c62018-01-09 21:54:52 +02001038 /* 0 in the normal flow.
1039 * Restore the stack position and push 6 values before jumping to
1040 * the handler if an exception be raised. */
1041 return jump ? 6 : 0;
Mark Shannonfee55262019-11-21 09:11:43 +00001042 case RERAISE:
1043 return -3;
1044
1045 case WITH_EXCEPT_START:
1046 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001047
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001048 case LOAD_FAST:
1049 return 1;
1050 case STORE_FAST:
1051 return -1;
1052 case DELETE_FAST:
1053 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001054
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001055 case RAISE_VARARGS:
1056 return -oparg;
Serhiy Storchakad4864c62018-01-09 21:54:52 +02001057
1058 /* Functions and calls */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001059 case CALL_FUNCTION:
Victor Stinnerf9b760f2016-09-09 10:17:08 -07001060 return -oparg;
Yury Selivanovf2392132016-12-13 19:03:51 -05001061 case CALL_METHOD:
1062 return -oparg-1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001063 case CALL_FUNCTION_KW:
Victor Stinnerf9b760f2016-09-09 10:17:08 -07001064 return -oparg-1;
1065 case CALL_FUNCTION_EX:
Matthieu Dartiailh3a9ac822017-02-21 14:25:22 +01001066 return -1 - ((oparg & 0x01) != 0);
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001067 case MAKE_FUNCTION:
1068 return -1 - ((oparg & 0x01) != 0) - ((oparg & 0x02) != 0) -
1069 ((oparg & 0x04) != 0) - ((oparg & 0x08) != 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001070 case BUILD_SLICE:
1071 if (oparg == 3)
1072 return -2;
1073 else
1074 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001075
Serhiy Storchakad4864c62018-01-09 21:54:52 +02001076 /* Closures */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001077 case LOAD_CLOSURE:
1078 return 1;
1079 case LOAD_DEREF:
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04001080 case LOAD_CLASSDEREF:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001081 return 1;
1082 case STORE_DEREF:
1083 return -1;
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00001084 case DELETE_DEREF:
1085 return 0;
Serhiy Storchakad4864c62018-01-09 21:54:52 +02001086
1087 /* Iterators and generators */
Yury Selivanov75445082015-05-11 22:57:16 -04001088 case GET_AWAITABLE:
1089 return 0;
1090 case SETUP_ASYNC_WITH:
Serhiy Storchakad4864c62018-01-09 21:54:52 +02001091 /* 0 in the normal flow.
1092 * Restore the stack position to the position before the result
1093 * of __aenter__ and push 6 values before jumping to the handler
1094 * if an exception be raised. */
1095 return jump ? -1 + 6 : 0;
Yury Selivanov75445082015-05-11 22:57:16 -04001096 case BEFORE_ASYNC_WITH:
1097 return 1;
1098 case GET_AITER:
1099 return 0;
1100 case GET_ANEXT:
1101 return 1;
Yury Selivanov5376ba92015-06-22 12:19:30 -04001102 case GET_YIELD_FROM_ITER:
1103 return 0;
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02001104 case END_ASYNC_FOR:
1105 return -7;
Eric V. Smitha78c7952015-11-03 12:45:05 -05001106 case FORMAT_VALUE:
1107 /* If there's a fmt_spec on the stack, we go from 2->1,
1108 else 1->1. */
1109 return (oparg & FVS_MASK) == FVS_HAVE_SPEC ? -1 : 0;
Yury Selivanovf2392132016-12-13 19:03:51 -05001110 case LOAD_METHOD:
1111 return 1;
Zackery Spytzce6a0702019-08-25 03:44:09 -06001112 case LOAD_ASSERTION_ERROR:
1113 return 1;
Mark Shannon13bc1392020-01-23 09:25:17 +00001114 case LIST_TO_TUPLE:
1115 return 0;
1116 case LIST_EXTEND:
1117 case SET_UPDATE:
Mark Shannon8a4cd702020-01-27 09:57:45 +00001118 case DICT_MERGE:
1119 case DICT_UPDATE:
Mark Shannon13bc1392020-01-23 09:25:17 +00001120 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001121 default:
Larry Hastings3a907972013-11-23 14:49:22 -08001122 return PY_INVALID_STACK_EFFECT;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001123 }
Larry Hastings3a907972013-11-23 14:49:22 -08001124 return PY_INVALID_STACK_EFFECT; /* not reachable */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001125}
1126
Serhiy Storchakad4864c62018-01-09 21:54:52 +02001127int
Serhiy Storchaka7bdf2822018-09-18 09:54:26 +03001128PyCompile_OpcodeStackEffectWithJump(int opcode, int oparg, int jump)
1129{
1130 return stack_effect(opcode, oparg, jump);
1131}
1132
1133int
Serhiy Storchakad4864c62018-01-09 21:54:52 +02001134PyCompile_OpcodeStackEffect(int opcode, int oparg)
1135{
1136 return stack_effect(opcode, oparg, -1);
1137}
1138
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001139/* Add an opcode with no argument.
1140 Returns 0 on failure, 1 on success.
1141*/
1142
1143static int
1144compiler_addop(struct compiler *c, int opcode)
1145{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001146 basicblock *b;
1147 struct instr *i;
1148 int off;
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001149 assert(!HAS_ARG(opcode));
Pablo Galindo18c5f9d2019-07-15 10:15:01 +01001150 if (c->c_do_not_emit_bytecode) {
1151 return 1;
1152 }
Andy Lester76d58772020-03-10 21:18:12 -05001153 off = compiler_next_instr(c->u->u_curblock);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001154 if (off < 0)
1155 return 0;
1156 b = c->u->u_curblock;
1157 i = &b->b_instr[off];
1158 i->i_opcode = opcode;
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001159 i->i_oparg = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001160 if (opcode == RETURN_VALUE)
1161 b->b_return = 1;
Serhiy Storchaka61cb3d02020-03-17 18:07:30 +02001162 i->i_lineno = c->u->u_lineno;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001163 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001164}
1165
Victor Stinnerf8e32212013-11-19 23:56:34 +01001166static Py_ssize_t
Andy Lester76d58772020-03-10 21:18:12 -05001167compiler_add_o(PyObject *dict, PyObject *o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001168{
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001169 PyObject *v;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001170 Py_ssize_t arg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001171
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001172 v = PyDict_GetItemWithError(dict, o);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001173 if (!v) {
Stefan Krahc0cbed12015-07-27 12:56:49 +02001174 if (PyErr_Occurred()) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001175 return -1;
Stefan Krahc0cbed12015-07-27 12:56:49 +02001176 }
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +02001177 arg = PyDict_GET_SIZE(dict);
Victor Stinnerad9a0662013-11-19 22:23:20 +01001178 v = PyLong_FromSsize_t(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001179 if (!v) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001180 return -1;
1181 }
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001182 if (PyDict_SetItem(dict, o, v) < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001183 Py_DECREF(v);
1184 return -1;
1185 }
1186 Py_DECREF(v);
1187 }
1188 else
1189 arg = PyLong_AsLong(v);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001190 return arg;
1191}
1192
INADA Naokic2e16072018-11-26 21:23:22 +09001193// Merge const *o* recursively and return constant key object.
1194static PyObject*
1195merge_consts_recursive(struct compiler *c, PyObject *o)
1196{
1197 // None and Ellipsis are singleton, and key is the singleton.
1198 // No need to merge object and key.
1199 if (o == Py_None || o == Py_Ellipsis) {
1200 Py_INCREF(o);
1201 return o;
1202 }
1203
1204 PyObject *key = _PyCode_ConstantKey(o);
1205 if (key == NULL) {
1206 return NULL;
1207 }
1208
1209 // t is borrowed reference
1210 PyObject *t = PyDict_SetDefault(c->c_const_cache, key, key);
1211 if (t != key) {
INADA Naokif7e4d362018-11-29 00:58:46 +09001212 // o is registered in c_const_cache. Just use it.
Zackery Spytz9b4a1b12019-03-20 03:16:25 -06001213 Py_XINCREF(t);
INADA Naokic2e16072018-11-26 21:23:22 +09001214 Py_DECREF(key);
1215 return t;
1216 }
1217
INADA Naokif7e4d362018-11-29 00:58:46 +09001218 // We registered o in c_const_cache.
Simeon63b5fc52019-04-09 19:36:57 -04001219 // When o is a tuple or frozenset, we want to merge its
INADA Naokif7e4d362018-11-29 00:58:46 +09001220 // items too.
INADA Naokic2e16072018-11-26 21:23:22 +09001221 if (PyTuple_CheckExact(o)) {
INADA Naokif7e4d362018-11-29 00:58:46 +09001222 Py_ssize_t len = PyTuple_GET_SIZE(o);
1223 for (Py_ssize_t i = 0; i < len; i++) {
INADA Naokic2e16072018-11-26 21:23:22 +09001224 PyObject *item = PyTuple_GET_ITEM(o, i);
1225 PyObject *u = merge_consts_recursive(c, item);
1226 if (u == NULL) {
1227 Py_DECREF(key);
1228 return NULL;
1229 }
1230
1231 // See _PyCode_ConstantKey()
1232 PyObject *v; // borrowed
1233 if (PyTuple_CheckExact(u)) {
1234 v = PyTuple_GET_ITEM(u, 1);
1235 }
1236 else {
1237 v = u;
1238 }
1239 if (v != item) {
1240 Py_INCREF(v);
1241 PyTuple_SET_ITEM(o, i, v);
1242 Py_DECREF(item);
1243 }
1244
1245 Py_DECREF(u);
1246 }
1247 }
INADA Naokif7e4d362018-11-29 00:58:46 +09001248 else if (PyFrozenSet_CheckExact(o)) {
Simeon63b5fc52019-04-09 19:36:57 -04001249 // *key* is tuple. And its first item is frozenset of
INADA Naokif7e4d362018-11-29 00:58:46 +09001250 // constant keys.
1251 // See _PyCode_ConstantKey() for detail.
1252 assert(PyTuple_CheckExact(key));
1253 assert(PyTuple_GET_SIZE(key) == 2);
1254
1255 Py_ssize_t len = PySet_GET_SIZE(o);
1256 if (len == 0) { // empty frozenset should not be re-created.
1257 return key;
1258 }
1259 PyObject *tuple = PyTuple_New(len);
1260 if (tuple == NULL) {
1261 Py_DECREF(key);
1262 return NULL;
1263 }
1264 Py_ssize_t i = 0, pos = 0;
1265 PyObject *item;
1266 Py_hash_t hash;
1267 while (_PySet_NextEntry(o, &pos, &item, &hash)) {
1268 PyObject *k = merge_consts_recursive(c, item);
1269 if (k == NULL) {
1270 Py_DECREF(tuple);
1271 Py_DECREF(key);
1272 return NULL;
1273 }
1274 PyObject *u;
1275 if (PyTuple_CheckExact(k)) {
1276 u = PyTuple_GET_ITEM(k, 1);
1277 Py_INCREF(u);
1278 Py_DECREF(k);
1279 }
1280 else {
1281 u = k;
1282 }
1283 PyTuple_SET_ITEM(tuple, i, u); // Steals reference of u.
1284 i++;
1285 }
1286
1287 // Instead of rewriting o, we create new frozenset and embed in the
1288 // key tuple. Caller should get merged frozenset from the key tuple.
1289 PyObject *new = PyFrozenSet_New(tuple);
1290 Py_DECREF(tuple);
1291 if (new == NULL) {
1292 Py_DECREF(key);
1293 return NULL;
1294 }
1295 assert(PyTuple_GET_ITEM(key, 1) == o);
1296 Py_DECREF(o);
1297 PyTuple_SET_ITEM(key, 1, new);
1298 }
INADA Naokic2e16072018-11-26 21:23:22 +09001299
1300 return key;
1301}
1302
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001303static Py_ssize_t
1304compiler_add_const(struct compiler *c, PyObject *o)
1305{
Pablo Galindo18c5f9d2019-07-15 10:15:01 +01001306 if (c->c_do_not_emit_bytecode) {
1307 return 0;
1308 }
1309
INADA Naokic2e16072018-11-26 21:23:22 +09001310 PyObject *key = merge_consts_recursive(c, o);
1311 if (key == NULL) {
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001312 return -1;
INADA Naokic2e16072018-11-26 21:23:22 +09001313 }
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001314
Andy Lester76d58772020-03-10 21:18:12 -05001315 Py_ssize_t arg = compiler_add_o(c->u->u_consts, key);
INADA Naokic2e16072018-11-26 21:23:22 +09001316 Py_DECREF(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001317 return arg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001318}
1319
1320static int
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001321compiler_addop_load_const(struct compiler *c, PyObject *o)
1322{
Pablo Galindo18c5f9d2019-07-15 10:15:01 +01001323 if (c->c_do_not_emit_bytecode) {
1324 return 1;
1325 }
1326
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001327 Py_ssize_t arg = compiler_add_const(c, o);
1328 if (arg < 0)
1329 return 0;
1330 return compiler_addop_i(c, LOAD_CONST, arg);
1331}
1332
1333static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001334compiler_addop_o(struct compiler *c, int opcode, PyObject *dict,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001335 PyObject *o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001336{
Pablo Galindo18c5f9d2019-07-15 10:15:01 +01001337 if (c->c_do_not_emit_bytecode) {
1338 return 1;
1339 }
1340
Andy Lester76d58772020-03-10 21:18:12 -05001341 Py_ssize_t arg = compiler_add_o(dict, o);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001342 if (arg < 0)
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00001343 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001344 return compiler_addop_i(c, opcode, arg);
1345}
1346
1347static int
1348compiler_addop_name(struct compiler *c, int opcode, PyObject *dict,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001349 PyObject *o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001350{
Victor Stinnerad9a0662013-11-19 22:23:20 +01001351 Py_ssize_t arg;
Pablo Galindo18c5f9d2019-07-15 10:15:01 +01001352
1353 if (c->c_do_not_emit_bytecode) {
1354 return 1;
1355 }
1356
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001357 PyObject *mangled = _Py_Mangle(c->u->u_private, o);
1358 if (!mangled)
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00001359 return 0;
Andy Lester76d58772020-03-10 21:18:12 -05001360 arg = compiler_add_o(dict, mangled);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001361 Py_DECREF(mangled);
1362 if (arg < 0)
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00001363 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001364 return compiler_addop_i(c, opcode, arg);
1365}
1366
1367/* Add an opcode with an integer argument.
1368 Returns 0 on failure, 1 on success.
1369*/
1370
1371static int
Victor Stinnerf8e32212013-11-19 23:56:34 +01001372compiler_addop_i(struct compiler *c, int opcode, Py_ssize_t oparg)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001373{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001374 struct instr *i;
1375 int off;
Victor Stinnerad9a0662013-11-19 22:23:20 +01001376
Pablo Galindo18c5f9d2019-07-15 10:15:01 +01001377 if (c->c_do_not_emit_bytecode) {
1378 return 1;
1379 }
1380
Victor Stinner2ad474b2016-03-01 23:34:47 +01001381 /* oparg value is unsigned, but a signed C int is usually used to store
1382 it in the C code (like Python/ceval.c).
1383
1384 Limit to 32-bit signed C int (rather than INT_MAX) for portability.
1385
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001386 The argument of a concrete bytecode instruction is limited to 8-bit.
1387 EXTENDED_ARG is used for 16, 24, and 32-bit arguments. */
1388 assert(HAS_ARG(opcode));
Victor Stinner2ad474b2016-03-01 23:34:47 +01001389 assert(0 <= oparg && oparg <= 2147483647);
Victor Stinnerad9a0662013-11-19 22:23:20 +01001390
Andy Lester76d58772020-03-10 21:18:12 -05001391 off = compiler_next_instr(c->u->u_curblock);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001392 if (off < 0)
1393 return 0;
1394 i = &c->u->u_curblock->b_instr[off];
Victor Stinnerf8e32212013-11-19 23:56:34 +01001395 i->i_opcode = opcode;
1396 i->i_oparg = Py_SAFE_DOWNCAST(oparg, Py_ssize_t, int);
Serhiy Storchaka61cb3d02020-03-17 18:07:30 +02001397 i->i_lineno = c->u->u_lineno;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001398 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001399}
1400
1401static int
1402compiler_addop_j(struct compiler *c, int opcode, basicblock *b, int absolute)
1403{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001404 struct instr *i;
1405 int off;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001406
Pablo Galindo18c5f9d2019-07-15 10:15:01 +01001407 if (c->c_do_not_emit_bytecode) {
1408 return 1;
1409 }
1410
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001411 assert(HAS_ARG(opcode));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001412 assert(b != NULL);
Andy Lester76d58772020-03-10 21:18:12 -05001413 off = compiler_next_instr(c->u->u_curblock);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001414 if (off < 0)
1415 return 0;
1416 i = &c->u->u_curblock->b_instr[off];
1417 i->i_opcode = opcode;
1418 i->i_target = b;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001419 if (absolute)
1420 i->i_jabs = 1;
1421 else
1422 i->i_jrel = 1;
Serhiy Storchaka61cb3d02020-03-17 18:07:30 +02001423 i->i_lineno = c->u->u_lineno;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001424 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001425}
1426
Victor Stinnerfc6f2ef2016-02-27 02:19:22 +01001427/* NEXT_BLOCK() creates an implicit jump from the current block
1428 to the new block.
1429
1430 The returns inside this macro make it impossible to decref objects
1431 created in the local function. Local objects should use the arena.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001432*/
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001433#define NEXT_BLOCK(C) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001434 if (compiler_next_block((C)) == NULL) \
1435 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001436}
1437
1438#define ADDOP(C, OP) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001439 if (!compiler_addop((C), (OP))) \
1440 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001441}
1442
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001443#define ADDOP_IN_SCOPE(C, OP) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001444 if (!compiler_addop((C), (OP))) { \
1445 compiler_exit_scope(c); \
1446 return 0; \
1447 } \
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001448}
1449
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001450#define ADDOP_LOAD_CONST(C, O) { \
1451 if (!compiler_addop_load_const((C), (O))) \
1452 return 0; \
1453}
1454
1455/* Same as ADDOP_LOAD_CONST, but steals a reference. */
1456#define ADDOP_LOAD_CONST_NEW(C, O) { \
1457 PyObject *__new_const = (O); \
1458 if (__new_const == NULL) { \
1459 return 0; \
1460 } \
1461 if (!compiler_addop_load_const((C), __new_const)) { \
1462 Py_DECREF(__new_const); \
1463 return 0; \
1464 } \
1465 Py_DECREF(__new_const); \
1466}
1467
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001468#define ADDOP_O(C, OP, O, TYPE) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001469 if (!compiler_addop_o((C), (OP), (C)->u->u_ ## TYPE, (O))) \
1470 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001471}
1472
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03001473/* Same as ADDOP_O, but steals a reference. */
1474#define ADDOP_N(C, OP, O, TYPE) { \
1475 if (!compiler_addop_o((C), (OP), (C)->u->u_ ## TYPE, (O))) { \
1476 Py_DECREF((O)); \
1477 return 0; \
1478 } \
1479 Py_DECREF((O)); \
1480}
1481
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001482#define ADDOP_NAME(C, OP, O, TYPE) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001483 if (!compiler_addop_name((C), (OP), (C)->u->u_ ## TYPE, (O))) \
1484 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001485}
1486
1487#define ADDOP_I(C, OP, O) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001488 if (!compiler_addop_i((C), (OP), (O))) \
1489 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001490}
1491
1492#define ADDOP_JABS(C, OP, O) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001493 if (!compiler_addop_j((C), (OP), (O), 1)) \
1494 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001495}
1496
1497#define ADDOP_JREL(C, OP, O) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001498 if (!compiler_addop_j((C), (OP), (O), 0)) \
1499 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001500}
1501
Mark Shannon9af0e472020-01-14 10:12:45 +00001502
1503#define ADDOP_COMPARE(C, CMP) { \
1504 if (!compiler_addcompare((C), (cmpop_ty)(CMP))) \
1505 return 0; \
1506}
1507
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001508/* VISIT and VISIT_SEQ takes an ASDL type as their second argument. They use
1509 the ASDL name to synthesize the name of the C type and the visit function.
1510*/
1511
1512#define VISIT(C, TYPE, V) {\
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001513 if (!compiler_visit_ ## TYPE((C), (V))) \
1514 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001515}
1516
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001517#define VISIT_IN_SCOPE(C, TYPE, V) {\
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001518 if (!compiler_visit_ ## TYPE((C), (V))) { \
1519 compiler_exit_scope(c); \
1520 return 0; \
1521 } \
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001522}
1523
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001524#define VISIT_SLICE(C, V, CTX) {\
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001525 if (!compiler_visit_slice((C), (V), (CTX))) \
1526 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001527}
1528
1529#define VISIT_SEQ(C, TYPE, SEQ) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001530 int _i; \
1531 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
1532 for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \
1533 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \
1534 if (!compiler_visit_ ## TYPE((C), elt)) \
1535 return 0; \
1536 } \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001537}
1538
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001539#define VISIT_SEQ_IN_SCOPE(C, TYPE, SEQ) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001540 int _i; \
1541 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
1542 for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \
1543 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \
1544 if (!compiler_visit_ ## TYPE((C), elt)) { \
1545 compiler_exit_scope(c); \
1546 return 0; \
1547 } \
1548 } \
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001549}
1550
Pablo Galindo18c5f9d2019-07-15 10:15:01 +01001551/* These macros allows to check only for errors and not emmit bytecode
1552 * while visiting nodes.
1553*/
1554
1555#define BEGIN_DO_NOT_EMIT_BYTECODE { \
1556 c->c_do_not_emit_bytecode++;
1557
1558#define END_DO_NOT_EMIT_BYTECODE \
1559 c->c_do_not_emit_bytecode--; \
1560}
1561
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001562/* Search if variable annotations are present statically in a block. */
1563
1564static int
1565find_ann(asdl_seq *stmts)
1566{
1567 int i, j, res = 0;
1568 stmt_ty st;
1569
1570 for (i = 0; i < asdl_seq_LEN(stmts); i++) {
1571 st = (stmt_ty)asdl_seq_GET(stmts, i);
1572 switch (st->kind) {
1573 case AnnAssign_kind:
1574 return 1;
1575 case For_kind:
1576 res = find_ann(st->v.For.body) ||
1577 find_ann(st->v.For.orelse);
1578 break;
1579 case AsyncFor_kind:
1580 res = find_ann(st->v.AsyncFor.body) ||
1581 find_ann(st->v.AsyncFor.orelse);
1582 break;
1583 case While_kind:
1584 res = find_ann(st->v.While.body) ||
1585 find_ann(st->v.While.orelse);
1586 break;
1587 case If_kind:
1588 res = find_ann(st->v.If.body) ||
1589 find_ann(st->v.If.orelse);
1590 break;
1591 case With_kind:
1592 res = find_ann(st->v.With.body);
1593 break;
1594 case AsyncWith_kind:
1595 res = find_ann(st->v.AsyncWith.body);
1596 break;
1597 case Try_kind:
1598 for (j = 0; j < asdl_seq_LEN(st->v.Try.handlers); j++) {
1599 excepthandler_ty handler = (excepthandler_ty)asdl_seq_GET(
1600 st->v.Try.handlers, j);
1601 if (find_ann(handler->v.ExceptHandler.body)) {
1602 return 1;
1603 }
1604 }
1605 res = find_ann(st->v.Try.body) ||
1606 find_ann(st->v.Try.finalbody) ||
1607 find_ann(st->v.Try.orelse);
1608 break;
1609 default:
1610 res = 0;
1611 }
1612 if (res) {
1613 break;
1614 }
1615 }
1616 return res;
1617}
1618
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001619/*
1620 * Frame block handling functions
1621 */
1622
1623static int
1624compiler_push_fblock(struct compiler *c, enum fblocktype t, basicblock *b,
Mark Shannonfee55262019-11-21 09:11:43 +00001625 basicblock *exit, void *datum)
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001626{
1627 struct fblockinfo *f;
1628 if (c->u->u_nfblocks >= CO_MAXBLOCKS) {
1629 PyErr_SetString(PyExc_SyntaxError,
1630 "too many statically nested blocks");
1631 return 0;
1632 }
1633 f = &c->u->u_fblock[c->u->u_nfblocks++];
1634 f->fb_type = t;
1635 f->fb_block = b;
1636 f->fb_exit = exit;
Mark Shannonfee55262019-11-21 09:11:43 +00001637 f->fb_datum = datum;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001638 return 1;
1639}
1640
1641static void
1642compiler_pop_fblock(struct compiler *c, enum fblocktype t, basicblock *b)
1643{
1644 struct compiler_unit *u = c->u;
1645 assert(u->u_nfblocks > 0);
1646 u->u_nfblocks--;
1647 assert(u->u_fblock[u->u_nfblocks].fb_type == t);
1648 assert(u->u_fblock[u->u_nfblocks].fb_block == b);
1649}
1650
Mark Shannonfee55262019-11-21 09:11:43 +00001651static int
1652compiler_call_exit_with_nones(struct compiler *c) {
1653 ADDOP_O(c, LOAD_CONST, Py_None, consts);
1654 ADDOP(c, DUP_TOP);
1655 ADDOP(c, DUP_TOP);
1656 ADDOP_I(c, CALL_FUNCTION, 3);
1657 return 1;
1658}
1659
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001660/* Unwind a frame block. If preserve_tos is true, the TOS before
Mark Shannonfee55262019-11-21 09:11:43 +00001661 * popping the blocks will be restored afterwards, unless another
1662 * return, break or continue is found. In which case, the TOS will
1663 * be popped.
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001664 */
1665static int
1666compiler_unwind_fblock(struct compiler *c, struct fblockinfo *info,
1667 int preserve_tos)
1668{
1669 switch (info->fb_type) {
1670 case WHILE_LOOP:
1671 return 1;
1672
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001673 case FOR_LOOP:
1674 /* Pop the iterator */
1675 if (preserve_tos) {
1676 ADDOP(c, ROT_TWO);
1677 }
1678 ADDOP(c, POP_TOP);
1679 return 1;
1680
1681 case EXCEPT:
1682 ADDOP(c, POP_BLOCK);
1683 return 1;
1684
1685 case FINALLY_TRY:
1686 ADDOP(c, POP_BLOCK);
Serhiy Storchakaef61c522019-08-24 13:11:52 +03001687 if (preserve_tos) {
Mark Shannonfee55262019-11-21 09:11:43 +00001688 if (!compiler_push_fblock(c, POP_VALUE, NULL, NULL, NULL)) {
1689 return 0;
1690 }
Serhiy Storchakaef61c522019-08-24 13:11:52 +03001691 }
Mark Shannon88dce262019-12-30 09:53:36 +00001692 /* Emit the finally block, restoring the line number when done */
1693 int saved_lineno = c->u->u_lineno;
Mark Shannonfee55262019-11-21 09:11:43 +00001694 VISIT_SEQ(c, stmt, info->fb_datum);
Mark Shannon88dce262019-12-30 09:53:36 +00001695 c->u->u_lineno = saved_lineno;
Mark Shannonfee55262019-11-21 09:11:43 +00001696 if (preserve_tos) {
1697 compiler_pop_fblock(c, POP_VALUE, NULL);
Serhiy Storchakaef61c522019-08-24 13:11:52 +03001698 }
1699 return 1;
Mark Shannon13bc1392020-01-23 09:25:17 +00001700
Mark Shannonfee55262019-11-21 09:11:43 +00001701 case FINALLY_END:
1702 if (preserve_tos) {
1703 ADDOP(c, ROT_FOUR);
1704 }
1705 ADDOP(c, POP_TOP);
1706 ADDOP(c, POP_TOP);
1707 ADDOP(c, POP_TOP);
1708 if (preserve_tos) {
1709 ADDOP(c, ROT_FOUR);
1710 }
1711 ADDOP(c, POP_EXCEPT);
1712 return 1;
Serhiy Storchakaef61c522019-08-24 13:11:52 +03001713
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001714 case WITH:
1715 case ASYNC_WITH:
1716 ADDOP(c, POP_BLOCK);
1717 if (preserve_tos) {
1718 ADDOP(c, ROT_TWO);
1719 }
Mark Shannonfee55262019-11-21 09:11:43 +00001720 if(!compiler_call_exit_with_nones(c)) {
1721 return 0;
1722 }
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001723 if (info->fb_type == ASYNC_WITH) {
1724 ADDOP(c, GET_AWAITABLE);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001725 ADDOP_LOAD_CONST(c, Py_None);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001726 ADDOP(c, YIELD_FROM);
1727 }
Mark Shannonfee55262019-11-21 09:11:43 +00001728 ADDOP(c, POP_TOP);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001729 return 1;
1730
1731 case HANDLER_CLEANUP:
Mark Shannonfee55262019-11-21 09:11:43 +00001732 if (info->fb_datum) {
1733 ADDOP(c, POP_BLOCK);
1734 }
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001735 if (preserve_tos) {
1736 ADDOP(c, ROT_FOUR);
1737 }
Mark Shannonfee55262019-11-21 09:11:43 +00001738 ADDOP(c, POP_EXCEPT);
1739 if (info->fb_datum) {
1740 ADDOP_LOAD_CONST(c, Py_None);
1741 compiler_nameop(c, info->fb_datum, Store);
1742 compiler_nameop(c, info->fb_datum, Del);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001743 }
Mark Shannonfee55262019-11-21 09:11:43 +00001744 return 1;
1745
1746 case POP_VALUE:
1747 if (preserve_tos) {
1748 ADDOP(c, ROT_TWO);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001749 }
Mark Shannonfee55262019-11-21 09:11:43 +00001750 ADDOP(c, POP_TOP);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001751 return 1;
1752 }
1753 Py_UNREACHABLE();
1754}
1755
Mark Shannonfee55262019-11-21 09:11:43 +00001756/** Unwind block stack. If loop is not NULL, then stop when the first loop is encountered. */
1757static int
1758compiler_unwind_fblock_stack(struct compiler *c, int preserve_tos, struct fblockinfo **loop) {
1759 if (c->u->u_nfblocks == 0) {
1760 return 1;
1761 }
1762 struct fblockinfo *top = &c->u->u_fblock[c->u->u_nfblocks-1];
1763 if (loop != NULL && (top->fb_type == WHILE_LOOP || top->fb_type == FOR_LOOP)) {
1764 *loop = top;
1765 return 1;
1766 }
1767 struct fblockinfo copy = *top;
1768 c->u->u_nfblocks--;
1769 if (!compiler_unwind_fblock(c, &copy, preserve_tos)) {
1770 return 0;
1771 }
1772 if (!compiler_unwind_fblock_stack(c, preserve_tos, loop)) {
1773 return 0;
1774 }
1775 c->u->u_fblock[c->u->u_nfblocks] = copy;
1776 c->u->u_nfblocks++;
1777 return 1;
1778}
1779
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001780/* Compile a sequence of statements, checking for a docstring
1781 and for annotations. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001782
1783static int
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001784compiler_body(struct compiler *c, asdl_seq *stmts)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001785{
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001786 int i = 0;
1787 stmt_ty st;
Serhiy Storchaka143ce5c2018-05-30 10:56:16 +03001788 PyObject *docstring;
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001789
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001790 /* Set current line number to the line number of first statement.
1791 This way line number for SETUP_ANNOTATIONS will always
1792 coincide with the line number of first "real" statement in module.
Hansraj Das01171eb2019-10-09 07:54:02 +05301793 If body is empty, then lineno will be set later in assemble. */
Serhiy Storchaka61cb3d02020-03-17 18:07:30 +02001794 if (c->u->u_scope_type == COMPILER_SCOPE_MODULE && asdl_seq_LEN(stmts)) {
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001795 st = (stmt_ty)asdl_seq_GET(stmts, 0);
Serhiy Storchaka61cb3d02020-03-17 18:07:30 +02001796 SET_LOC(c, st);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001797 }
1798 /* Every annotated class and module should have __annotations__. */
1799 if (find_ann(stmts)) {
1800 ADDOP(c, SETUP_ANNOTATIONS);
1801 }
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001802 if (!asdl_seq_LEN(stmts))
1803 return 1;
INADA Naokicb41b272017-02-23 00:31:59 +09001804 /* if not -OO mode, set docstring */
Serhiy Storchaka143ce5c2018-05-30 10:56:16 +03001805 if (c->c_optimize < 2) {
1806 docstring = _PyAST_GetDocString(stmts);
1807 if (docstring) {
1808 i = 1;
1809 st = (stmt_ty)asdl_seq_GET(stmts, 0);
1810 assert(st->kind == Expr_kind);
1811 VISIT(c, expr, st->v.Expr.value);
1812 if (!compiler_nameop(c, __doc__, Store))
1813 return 0;
1814 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001815 }
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001816 for (; i < asdl_seq_LEN(stmts); i++)
1817 VISIT(c, stmt, (stmt_ty)asdl_seq_GET(stmts, i));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001818 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001819}
1820
1821static PyCodeObject *
1822compiler_mod(struct compiler *c, mod_ty mod)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001823{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001824 PyCodeObject *co;
1825 int addNone = 1;
1826 static PyObject *module;
1827 if (!module) {
1828 module = PyUnicode_InternFromString("<module>");
1829 if (!module)
1830 return NULL;
1831 }
1832 /* Use 0 for firstlineno initially, will fixup in assemble(). */
Antoine Pitrou86a36b52011-11-25 18:56:07 +01001833 if (!compiler_enter_scope(c, module, COMPILER_SCOPE_MODULE, mod, 0))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001834 return NULL;
1835 switch (mod->kind) {
1836 case Module_kind:
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001837 if (!compiler_body(c, mod->v.Module.body)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001838 compiler_exit_scope(c);
1839 return 0;
1840 }
1841 break;
1842 case Interactive_kind:
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001843 if (find_ann(mod->v.Interactive.body)) {
1844 ADDOP(c, SETUP_ANNOTATIONS);
1845 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001846 c->c_interactive = 1;
1847 VISIT_SEQ_IN_SCOPE(c, stmt,
1848 mod->v.Interactive.body);
1849 break;
1850 case Expression_kind:
1851 VISIT_IN_SCOPE(c, expr, mod->v.Expression.body);
1852 addNone = 0;
1853 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001854 default:
1855 PyErr_Format(PyExc_SystemError,
1856 "module kind %d should not be possible",
1857 mod->kind);
1858 return 0;
1859 }
1860 co = assemble(c, addNone);
1861 compiler_exit_scope(c);
1862 return co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001863}
1864
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001865/* The test for LOCAL must come before the test for FREE in order to
1866 handle classes where name is both local and free. The local var is
1867 a method and the free var is a free var referenced within a method.
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001868*/
1869
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001870static int
1871get_ref_type(struct compiler *c, PyObject *name)
1872{
Victor Stinner0b1bc562013-05-16 22:17:17 +02001873 int scope;
Benjamin Peterson312595c2013-05-15 15:26:42 -05001874 if (c->u->u_scope_type == COMPILER_SCOPE_CLASS &&
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02001875 _PyUnicode_EqualToASCIIString(name, "__class__"))
Benjamin Peterson312595c2013-05-15 15:26:42 -05001876 return CELL;
Victor Stinner0b1bc562013-05-16 22:17:17 +02001877 scope = PyST_GetScope(c->u->u_ste, name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001878 if (scope == 0) {
Victor Stinner87d3b9d2020-03-25 19:27:36 +01001879 _Py_FatalErrorFormat(__func__,
1880 "unknown scope for %.100s in %.100s(%s)\n"
1881 "symbols: %s\nlocals: %s\nglobals: %s",
1882 PyUnicode_AsUTF8(name),
1883 PyUnicode_AsUTF8(c->u->u_name),
1884 PyUnicode_AsUTF8(PyObject_Repr(c->u->u_ste->ste_id)),
1885 PyUnicode_AsUTF8(PyObject_Repr(c->u->u_ste->ste_symbols)),
1886 PyUnicode_AsUTF8(PyObject_Repr(c->u->u_varnames)),
1887 PyUnicode_AsUTF8(PyObject_Repr(c->u->u_names)));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001888 }
Tim Peters2a7f3842001-06-09 09:26:21 +00001889
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001890 return scope;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001891}
1892
1893static int
1894compiler_lookup_arg(PyObject *dict, PyObject *name)
1895{
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001896 PyObject *v;
1897 v = PyDict_GetItem(dict, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001898 if (v == NULL)
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00001899 return -1;
Christian Heimes217cfd12007-12-02 14:31:20 +00001900 return PyLong_AS_LONG(v);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001901}
1902
1903static int
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001904compiler_make_closure(struct compiler *c, PyCodeObject *co, Py_ssize_t flags, PyObject *qualname)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001905{
Victor Stinnerad9a0662013-11-19 22:23:20 +01001906 Py_ssize_t i, free = PyCode_GetNumFree(co);
Antoine Pitrou86a36b52011-11-25 18:56:07 +01001907 if (qualname == NULL)
1908 qualname = co->co_name;
1909
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001910 if (free) {
1911 for (i = 0; i < free; ++i) {
1912 /* Bypass com_addop_varname because it will generate
1913 LOAD_DEREF but LOAD_CLOSURE is needed.
1914 */
1915 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
1916 int arg, reftype;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001917
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001918 /* Special case: If a class contains a method with a
1919 free variable that has the same name as a method,
1920 the name will be considered free *and* local in the
1921 class. It should be handled by the closure, as
Min ho Kimc4cacc82019-07-31 08:16:13 +10001922 well as by the normal name lookup logic.
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001923 */
1924 reftype = get_ref_type(c, name);
1925 if (reftype == CELL)
1926 arg = compiler_lookup_arg(c->u->u_cellvars, name);
1927 else /* (reftype == FREE) */
1928 arg = compiler_lookup_arg(c->u->u_freevars, name);
1929 if (arg == -1) {
Victor Stinner87d3b9d2020-03-25 19:27:36 +01001930 _Py_FatalErrorFormat(__func__,
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001931 "lookup %s in %s %d %d\n"
1932 "freevars of %s: %s\n",
1933 PyUnicode_AsUTF8(PyObject_Repr(name)),
1934 PyUnicode_AsUTF8(c->u->u_name),
1935 reftype, arg,
1936 PyUnicode_AsUTF8(co->co_name),
1937 PyUnicode_AsUTF8(PyObject_Repr(co->co_freevars)));
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001938 }
1939 ADDOP_I(c, LOAD_CLOSURE, arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001940 }
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001941 flags |= 0x08;
1942 ADDOP_I(c, BUILD_TUPLE, free);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001943 }
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001944 ADDOP_LOAD_CONST(c, (PyObject*)co);
1945 ADDOP_LOAD_CONST(c, qualname);
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001946 ADDOP_I(c, MAKE_FUNCTION, flags);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001947 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001948}
1949
1950static int
1951compiler_decorators(struct compiler *c, asdl_seq* decos)
1952{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001953 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001954
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001955 if (!decos)
1956 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001957
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001958 for (i = 0; i < asdl_seq_LEN(decos); i++) {
1959 VISIT(c, expr, (expr_ty)asdl_seq_GET(decos, i));
1960 }
1961 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001962}
1963
1964static int
Guido van Rossum4f72a782006-10-27 23:31:49 +00001965compiler_visit_kwonlydefaults(struct compiler *c, asdl_seq *kwonlyargs,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001966 asdl_seq *kw_defaults)
Guido van Rossum4f72a782006-10-27 23:31:49 +00001967{
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03001968 /* Push a dict of keyword-only default values.
1969
1970 Return 0 on error, -1 if no dict pushed, 1 if a dict is pushed.
1971 */
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001972 int i;
1973 PyObject *keys = NULL;
1974
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001975 for (i = 0; i < asdl_seq_LEN(kwonlyargs); i++) {
1976 arg_ty arg = asdl_seq_GET(kwonlyargs, i);
1977 expr_ty default_ = asdl_seq_GET(kw_defaults, i);
1978 if (default_) {
Benjamin Peterson32c59b62012-04-17 19:53:21 -04001979 PyObject *mangled = _Py_Mangle(c->u->u_private, arg->arg);
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001980 if (!mangled) {
1981 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001982 }
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001983 if (keys == NULL) {
1984 keys = PyList_New(1);
1985 if (keys == NULL) {
1986 Py_DECREF(mangled);
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03001987 return 0;
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001988 }
1989 PyList_SET_ITEM(keys, 0, mangled);
1990 }
1991 else {
1992 int res = PyList_Append(keys, mangled);
1993 Py_DECREF(mangled);
1994 if (res == -1) {
1995 goto error;
1996 }
1997 }
1998 if (!compiler_visit_expr(c, default_)) {
1999 goto error;
2000 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002001 }
2002 }
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002003 if (keys != NULL) {
2004 Py_ssize_t default_count = PyList_GET_SIZE(keys);
2005 PyObject *keys_tuple = PyList_AsTuple(keys);
2006 Py_DECREF(keys);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03002007 ADDOP_LOAD_CONST_NEW(c, keys_tuple);
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002008 ADDOP_I(c, BUILD_CONST_KEY_MAP, default_count);
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03002009 assert(default_count > 0);
2010 return 1;
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002011 }
2012 else {
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03002013 return -1;
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002014 }
2015
2016error:
2017 Py_XDECREF(keys);
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03002018 return 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +00002019}
2020
2021static int
Guido van Rossum95e4d582018-01-26 08:20:18 -08002022compiler_visit_annexpr(struct compiler *c, expr_ty annotation)
2023{
Serhiy Storchaka64fddc42018-05-17 06:17:48 +03002024 ADDOP_LOAD_CONST_NEW(c, _PyAST_ExprAsUnicode(annotation));
Guido van Rossum95e4d582018-01-26 08:20:18 -08002025 return 1;
2026}
2027
2028static int
Neal Norwitzc1505362006-12-28 06:47:50 +00002029compiler_visit_argannotation(struct compiler *c, identifier id,
2030 expr_ty annotation, PyObject *names)
2031{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002032 if (annotation) {
Victor Stinner065efc32014-02-18 22:07:56 +01002033 PyObject *mangled;
Guido van Rossum95e4d582018-01-26 08:20:18 -08002034 if (c->c_future->ff_features & CO_FUTURE_ANNOTATIONS) {
2035 VISIT(c, annexpr, annotation)
2036 }
2037 else {
2038 VISIT(c, expr, annotation);
2039 }
Victor Stinner065efc32014-02-18 22:07:56 +01002040 mangled = _Py_Mangle(c->u->u_private, id);
Yury Selivanov34ce99f2014-02-18 12:49:41 -05002041 if (!mangled)
Yury Selivanovf315c1c2015-07-23 09:10:44 +03002042 return 0;
Yury Selivanov34ce99f2014-02-18 12:49:41 -05002043 if (PyList_Append(names, mangled) < 0) {
2044 Py_DECREF(mangled);
Yury Selivanovf315c1c2015-07-23 09:10:44 +03002045 return 0;
Yury Selivanov34ce99f2014-02-18 12:49:41 -05002046 }
2047 Py_DECREF(mangled);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002048 }
Yury Selivanovf315c1c2015-07-23 09:10:44 +03002049 return 1;
Neal Norwitzc1505362006-12-28 06:47:50 +00002050}
2051
2052static int
2053compiler_visit_argannotations(struct compiler *c, asdl_seq* args,
2054 PyObject *names)
2055{
Yury Selivanovf315c1c2015-07-23 09:10:44 +03002056 int i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002057 for (i = 0; i < asdl_seq_LEN(args); i++) {
2058 arg_ty arg = (arg_ty)asdl_seq_GET(args, i);
Yury Selivanovf315c1c2015-07-23 09:10:44 +03002059 if (!compiler_visit_argannotation(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002060 c,
2061 arg->arg,
2062 arg->annotation,
Yury Selivanovf315c1c2015-07-23 09:10:44 +03002063 names))
2064 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002065 }
Yury Selivanovf315c1c2015-07-23 09:10:44 +03002066 return 1;
Neal Norwitzc1505362006-12-28 06:47:50 +00002067}
2068
2069static int
2070compiler_visit_annotations(struct compiler *c, arguments_ty args,
2071 expr_ty returns)
2072{
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03002073 /* Push arg annotation dict.
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002074 The expressions are evaluated out-of-order wrt the source code.
Neal Norwitzc1505362006-12-28 06:47:50 +00002075
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03002076 Return 0 on error, -1 if no dict pushed, 1 if a dict is pushed.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002077 */
2078 static identifier return_str;
2079 PyObject *names;
Victor Stinnerad9a0662013-11-19 22:23:20 +01002080 Py_ssize_t len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002081 names = PyList_New(0);
2082 if (!names)
Serhiy Storchaka694de3b2016-06-15 20:06:07 +03002083 return 0;
Neal Norwitzc1505362006-12-28 06:47:50 +00002084
Yury Selivanovf315c1c2015-07-23 09:10:44 +03002085 if (!compiler_visit_argannotations(c, args->args, names))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002086 goto error;
Pablo Galindoa0c01bf2019-05-31 15:19:50 +01002087 if (!compiler_visit_argannotations(c, args->posonlyargs, names))
2088 goto error;
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,
Benjamin Petersoncda75be2013-03-18 10:48:58 -07002091 args->vararg->annotation, names))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002092 goto error;
Yury Selivanovf315c1c2015-07-23 09:10:44 +03002093 if (!compiler_visit_argannotations(c, args->kwonlyargs, names))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002094 goto error;
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,
Benjamin Petersoncda75be2013-03-18 10:48:58 -07002097 args->kwarg->annotation, names))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002098 goto error;
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)
2103 goto error;
2104 }
Yury Selivanovf315c1c2015-07-23 09:10:44 +03002105 if (!compiler_visit_argannotation(c, return_str, returns, names)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002106 goto error;
2107 }
2108
2109 len = PyList_GET_SIZE(names);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002110 if (len) {
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002111 PyObject *keytuple = PyList_AsTuple(names);
2112 Py_DECREF(names);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03002113 ADDOP_LOAD_CONST_NEW(c, keytuple);
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002114 ADDOP_I(c, BUILD_CONST_KEY_MAP, len);
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03002115 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002116 }
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002117 else {
2118 Py_DECREF(names);
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03002119 return -1;
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002120 }
Neal Norwitzc1505362006-12-28 06:47:50 +00002121
2122error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002123 Py_DECREF(names);
Serhiy Storchaka694de3b2016-06-15 20:06:07 +03002124 return 0;
Neal Norwitzc1505362006-12-28 06:47:50 +00002125}
2126
2127static int
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03002128compiler_visit_defaults(struct compiler *c, arguments_ty args)
2129{
2130 VISIT_SEQ(c, expr, args->defaults);
2131 ADDOP_I(c, BUILD_TUPLE, asdl_seq_LEN(args->defaults));
2132 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002133}
2134
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002135static Py_ssize_t
2136compiler_default_arguments(struct compiler *c, arguments_ty args)
2137{
2138 Py_ssize_t funcflags = 0;
2139 if (args->defaults && asdl_seq_LEN(args->defaults) > 0) {
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03002140 if (!compiler_visit_defaults(c, args))
2141 return -1;
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002142 funcflags |= 0x01;
2143 }
2144 if (args->kwonlyargs) {
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03002145 int res = compiler_visit_kwonlydefaults(c, args->kwonlyargs,
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002146 args->kw_defaults);
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03002147 if (res == 0) {
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002148 return -1;
2149 }
2150 else if (res > 0) {
2151 funcflags |= 0x02;
2152 }
2153 }
2154 return funcflags;
2155}
2156
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002157static int
Yury Selivanov75445082015-05-11 22:57:16 -04002158compiler_function(struct compiler *c, stmt_ty s, int is_async)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002159{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002160 PyCodeObject *co;
Serhiy Storchaka143ce5c2018-05-30 10:56:16 +03002161 PyObject *qualname, *docstring = NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04002162 arguments_ty args;
2163 expr_ty returns;
2164 identifier name;
2165 asdl_seq* decos;
2166 asdl_seq *body;
INADA Naokicb41b272017-02-23 00:31:59 +09002167 Py_ssize_t i, funcflags;
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03002168 int annotations;
Yury Selivanov75445082015-05-11 22:57:16 -04002169 int scope_type;
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +02002170 int firstlineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002171
Yury Selivanov75445082015-05-11 22:57:16 -04002172 if (is_async) {
2173 assert(s->kind == AsyncFunctionDef_kind);
2174
2175 args = s->v.AsyncFunctionDef.args;
2176 returns = s->v.AsyncFunctionDef.returns;
2177 decos = s->v.AsyncFunctionDef.decorator_list;
2178 name = s->v.AsyncFunctionDef.name;
2179 body = s->v.AsyncFunctionDef.body;
2180
2181 scope_type = COMPILER_SCOPE_ASYNC_FUNCTION;
2182 } else {
2183 assert(s->kind == FunctionDef_kind);
2184
2185 args = s->v.FunctionDef.args;
2186 returns = s->v.FunctionDef.returns;
2187 decos = s->v.FunctionDef.decorator_list;
2188 name = s->v.FunctionDef.name;
2189 body = s->v.FunctionDef.body;
2190
2191 scope_type = COMPILER_SCOPE_FUNCTION;
2192 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002193
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002194 if (!compiler_decorators(c, decos))
2195 return 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +00002196
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +02002197 firstlineno = s->lineno;
2198 if (asdl_seq_LEN(decos)) {
2199 firstlineno = ((expr_ty)asdl_seq_GET(decos, 0))->lineno;
2200 }
2201
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002202 funcflags = compiler_default_arguments(c, args);
2203 if (funcflags == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002204 return 0;
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002205 }
2206
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03002207 annotations = compiler_visit_annotations(c, args, returns);
2208 if (annotations == 0) {
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002209 return 0;
2210 }
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03002211 else if (annotations > 0) {
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002212 funcflags |= 0x04;
2213 }
2214
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +02002215 if (!compiler_enter_scope(c, name, scope_type, (void *)s, firstlineno)) {
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002216 return 0;
2217 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002218
INADA Naokicb41b272017-02-23 00:31:59 +09002219 /* if not -OO mode, add docstring */
Serhiy Storchaka143ce5c2018-05-30 10:56:16 +03002220 if (c->c_optimize < 2) {
2221 docstring = _PyAST_GetDocString(body);
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03002222 }
Serhiy Storchaka143ce5c2018-05-30 10:56:16 +03002223 if (compiler_add_const(c, docstring ? docstring : Py_None) < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002224 compiler_exit_scope(c);
2225 return 0;
2226 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002227
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002228 c->u->u_argcount = asdl_seq_LEN(args->args);
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01002229 c->u->u_posonlyargcount = asdl_seq_LEN(args->posonlyargs);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002230 c->u->u_kwonlyargcount = asdl_seq_LEN(args->kwonlyargs);
INADA Naokicb41b272017-02-23 00:31:59 +09002231 VISIT_SEQ_IN_SCOPE(c, stmt, body);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002232 co = assemble(c, 1);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04002233 qualname = c->u->u_qualname;
2234 Py_INCREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002235 compiler_exit_scope(c);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04002236 if (co == NULL) {
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002237 Py_XDECREF(qualname);
2238 Py_XDECREF(co);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002239 return 0;
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002240 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002241
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002242 compiler_make_closure(c, co, funcflags, qualname);
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002243 Py_DECREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002244 Py_DECREF(co);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002245
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002246 /* decorators */
2247 for (i = 0; i < asdl_seq_LEN(decos); i++) {
2248 ADDOP_I(c, CALL_FUNCTION, 1);
2249 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002250
Yury Selivanov75445082015-05-11 22:57:16 -04002251 return compiler_nameop(c, name, Store);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002252}
2253
2254static int
2255compiler_class(struct compiler *c, stmt_ty s)
2256{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002257 PyCodeObject *co;
2258 PyObject *str;
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +02002259 int i, firstlineno;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002260 asdl_seq* decos = s->v.ClassDef.decorator_list;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002261
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002262 if (!compiler_decorators(c, decos))
2263 return 0;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002264
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +02002265 firstlineno = s->lineno;
2266 if (asdl_seq_LEN(decos)) {
2267 firstlineno = ((expr_ty)asdl_seq_GET(decos, 0))->lineno;
2268 }
2269
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002270 /* ultimately generate code for:
2271 <name> = __build_class__(<func>, <name>, *<bases>, **<keywords>)
2272 where:
2273 <func> is a function/closure created from the class body;
2274 it has a single argument (__locals__) where the dict
2275 (or MutableSequence) representing the locals is passed
2276 <name> is the class name
2277 <bases> is the positional arguments and *varargs argument
2278 <keywords> is the keyword arguments and **kwds argument
2279 This borrows from compiler_call.
2280 */
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002281
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002282 /* 1. compile the class body into a code object */
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002283 if (!compiler_enter_scope(c, s->v.ClassDef.name,
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +02002284 COMPILER_SCOPE_CLASS, (void *)s, firstlineno))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002285 return 0;
2286 /* this block represents what we do in the new scope */
2287 {
2288 /* use the class name for name mangling */
2289 Py_INCREF(s->v.ClassDef.name);
Serhiy Storchaka48842712016-04-06 09:45:48 +03002290 Py_XSETREF(c->u->u_private, s->v.ClassDef.name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002291 /* load (global) __name__ ... */
2292 str = PyUnicode_InternFromString("__name__");
2293 if (!str || !compiler_nameop(c, str, Load)) {
2294 Py_XDECREF(str);
2295 compiler_exit_scope(c);
2296 return 0;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002297 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002298 Py_DECREF(str);
2299 /* ... and store it as __module__ */
2300 str = PyUnicode_InternFromString("__module__");
2301 if (!str || !compiler_nameop(c, str, Store)) {
2302 Py_XDECREF(str);
2303 compiler_exit_scope(c);
2304 return 0;
2305 }
2306 Py_DECREF(str);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04002307 assert(c->u->u_qualname);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03002308 ADDOP_LOAD_CONST(c, c->u->u_qualname);
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002309 str = PyUnicode_InternFromString("__qualname__");
2310 if (!str || !compiler_nameop(c, str, Store)) {
2311 Py_XDECREF(str);
2312 compiler_exit_scope(c);
2313 return 0;
2314 }
2315 Py_DECREF(str);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002316 /* compile the body proper */
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03002317 if (!compiler_body(c, s->v.ClassDef.body)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002318 compiler_exit_scope(c);
2319 return 0;
2320 }
Nick Coghlan19d24672016-12-05 16:47:55 +10002321 /* Return __classcell__ if it is referenced, otherwise return None */
Benjamin Peterson312595c2013-05-15 15:26:42 -05002322 if (c->u->u_ste->ste_needs_class_closure) {
Nick Coghlan19d24672016-12-05 16:47:55 +10002323 /* Store __classcell__ into class namespace & return it */
Benjamin Peterson312595c2013-05-15 15:26:42 -05002324 str = PyUnicode_InternFromString("__class__");
2325 if (str == NULL) {
2326 compiler_exit_scope(c);
2327 return 0;
2328 }
2329 i = compiler_lookup_arg(c->u->u_cellvars, str);
2330 Py_DECREF(str);
Victor Stinner98e818b2013-11-05 18:07:34 +01002331 if (i < 0) {
2332 compiler_exit_scope(c);
2333 return 0;
2334 }
Benjamin Peterson312595c2013-05-15 15:26:42 -05002335 assert(i == 0);
Nick Coghlan944368e2016-09-11 14:45:49 +10002336
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002337 ADDOP_I(c, LOAD_CLOSURE, i);
Nick Coghlan19d24672016-12-05 16:47:55 +10002338 ADDOP(c, DUP_TOP);
Nick Coghlan944368e2016-09-11 14:45:49 +10002339 str = PyUnicode_InternFromString("__classcell__");
2340 if (!str || !compiler_nameop(c, str, Store)) {
2341 Py_XDECREF(str);
2342 compiler_exit_scope(c);
2343 return 0;
2344 }
2345 Py_DECREF(str);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002346 }
Benjamin Peterson312595c2013-05-15 15:26:42 -05002347 else {
Nick Coghlan19d24672016-12-05 16:47:55 +10002348 /* No methods referenced __class__, so just return None */
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +02002349 assert(PyDict_GET_SIZE(c->u->u_cellvars) == 0);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03002350 ADDOP_LOAD_CONST(c, Py_None);
Benjamin Peterson312595c2013-05-15 15:26:42 -05002351 }
Nick Coghlan19d24672016-12-05 16:47:55 +10002352 ADDOP_IN_SCOPE(c, RETURN_VALUE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002353 /* create the code object */
2354 co = assemble(c, 1);
2355 }
2356 /* leave the new scope */
2357 compiler_exit_scope(c);
2358 if (co == NULL)
2359 return 0;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002360
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002361 /* 2. load the 'build_class' function */
2362 ADDOP(c, LOAD_BUILD_CLASS);
2363
2364 /* 3. load a function (or closure) made from the code object */
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002365 compiler_make_closure(c, co, 0, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002366 Py_DECREF(co);
2367
2368 /* 4. load class name */
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03002369 ADDOP_LOAD_CONST(c, s->v.ClassDef.name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002370
2371 /* 5. generate the rest of the code for the call */
2372 if (!compiler_call_helper(c, 2,
2373 s->v.ClassDef.bases,
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002374 s->v.ClassDef.keywords))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002375 return 0;
2376
2377 /* 6. apply decorators */
2378 for (i = 0; i < asdl_seq_LEN(decos); i++) {
2379 ADDOP_I(c, CALL_FUNCTION, 1);
2380 }
2381
2382 /* 7. store into <name> */
2383 if (!compiler_nameop(c, s->v.ClassDef.name, Store))
2384 return 0;
2385 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002386}
2387
Serhiy Storchaka3bcbedc2019-01-18 07:47:48 +02002388/* Return 0 if the expression is a constant value except named singletons.
2389 Return 1 otherwise. */
2390static int
2391check_is_arg(expr_ty e)
2392{
2393 if (e->kind != Constant_kind) {
2394 return 1;
2395 }
2396 PyObject *value = e->v.Constant.value;
2397 return (value == Py_None
2398 || value == Py_False
2399 || value == Py_True
2400 || value == Py_Ellipsis);
2401}
2402
2403/* Check operands of identity chacks ("is" and "is not").
2404 Emit a warning if any operand is a constant except named singletons.
2405 Return 0 on error.
2406 */
2407static int
2408check_compare(struct compiler *c, expr_ty e)
2409{
2410 Py_ssize_t i, n;
2411 int left = check_is_arg(e->v.Compare.left);
2412 n = asdl_seq_LEN(e->v.Compare.ops);
2413 for (i = 0; i < n; i++) {
2414 cmpop_ty op = (cmpop_ty)asdl_seq_GET(e->v.Compare.ops, i);
2415 int right = check_is_arg((expr_ty)asdl_seq_GET(e->v.Compare.comparators, i));
2416 if (op == Is || op == IsNot) {
2417 if (!right || !left) {
2418 const char *msg = (op == Is)
2419 ? "\"is\" with a literal. Did you mean \"==\"?"
2420 : "\"is not\" with a literal. Did you mean \"!=\"?";
2421 return compiler_warn(c, msg);
2422 }
2423 }
2424 left = right;
2425 }
2426 return 1;
2427}
2428
Mark Shannon9af0e472020-01-14 10:12:45 +00002429static int compiler_addcompare(struct compiler *c, cmpop_ty op)
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002430{
Mark Shannon9af0e472020-01-14 10:12:45 +00002431 int cmp;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002432 switch (op) {
2433 case Eq:
Mark Shannon9af0e472020-01-14 10:12:45 +00002434 cmp = Py_EQ;
2435 break;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002436 case NotEq:
Mark Shannon9af0e472020-01-14 10:12:45 +00002437 cmp = Py_NE;
2438 break;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002439 case Lt:
Mark Shannon9af0e472020-01-14 10:12:45 +00002440 cmp = Py_LT;
2441 break;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002442 case LtE:
Mark Shannon9af0e472020-01-14 10:12:45 +00002443 cmp = Py_LE;
2444 break;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002445 case Gt:
Mark Shannon9af0e472020-01-14 10:12:45 +00002446 cmp = Py_GT;
2447 break;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002448 case GtE:
Mark Shannon9af0e472020-01-14 10:12:45 +00002449 cmp = Py_GE;
2450 break;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002451 case Is:
Mark Shannon9af0e472020-01-14 10:12:45 +00002452 ADDOP_I(c, IS_OP, 0);
2453 return 1;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002454 case IsNot:
Mark Shannon9af0e472020-01-14 10:12:45 +00002455 ADDOP_I(c, IS_OP, 1);
2456 return 1;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002457 case In:
Mark Shannon9af0e472020-01-14 10:12:45 +00002458 ADDOP_I(c, CONTAINS_OP, 0);
2459 return 1;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002460 case NotIn:
Mark Shannon9af0e472020-01-14 10:12:45 +00002461 ADDOP_I(c, CONTAINS_OP, 1);
2462 return 1;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002463 default:
Mark Shannon9af0e472020-01-14 10:12:45 +00002464 Py_UNREACHABLE();
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002465 }
Mark Shannon9af0e472020-01-14 10:12:45 +00002466 ADDOP_I(c, COMPARE_OP, cmp);
2467 return 1;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002468}
2469
Mark Shannon9af0e472020-01-14 10:12:45 +00002470
2471
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002472static int
2473compiler_jump_if(struct compiler *c, expr_ty e, basicblock *next, int cond)
2474{
2475 switch (e->kind) {
2476 case UnaryOp_kind:
2477 if (e->v.UnaryOp.op == Not)
2478 return compiler_jump_if(c, e->v.UnaryOp.operand, next, !cond);
2479 /* fallback to general implementation */
2480 break;
2481 case BoolOp_kind: {
2482 asdl_seq *s = e->v.BoolOp.values;
2483 Py_ssize_t i, n = asdl_seq_LEN(s) - 1;
2484 assert(n >= 0);
2485 int cond2 = e->v.BoolOp.op == Or;
2486 basicblock *next2 = next;
2487 if (!cond2 != !cond) {
2488 next2 = compiler_new_block(c);
2489 if (next2 == NULL)
2490 return 0;
2491 }
2492 for (i = 0; i < n; ++i) {
2493 if (!compiler_jump_if(c, (expr_ty)asdl_seq_GET(s, i), next2, cond2))
2494 return 0;
2495 }
2496 if (!compiler_jump_if(c, (expr_ty)asdl_seq_GET(s, n), next, cond))
2497 return 0;
2498 if (next2 != next)
2499 compiler_use_next_block(c, next2);
2500 return 1;
2501 }
2502 case IfExp_kind: {
2503 basicblock *end, *next2;
2504 end = compiler_new_block(c);
2505 if (end == NULL)
2506 return 0;
2507 next2 = compiler_new_block(c);
2508 if (next2 == NULL)
2509 return 0;
2510 if (!compiler_jump_if(c, e->v.IfExp.test, next2, 0))
2511 return 0;
2512 if (!compiler_jump_if(c, e->v.IfExp.body, next, cond))
2513 return 0;
2514 ADDOP_JREL(c, JUMP_FORWARD, end);
2515 compiler_use_next_block(c, next2);
2516 if (!compiler_jump_if(c, e->v.IfExp.orelse, next, cond))
2517 return 0;
2518 compiler_use_next_block(c, end);
2519 return 1;
2520 }
2521 case Compare_kind: {
2522 Py_ssize_t i, n = asdl_seq_LEN(e->v.Compare.ops) - 1;
2523 if (n > 0) {
Serhiy Storchaka45835252019-02-16 08:29:46 +02002524 if (!check_compare(c, e)) {
2525 return 0;
2526 }
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002527 basicblock *cleanup = compiler_new_block(c);
2528 if (cleanup == NULL)
2529 return 0;
2530 VISIT(c, expr, e->v.Compare.left);
2531 for (i = 0; i < n; i++) {
2532 VISIT(c, expr,
2533 (expr_ty)asdl_seq_GET(e->v.Compare.comparators, i));
2534 ADDOP(c, DUP_TOP);
2535 ADDOP(c, ROT_THREE);
Mark Shannon9af0e472020-01-14 10:12:45 +00002536 ADDOP_COMPARE(c, asdl_seq_GET(e->v.Compare.ops, i));
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002537 ADDOP_JABS(c, POP_JUMP_IF_FALSE, cleanup);
2538 NEXT_BLOCK(c);
2539 }
2540 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, n));
Mark Shannon9af0e472020-01-14 10:12:45 +00002541 ADDOP_COMPARE(c, asdl_seq_GET(e->v.Compare.ops, n));
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002542 ADDOP_JABS(c, cond ? POP_JUMP_IF_TRUE : POP_JUMP_IF_FALSE, next);
2543 basicblock *end = compiler_new_block(c);
2544 if (end == NULL)
2545 return 0;
2546 ADDOP_JREL(c, JUMP_FORWARD, end);
2547 compiler_use_next_block(c, cleanup);
2548 ADDOP(c, POP_TOP);
2549 if (!cond) {
2550 ADDOP_JREL(c, JUMP_FORWARD, next);
2551 }
2552 compiler_use_next_block(c, end);
2553 return 1;
2554 }
2555 /* fallback to general implementation */
2556 break;
2557 }
2558 default:
2559 /* fallback to general implementation */
2560 break;
2561 }
2562
2563 /* general implementation */
2564 VISIT(c, expr, e);
2565 ADDOP_JABS(c, cond ? POP_JUMP_IF_TRUE : POP_JUMP_IF_FALSE, next);
2566 return 1;
2567}
2568
2569static int
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002570compiler_ifexp(struct compiler *c, expr_ty e)
2571{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002572 basicblock *end, *next;
2573
2574 assert(e->kind == IfExp_kind);
2575 end = compiler_new_block(c);
2576 if (end == NULL)
2577 return 0;
2578 next = compiler_new_block(c);
2579 if (next == NULL)
2580 return 0;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002581 if (!compiler_jump_if(c, e->v.IfExp.test, next, 0))
2582 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002583 VISIT(c, expr, e->v.IfExp.body);
2584 ADDOP_JREL(c, JUMP_FORWARD, end);
2585 compiler_use_next_block(c, next);
2586 VISIT(c, expr, e->v.IfExp.orelse);
2587 compiler_use_next_block(c, end);
2588 return 1;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002589}
2590
2591static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002592compiler_lambda(struct compiler *c, expr_ty e)
2593{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002594 PyCodeObject *co;
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002595 PyObject *qualname;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002596 static identifier name;
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002597 Py_ssize_t funcflags;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002598 arguments_ty args = e->v.Lambda.args;
2599 assert(e->kind == Lambda_kind);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002600
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002601 if (!name) {
2602 name = PyUnicode_InternFromString("<lambda>");
2603 if (!name)
2604 return 0;
2605 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002606
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002607 funcflags = compiler_default_arguments(c, args);
2608 if (funcflags == -1) {
2609 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002610 }
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002611
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04002612 if (!compiler_enter_scope(c, name, COMPILER_SCOPE_LAMBDA,
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002613 (void *)e, e->lineno))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002614 return 0;
Neal Norwitz4737b232005-11-19 23:58:29 +00002615
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002616 /* Make None the first constant, so the lambda can't have a
2617 docstring. */
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03002618 if (compiler_add_const(c, Py_None) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002619 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002620
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002621 c->u->u_argcount = asdl_seq_LEN(args->args);
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01002622 c->u->u_posonlyargcount = asdl_seq_LEN(args->posonlyargs);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002623 c->u->u_kwonlyargcount = asdl_seq_LEN(args->kwonlyargs);
2624 VISIT_IN_SCOPE(c, expr, e->v.Lambda.body);
2625 if (c->u->u_ste->ste_generator) {
Serhiy Storchakac775ad62015-03-11 18:20:35 +02002626 co = assemble(c, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002627 }
2628 else {
2629 ADDOP_IN_SCOPE(c, RETURN_VALUE);
Serhiy Storchakac775ad62015-03-11 18:20:35 +02002630 co = assemble(c, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002631 }
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04002632 qualname = c->u->u_qualname;
2633 Py_INCREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002634 compiler_exit_scope(c);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04002635 if (co == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002636 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002637
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002638 compiler_make_closure(c, co, funcflags, qualname);
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002639 Py_DECREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002640 Py_DECREF(co);
2641
2642 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002643}
2644
2645static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002646compiler_if(struct compiler *c, stmt_ty s)
2647{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002648 basicblock *end, *next;
2649 int constant;
2650 assert(s->kind == If_kind);
2651 end = compiler_new_block(c);
2652 if (end == NULL)
2653 return 0;
2654
Serhiy Storchaka3dfbaf52017-12-25 12:47:50 +02002655 constant = expr_constant(s->v.If.test);
Pablo Galindo18c5f9d2019-07-15 10:15:01 +01002656 /* constant = 0: "if 0"
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002657 * constant = 1: "if 1", "if 2", ...
2658 * constant = -1: rest */
Pablo Galindo18c5f9d2019-07-15 10:15:01 +01002659 if (constant == 0) {
2660 BEGIN_DO_NOT_EMIT_BYTECODE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002661 VISIT_SEQ(c, stmt, s->v.If.body);
Pablo Galindo18c5f9d2019-07-15 10:15:01 +01002662 END_DO_NOT_EMIT_BYTECODE
2663 if (s->v.If.orelse) {
2664 VISIT_SEQ(c, stmt, s->v.If.orelse);
2665 }
2666 } else if (constant == 1) {
2667 VISIT_SEQ(c, stmt, s->v.If.body);
2668 if (s->v.If.orelse) {
2669 BEGIN_DO_NOT_EMIT_BYTECODE
2670 VISIT_SEQ(c, stmt, s->v.If.orelse);
2671 END_DO_NOT_EMIT_BYTECODE
2672 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002673 } else {
Antoine Pitroue7811fc2014-09-18 03:06:50 +02002674 if (asdl_seq_LEN(s->v.If.orelse)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002675 next = compiler_new_block(c);
2676 if (next == NULL)
2677 return 0;
2678 }
Mark Shannonfee55262019-11-21 09:11:43 +00002679 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002680 next = end;
Mark Shannonfee55262019-11-21 09:11:43 +00002681 }
2682 if (!compiler_jump_if(c, s->v.If.test, next, 0)) {
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002683 return 0;
Mark Shannonfee55262019-11-21 09:11:43 +00002684 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002685 VISIT_SEQ(c, stmt, s->v.If.body);
Antoine Pitroue7811fc2014-09-18 03:06:50 +02002686 if (asdl_seq_LEN(s->v.If.orelse)) {
2687 ADDOP_JREL(c, JUMP_FORWARD, end);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002688 compiler_use_next_block(c, next);
2689 VISIT_SEQ(c, stmt, s->v.If.orelse);
2690 }
2691 }
2692 compiler_use_next_block(c, end);
2693 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002694}
2695
2696static int
2697compiler_for(struct compiler *c, stmt_ty s)
2698{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002699 basicblock *start, *cleanup, *end;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002700
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002701 start = compiler_new_block(c);
2702 cleanup = compiler_new_block(c);
2703 end = compiler_new_block(c);
Mark Shannonfee55262019-11-21 09:11:43 +00002704 if (start == NULL || end == NULL || cleanup == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002705 return 0;
Mark Shannonfee55262019-11-21 09:11:43 +00002706 }
2707 if (!compiler_push_fblock(c, FOR_LOOP, start, end, NULL)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002708 return 0;
Mark Shannonfee55262019-11-21 09:11:43 +00002709 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002710 VISIT(c, expr, s->v.For.iter);
2711 ADDOP(c, GET_ITER);
2712 compiler_use_next_block(c, start);
2713 ADDOP_JREL(c, FOR_ITER, cleanup);
2714 VISIT(c, expr, s->v.For.target);
2715 VISIT_SEQ(c, stmt, s->v.For.body);
2716 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
2717 compiler_use_next_block(c, cleanup);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002718
2719 compiler_pop_fblock(c, FOR_LOOP, start);
2720
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002721 VISIT_SEQ(c, stmt, s->v.For.orelse);
2722 compiler_use_next_block(c, end);
2723 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002724}
2725
Yury Selivanov75445082015-05-11 22:57:16 -04002726
2727static int
2728compiler_async_for(struct compiler *c, stmt_ty s)
2729{
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002730 basicblock *start, *except, *end;
Pablo Galindo90235812020-03-15 04:29:22 +00002731 if (IS_TOP_LEVEL_AWAIT(c)){
Matthias Bussonnier565b4f12019-05-21 13:12:03 -07002732 c->u->u_ste->ste_coroutine = 1;
2733 } else if (c->u->u_scope_type != COMPILER_SCOPE_ASYNC_FUNCTION) {
Zsolt Dollensteine2396502018-04-27 08:58:56 -07002734 return compiler_error(c, "'async for' outside async function");
2735 }
2736
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002737 start = compiler_new_block(c);
Yury Selivanov75445082015-05-11 22:57:16 -04002738 except = compiler_new_block(c);
2739 end = compiler_new_block(c);
Yury Selivanov75445082015-05-11 22:57:16 -04002740
Mark Shannonfee55262019-11-21 09:11:43 +00002741 if (start == NULL || except == NULL || end == NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04002742 return 0;
Mark Shannonfee55262019-11-21 09:11:43 +00002743 }
Yury Selivanov75445082015-05-11 22:57:16 -04002744 VISIT(c, expr, s->v.AsyncFor.iter);
2745 ADDOP(c, GET_AITER);
Yury Selivanov75445082015-05-11 22:57:16 -04002746
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002747 compiler_use_next_block(c, start);
Mark Shannonfee55262019-11-21 09:11:43 +00002748 if (!compiler_push_fblock(c, FOR_LOOP, start, end, NULL)) {
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002749 return 0;
Mark Shannonfee55262019-11-21 09:11:43 +00002750 }
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002751 /* SETUP_FINALLY to guard the __anext__ call */
2752 ADDOP_JREL(c, SETUP_FINALLY, except);
Yury Selivanov75445082015-05-11 22:57:16 -04002753 ADDOP(c, GET_ANEXT);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03002754 ADDOP_LOAD_CONST(c, Py_None);
Yury Selivanov75445082015-05-11 22:57:16 -04002755 ADDOP(c, YIELD_FROM);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002756 ADDOP(c, POP_BLOCK); /* for SETUP_FINALLY */
Yury Selivanov75445082015-05-11 22:57:16 -04002757
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002758 /* Success block for __anext__ */
2759 VISIT(c, expr, s->v.AsyncFor.target);
2760 VISIT_SEQ(c, stmt, s->v.AsyncFor.body);
2761 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
2762
2763 compiler_pop_fblock(c, FOR_LOOP, start);
Yury Selivanov75445082015-05-11 22:57:16 -04002764
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002765 /* Except block for __anext__ */
Yury Selivanov75445082015-05-11 22:57:16 -04002766 compiler_use_next_block(c, except);
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002767 ADDOP(c, END_ASYNC_FOR);
Yury Selivanov75445082015-05-11 22:57:16 -04002768
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002769 /* `else` block */
Yury Selivanov75445082015-05-11 22:57:16 -04002770 VISIT_SEQ(c, stmt, s->v.For.orelse);
2771
2772 compiler_use_next_block(c, end);
2773
2774 return 1;
2775}
2776
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002777static int
2778compiler_while(struct compiler *c, stmt_ty s)
2779{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002780 basicblock *loop, *orelse, *end, *anchor = NULL;
Serhiy Storchaka3dfbaf52017-12-25 12:47:50 +02002781 int constant = expr_constant(s->v.While.test);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002782
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002783 if (constant == 0) {
Pablo Galindo18c5f9d2019-07-15 10:15:01 +01002784 BEGIN_DO_NOT_EMIT_BYTECODE
Pablo Galindo6c3e66a2019-10-30 11:53:26 +00002785 // Push a dummy block so the VISIT_SEQ knows that we are
2786 // inside a while loop so it can correctly evaluate syntax
2787 // errors.
Mark Shannonfee55262019-11-21 09:11:43 +00002788 if (!compiler_push_fblock(c, WHILE_LOOP, NULL, NULL, NULL)) {
Pablo Galindo6c3e66a2019-10-30 11:53:26 +00002789 return 0;
2790 }
Pablo Galindo18c5f9d2019-07-15 10:15:01 +01002791 VISIT_SEQ(c, stmt, s->v.While.body);
Pablo Galindo6c3e66a2019-10-30 11:53:26 +00002792 // Remove the dummy block now that is not needed.
2793 compiler_pop_fblock(c, WHILE_LOOP, NULL);
Pablo Galindo18c5f9d2019-07-15 10:15:01 +01002794 END_DO_NOT_EMIT_BYTECODE
2795 if (s->v.While.orelse) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002796 VISIT_SEQ(c, stmt, s->v.While.orelse);
Pablo Galindo18c5f9d2019-07-15 10:15:01 +01002797 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002798 return 1;
2799 }
2800 loop = compiler_new_block(c);
2801 end = compiler_new_block(c);
2802 if (constant == -1) {
2803 anchor = compiler_new_block(c);
2804 if (anchor == NULL)
2805 return 0;
2806 }
2807 if (loop == NULL || end == NULL)
2808 return 0;
2809 if (s->v.While.orelse) {
2810 orelse = compiler_new_block(c);
2811 if (orelse == NULL)
2812 return 0;
2813 }
2814 else
2815 orelse = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002816
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002817 compiler_use_next_block(c, loop);
Mark Shannonfee55262019-11-21 09:11:43 +00002818 if (!compiler_push_fblock(c, WHILE_LOOP, loop, end, NULL))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002819 return 0;
2820 if (constant == -1) {
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002821 if (!compiler_jump_if(c, s->v.While.test, anchor, 0))
2822 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002823 }
2824 VISIT_SEQ(c, stmt, s->v.While.body);
2825 ADDOP_JABS(c, JUMP_ABSOLUTE, loop);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002826
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002827 /* XXX should the two POP instructions be in a separate block
2828 if there is no else clause ?
2829 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002830
Benjamin Peterson3cda0ed2014-12-13 16:06:19 -05002831 if (constant == -1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002832 compiler_use_next_block(c, anchor);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002833 compiler_pop_fblock(c, WHILE_LOOP, loop);
2834
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002835 if (orelse != NULL) /* what if orelse is just pass? */
2836 VISIT_SEQ(c, stmt, s->v.While.orelse);
2837 compiler_use_next_block(c, end);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002838
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002839 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002840}
2841
2842static int
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002843compiler_return(struct compiler *c, stmt_ty s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002844{
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002845 int preserve_tos = ((s->v.Return.value != NULL) &&
Serhiy Storchaka3f228112018-09-27 17:42:37 +03002846 (s->v.Return.value->kind != Constant_kind));
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002847 if (c->u->u_ste->ste_type != FunctionBlock)
2848 return compiler_error(c, "'return' outside function");
2849 if (s->v.Return.value != NULL &&
2850 c->u->u_ste->ste_coroutine && c->u->u_ste->ste_generator)
2851 {
2852 return compiler_error(
2853 c, "'return' with value in async generator");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002854 }
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002855 if (preserve_tos) {
2856 VISIT(c, expr, s->v.Return.value);
2857 }
Mark Shannonfee55262019-11-21 09:11:43 +00002858 if (!compiler_unwind_fblock_stack(c, preserve_tos, NULL))
2859 return 0;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002860 if (s->v.Return.value == NULL) {
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03002861 ADDOP_LOAD_CONST(c, Py_None);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002862 }
2863 else if (!preserve_tos) {
2864 VISIT(c, expr, s->v.Return.value);
2865 }
2866 ADDOP(c, RETURN_VALUE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002867
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002868 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002869}
2870
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002871static int
2872compiler_break(struct compiler *c)
2873{
Mark Shannonfee55262019-11-21 09:11:43 +00002874 struct fblockinfo *loop = NULL;
2875 if (!compiler_unwind_fblock_stack(c, 0, &loop)) {
2876 return 0;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002877 }
Mark Shannonfee55262019-11-21 09:11:43 +00002878 if (loop == NULL) {
2879 return compiler_error(c, "'break' outside loop");
2880 }
2881 if (!compiler_unwind_fblock(c, loop, 0)) {
2882 return 0;
2883 }
2884 ADDOP_JABS(c, JUMP_ABSOLUTE, loop->fb_exit);
2885 return 1;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002886}
2887
2888static int
2889compiler_continue(struct compiler *c)
2890{
Mark Shannonfee55262019-11-21 09:11:43 +00002891 struct fblockinfo *loop = NULL;
2892 if (!compiler_unwind_fblock_stack(c, 0, &loop)) {
2893 return 0;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002894 }
Mark Shannonfee55262019-11-21 09:11:43 +00002895 if (loop == NULL) {
2896 return compiler_error(c, "'continue' not properly in loop");
2897 }
2898 ADDOP_JABS(c, JUMP_ABSOLUTE, loop->fb_block);
2899 return 1;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002900}
2901
2902
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002903/* Code generated for "try: <body> finally: <finalbody>" is as follows:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002904
2905 SETUP_FINALLY L
2906 <code for body>
2907 POP_BLOCK
Mark Shannonfee55262019-11-21 09:11:43 +00002908 <code for finalbody>
2909 JUMP E
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002910 L:
2911 <code for finalbody>
Mark Shannonfee55262019-11-21 09:11:43 +00002912 E:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002913
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002914 The special instructions use the block stack. Each block
2915 stack entry contains the instruction that created it (here
2916 SETUP_FINALLY), the level of the value stack at the time the
2917 block stack entry was created, and a label (here L).
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002918
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002919 SETUP_FINALLY:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002920 Pushes the current value stack level and the label
2921 onto the block stack.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002922 POP_BLOCK:
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002923 Pops en entry from the block stack.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002924
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002925 The block stack is unwound when an exception is raised:
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002926 when a SETUP_FINALLY entry is found, the raised and the caught
2927 exceptions are pushed onto the value stack (and the exception
2928 condition is cleared), and the interpreter jumps to the label
2929 gotten from the block stack.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002930*/
2931
2932static int
2933compiler_try_finally(struct compiler *c, stmt_ty s)
2934{
Mark Shannonfee55262019-11-21 09:11:43 +00002935 basicblock *body, *end, *exit;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002936
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002937 body = compiler_new_block(c);
2938 end = compiler_new_block(c);
Mark Shannonfee55262019-11-21 09:11:43 +00002939 exit = compiler_new_block(c);
2940 if (body == NULL || end == NULL || exit == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002941 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002942
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002943 /* `try` block */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002944 ADDOP_JREL(c, SETUP_FINALLY, end);
2945 compiler_use_next_block(c, body);
Mark Shannonfee55262019-11-21 09:11:43 +00002946 if (!compiler_push_fblock(c, FINALLY_TRY, body, end, s->v.Try.finalbody))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002947 return 0;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002948 if (s->v.Try.handlers && asdl_seq_LEN(s->v.Try.handlers)) {
2949 if (!compiler_try_except(c, s))
2950 return 0;
2951 }
2952 else {
2953 VISIT_SEQ(c, stmt, s->v.Try.body);
2954 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002955 ADDOP(c, POP_BLOCK);
Mark Shannonfee55262019-11-21 09:11:43 +00002956 compiler_pop_fblock(c, FINALLY_TRY, body);
2957 VISIT_SEQ(c, stmt, s->v.Try.finalbody);
2958 ADDOP_JREL(c, JUMP_FORWARD, exit);
2959 /* `finally` block */
2960 compiler_use_next_block(c, end);
2961 if (!compiler_push_fblock(c, FINALLY_END, end, NULL, NULL))
2962 return 0;
2963 VISIT_SEQ(c, stmt, s->v.Try.finalbody);
2964 compiler_pop_fblock(c, FINALLY_END, end);
2965 ADDOP(c, RERAISE);
2966 compiler_use_next_block(c, exit);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002967 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002968}
2969
2970/*
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00002971 Code generated for "try: S except E1 as V1: S1 except E2 as V2: S2 ...":
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002972 (The contents of the value stack is shown in [], with the top
2973 at the right; 'tb' is trace-back info, 'val' the exception's
2974 associated value, and 'exc' the exception.)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002975
2976 Value stack Label Instruction Argument
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002977 [] SETUP_FINALLY L1
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002978 [] <code for S>
2979 [] POP_BLOCK
2980 [] JUMP_FORWARD L0
2981
2982 [tb, val, exc] L1: DUP )
2983 [tb, val, exc, exc] <evaluate E1> )
Mark Shannon9af0e472020-01-14 10:12:45 +00002984 [tb, val, exc, exc, E1] JUMP_IF_NOT_EXC_MATCH L2 ) only if E1
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002985 [tb, val, exc] POP
2986 [tb, val] <assign to V1> (or POP if no V1)
2987 [tb] POP
2988 [] <code for S1>
2989 JUMP_FORWARD L0
2990
2991 [tb, val, exc] L2: DUP
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002992 .............................etc.......................
2993
Mark Shannonfee55262019-11-21 09:11:43 +00002994 [tb, val, exc] Ln+1: RERAISE # re-raise exception
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002995
2996 [] L0: <next statement>
2997
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002998 Of course, parts are not generated if Vi or Ei is not present.
2999*/
3000static int
3001compiler_try_except(struct compiler *c, stmt_ty s)
3002{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003003 basicblock *body, *orelse, *except, *end;
Victor Stinnerad9a0662013-11-19 22:23:20 +01003004 Py_ssize_t i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003005
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003006 body = compiler_new_block(c);
3007 except = compiler_new_block(c);
3008 orelse = compiler_new_block(c);
3009 end = compiler_new_block(c);
3010 if (body == NULL || except == NULL || orelse == NULL || end == NULL)
3011 return 0;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003012 ADDOP_JREL(c, SETUP_FINALLY, except);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003013 compiler_use_next_block(c, body);
Mark Shannonfee55262019-11-21 09:11:43 +00003014 if (!compiler_push_fblock(c, EXCEPT, body, NULL, NULL))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003015 return 0;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003016 VISIT_SEQ(c, stmt, s->v.Try.body);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003017 ADDOP(c, POP_BLOCK);
3018 compiler_pop_fblock(c, EXCEPT, body);
3019 ADDOP_JREL(c, JUMP_FORWARD, orelse);
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003020 n = asdl_seq_LEN(s->v.Try.handlers);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003021 compiler_use_next_block(c, except);
3022 for (i = 0; i < n; i++) {
3023 excepthandler_ty handler = (excepthandler_ty)asdl_seq_GET(
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003024 s->v.Try.handlers, i);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003025 if (!handler->v.ExceptHandler.type && i < n-1)
3026 return compiler_error(c, "default 'except:' must be last");
Serhiy Storchaka61cb3d02020-03-17 18:07:30 +02003027 SET_LOC(c, handler);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003028 except = compiler_new_block(c);
3029 if (except == NULL)
3030 return 0;
3031 if (handler->v.ExceptHandler.type) {
3032 ADDOP(c, DUP_TOP);
3033 VISIT(c, expr, handler->v.ExceptHandler.type);
Mark Shannon9af0e472020-01-14 10:12:45 +00003034 ADDOP_JABS(c, JUMP_IF_NOT_EXC_MATCH, except);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003035 }
3036 ADDOP(c, POP_TOP);
3037 if (handler->v.ExceptHandler.name) {
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003038 basicblock *cleanup_end, *cleanup_body;
Guido van Rossumb940e112007-01-10 16:19:56 +00003039
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003040 cleanup_end = compiler_new_block(c);
3041 cleanup_body = compiler_new_block(c);
Zackery Spytz53ebf4b2018-10-11 23:54:03 -06003042 if (cleanup_end == NULL || cleanup_body == NULL) {
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003043 return 0;
Zackery Spytz53ebf4b2018-10-11 23:54:03 -06003044 }
Guido van Rossumb940e112007-01-10 16:19:56 +00003045
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003046 compiler_nameop(c, handler->v.ExceptHandler.name, Store);
3047 ADDOP(c, POP_TOP);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003048
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003049 /*
3050 try:
Ezio Melotti1b6424f2013-04-19 07:10:09 +03003051 # body
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003052 except type as name:
Ezio Melotti1b6424f2013-04-19 07:10:09 +03003053 try:
3054 # body
3055 finally:
Chris Angelicoad098b62019-05-21 23:34:19 +10003056 name = None # in case body contains "del name"
Ezio Melotti1b6424f2013-04-19 07:10:09 +03003057 del name
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003058 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003059
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003060 /* second try: */
3061 ADDOP_JREL(c, SETUP_FINALLY, cleanup_end);
3062 compiler_use_next_block(c, cleanup_body);
Mark Shannonfee55262019-11-21 09:11:43 +00003063 if (!compiler_push_fblock(c, HANDLER_CLEANUP, cleanup_body, NULL, handler->v.ExceptHandler.name))
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003064 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003065
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003066 /* second # body */
3067 VISIT_SEQ(c, stmt, handler->v.ExceptHandler.body);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003068 compiler_pop_fblock(c, HANDLER_CLEANUP, cleanup_body);
Mark Shannonfee55262019-11-21 09:11:43 +00003069 ADDOP(c, POP_BLOCK);
3070 ADDOP(c, POP_EXCEPT);
3071 /* name = None; del name */
3072 ADDOP_LOAD_CONST(c, Py_None);
3073 compiler_nameop(c, handler->v.ExceptHandler.name, Store);
3074 compiler_nameop(c, handler->v.ExceptHandler.name, Del);
3075 ADDOP_JREL(c, JUMP_FORWARD, end);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003076
Mark Shannonfee55262019-11-21 09:11:43 +00003077 /* except: */
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003078 compiler_use_next_block(c, cleanup_end);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003079
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003080 /* name = None; del name */
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03003081 ADDOP_LOAD_CONST(c, Py_None);
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003082 compiler_nameop(c, handler->v.ExceptHandler.name, Store);
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003083 compiler_nameop(c, handler->v.ExceptHandler.name, Del);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003084
Mark Shannonfee55262019-11-21 09:11:43 +00003085 ADDOP(c, RERAISE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003086 }
3087 else {
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003088 basicblock *cleanup_body;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003089
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003090 cleanup_body = compiler_new_block(c);
Benjamin Peterson0a5dad92011-05-27 14:17:04 -05003091 if (!cleanup_body)
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003092 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003093
Guido van Rossumb940e112007-01-10 16:19:56 +00003094 ADDOP(c, POP_TOP);
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003095 ADDOP(c, POP_TOP);
3096 compiler_use_next_block(c, cleanup_body);
Mark Shannonfee55262019-11-21 09:11:43 +00003097 if (!compiler_push_fblock(c, HANDLER_CLEANUP, cleanup_body, NULL, NULL))
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003098 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003099 VISIT_SEQ(c, stmt, handler->v.ExceptHandler.body);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003100 compiler_pop_fblock(c, HANDLER_CLEANUP, cleanup_body);
Mark Shannonfee55262019-11-21 09:11:43 +00003101 ADDOP(c, POP_EXCEPT);
3102 ADDOP_JREL(c, JUMP_FORWARD, end);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003103 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003104 compiler_use_next_block(c, except);
3105 }
Mark Shannonfee55262019-11-21 09:11:43 +00003106 ADDOP(c, RERAISE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003107 compiler_use_next_block(c, orelse);
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003108 VISIT_SEQ(c, stmt, s->v.Try.orelse);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003109 compiler_use_next_block(c, end);
3110 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003111}
3112
3113static int
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003114compiler_try(struct compiler *c, stmt_ty s) {
3115 if (s->v.Try.finalbody && asdl_seq_LEN(s->v.Try.finalbody))
3116 return compiler_try_finally(c, s);
3117 else
3118 return compiler_try_except(c, s);
3119}
3120
3121
3122static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003123compiler_import_as(struct compiler *c, identifier name, identifier asname)
3124{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003125 /* The IMPORT_NAME opcode was already generated. This function
3126 merely needs to bind the result to a name.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003127
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003128 If there is a dot in name, we need to split it and emit a
Serhiy Storchakaf93234b2017-05-09 22:31:05 +03003129 IMPORT_FROM for each name.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003130 */
Serhiy Storchaka265fcc52017-08-29 15:47:44 +03003131 Py_ssize_t len = PyUnicode_GET_LENGTH(name);
3132 Py_ssize_t dot = PyUnicode_FindChar(name, '.', 0, len, 1);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003133 if (dot == -2)
Serhiy Storchaka694de3b2016-06-15 20:06:07 +03003134 return 0;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003135 if (dot != -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003136 /* Consume the base module name to get the first attribute */
Serhiy Storchaka265fcc52017-08-29 15:47:44 +03003137 while (1) {
3138 Py_ssize_t pos = dot + 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003139 PyObject *attr;
Serhiy Storchaka265fcc52017-08-29 15:47:44 +03003140 dot = PyUnicode_FindChar(name, '.', pos, len, 1);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003141 if (dot == -2)
Serhiy Storchaka694de3b2016-06-15 20:06:07 +03003142 return 0;
Serhiy Storchaka265fcc52017-08-29 15:47:44 +03003143 attr = PyUnicode_Substring(name, pos, (dot != -1) ? dot : len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003144 if (!attr)
Serhiy Storchaka694de3b2016-06-15 20:06:07 +03003145 return 0;
Serhiy Storchakaaa8e51f2018-04-01 00:29:37 +03003146 ADDOP_N(c, IMPORT_FROM, attr, names);
Serhiy Storchaka265fcc52017-08-29 15:47:44 +03003147 if (dot == -1) {
3148 break;
3149 }
3150 ADDOP(c, ROT_TWO);
3151 ADDOP(c, POP_TOP);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003152 }
Serhiy Storchaka265fcc52017-08-29 15:47:44 +03003153 if (!compiler_nameop(c, asname, Store)) {
3154 return 0;
3155 }
3156 ADDOP(c, POP_TOP);
3157 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003158 }
3159 return compiler_nameop(c, asname, Store);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003160}
3161
3162static int
3163compiler_import(struct compiler *c, stmt_ty s)
3164{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003165 /* The Import node stores a module name like a.b.c as a single
3166 string. This is convenient for all cases except
3167 import a.b.c as d
3168 where we need to parse that string to extract the individual
3169 module names.
3170 XXX Perhaps change the representation to make this case simpler?
3171 */
Victor Stinnerad9a0662013-11-19 22:23:20 +01003172 Py_ssize_t i, n = asdl_seq_LEN(s->v.Import.names);
Thomas Woutersf7f438b2006-02-28 16:09:29 +00003173
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003174 for (i = 0; i < n; i++) {
3175 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.Import.names, i);
3176 int r;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003177
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03003178 ADDOP_LOAD_CONST(c, _PyLong_Zero);
3179 ADDOP_LOAD_CONST(c, Py_None);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003180 ADDOP_NAME(c, IMPORT_NAME, alias->name, names);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003181
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003182 if (alias->asname) {
3183 r = compiler_import_as(c, alias->name, alias->asname);
3184 if (!r)
3185 return r;
3186 }
3187 else {
3188 identifier tmp = alias->name;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003189 Py_ssize_t dot = PyUnicode_FindChar(
3190 alias->name, '.', 0, PyUnicode_GET_LENGTH(alias->name), 1);
Victor Stinner6b64a682013-07-11 22:50:45 +02003191 if (dot != -1) {
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003192 tmp = PyUnicode_Substring(alias->name, 0, dot);
Victor Stinner6b64a682013-07-11 22:50:45 +02003193 if (tmp == NULL)
3194 return 0;
3195 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003196 r = compiler_nameop(c, tmp, Store);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003197 if (dot != -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003198 Py_DECREF(tmp);
3199 }
3200 if (!r)
3201 return r;
3202 }
3203 }
3204 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003205}
3206
3207static int
3208compiler_from_import(struct compiler *c, stmt_ty s)
3209{
Victor Stinnerad9a0662013-11-19 22:23:20 +01003210 Py_ssize_t i, n = asdl_seq_LEN(s->v.ImportFrom.names);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03003211 PyObject *names;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003212 static PyObject *empty_string;
Benjamin Peterson78565b22009-06-28 19:19:51 +00003213
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003214 if (!empty_string) {
3215 empty_string = PyUnicode_FromString("");
3216 if (!empty_string)
3217 return 0;
3218 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003219
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03003220 ADDOP_LOAD_CONST_NEW(c, PyLong_FromLong(s->v.ImportFrom.level));
Serhiy Storchakaa95d9862018-03-24 22:42:35 +02003221
3222 names = PyTuple_New(n);
3223 if (!names)
3224 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003225
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003226 /* build up the names */
3227 for (i = 0; i < n; i++) {
3228 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);
3229 Py_INCREF(alias->name);
3230 PyTuple_SET_ITEM(names, i, alias->name);
3231 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003232
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003233 if (s->lineno > c->c_future->ff_lineno && s->v.ImportFrom.module &&
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02003234 _PyUnicode_EqualToASCIIString(s->v.ImportFrom.module, "__future__")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003235 Py_DECREF(names);
3236 return compiler_error(c, "from __future__ imports must occur "
3237 "at the beginning of the file");
3238 }
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03003239 ADDOP_LOAD_CONST_NEW(c, names);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003240
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003241 if (s->v.ImportFrom.module) {
3242 ADDOP_NAME(c, IMPORT_NAME, s->v.ImportFrom.module, names);
3243 }
3244 else {
3245 ADDOP_NAME(c, IMPORT_NAME, empty_string, names);
3246 }
3247 for (i = 0; i < n; i++) {
3248 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);
3249 identifier store_name;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003250
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003251 if (i == 0 && PyUnicode_READ_CHAR(alias->name, 0) == '*') {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003252 assert(n == 1);
3253 ADDOP(c, IMPORT_STAR);
3254 return 1;
3255 }
3256
3257 ADDOP_NAME(c, IMPORT_FROM, alias->name, names);
3258 store_name = alias->name;
3259 if (alias->asname)
3260 store_name = alias->asname;
3261
3262 if (!compiler_nameop(c, store_name, Store)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003263 return 0;
3264 }
3265 }
3266 /* remove imported module */
3267 ADDOP(c, POP_TOP);
3268 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003269}
3270
3271static int
3272compiler_assert(struct compiler *c, stmt_ty s)
3273{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003274 basicblock *end;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003275
Georg Brandl8334fd92010-12-04 10:26:46 +00003276 if (c->c_optimize)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003277 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003278 if (s->v.Assert.test->kind == Tuple_kind &&
Serhiy Storchakad31e7732018-10-21 10:09:39 +03003279 asdl_seq_LEN(s->v.Assert.test->v.Tuple.elts) > 0)
3280 {
3281 if (!compiler_warn(c, "assertion is always true, "
3282 "perhaps remove parentheses?"))
3283 {
Victor Stinner14e461d2013-08-26 22:28:21 +02003284 return 0;
3285 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003286 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003287 end = compiler_new_block(c);
3288 if (end == NULL)
3289 return 0;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03003290 if (!compiler_jump_if(c, s->v.Assert.test, end, 1))
3291 return 0;
Zackery Spytzce6a0702019-08-25 03:44:09 -06003292 ADDOP(c, LOAD_ASSERTION_ERROR);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003293 if (s->v.Assert.msg) {
3294 VISIT(c, expr, s->v.Assert.msg);
3295 ADDOP_I(c, CALL_FUNCTION, 1);
3296 }
3297 ADDOP_I(c, RAISE_VARARGS, 1);
3298 compiler_use_next_block(c, end);
3299 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003300}
3301
3302static int
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01003303compiler_visit_stmt_expr(struct compiler *c, expr_ty value)
3304{
3305 if (c->c_interactive && c->c_nestlevel <= 1) {
3306 VISIT(c, expr, value);
3307 ADDOP(c, PRINT_EXPR);
3308 return 1;
3309 }
3310
Serhiy Storchaka3f228112018-09-27 17:42:37 +03003311 if (value->kind == Constant_kind) {
Victor Stinner15a30952016-02-08 22:45:06 +01003312 /* ignore constant statement */
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01003313 return 1;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01003314 }
3315
3316 VISIT(c, expr, value);
3317 ADDOP(c, POP_TOP);
3318 return 1;
3319}
3320
3321static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003322compiler_visit_stmt(struct compiler *c, stmt_ty s)
3323{
Victor Stinnerad9a0662013-11-19 22:23:20 +01003324 Py_ssize_t i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003325
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003326 /* Always assign a lineno to the next instruction for a stmt. */
Serhiy Storchaka61cb3d02020-03-17 18:07:30 +02003327 SET_LOC(c, s);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003328
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003329 switch (s->kind) {
3330 case FunctionDef_kind:
Yury Selivanov75445082015-05-11 22:57:16 -04003331 return compiler_function(c, s, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003332 case ClassDef_kind:
3333 return compiler_class(c, s);
3334 case Return_kind:
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003335 return compiler_return(c, s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003336 case Delete_kind:
3337 VISIT_SEQ(c, expr, s->v.Delete.targets)
3338 break;
3339 case Assign_kind:
3340 n = asdl_seq_LEN(s->v.Assign.targets);
3341 VISIT(c, expr, s->v.Assign.value);
3342 for (i = 0; i < n; i++) {
3343 if (i < n - 1)
3344 ADDOP(c, DUP_TOP);
3345 VISIT(c, expr,
3346 (expr_ty)asdl_seq_GET(s->v.Assign.targets, i));
3347 }
3348 break;
3349 case AugAssign_kind:
3350 return compiler_augassign(c, s);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003351 case AnnAssign_kind:
3352 return compiler_annassign(c, s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003353 case For_kind:
3354 return compiler_for(c, s);
3355 case While_kind:
3356 return compiler_while(c, s);
3357 case If_kind:
3358 return compiler_if(c, s);
3359 case Raise_kind:
3360 n = 0;
3361 if (s->v.Raise.exc) {
3362 VISIT(c, expr, s->v.Raise.exc);
3363 n++;
Victor Stinnerad9a0662013-11-19 22:23:20 +01003364 if (s->v.Raise.cause) {
3365 VISIT(c, expr, s->v.Raise.cause);
3366 n++;
3367 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003368 }
Victor Stinnerad9a0662013-11-19 22:23:20 +01003369 ADDOP_I(c, RAISE_VARARGS, (int)n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003370 break;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003371 case Try_kind:
3372 return compiler_try(c, s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003373 case Assert_kind:
3374 return compiler_assert(c, s);
3375 case Import_kind:
3376 return compiler_import(c, s);
3377 case ImportFrom_kind:
3378 return compiler_from_import(c, s);
3379 case Global_kind:
3380 case Nonlocal_kind:
3381 break;
3382 case Expr_kind:
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01003383 return compiler_visit_stmt_expr(c, s->v.Expr.value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003384 case Pass_kind:
3385 break;
3386 case Break_kind:
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003387 return compiler_break(c);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003388 case Continue_kind:
3389 return compiler_continue(c);
3390 case With_kind:
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003391 return compiler_with(c, s, 0);
Yury Selivanov75445082015-05-11 22:57:16 -04003392 case AsyncFunctionDef_kind:
3393 return compiler_function(c, s, 1);
3394 case AsyncWith_kind:
3395 return compiler_async_with(c, s, 0);
3396 case AsyncFor_kind:
3397 return compiler_async_for(c, s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003398 }
Yury Selivanov75445082015-05-11 22:57:16 -04003399
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003400 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003401}
3402
3403static int
3404unaryop(unaryop_ty op)
3405{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003406 switch (op) {
3407 case Invert:
3408 return UNARY_INVERT;
3409 case Not:
3410 return UNARY_NOT;
3411 case UAdd:
3412 return UNARY_POSITIVE;
3413 case USub:
3414 return UNARY_NEGATIVE;
3415 default:
3416 PyErr_Format(PyExc_SystemError,
3417 "unary op %d should not be possible", op);
3418 return 0;
3419 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003420}
3421
3422static int
Andy Lester76d58772020-03-10 21:18:12 -05003423binop(operator_ty op)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003424{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003425 switch (op) {
3426 case Add:
3427 return BINARY_ADD;
3428 case Sub:
3429 return BINARY_SUBTRACT;
3430 case Mult:
3431 return BINARY_MULTIPLY;
Benjamin Petersond51374e2014-04-09 23:55:56 -04003432 case MatMult:
3433 return BINARY_MATRIX_MULTIPLY;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003434 case Div:
3435 return BINARY_TRUE_DIVIDE;
3436 case Mod:
3437 return BINARY_MODULO;
3438 case Pow:
3439 return BINARY_POWER;
3440 case LShift:
3441 return BINARY_LSHIFT;
3442 case RShift:
3443 return BINARY_RSHIFT;
3444 case BitOr:
3445 return BINARY_OR;
3446 case BitXor:
3447 return BINARY_XOR;
3448 case BitAnd:
3449 return BINARY_AND;
3450 case FloorDiv:
3451 return BINARY_FLOOR_DIVIDE;
3452 default:
3453 PyErr_Format(PyExc_SystemError,
3454 "binary op %d should not be possible", op);
3455 return 0;
3456 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003457}
3458
3459static int
Andy Lester76d58772020-03-10 21:18:12 -05003460inplace_binop(operator_ty op)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003461{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003462 switch (op) {
3463 case Add:
3464 return INPLACE_ADD;
3465 case Sub:
3466 return INPLACE_SUBTRACT;
3467 case Mult:
3468 return INPLACE_MULTIPLY;
Benjamin Petersond51374e2014-04-09 23:55:56 -04003469 case MatMult:
3470 return INPLACE_MATRIX_MULTIPLY;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003471 case Div:
3472 return INPLACE_TRUE_DIVIDE;
3473 case Mod:
3474 return INPLACE_MODULO;
3475 case Pow:
3476 return INPLACE_POWER;
3477 case LShift:
3478 return INPLACE_LSHIFT;
3479 case RShift:
3480 return INPLACE_RSHIFT;
3481 case BitOr:
3482 return INPLACE_OR;
3483 case BitXor:
3484 return INPLACE_XOR;
3485 case BitAnd:
3486 return INPLACE_AND;
3487 case FloorDiv:
3488 return INPLACE_FLOOR_DIVIDE;
3489 default:
3490 PyErr_Format(PyExc_SystemError,
3491 "inplace binary op %d should not be possible", op);
3492 return 0;
3493 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003494}
3495
3496static int
3497compiler_nameop(struct compiler *c, identifier name, expr_context_ty ctx)
3498{
Victor Stinnerad9a0662013-11-19 22:23:20 +01003499 int op, scope;
3500 Py_ssize_t arg;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003501 enum { OP_FAST, OP_GLOBAL, OP_DEREF, OP_NAME } optype;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003502
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003503 PyObject *dict = c->u->u_names;
3504 PyObject *mangled;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003505
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02003506 assert(!_PyUnicode_EqualToASCIIString(name, "None") &&
3507 !_PyUnicode_EqualToASCIIString(name, "True") &&
3508 !_PyUnicode_EqualToASCIIString(name, "False"));
Benjamin Peterson70b224d2012-12-06 17:49:58 -05003509
Serhiy Storchakabd6ec4d2017-12-18 14:29:12 +02003510 mangled = _Py_Mangle(c->u->u_private, name);
3511 if (!mangled)
3512 return 0;
3513
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003514 op = 0;
3515 optype = OP_NAME;
3516 scope = PyST_GetScope(c->u->u_ste, mangled);
3517 switch (scope) {
3518 case FREE:
3519 dict = c->u->u_freevars;
3520 optype = OP_DEREF;
3521 break;
3522 case CELL:
3523 dict = c->u->u_cellvars;
3524 optype = OP_DEREF;
3525 break;
3526 case LOCAL:
3527 if (c->u->u_ste->ste_type == FunctionBlock)
3528 optype = OP_FAST;
3529 break;
3530 case GLOBAL_IMPLICIT:
Benjamin Peterson1dfd2472015-04-27 21:44:22 -04003531 if (c->u->u_ste->ste_type == FunctionBlock)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003532 optype = OP_GLOBAL;
3533 break;
3534 case GLOBAL_EXPLICIT:
3535 optype = OP_GLOBAL;
3536 break;
3537 default:
3538 /* scope can be 0 */
3539 break;
3540 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003541
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003542 /* XXX Leave assert here, but handle __doc__ and the like better */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003543 assert(scope || PyUnicode_READ_CHAR(name, 0) == '_');
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003544
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003545 switch (optype) {
3546 case OP_DEREF:
3547 switch (ctx) {
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04003548 case Load:
3549 op = (c->u->u_ste->ste_type == ClassBlock) ? LOAD_CLASSDEREF : LOAD_DEREF;
3550 break;
Serhiy Storchaka6b975982020-03-17 23:41:08 +02003551 case Store: op = STORE_DEREF; break;
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00003552 case Del: op = DELETE_DEREF; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003553 }
3554 break;
3555 case OP_FAST:
3556 switch (ctx) {
3557 case Load: op = LOAD_FAST; break;
Serhiy Storchaka6b975982020-03-17 23:41:08 +02003558 case Store: op = STORE_FAST; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003559 case Del: op = DELETE_FAST; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003560 }
Serhiy Storchakaaa8e51f2018-04-01 00:29:37 +03003561 ADDOP_N(c, op, mangled, varnames);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003562 return 1;
3563 case OP_GLOBAL:
3564 switch (ctx) {
3565 case Load: op = LOAD_GLOBAL; break;
Serhiy Storchaka6b975982020-03-17 23:41:08 +02003566 case Store: op = STORE_GLOBAL; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003567 case Del: op = DELETE_GLOBAL; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003568 }
3569 break;
3570 case OP_NAME:
3571 switch (ctx) {
Benjamin Peterson20f9c3c2010-07-20 22:39:34 +00003572 case Load: op = LOAD_NAME; break;
Serhiy Storchaka6b975982020-03-17 23:41:08 +02003573 case Store: op = STORE_NAME; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003574 case Del: op = DELETE_NAME; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003575 }
3576 break;
3577 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003578
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003579 assert(op);
Andy Lester76d58772020-03-10 21:18:12 -05003580 arg = compiler_add_o(dict, mangled);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003581 Py_DECREF(mangled);
3582 if (arg < 0)
3583 return 0;
3584 return compiler_addop_i(c, op, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003585}
3586
3587static int
3588compiler_boolop(struct compiler *c, expr_ty e)
3589{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003590 basicblock *end;
Victor Stinnerad9a0662013-11-19 22:23:20 +01003591 int jumpi;
3592 Py_ssize_t i, n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003593 asdl_seq *s;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003594
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003595 assert(e->kind == BoolOp_kind);
3596 if (e->v.BoolOp.op == And)
3597 jumpi = JUMP_IF_FALSE_OR_POP;
3598 else
3599 jumpi = JUMP_IF_TRUE_OR_POP;
3600 end = compiler_new_block(c);
3601 if (end == NULL)
3602 return 0;
3603 s = e->v.BoolOp.values;
3604 n = asdl_seq_LEN(s) - 1;
3605 assert(n >= 0);
3606 for (i = 0; i < n; ++i) {
3607 VISIT(c, expr, (expr_ty)asdl_seq_GET(s, i));
3608 ADDOP_JABS(c, jumpi, end);
3609 }
3610 VISIT(c, expr, (expr_ty)asdl_seq_GET(s, n));
3611 compiler_use_next_block(c, end);
3612 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003613}
3614
3615static int
Mark Shannon13bc1392020-01-23 09:25:17 +00003616starunpack_helper(struct compiler *c, asdl_seq *elts, int pushed,
3617 int build, int add, int extend, int tuple)
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003618{
3619 Py_ssize_t n = asdl_seq_LEN(elts);
Mark Shannon13bc1392020-01-23 09:25:17 +00003620 Py_ssize_t i, seen_star = 0;
Brandt Bucher6dd9b642019-11-25 22:16:53 -08003621 if (n > 2 && are_all_items_const(elts, 0, n)) {
3622 PyObject *folded = PyTuple_New(n);
3623 if (folded == NULL) {
3624 return 0;
3625 }
3626 PyObject *val;
3627 for (i = 0; i < n; i++) {
3628 val = ((expr_ty)asdl_seq_GET(elts, i))->v.Constant.value;
3629 Py_INCREF(val);
3630 PyTuple_SET_ITEM(folded, i, val);
3631 }
Mark Shannon13bc1392020-01-23 09:25:17 +00003632 if (tuple) {
3633 ADDOP_LOAD_CONST_NEW(c, folded);
3634 } else {
3635 if (add == SET_ADD) {
3636 Py_SETREF(folded, PyFrozenSet_New(folded));
3637 if (folded == NULL) {
3638 return 0;
3639 }
Brandt Bucher6dd9b642019-11-25 22:16:53 -08003640 }
Mark Shannon13bc1392020-01-23 09:25:17 +00003641 ADDOP_I(c, build, pushed);
3642 ADDOP_LOAD_CONST_NEW(c, folded);
3643 ADDOP_I(c, extend, 1);
Brandt Bucher6dd9b642019-11-25 22:16:53 -08003644 }
Brandt Bucher6dd9b642019-11-25 22:16:53 -08003645 return 1;
3646 }
Mark Shannon13bc1392020-01-23 09:25:17 +00003647
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003648 for (i = 0; i < n; i++) {
3649 expr_ty elt = asdl_seq_GET(elts, i);
3650 if (elt->kind == Starred_kind) {
Mark Shannon13bc1392020-01-23 09:25:17 +00003651 seen_star = 1;
3652 }
3653 }
3654 if (seen_star) {
3655 seen_star = 0;
3656 for (i = 0; i < n; i++) {
3657 expr_ty elt = asdl_seq_GET(elts, i);
3658 if (elt->kind == Starred_kind) {
3659 if (seen_star == 0) {
3660 ADDOP_I(c, build, i+pushed);
3661 seen_star = 1;
3662 }
3663 VISIT(c, expr, elt->v.Starred.value);
3664 ADDOP_I(c, extend, 1);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003665 }
Mark Shannon13bc1392020-01-23 09:25:17 +00003666 else {
3667 VISIT(c, expr, elt);
3668 if (seen_star) {
3669 ADDOP_I(c, add, 1);
3670 }
3671 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003672 }
Mark Shannon13bc1392020-01-23 09:25:17 +00003673 assert(seen_star);
3674 if (tuple) {
3675 ADDOP(c, LIST_TO_TUPLE);
3676 }
3677 }
3678 else {
3679 for (i = 0; i < n; i++) {
3680 expr_ty elt = asdl_seq_GET(elts, i);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003681 VISIT(c, expr, elt);
Mark Shannon13bc1392020-01-23 09:25:17 +00003682 }
3683 if (tuple) {
3684 ADDOP_I(c, BUILD_TUPLE, n+pushed);
3685 } else {
3686 ADDOP_I(c, build, n+pushed);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003687 }
3688 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003689 return 1;
3690}
3691
3692static int
3693assignment_helper(struct compiler *c, asdl_seq *elts)
3694{
3695 Py_ssize_t n = asdl_seq_LEN(elts);
3696 Py_ssize_t i;
3697 int seen_star = 0;
3698 for (i = 0; i < n; i++) {
3699 expr_ty elt = asdl_seq_GET(elts, i);
3700 if (elt->kind == Starred_kind && !seen_star) {
3701 if ((i >= (1 << 8)) ||
3702 (n-i-1 >= (INT_MAX >> 8)))
3703 return compiler_error(c,
3704 "too many expressions in "
3705 "star-unpacking assignment");
3706 ADDOP_I(c, UNPACK_EX, (i + ((n-i-1) << 8)));
3707 seen_star = 1;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003708 }
3709 else if (elt->kind == Starred_kind) {
3710 return compiler_error(c,
Furkan Öndercb6534e2020-03-26 04:54:31 +03003711 "multiple starred expressions in assignment");
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003712 }
3713 }
3714 if (!seen_star) {
3715 ADDOP_I(c, UNPACK_SEQUENCE, n);
3716 }
Brandt Bucherd5aa2e92020-03-07 19:44:18 -08003717 for (i = 0; i < n; i++) {
3718 expr_ty elt = asdl_seq_GET(elts, i);
3719 VISIT(c, expr, elt->kind != Starred_kind ? elt : elt->v.Starred.value);
3720 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003721 return 1;
3722}
3723
3724static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003725compiler_list(struct compiler *c, expr_ty e)
3726{
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003727 asdl_seq *elts = e->v.List.elts;
Serhiy Storchakad8b3a982019-03-05 20:42:06 +02003728 if (e->v.List.ctx == Store) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003729 return assignment_helper(c, elts);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003730 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003731 else if (e->v.List.ctx == Load) {
Mark Shannon13bc1392020-01-23 09:25:17 +00003732 return starunpack_helper(c, elts, 0, BUILD_LIST,
3733 LIST_APPEND, LIST_EXTEND, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003734 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003735 else
3736 VISIT_SEQ(c, expr, elts);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003737 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003738}
3739
3740static int
3741compiler_tuple(struct compiler *c, expr_ty e)
3742{
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003743 asdl_seq *elts = e->v.Tuple.elts;
Serhiy Storchakad8b3a982019-03-05 20:42:06 +02003744 if (e->v.Tuple.ctx == Store) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003745 return assignment_helper(c, elts);
3746 }
3747 else if (e->v.Tuple.ctx == Load) {
Mark Shannon13bc1392020-01-23 09:25:17 +00003748 return starunpack_helper(c, elts, 0, BUILD_LIST,
3749 LIST_APPEND, LIST_EXTEND, 1);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003750 }
3751 else
3752 VISIT_SEQ(c, expr, elts);
3753 return 1;
3754}
3755
3756static int
3757compiler_set(struct compiler *c, expr_ty e)
3758{
Mark Shannon13bc1392020-01-23 09:25:17 +00003759 return starunpack_helper(c, e->v.Set.elts, 0, BUILD_SET,
3760 SET_ADD, SET_UPDATE, 0);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003761}
3762
3763static int
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003764are_all_items_const(asdl_seq *seq, Py_ssize_t begin, Py_ssize_t end)
3765{
3766 Py_ssize_t i;
3767 for (i = begin; i < end; i++) {
3768 expr_ty key = (expr_ty)asdl_seq_GET(seq, i);
Serhiy Storchaka3f228112018-09-27 17:42:37 +03003769 if (key == NULL || key->kind != Constant_kind)
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003770 return 0;
3771 }
3772 return 1;
3773}
3774
3775static int
3776compiler_subdict(struct compiler *c, expr_ty e, Py_ssize_t begin, Py_ssize_t end)
3777{
3778 Py_ssize_t i, n = end - begin;
3779 PyObject *keys, *key;
3780 if (n > 1 && are_all_items_const(e->v.Dict.keys, begin, end)) {
3781 for (i = begin; i < end; i++) {
3782 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Dict.values, i));
3783 }
3784 keys = PyTuple_New(n);
3785 if (keys == NULL) {
3786 return 0;
3787 }
3788 for (i = begin; i < end; i++) {
Serhiy Storchaka3f228112018-09-27 17:42:37 +03003789 key = ((expr_ty)asdl_seq_GET(e->v.Dict.keys, i))->v.Constant.value;
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003790 Py_INCREF(key);
3791 PyTuple_SET_ITEM(keys, i - begin, key);
3792 }
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03003793 ADDOP_LOAD_CONST_NEW(c, keys);
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003794 ADDOP_I(c, BUILD_CONST_KEY_MAP, n);
3795 }
3796 else {
3797 for (i = begin; i < end; i++) {
3798 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Dict.keys, i));
3799 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Dict.values, i));
3800 }
3801 ADDOP_I(c, BUILD_MAP, n);
3802 }
3803 return 1;
3804}
3805
3806static int
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003807compiler_dict(struct compiler *c, expr_ty e)
3808{
Victor Stinner976bb402016-03-23 11:36:19 +01003809 Py_ssize_t i, n, elements;
Mark Shannon8a4cd702020-01-27 09:57:45 +00003810 int have_dict;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003811 int is_unpacking = 0;
3812 n = asdl_seq_LEN(e->v.Dict.values);
Mark Shannon8a4cd702020-01-27 09:57:45 +00003813 have_dict = 0;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003814 elements = 0;
3815 for (i = 0; i < n; i++) {
3816 is_unpacking = (expr_ty)asdl_seq_GET(e->v.Dict.keys, i) == NULL;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003817 if (is_unpacking) {
Mark Shannon8a4cd702020-01-27 09:57:45 +00003818 if (elements) {
3819 if (!compiler_subdict(c, e, i - elements, i)) {
3820 return 0;
3821 }
3822 if (have_dict) {
3823 ADDOP_I(c, DICT_UPDATE, 1);
3824 }
3825 have_dict = 1;
3826 elements = 0;
3827 }
3828 if (have_dict == 0) {
3829 ADDOP_I(c, BUILD_MAP, 0);
3830 have_dict = 1;
3831 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003832 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Dict.values, i));
Mark Shannon8a4cd702020-01-27 09:57:45 +00003833 ADDOP_I(c, DICT_UPDATE, 1);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003834 }
3835 else {
Mark Shannon8a4cd702020-01-27 09:57:45 +00003836 if (elements == 0xFFFF) {
3837 if (!compiler_subdict(c, e, i - elements, i)) {
3838 return 0;
3839 }
3840 if (have_dict) {
3841 ADDOP_I(c, DICT_UPDATE, 1);
3842 }
3843 have_dict = 1;
3844 elements = 0;
3845 }
3846 else {
3847 elements++;
3848 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003849 }
3850 }
Mark Shannon8a4cd702020-01-27 09:57:45 +00003851 if (elements) {
3852 if (!compiler_subdict(c, e, n - elements, n)) {
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003853 return 0;
Mark Shannon8a4cd702020-01-27 09:57:45 +00003854 }
3855 if (have_dict) {
3856 ADDOP_I(c, DICT_UPDATE, 1);
3857 }
3858 have_dict = 1;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003859 }
Mark Shannon8a4cd702020-01-27 09:57:45 +00003860 if (!have_dict) {
3861 ADDOP_I(c, BUILD_MAP, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003862 }
3863 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003864}
3865
3866static int
3867compiler_compare(struct compiler *c, expr_ty e)
3868{
Victor Stinnerad9a0662013-11-19 22:23:20 +01003869 Py_ssize_t i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003870
Serhiy Storchaka3bcbedc2019-01-18 07:47:48 +02003871 if (!check_compare(c, e)) {
3872 return 0;
3873 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003874 VISIT(c, expr, e->v.Compare.left);
Serhiy Storchaka02b9ef22017-12-30 09:47:42 +02003875 assert(asdl_seq_LEN(e->v.Compare.ops) > 0);
3876 n = asdl_seq_LEN(e->v.Compare.ops) - 1;
3877 if (n == 0) {
3878 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, 0));
Mark Shannon9af0e472020-01-14 10:12:45 +00003879 ADDOP_COMPARE(c, asdl_seq_GET(e->v.Compare.ops, 0));
Serhiy Storchaka02b9ef22017-12-30 09:47:42 +02003880 }
3881 else {
3882 basicblock *cleanup = compiler_new_block(c);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003883 if (cleanup == NULL)
3884 return 0;
Serhiy Storchaka02b9ef22017-12-30 09:47:42 +02003885 for (i = 0; i < n; i++) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003886 VISIT(c, expr,
3887 (expr_ty)asdl_seq_GET(e->v.Compare.comparators, i));
Serhiy Storchaka02b9ef22017-12-30 09:47:42 +02003888 ADDOP(c, DUP_TOP);
3889 ADDOP(c, ROT_THREE);
Mark Shannon9af0e472020-01-14 10:12:45 +00003890 ADDOP_COMPARE(c, asdl_seq_GET(e->v.Compare.ops, i));
Serhiy Storchaka02b9ef22017-12-30 09:47:42 +02003891 ADDOP_JABS(c, JUMP_IF_FALSE_OR_POP, cleanup);
3892 NEXT_BLOCK(c);
3893 }
3894 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, n));
Mark Shannon9af0e472020-01-14 10:12:45 +00003895 ADDOP_COMPARE(c, asdl_seq_GET(e->v.Compare.ops, n));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003896 basicblock *end = compiler_new_block(c);
3897 if (end == NULL)
3898 return 0;
3899 ADDOP_JREL(c, JUMP_FORWARD, end);
3900 compiler_use_next_block(c, cleanup);
3901 ADDOP(c, ROT_TWO);
3902 ADDOP(c, POP_TOP);
3903 compiler_use_next_block(c, end);
3904 }
3905 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003906}
3907
Serhiy Storchaka62e44812019-02-16 08:12:19 +02003908static PyTypeObject *
3909infer_type(expr_ty e)
3910{
3911 switch (e->kind) {
3912 case Tuple_kind:
3913 return &PyTuple_Type;
3914 case List_kind:
3915 case ListComp_kind:
3916 return &PyList_Type;
3917 case Dict_kind:
3918 case DictComp_kind:
3919 return &PyDict_Type;
3920 case Set_kind:
3921 case SetComp_kind:
3922 return &PySet_Type;
3923 case GeneratorExp_kind:
3924 return &PyGen_Type;
3925 case Lambda_kind:
3926 return &PyFunction_Type;
3927 case JoinedStr_kind:
3928 case FormattedValue_kind:
3929 return &PyUnicode_Type;
3930 case Constant_kind:
Victor Stinnera102ed72020-02-07 02:24:48 +01003931 return Py_TYPE(e->v.Constant.value);
Serhiy Storchaka62e44812019-02-16 08:12:19 +02003932 default:
3933 return NULL;
3934 }
3935}
3936
3937static int
3938check_caller(struct compiler *c, expr_ty e)
3939{
3940 switch (e->kind) {
3941 case Constant_kind:
3942 case Tuple_kind:
3943 case List_kind:
3944 case ListComp_kind:
3945 case Dict_kind:
3946 case DictComp_kind:
3947 case Set_kind:
3948 case SetComp_kind:
3949 case GeneratorExp_kind:
3950 case JoinedStr_kind:
3951 case FormattedValue_kind:
3952 return compiler_warn(c, "'%.200s' object is not callable; "
3953 "perhaps you missed a comma?",
3954 infer_type(e)->tp_name);
3955 default:
3956 return 1;
3957 }
3958}
3959
3960static int
3961check_subscripter(struct compiler *c, expr_ty e)
3962{
3963 PyObject *v;
3964
3965 switch (e->kind) {
3966 case Constant_kind:
3967 v = e->v.Constant.value;
3968 if (!(v == Py_None || v == Py_Ellipsis ||
3969 PyLong_Check(v) || PyFloat_Check(v) || PyComplex_Check(v) ||
3970 PyAnySet_Check(v)))
3971 {
3972 return 1;
3973 }
3974 /* fall through */
3975 case Set_kind:
3976 case SetComp_kind:
3977 case GeneratorExp_kind:
3978 case Lambda_kind:
3979 return compiler_warn(c, "'%.200s' object is not subscriptable; "
3980 "perhaps you missed a comma?",
3981 infer_type(e)->tp_name);
3982 default:
3983 return 1;
3984 }
3985}
3986
3987static int
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02003988check_index(struct compiler *c, expr_ty e, expr_ty s)
Serhiy Storchaka62e44812019-02-16 08:12:19 +02003989{
3990 PyObject *v;
3991
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02003992 PyTypeObject *index_type = infer_type(s);
Serhiy Storchaka62e44812019-02-16 08:12:19 +02003993 if (index_type == NULL
3994 || PyType_FastSubclass(index_type, Py_TPFLAGS_LONG_SUBCLASS)
3995 || index_type == &PySlice_Type) {
3996 return 1;
3997 }
3998
3999 switch (e->kind) {
4000 case Constant_kind:
4001 v = e->v.Constant.value;
4002 if (!(PyUnicode_Check(v) || PyBytes_Check(v) || PyTuple_Check(v))) {
4003 return 1;
4004 }
4005 /* fall through */
4006 case Tuple_kind:
4007 case List_kind:
4008 case ListComp_kind:
4009 case JoinedStr_kind:
4010 case FormattedValue_kind:
4011 return compiler_warn(c, "%.200s indices must be integers or slices, "
4012 "not %.200s; "
4013 "perhaps you missed a comma?",
4014 infer_type(e)->tp_name,
4015 index_type->tp_name);
4016 default:
4017 return 1;
4018 }
4019}
4020
Zackery Spytz97f5de02019-03-22 01:30:32 -06004021// Return 1 if the method call was optimized, -1 if not, and 0 on error.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004022static int
Yury Selivanovf2392132016-12-13 19:03:51 -05004023maybe_optimize_method_call(struct compiler *c, expr_ty e)
4024{
4025 Py_ssize_t argsl, i;
4026 expr_ty meth = e->v.Call.func;
4027 asdl_seq *args = e->v.Call.args;
4028
4029 /* Check that the call node is an attribute access, and that
4030 the call doesn't have keyword parameters. */
4031 if (meth->kind != Attribute_kind || meth->v.Attribute.ctx != Load ||
4032 asdl_seq_LEN(e->v.Call.keywords))
4033 return -1;
4034
4035 /* Check that there are no *varargs types of arguments. */
4036 argsl = asdl_seq_LEN(args);
4037 for (i = 0; i < argsl; i++) {
4038 expr_ty elt = asdl_seq_GET(args, i);
4039 if (elt->kind == Starred_kind) {
4040 return -1;
4041 }
4042 }
4043
4044 /* Alright, we can optimize the code. */
4045 VISIT(c, expr, meth->v.Attribute.value);
4046 ADDOP_NAME(c, LOAD_METHOD, meth->v.Attribute.attr, names);
4047 VISIT_SEQ(c, expr, e->v.Call.args);
4048 ADDOP_I(c, CALL_METHOD, asdl_seq_LEN(e->v.Call.args));
4049 return 1;
4050}
4051
4052static int
Zackery Spytz08050e92020-04-06 00:47:47 -06004053validate_keywords(struct compiler *c, asdl_seq *keywords)
4054{
4055 Py_ssize_t nkeywords = asdl_seq_LEN(keywords);
4056 for (Py_ssize_t i = 0; i < nkeywords; i++) {
Pablo Galindo254ec782020-04-03 20:37:13 +01004057 keyword_ty key = ((keyword_ty)asdl_seq_GET(keywords, i));
4058 if (key->arg == NULL) {
4059 continue;
4060 }
Zackery Spytz08050e92020-04-06 00:47:47 -06004061 for (Py_ssize_t j = i + 1; j < nkeywords; j++) {
Pablo Galindo254ec782020-04-03 20:37:13 +01004062 keyword_ty other = ((keyword_ty)asdl_seq_GET(keywords, j));
4063 if (other->arg && !PyUnicode_Compare(key->arg, other->arg)) {
4064 PyObject *msg = PyUnicode_FromFormat("keyword argument repeated: %U", key->arg);
4065 if (msg == NULL) {
4066 return -1;
4067 }
4068 c->u->u_col_offset = other->col_offset;
4069 compiler_error(c, PyUnicode_AsUTF8(msg));
4070 Py_DECREF(msg);
4071 return -1;
4072 }
4073 }
4074 }
4075 return 0;
4076}
4077
4078static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004079compiler_call(struct compiler *c, expr_ty e)
4080{
Zackery Spytz97f5de02019-03-22 01:30:32 -06004081 int ret = maybe_optimize_method_call(c, e);
4082 if (ret >= 0) {
4083 return ret;
4084 }
Serhiy Storchaka62e44812019-02-16 08:12:19 +02004085 if (!check_caller(c, e->v.Call.func)) {
4086 return 0;
4087 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004088 VISIT(c, expr, e->v.Call.func);
4089 return compiler_call_helper(c, 0,
4090 e->v.Call.args,
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004091 e->v.Call.keywords);
Guido van Rossum52cc1d82007-03-18 15:41:51 +00004092}
4093
Eric V. Smith235a6f02015-09-19 14:51:32 -04004094static int
4095compiler_joined_str(struct compiler *c, expr_ty e)
4096{
Eric V. Smith235a6f02015-09-19 14:51:32 -04004097 VISIT_SEQ(c, expr, e->v.JoinedStr.values);
Serhiy Storchaka4cc30ae2016-12-11 19:37:19 +02004098 if (asdl_seq_LEN(e->v.JoinedStr.values) != 1)
4099 ADDOP_I(c, BUILD_STRING, asdl_seq_LEN(e->v.JoinedStr.values));
Eric V. Smith235a6f02015-09-19 14:51:32 -04004100 return 1;
4101}
4102
Eric V. Smitha78c7952015-11-03 12:45:05 -05004103/* Used to implement f-strings. Format a single value. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04004104static int
4105compiler_formatted_value(struct compiler *c, expr_ty e)
4106{
Eric V. Smitha78c7952015-11-03 12:45:05 -05004107 /* Our oparg encodes 2 pieces of information: the conversion
4108 character, and whether or not a format_spec was provided.
Eric V. Smith235a6f02015-09-19 14:51:32 -04004109
Eric V. Smith9a4135e2019-05-08 16:28:48 -04004110 Convert the conversion char to 3 bits:
4111 : 000 0x0 FVC_NONE The default if nothing specified.
Eric V. Smitha78c7952015-11-03 12:45:05 -05004112 !s : 001 0x1 FVC_STR
4113 !r : 010 0x2 FVC_REPR
4114 !a : 011 0x3 FVC_ASCII
Eric V. Smith235a6f02015-09-19 14:51:32 -04004115
Eric V. Smitha78c7952015-11-03 12:45:05 -05004116 next bit is whether or not we have a format spec:
4117 yes : 100 0x4
4118 no : 000 0x0
4119 */
Eric V. Smith235a6f02015-09-19 14:51:32 -04004120
Eric V. Smith9a4135e2019-05-08 16:28:48 -04004121 int conversion = e->v.FormattedValue.conversion;
Eric V. Smitha78c7952015-11-03 12:45:05 -05004122 int oparg;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004123
Eric V. Smith9a4135e2019-05-08 16:28:48 -04004124 /* The expression to be formatted. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04004125 VISIT(c, expr, e->v.FormattedValue.value);
4126
Eric V. Smith9a4135e2019-05-08 16:28:48 -04004127 switch (conversion) {
Eric V. Smitha78c7952015-11-03 12:45:05 -05004128 case 's': oparg = FVC_STR; break;
4129 case 'r': oparg = FVC_REPR; break;
4130 case 'a': oparg = FVC_ASCII; break;
4131 case -1: oparg = FVC_NONE; break;
4132 default:
Eric V. Smith9a4135e2019-05-08 16:28:48 -04004133 PyErr_Format(PyExc_SystemError,
4134 "Unrecognized conversion character %d", conversion);
Eric V. Smitha78c7952015-11-03 12:45:05 -05004135 return 0;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004136 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04004137 if (e->v.FormattedValue.format_spec) {
Eric V. Smitha78c7952015-11-03 12:45:05 -05004138 /* Evaluate the format spec, and update our opcode arg. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04004139 VISIT(c, expr, e->v.FormattedValue.format_spec);
Eric V. Smitha78c7952015-11-03 12:45:05 -05004140 oparg |= FVS_HAVE_SPEC;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004141 }
4142
Eric V. Smitha78c7952015-11-03 12:45:05 -05004143 /* And push our opcode and oparg */
4144 ADDOP_I(c, FORMAT_VALUE, oparg);
Eric V. Smith9a4135e2019-05-08 16:28:48 -04004145
Eric V. Smith235a6f02015-09-19 14:51:32 -04004146 return 1;
4147}
4148
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03004149static int
4150compiler_subkwargs(struct compiler *c, asdl_seq *keywords, Py_ssize_t begin, Py_ssize_t end)
4151{
4152 Py_ssize_t i, n = end - begin;
4153 keyword_ty kw;
4154 PyObject *keys, *key;
4155 assert(n > 0);
4156 if (n > 1) {
4157 for (i = begin; i < end; i++) {
4158 kw = asdl_seq_GET(keywords, i);
4159 VISIT(c, expr, kw->value);
4160 }
4161 keys = PyTuple_New(n);
4162 if (keys == NULL) {
4163 return 0;
4164 }
4165 for (i = begin; i < end; i++) {
4166 key = ((keyword_ty) asdl_seq_GET(keywords, i))->arg;
4167 Py_INCREF(key);
4168 PyTuple_SET_ITEM(keys, i - begin, key);
4169 }
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03004170 ADDOP_LOAD_CONST_NEW(c, keys);
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03004171 ADDOP_I(c, BUILD_CONST_KEY_MAP, n);
4172 }
4173 else {
4174 /* a for loop only executes once */
4175 for (i = begin; i < end; i++) {
4176 kw = asdl_seq_GET(keywords, i);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03004177 ADDOP_LOAD_CONST(c, kw->arg);
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03004178 VISIT(c, expr, kw->value);
4179 }
4180 ADDOP_I(c, BUILD_MAP, n);
4181 }
4182 return 1;
4183}
4184
Guido van Rossum52cc1d82007-03-18 15:41:51 +00004185/* shared code between compiler_call and compiler_class */
4186static int
4187compiler_call_helper(struct compiler *c,
Victor Stinner976bb402016-03-23 11:36:19 +01004188 int n, /* Args already pushed */
Victor Stinnerad9a0662013-11-19 22:23:20 +01004189 asdl_seq *args,
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004190 asdl_seq *keywords)
Guido van Rossum52cc1d82007-03-18 15:41:51 +00004191{
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004192 Py_ssize_t i, nseen, nelts, nkwelts;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004193
Pablo Galindo254ec782020-04-03 20:37:13 +01004194 if (validate_keywords(c, keywords) == -1) {
4195 return 0;
4196 }
4197
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004198 nelts = asdl_seq_LEN(args);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004199 nkwelts = asdl_seq_LEN(keywords);
4200
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004201 for (i = 0; i < nelts; i++) {
4202 expr_ty elt = asdl_seq_GET(args, i);
4203 if (elt->kind == Starred_kind) {
Mark Shannon13bc1392020-01-23 09:25:17 +00004204 goto ex_call;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004205 }
Mark Shannon13bc1392020-01-23 09:25:17 +00004206 }
4207 for (i = 0; i < nkwelts; i++) {
4208 keyword_ty kw = asdl_seq_GET(keywords, i);
4209 if (kw->arg == NULL) {
4210 goto ex_call;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004211 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004212 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004213
Mark Shannon13bc1392020-01-23 09:25:17 +00004214 /* No * or ** args, so can use faster calling sequence */
4215 for (i = 0; i < nelts; i++) {
4216 expr_ty elt = asdl_seq_GET(args, i);
4217 assert(elt->kind != Starred_kind);
4218 VISIT(c, expr, elt);
4219 }
4220 if (nkwelts) {
4221 PyObject *names;
4222 VISIT_SEQ(c, keyword, keywords);
4223 names = PyTuple_New(nkwelts);
4224 if (names == NULL) {
4225 return 0;
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004226 }
Mark Shannon13bc1392020-01-23 09:25:17 +00004227 for (i = 0; i < nkwelts; i++) {
4228 keyword_ty kw = asdl_seq_GET(keywords, i);
4229 Py_INCREF(kw->arg);
4230 PyTuple_SET_ITEM(names, i, kw->arg);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004231 }
Mark Shannon13bc1392020-01-23 09:25:17 +00004232 ADDOP_LOAD_CONST_NEW(c, names);
4233 ADDOP_I(c, CALL_FUNCTION_KW, n + nelts + nkwelts);
4234 return 1;
4235 }
4236 else {
4237 ADDOP_I(c, CALL_FUNCTION, n + nelts);
4238 return 1;
4239 }
4240
4241ex_call:
4242
4243 /* Do positional arguments. */
4244 if (n ==0 && nelts == 1 && ((expr_ty)asdl_seq_GET(args, 0))->kind == Starred_kind) {
4245 VISIT(c, expr, ((expr_ty)asdl_seq_GET(args, 0))->v.Starred.value);
4246 }
4247 else if (starunpack_helper(c, args, n, BUILD_LIST,
4248 LIST_APPEND, LIST_EXTEND, 1) == 0) {
4249 return 0;
4250 }
4251 /* Then keyword arguments */
4252 if (nkwelts) {
Mark Shannon8a4cd702020-01-27 09:57:45 +00004253 /* Has a new dict been pushed */
4254 int have_dict = 0;
Mark Shannon13bc1392020-01-23 09:25:17 +00004255
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004256 nseen = 0; /* the number of keyword arguments on the stack following */
4257 for (i = 0; i < nkwelts; i++) {
4258 keyword_ty kw = asdl_seq_GET(keywords, i);
4259 if (kw->arg == NULL) {
4260 /* A keyword argument unpacking. */
4261 if (nseen) {
Mark Shannon8a4cd702020-01-27 09:57:45 +00004262 if (!compiler_subkwargs(c, keywords, i - nseen, i)) {
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03004263 return 0;
Mark Shannon8a4cd702020-01-27 09:57:45 +00004264 }
4265 have_dict = 1;
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004266 nseen = 0;
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03004267 }
Mark Shannon8a4cd702020-01-27 09:57:45 +00004268 if (!have_dict) {
4269 ADDOP_I(c, BUILD_MAP, 0);
4270 have_dict = 1;
4271 }
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004272 VISIT(c, expr, kw->value);
Mark Shannon8a4cd702020-01-27 09:57:45 +00004273 ADDOP_I(c, DICT_MERGE, 1);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004274 }
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004275 else {
4276 nseen++;
4277 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004278 }
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004279 if (nseen) {
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03004280 /* Pack up any trailing keyword arguments. */
Mark Shannon8a4cd702020-01-27 09:57:45 +00004281 if (!compiler_subkwargs(c, keywords, nkwelts - nseen, nkwelts)) {
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03004282 return 0;
Mark Shannon8a4cd702020-01-27 09:57:45 +00004283 }
4284 if (have_dict) {
4285 ADDOP_I(c, DICT_MERGE, 1);
4286 }
4287 have_dict = 1;
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03004288 }
Mark Shannon8a4cd702020-01-27 09:57:45 +00004289 assert(have_dict);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004290 }
Mark Shannon13bc1392020-01-23 09:25:17 +00004291 ADDOP_I(c, CALL_FUNCTION_EX, nkwelts > 0);
4292 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004293}
4294
Nick Coghlan650f0d02007-04-15 12:05:43 +00004295
4296/* List and set comprehensions and generator expressions work by creating a
4297 nested function to perform the actual iteration. This means that the
4298 iteration variables don't leak into the current scope.
4299 The defined function is called immediately following its definition, with the
4300 result of that call being the result of the expression.
4301 The LC/SC version returns the populated container, while the GE version is
4302 flagged in symtable.c as a generator, so it returns the generator object
4303 when the function is called.
Nick Coghlan650f0d02007-04-15 12:05:43 +00004304
4305 Possible cleanups:
4306 - iterate over the generator sequence instead of using recursion
4307*/
4308
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004309
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004310static int
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004311compiler_comprehension_generator(struct compiler *c,
4312 asdl_seq *generators, int gen_index,
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004313 int depth,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004314 expr_ty elt, expr_ty val, int type)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004315{
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004316 comprehension_ty gen;
4317 gen = (comprehension_ty)asdl_seq_GET(generators, gen_index);
4318 if (gen->is_async) {
4319 return compiler_async_comprehension_generator(
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004320 c, generators, gen_index, depth, elt, val, type);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004321 } else {
4322 return compiler_sync_comprehension_generator(
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004323 c, generators, gen_index, depth, elt, val, type);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004324 }
4325}
4326
4327static int
4328compiler_sync_comprehension_generator(struct compiler *c,
4329 asdl_seq *generators, int gen_index,
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004330 int depth,
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004331 expr_ty elt, expr_ty val, int type)
4332{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004333 /* generate code for the iterator, then each of the ifs,
4334 and then write to the element */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004335
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004336 comprehension_ty gen;
4337 basicblock *start, *anchor, *skip, *if_cleanup;
Victor Stinnerad9a0662013-11-19 22:23:20 +01004338 Py_ssize_t i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004339
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004340 start = compiler_new_block(c);
4341 skip = compiler_new_block(c);
4342 if_cleanup = compiler_new_block(c);
4343 anchor = compiler_new_block(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004344
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004345 if (start == NULL || skip == NULL || if_cleanup == NULL ||
4346 anchor == NULL)
4347 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004348
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004349 gen = (comprehension_ty)asdl_seq_GET(generators, gen_index);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004350
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004351 if (gen_index == 0) {
4352 /* Receive outermost iter as an implicit argument */
4353 c->u->u_argcount = 1;
4354 ADDOP_I(c, LOAD_FAST, 0);
4355 }
4356 else {
4357 /* Sub-iter - calculate on the fly */
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004358 /* Fast path for the temporary variable assignment idiom:
4359 for y in [f(x)]
4360 */
4361 asdl_seq *elts;
4362 switch (gen->iter->kind) {
4363 case List_kind:
4364 elts = gen->iter->v.List.elts;
4365 break;
4366 case Tuple_kind:
4367 elts = gen->iter->v.Tuple.elts;
4368 break;
4369 default:
4370 elts = NULL;
4371 }
4372 if (asdl_seq_LEN(elts) == 1) {
4373 expr_ty elt = asdl_seq_GET(elts, 0);
4374 if (elt->kind != Starred_kind) {
4375 VISIT(c, expr, elt);
4376 start = NULL;
4377 }
4378 }
4379 if (start) {
4380 VISIT(c, expr, gen->iter);
4381 ADDOP(c, GET_ITER);
4382 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004383 }
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004384 if (start) {
4385 depth++;
4386 compiler_use_next_block(c, start);
4387 ADDOP_JREL(c, FOR_ITER, anchor);
4388 NEXT_BLOCK(c);
4389 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004390 VISIT(c, expr, gen->target);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004391
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004392 /* XXX this needs to be cleaned up...a lot! */
4393 n = asdl_seq_LEN(gen->ifs);
4394 for (i = 0; i < n; i++) {
4395 expr_ty e = (expr_ty)asdl_seq_GET(gen->ifs, i);
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03004396 if (!compiler_jump_if(c, e, if_cleanup, 0))
4397 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004398 NEXT_BLOCK(c);
4399 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004400
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004401 if (++gen_index < asdl_seq_LEN(generators))
4402 if (!compiler_comprehension_generator(c,
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004403 generators, gen_index, depth,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004404 elt, val, type))
4405 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004406
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004407 /* only append after the last for generator */
4408 if (gen_index >= asdl_seq_LEN(generators)) {
4409 /* comprehension specific code */
4410 switch (type) {
4411 case COMP_GENEXP:
4412 VISIT(c, expr, elt);
4413 ADDOP(c, YIELD_VALUE);
4414 ADDOP(c, POP_TOP);
4415 break;
4416 case COMP_LISTCOMP:
4417 VISIT(c, expr, elt);
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004418 ADDOP_I(c, LIST_APPEND, depth + 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004419 break;
4420 case COMP_SETCOMP:
4421 VISIT(c, expr, elt);
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004422 ADDOP_I(c, SET_ADD, depth + 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004423 break;
4424 case COMP_DICTCOMP:
Jörn Heisslerc8a35412019-06-22 16:40:55 +02004425 /* With '{k: v}', k is evaluated before v, so we do
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004426 the same. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004427 VISIT(c, expr, elt);
Jörn Heisslerc8a35412019-06-22 16:40:55 +02004428 VISIT(c, expr, val);
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004429 ADDOP_I(c, MAP_ADD, depth + 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004430 break;
4431 default:
4432 return 0;
4433 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004434
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004435 compiler_use_next_block(c, skip);
4436 }
4437 compiler_use_next_block(c, if_cleanup);
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004438 if (start) {
4439 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
4440 compiler_use_next_block(c, anchor);
4441 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004442
4443 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004444}
4445
4446static int
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004447compiler_async_comprehension_generator(struct compiler *c,
4448 asdl_seq *generators, int gen_index,
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004449 int depth,
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004450 expr_ty elt, expr_ty val, int type)
4451{
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004452 comprehension_ty gen;
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02004453 basicblock *start, *if_cleanup, *except;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004454 Py_ssize_t i, n;
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02004455 start = compiler_new_block(c);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004456 except = compiler_new_block(c);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004457 if_cleanup = compiler_new_block(c);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004458
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02004459 if (start == NULL || if_cleanup == NULL || except == NULL) {
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004460 return 0;
4461 }
4462
4463 gen = (comprehension_ty)asdl_seq_GET(generators, gen_index);
4464
4465 if (gen_index == 0) {
4466 /* Receive outermost iter as an implicit argument */
4467 c->u->u_argcount = 1;
4468 ADDOP_I(c, LOAD_FAST, 0);
4469 }
4470 else {
4471 /* Sub-iter - calculate on the fly */
4472 VISIT(c, expr, gen->iter);
4473 ADDOP(c, GET_AITER);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004474 }
4475
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02004476 compiler_use_next_block(c, start);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004477
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004478 ADDOP_JREL(c, SETUP_FINALLY, except);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004479 ADDOP(c, GET_ANEXT);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03004480 ADDOP_LOAD_CONST(c, Py_None);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004481 ADDOP(c, YIELD_FROM);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004482 ADDOP(c, POP_BLOCK);
Serhiy Storchaka24d32012018-03-10 18:22:34 +02004483 VISIT(c, expr, gen->target);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004484
4485 n = asdl_seq_LEN(gen->ifs);
4486 for (i = 0; i < n; i++) {
4487 expr_ty e = (expr_ty)asdl_seq_GET(gen->ifs, i);
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03004488 if (!compiler_jump_if(c, e, if_cleanup, 0))
4489 return 0;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004490 NEXT_BLOCK(c);
4491 }
4492
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004493 depth++;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004494 if (++gen_index < asdl_seq_LEN(generators))
4495 if (!compiler_comprehension_generator(c,
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004496 generators, gen_index, depth,
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004497 elt, val, type))
4498 return 0;
4499
4500 /* only append after the last for generator */
4501 if (gen_index >= asdl_seq_LEN(generators)) {
4502 /* comprehension specific code */
4503 switch (type) {
4504 case COMP_GENEXP:
4505 VISIT(c, expr, elt);
4506 ADDOP(c, YIELD_VALUE);
4507 ADDOP(c, POP_TOP);
4508 break;
4509 case COMP_LISTCOMP:
4510 VISIT(c, expr, elt);
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004511 ADDOP_I(c, LIST_APPEND, depth + 1);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004512 break;
4513 case COMP_SETCOMP:
4514 VISIT(c, expr, elt);
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004515 ADDOP_I(c, SET_ADD, depth + 1);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004516 break;
4517 case COMP_DICTCOMP:
Jörn Heisslerc8a35412019-06-22 16:40:55 +02004518 /* With '{k: v}', k is evaluated before v, so we do
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004519 the same. */
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004520 VISIT(c, expr, elt);
Jörn Heisslerc8a35412019-06-22 16:40:55 +02004521 VISIT(c, expr, val);
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004522 ADDOP_I(c, MAP_ADD, depth + 1);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004523 break;
4524 default:
4525 return 0;
4526 }
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004527 }
4528 compiler_use_next_block(c, if_cleanup);
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02004529 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
4530
4531 compiler_use_next_block(c, except);
4532 ADDOP(c, END_ASYNC_FOR);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004533
4534 return 1;
4535}
4536
4537static int
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004538compiler_comprehension(struct compiler *c, expr_ty e, int type,
4539 identifier name, asdl_seq *generators, expr_ty elt,
4540 expr_ty val)
Nick Coghlan650f0d02007-04-15 12:05:43 +00004541{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004542 PyCodeObject *co = NULL;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004543 comprehension_ty outermost;
Antoine Pitrou86a36b52011-11-25 18:56:07 +01004544 PyObject *qualname = NULL;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004545 int is_async_generator = 0;
Nick Coghlan650f0d02007-04-15 12:05:43 +00004546
Batuhan TaÅŸkaya9052f7a2020-03-19 14:35:44 +03004547 if (IS_TOP_LEVEL_AWAIT(c)) {
4548 c->u->u_ste->ste_coroutine = 1;
4549 }
4550 int is_async_function = c->u->u_ste->ste_coroutine;
Nick Coghlan650f0d02007-04-15 12:05:43 +00004551
Batuhan TaÅŸkaya9052f7a2020-03-19 14:35:44 +03004552 outermost = (comprehension_ty) asdl_seq_GET(generators, 0);
Antoine Pitrou86a36b52011-11-25 18:56:07 +01004553 if (!compiler_enter_scope(c, name, COMPILER_SCOPE_COMPREHENSION,
4554 (void *)e, e->lineno))
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004555 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004556 goto error;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004557 }
4558
4559 is_async_generator = c->u->u_ste->ste_coroutine;
4560
Yury Selivanovb8ab9d32017-10-06 02:58:28 -04004561 if (is_async_generator && !is_async_function && type != COMP_GENEXP) {
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004562 compiler_error(c, "asynchronous comprehension outside of "
4563 "an asynchronous function");
4564 goto error_in_scope;
4565 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00004566
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004567 if (type != COMP_GENEXP) {
4568 int op;
4569 switch (type) {
4570 case COMP_LISTCOMP:
4571 op = BUILD_LIST;
4572 break;
4573 case COMP_SETCOMP:
4574 op = BUILD_SET;
4575 break;
4576 case COMP_DICTCOMP:
4577 op = BUILD_MAP;
4578 break;
4579 default:
4580 PyErr_Format(PyExc_SystemError,
4581 "unknown comprehension type %d", type);
4582 goto error_in_scope;
4583 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00004584
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004585 ADDOP_I(c, op, 0);
4586 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00004587
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004588 if (!compiler_comprehension_generator(c, generators, 0, 0, elt,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004589 val, type))
4590 goto error_in_scope;
Nick Coghlan650f0d02007-04-15 12:05:43 +00004591
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004592 if (type != COMP_GENEXP) {
4593 ADDOP(c, RETURN_VALUE);
4594 }
4595
4596 co = assemble(c, 1);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04004597 qualname = c->u->u_qualname;
4598 Py_INCREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004599 compiler_exit_scope(c);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04004600 if (co == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004601 goto error;
4602
Antoine Pitrou86a36b52011-11-25 18:56:07 +01004603 if (!compiler_make_closure(c, co, 0, qualname))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004604 goto error;
Antoine Pitrou86a36b52011-11-25 18:56:07 +01004605 Py_DECREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004606 Py_DECREF(co);
4607
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004608 VISIT(c, expr, outermost->iter);
4609
4610 if (outermost->is_async) {
4611 ADDOP(c, GET_AITER);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004612 } else {
4613 ADDOP(c, GET_ITER);
4614 }
4615
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004616 ADDOP_I(c, CALL_FUNCTION, 1);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004617
4618 if (is_async_generator && type != COMP_GENEXP) {
4619 ADDOP(c, GET_AWAITABLE);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03004620 ADDOP_LOAD_CONST(c, Py_None);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004621 ADDOP(c, YIELD_FROM);
4622 }
4623
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004624 return 1;
Nick Coghlan650f0d02007-04-15 12:05:43 +00004625error_in_scope:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004626 compiler_exit_scope(c);
Nick Coghlan650f0d02007-04-15 12:05:43 +00004627error:
Antoine Pitrou86a36b52011-11-25 18:56:07 +01004628 Py_XDECREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004629 Py_XDECREF(co);
4630 return 0;
Nick Coghlan650f0d02007-04-15 12:05:43 +00004631}
4632
4633static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004634compiler_genexp(struct compiler *c, expr_ty e)
4635{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004636 static identifier name;
4637 if (!name) {
Zackery Spytzf3036392018-04-15 16:12:29 -06004638 name = PyUnicode_InternFromString("<genexpr>");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004639 if (!name)
4640 return 0;
4641 }
4642 assert(e->kind == GeneratorExp_kind);
4643 return compiler_comprehension(c, e, COMP_GENEXP, name,
4644 e->v.GeneratorExp.generators,
4645 e->v.GeneratorExp.elt, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004646}
4647
4648static int
Nick Coghlan650f0d02007-04-15 12:05:43 +00004649compiler_listcomp(struct compiler *c, expr_ty e)
4650{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004651 static identifier name;
4652 if (!name) {
Zackery Spytzf3036392018-04-15 16:12:29 -06004653 name = PyUnicode_InternFromString("<listcomp>");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004654 if (!name)
4655 return 0;
4656 }
4657 assert(e->kind == ListComp_kind);
4658 return compiler_comprehension(c, e, COMP_LISTCOMP, name,
4659 e->v.ListComp.generators,
4660 e->v.ListComp.elt, NULL);
Nick Coghlan650f0d02007-04-15 12:05:43 +00004661}
4662
4663static int
4664compiler_setcomp(struct compiler *c, expr_ty e)
4665{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004666 static identifier name;
4667 if (!name) {
Zackery Spytzf3036392018-04-15 16:12:29 -06004668 name = PyUnicode_InternFromString("<setcomp>");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004669 if (!name)
4670 return 0;
4671 }
4672 assert(e->kind == SetComp_kind);
4673 return compiler_comprehension(c, e, COMP_SETCOMP, name,
4674 e->v.SetComp.generators,
4675 e->v.SetComp.elt, NULL);
Guido van Rossum992d4a32007-07-11 13:09:30 +00004676}
4677
4678
4679static int
4680compiler_dictcomp(struct compiler *c, expr_ty e)
4681{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004682 static identifier name;
4683 if (!name) {
Zackery Spytzf3036392018-04-15 16:12:29 -06004684 name = PyUnicode_InternFromString("<dictcomp>");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004685 if (!name)
4686 return 0;
4687 }
4688 assert(e->kind == DictComp_kind);
4689 return compiler_comprehension(c, e, COMP_DICTCOMP, name,
4690 e->v.DictComp.generators,
4691 e->v.DictComp.key, e->v.DictComp.value);
Nick Coghlan650f0d02007-04-15 12:05:43 +00004692}
4693
4694
4695static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004696compiler_visit_keyword(struct compiler *c, keyword_ty k)
4697{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004698 VISIT(c, expr, k->value);
4699 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004700}
4701
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004702/* Test whether expression is constant. For constants, report
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004703 whether they are true or false.
4704
4705 Return values: 1 for true, 0 for false, -1 for non-constant.
4706 */
4707
4708static int
Serhiy Storchaka3dfbaf52017-12-25 12:47:50 +02004709expr_constant(expr_ty e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004710{
Serhiy Storchaka3f228112018-09-27 17:42:37 +03004711 if (e->kind == Constant_kind) {
4712 return PyObject_IsTrue(e->v.Constant.value);
Benjamin Peterson442f2092012-12-06 17:41:04 -05004713 }
Serhiy Storchaka3325a672017-12-15 12:35:48 +02004714 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004715}
4716
Mark Shannonfee55262019-11-21 09:11:43 +00004717static int
4718compiler_with_except_finish(struct compiler *c) {
4719 basicblock *exit;
4720 exit = compiler_new_block(c);
4721 if (exit == NULL)
4722 return 0;
4723 ADDOP_JABS(c, POP_JUMP_IF_TRUE, exit);
4724 ADDOP(c, RERAISE);
4725 compiler_use_next_block(c, exit);
4726 ADDOP(c, POP_TOP);
4727 ADDOP(c, POP_TOP);
4728 ADDOP(c, POP_TOP);
4729 ADDOP(c, POP_EXCEPT);
4730 ADDOP(c, POP_TOP);
4731 return 1;
4732}
Yury Selivanov75445082015-05-11 22:57:16 -04004733
4734/*
4735 Implements the async with statement.
4736
4737 The semantics outlined in that PEP are as follows:
4738
4739 async with EXPR as VAR:
4740 BLOCK
4741
4742 It is implemented roughly as:
4743
4744 context = EXPR
4745 exit = context.__aexit__ # not calling it
4746 value = await context.__aenter__()
4747 try:
4748 VAR = value # if VAR present in the syntax
4749 BLOCK
4750 finally:
4751 if an exception was raised:
Serhiy Storchakaec466a12015-06-11 00:09:32 +03004752 exc = copy of (exception, instance, traceback)
Yury Selivanov75445082015-05-11 22:57:16 -04004753 else:
Serhiy Storchakaec466a12015-06-11 00:09:32 +03004754 exc = (None, None, None)
Yury Selivanov75445082015-05-11 22:57:16 -04004755 if not (await exit(*exc)):
4756 raise
4757 */
4758static int
4759compiler_async_with(struct compiler *c, stmt_ty s, int pos)
4760{
Mark Shannonfee55262019-11-21 09:11:43 +00004761 basicblock *block, *final, *exit;
Yury Selivanov75445082015-05-11 22:57:16 -04004762 withitem_ty item = asdl_seq_GET(s->v.AsyncWith.items, pos);
4763
4764 assert(s->kind == AsyncWith_kind);
Pablo Galindo90235812020-03-15 04:29:22 +00004765 if (IS_TOP_LEVEL_AWAIT(c)){
Matthias Bussonnier565b4f12019-05-21 13:12:03 -07004766 c->u->u_ste->ste_coroutine = 1;
4767 } else if (c->u->u_scope_type != COMPILER_SCOPE_ASYNC_FUNCTION){
Zsolt Dollensteine2396502018-04-27 08:58:56 -07004768 return compiler_error(c, "'async with' outside async function");
4769 }
Yury Selivanov75445082015-05-11 22:57:16 -04004770
4771 block = compiler_new_block(c);
Mark Shannonfee55262019-11-21 09:11:43 +00004772 final = compiler_new_block(c);
4773 exit = compiler_new_block(c);
4774 if (!block || !final || !exit)
Yury Selivanov75445082015-05-11 22:57:16 -04004775 return 0;
4776
4777 /* Evaluate EXPR */
4778 VISIT(c, expr, item->context_expr);
4779
4780 ADDOP(c, BEFORE_ASYNC_WITH);
4781 ADDOP(c, GET_AWAITABLE);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03004782 ADDOP_LOAD_CONST(c, Py_None);
Yury Selivanov75445082015-05-11 22:57:16 -04004783 ADDOP(c, YIELD_FROM);
4784
Mark Shannonfee55262019-11-21 09:11:43 +00004785 ADDOP_JREL(c, SETUP_ASYNC_WITH, final);
Yury Selivanov75445082015-05-11 22:57:16 -04004786
4787 /* SETUP_ASYNC_WITH pushes a finally block. */
4788 compiler_use_next_block(c, block);
Mark Shannonfee55262019-11-21 09:11:43 +00004789 if (!compiler_push_fblock(c, ASYNC_WITH, block, final, NULL)) {
Yury Selivanov75445082015-05-11 22:57:16 -04004790 return 0;
4791 }
4792
4793 if (item->optional_vars) {
4794 VISIT(c, expr, item->optional_vars);
4795 }
4796 else {
4797 /* Discard result from context.__aenter__() */
4798 ADDOP(c, POP_TOP);
4799 }
4800
4801 pos++;
4802 if (pos == asdl_seq_LEN(s->v.AsyncWith.items))
4803 /* BLOCK code */
4804 VISIT_SEQ(c, stmt, s->v.AsyncWith.body)
4805 else if (!compiler_async_with(c, s, pos))
4806 return 0;
4807
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004808 compiler_pop_fblock(c, ASYNC_WITH, block);
Mark Shannonfee55262019-11-21 09:11:43 +00004809 ADDOP(c, POP_BLOCK);
4810 /* End of body; start the cleanup */
Yury Selivanov75445082015-05-11 22:57:16 -04004811
Mark Shannonfee55262019-11-21 09:11:43 +00004812 /* For successful outcome:
4813 * call __exit__(None, None, None)
4814 */
4815 if(!compiler_call_exit_with_nones(c))
Yury Selivanov75445082015-05-11 22:57:16 -04004816 return 0;
Mark Shannonfee55262019-11-21 09:11:43 +00004817 ADDOP(c, GET_AWAITABLE);
4818 ADDOP_O(c, LOAD_CONST, Py_None, consts);
4819 ADDOP(c, YIELD_FROM);
Yury Selivanov75445082015-05-11 22:57:16 -04004820
Mark Shannonfee55262019-11-21 09:11:43 +00004821 ADDOP(c, POP_TOP);
Yury Selivanov75445082015-05-11 22:57:16 -04004822
Mark Shannonfee55262019-11-21 09:11:43 +00004823 ADDOP_JABS(c, JUMP_ABSOLUTE, exit);
4824
4825 /* For exceptional outcome: */
4826 compiler_use_next_block(c, final);
4827
4828 ADDOP(c, WITH_EXCEPT_START);
Yury Selivanov75445082015-05-11 22:57:16 -04004829 ADDOP(c, GET_AWAITABLE);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03004830 ADDOP_LOAD_CONST(c, Py_None);
Yury Selivanov75445082015-05-11 22:57:16 -04004831 ADDOP(c, YIELD_FROM);
Mark Shannonfee55262019-11-21 09:11:43 +00004832 compiler_with_except_finish(c);
Yury Selivanov75445082015-05-11 22:57:16 -04004833
Mark Shannonfee55262019-11-21 09:11:43 +00004834compiler_use_next_block(c, exit);
Yury Selivanov75445082015-05-11 22:57:16 -04004835 return 1;
4836}
4837
4838
Guido van Rossumc2e20742006-02-27 22:32:47 +00004839/*
4840 Implements the with statement from PEP 343.
Guido van Rossumc2e20742006-02-27 22:32:47 +00004841 with EXPR as VAR:
4842 BLOCK
Mark Shannonfee55262019-11-21 09:11:43 +00004843 is implemented as:
4844 <code for EXPR>
4845 SETUP_WITH E
4846 <code to store to VAR> or POP_TOP
4847 <code for BLOCK>
4848 LOAD_CONST (None, None, None)
4849 CALL_FUNCTION_EX 0
4850 JUMP_FORWARD EXIT
4851 E: WITH_EXCEPT_START (calls EXPR.__exit__)
4852 POP_JUMP_IF_TRUE T:
4853 RERAISE
4854 T: POP_TOP * 3 (remove exception from stack)
4855 POP_EXCEPT
4856 POP_TOP
4857 EXIT:
Guido van Rossumc2e20742006-02-27 22:32:47 +00004858 */
Mark Shannonfee55262019-11-21 09:11:43 +00004859
Guido van Rossumc2e20742006-02-27 22:32:47 +00004860static int
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004861compiler_with(struct compiler *c, stmt_ty s, int pos)
Guido van Rossumc2e20742006-02-27 22:32:47 +00004862{
Mark Shannonfee55262019-11-21 09:11:43 +00004863 basicblock *block, *final, *exit;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004864 withitem_ty item = asdl_seq_GET(s->v.With.items, pos);
Guido van Rossumc2e20742006-02-27 22:32:47 +00004865
4866 assert(s->kind == With_kind);
4867
Guido van Rossumc2e20742006-02-27 22:32:47 +00004868 block = compiler_new_block(c);
Mark Shannonfee55262019-11-21 09:11:43 +00004869 final = compiler_new_block(c);
4870 exit = compiler_new_block(c);
4871 if (!block || !final || !exit)
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00004872 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00004873
Thomas Wouters477c8d52006-05-27 19:21:47 +00004874 /* Evaluate EXPR */
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004875 VISIT(c, expr, item->context_expr);
Mark Shannonfee55262019-11-21 09:11:43 +00004876 /* Will push bound __exit__ */
4877 ADDOP_JREL(c, SETUP_WITH, final);
Guido van Rossumc2e20742006-02-27 22:32:47 +00004878
Benjamin Peterson876b2f22009-06-28 03:18:59 +00004879 /* SETUP_WITH pushes a finally block. */
Guido van Rossumc2e20742006-02-27 22:32:47 +00004880 compiler_use_next_block(c, block);
Mark Shannonfee55262019-11-21 09:11:43 +00004881 if (!compiler_push_fblock(c, WITH, block, final, NULL)) {
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00004882 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00004883 }
4884
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004885 if (item->optional_vars) {
4886 VISIT(c, expr, item->optional_vars);
Benjamin Peterson876b2f22009-06-28 03:18:59 +00004887 }
4888 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004889 /* Discard result from context.__enter__() */
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00004890 ADDOP(c, POP_TOP);
Guido van Rossumc2e20742006-02-27 22:32:47 +00004891 }
4892
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004893 pos++;
4894 if (pos == asdl_seq_LEN(s->v.With.items))
4895 /* BLOCK code */
4896 VISIT_SEQ(c, stmt, s->v.With.body)
4897 else if (!compiler_with(c, s, pos))
4898 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00004899
Guido van Rossumc2e20742006-02-27 22:32:47 +00004900 ADDOP(c, POP_BLOCK);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004901 compiler_pop_fblock(c, WITH, block);
Mark Shannon13bc1392020-01-23 09:25:17 +00004902
Mark Shannonfee55262019-11-21 09:11:43 +00004903 /* End of body; start the cleanup. */
Mark Shannon13bc1392020-01-23 09:25:17 +00004904
Mark Shannonfee55262019-11-21 09:11:43 +00004905 /* For successful outcome:
4906 * call __exit__(None, None, None)
4907 */
4908 if (!compiler_call_exit_with_nones(c))
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00004909 return 0;
Mark Shannonfee55262019-11-21 09:11:43 +00004910 ADDOP(c, POP_TOP);
4911 ADDOP_JREL(c, JUMP_FORWARD, exit);
Guido van Rossumc2e20742006-02-27 22:32:47 +00004912
Mark Shannonfee55262019-11-21 09:11:43 +00004913 /* For exceptional outcome: */
4914 compiler_use_next_block(c, final);
Guido van Rossumc2e20742006-02-27 22:32:47 +00004915
Mark Shannonfee55262019-11-21 09:11:43 +00004916 ADDOP(c, WITH_EXCEPT_START);
4917 compiler_with_except_finish(c);
4918
4919 compiler_use_next_block(c, exit);
Guido van Rossumc2e20742006-02-27 22:32:47 +00004920 return 1;
4921}
4922
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004923static int
Serhiy Storchakada8d72c2018-09-17 15:17:29 +03004924compiler_visit_expr1(struct compiler *c, expr_ty e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004925{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004926 switch (e->kind) {
Emily Morehouse8f59ee02019-01-24 16:49:56 -07004927 case NamedExpr_kind:
4928 VISIT(c, expr, e->v.NamedExpr.value);
4929 ADDOP(c, DUP_TOP);
4930 VISIT(c, expr, e->v.NamedExpr.target);
4931 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004932 case BoolOp_kind:
4933 return compiler_boolop(c, e);
4934 case BinOp_kind:
4935 VISIT(c, expr, e->v.BinOp.left);
4936 VISIT(c, expr, e->v.BinOp.right);
Andy Lester76d58772020-03-10 21:18:12 -05004937 ADDOP(c, binop(e->v.BinOp.op));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004938 break;
4939 case UnaryOp_kind:
4940 VISIT(c, expr, e->v.UnaryOp.operand);
4941 ADDOP(c, unaryop(e->v.UnaryOp.op));
4942 break;
4943 case Lambda_kind:
4944 return compiler_lambda(c, e);
4945 case IfExp_kind:
4946 return compiler_ifexp(c, e);
4947 case Dict_kind:
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004948 return compiler_dict(c, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004949 case Set_kind:
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004950 return compiler_set(c, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004951 case GeneratorExp_kind:
4952 return compiler_genexp(c, e);
4953 case ListComp_kind:
4954 return compiler_listcomp(c, e);
4955 case SetComp_kind:
4956 return compiler_setcomp(c, e);
4957 case DictComp_kind:
4958 return compiler_dictcomp(c, e);
4959 case Yield_kind:
4960 if (c->u->u_ste->ste_type != FunctionBlock)
4961 return compiler_error(c, "'yield' outside function");
Mark Dickinsonded35ae2012-11-25 14:36:26 +00004962 if (e->v.Yield.value) {
4963 VISIT(c, expr, e->v.Yield.value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004964 }
4965 else {
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03004966 ADDOP_LOAD_CONST(c, Py_None);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004967 }
Mark Dickinsonded35ae2012-11-25 14:36:26 +00004968 ADDOP(c, YIELD_VALUE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004969 break;
Mark Dickinsonded35ae2012-11-25 14:36:26 +00004970 case YieldFrom_kind:
4971 if (c->u->u_ste->ste_type != FunctionBlock)
4972 return compiler_error(c, "'yield' outside function");
Yury Selivanov75445082015-05-11 22:57:16 -04004973
4974 if (c->u->u_scope_type == COMPILER_SCOPE_ASYNC_FUNCTION)
4975 return compiler_error(c, "'yield from' inside async function");
4976
Mark Dickinsonded35ae2012-11-25 14:36:26 +00004977 VISIT(c, expr, e->v.YieldFrom.value);
Yury Selivanov5376ba92015-06-22 12:19:30 -04004978 ADDOP(c, GET_YIELD_FROM_ITER);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03004979 ADDOP_LOAD_CONST(c, Py_None);
Mark Dickinsonded35ae2012-11-25 14:36:26 +00004980 ADDOP(c, YIELD_FROM);
4981 break;
Yury Selivanov75445082015-05-11 22:57:16 -04004982 case Await_kind:
Pablo Galindo90235812020-03-15 04:29:22 +00004983 if (!IS_TOP_LEVEL_AWAIT(c)){
Matthias Bussonnier565b4f12019-05-21 13:12:03 -07004984 if (c->u->u_ste->ste_type != FunctionBlock){
4985 return compiler_error(c, "'await' outside function");
4986 }
Yury Selivanov75445082015-05-11 22:57:16 -04004987
Victor Stinner331a6a52019-05-27 16:39:22 +02004988 if (c->u->u_scope_type != COMPILER_SCOPE_ASYNC_FUNCTION &&
Matthias Bussonnier565b4f12019-05-21 13:12:03 -07004989 c->u->u_scope_type != COMPILER_SCOPE_COMPREHENSION){
4990 return compiler_error(c, "'await' outside async function");
4991 }
4992 }
Yury Selivanov75445082015-05-11 22:57:16 -04004993
4994 VISIT(c, expr, e->v.Await.value);
4995 ADDOP(c, GET_AWAITABLE);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03004996 ADDOP_LOAD_CONST(c, Py_None);
Yury Selivanov75445082015-05-11 22:57:16 -04004997 ADDOP(c, YIELD_FROM);
4998 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004999 case Compare_kind:
5000 return compiler_compare(c, e);
5001 case Call_kind:
5002 return compiler_call(c, e);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01005003 case Constant_kind:
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005004 ADDOP_LOAD_CONST(c, e->v.Constant.value);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01005005 break;
Eric V. Smith235a6f02015-09-19 14:51:32 -04005006 case JoinedStr_kind:
5007 return compiler_joined_str(c, e);
5008 case FormattedValue_kind:
5009 return compiler_formatted_value(c, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005010 /* The following exprs can be assignment targets. */
5011 case Attribute_kind:
Serhiy Storchaka6b975982020-03-17 23:41:08 +02005012 VISIT(c, expr, e->v.Attribute.value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005013 switch (e->v.Attribute.ctx) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005014 case Load:
5015 ADDOP_NAME(c, LOAD_ATTR, e->v.Attribute.attr, names);
5016 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005017 case Store:
5018 ADDOP_NAME(c, STORE_ATTR, e->v.Attribute.attr, names);
5019 break;
5020 case Del:
5021 ADDOP_NAME(c, DELETE_ATTR, e->v.Attribute.attr, names);
5022 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005023 }
5024 break;
5025 case Subscript_kind:
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005026 return compiler_subscript(c, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005027 case Starred_kind:
5028 switch (e->v.Starred.ctx) {
5029 case Store:
5030 /* In all legitimate cases, the Starred node was already replaced
5031 * by compiler_list/compiler_tuple. XXX: is that okay? */
5032 return compiler_error(c,
5033 "starred assignment target must be in a list or tuple");
5034 default:
5035 return compiler_error(c,
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04005036 "can't use starred expression here");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005037 }
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005038 break;
5039 case Slice_kind:
5040 return compiler_slice(c, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005041 case Name_kind:
5042 return compiler_nameop(c, e->v.Name.id, e->v.Name.ctx);
5043 /* child nodes of List and Tuple will have expr_context set */
5044 case List_kind:
5045 return compiler_list(c, e);
5046 case Tuple_kind:
5047 return compiler_tuple(c, e);
5048 }
5049 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005050}
5051
5052static int
Serhiy Storchakada8d72c2018-09-17 15:17:29 +03005053compiler_visit_expr(struct compiler *c, expr_ty e)
5054{
Serhiy Storchakada8d72c2018-09-17 15:17:29 +03005055 int old_lineno = c->u->u_lineno;
5056 int old_col_offset = c->u->u_col_offset;
Serhiy Storchaka61cb3d02020-03-17 18:07:30 +02005057 SET_LOC(c, e);
Serhiy Storchakada8d72c2018-09-17 15:17:29 +03005058 int res = compiler_visit_expr1(c, e);
Serhiy Storchaka61cb3d02020-03-17 18:07:30 +02005059 c->u->u_lineno = old_lineno;
Serhiy Storchakada8d72c2018-09-17 15:17:29 +03005060 c->u->u_col_offset = old_col_offset;
5061 return res;
5062}
5063
5064static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005065compiler_augassign(struct compiler *c, stmt_ty s)
5066{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005067 assert(s->kind == AugAssign_kind);
Serhiy Storchaka6b975982020-03-17 23:41:08 +02005068 expr_ty e = s->v.AugAssign.target;
5069
5070 int old_lineno = c->u->u_lineno;
5071 int old_col_offset = c->u->u_col_offset;
5072 SET_LOC(c, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005073
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005074 switch (e->kind) {
5075 case Attribute_kind:
Serhiy Storchaka6b975982020-03-17 23:41:08 +02005076 VISIT(c, expr, e->v.Attribute.value);
5077 ADDOP(c, DUP_TOP);
5078 ADDOP_NAME(c, LOAD_ATTR, e->v.Attribute.attr, names);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005079 break;
5080 case Subscript_kind:
Serhiy Storchaka6b975982020-03-17 23:41:08 +02005081 VISIT(c, expr, e->v.Subscript.value);
5082 VISIT(c, expr, e->v.Subscript.slice);
5083 ADDOP(c, DUP_TOP_TWO);
5084 ADDOP(c, BINARY_SUBSCR);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005085 break;
5086 case Name_kind:
5087 if (!compiler_nameop(c, e->v.Name.id, Load))
5088 return 0;
Serhiy Storchaka6b975982020-03-17 23:41:08 +02005089 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005090 default:
5091 PyErr_Format(PyExc_SystemError,
5092 "invalid node type (%d) for augmented assignment",
5093 e->kind);
5094 return 0;
5095 }
Serhiy Storchaka6b975982020-03-17 23:41:08 +02005096
5097 c->u->u_lineno = old_lineno;
5098 c->u->u_col_offset = old_col_offset;
5099
5100 VISIT(c, expr, s->v.AugAssign.value);
5101 ADDOP(c, inplace_binop(s->v.AugAssign.op));
5102
5103 SET_LOC(c, e);
5104
5105 switch (e->kind) {
5106 case Attribute_kind:
5107 ADDOP(c, ROT_TWO);
5108 ADDOP_NAME(c, STORE_ATTR, e->v.Attribute.attr, names);
5109 break;
5110 case Subscript_kind:
5111 ADDOP(c, ROT_THREE);
5112 ADDOP(c, STORE_SUBSCR);
5113 break;
5114 case Name_kind:
5115 return compiler_nameop(c, e->v.Name.id, Store);
5116 default:
5117 Py_UNREACHABLE();
5118 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005119 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005120}
5121
5122static int
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005123check_ann_expr(struct compiler *c, expr_ty e)
5124{
5125 VISIT(c, expr, e);
5126 ADDOP(c, POP_TOP);
5127 return 1;
5128}
5129
5130static int
5131check_annotation(struct compiler *c, stmt_ty s)
5132{
5133 /* Annotations are only evaluated in a module or class. */
5134 if (c->u->u_scope_type == COMPILER_SCOPE_MODULE ||
5135 c->u->u_scope_type == COMPILER_SCOPE_CLASS) {
5136 return check_ann_expr(c, s->v.AnnAssign.annotation);
5137 }
5138 return 1;
5139}
5140
5141static int
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005142check_ann_subscr(struct compiler *c, expr_ty e)
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005143{
5144 /* We check that everything in a subscript is defined at runtime. */
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005145 switch (e->kind) {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005146 case Slice_kind:
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005147 if (e->v.Slice.lower && !check_ann_expr(c, e->v.Slice.lower)) {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005148 return 0;
5149 }
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005150 if (e->v.Slice.upper && !check_ann_expr(c, e->v.Slice.upper)) {
5151 return 0;
5152 }
5153 if (e->v.Slice.step && !check_ann_expr(c, e->v.Slice.step)) {
5154 return 0;
5155 }
5156 return 1;
5157 case Tuple_kind: {
5158 /* extended slice */
5159 asdl_seq *elts = e->v.Tuple.elts;
5160 Py_ssize_t i, n = asdl_seq_LEN(elts);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005161 for (i = 0; i < n; i++) {
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005162 if (!check_ann_subscr(c, asdl_seq_GET(elts, i))) {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005163 return 0;
5164 }
5165 }
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005166 return 1;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005167 }
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005168 default:
5169 return check_ann_expr(c, e);
5170 }
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005171}
5172
5173static int
5174compiler_annassign(struct compiler *c, stmt_ty s)
5175{
5176 expr_ty targ = s->v.AnnAssign.target;
Guido van Rossum015d8742016-09-11 09:45:24 -07005177 PyObject* mangled;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005178
5179 assert(s->kind == AnnAssign_kind);
5180
5181 /* We perform the actual assignment first. */
5182 if (s->v.AnnAssign.value) {
5183 VISIT(c, expr, s->v.AnnAssign.value);
5184 VISIT(c, expr, targ);
5185 }
5186 switch (targ->kind) {
5187 case Name_kind:
5188 /* If we have a simple name in a module or class, store annotation. */
5189 if (s->v.AnnAssign.simple &&
5190 (c->u->u_scope_type == COMPILER_SCOPE_MODULE ||
5191 c->u->u_scope_type == COMPILER_SCOPE_CLASS)) {
Guido van Rossum95e4d582018-01-26 08:20:18 -08005192 if (c->c_future->ff_features & CO_FUTURE_ANNOTATIONS) {
5193 VISIT(c, annexpr, s->v.AnnAssign.annotation)
5194 }
5195 else {
5196 VISIT(c, expr, s->v.AnnAssign.annotation);
5197 }
Mark Shannon332cd5e2018-01-30 00:41:04 +00005198 ADDOP_NAME(c, LOAD_NAME, __annotations__, names);
Serhiy Storchakaa95d9862018-03-24 22:42:35 +02005199 mangled = _Py_Mangle(c->u->u_private, targ->v.Name.id);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005200 ADDOP_LOAD_CONST_NEW(c, mangled);
Mark Shannon332cd5e2018-01-30 00:41:04 +00005201 ADDOP(c, STORE_SUBSCR);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005202 }
5203 break;
5204 case Attribute_kind:
5205 if (!s->v.AnnAssign.value &&
5206 !check_ann_expr(c, targ->v.Attribute.value)) {
5207 return 0;
5208 }
5209 break;
5210 case Subscript_kind:
5211 if (!s->v.AnnAssign.value &&
5212 (!check_ann_expr(c, targ->v.Subscript.value) ||
5213 !check_ann_subscr(c, targ->v.Subscript.slice))) {
5214 return 0;
5215 }
5216 break;
5217 default:
5218 PyErr_Format(PyExc_SystemError,
5219 "invalid node type (%d) for annotated assignment",
5220 targ->kind);
5221 return 0;
5222 }
5223 /* Annotation is evaluated last. */
5224 if (!s->v.AnnAssign.simple && !check_annotation(c, s)) {
5225 return 0;
5226 }
5227 return 1;
5228}
5229
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005230/* Raises a SyntaxError and returns 0.
5231 If something goes wrong, a different exception may be raised.
5232*/
5233
5234static int
5235compiler_error(struct compiler *c, const char *errstr)
5236{
Benjamin Peterson43b06862011-05-27 09:08:01 -05005237 PyObject *loc;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005238 PyObject *u = NULL, *v = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005239
Victor Stinner14e461d2013-08-26 22:28:21 +02005240 loc = PyErr_ProgramTextObject(c->c_filename, c->u->u_lineno);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005241 if (!loc) {
5242 Py_INCREF(Py_None);
5243 loc = Py_None;
5244 }
Victor Stinner14e461d2013-08-26 22:28:21 +02005245 u = Py_BuildValue("(OiiO)", c->c_filename, c->u->u_lineno,
Ammar Askar025eb982018-09-24 17:12:49 -04005246 c->u->u_col_offset + 1, loc);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005247 if (!u)
5248 goto exit;
5249 v = Py_BuildValue("(zO)", errstr, u);
5250 if (!v)
5251 goto exit;
5252 PyErr_SetObject(PyExc_SyntaxError, v);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005253 exit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005254 Py_DECREF(loc);
5255 Py_XDECREF(u);
5256 Py_XDECREF(v);
5257 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005258}
5259
Serhiy Storchakad31e7732018-10-21 10:09:39 +03005260/* Emits a SyntaxWarning and returns 1 on success.
5261 If a SyntaxWarning raised as error, replaces it with a SyntaxError
5262 and returns 0.
5263*/
5264static int
Serhiy Storchaka62e44812019-02-16 08:12:19 +02005265compiler_warn(struct compiler *c, const char *format, ...)
Serhiy Storchakad31e7732018-10-21 10:09:39 +03005266{
Serhiy Storchaka62e44812019-02-16 08:12:19 +02005267 va_list vargs;
5268#ifdef HAVE_STDARG_PROTOTYPES
5269 va_start(vargs, format);
5270#else
5271 va_start(vargs);
5272#endif
5273 PyObject *msg = PyUnicode_FromFormatV(format, vargs);
5274 va_end(vargs);
Serhiy Storchakad31e7732018-10-21 10:09:39 +03005275 if (msg == NULL) {
5276 return 0;
5277 }
5278 if (PyErr_WarnExplicitObject(PyExc_SyntaxWarning, msg, c->c_filename,
5279 c->u->u_lineno, NULL, NULL) < 0)
5280 {
Serhiy Storchakad31e7732018-10-21 10:09:39 +03005281 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
Serhiy Storchaka62e44812019-02-16 08:12:19 +02005282 /* Replace the SyntaxWarning exception with a SyntaxError
5283 to get a more accurate error report */
Serhiy Storchakad31e7732018-10-21 10:09:39 +03005284 PyErr_Clear();
Serhiy Storchaka62e44812019-02-16 08:12:19 +02005285 assert(PyUnicode_AsUTF8(msg) != NULL);
5286 compiler_error(c, PyUnicode_AsUTF8(msg));
Serhiy Storchakad31e7732018-10-21 10:09:39 +03005287 }
Serhiy Storchaka62e44812019-02-16 08:12:19 +02005288 Py_DECREF(msg);
Serhiy Storchakad31e7732018-10-21 10:09:39 +03005289 return 0;
5290 }
5291 Py_DECREF(msg);
5292 return 1;
5293}
5294
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005295static int
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005296compiler_subscript(struct compiler *c, expr_ty e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005297{
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005298 expr_context_ty ctx = e->v.Subscript.ctx;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005299 int op = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005300
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005301 if (ctx == Load) {
5302 if (!check_subscripter(c, e->v.Subscript.value)) {
5303 return 0;
5304 }
5305 if (!check_index(c, e->v.Subscript.value, e->v.Subscript.slice)) {
5306 return 0;
5307 }
5308 }
5309
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005310 switch (ctx) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005311 case Load: op = BINARY_SUBSCR; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005312 case Store: op = STORE_SUBSCR; break;
5313 case Del: op = DELETE_SUBSCR; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005314 }
Serhiy Storchaka6b975982020-03-17 23:41:08 +02005315 assert(op);
5316 VISIT(c, expr, e->v.Subscript.value);
5317 VISIT(c, expr, e->v.Subscript.slice);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005318 ADDOP(c, op);
5319 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005320}
5321
5322static int
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005323compiler_slice(struct compiler *c, expr_ty s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005324{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005325 int n = 2;
5326 assert(s->kind == Slice_kind);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005327
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005328 /* only handles the cases where BUILD_SLICE is emitted */
5329 if (s->v.Slice.lower) {
5330 VISIT(c, expr, s->v.Slice.lower);
5331 }
5332 else {
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005333 ADDOP_LOAD_CONST(c, Py_None);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005334 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005335
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005336 if (s->v.Slice.upper) {
5337 VISIT(c, expr, s->v.Slice.upper);
5338 }
5339 else {
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005340 ADDOP_LOAD_CONST(c, Py_None);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005341 }
5342
5343 if (s->v.Slice.step) {
5344 n++;
5345 VISIT(c, expr, s->v.Slice.step);
5346 }
5347 ADDOP_I(c, BUILD_SLICE, n);
5348 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005349}
5350
Thomas Wouters89f507f2006-12-13 04:49:30 +00005351/* End of the compiler section, beginning of the assembler section */
5352
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005353/* do depth-first search of basic block graph, starting with block.
T. Wouters99b54d62019-09-12 07:05:33 -07005354 post records the block indices in post-order.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005355
5356 XXX must handle implicit jumps from one block to next
5357*/
5358
Thomas Wouters89f507f2006-12-13 04:49:30 +00005359struct assembler {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005360 PyObject *a_bytecode; /* string containing bytecode */
5361 int a_offset; /* offset into bytecode */
5362 int a_nblocks; /* number of reachable blocks */
T. Wouters99b54d62019-09-12 07:05:33 -07005363 basicblock **a_postorder; /* list of blocks in dfs postorder */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005364 PyObject *a_lnotab; /* string containing lnotab */
5365 int a_lnotab_off; /* offset into lnotab */
5366 int a_lineno; /* last lineno of emitted instruction */
5367 int a_lineno_off; /* bytecode offset of last lineno */
Thomas Wouters89f507f2006-12-13 04:49:30 +00005368};
5369
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005370static void
T. Wouters99b54d62019-09-12 07:05:33 -07005371dfs(struct compiler *c, basicblock *b, struct assembler *a, int end)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005372{
T. Wouters99b54d62019-09-12 07:05:33 -07005373 int i, j;
5374
5375 /* Get rid of recursion for normal control flow.
5376 Since the number of blocks is limited, unused space in a_postorder
5377 (from a_nblocks to end) can be used as a stack for still not ordered
5378 blocks. */
5379 for (j = end; b && !b->b_seen; b = b->b_next) {
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005380 b->b_seen = 1;
T. Wouters99b54d62019-09-12 07:05:33 -07005381 assert(a->a_nblocks < j);
5382 a->a_postorder[--j] = b;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005383 }
T. Wouters99b54d62019-09-12 07:05:33 -07005384 while (j < end) {
5385 b = a->a_postorder[j++];
5386 for (i = 0; i < b->b_iused; i++) {
5387 struct instr *instr = &b->b_instr[i];
5388 if (instr->i_jrel || instr->i_jabs)
5389 dfs(c, instr->i_target, a, j);
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005390 }
T. Wouters99b54d62019-09-12 07:05:33 -07005391 assert(a->a_nblocks < j);
5392 a->a_postorder[a->a_nblocks++] = b;
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005393 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005394}
5395
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005396Py_LOCAL_INLINE(void)
5397stackdepth_push(basicblock ***sp, basicblock *b, int depth)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005398{
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02005399 assert(b->b_startdepth < 0 || b->b_startdepth == depth);
Mark Shannonfee55262019-11-21 09:11:43 +00005400 if (b->b_startdepth < depth && b->b_startdepth < 100) {
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005401 assert(b->b_startdepth < 0);
5402 b->b_startdepth = depth;
5403 *(*sp)++ = b;
Serhiy Storchakad4864c62018-01-09 21:54:52 +02005404 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005405}
5406
5407/* Find the flow path that needs the largest stack. We assume that
5408 * cycles in the flow graph have no net effect on the stack depth.
5409 */
5410static int
5411stackdepth(struct compiler *c)
5412{
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005413 basicblock *b, *entryblock = NULL;
5414 basicblock **stack, **sp;
5415 int nblocks = 0, maxdepth = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005416 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005417 b->b_startdepth = INT_MIN;
5418 entryblock = b;
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005419 nblocks++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005420 }
5421 if (!entryblock)
5422 return 0;
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005423 stack = (basicblock **)PyObject_Malloc(sizeof(basicblock *) * nblocks);
5424 if (!stack) {
5425 PyErr_NoMemory();
5426 return -1;
5427 }
5428
5429 sp = stack;
5430 stackdepth_push(&sp, entryblock, 0);
5431 while (sp != stack) {
5432 b = *--sp;
5433 int depth = b->b_startdepth;
5434 assert(depth >= 0);
5435 basicblock *next = b->b_next;
5436 for (int i = 0; i < b->b_iused; i++) {
5437 struct instr *instr = &b->b_instr[i];
5438 int effect = stack_effect(instr->i_opcode, instr->i_oparg, 0);
5439 if (effect == PY_INVALID_STACK_EFFECT) {
Victor Stinner87d3b9d2020-03-25 19:27:36 +01005440 _Py_FatalErrorFormat(__func__,
5441 "opcode = %d", instr->i_opcode);
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005442 }
5443 int new_depth = depth + effect;
5444 if (new_depth > maxdepth) {
5445 maxdepth = new_depth;
5446 }
5447 assert(depth >= 0); /* invalid code or bug in stackdepth() */
5448 if (instr->i_jrel || instr->i_jabs) {
5449 effect = stack_effect(instr->i_opcode, instr->i_oparg, 1);
5450 assert(effect != PY_INVALID_STACK_EFFECT);
5451 int target_depth = depth + effect;
5452 if (target_depth > maxdepth) {
5453 maxdepth = target_depth;
5454 }
5455 assert(target_depth >= 0); /* invalid code or bug in stackdepth() */
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005456 stackdepth_push(&sp, instr->i_target, target_depth);
5457 }
5458 depth = new_depth;
5459 if (instr->i_opcode == JUMP_ABSOLUTE ||
5460 instr->i_opcode == JUMP_FORWARD ||
5461 instr->i_opcode == RETURN_VALUE ||
Mark Shannonfee55262019-11-21 09:11:43 +00005462 instr->i_opcode == RAISE_VARARGS ||
5463 instr->i_opcode == RERAISE)
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005464 {
5465 /* remaining code is dead */
5466 next = NULL;
5467 break;
5468 }
5469 }
5470 if (next != NULL) {
5471 stackdepth_push(&sp, next, depth);
5472 }
5473 }
5474 PyObject_Free(stack);
5475 return maxdepth;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005476}
5477
5478static int
5479assemble_init(struct assembler *a, int nblocks, int firstlineno)
5480{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005481 memset(a, 0, sizeof(struct assembler));
5482 a->a_lineno = firstlineno;
5483 a->a_bytecode = PyBytes_FromStringAndSize(NULL, DEFAULT_CODE_SIZE);
5484 if (!a->a_bytecode)
5485 return 0;
5486 a->a_lnotab = PyBytes_FromStringAndSize(NULL, DEFAULT_LNOTAB_SIZE);
5487 if (!a->a_lnotab)
5488 return 0;
Benjamin Peterson2f8bfef2016-09-07 09:26:18 -07005489 if ((size_t)nblocks > SIZE_MAX / sizeof(basicblock *)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005490 PyErr_NoMemory();
5491 return 0;
5492 }
T. Wouters99b54d62019-09-12 07:05:33 -07005493 a->a_postorder = (basicblock **)PyObject_Malloc(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005494 sizeof(basicblock *) * nblocks);
T. Wouters99b54d62019-09-12 07:05:33 -07005495 if (!a->a_postorder) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005496 PyErr_NoMemory();
5497 return 0;
5498 }
5499 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005500}
5501
5502static void
5503assemble_free(struct assembler *a)
5504{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005505 Py_XDECREF(a->a_bytecode);
5506 Py_XDECREF(a->a_lnotab);
T. Wouters99b54d62019-09-12 07:05:33 -07005507 if (a->a_postorder)
5508 PyObject_Free(a->a_postorder);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005509}
5510
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005511static int
5512blocksize(basicblock *b)
5513{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005514 int i;
5515 int size = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005516
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005517 for (i = 0; i < b->b_iused; i++)
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005518 size += instrsize(b->b_instr[i].i_oparg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005519 return size;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005520}
5521
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00005522/* Appends a pair to the end of the line number table, a_lnotab, representing
5523 the instruction's bytecode offset and line number. See
5524 Objects/lnotab_notes.txt for the description of the line number table. */
Tim Peters2a7f3842001-06-09 09:26:21 +00005525
Guido van Rossumf68d8e52001-04-14 17:55:09 +00005526static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005527assemble_lnotab(struct assembler *a, struct instr *i)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005528{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005529 int d_bytecode, d_lineno;
Victor Stinnerad9a0662013-11-19 22:23:20 +01005530 Py_ssize_t len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005531 unsigned char *lnotab;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005532
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005533 d_lineno = i->i_lineno - a->a_lineno;
Serhiy Storchaka61cb3d02020-03-17 18:07:30 +02005534 if (d_lineno == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005535 return 1;
Serhiy Storchaka61cb3d02020-03-17 18:07:30 +02005536 }
5537
5538 d_bytecode = (a->a_offset - a->a_lineno_off) * sizeof(_Py_CODEUNIT);
5539 assert(d_bytecode >= 0);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00005540
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005541 if (d_bytecode > 255) {
5542 int j, nbytes, ncodes = d_bytecode / 255;
5543 nbytes = a->a_lnotab_off + 2 * ncodes;
5544 len = PyBytes_GET_SIZE(a->a_lnotab);
5545 if (nbytes >= len) {
5546 if ((len <= INT_MAX / 2) && (len * 2 < nbytes))
5547 len = nbytes;
5548 else if (len <= INT_MAX / 2)
5549 len *= 2;
5550 else {
5551 PyErr_NoMemory();
5552 return 0;
5553 }
5554 if (_PyBytes_Resize(&a->a_lnotab, len) < 0)
5555 return 0;
5556 }
5557 lnotab = (unsigned char *)
5558 PyBytes_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
5559 for (j = 0; j < ncodes; j++) {
5560 *lnotab++ = 255;
5561 *lnotab++ = 0;
5562 }
5563 d_bytecode -= ncodes * 255;
5564 a->a_lnotab_off += ncodes * 2;
5565 }
Victor Stinnerf3914eb2016-01-20 12:16:21 +01005566 assert(0 <= d_bytecode && d_bytecode <= 255);
5567
5568 if (d_lineno < -128 || 127 < d_lineno) {
5569 int j, nbytes, ncodes, k;
5570 if (d_lineno < 0) {
5571 k = -128;
5572 /* use division on positive numbers */
5573 ncodes = (-d_lineno) / 128;
5574 }
5575 else {
5576 k = 127;
5577 ncodes = d_lineno / 127;
5578 }
5579 d_lineno -= ncodes * k;
5580 assert(ncodes >= 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005581 nbytes = a->a_lnotab_off + 2 * ncodes;
5582 len = PyBytes_GET_SIZE(a->a_lnotab);
5583 if (nbytes >= len) {
5584 if ((len <= INT_MAX / 2) && len * 2 < nbytes)
5585 len = nbytes;
5586 else if (len <= INT_MAX / 2)
5587 len *= 2;
5588 else {
5589 PyErr_NoMemory();
5590 return 0;
5591 }
5592 if (_PyBytes_Resize(&a->a_lnotab, len) < 0)
5593 return 0;
5594 }
5595 lnotab = (unsigned char *)
5596 PyBytes_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
5597 *lnotab++ = d_bytecode;
Victor Stinnerf3914eb2016-01-20 12:16:21 +01005598 *lnotab++ = k;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005599 d_bytecode = 0;
5600 for (j = 1; j < ncodes; j++) {
5601 *lnotab++ = 0;
Victor Stinnerf3914eb2016-01-20 12:16:21 +01005602 *lnotab++ = k;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005603 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005604 a->a_lnotab_off += ncodes * 2;
5605 }
Victor Stinnerf3914eb2016-01-20 12:16:21 +01005606 assert(-128 <= d_lineno && d_lineno <= 127);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005607
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005608 len = PyBytes_GET_SIZE(a->a_lnotab);
5609 if (a->a_lnotab_off + 2 >= len) {
5610 if (_PyBytes_Resize(&a->a_lnotab, len * 2) < 0)
5611 return 0;
5612 }
5613 lnotab = (unsigned char *)
5614 PyBytes_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
Tim Peters51e26512001-09-07 08:45:55 +00005615
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005616 a->a_lnotab_off += 2;
5617 if (d_bytecode) {
5618 *lnotab++ = d_bytecode;
Victor Stinner4f2dab52011-05-27 16:46:51 +02005619 *lnotab++ = d_lineno;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005620 }
5621 else { /* First line of a block; def stmt, etc. */
5622 *lnotab++ = 0;
Victor Stinner4f2dab52011-05-27 16:46:51 +02005623 *lnotab++ = d_lineno;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005624 }
5625 a->a_lineno = i->i_lineno;
5626 a->a_lineno_off = a->a_offset;
5627 return 1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005628}
5629
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005630/* assemble_emit()
5631 Extend the bytecode with a new instruction.
5632 Update lnotab if necessary.
Jeremy Hylton376e63d2003-08-28 14:42:14 +00005633*/
5634
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00005635static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005636assemble_emit(struct assembler *a, struct instr *i)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00005637{
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005638 int size, arg = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005639 Py_ssize_t len = PyBytes_GET_SIZE(a->a_bytecode);
Serhiy Storchakaab874002016-09-11 13:48:15 +03005640 _Py_CODEUNIT *code;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005641
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005642 arg = i->i_oparg;
5643 size = instrsize(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005644 if (i->i_lineno && !assemble_lnotab(a, i))
5645 return 0;
Serhiy Storchakaab874002016-09-11 13:48:15 +03005646 if (a->a_offset + size >= len / (int)sizeof(_Py_CODEUNIT)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005647 if (len > PY_SSIZE_T_MAX / 2)
5648 return 0;
5649 if (_PyBytes_Resize(&a->a_bytecode, len * 2) < 0)
5650 return 0;
5651 }
Serhiy Storchakaab874002016-09-11 13:48:15 +03005652 code = (_Py_CODEUNIT *)PyBytes_AS_STRING(a->a_bytecode) + a->a_offset;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005653 a->a_offset += size;
Serhiy Storchakaab874002016-09-11 13:48:15 +03005654 write_op_arg(code, i->i_opcode, arg, size);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005655 return 1;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00005656}
5657
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00005658static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005659assemble_jump_offsets(struct assembler *a, struct compiler *c)
Anthony Baxterc2a5a632004-08-02 06:10:11 +00005660{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005661 basicblock *b;
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005662 int bsize, totsize, extended_arg_recompile;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005663 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00005664
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005665 /* Compute the size of each block and fixup jump args.
5666 Replace block pointer with position in bytecode. */
5667 do {
5668 totsize = 0;
T. Wouters99b54d62019-09-12 07:05:33 -07005669 for (i = a->a_nblocks - 1; i >= 0; i--) {
5670 b = a->a_postorder[i];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005671 bsize = blocksize(b);
5672 b->b_offset = totsize;
5673 totsize += bsize;
5674 }
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005675 extended_arg_recompile = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005676 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
5677 bsize = b->b_offset;
5678 for (i = 0; i < b->b_iused; i++) {
5679 struct instr *instr = &b->b_instr[i];
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005680 int isize = instrsize(instr->i_oparg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005681 /* Relative jumps are computed relative to
5682 the instruction pointer after fetching
5683 the jump instruction.
5684 */
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005685 bsize += isize;
5686 if (instr->i_jabs || instr->i_jrel) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005687 instr->i_oparg = instr->i_target->b_offset;
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005688 if (instr->i_jrel) {
5689 instr->i_oparg -= bsize;
5690 }
Serhiy Storchakaab874002016-09-11 13:48:15 +03005691 instr->i_oparg *= sizeof(_Py_CODEUNIT);
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005692 if (instrsize(instr->i_oparg) != isize) {
5693 extended_arg_recompile = 1;
5694 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005695 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005696 }
5697 }
Neal Norwitzf1d50682005-10-23 23:00:41 +00005698
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005699 /* XXX: This is an awful hack that could hurt performance, but
5700 on the bright side it should work until we come up
5701 with a better solution.
Neal Norwitzf1d50682005-10-23 23:00:41 +00005702
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005703 The issue is that in the first loop blocksize() is called
5704 which calls instrsize() which requires i_oparg be set
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005705 appropriately. There is a bootstrap problem because
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005706 i_oparg is calculated in the second loop above.
Neal Norwitzf1d50682005-10-23 23:00:41 +00005707
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005708 So we loop until we stop seeing new EXTENDED_ARGs.
5709 The only EXTENDED_ARGs that could be popping up are
5710 ones in jump instructions. So this should converge
5711 fairly quickly.
5712 */
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005713 } while (extended_arg_recompile);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005714}
5715
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005716static PyObject *
Victor Stinnerad9a0662013-11-19 22:23:20 +01005717dict_keys_inorder(PyObject *dict, Py_ssize_t offset)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005718{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005719 PyObject *tuple, *k, *v;
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +02005720 Py_ssize_t i, pos = 0, size = PyDict_GET_SIZE(dict);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005721
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005722 tuple = PyTuple_New(size);
5723 if (tuple == NULL)
5724 return NULL;
5725 while (PyDict_Next(dict, &pos, &k, &v)) {
5726 i = PyLong_AS_LONG(v);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005727 Py_INCREF(k);
5728 assert((i - offset) < size);
5729 assert((i - offset) >= 0);
5730 PyTuple_SET_ITEM(tuple, i - offset, k);
5731 }
5732 return tuple;
5733}
5734
5735static PyObject *
5736consts_dict_keys_inorder(PyObject *dict)
5737{
5738 PyObject *consts, *k, *v;
5739 Py_ssize_t i, pos = 0, size = PyDict_GET_SIZE(dict);
5740
5741 consts = PyList_New(size); /* PyCode_Optimize() requires a list */
5742 if (consts == NULL)
5743 return NULL;
5744 while (PyDict_Next(dict, &pos, &k, &v)) {
5745 i = PyLong_AS_LONG(v);
Serhiy Storchakab7e1eff2018-04-19 08:28:04 +03005746 /* The keys of the dictionary can be tuples wrapping a contant.
5747 * (see compiler_add_o and _PyCode_ConstantKey). In that case
5748 * the object we want is always second. */
5749 if (PyTuple_CheckExact(k)) {
5750 k = PyTuple_GET_ITEM(k, 1);
5751 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005752 Py_INCREF(k);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005753 assert(i < size);
5754 assert(i >= 0);
5755 PyList_SET_ITEM(consts, i, k);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005756 }
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005757 return consts;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005758}
5759
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005760static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005761compute_code_flags(struct compiler *c)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005762{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005763 PySTEntryObject *ste = c->u->u_ste;
Victor Stinnerad9a0662013-11-19 22:23:20 +01005764 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005765 if (ste->ste_type == FunctionBlock) {
Benjamin Peterson1dfd2472015-04-27 21:44:22 -04005766 flags |= CO_NEWLOCALS | CO_OPTIMIZED;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005767 if (ste->ste_nested)
5768 flags |= CO_NESTED;
Yury Selivanoveb636452016-09-08 22:01:51 -07005769 if (ste->ste_generator && !ste->ste_coroutine)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005770 flags |= CO_GENERATOR;
Yury Selivanoveb636452016-09-08 22:01:51 -07005771 if (!ste->ste_generator && ste->ste_coroutine)
5772 flags |= CO_COROUTINE;
5773 if (ste->ste_generator && ste->ste_coroutine)
5774 flags |= CO_ASYNC_GENERATOR;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005775 if (ste->ste_varargs)
5776 flags |= CO_VARARGS;
5777 if (ste->ste_varkeywords)
5778 flags |= CO_VARKEYWORDS;
5779 }
Thomas Wouters5e9f1fa2006-02-28 20:02:27 +00005780
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005781 /* (Only) inherit compilerflags in PyCF_MASK */
5782 flags |= (c->c_flags->cf_flags & PyCF_MASK);
Thomas Wouters5e9f1fa2006-02-28 20:02:27 +00005783
Pablo Galindo90235812020-03-15 04:29:22 +00005784 if ((IS_TOP_LEVEL_AWAIT(c)) &&
Matthias Bussonnier565b4f12019-05-21 13:12:03 -07005785 ste->ste_coroutine &&
5786 !ste->ste_generator) {
5787 flags |= CO_COROUTINE;
5788 }
5789
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005790 return flags;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005791}
5792
INADA Naokic2e16072018-11-26 21:23:22 +09005793// Merge *tuple* with constant cache.
5794// Unlike merge_consts_recursive(), this function doesn't work recursively.
5795static int
5796merge_const_tuple(struct compiler *c, PyObject **tuple)
5797{
5798 assert(PyTuple_CheckExact(*tuple));
5799
5800 PyObject *key = _PyCode_ConstantKey(*tuple);
5801 if (key == NULL) {
5802 return 0;
5803 }
5804
5805 // t is borrowed reference
5806 PyObject *t = PyDict_SetDefault(c->c_const_cache, key, key);
5807 Py_DECREF(key);
5808 if (t == NULL) {
5809 return 0;
5810 }
5811 if (t == key) { // tuple is new constant.
5812 return 1;
5813 }
5814
5815 PyObject *u = PyTuple_GET_ITEM(t, 1);
5816 Py_INCREF(u);
5817 Py_DECREF(*tuple);
5818 *tuple = u;
5819 return 1;
5820}
5821
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005822static PyCodeObject *
5823makecode(struct compiler *c, struct assembler *a)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005824{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005825 PyObject *tmp;
5826 PyCodeObject *co = NULL;
5827 PyObject *consts = NULL;
5828 PyObject *names = NULL;
5829 PyObject *varnames = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005830 PyObject *name = NULL;
5831 PyObject *freevars = NULL;
5832 PyObject *cellvars = NULL;
5833 PyObject *bytecode = NULL;
Victor Stinnerad9a0662013-11-19 22:23:20 +01005834 Py_ssize_t nlocals;
5835 int nlocals_int;
5836 int flags;
Pablo Galindocd74e662019-06-01 18:08:04 +01005837 int posorkeywordargcount, posonlyargcount, kwonlyargcount, maxdepth;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005838
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005839 consts = consts_dict_keys_inorder(c->u->u_consts);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005840 names = dict_keys_inorder(c->u->u_names, 0);
5841 varnames = dict_keys_inorder(c->u->u_varnames, 0);
5842 if (!consts || !names || !varnames)
5843 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005844
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005845 cellvars = dict_keys_inorder(c->u->u_cellvars, 0);
5846 if (!cellvars)
5847 goto error;
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005848 freevars = dict_keys_inorder(c->u->u_freevars, PyTuple_GET_SIZE(cellvars));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005849 if (!freevars)
5850 goto error;
Victor Stinnerad9a0662013-11-19 22:23:20 +01005851
INADA Naokic2e16072018-11-26 21:23:22 +09005852 if (!merge_const_tuple(c, &names) ||
5853 !merge_const_tuple(c, &varnames) ||
5854 !merge_const_tuple(c, &cellvars) ||
5855 !merge_const_tuple(c, &freevars))
5856 {
5857 goto error;
5858 }
5859
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +02005860 nlocals = PyDict_GET_SIZE(c->u->u_varnames);
Victor Stinnerad9a0662013-11-19 22:23:20 +01005861 assert(nlocals < INT_MAX);
5862 nlocals_int = Py_SAFE_DOWNCAST(nlocals, Py_ssize_t, int);
5863
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005864 flags = compute_code_flags(c);
5865 if (flags < 0)
5866 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005867
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005868 bytecode = PyCode_Optimize(a->a_bytecode, consts, names, a->a_lnotab);
5869 if (!bytecode)
5870 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005871
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005872 tmp = PyList_AsTuple(consts); /* PyCode_New requires a tuple */
5873 if (!tmp)
5874 goto error;
5875 Py_DECREF(consts);
5876 consts = tmp;
INADA Naokic2e16072018-11-26 21:23:22 +09005877 if (!merge_const_tuple(c, &consts)) {
5878 goto error;
5879 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005880
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01005881 posonlyargcount = Py_SAFE_DOWNCAST(c->u->u_posonlyargcount, Py_ssize_t, int);
Pablo Galindocd74e662019-06-01 18:08:04 +01005882 posorkeywordargcount = Py_SAFE_DOWNCAST(c->u->u_argcount, Py_ssize_t, int);
Victor Stinnerf8e32212013-11-19 23:56:34 +01005883 kwonlyargcount = Py_SAFE_DOWNCAST(c->u->u_kwonlyargcount, Py_ssize_t, int);
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005884 maxdepth = stackdepth(c);
5885 if (maxdepth < 0) {
5886 goto error;
5887 }
Pablo Galindo4a2edc32019-07-01 11:35:05 +01005888 co = PyCode_NewWithPosOnlyArgs(posonlyargcount+posorkeywordargcount,
Mark Shannon13bc1392020-01-23 09:25:17 +00005889 posonlyargcount, kwonlyargcount, nlocals_int,
Pablo Galindo4a2edc32019-07-01 11:35:05 +01005890 maxdepth, flags, bytecode, consts, names,
5891 varnames, freevars, cellvars, c->c_filename,
5892 c->u->u_name, c->u->u_firstlineno, a->a_lnotab);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005893 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005894 Py_XDECREF(consts);
5895 Py_XDECREF(names);
5896 Py_XDECREF(varnames);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005897 Py_XDECREF(name);
5898 Py_XDECREF(freevars);
5899 Py_XDECREF(cellvars);
5900 Py_XDECREF(bytecode);
5901 return co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005902}
5903
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005904
5905/* For debugging purposes only */
5906#if 0
5907static void
5908dump_instr(const struct instr *i)
5909{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005910 const char *jrel = i->i_jrel ? "jrel " : "";
5911 const char *jabs = i->i_jabs ? "jabs " : "";
5912 char arg[128];
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005913
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005914 *arg = '\0';
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005915 if (HAS_ARG(i->i_opcode)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005916 sprintf(arg, "arg: %d ", i->i_oparg);
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005917 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005918 fprintf(stderr, "line: %d, opcode: %d %s%s%s\n",
5919 i->i_lineno, i->i_opcode, arg, jabs, jrel);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005920}
5921
5922static void
5923dump_basicblock(const basicblock *b)
5924{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005925 const char *seen = b->b_seen ? "seen " : "";
5926 const char *b_return = b->b_return ? "return " : "";
5927 fprintf(stderr, "used: %d, depth: %d, offset: %d %s%s\n",
5928 b->b_iused, b->b_startdepth, b->b_offset, seen, b_return);
5929 if (b->b_instr) {
5930 int i;
5931 for (i = 0; i < b->b_iused; i++) {
5932 fprintf(stderr, " [%02d] ", i);
5933 dump_instr(b->b_instr + i);
5934 }
5935 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005936}
5937#endif
5938
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005939static PyCodeObject *
5940assemble(struct compiler *c, int addNone)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005941{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005942 basicblock *b, *entryblock;
5943 struct assembler a;
5944 int i, j, nblocks;
5945 PyCodeObject *co = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005946
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005947 /* Make sure every block that falls off the end returns None.
5948 XXX NEXT_BLOCK() isn't quite right, because if the last
5949 block ends with a jump or return b_next shouldn't set.
5950 */
5951 if (!c->u->u_curblock->b_return) {
5952 NEXT_BLOCK(c);
5953 if (addNone)
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005954 ADDOP_LOAD_CONST(c, Py_None);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005955 ADDOP(c, RETURN_VALUE);
5956 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005957
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005958 nblocks = 0;
5959 entryblock = NULL;
5960 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
5961 nblocks++;
5962 entryblock = b;
5963 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005964
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005965 /* Set firstlineno if it wasn't explicitly set. */
5966 if (!c->u->u_firstlineno) {
Ned Deilydc35cda2016-08-17 17:18:33 -04005967 if (entryblock && entryblock->b_instr && entryblock->b_instr->i_lineno)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005968 c->u->u_firstlineno = entryblock->b_instr->i_lineno;
5969 else
5970 c->u->u_firstlineno = 1;
5971 }
5972 if (!assemble_init(&a, nblocks, c->u->u_firstlineno))
5973 goto error;
T. Wouters99b54d62019-09-12 07:05:33 -07005974 dfs(c, entryblock, &a, nblocks);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005975
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005976 /* Can't modify the bytecode after computing jump offsets. */
5977 assemble_jump_offsets(&a, c);
Tim Petersb6c3cea2001-06-26 03:36:28 +00005978
T. Wouters99b54d62019-09-12 07:05:33 -07005979 /* Emit code in reverse postorder from dfs. */
5980 for (i = a.a_nblocks - 1; i >= 0; i--) {
5981 b = a.a_postorder[i];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005982 for (j = 0; j < b->b_iused; j++)
5983 if (!assemble_emit(&a, &b->b_instr[j]))
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
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005992 co = makecode(c, &a);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005993 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005994 assemble_free(&a);
5995 return co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005996}
Georg Brandl8334fd92010-12-04 10:26:46 +00005997
5998#undef PyAST_Compile
Benjamin Petersone5024512018-09-12 12:06:42 -07005999PyCodeObject *
Georg Brandl8334fd92010-12-04 10:26:46 +00006000PyAST_Compile(mod_ty mod, const char *filename, PyCompilerFlags *flags,
6001 PyArena *arena)
6002{
6003 return PyAST_CompileEx(mod, filename, flags, -1, arena);
6004}