blob: 7ec92e09004ea890ca02bfd4e4e2591d1fbc6014 [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
Ammar Askare92d3932020-01-15 11:48:40 -050026#include "Python-ast.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000027#include "ast.h"
28#include "code.h"
Jeremy Hylton4b38da62001-02-02 18:19:15 +000029#include "symtable.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000030#include "opcode.h"
Serhiy Storchakab0f80b02016-05-24 09:15:14 +030031#include "wordcode_helpers.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000032
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000033#define DEFAULT_BLOCK_SIZE 16
34#define DEFAULT_BLOCKS 8
35#define DEFAULT_CODE_SIZE 128
36#define DEFAULT_LNOTAB_SIZE 16
Jeremy Hylton29906ee2001-02-27 04:23:34 +000037
Nick Coghlan650f0d02007-04-15 12:05:43 +000038#define COMP_GENEXP 0
39#define COMP_LISTCOMP 1
40#define COMP_SETCOMP 2
Guido van Rossum992d4a32007-07-11 13:09:30 +000041#define COMP_DICTCOMP 3
Nick Coghlan650f0d02007-04-15 12:05:43 +000042
Pablo Galindo90235812020-03-15 04:29:22 +000043#define IS_TOP_LEVEL_AWAIT(c) ( \
44 (c->c_flags->cf_flags & PyCF_ALLOW_TOP_LEVEL_AWAIT) \
45 && (c->u->u_ste->ste_type == ModuleBlock))
46
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000047struct instr {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000048 unsigned i_jabs : 1;
49 unsigned i_jrel : 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000050 unsigned char i_opcode;
51 int i_oparg;
52 struct basicblock_ *i_target; /* target block (if jump instruction) */
53 int i_lineno;
Guido van Rossum3f5da241990-12-20 15:06:42 +000054};
55
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000056typedef struct basicblock_ {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000057 /* Each basicblock in a compilation unit is linked via b_list in the
58 reverse order that the block are allocated. b_list points to the next
59 block, not to be confused with b_next, which is next by control flow. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000060 struct basicblock_ *b_list;
61 /* number of instructions used */
62 int b_iused;
63 /* length of instruction array (b_instr) */
64 int b_ialloc;
65 /* pointer to an array of instructions, initially NULL */
66 struct instr *b_instr;
67 /* If b_next is non-NULL, it is a pointer to the next
68 block reached by normal control flow. */
69 struct basicblock_ *b_next;
70 /* b_seen is used to perform a DFS of basicblocks. */
71 unsigned b_seen : 1;
72 /* b_return is true if a RETURN_VALUE opcode is inserted. */
73 unsigned b_return : 1;
74 /* depth of stack upon entry of block, computed by stackdepth() */
75 int b_startdepth;
76 /* instruction offset for block, computed by assemble_jump_offsets() */
77 int b_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000078} basicblock;
79
80/* fblockinfo tracks the current frame block.
81
Jeremy Hyltone9357b22006-03-01 15:47:05 +000082A frame block is used to handle loops, try/except, and try/finally.
83It's called a frame block to distinguish it from a basic block in the
84compiler IR.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000085*/
86
Mark Shannonfee55262019-11-21 09:11:43 +000087enum fblocktype { WHILE_LOOP, FOR_LOOP, EXCEPT, FINALLY_TRY, FINALLY_END,
88 WITH, ASYNC_WITH, HANDLER_CLEANUP, POP_VALUE };
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000089
90struct fblockinfo {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000091 enum fblocktype fb_type;
92 basicblock *fb_block;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +020093 /* (optional) type-specific exit or cleanup block */
94 basicblock *fb_exit;
Mark Shannonfee55262019-11-21 09:11:43 +000095 /* (optional) additional information required for unwinding */
96 void *fb_datum;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000097};
98
Antoine Pitrou86a36b52011-11-25 18:56:07 +010099enum {
100 COMPILER_SCOPE_MODULE,
101 COMPILER_SCOPE_CLASS,
102 COMPILER_SCOPE_FUNCTION,
Yury Selivanov75445082015-05-11 22:57:16 -0400103 COMPILER_SCOPE_ASYNC_FUNCTION,
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400104 COMPILER_SCOPE_LAMBDA,
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100105 COMPILER_SCOPE_COMPREHENSION,
106};
107
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000108/* The following items change on entry and exit of code blocks.
109 They must be saved and restored when returning to a block.
110*/
111struct compiler_unit {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000112 PySTEntryObject *u_ste;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000113
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000114 PyObject *u_name;
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400115 PyObject *u_qualname; /* dot-separated qualified name (lazy) */
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100116 int u_scope_type;
117
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000118 /* The following fields are dicts that map objects to
119 the index of them in co_XXX. The index is used as
120 the argument for opcodes that refer to those collections.
121 */
122 PyObject *u_consts; /* all constants */
123 PyObject *u_names; /* all names */
124 PyObject *u_varnames; /* local variables */
125 PyObject *u_cellvars; /* cell variables */
126 PyObject *u_freevars; /* free variables */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000127
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000128 PyObject *u_private; /* for private name mangling */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000129
Victor Stinnerf8e32212013-11-19 23:56:34 +0100130 Py_ssize_t u_argcount; /* number of arguments for block */
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100131 Py_ssize_t u_posonlyargcount; /* number of positional only arguments for block */
Victor Stinnerf8e32212013-11-19 23:56:34 +0100132 Py_ssize_t u_kwonlyargcount; /* number of keyword only arguments for block */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000133 /* Pointer to the most recently allocated block. By following b_list
134 members, you can reach all early allocated blocks. */
135 basicblock *u_blocks;
136 basicblock *u_curblock; /* pointer to current block */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000137
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000138 int u_nfblocks;
139 struct fblockinfo u_fblock[CO_MAXBLOCKS];
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000140
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000141 int u_firstlineno; /* the first lineno of the block */
142 int u_lineno; /* the lineno for the current stmt */
Benjamin Petersond4efd9e2010-09-20 23:02:10 +0000143 int u_col_offset; /* the offset of the current stmt */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000144};
145
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000146/* This struct captures the global state of a compilation.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000147
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000148The u pointer points to the current compilation unit, while units
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000149for enclosing blocks are stored in c_stack. The u and c_stack are
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000150managed by compiler_enter_scope() and compiler_exit_scope().
Nick Coghlanaab9c2b2012-11-04 23:14:34 +1000151
152Note that we don't track recursion levels during compilation - the
153task of detecting and rejecting excessive levels of nesting is
154handled by the symbol analysis pass.
155
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000156*/
157
158struct compiler {
Victor Stinner14e461d2013-08-26 22:28:21 +0200159 PyObject *c_filename;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000160 struct symtable *c_st;
161 PyFutureFeatures *c_future; /* pointer to module's __future__ */
162 PyCompilerFlags *c_flags;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000163
Georg Brandl8334fd92010-12-04 10:26:46 +0000164 int c_optimize; /* optimization level */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000165 int c_interactive; /* true if in interactive mode */
166 int c_nestlevel;
Pablo Galindo18c5f9d2019-07-15 10:15:01 +0100167 int c_do_not_emit_bytecode; /* The compiler won't emit any bytecode
168 if this value is different from zero.
169 This can be used to temporarily visit
170 nodes without emitting bytecode to
171 check only errors. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000172
INADA Naokic2e16072018-11-26 21:23:22 +0900173 PyObject *c_const_cache; /* Python dict holding all constants,
174 including names tuple */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000175 struct compiler_unit *u; /* compiler state for current block */
176 PyObject *c_stack; /* Python list holding compiler_unit ptrs */
177 PyArena *c_arena; /* pointer to memory allocation arena */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000178};
179
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100180static int compiler_enter_scope(struct compiler *, identifier, int, void *, int);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000181static void compiler_free(struct compiler *);
182static basicblock *compiler_new_block(struct compiler *);
Andy Lester76d58772020-03-10 21:18:12 -0500183static int compiler_next_instr(basicblock *);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000184static int compiler_addop(struct compiler *, int);
Victor Stinnerf8e32212013-11-19 23:56:34 +0100185static int compiler_addop_i(struct compiler *, int, Py_ssize_t);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000186static int compiler_addop_j(struct compiler *, int, basicblock *, int);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000187static int compiler_error(struct compiler *, const char *);
Serhiy Storchaka62e44812019-02-16 08:12:19 +0200188static int compiler_warn(struct compiler *, const char *, ...);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000189static int compiler_nameop(struct compiler *, identifier, expr_context_ty);
190
191static PyCodeObject *compiler_mod(struct compiler *, mod_ty);
192static int compiler_visit_stmt(struct compiler *, stmt_ty);
193static int compiler_visit_keyword(struct compiler *, keyword_ty);
194static int compiler_visit_expr(struct compiler *, expr_ty);
195static int compiler_augassign(struct compiler *, stmt_ty);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -0700196static int compiler_annassign(struct compiler *, stmt_ty);
Serhiy Storchaka13d52c22020-03-10 18:52:34 +0200197static int compiler_subscript(struct compiler *, expr_ty);
198static int compiler_slice(struct compiler *, expr_ty);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000199
Andy Lester76d58772020-03-10 21:18:12 -0500200static int inplace_binop(operator_ty);
Brandt Bucher6dd9b642019-11-25 22:16:53 -0800201static int are_all_items_const(asdl_seq *, Py_ssize_t, Py_ssize_t);
Serhiy Storchaka3dfbaf52017-12-25 12:47:50 +0200202static int expr_constant(expr_ty);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000203
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -0500204static int compiler_with(struct compiler *, stmt_ty, int);
Yury Selivanov75445082015-05-11 22:57:16 -0400205static int compiler_async_with(struct compiler *, stmt_ty, int);
206static int compiler_async_for(struct compiler *, stmt_ty);
Victor Stinner976bb402016-03-23 11:36:19 +0100207static int compiler_call_helper(struct compiler *c, int n,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000208 asdl_seq *args,
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400209 asdl_seq *keywords);
Benjamin Peterson43af12b2011-05-29 11:43:10 -0500210static int compiler_try_except(struct compiler *, stmt_ty);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400211static int compiler_set_qualname(struct compiler *);
Guido van Rossumc2e20742006-02-27 22:32:47 +0000212
Yury Selivanov52c4e7c2016-09-09 10:36:01 -0700213static int compiler_sync_comprehension_generator(
214 struct compiler *c,
215 asdl_seq *generators, int gen_index,
Serhiy Storchaka8c579b12020-02-12 12:18:59 +0200216 int depth,
Yury Selivanov52c4e7c2016-09-09 10:36:01 -0700217 expr_ty elt, expr_ty val, int type);
218
219static int compiler_async_comprehension_generator(
220 struct compiler *c,
221 asdl_seq *generators, int gen_index,
Serhiy Storchaka8c579b12020-02-12 12:18:59 +0200222 int depth,
Yury Selivanov52c4e7c2016-09-09 10:36:01 -0700223 expr_ty elt, expr_ty val, int type);
224
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000225static PyCodeObject *assemble(struct compiler *, int addNone);
Mark Shannon332cd5e2018-01-30 00:41:04 +0000226static PyObject *__doc__, *__annotations__;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000227
Benjamin Peterson9e77f722015-05-07 18:41:47 -0400228#define CAPSULE_NAME "compile.c compiler unit"
Benjamin Petersonb173f782009-05-05 22:31:58 +0000229
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000230PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000231_Py_Mangle(PyObject *privateobj, PyObject *ident)
Michael W. Hudson60934622004-08-12 17:56:29 +0000232{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000233 /* Name mangling: __private becomes _classname__private.
234 This is independent from how the name is used. */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200235 PyObject *result;
236 size_t nlen, plen, ipriv;
237 Py_UCS4 maxchar;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000238 if (privateobj == NULL || !PyUnicode_Check(privateobj) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200239 PyUnicode_READ_CHAR(ident, 0) != '_' ||
240 PyUnicode_READ_CHAR(ident, 1) != '_') {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000241 Py_INCREF(ident);
242 return ident;
243 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200244 nlen = PyUnicode_GET_LENGTH(ident);
245 plen = PyUnicode_GET_LENGTH(privateobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000246 /* Don't mangle __id__ or names with dots.
Guido van Rossumd8faa362007-04-27 19:54:29 +0000247
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000248 The only time a name with a dot can occur is when
249 we are compiling an import statement that has a
250 package name.
Guido van Rossumd8faa362007-04-27 19:54:29 +0000251
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000252 TODO(jhylton): Decide whether we want to support
253 mangling of the module name, e.g. __M.X.
254 */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200255 if ((PyUnicode_READ_CHAR(ident, nlen-1) == '_' &&
256 PyUnicode_READ_CHAR(ident, nlen-2) == '_') ||
257 PyUnicode_FindChar(ident, '.', 0, nlen, 1) != -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000258 Py_INCREF(ident);
259 return ident; /* Don't mangle __whatever__ */
260 }
261 /* Strip leading underscores from class name */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200262 ipriv = 0;
263 while (PyUnicode_READ_CHAR(privateobj, ipriv) == '_')
264 ipriv++;
265 if (ipriv == plen) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000266 Py_INCREF(ident);
267 return ident; /* Don't mangle if class is just underscores */
268 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200269 plen -= ipriv;
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000270
Antoine Pitrou55bff892013-04-06 21:21:04 +0200271 if (plen + nlen >= PY_SSIZE_T_MAX - 1) {
272 PyErr_SetString(PyExc_OverflowError,
273 "private identifier too large to be mangled");
274 return NULL;
275 }
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000276
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200277 maxchar = PyUnicode_MAX_CHAR_VALUE(ident);
278 if (PyUnicode_MAX_CHAR_VALUE(privateobj) > maxchar)
279 maxchar = PyUnicode_MAX_CHAR_VALUE(privateobj);
280
281 result = PyUnicode_New(1 + nlen + plen, maxchar);
282 if (!result)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000283 return 0;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200284 /* ident = "_" + priv[ipriv:] + ident # i.e. 1+plen+nlen bytes */
285 PyUnicode_WRITE(PyUnicode_KIND(result), PyUnicode_DATA(result), 0, '_');
Victor Stinner6c7a52a2011-09-28 21:39:17 +0200286 if (PyUnicode_CopyCharacters(result, 1, privateobj, ipriv, plen) < 0) {
287 Py_DECREF(result);
288 return NULL;
289 }
290 if (PyUnicode_CopyCharacters(result, plen+1, ident, 0, nlen) < 0) {
291 Py_DECREF(result);
292 return NULL;
293 }
Victor Stinner8f825062012-04-27 13:55:39 +0200294 assert(_PyUnicode_CheckConsistency(result, 1));
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200295 return result;
Michael W. Hudson60934622004-08-12 17:56:29 +0000296}
297
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000298static int
299compiler_init(struct compiler *c)
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000300{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000301 memset(c, 0, sizeof(struct compiler));
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000302
INADA Naokic2e16072018-11-26 21:23:22 +0900303 c->c_const_cache = PyDict_New();
304 if (!c->c_const_cache) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000305 return 0;
INADA Naokic2e16072018-11-26 21:23:22 +0900306 }
307
308 c->c_stack = PyList_New(0);
309 if (!c->c_stack) {
310 Py_CLEAR(c->c_const_cache);
311 return 0;
312 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000313
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000314 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000315}
316
317PyCodeObject *
Victor Stinner14e461d2013-08-26 22:28:21 +0200318PyAST_CompileObject(mod_ty mod, PyObject *filename, PyCompilerFlags *flags,
319 int optimize, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000320{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000321 struct compiler c;
322 PyCodeObject *co = NULL;
Victor Stinner37d66d72019-06-13 02:16:41 +0200323 PyCompilerFlags local_flags = _PyCompilerFlags_INIT;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000324 int merged;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000325
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000326 if (!__doc__) {
327 __doc__ = PyUnicode_InternFromString("__doc__");
328 if (!__doc__)
329 return NULL;
330 }
Mark Shannon332cd5e2018-01-30 00:41:04 +0000331 if (!__annotations__) {
332 __annotations__ = PyUnicode_InternFromString("__annotations__");
333 if (!__annotations__)
334 return NULL;
335 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000336 if (!compiler_init(&c))
337 return NULL;
Victor Stinner14e461d2013-08-26 22:28:21 +0200338 Py_INCREF(filename);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000339 c.c_filename = filename;
340 c.c_arena = arena;
Victor Stinner14e461d2013-08-26 22:28:21 +0200341 c.c_future = PyFuture_FromASTObject(mod, filename);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000342 if (c.c_future == NULL)
343 goto finally;
344 if (!flags) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000345 flags = &local_flags;
346 }
347 merged = c.c_future->ff_features | flags->cf_flags;
348 c.c_future->ff_features = merged;
349 flags->cf_flags = merged;
350 c.c_flags = flags;
Victor Stinnerda7933e2020-04-13 03:04:28 +0200351 c.c_optimize = (optimize == -1) ? _Py_GetConfig()->optimization_level : optimize;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000352 c.c_nestlevel = 0;
Pablo Galindo18c5f9d2019-07-15 10:15:01 +0100353 c.c_do_not_emit_bytecode = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000354
Pablo Galindod112c602020-03-18 23:02:09 +0000355 _PyASTOptimizeState state;
356 state.optimize = c.c_optimize;
357 state.ff_features = merged;
358
359 if (!_PyAST_Optimize(mod, arena, &state)) {
INADA Naoki7ea143a2017-12-14 16:47:20 +0900360 goto finally;
361 }
362
Victor Stinner14e461d2013-08-26 22:28:21 +0200363 c.c_st = PySymtable_BuildObject(mod, filename, c.c_future);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000364 if (c.c_st == NULL) {
365 if (!PyErr_Occurred())
366 PyErr_SetString(PyExc_SystemError, "no symtable");
367 goto finally;
368 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000369
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000370 co = compiler_mod(&c, mod);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000371
Thomas Wouters1175c432006-02-27 22:49:54 +0000372 finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000373 compiler_free(&c);
374 assert(co || PyErr_Occurred());
375 return co;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000376}
377
378PyCodeObject *
Victor Stinner14e461d2013-08-26 22:28:21 +0200379PyAST_CompileEx(mod_ty mod, const char *filename_str, PyCompilerFlags *flags,
380 int optimize, PyArena *arena)
381{
382 PyObject *filename;
383 PyCodeObject *co;
384 filename = PyUnicode_DecodeFSDefault(filename_str);
385 if (filename == NULL)
386 return NULL;
387 co = PyAST_CompileObject(mod, filename, flags, optimize, arena);
388 Py_DECREF(filename);
389 return co;
390
391}
392
393PyCodeObject *
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000394PyNode_Compile(struct _node *n, const char *filename)
395{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000396 PyCodeObject *co = NULL;
397 mod_ty mod;
398 PyArena *arena = PyArena_New();
399 if (!arena)
400 return NULL;
401 mod = PyAST_FromNode(n, NULL, filename, arena);
402 if (mod)
403 co = PyAST_Compile(mod, filename, NULL, arena);
404 PyArena_Free(arena);
405 return co;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000406}
407
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000408static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000409compiler_free(struct compiler *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000410{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000411 if (c->c_st)
412 PySymtable_Free(c->c_st);
413 if (c->c_future)
414 PyObject_Free(c->c_future);
Victor Stinner14e461d2013-08-26 22:28:21 +0200415 Py_XDECREF(c->c_filename);
INADA Naokic2e16072018-11-26 21:23:22 +0900416 Py_DECREF(c->c_const_cache);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000417 Py_DECREF(c->c_stack);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000418}
419
Guido van Rossum79f25d91997-04-29 20:08:16 +0000420static PyObject *
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000421list2dict(PyObject *list)
Guido van Rossum2dff9911992-09-03 20:50:59 +0000422{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000423 Py_ssize_t i, n;
424 PyObject *v, *k;
425 PyObject *dict = PyDict_New();
426 if (!dict) return NULL;
Guido van Rossumd076c731998-10-07 19:42:25 +0000427
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000428 n = PyList_Size(list);
429 for (i = 0; i < n; i++) {
Victor Stinnerad9a0662013-11-19 22:23:20 +0100430 v = PyLong_FromSsize_t(i);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000431 if (!v) {
432 Py_DECREF(dict);
433 return NULL;
434 }
435 k = PyList_GET_ITEM(list, i);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +0300436 if (PyDict_SetItem(dict, k, v) < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000437 Py_DECREF(v);
438 Py_DECREF(dict);
439 return NULL;
440 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000441 Py_DECREF(v);
442 }
443 return dict;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000444}
445
446/* Return new dict containing names from src that match scope(s).
447
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000448src is a symbol table dictionary. If the scope of a name matches
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000449either scope_type or flag is set, insert it into the new dict. The
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000450values are integers, starting at offset and increasing by one for
451each key.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000452*/
453
454static PyObject *
Victor Stinnerad9a0662013-11-19 22:23:20 +0100455dictbytype(PyObject *src, int scope_type, int flag, Py_ssize_t offset)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000456{
Benjamin Peterson51ab2832012-07-18 15:12:47 -0700457 Py_ssize_t i = offset, scope, num_keys, key_i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000458 PyObject *k, *v, *dest = PyDict_New();
Meador Inge2ca63152012-07-18 14:20:11 -0500459 PyObject *sorted_keys;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000460
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000461 assert(offset >= 0);
462 if (dest == NULL)
463 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000464
Meador Inge2ca63152012-07-18 14:20:11 -0500465 /* Sort the keys so that we have a deterministic order on the indexes
466 saved in the returned dictionary. These indexes are used as indexes
467 into the free and cell var storage. Therefore if they aren't
468 deterministic, then the generated bytecode is not deterministic.
469 */
470 sorted_keys = PyDict_Keys(src);
471 if (sorted_keys == NULL)
472 return NULL;
473 if (PyList_Sort(sorted_keys) != 0) {
474 Py_DECREF(sorted_keys);
475 return NULL;
476 }
Meador Ingef69e24e2012-07-18 16:41:03 -0500477 num_keys = PyList_GET_SIZE(sorted_keys);
Meador Inge2ca63152012-07-18 14:20:11 -0500478
479 for (key_i = 0; key_i < num_keys; key_i++) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000480 /* XXX this should probably be a macro in symtable.h */
481 long vi;
Meador Inge2ca63152012-07-18 14:20:11 -0500482 k = PyList_GET_ITEM(sorted_keys, key_i);
483 v = PyDict_GetItem(src, k);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000484 assert(PyLong_Check(v));
485 vi = PyLong_AS_LONG(v);
486 scope = (vi >> SCOPE_OFFSET) & SCOPE_MASK;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000487
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000488 if (scope == scope_type || vi & flag) {
Serhiy Storchakad70c2a62018-04-20 16:01:25 +0300489 PyObject *item = PyLong_FromSsize_t(i);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000490 if (item == NULL) {
Meador Inge2ca63152012-07-18 14:20:11 -0500491 Py_DECREF(sorted_keys);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000492 Py_DECREF(dest);
493 return NULL;
494 }
495 i++;
Serhiy Storchakad70c2a62018-04-20 16:01:25 +0300496 if (PyDict_SetItem(dest, k, item) < 0) {
Meador Inge2ca63152012-07-18 14:20:11 -0500497 Py_DECREF(sorted_keys);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000498 Py_DECREF(item);
499 Py_DECREF(dest);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000500 return NULL;
501 }
502 Py_DECREF(item);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000503 }
504 }
Meador Inge2ca63152012-07-18 14:20:11 -0500505 Py_DECREF(sorted_keys);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000506 return dest;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000507}
508
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000509static void
510compiler_unit_check(struct compiler_unit *u)
511{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000512 basicblock *block;
513 for (block = u->u_blocks; block != NULL; block = block->b_list) {
Benjamin Petersonca470632016-09-06 13:47:26 -0700514 assert((uintptr_t)block != 0xcbcbcbcbU);
515 assert((uintptr_t)block != 0xfbfbfbfbU);
516 assert((uintptr_t)block != 0xdbdbdbdbU);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000517 if (block->b_instr != NULL) {
518 assert(block->b_ialloc > 0);
519 assert(block->b_iused > 0);
520 assert(block->b_ialloc >= block->b_iused);
521 }
522 else {
523 assert (block->b_iused == 0);
524 assert (block->b_ialloc == 0);
525 }
526 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000527}
528
529static void
530compiler_unit_free(struct compiler_unit *u)
531{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000532 basicblock *b, *next;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000533
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000534 compiler_unit_check(u);
535 b = u->u_blocks;
536 while (b != NULL) {
537 if (b->b_instr)
538 PyObject_Free((void *)b->b_instr);
539 next = b->b_list;
540 PyObject_Free((void *)b);
541 b = next;
542 }
543 Py_CLEAR(u->u_ste);
544 Py_CLEAR(u->u_name);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400545 Py_CLEAR(u->u_qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000546 Py_CLEAR(u->u_consts);
547 Py_CLEAR(u->u_names);
548 Py_CLEAR(u->u_varnames);
549 Py_CLEAR(u->u_freevars);
550 Py_CLEAR(u->u_cellvars);
551 Py_CLEAR(u->u_private);
552 PyObject_Free(u);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000553}
554
555static int
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100556compiler_enter_scope(struct compiler *c, identifier name,
557 int scope_type, void *key, int lineno)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000558{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000559 struct compiler_unit *u;
Victor Stinnerfc6f2ef2016-02-27 02:19:22 +0100560 basicblock *block;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000561
Andy Lester7668a8b2020-03-24 23:26:44 -0500562 u = (struct compiler_unit *)PyObject_Calloc(1, sizeof(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000563 struct compiler_unit));
564 if (!u) {
565 PyErr_NoMemory();
566 return 0;
567 }
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100568 u->u_scope_type = scope_type;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000569 u->u_argcount = 0;
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100570 u->u_posonlyargcount = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000571 u->u_kwonlyargcount = 0;
572 u->u_ste = PySymtable_Lookup(c->c_st, key);
573 if (!u->u_ste) {
574 compiler_unit_free(u);
575 return 0;
576 }
577 Py_INCREF(name);
578 u->u_name = name;
579 u->u_varnames = list2dict(u->u_ste->ste_varnames);
580 u->u_cellvars = dictbytype(u->u_ste->ste_symbols, CELL, 0, 0);
581 if (!u->u_varnames || !u->u_cellvars) {
582 compiler_unit_free(u);
583 return 0;
584 }
Benjamin Peterson312595c2013-05-15 15:26:42 -0500585 if (u->u_ste->ste_needs_class_closure) {
Martin Panter7462b6492015-11-02 03:37:02 +0000586 /* Cook up an implicit __class__ cell. */
Benjamin Peterson312595c2013-05-15 15:26:42 -0500587 _Py_IDENTIFIER(__class__);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +0300588 PyObject *name;
Benjamin Peterson312595c2013-05-15 15:26:42 -0500589 int res;
590 assert(u->u_scope_type == COMPILER_SCOPE_CLASS);
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +0200591 assert(PyDict_GET_SIZE(u->u_cellvars) == 0);
Benjamin Peterson312595c2013-05-15 15:26:42 -0500592 name = _PyUnicode_FromId(&PyId___class__);
593 if (!name) {
594 compiler_unit_free(u);
595 return 0;
596 }
Serhiy Storchakad70c2a62018-04-20 16:01:25 +0300597 res = PyDict_SetItem(u->u_cellvars, name, _PyLong_Zero);
Benjamin Peterson312595c2013-05-15 15:26:42 -0500598 if (res < 0) {
599 compiler_unit_free(u);
600 return 0;
601 }
602 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000603
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000604 u->u_freevars = dictbytype(u->u_ste->ste_symbols, FREE, DEF_FREE_CLASS,
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +0200605 PyDict_GET_SIZE(u->u_cellvars));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000606 if (!u->u_freevars) {
607 compiler_unit_free(u);
608 return 0;
609 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000610
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000611 u->u_blocks = NULL;
612 u->u_nfblocks = 0;
613 u->u_firstlineno = lineno;
614 u->u_lineno = 0;
Benjamin Petersond4efd9e2010-09-20 23:02:10 +0000615 u->u_col_offset = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000616 u->u_consts = PyDict_New();
617 if (!u->u_consts) {
618 compiler_unit_free(u);
619 return 0;
620 }
621 u->u_names = PyDict_New();
622 if (!u->u_names) {
623 compiler_unit_free(u);
624 return 0;
625 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000626
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000627 u->u_private = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000628
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000629 /* Push the old compiler_unit on the stack. */
630 if (c->u) {
Benjamin Peterson9e77f722015-05-07 18:41:47 -0400631 PyObject *capsule = PyCapsule_New(c->u, CAPSULE_NAME, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000632 if (!capsule || PyList_Append(c->c_stack, capsule) < 0) {
633 Py_XDECREF(capsule);
634 compiler_unit_free(u);
635 return 0;
636 }
637 Py_DECREF(capsule);
638 u->u_private = c->u->u_private;
639 Py_XINCREF(u->u_private);
640 }
641 c->u = u;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000642
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000643 c->c_nestlevel++;
Victor Stinnerfc6f2ef2016-02-27 02:19:22 +0100644
645 block = compiler_new_block(c);
646 if (block == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000647 return 0;
Victor Stinnerfc6f2ef2016-02-27 02:19:22 +0100648 c->u->u_curblock = block;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000649
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400650 if (u->u_scope_type != COMPILER_SCOPE_MODULE) {
651 if (!compiler_set_qualname(c))
652 return 0;
653 }
654
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000655 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000656}
657
Neil Schemenauerc396d9e2005-10-25 06:30:14 +0000658static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000659compiler_exit_scope(struct compiler *c)
660{
Victor Stinnerad9a0662013-11-19 22:23:20 +0100661 Py_ssize_t n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000662 PyObject *capsule;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000663
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000664 c->c_nestlevel--;
665 compiler_unit_free(c->u);
666 /* Restore c->u to the parent unit. */
667 n = PyList_GET_SIZE(c->c_stack) - 1;
668 if (n >= 0) {
669 capsule = PyList_GET_ITEM(c->c_stack, n);
Benjamin Peterson9e77f722015-05-07 18:41:47 -0400670 c->u = (struct compiler_unit *)PyCapsule_GetPointer(capsule, CAPSULE_NAME);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000671 assert(c->u);
672 /* we are deleting from a list so this really shouldn't fail */
673 if (PySequence_DelItem(c->c_stack, n) < 0)
674 Py_FatalError("compiler_exit_scope()");
675 compiler_unit_check(c->u);
676 }
677 else
678 c->u = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000679
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000680}
681
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400682static int
683compiler_set_qualname(struct compiler *c)
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100684{
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100685 _Py_static_string(dot, ".");
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400686 _Py_static_string(dot_locals, ".<locals>");
687 Py_ssize_t stack_size;
688 struct compiler_unit *u = c->u;
689 PyObject *name, *base, *dot_str, *dot_locals_str;
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100690
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400691 base = NULL;
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100692 stack_size = PyList_GET_SIZE(c->c_stack);
Benjamin Petersona8a38b82013-10-19 16:14:39 -0400693 assert(stack_size >= 1);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400694 if (stack_size > 1) {
695 int scope, force_global = 0;
696 struct compiler_unit *parent;
697 PyObject *mangled, *capsule;
698
Benjamin Peterson3d9e4812013-10-19 16:01:13 -0400699 capsule = PyList_GET_ITEM(c->c_stack, stack_size - 1);
Benjamin Peterson9e77f722015-05-07 18:41:47 -0400700 parent = (struct compiler_unit *)PyCapsule_GetPointer(capsule, CAPSULE_NAME);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400701 assert(parent);
702
Yury Selivanov75445082015-05-11 22:57:16 -0400703 if (u->u_scope_type == COMPILER_SCOPE_FUNCTION
704 || u->u_scope_type == COMPILER_SCOPE_ASYNC_FUNCTION
705 || u->u_scope_type == COMPILER_SCOPE_CLASS) {
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400706 assert(u->u_name);
707 mangled = _Py_Mangle(parent->u_private, u->u_name);
708 if (!mangled)
709 return 0;
710 scope = PyST_GetScope(parent->u_ste, mangled);
711 Py_DECREF(mangled);
712 assert(scope != GLOBAL_IMPLICIT);
713 if (scope == GLOBAL_EXPLICIT)
714 force_global = 1;
715 }
716
717 if (!force_global) {
718 if (parent->u_scope_type == COMPILER_SCOPE_FUNCTION
Yury Selivanov75445082015-05-11 22:57:16 -0400719 || parent->u_scope_type == COMPILER_SCOPE_ASYNC_FUNCTION
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400720 || parent->u_scope_type == COMPILER_SCOPE_LAMBDA) {
721 dot_locals_str = _PyUnicode_FromId(&dot_locals);
722 if (dot_locals_str == NULL)
723 return 0;
724 base = PyUnicode_Concat(parent->u_qualname, dot_locals_str);
725 if (base == NULL)
726 return 0;
727 }
728 else {
729 Py_INCREF(parent->u_qualname);
730 base = parent->u_qualname;
Benjamin Peterson3d9e4812013-10-19 16:01:13 -0400731 }
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100732 }
733 }
Benjamin Peterson3d9e4812013-10-19 16:01:13 -0400734
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400735 if (base != NULL) {
736 dot_str = _PyUnicode_FromId(&dot);
737 if (dot_str == NULL) {
738 Py_DECREF(base);
739 return 0;
740 }
741 name = PyUnicode_Concat(base, dot_str);
742 Py_DECREF(base);
743 if (name == NULL)
744 return 0;
745 PyUnicode_Append(&name, u->u_name);
746 if (name == NULL)
747 return 0;
748 }
749 else {
750 Py_INCREF(u->u_name);
751 name = u->u_name;
752 }
753 u->u_qualname = name;
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100754
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400755 return 1;
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100756}
757
Eric V. Smith235a6f02015-09-19 14:51:32 -0400758
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000759/* Allocate a new block and return a pointer to it.
760 Returns NULL on error.
761*/
762
763static basicblock *
764compiler_new_block(struct compiler *c)
765{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000766 basicblock *b;
767 struct compiler_unit *u;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000768
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000769 u = c->u;
Andy Lester7668a8b2020-03-24 23:26:44 -0500770 b = (basicblock *)PyObject_Calloc(1, sizeof(basicblock));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000771 if (b == NULL) {
772 PyErr_NoMemory();
773 return NULL;
774 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000775 /* Extend the singly linked list of blocks with new block. */
776 b->b_list = u->u_blocks;
777 u->u_blocks = b;
778 return b;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000779}
780
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000781static basicblock *
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000782compiler_next_block(struct compiler *c)
783{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000784 basicblock *block = compiler_new_block(c);
785 if (block == NULL)
786 return NULL;
787 c->u->u_curblock->b_next = block;
788 c->u->u_curblock = block;
789 return block;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000790}
791
792static basicblock *
793compiler_use_next_block(struct compiler *c, basicblock *block)
794{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000795 assert(block != NULL);
796 c->u->u_curblock->b_next = block;
797 c->u->u_curblock = block;
798 return block;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000799}
800
801/* Returns the offset of the next instruction in the current block's
802 b_instr array. Resizes the b_instr as necessary.
803 Returns -1 on failure.
Thomas Wouters89f507f2006-12-13 04:49:30 +0000804*/
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000805
806static int
Andy Lester76d58772020-03-10 21:18:12 -0500807compiler_next_instr(basicblock *b)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000808{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000809 assert(b != NULL);
810 if (b->b_instr == NULL) {
Andy Lester7668a8b2020-03-24 23:26:44 -0500811 b->b_instr = (struct instr *)PyObject_Calloc(
812 DEFAULT_BLOCK_SIZE, sizeof(struct instr));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000813 if (b->b_instr == NULL) {
814 PyErr_NoMemory();
815 return -1;
816 }
817 b->b_ialloc = DEFAULT_BLOCK_SIZE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000818 }
819 else if (b->b_iused == b->b_ialloc) {
820 struct instr *tmp;
821 size_t oldsize, newsize;
822 oldsize = b->b_ialloc * sizeof(struct instr);
823 newsize = oldsize << 1;
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000824
Benjamin Peterson2f8bfef2016-09-07 09:26:18 -0700825 if (oldsize > (SIZE_MAX >> 1)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000826 PyErr_NoMemory();
827 return -1;
828 }
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000829
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000830 if (newsize == 0) {
831 PyErr_NoMemory();
832 return -1;
833 }
834 b->b_ialloc <<= 1;
835 tmp = (struct instr *)PyObject_Realloc(
836 (void *)b->b_instr, newsize);
837 if (tmp == NULL) {
838 PyErr_NoMemory();
839 return -1;
840 }
841 b->b_instr = tmp;
842 memset((char *)b->b_instr + oldsize, 0, newsize - oldsize);
843 }
844 return b->b_iused++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000845}
846
Serhiy Storchaka61cb3d02020-03-17 18:07:30 +0200847/* Set the line number and column offset for the following instructions.
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000848
Christian Heimes2202f872008-02-06 14:31:34 +0000849 The line number is reset in the following cases:
850 - when entering a new scope
851 - on each statement
Serhiy Storchaka61cb3d02020-03-17 18:07:30 +0200852 - on each expression and sub-expression
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +0200853 - before the "except" and "finally" clauses
Thomas Wouters89f507f2006-12-13 04:49:30 +0000854*/
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000855
Serhiy Storchaka61cb3d02020-03-17 18:07:30 +0200856#define SET_LOC(c, x) \
857 (c)->u->u_lineno = (x)->lineno; \
858 (c)->u->u_col_offset = (x)->col_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000859
Serhiy Storchakad4864c62018-01-09 21:54:52 +0200860/* Return the stack effect of opcode with argument oparg.
861
862 Some opcodes have different stack effect when jump to the target and
863 when not jump. The 'jump' parameter specifies the case:
864
865 * 0 -- when not jump
866 * 1 -- when jump
867 * -1 -- maximal
868 */
869/* XXX Make the stack effect of WITH_CLEANUP_START and
870 WITH_CLEANUP_FINISH deterministic. */
871static int
872stack_effect(int opcode, int oparg, int jump)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000873{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000874 switch (opcode) {
Serhiy Storchaka57faf342018-04-25 22:04:06 +0300875 case NOP:
876 case EXTENDED_ARG:
877 return 0;
878
Serhiy Storchakad4864c62018-01-09 21:54:52 +0200879 /* Stack manipulation */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000880 case POP_TOP:
881 return -1;
882 case ROT_TWO:
883 case ROT_THREE:
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +0200884 case ROT_FOUR:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000885 return 0;
886 case DUP_TOP:
887 return 1;
Antoine Pitrou74a69fa2010-09-04 18:43:52 +0000888 case DUP_TOP_TWO:
889 return 2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000890
Serhiy Storchakad4864c62018-01-09 21:54:52 +0200891 /* Unary operators */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000892 case UNARY_POSITIVE:
893 case UNARY_NEGATIVE:
894 case UNARY_NOT:
895 case UNARY_INVERT:
896 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000897
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000898 case SET_ADD:
899 case LIST_APPEND:
900 return -1;
901 case MAP_ADD:
902 return -2;
Neal Norwitz10be2ea2006-03-03 20:29:11 +0000903
Serhiy Storchakad4864c62018-01-09 21:54:52 +0200904 /* Binary operators */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000905 case BINARY_POWER:
906 case BINARY_MULTIPLY:
Benjamin Petersond51374e2014-04-09 23:55:56 -0400907 case BINARY_MATRIX_MULTIPLY:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000908 case BINARY_MODULO:
909 case BINARY_ADD:
910 case BINARY_SUBTRACT:
911 case BINARY_SUBSCR:
912 case BINARY_FLOOR_DIVIDE:
913 case BINARY_TRUE_DIVIDE:
914 return -1;
915 case INPLACE_FLOOR_DIVIDE:
916 case INPLACE_TRUE_DIVIDE:
917 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000918
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000919 case INPLACE_ADD:
920 case INPLACE_SUBTRACT:
921 case INPLACE_MULTIPLY:
Benjamin Petersond51374e2014-04-09 23:55:56 -0400922 case INPLACE_MATRIX_MULTIPLY:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000923 case INPLACE_MODULO:
924 return -1;
925 case STORE_SUBSCR:
926 return -3;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000927 case DELETE_SUBSCR:
928 return -2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000929
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000930 case BINARY_LSHIFT:
931 case BINARY_RSHIFT:
932 case BINARY_AND:
933 case BINARY_XOR:
934 case BINARY_OR:
935 return -1;
936 case INPLACE_POWER:
937 return -1;
938 case GET_ITER:
939 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000940
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000941 case PRINT_EXPR:
942 return -1;
943 case LOAD_BUILD_CLASS:
944 return 1;
945 case INPLACE_LSHIFT:
946 case INPLACE_RSHIFT:
947 case INPLACE_AND:
948 case INPLACE_XOR:
949 case INPLACE_OR:
950 return -1;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +0200951
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000952 case SETUP_WITH:
Serhiy Storchakad4864c62018-01-09 21:54:52 +0200953 /* 1 in the normal flow.
954 * Restore the stack position and push 6 values before jumping to
955 * the handler if an exception be raised. */
956 return jump ? 6 : 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000957 case RETURN_VALUE:
958 return -1;
959 case IMPORT_STAR:
960 return -1;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -0700961 case SETUP_ANNOTATIONS:
962 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000963 case YIELD_VALUE:
964 return 0;
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -0500965 case YIELD_FROM:
966 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000967 case POP_BLOCK:
968 return 0;
969 case POP_EXCEPT:
Serhiy Storchakad4864c62018-01-09 21:54:52 +0200970 return -3;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000971
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000972 case STORE_NAME:
973 return -1;
974 case DELETE_NAME:
975 return 0;
976 case UNPACK_SEQUENCE:
977 return oparg-1;
978 case UNPACK_EX:
979 return (oparg&0xFF) + (oparg>>8);
980 case FOR_ITER:
Serhiy Storchakad4864c62018-01-09 21:54:52 +0200981 /* -1 at end of iterator, 1 if continue iterating. */
982 return jump > 0 ? -1 : 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000983
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000984 case STORE_ATTR:
985 return -2;
986 case DELETE_ATTR:
987 return -1;
988 case STORE_GLOBAL:
989 return -1;
990 case DELETE_GLOBAL:
991 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000992 case LOAD_CONST:
993 return 1;
994 case LOAD_NAME:
995 return 1;
996 case BUILD_TUPLE:
997 case BUILD_LIST:
998 case BUILD_SET:
Serhiy Storchakaea525a22016-09-06 22:07:53 +0300999 case BUILD_STRING:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001000 return 1-oparg;
1001 case BUILD_MAP:
Benjamin Petersonb6855152015-09-10 21:02:39 -07001002 return 1 - 2*oparg;
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03001003 case BUILD_CONST_KEY_MAP:
1004 return -oparg;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001005 case LOAD_ATTR:
1006 return 0;
1007 case COMPARE_OP:
Mark Shannon9af0e472020-01-14 10:12:45 +00001008 case IS_OP:
1009 case CONTAINS_OP:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001010 return -1;
Mark Shannon9af0e472020-01-14 10:12:45 +00001011 case JUMP_IF_NOT_EXC_MATCH:
1012 return -2;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001013 case IMPORT_NAME:
1014 return -1;
1015 case IMPORT_FROM:
1016 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001017
Serhiy Storchakad4864c62018-01-09 21:54:52 +02001018 /* Jumps */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001019 case JUMP_FORWARD:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001020 case JUMP_ABSOLUTE:
1021 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001022
Serhiy Storchakad4864c62018-01-09 21:54:52 +02001023 case JUMP_IF_TRUE_OR_POP:
1024 case JUMP_IF_FALSE_OR_POP:
1025 return jump ? 0 : -1;
1026
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001027 case POP_JUMP_IF_FALSE:
1028 case POP_JUMP_IF_TRUE:
1029 return -1;
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00001030
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001031 case LOAD_GLOBAL:
1032 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001033
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001034 /* Exception handling */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001035 case SETUP_FINALLY:
Serhiy Storchakad4864c62018-01-09 21:54:52 +02001036 /* 0 in the normal flow.
1037 * Restore the stack position and push 6 values before jumping to
1038 * the handler if an exception be raised. */
1039 return jump ? 6 : 0;
Mark Shannonfee55262019-11-21 09:11:43 +00001040 case RERAISE:
1041 return -3;
1042
1043 case WITH_EXCEPT_START:
1044 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001045
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001046 case LOAD_FAST:
1047 return 1;
1048 case STORE_FAST:
1049 return -1;
1050 case DELETE_FAST:
1051 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001052
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001053 case RAISE_VARARGS:
1054 return -oparg;
Serhiy Storchakad4864c62018-01-09 21:54:52 +02001055
1056 /* Functions and calls */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001057 case CALL_FUNCTION:
Victor Stinnerf9b760f2016-09-09 10:17:08 -07001058 return -oparg;
Yury Selivanovf2392132016-12-13 19:03:51 -05001059 case CALL_METHOD:
1060 return -oparg-1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001061 case CALL_FUNCTION_KW:
Victor Stinnerf9b760f2016-09-09 10:17:08 -07001062 return -oparg-1;
1063 case CALL_FUNCTION_EX:
Matthieu Dartiailh3a9ac822017-02-21 14:25:22 +01001064 return -1 - ((oparg & 0x01) != 0);
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001065 case MAKE_FUNCTION:
1066 return -1 - ((oparg & 0x01) != 0) - ((oparg & 0x02) != 0) -
1067 ((oparg & 0x04) != 0) - ((oparg & 0x08) != 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001068 case BUILD_SLICE:
1069 if (oparg == 3)
1070 return -2;
1071 else
1072 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001073
Serhiy Storchakad4864c62018-01-09 21:54:52 +02001074 /* Closures */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001075 case LOAD_CLOSURE:
1076 return 1;
1077 case LOAD_DEREF:
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04001078 case LOAD_CLASSDEREF:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001079 return 1;
1080 case STORE_DEREF:
1081 return -1;
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00001082 case DELETE_DEREF:
1083 return 0;
Serhiy Storchakad4864c62018-01-09 21:54:52 +02001084
1085 /* Iterators and generators */
Yury Selivanov75445082015-05-11 22:57:16 -04001086 case GET_AWAITABLE:
1087 return 0;
1088 case SETUP_ASYNC_WITH:
Serhiy Storchakad4864c62018-01-09 21:54:52 +02001089 /* 0 in the normal flow.
1090 * Restore the stack position to the position before the result
1091 * of __aenter__ and push 6 values before jumping to the handler
1092 * if an exception be raised. */
1093 return jump ? -1 + 6 : 0;
Yury Selivanov75445082015-05-11 22:57:16 -04001094 case BEFORE_ASYNC_WITH:
1095 return 1;
1096 case GET_AITER:
1097 return 0;
1098 case GET_ANEXT:
1099 return 1;
Yury Selivanov5376ba92015-06-22 12:19:30 -04001100 case GET_YIELD_FROM_ITER:
1101 return 0;
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02001102 case END_ASYNC_FOR:
1103 return -7;
Eric V. Smitha78c7952015-11-03 12:45:05 -05001104 case FORMAT_VALUE:
1105 /* If there's a fmt_spec on the stack, we go from 2->1,
1106 else 1->1. */
1107 return (oparg & FVS_MASK) == FVS_HAVE_SPEC ? -1 : 0;
Yury Selivanovf2392132016-12-13 19:03:51 -05001108 case LOAD_METHOD:
1109 return 1;
Zackery Spytzce6a0702019-08-25 03:44:09 -06001110 case LOAD_ASSERTION_ERROR:
1111 return 1;
Mark Shannon13bc1392020-01-23 09:25:17 +00001112 case LIST_TO_TUPLE:
1113 return 0;
1114 case LIST_EXTEND:
1115 case SET_UPDATE:
Mark Shannon8a4cd702020-01-27 09:57:45 +00001116 case DICT_MERGE:
1117 case DICT_UPDATE:
Mark Shannon13bc1392020-01-23 09:25:17 +00001118 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001119 default:
Larry Hastings3a907972013-11-23 14:49:22 -08001120 return PY_INVALID_STACK_EFFECT;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001121 }
Larry Hastings3a907972013-11-23 14:49:22 -08001122 return PY_INVALID_STACK_EFFECT; /* not reachable */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001123}
1124
Serhiy Storchakad4864c62018-01-09 21:54:52 +02001125int
Serhiy Storchaka7bdf2822018-09-18 09:54:26 +03001126PyCompile_OpcodeStackEffectWithJump(int opcode, int oparg, int jump)
1127{
1128 return stack_effect(opcode, oparg, jump);
1129}
1130
1131int
Serhiy Storchakad4864c62018-01-09 21:54:52 +02001132PyCompile_OpcodeStackEffect(int opcode, int oparg)
1133{
1134 return stack_effect(opcode, oparg, -1);
1135}
1136
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001137/* Add an opcode with no argument.
1138 Returns 0 on failure, 1 on success.
1139*/
1140
1141static int
1142compiler_addop(struct compiler *c, int opcode)
1143{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001144 basicblock *b;
1145 struct instr *i;
1146 int off;
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001147 assert(!HAS_ARG(opcode));
Pablo Galindo18c5f9d2019-07-15 10:15:01 +01001148 if (c->c_do_not_emit_bytecode) {
1149 return 1;
1150 }
Andy Lester76d58772020-03-10 21:18:12 -05001151 off = compiler_next_instr(c->u->u_curblock);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001152 if (off < 0)
1153 return 0;
1154 b = c->u->u_curblock;
1155 i = &b->b_instr[off];
1156 i->i_opcode = opcode;
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001157 i->i_oparg = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001158 if (opcode == RETURN_VALUE)
1159 b->b_return = 1;
Serhiy Storchaka61cb3d02020-03-17 18:07:30 +02001160 i->i_lineno = c->u->u_lineno;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001161 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001162}
1163
Victor Stinnerf8e32212013-11-19 23:56:34 +01001164static Py_ssize_t
Andy Lester76d58772020-03-10 21:18:12 -05001165compiler_add_o(PyObject *dict, PyObject *o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001166{
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001167 PyObject *v;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001168 Py_ssize_t arg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001169
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001170 v = PyDict_GetItemWithError(dict, o);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001171 if (!v) {
Stefan Krahc0cbed12015-07-27 12:56:49 +02001172 if (PyErr_Occurred()) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001173 return -1;
Stefan Krahc0cbed12015-07-27 12:56:49 +02001174 }
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +02001175 arg = PyDict_GET_SIZE(dict);
Victor Stinnerad9a0662013-11-19 22:23:20 +01001176 v = PyLong_FromSsize_t(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001177 if (!v) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001178 return -1;
1179 }
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001180 if (PyDict_SetItem(dict, o, v) < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001181 Py_DECREF(v);
1182 return -1;
1183 }
1184 Py_DECREF(v);
1185 }
1186 else
1187 arg = PyLong_AsLong(v);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001188 return arg;
1189}
1190
INADA Naokic2e16072018-11-26 21:23:22 +09001191// Merge const *o* recursively and return constant key object.
1192static PyObject*
1193merge_consts_recursive(struct compiler *c, PyObject *o)
1194{
1195 // None and Ellipsis are singleton, and key is the singleton.
1196 // No need to merge object and key.
1197 if (o == Py_None || o == Py_Ellipsis) {
1198 Py_INCREF(o);
1199 return o;
1200 }
1201
1202 PyObject *key = _PyCode_ConstantKey(o);
1203 if (key == NULL) {
1204 return NULL;
1205 }
1206
1207 // t is borrowed reference
1208 PyObject *t = PyDict_SetDefault(c->c_const_cache, key, key);
1209 if (t != key) {
INADA Naokif7e4d362018-11-29 00:58:46 +09001210 // o is registered in c_const_cache. Just use it.
Zackery Spytz9b4a1b12019-03-20 03:16:25 -06001211 Py_XINCREF(t);
INADA Naokic2e16072018-11-26 21:23:22 +09001212 Py_DECREF(key);
1213 return t;
1214 }
1215
INADA Naokif7e4d362018-11-29 00:58:46 +09001216 // We registered o in c_const_cache.
Simeon63b5fc52019-04-09 19:36:57 -04001217 // When o is a tuple or frozenset, we want to merge its
INADA Naokif7e4d362018-11-29 00:58:46 +09001218 // items too.
INADA Naokic2e16072018-11-26 21:23:22 +09001219 if (PyTuple_CheckExact(o)) {
INADA Naokif7e4d362018-11-29 00:58:46 +09001220 Py_ssize_t len = PyTuple_GET_SIZE(o);
1221 for (Py_ssize_t i = 0; i < len; i++) {
INADA Naokic2e16072018-11-26 21:23:22 +09001222 PyObject *item = PyTuple_GET_ITEM(o, i);
1223 PyObject *u = merge_consts_recursive(c, item);
1224 if (u == NULL) {
1225 Py_DECREF(key);
1226 return NULL;
1227 }
1228
1229 // See _PyCode_ConstantKey()
1230 PyObject *v; // borrowed
1231 if (PyTuple_CheckExact(u)) {
1232 v = PyTuple_GET_ITEM(u, 1);
1233 }
1234 else {
1235 v = u;
1236 }
1237 if (v != item) {
1238 Py_INCREF(v);
1239 PyTuple_SET_ITEM(o, i, v);
1240 Py_DECREF(item);
1241 }
1242
1243 Py_DECREF(u);
1244 }
1245 }
INADA Naokif7e4d362018-11-29 00:58:46 +09001246 else if (PyFrozenSet_CheckExact(o)) {
Simeon63b5fc52019-04-09 19:36:57 -04001247 // *key* is tuple. And its first item is frozenset of
INADA Naokif7e4d362018-11-29 00:58:46 +09001248 // constant keys.
1249 // See _PyCode_ConstantKey() for detail.
1250 assert(PyTuple_CheckExact(key));
1251 assert(PyTuple_GET_SIZE(key) == 2);
1252
1253 Py_ssize_t len = PySet_GET_SIZE(o);
1254 if (len == 0) { // empty frozenset should not be re-created.
1255 return key;
1256 }
1257 PyObject *tuple = PyTuple_New(len);
1258 if (tuple == NULL) {
1259 Py_DECREF(key);
1260 return NULL;
1261 }
1262 Py_ssize_t i = 0, pos = 0;
1263 PyObject *item;
1264 Py_hash_t hash;
1265 while (_PySet_NextEntry(o, &pos, &item, &hash)) {
1266 PyObject *k = merge_consts_recursive(c, item);
1267 if (k == NULL) {
1268 Py_DECREF(tuple);
1269 Py_DECREF(key);
1270 return NULL;
1271 }
1272 PyObject *u;
1273 if (PyTuple_CheckExact(k)) {
1274 u = PyTuple_GET_ITEM(k, 1);
1275 Py_INCREF(u);
1276 Py_DECREF(k);
1277 }
1278 else {
1279 u = k;
1280 }
1281 PyTuple_SET_ITEM(tuple, i, u); // Steals reference of u.
1282 i++;
1283 }
1284
1285 // Instead of rewriting o, we create new frozenset and embed in the
1286 // key tuple. Caller should get merged frozenset from the key tuple.
1287 PyObject *new = PyFrozenSet_New(tuple);
1288 Py_DECREF(tuple);
1289 if (new == NULL) {
1290 Py_DECREF(key);
1291 return NULL;
1292 }
1293 assert(PyTuple_GET_ITEM(key, 1) == o);
1294 Py_DECREF(o);
1295 PyTuple_SET_ITEM(key, 1, new);
1296 }
INADA Naokic2e16072018-11-26 21:23:22 +09001297
1298 return key;
1299}
1300
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001301static Py_ssize_t
1302compiler_add_const(struct compiler *c, PyObject *o)
1303{
Pablo Galindo18c5f9d2019-07-15 10:15:01 +01001304 if (c->c_do_not_emit_bytecode) {
1305 return 0;
1306 }
1307
INADA Naokic2e16072018-11-26 21:23:22 +09001308 PyObject *key = merge_consts_recursive(c, o);
1309 if (key == NULL) {
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001310 return -1;
INADA Naokic2e16072018-11-26 21:23:22 +09001311 }
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001312
Andy Lester76d58772020-03-10 21:18:12 -05001313 Py_ssize_t arg = compiler_add_o(c->u->u_consts, key);
INADA Naokic2e16072018-11-26 21:23:22 +09001314 Py_DECREF(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001315 return arg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001316}
1317
1318static int
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001319compiler_addop_load_const(struct compiler *c, PyObject *o)
1320{
Pablo Galindo18c5f9d2019-07-15 10:15:01 +01001321 if (c->c_do_not_emit_bytecode) {
1322 return 1;
1323 }
1324
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001325 Py_ssize_t arg = compiler_add_const(c, o);
1326 if (arg < 0)
1327 return 0;
1328 return compiler_addop_i(c, LOAD_CONST, arg);
1329}
1330
1331static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001332compiler_addop_o(struct compiler *c, int opcode, PyObject *dict,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001333 PyObject *o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001334{
Pablo Galindo18c5f9d2019-07-15 10:15:01 +01001335 if (c->c_do_not_emit_bytecode) {
1336 return 1;
1337 }
1338
Andy Lester76d58772020-03-10 21:18:12 -05001339 Py_ssize_t arg = compiler_add_o(dict, o);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001340 if (arg < 0)
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00001341 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001342 return compiler_addop_i(c, opcode, arg);
1343}
1344
1345static int
1346compiler_addop_name(struct compiler *c, int opcode, PyObject *dict,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001347 PyObject *o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001348{
Victor Stinnerad9a0662013-11-19 22:23:20 +01001349 Py_ssize_t arg;
Pablo Galindo18c5f9d2019-07-15 10:15:01 +01001350
1351 if (c->c_do_not_emit_bytecode) {
1352 return 1;
1353 }
1354
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001355 PyObject *mangled = _Py_Mangle(c->u->u_private, o);
1356 if (!mangled)
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00001357 return 0;
Andy Lester76d58772020-03-10 21:18:12 -05001358 arg = compiler_add_o(dict, mangled);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001359 Py_DECREF(mangled);
1360 if (arg < 0)
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00001361 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001362 return compiler_addop_i(c, opcode, arg);
1363}
1364
1365/* Add an opcode with an integer argument.
1366 Returns 0 on failure, 1 on success.
1367*/
1368
1369static int
Victor Stinnerf8e32212013-11-19 23:56:34 +01001370compiler_addop_i(struct compiler *c, int opcode, Py_ssize_t oparg)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001371{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001372 struct instr *i;
1373 int off;
Victor Stinnerad9a0662013-11-19 22:23:20 +01001374
Pablo Galindo18c5f9d2019-07-15 10:15:01 +01001375 if (c->c_do_not_emit_bytecode) {
1376 return 1;
1377 }
1378
Victor Stinner2ad474b2016-03-01 23:34:47 +01001379 /* oparg value is unsigned, but a signed C int is usually used to store
1380 it in the C code (like Python/ceval.c).
1381
1382 Limit to 32-bit signed C int (rather than INT_MAX) for portability.
1383
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001384 The argument of a concrete bytecode instruction is limited to 8-bit.
1385 EXTENDED_ARG is used for 16, 24, and 32-bit arguments. */
1386 assert(HAS_ARG(opcode));
Victor Stinner2ad474b2016-03-01 23:34:47 +01001387 assert(0 <= oparg && oparg <= 2147483647);
Victor Stinnerad9a0662013-11-19 22:23:20 +01001388
Andy Lester76d58772020-03-10 21:18:12 -05001389 off = compiler_next_instr(c->u->u_curblock);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001390 if (off < 0)
1391 return 0;
1392 i = &c->u->u_curblock->b_instr[off];
Victor Stinnerf8e32212013-11-19 23:56:34 +01001393 i->i_opcode = opcode;
1394 i->i_oparg = Py_SAFE_DOWNCAST(oparg, Py_ssize_t, int);
Serhiy Storchaka61cb3d02020-03-17 18:07:30 +02001395 i->i_lineno = c->u->u_lineno;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001396 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001397}
1398
1399static int
1400compiler_addop_j(struct compiler *c, int opcode, basicblock *b, int absolute)
1401{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001402 struct instr *i;
1403 int off;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001404
Pablo Galindo18c5f9d2019-07-15 10:15:01 +01001405 if (c->c_do_not_emit_bytecode) {
1406 return 1;
1407 }
1408
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001409 assert(HAS_ARG(opcode));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001410 assert(b != NULL);
Andy Lester76d58772020-03-10 21:18:12 -05001411 off = compiler_next_instr(c->u->u_curblock);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001412 if (off < 0)
1413 return 0;
1414 i = &c->u->u_curblock->b_instr[off];
1415 i->i_opcode = opcode;
1416 i->i_target = b;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001417 if (absolute)
1418 i->i_jabs = 1;
1419 else
1420 i->i_jrel = 1;
Serhiy Storchaka61cb3d02020-03-17 18:07:30 +02001421 i->i_lineno = c->u->u_lineno;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001422 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001423}
1424
Victor Stinnerfc6f2ef2016-02-27 02:19:22 +01001425/* NEXT_BLOCK() creates an implicit jump from the current block
1426 to the new block.
1427
1428 The returns inside this macro make it impossible to decref objects
1429 created in the local function. Local objects should use the arena.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001430*/
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001431#define NEXT_BLOCK(C) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001432 if (compiler_next_block((C)) == NULL) \
1433 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001434}
1435
1436#define ADDOP(C, OP) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001437 if (!compiler_addop((C), (OP))) \
1438 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001439}
1440
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001441#define ADDOP_IN_SCOPE(C, OP) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001442 if (!compiler_addop((C), (OP))) { \
1443 compiler_exit_scope(c); \
1444 return 0; \
1445 } \
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001446}
1447
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001448#define ADDOP_LOAD_CONST(C, O) { \
1449 if (!compiler_addop_load_const((C), (O))) \
1450 return 0; \
1451}
1452
1453/* Same as ADDOP_LOAD_CONST, but steals a reference. */
1454#define ADDOP_LOAD_CONST_NEW(C, O) { \
1455 PyObject *__new_const = (O); \
1456 if (__new_const == NULL) { \
1457 return 0; \
1458 } \
1459 if (!compiler_addop_load_const((C), __new_const)) { \
1460 Py_DECREF(__new_const); \
1461 return 0; \
1462 } \
1463 Py_DECREF(__new_const); \
1464}
1465
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001466#define ADDOP_O(C, OP, O, TYPE) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001467 if (!compiler_addop_o((C), (OP), (C)->u->u_ ## TYPE, (O))) \
1468 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001469}
1470
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03001471/* Same as ADDOP_O, but steals a reference. */
1472#define ADDOP_N(C, OP, O, TYPE) { \
1473 if (!compiler_addop_o((C), (OP), (C)->u->u_ ## TYPE, (O))) { \
1474 Py_DECREF((O)); \
1475 return 0; \
1476 } \
1477 Py_DECREF((O)); \
1478}
1479
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001480#define ADDOP_NAME(C, OP, O, TYPE) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001481 if (!compiler_addop_name((C), (OP), (C)->u->u_ ## TYPE, (O))) \
1482 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001483}
1484
1485#define ADDOP_I(C, OP, O) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001486 if (!compiler_addop_i((C), (OP), (O))) \
1487 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001488}
1489
1490#define ADDOP_JABS(C, OP, O) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001491 if (!compiler_addop_j((C), (OP), (O), 1)) \
1492 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001493}
1494
1495#define ADDOP_JREL(C, OP, O) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001496 if (!compiler_addop_j((C), (OP), (O), 0)) \
1497 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001498}
1499
Mark Shannon9af0e472020-01-14 10:12:45 +00001500
1501#define ADDOP_COMPARE(C, CMP) { \
1502 if (!compiler_addcompare((C), (cmpop_ty)(CMP))) \
1503 return 0; \
1504}
1505
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001506/* VISIT and VISIT_SEQ takes an ASDL type as their second argument. They use
1507 the ASDL name to synthesize the name of the C type and the visit function.
1508*/
1509
1510#define VISIT(C, TYPE, V) {\
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001511 if (!compiler_visit_ ## TYPE((C), (V))) \
1512 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001513}
1514
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001515#define VISIT_IN_SCOPE(C, TYPE, V) {\
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001516 if (!compiler_visit_ ## TYPE((C), (V))) { \
1517 compiler_exit_scope(c); \
1518 return 0; \
1519 } \
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001520}
1521
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001522#define VISIT_SLICE(C, V, CTX) {\
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001523 if (!compiler_visit_slice((C), (V), (CTX))) \
1524 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001525}
1526
1527#define VISIT_SEQ(C, TYPE, SEQ) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001528 int _i; \
1529 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
1530 for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \
1531 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \
1532 if (!compiler_visit_ ## TYPE((C), elt)) \
1533 return 0; \
1534 } \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001535}
1536
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001537#define VISIT_SEQ_IN_SCOPE(C, TYPE, SEQ) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001538 int _i; \
1539 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
1540 for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \
1541 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \
1542 if (!compiler_visit_ ## TYPE((C), elt)) { \
1543 compiler_exit_scope(c); \
1544 return 0; \
1545 } \
1546 } \
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001547}
1548
Pablo Galindo18c5f9d2019-07-15 10:15:01 +01001549/* These macros allows to check only for errors and not emmit bytecode
1550 * while visiting nodes.
1551*/
1552
1553#define BEGIN_DO_NOT_EMIT_BYTECODE { \
1554 c->c_do_not_emit_bytecode++;
1555
1556#define END_DO_NOT_EMIT_BYTECODE \
1557 c->c_do_not_emit_bytecode--; \
1558}
1559
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001560/* Search if variable annotations are present statically in a block. */
1561
1562static int
1563find_ann(asdl_seq *stmts)
1564{
1565 int i, j, res = 0;
1566 stmt_ty st;
1567
1568 for (i = 0; i < asdl_seq_LEN(stmts); i++) {
1569 st = (stmt_ty)asdl_seq_GET(stmts, i);
1570 switch (st->kind) {
1571 case AnnAssign_kind:
1572 return 1;
1573 case For_kind:
1574 res = find_ann(st->v.For.body) ||
1575 find_ann(st->v.For.orelse);
1576 break;
1577 case AsyncFor_kind:
1578 res = find_ann(st->v.AsyncFor.body) ||
1579 find_ann(st->v.AsyncFor.orelse);
1580 break;
1581 case While_kind:
1582 res = find_ann(st->v.While.body) ||
1583 find_ann(st->v.While.orelse);
1584 break;
1585 case If_kind:
1586 res = find_ann(st->v.If.body) ||
1587 find_ann(st->v.If.orelse);
1588 break;
1589 case With_kind:
1590 res = find_ann(st->v.With.body);
1591 break;
1592 case AsyncWith_kind:
1593 res = find_ann(st->v.AsyncWith.body);
1594 break;
1595 case Try_kind:
1596 for (j = 0; j < asdl_seq_LEN(st->v.Try.handlers); j++) {
1597 excepthandler_ty handler = (excepthandler_ty)asdl_seq_GET(
1598 st->v.Try.handlers, j);
1599 if (find_ann(handler->v.ExceptHandler.body)) {
1600 return 1;
1601 }
1602 }
1603 res = find_ann(st->v.Try.body) ||
1604 find_ann(st->v.Try.finalbody) ||
1605 find_ann(st->v.Try.orelse);
1606 break;
1607 default:
1608 res = 0;
1609 }
1610 if (res) {
1611 break;
1612 }
1613 }
1614 return res;
1615}
1616
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001617/*
1618 * Frame block handling functions
1619 */
1620
1621static int
1622compiler_push_fblock(struct compiler *c, enum fblocktype t, basicblock *b,
Mark Shannonfee55262019-11-21 09:11:43 +00001623 basicblock *exit, void *datum)
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001624{
1625 struct fblockinfo *f;
1626 if (c->u->u_nfblocks >= CO_MAXBLOCKS) {
1627 PyErr_SetString(PyExc_SyntaxError,
1628 "too many statically nested blocks");
1629 return 0;
1630 }
1631 f = &c->u->u_fblock[c->u->u_nfblocks++];
1632 f->fb_type = t;
1633 f->fb_block = b;
1634 f->fb_exit = exit;
Mark Shannonfee55262019-11-21 09:11:43 +00001635 f->fb_datum = datum;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001636 return 1;
1637}
1638
1639static void
1640compiler_pop_fblock(struct compiler *c, enum fblocktype t, basicblock *b)
1641{
1642 struct compiler_unit *u = c->u;
1643 assert(u->u_nfblocks > 0);
1644 u->u_nfblocks--;
1645 assert(u->u_fblock[u->u_nfblocks].fb_type == t);
1646 assert(u->u_fblock[u->u_nfblocks].fb_block == b);
1647}
1648
Mark Shannonfee55262019-11-21 09:11:43 +00001649static int
1650compiler_call_exit_with_nones(struct compiler *c) {
1651 ADDOP_O(c, LOAD_CONST, Py_None, consts);
1652 ADDOP(c, DUP_TOP);
1653 ADDOP(c, DUP_TOP);
1654 ADDOP_I(c, CALL_FUNCTION, 3);
1655 return 1;
1656}
1657
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001658/* Unwind a frame block. If preserve_tos is true, the TOS before
Mark Shannonfee55262019-11-21 09:11:43 +00001659 * popping the blocks will be restored afterwards, unless another
1660 * return, break or continue is found. In which case, the TOS will
1661 * be popped.
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001662 */
1663static int
1664compiler_unwind_fblock(struct compiler *c, struct fblockinfo *info,
1665 int preserve_tos)
1666{
1667 switch (info->fb_type) {
1668 case WHILE_LOOP:
1669 return 1;
1670
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001671 case FOR_LOOP:
1672 /* Pop the iterator */
1673 if (preserve_tos) {
1674 ADDOP(c, ROT_TWO);
1675 }
1676 ADDOP(c, POP_TOP);
1677 return 1;
1678
1679 case EXCEPT:
1680 ADDOP(c, POP_BLOCK);
1681 return 1;
1682
1683 case FINALLY_TRY:
1684 ADDOP(c, POP_BLOCK);
Serhiy Storchakaef61c522019-08-24 13:11:52 +03001685 if (preserve_tos) {
Mark Shannonfee55262019-11-21 09:11:43 +00001686 if (!compiler_push_fblock(c, POP_VALUE, NULL, NULL, NULL)) {
1687 return 0;
1688 }
Serhiy Storchakaef61c522019-08-24 13:11:52 +03001689 }
Mark Shannon88dce262019-12-30 09:53:36 +00001690 /* Emit the finally block, restoring the line number when done */
1691 int saved_lineno = c->u->u_lineno;
Mark Shannonfee55262019-11-21 09:11:43 +00001692 VISIT_SEQ(c, stmt, info->fb_datum);
Mark Shannon88dce262019-12-30 09:53:36 +00001693 c->u->u_lineno = saved_lineno;
Mark Shannonfee55262019-11-21 09:11:43 +00001694 if (preserve_tos) {
1695 compiler_pop_fblock(c, POP_VALUE, NULL);
Serhiy Storchakaef61c522019-08-24 13:11:52 +03001696 }
1697 return 1;
Mark Shannon13bc1392020-01-23 09:25:17 +00001698
Mark Shannonfee55262019-11-21 09:11:43 +00001699 case FINALLY_END:
1700 if (preserve_tos) {
1701 ADDOP(c, ROT_FOUR);
1702 }
1703 ADDOP(c, POP_TOP);
1704 ADDOP(c, POP_TOP);
1705 ADDOP(c, POP_TOP);
1706 if (preserve_tos) {
1707 ADDOP(c, ROT_FOUR);
1708 }
1709 ADDOP(c, POP_EXCEPT);
1710 return 1;
Serhiy Storchakaef61c522019-08-24 13:11:52 +03001711
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001712 case WITH:
1713 case ASYNC_WITH:
1714 ADDOP(c, POP_BLOCK);
1715 if (preserve_tos) {
1716 ADDOP(c, ROT_TWO);
1717 }
Mark Shannonfee55262019-11-21 09:11:43 +00001718 if(!compiler_call_exit_with_nones(c)) {
1719 return 0;
1720 }
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001721 if (info->fb_type == ASYNC_WITH) {
1722 ADDOP(c, GET_AWAITABLE);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001723 ADDOP_LOAD_CONST(c, Py_None);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001724 ADDOP(c, YIELD_FROM);
1725 }
Mark Shannonfee55262019-11-21 09:11:43 +00001726 ADDOP(c, POP_TOP);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001727 return 1;
1728
1729 case HANDLER_CLEANUP:
Mark Shannonfee55262019-11-21 09:11:43 +00001730 if (info->fb_datum) {
1731 ADDOP(c, POP_BLOCK);
1732 }
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001733 if (preserve_tos) {
1734 ADDOP(c, ROT_FOUR);
1735 }
Mark Shannonfee55262019-11-21 09:11:43 +00001736 ADDOP(c, POP_EXCEPT);
1737 if (info->fb_datum) {
1738 ADDOP_LOAD_CONST(c, Py_None);
1739 compiler_nameop(c, info->fb_datum, Store);
1740 compiler_nameop(c, info->fb_datum, Del);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001741 }
Mark Shannonfee55262019-11-21 09:11:43 +00001742 return 1;
1743
1744 case POP_VALUE:
1745 if (preserve_tos) {
1746 ADDOP(c, ROT_TWO);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001747 }
Mark Shannonfee55262019-11-21 09:11:43 +00001748 ADDOP(c, POP_TOP);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001749 return 1;
1750 }
1751 Py_UNREACHABLE();
1752}
1753
Mark Shannonfee55262019-11-21 09:11:43 +00001754/** Unwind block stack. If loop is not NULL, then stop when the first loop is encountered. */
1755static int
1756compiler_unwind_fblock_stack(struct compiler *c, int preserve_tos, struct fblockinfo **loop) {
1757 if (c->u->u_nfblocks == 0) {
1758 return 1;
1759 }
1760 struct fblockinfo *top = &c->u->u_fblock[c->u->u_nfblocks-1];
1761 if (loop != NULL && (top->fb_type == WHILE_LOOP || top->fb_type == FOR_LOOP)) {
1762 *loop = top;
1763 return 1;
1764 }
1765 struct fblockinfo copy = *top;
1766 c->u->u_nfblocks--;
1767 if (!compiler_unwind_fblock(c, &copy, preserve_tos)) {
1768 return 0;
1769 }
1770 if (!compiler_unwind_fblock_stack(c, preserve_tos, loop)) {
1771 return 0;
1772 }
1773 c->u->u_fblock[c->u->u_nfblocks] = copy;
1774 c->u->u_nfblocks++;
1775 return 1;
1776}
1777
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001778/* Compile a sequence of statements, checking for a docstring
1779 and for annotations. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001780
1781static int
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001782compiler_body(struct compiler *c, asdl_seq *stmts)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001783{
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001784 int i = 0;
1785 stmt_ty st;
Serhiy Storchaka143ce5c2018-05-30 10:56:16 +03001786 PyObject *docstring;
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001787
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001788 /* Set current line number to the line number of first statement.
1789 This way line number for SETUP_ANNOTATIONS will always
1790 coincide with the line number of first "real" statement in module.
Hansraj Das01171eb2019-10-09 07:54:02 +05301791 If body is empty, then lineno will be set later in assemble. */
Serhiy Storchaka61cb3d02020-03-17 18:07:30 +02001792 if (c->u->u_scope_type == COMPILER_SCOPE_MODULE && asdl_seq_LEN(stmts)) {
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001793 st = (stmt_ty)asdl_seq_GET(stmts, 0);
Serhiy Storchaka61cb3d02020-03-17 18:07:30 +02001794 SET_LOC(c, st);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001795 }
1796 /* Every annotated class and module should have __annotations__. */
1797 if (find_ann(stmts)) {
1798 ADDOP(c, SETUP_ANNOTATIONS);
1799 }
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001800 if (!asdl_seq_LEN(stmts))
1801 return 1;
INADA Naokicb41b272017-02-23 00:31:59 +09001802 /* if not -OO mode, set docstring */
Serhiy Storchaka143ce5c2018-05-30 10:56:16 +03001803 if (c->c_optimize < 2) {
1804 docstring = _PyAST_GetDocString(stmts);
1805 if (docstring) {
1806 i = 1;
1807 st = (stmt_ty)asdl_seq_GET(stmts, 0);
1808 assert(st->kind == Expr_kind);
1809 VISIT(c, expr, st->v.Expr.value);
1810 if (!compiler_nameop(c, __doc__, Store))
1811 return 0;
1812 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001813 }
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001814 for (; i < asdl_seq_LEN(stmts); i++)
1815 VISIT(c, stmt, (stmt_ty)asdl_seq_GET(stmts, i));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001816 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001817}
1818
1819static PyCodeObject *
1820compiler_mod(struct compiler *c, mod_ty mod)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001821{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001822 PyCodeObject *co;
1823 int addNone = 1;
1824 static PyObject *module;
1825 if (!module) {
1826 module = PyUnicode_InternFromString("<module>");
1827 if (!module)
1828 return NULL;
1829 }
1830 /* Use 0 for firstlineno initially, will fixup in assemble(). */
Antoine Pitrou86a36b52011-11-25 18:56:07 +01001831 if (!compiler_enter_scope(c, module, COMPILER_SCOPE_MODULE, mod, 0))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001832 return NULL;
1833 switch (mod->kind) {
1834 case Module_kind:
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001835 if (!compiler_body(c, mod->v.Module.body)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001836 compiler_exit_scope(c);
1837 return 0;
1838 }
1839 break;
1840 case Interactive_kind:
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001841 if (find_ann(mod->v.Interactive.body)) {
1842 ADDOP(c, SETUP_ANNOTATIONS);
1843 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001844 c->c_interactive = 1;
1845 VISIT_SEQ_IN_SCOPE(c, stmt,
1846 mod->v.Interactive.body);
1847 break;
1848 case Expression_kind:
1849 VISIT_IN_SCOPE(c, expr, mod->v.Expression.body);
1850 addNone = 0;
1851 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001852 default:
1853 PyErr_Format(PyExc_SystemError,
1854 "module kind %d should not be possible",
1855 mod->kind);
1856 return 0;
1857 }
1858 co = assemble(c, addNone);
1859 compiler_exit_scope(c);
1860 return co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001861}
1862
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001863/* The test for LOCAL must come before the test for FREE in order to
1864 handle classes where name is both local and free. The local var is
1865 a method and the free var is a free var referenced within a method.
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001866*/
1867
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001868static int
1869get_ref_type(struct compiler *c, PyObject *name)
1870{
Victor Stinner0b1bc562013-05-16 22:17:17 +02001871 int scope;
Benjamin Peterson312595c2013-05-15 15:26:42 -05001872 if (c->u->u_scope_type == COMPILER_SCOPE_CLASS &&
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02001873 _PyUnicode_EqualToASCIIString(name, "__class__"))
Benjamin Peterson312595c2013-05-15 15:26:42 -05001874 return CELL;
Victor Stinner0b1bc562013-05-16 22:17:17 +02001875 scope = PyST_GetScope(c->u->u_ste, name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001876 if (scope == 0) {
Victor Stinner87d3b9d2020-03-25 19:27:36 +01001877 _Py_FatalErrorFormat(__func__,
1878 "unknown scope for %.100s in %.100s(%s)\n"
1879 "symbols: %s\nlocals: %s\nglobals: %s",
1880 PyUnicode_AsUTF8(name),
1881 PyUnicode_AsUTF8(c->u->u_name),
1882 PyUnicode_AsUTF8(PyObject_Repr(c->u->u_ste->ste_id)),
1883 PyUnicode_AsUTF8(PyObject_Repr(c->u->u_ste->ste_symbols)),
1884 PyUnicode_AsUTF8(PyObject_Repr(c->u->u_varnames)),
1885 PyUnicode_AsUTF8(PyObject_Repr(c->u->u_names)));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001886 }
Tim Peters2a7f3842001-06-09 09:26:21 +00001887
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001888 return scope;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001889}
1890
1891static int
1892compiler_lookup_arg(PyObject *dict, PyObject *name)
1893{
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001894 PyObject *v;
1895 v = PyDict_GetItem(dict, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001896 if (v == NULL)
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00001897 return -1;
Christian Heimes217cfd12007-12-02 14:31:20 +00001898 return PyLong_AS_LONG(v);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001899}
1900
1901static int
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001902compiler_make_closure(struct compiler *c, PyCodeObject *co, Py_ssize_t flags, PyObject *qualname)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001903{
Victor Stinnerad9a0662013-11-19 22:23:20 +01001904 Py_ssize_t i, free = PyCode_GetNumFree(co);
Antoine Pitrou86a36b52011-11-25 18:56:07 +01001905 if (qualname == NULL)
1906 qualname = co->co_name;
1907
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001908 if (free) {
1909 for (i = 0; i < free; ++i) {
1910 /* Bypass com_addop_varname because it will generate
1911 LOAD_DEREF but LOAD_CLOSURE is needed.
1912 */
1913 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
1914 int arg, reftype;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001915
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001916 /* Special case: If a class contains a method with a
1917 free variable that has the same name as a method,
1918 the name will be considered free *and* local in the
1919 class. It should be handled by the closure, as
Min ho Kimc4cacc82019-07-31 08:16:13 +10001920 well as by the normal name lookup logic.
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001921 */
1922 reftype = get_ref_type(c, name);
1923 if (reftype == CELL)
1924 arg = compiler_lookup_arg(c->u->u_cellvars, name);
1925 else /* (reftype == FREE) */
1926 arg = compiler_lookup_arg(c->u->u_freevars, name);
1927 if (arg == -1) {
Victor Stinner87d3b9d2020-03-25 19:27:36 +01001928 _Py_FatalErrorFormat(__func__,
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001929 "lookup %s in %s %d %d\n"
1930 "freevars of %s: %s\n",
1931 PyUnicode_AsUTF8(PyObject_Repr(name)),
1932 PyUnicode_AsUTF8(c->u->u_name),
1933 reftype, arg,
1934 PyUnicode_AsUTF8(co->co_name),
1935 PyUnicode_AsUTF8(PyObject_Repr(co->co_freevars)));
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001936 }
1937 ADDOP_I(c, LOAD_CLOSURE, arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001938 }
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001939 flags |= 0x08;
1940 ADDOP_I(c, BUILD_TUPLE, free);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001941 }
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001942 ADDOP_LOAD_CONST(c, (PyObject*)co);
1943 ADDOP_LOAD_CONST(c, qualname);
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001944 ADDOP_I(c, MAKE_FUNCTION, flags);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001945 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001946}
1947
1948static int
1949compiler_decorators(struct compiler *c, asdl_seq* decos)
1950{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001951 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001952
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001953 if (!decos)
1954 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001955
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001956 for (i = 0; i < asdl_seq_LEN(decos); i++) {
1957 VISIT(c, expr, (expr_ty)asdl_seq_GET(decos, i));
1958 }
1959 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001960}
1961
1962static int
Guido van Rossum4f72a782006-10-27 23:31:49 +00001963compiler_visit_kwonlydefaults(struct compiler *c, asdl_seq *kwonlyargs,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001964 asdl_seq *kw_defaults)
Guido van Rossum4f72a782006-10-27 23:31:49 +00001965{
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03001966 /* Push a dict of keyword-only default values.
1967
1968 Return 0 on error, -1 if no dict pushed, 1 if a dict is pushed.
1969 */
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001970 int i;
1971 PyObject *keys = NULL;
1972
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001973 for (i = 0; i < asdl_seq_LEN(kwonlyargs); i++) {
1974 arg_ty arg = asdl_seq_GET(kwonlyargs, i);
1975 expr_ty default_ = asdl_seq_GET(kw_defaults, i);
1976 if (default_) {
Benjamin Peterson32c59b62012-04-17 19:53:21 -04001977 PyObject *mangled = _Py_Mangle(c->u->u_private, arg->arg);
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001978 if (!mangled) {
1979 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001980 }
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001981 if (keys == NULL) {
1982 keys = PyList_New(1);
1983 if (keys == NULL) {
1984 Py_DECREF(mangled);
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03001985 return 0;
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001986 }
1987 PyList_SET_ITEM(keys, 0, mangled);
1988 }
1989 else {
1990 int res = PyList_Append(keys, mangled);
1991 Py_DECREF(mangled);
1992 if (res == -1) {
1993 goto error;
1994 }
1995 }
1996 if (!compiler_visit_expr(c, default_)) {
1997 goto error;
1998 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001999 }
2000 }
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002001 if (keys != NULL) {
2002 Py_ssize_t default_count = PyList_GET_SIZE(keys);
2003 PyObject *keys_tuple = PyList_AsTuple(keys);
2004 Py_DECREF(keys);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03002005 ADDOP_LOAD_CONST_NEW(c, keys_tuple);
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002006 ADDOP_I(c, BUILD_CONST_KEY_MAP, default_count);
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03002007 assert(default_count > 0);
2008 return 1;
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002009 }
2010 else {
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03002011 return -1;
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002012 }
2013
2014error:
2015 Py_XDECREF(keys);
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03002016 return 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +00002017}
2018
2019static int
Guido van Rossum95e4d582018-01-26 08:20:18 -08002020compiler_visit_annexpr(struct compiler *c, expr_ty annotation)
2021{
Serhiy Storchaka64fddc42018-05-17 06:17:48 +03002022 ADDOP_LOAD_CONST_NEW(c, _PyAST_ExprAsUnicode(annotation));
Guido van Rossum95e4d582018-01-26 08:20:18 -08002023 return 1;
2024}
2025
2026static int
Neal Norwitzc1505362006-12-28 06:47:50 +00002027compiler_visit_argannotation(struct compiler *c, identifier id,
2028 expr_ty annotation, PyObject *names)
2029{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002030 if (annotation) {
Victor Stinner065efc32014-02-18 22:07:56 +01002031 PyObject *mangled;
Guido van Rossum95e4d582018-01-26 08:20:18 -08002032 if (c->c_future->ff_features & CO_FUTURE_ANNOTATIONS) {
2033 VISIT(c, annexpr, annotation)
2034 }
2035 else {
2036 VISIT(c, expr, annotation);
2037 }
Victor Stinner065efc32014-02-18 22:07:56 +01002038 mangled = _Py_Mangle(c->u->u_private, id);
Yury Selivanov34ce99f2014-02-18 12:49:41 -05002039 if (!mangled)
Yury Selivanovf315c1c2015-07-23 09:10:44 +03002040 return 0;
Yury Selivanov34ce99f2014-02-18 12:49:41 -05002041 if (PyList_Append(names, mangled) < 0) {
2042 Py_DECREF(mangled);
Yury Selivanovf315c1c2015-07-23 09:10:44 +03002043 return 0;
Yury Selivanov34ce99f2014-02-18 12:49:41 -05002044 }
2045 Py_DECREF(mangled);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002046 }
Yury Selivanovf315c1c2015-07-23 09:10:44 +03002047 return 1;
Neal Norwitzc1505362006-12-28 06:47:50 +00002048}
2049
2050static int
2051compiler_visit_argannotations(struct compiler *c, asdl_seq* args,
2052 PyObject *names)
2053{
Yury Selivanovf315c1c2015-07-23 09:10:44 +03002054 int i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002055 for (i = 0; i < asdl_seq_LEN(args); i++) {
2056 arg_ty arg = (arg_ty)asdl_seq_GET(args, i);
Yury Selivanovf315c1c2015-07-23 09:10:44 +03002057 if (!compiler_visit_argannotation(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002058 c,
2059 arg->arg,
2060 arg->annotation,
Yury Selivanovf315c1c2015-07-23 09:10:44 +03002061 names))
2062 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002063 }
Yury Selivanovf315c1c2015-07-23 09:10:44 +03002064 return 1;
Neal Norwitzc1505362006-12-28 06:47:50 +00002065}
2066
2067static int
2068compiler_visit_annotations(struct compiler *c, arguments_ty args,
2069 expr_ty returns)
2070{
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03002071 /* Push arg annotation dict.
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002072 The expressions are evaluated out-of-order wrt the source code.
Neal Norwitzc1505362006-12-28 06:47:50 +00002073
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03002074 Return 0 on error, -1 if no dict pushed, 1 if a dict is pushed.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002075 */
2076 static identifier return_str;
2077 PyObject *names;
Victor Stinnerad9a0662013-11-19 22:23:20 +01002078 Py_ssize_t len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002079 names = PyList_New(0);
2080 if (!names)
Serhiy Storchaka694de3b2016-06-15 20:06:07 +03002081 return 0;
Neal Norwitzc1505362006-12-28 06:47:50 +00002082
Yury Selivanovf315c1c2015-07-23 09:10:44 +03002083 if (!compiler_visit_argannotations(c, args->args, names))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002084 goto error;
Pablo Galindoa0c01bf2019-05-31 15:19:50 +01002085 if (!compiler_visit_argannotations(c, args->posonlyargs, names))
2086 goto error;
Benjamin Petersoncda75be2013-03-18 10:48:58 -07002087 if (args->vararg && args->vararg->annotation &&
Yury Selivanovf315c1c2015-07-23 09:10:44 +03002088 !compiler_visit_argannotation(c, args->vararg->arg,
Benjamin Petersoncda75be2013-03-18 10:48:58 -07002089 args->vararg->annotation, names))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002090 goto error;
Yury Selivanovf315c1c2015-07-23 09:10:44 +03002091 if (!compiler_visit_argannotations(c, args->kwonlyargs, names))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002092 goto error;
Benjamin Petersoncda75be2013-03-18 10:48:58 -07002093 if (args->kwarg && args->kwarg->annotation &&
Yury Selivanovf315c1c2015-07-23 09:10:44 +03002094 !compiler_visit_argannotation(c, args->kwarg->arg,
Benjamin Petersoncda75be2013-03-18 10:48:58 -07002095 args->kwarg->annotation, names))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002096 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +00002097
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002098 if (!return_str) {
2099 return_str = PyUnicode_InternFromString("return");
2100 if (!return_str)
2101 goto error;
2102 }
Yury Selivanovf315c1c2015-07-23 09:10:44 +03002103 if (!compiler_visit_argannotation(c, return_str, returns, names)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002104 goto error;
2105 }
2106
2107 len = PyList_GET_SIZE(names);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002108 if (len) {
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002109 PyObject *keytuple = PyList_AsTuple(names);
2110 Py_DECREF(names);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03002111 ADDOP_LOAD_CONST_NEW(c, keytuple);
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002112 ADDOP_I(c, BUILD_CONST_KEY_MAP, len);
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03002113 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002114 }
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002115 else {
2116 Py_DECREF(names);
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03002117 return -1;
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002118 }
Neal Norwitzc1505362006-12-28 06:47:50 +00002119
2120error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002121 Py_DECREF(names);
Serhiy Storchaka694de3b2016-06-15 20:06:07 +03002122 return 0;
Neal Norwitzc1505362006-12-28 06:47:50 +00002123}
2124
2125static int
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03002126compiler_visit_defaults(struct compiler *c, arguments_ty args)
2127{
2128 VISIT_SEQ(c, expr, args->defaults);
2129 ADDOP_I(c, BUILD_TUPLE, asdl_seq_LEN(args->defaults));
2130 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002131}
2132
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002133static Py_ssize_t
2134compiler_default_arguments(struct compiler *c, arguments_ty args)
2135{
2136 Py_ssize_t funcflags = 0;
2137 if (args->defaults && asdl_seq_LEN(args->defaults) > 0) {
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03002138 if (!compiler_visit_defaults(c, args))
2139 return -1;
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002140 funcflags |= 0x01;
2141 }
2142 if (args->kwonlyargs) {
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03002143 int res = compiler_visit_kwonlydefaults(c, args->kwonlyargs,
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002144 args->kw_defaults);
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03002145 if (res == 0) {
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002146 return -1;
2147 }
2148 else if (res > 0) {
2149 funcflags |= 0x02;
2150 }
2151 }
2152 return funcflags;
2153}
2154
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002155static int
Pablo Galindoc5fc1562020-04-22 23:29:27 +01002156forbidden_name(struct compiler *c, identifier name, expr_context_ty ctx)
2157{
2158
2159 if (ctx == Store && _PyUnicode_EqualToASCIIString(name, "__debug__")) {
2160 compiler_error(c, "cannot assign to __debug__");
2161 return 1;
2162 }
2163 return 0;
2164}
2165
2166static int
2167compiler_check_debug_one_arg(struct compiler *c, arg_ty arg)
2168{
2169 if (arg != NULL) {
2170 if (forbidden_name(c, arg->arg, Store))
2171 return 0;
2172 }
2173 return 1;
2174}
2175
2176static int
2177compiler_check_debug_args_seq(struct compiler *c, asdl_seq *args)
2178{
2179 if (args != NULL) {
Pablo Galindoee40e4b2020-04-23 03:43:08 +01002180 for (Py_ssize_t i = 0, n = asdl_seq_LEN(args); i < n; i++) {
Pablo Galindoc5fc1562020-04-22 23:29:27 +01002181 if (!compiler_check_debug_one_arg(c, asdl_seq_GET(args, i)))
2182 return 0;
2183 }
2184 }
2185 return 1;
2186}
2187
2188static int
2189compiler_check_debug_args(struct compiler *c, arguments_ty args)
2190{
2191 if (!compiler_check_debug_args_seq(c, args->posonlyargs))
2192 return 0;
2193 if (!compiler_check_debug_args_seq(c, args->args))
2194 return 0;
2195 if (!compiler_check_debug_one_arg(c, args->vararg))
2196 return 0;
2197 if (!compiler_check_debug_args_seq(c, args->kwonlyargs))
2198 return 0;
2199 if (!compiler_check_debug_one_arg(c, args->kwarg))
2200 return 0;
2201 return 1;
2202}
2203
2204static int
Yury Selivanov75445082015-05-11 22:57:16 -04002205compiler_function(struct compiler *c, stmt_ty s, int is_async)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002206{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002207 PyCodeObject *co;
Serhiy Storchaka143ce5c2018-05-30 10:56:16 +03002208 PyObject *qualname, *docstring = NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04002209 arguments_ty args;
2210 expr_ty returns;
2211 identifier name;
2212 asdl_seq* decos;
2213 asdl_seq *body;
INADA Naokicb41b272017-02-23 00:31:59 +09002214 Py_ssize_t i, funcflags;
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03002215 int annotations;
Yury Selivanov75445082015-05-11 22:57:16 -04002216 int scope_type;
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +02002217 int firstlineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002218
Yury Selivanov75445082015-05-11 22:57:16 -04002219 if (is_async) {
2220 assert(s->kind == AsyncFunctionDef_kind);
2221
2222 args = s->v.AsyncFunctionDef.args;
2223 returns = s->v.AsyncFunctionDef.returns;
2224 decos = s->v.AsyncFunctionDef.decorator_list;
2225 name = s->v.AsyncFunctionDef.name;
2226 body = s->v.AsyncFunctionDef.body;
2227
2228 scope_type = COMPILER_SCOPE_ASYNC_FUNCTION;
2229 } else {
2230 assert(s->kind == FunctionDef_kind);
2231
2232 args = s->v.FunctionDef.args;
2233 returns = s->v.FunctionDef.returns;
2234 decos = s->v.FunctionDef.decorator_list;
2235 name = s->v.FunctionDef.name;
2236 body = s->v.FunctionDef.body;
2237
2238 scope_type = COMPILER_SCOPE_FUNCTION;
2239 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002240
Pablo Galindoc5fc1562020-04-22 23:29:27 +01002241 if (!compiler_check_debug_args(c, args))
2242 return 0;
2243
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002244 if (!compiler_decorators(c, decos))
2245 return 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +00002246
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +02002247 firstlineno = s->lineno;
2248 if (asdl_seq_LEN(decos)) {
2249 firstlineno = ((expr_ty)asdl_seq_GET(decos, 0))->lineno;
2250 }
2251
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002252 funcflags = compiler_default_arguments(c, args);
2253 if (funcflags == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002254 return 0;
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002255 }
2256
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03002257 annotations = compiler_visit_annotations(c, args, returns);
2258 if (annotations == 0) {
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002259 return 0;
2260 }
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03002261 else if (annotations > 0) {
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002262 funcflags |= 0x04;
2263 }
2264
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +02002265 if (!compiler_enter_scope(c, name, scope_type, (void *)s, firstlineno)) {
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002266 return 0;
2267 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002268
INADA Naokicb41b272017-02-23 00:31:59 +09002269 /* if not -OO mode, add docstring */
Serhiy Storchaka143ce5c2018-05-30 10:56:16 +03002270 if (c->c_optimize < 2) {
2271 docstring = _PyAST_GetDocString(body);
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03002272 }
Serhiy Storchaka143ce5c2018-05-30 10:56:16 +03002273 if (compiler_add_const(c, docstring ? docstring : Py_None) < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002274 compiler_exit_scope(c);
2275 return 0;
2276 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002277
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002278 c->u->u_argcount = asdl_seq_LEN(args->args);
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01002279 c->u->u_posonlyargcount = asdl_seq_LEN(args->posonlyargs);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002280 c->u->u_kwonlyargcount = asdl_seq_LEN(args->kwonlyargs);
INADA Naokicb41b272017-02-23 00:31:59 +09002281 VISIT_SEQ_IN_SCOPE(c, stmt, body);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002282 co = assemble(c, 1);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04002283 qualname = c->u->u_qualname;
2284 Py_INCREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002285 compiler_exit_scope(c);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04002286 if (co == NULL) {
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002287 Py_XDECREF(qualname);
2288 Py_XDECREF(co);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002289 return 0;
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002290 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002291
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002292 compiler_make_closure(c, co, funcflags, qualname);
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002293 Py_DECREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002294 Py_DECREF(co);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002295
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002296 /* decorators */
2297 for (i = 0; i < asdl_seq_LEN(decos); i++) {
2298 ADDOP_I(c, CALL_FUNCTION, 1);
2299 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002300
Yury Selivanov75445082015-05-11 22:57:16 -04002301 return compiler_nameop(c, name, Store);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002302}
2303
2304static int
2305compiler_class(struct compiler *c, stmt_ty s)
2306{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002307 PyCodeObject *co;
2308 PyObject *str;
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +02002309 int i, firstlineno;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002310 asdl_seq* decos = s->v.ClassDef.decorator_list;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002311
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002312 if (!compiler_decorators(c, decos))
2313 return 0;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002314
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +02002315 firstlineno = s->lineno;
2316 if (asdl_seq_LEN(decos)) {
2317 firstlineno = ((expr_ty)asdl_seq_GET(decos, 0))->lineno;
2318 }
2319
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002320 /* ultimately generate code for:
2321 <name> = __build_class__(<func>, <name>, *<bases>, **<keywords>)
2322 where:
2323 <func> is a function/closure created from the class body;
2324 it has a single argument (__locals__) where the dict
2325 (or MutableSequence) representing the locals is passed
2326 <name> is the class name
2327 <bases> is the positional arguments and *varargs argument
2328 <keywords> is the keyword arguments and **kwds argument
2329 This borrows from compiler_call.
2330 */
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002331
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002332 /* 1. compile the class body into a code object */
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002333 if (!compiler_enter_scope(c, s->v.ClassDef.name,
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +02002334 COMPILER_SCOPE_CLASS, (void *)s, firstlineno))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002335 return 0;
2336 /* this block represents what we do in the new scope */
2337 {
2338 /* use the class name for name mangling */
2339 Py_INCREF(s->v.ClassDef.name);
Serhiy Storchaka48842712016-04-06 09:45:48 +03002340 Py_XSETREF(c->u->u_private, s->v.ClassDef.name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002341 /* load (global) __name__ ... */
2342 str = PyUnicode_InternFromString("__name__");
2343 if (!str || !compiler_nameop(c, str, Load)) {
2344 Py_XDECREF(str);
2345 compiler_exit_scope(c);
2346 return 0;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002347 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002348 Py_DECREF(str);
2349 /* ... and store it as __module__ */
2350 str = PyUnicode_InternFromString("__module__");
2351 if (!str || !compiler_nameop(c, str, Store)) {
2352 Py_XDECREF(str);
2353 compiler_exit_scope(c);
2354 return 0;
2355 }
2356 Py_DECREF(str);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04002357 assert(c->u->u_qualname);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03002358 ADDOP_LOAD_CONST(c, c->u->u_qualname);
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002359 str = PyUnicode_InternFromString("__qualname__");
2360 if (!str || !compiler_nameop(c, str, Store)) {
2361 Py_XDECREF(str);
2362 compiler_exit_scope(c);
2363 return 0;
2364 }
2365 Py_DECREF(str);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002366 /* compile the body proper */
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03002367 if (!compiler_body(c, s->v.ClassDef.body)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002368 compiler_exit_scope(c);
2369 return 0;
2370 }
Nick Coghlan19d24672016-12-05 16:47:55 +10002371 /* Return __classcell__ if it is referenced, otherwise return None */
Benjamin Peterson312595c2013-05-15 15:26:42 -05002372 if (c->u->u_ste->ste_needs_class_closure) {
Nick Coghlan19d24672016-12-05 16:47:55 +10002373 /* Store __classcell__ into class namespace & return it */
Benjamin Peterson312595c2013-05-15 15:26:42 -05002374 str = PyUnicode_InternFromString("__class__");
2375 if (str == NULL) {
2376 compiler_exit_scope(c);
2377 return 0;
2378 }
2379 i = compiler_lookup_arg(c->u->u_cellvars, str);
2380 Py_DECREF(str);
Victor Stinner98e818b2013-11-05 18:07:34 +01002381 if (i < 0) {
2382 compiler_exit_scope(c);
2383 return 0;
2384 }
Benjamin Peterson312595c2013-05-15 15:26:42 -05002385 assert(i == 0);
Nick Coghlan944368e2016-09-11 14:45:49 +10002386
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002387 ADDOP_I(c, LOAD_CLOSURE, i);
Nick Coghlan19d24672016-12-05 16:47:55 +10002388 ADDOP(c, DUP_TOP);
Nick Coghlan944368e2016-09-11 14:45:49 +10002389 str = PyUnicode_InternFromString("__classcell__");
2390 if (!str || !compiler_nameop(c, str, Store)) {
2391 Py_XDECREF(str);
2392 compiler_exit_scope(c);
2393 return 0;
2394 }
2395 Py_DECREF(str);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002396 }
Benjamin Peterson312595c2013-05-15 15:26:42 -05002397 else {
Nick Coghlan19d24672016-12-05 16:47:55 +10002398 /* No methods referenced __class__, so just return None */
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +02002399 assert(PyDict_GET_SIZE(c->u->u_cellvars) == 0);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03002400 ADDOP_LOAD_CONST(c, Py_None);
Benjamin Peterson312595c2013-05-15 15:26:42 -05002401 }
Nick Coghlan19d24672016-12-05 16:47:55 +10002402 ADDOP_IN_SCOPE(c, RETURN_VALUE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002403 /* create the code object */
2404 co = assemble(c, 1);
2405 }
2406 /* leave the new scope */
2407 compiler_exit_scope(c);
2408 if (co == NULL)
2409 return 0;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002410
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002411 /* 2. load the 'build_class' function */
2412 ADDOP(c, LOAD_BUILD_CLASS);
2413
2414 /* 3. load a function (or closure) made from the code object */
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002415 compiler_make_closure(c, co, 0, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002416 Py_DECREF(co);
2417
2418 /* 4. load class name */
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03002419 ADDOP_LOAD_CONST(c, s->v.ClassDef.name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002420
2421 /* 5. generate the rest of the code for the call */
2422 if (!compiler_call_helper(c, 2,
2423 s->v.ClassDef.bases,
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002424 s->v.ClassDef.keywords))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002425 return 0;
2426
2427 /* 6. apply decorators */
2428 for (i = 0; i < asdl_seq_LEN(decos); i++) {
2429 ADDOP_I(c, CALL_FUNCTION, 1);
2430 }
2431
2432 /* 7. store into <name> */
2433 if (!compiler_nameop(c, s->v.ClassDef.name, Store))
2434 return 0;
2435 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002436}
2437
Serhiy Storchaka3bcbedc2019-01-18 07:47:48 +02002438/* Return 0 if the expression is a constant value except named singletons.
2439 Return 1 otherwise. */
2440static int
2441check_is_arg(expr_ty e)
2442{
2443 if (e->kind != Constant_kind) {
2444 return 1;
2445 }
2446 PyObject *value = e->v.Constant.value;
2447 return (value == Py_None
2448 || value == Py_False
2449 || value == Py_True
2450 || value == Py_Ellipsis);
2451}
2452
2453/* Check operands of identity chacks ("is" and "is not").
2454 Emit a warning if any operand is a constant except named singletons.
2455 Return 0 on error.
2456 */
2457static int
2458check_compare(struct compiler *c, expr_ty e)
2459{
2460 Py_ssize_t i, n;
2461 int left = check_is_arg(e->v.Compare.left);
2462 n = asdl_seq_LEN(e->v.Compare.ops);
2463 for (i = 0; i < n; i++) {
2464 cmpop_ty op = (cmpop_ty)asdl_seq_GET(e->v.Compare.ops, i);
2465 int right = check_is_arg((expr_ty)asdl_seq_GET(e->v.Compare.comparators, i));
2466 if (op == Is || op == IsNot) {
2467 if (!right || !left) {
2468 const char *msg = (op == Is)
2469 ? "\"is\" with a literal. Did you mean \"==\"?"
2470 : "\"is not\" with a literal. Did you mean \"!=\"?";
2471 return compiler_warn(c, msg);
2472 }
2473 }
2474 left = right;
2475 }
2476 return 1;
2477}
2478
Mark Shannon9af0e472020-01-14 10:12:45 +00002479static int compiler_addcompare(struct compiler *c, cmpop_ty op)
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002480{
Mark Shannon9af0e472020-01-14 10:12:45 +00002481 int cmp;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002482 switch (op) {
2483 case Eq:
Mark Shannon9af0e472020-01-14 10:12:45 +00002484 cmp = Py_EQ;
2485 break;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002486 case NotEq:
Mark Shannon9af0e472020-01-14 10:12:45 +00002487 cmp = Py_NE;
2488 break;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002489 case Lt:
Mark Shannon9af0e472020-01-14 10:12:45 +00002490 cmp = Py_LT;
2491 break;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002492 case LtE:
Mark Shannon9af0e472020-01-14 10:12:45 +00002493 cmp = Py_LE;
2494 break;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002495 case Gt:
Mark Shannon9af0e472020-01-14 10:12:45 +00002496 cmp = Py_GT;
2497 break;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002498 case GtE:
Mark Shannon9af0e472020-01-14 10:12:45 +00002499 cmp = Py_GE;
2500 break;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002501 case Is:
Mark Shannon9af0e472020-01-14 10:12:45 +00002502 ADDOP_I(c, IS_OP, 0);
2503 return 1;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002504 case IsNot:
Mark Shannon9af0e472020-01-14 10:12:45 +00002505 ADDOP_I(c, IS_OP, 1);
2506 return 1;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002507 case In:
Mark Shannon9af0e472020-01-14 10:12:45 +00002508 ADDOP_I(c, CONTAINS_OP, 0);
2509 return 1;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002510 case NotIn:
Mark Shannon9af0e472020-01-14 10:12:45 +00002511 ADDOP_I(c, CONTAINS_OP, 1);
2512 return 1;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002513 default:
Mark Shannon9af0e472020-01-14 10:12:45 +00002514 Py_UNREACHABLE();
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002515 }
Mark Shannon9af0e472020-01-14 10:12:45 +00002516 ADDOP_I(c, COMPARE_OP, cmp);
2517 return 1;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002518}
2519
Mark Shannon9af0e472020-01-14 10:12:45 +00002520
2521
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002522static int
2523compiler_jump_if(struct compiler *c, expr_ty e, basicblock *next, int cond)
2524{
2525 switch (e->kind) {
2526 case UnaryOp_kind:
2527 if (e->v.UnaryOp.op == Not)
2528 return compiler_jump_if(c, e->v.UnaryOp.operand, next, !cond);
2529 /* fallback to general implementation */
2530 break;
2531 case BoolOp_kind: {
2532 asdl_seq *s = e->v.BoolOp.values;
2533 Py_ssize_t i, n = asdl_seq_LEN(s) - 1;
2534 assert(n >= 0);
2535 int cond2 = e->v.BoolOp.op == Or;
2536 basicblock *next2 = next;
2537 if (!cond2 != !cond) {
2538 next2 = compiler_new_block(c);
2539 if (next2 == NULL)
2540 return 0;
2541 }
2542 for (i = 0; i < n; ++i) {
2543 if (!compiler_jump_if(c, (expr_ty)asdl_seq_GET(s, i), next2, cond2))
2544 return 0;
2545 }
2546 if (!compiler_jump_if(c, (expr_ty)asdl_seq_GET(s, n), next, cond))
2547 return 0;
2548 if (next2 != next)
2549 compiler_use_next_block(c, next2);
2550 return 1;
2551 }
2552 case IfExp_kind: {
2553 basicblock *end, *next2;
2554 end = compiler_new_block(c);
2555 if (end == NULL)
2556 return 0;
2557 next2 = compiler_new_block(c);
2558 if (next2 == NULL)
2559 return 0;
2560 if (!compiler_jump_if(c, e->v.IfExp.test, next2, 0))
2561 return 0;
2562 if (!compiler_jump_if(c, e->v.IfExp.body, next, cond))
2563 return 0;
2564 ADDOP_JREL(c, JUMP_FORWARD, end);
2565 compiler_use_next_block(c, next2);
2566 if (!compiler_jump_if(c, e->v.IfExp.orelse, next, cond))
2567 return 0;
2568 compiler_use_next_block(c, end);
2569 return 1;
2570 }
2571 case Compare_kind: {
2572 Py_ssize_t i, n = asdl_seq_LEN(e->v.Compare.ops) - 1;
2573 if (n > 0) {
Serhiy Storchaka45835252019-02-16 08:29:46 +02002574 if (!check_compare(c, e)) {
2575 return 0;
2576 }
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002577 basicblock *cleanup = compiler_new_block(c);
2578 if (cleanup == NULL)
2579 return 0;
2580 VISIT(c, expr, e->v.Compare.left);
2581 for (i = 0; i < n; i++) {
2582 VISIT(c, expr,
2583 (expr_ty)asdl_seq_GET(e->v.Compare.comparators, i));
2584 ADDOP(c, DUP_TOP);
2585 ADDOP(c, ROT_THREE);
Mark Shannon9af0e472020-01-14 10:12:45 +00002586 ADDOP_COMPARE(c, asdl_seq_GET(e->v.Compare.ops, i));
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002587 ADDOP_JABS(c, POP_JUMP_IF_FALSE, cleanup);
2588 NEXT_BLOCK(c);
2589 }
2590 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, n));
Mark Shannon9af0e472020-01-14 10:12:45 +00002591 ADDOP_COMPARE(c, asdl_seq_GET(e->v.Compare.ops, n));
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002592 ADDOP_JABS(c, cond ? POP_JUMP_IF_TRUE : POP_JUMP_IF_FALSE, next);
2593 basicblock *end = compiler_new_block(c);
2594 if (end == NULL)
2595 return 0;
2596 ADDOP_JREL(c, JUMP_FORWARD, end);
2597 compiler_use_next_block(c, cleanup);
2598 ADDOP(c, POP_TOP);
2599 if (!cond) {
2600 ADDOP_JREL(c, JUMP_FORWARD, next);
2601 }
2602 compiler_use_next_block(c, end);
2603 return 1;
2604 }
2605 /* fallback to general implementation */
2606 break;
2607 }
2608 default:
2609 /* fallback to general implementation */
2610 break;
2611 }
2612
2613 /* general implementation */
2614 VISIT(c, expr, e);
2615 ADDOP_JABS(c, cond ? POP_JUMP_IF_TRUE : POP_JUMP_IF_FALSE, next);
2616 return 1;
2617}
2618
2619static int
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002620compiler_ifexp(struct compiler *c, expr_ty e)
2621{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002622 basicblock *end, *next;
2623
2624 assert(e->kind == IfExp_kind);
2625 end = compiler_new_block(c);
2626 if (end == NULL)
2627 return 0;
2628 next = compiler_new_block(c);
2629 if (next == NULL)
2630 return 0;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002631 if (!compiler_jump_if(c, e->v.IfExp.test, next, 0))
2632 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002633 VISIT(c, expr, e->v.IfExp.body);
2634 ADDOP_JREL(c, JUMP_FORWARD, end);
2635 compiler_use_next_block(c, next);
2636 VISIT(c, expr, e->v.IfExp.orelse);
2637 compiler_use_next_block(c, end);
2638 return 1;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002639}
2640
2641static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002642compiler_lambda(struct compiler *c, expr_ty e)
2643{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002644 PyCodeObject *co;
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002645 PyObject *qualname;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002646 static identifier name;
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002647 Py_ssize_t funcflags;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002648 arguments_ty args = e->v.Lambda.args;
2649 assert(e->kind == Lambda_kind);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002650
Pablo Galindoc5fc1562020-04-22 23:29:27 +01002651 if (!compiler_check_debug_args(c, args))
2652 return 0;
2653
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002654 if (!name) {
2655 name = PyUnicode_InternFromString("<lambda>");
2656 if (!name)
2657 return 0;
2658 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002659
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002660 funcflags = compiler_default_arguments(c, args);
2661 if (funcflags == -1) {
2662 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002663 }
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002664
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04002665 if (!compiler_enter_scope(c, name, COMPILER_SCOPE_LAMBDA,
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002666 (void *)e, e->lineno))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002667 return 0;
Neal Norwitz4737b232005-11-19 23:58:29 +00002668
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002669 /* Make None the first constant, so the lambda can't have a
2670 docstring. */
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03002671 if (compiler_add_const(c, Py_None) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002672 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002673
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002674 c->u->u_argcount = asdl_seq_LEN(args->args);
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01002675 c->u->u_posonlyargcount = asdl_seq_LEN(args->posonlyargs);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002676 c->u->u_kwonlyargcount = asdl_seq_LEN(args->kwonlyargs);
2677 VISIT_IN_SCOPE(c, expr, e->v.Lambda.body);
2678 if (c->u->u_ste->ste_generator) {
Serhiy Storchakac775ad62015-03-11 18:20:35 +02002679 co = assemble(c, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002680 }
2681 else {
2682 ADDOP_IN_SCOPE(c, RETURN_VALUE);
Serhiy Storchakac775ad62015-03-11 18:20:35 +02002683 co = assemble(c, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002684 }
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04002685 qualname = c->u->u_qualname;
2686 Py_INCREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002687 compiler_exit_scope(c);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04002688 if (co == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002689 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002690
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002691 compiler_make_closure(c, co, funcflags, qualname);
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002692 Py_DECREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002693 Py_DECREF(co);
2694
2695 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002696}
2697
2698static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002699compiler_if(struct compiler *c, stmt_ty s)
2700{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002701 basicblock *end, *next;
2702 int constant;
2703 assert(s->kind == If_kind);
2704 end = compiler_new_block(c);
2705 if (end == NULL)
2706 return 0;
2707
Serhiy Storchaka3dfbaf52017-12-25 12:47:50 +02002708 constant = expr_constant(s->v.If.test);
Pablo Galindo18c5f9d2019-07-15 10:15:01 +01002709 /* constant = 0: "if 0"
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002710 * constant = 1: "if 1", "if 2", ...
2711 * constant = -1: rest */
Pablo Galindo18c5f9d2019-07-15 10:15:01 +01002712 if (constant == 0) {
2713 BEGIN_DO_NOT_EMIT_BYTECODE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002714 VISIT_SEQ(c, stmt, s->v.If.body);
Pablo Galindo18c5f9d2019-07-15 10:15:01 +01002715 END_DO_NOT_EMIT_BYTECODE
2716 if (s->v.If.orelse) {
2717 VISIT_SEQ(c, stmt, s->v.If.orelse);
2718 }
2719 } else if (constant == 1) {
2720 VISIT_SEQ(c, stmt, s->v.If.body);
2721 if (s->v.If.orelse) {
2722 BEGIN_DO_NOT_EMIT_BYTECODE
2723 VISIT_SEQ(c, stmt, s->v.If.orelse);
2724 END_DO_NOT_EMIT_BYTECODE
2725 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002726 } else {
Antoine Pitroue7811fc2014-09-18 03:06:50 +02002727 if (asdl_seq_LEN(s->v.If.orelse)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002728 next = compiler_new_block(c);
2729 if (next == NULL)
2730 return 0;
2731 }
Mark Shannonfee55262019-11-21 09:11:43 +00002732 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002733 next = end;
Mark Shannonfee55262019-11-21 09:11:43 +00002734 }
2735 if (!compiler_jump_if(c, s->v.If.test, next, 0)) {
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002736 return 0;
Mark Shannonfee55262019-11-21 09:11:43 +00002737 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002738 VISIT_SEQ(c, stmt, s->v.If.body);
Antoine Pitroue7811fc2014-09-18 03:06:50 +02002739 if (asdl_seq_LEN(s->v.If.orelse)) {
2740 ADDOP_JREL(c, JUMP_FORWARD, end);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002741 compiler_use_next_block(c, next);
2742 VISIT_SEQ(c, stmt, s->v.If.orelse);
2743 }
2744 }
2745 compiler_use_next_block(c, end);
2746 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002747}
2748
2749static int
2750compiler_for(struct compiler *c, stmt_ty s)
2751{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002752 basicblock *start, *cleanup, *end;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002753
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002754 start = compiler_new_block(c);
2755 cleanup = compiler_new_block(c);
2756 end = compiler_new_block(c);
Mark Shannonfee55262019-11-21 09:11:43 +00002757 if (start == NULL || end == NULL || cleanup == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002758 return 0;
Mark Shannonfee55262019-11-21 09:11:43 +00002759 }
2760 if (!compiler_push_fblock(c, FOR_LOOP, start, end, NULL)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002761 return 0;
Mark Shannonfee55262019-11-21 09:11:43 +00002762 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002763 VISIT(c, expr, s->v.For.iter);
2764 ADDOP(c, GET_ITER);
2765 compiler_use_next_block(c, start);
2766 ADDOP_JREL(c, FOR_ITER, cleanup);
2767 VISIT(c, expr, s->v.For.target);
2768 VISIT_SEQ(c, stmt, s->v.For.body);
2769 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
2770 compiler_use_next_block(c, cleanup);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002771
2772 compiler_pop_fblock(c, FOR_LOOP, start);
2773
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002774 VISIT_SEQ(c, stmt, s->v.For.orelse);
2775 compiler_use_next_block(c, end);
2776 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002777}
2778
Yury Selivanov75445082015-05-11 22:57:16 -04002779
2780static int
2781compiler_async_for(struct compiler *c, stmt_ty s)
2782{
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002783 basicblock *start, *except, *end;
Pablo Galindo90235812020-03-15 04:29:22 +00002784 if (IS_TOP_LEVEL_AWAIT(c)){
Matthias Bussonnier565b4f12019-05-21 13:12:03 -07002785 c->u->u_ste->ste_coroutine = 1;
2786 } else if (c->u->u_scope_type != COMPILER_SCOPE_ASYNC_FUNCTION) {
Zsolt Dollensteine2396502018-04-27 08:58:56 -07002787 return compiler_error(c, "'async for' outside async function");
2788 }
2789
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002790 start = compiler_new_block(c);
Yury Selivanov75445082015-05-11 22:57:16 -04002791 except = compiler_new_block(c);
2792 end = compiler_new_block(c);
Yury Selivanov75445082015-05-11 22:57:16 -04002793
Mark Shannonfee55262019-11-21 09:11:43 +00002794 if (start == NULL || except == NULL || end == NULL) {
Yury Selivanov75445082015-05-11 22:57:16 -04002795 return 0;
Mark Shannonfee55262019-11-21 09:11:43 +00002796 }
Yury Selivanov75445082015-05-11 22:57:16 -04002797 VISIT(c, expr, s->v.AsyncFor.iter);
2798 ADDOP(c, GET_AITER);
Yury Selivanov75445082015-05-11 22:57:16 -04002799
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002800 compiler_use_next_block(c, start);
Mark Shannonfee55262019-11-21 09:11:43 +00002801 if (!compiler_push_fblock(c, FOR_LOOP, start, end, NULL)) {
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002802 return 0;
Mark Shannonfee55262019-11-21 09:11:43 +00002803 }
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002804 /* SETUP_FINALLY to guard the __anext__ call */
2805 ADDOP_JREL(c, SETUP_FINALLY, except);
Yury Selivanov75445082015-05-11 22:57:16 -04002806 ADDOP(c, GET_ANEXT);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03002807 ADDOP_LOAD_CONST(c, Py_None);
Yury Selivanov75445082015-05-11 22:57:16 -04002808 ADDOP(c, YIELD_FROM);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002809 ADDOP(c, POP_BLOCK); /* for SETUP_FINALLY */
Yury Selivanov75445082015-05-11 22:57:16 -04002810
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002811 /* Success block for __anext__ */
2812 VISIT(c, expr, s->v.AsyncFor.target);
2813 VISIT_SEQ(c, stmt, s->v.AsyncFor.body);
2814 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
2815
2816 compiler_pop_fblock(c, FOR_LOOP, start);
Yury Selivanov75445082015-05-11 22:57:16 -04002817
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002818 /* Except block for __anext__ */
Yury Selivanov75445082015-05-11 22:57:16 -04002819 compiler_use_next_block(c, except);
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002820 ADDOP(c, END_ASYNC_FOR);
Yury Selivanov75445082015-05-11 22:57:16 -04002821
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002822 /* `else` block */
Yury Selivanov75445082015-05-11 22:57:16 -04002823 VISIT_SEQ(c, stmt, s->v.For.orelse);
2824
2825 compiler_use_next_block(c, end);
2826
2827 return 1;
2828}
2829
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002830static int
2831compiler_while(struct compiler *c, stmt_ty s)
2832{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002833 basicblock *loop, *orelse, *end, *anchor = NULL;
Serhiy Storchaka3dfbaf52017-12-25 12:47:50 +02002834 int constant = expr_constant(s->v.While.test);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002835
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002836 if (constant == 0) {
Pablo Galindo18c5f9d2019-07-15 10:15:01 +01002837 BEGIN_DO_NOT_EMIT_BYTECODE
Pablo Galindo6c3e66a2019-10-30 11:53:26 +00002838 // Push a dummy block so the VISIT_SEQ knows that we are
2839 // inside a while loop so it can correctly evaluate syntax
2840 // errors.
Mark Shannonfee55262019-11-21 09:11:43 +00002841 if (!compiler_push_fblock(c, WHILE_LOOP, NULL, NULL, NULL)) {
Pablo Galindo6c3e66a2019-10-30 11:53:26 +00002842 return 0;
2843 }
Pablo Galindo18c5f9d2019-07-15 10:15:01 +01002844 VISIT_SEQ(c, stmt, s->v.While.body);
Pablo Galindo6c3e66a2019-10-30 11:53:26 +00002845 // Remove the dummy block now that is not needed.
2846 compiler_pop_fblock(c, WHILE_LOOP, NULL);
Pablo Galindo18c5f9d2019-07-15 10:15:01 +01002847 END_DO_NOT_EMIT_BYTECODE
2848 if (s->v.While.orelse) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002849 VISIT_SEQ(c, stmt, s->v.While.orelse);
Pablo Galindo18c5f9d2019-07-15 10:15:01 +01002850 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002851 return 1;
2852 }
2853 loop = compiler_new_block(c);
2854 end = compiler_new_block(c);
2855 if (constant == -1) {
2856 anchor = compiler_new_block(c);
2857 if (anchor == NULL)
2858 return 0;
2859 }
2860 if (loop == NULL || end == NULL)
2861 return 0;
2862 if (s->v.While.orelse) {
2863 orelse = compiler_new_block(c);
2864 if (orelse == NULL)
2865 return 0;
2866 }
2867 else
2868 orelse = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002869
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002870 compiler_use_next_block(c, loop);
Mark Shannonfee55262019-11-21 09:11:43 +00002871 if (!compiler_push_fblock(c, WHILE_LOOP, loop, end, NULL))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002872 return 0;
2873 if (constant == -1) {
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002874 if (!compiler_jump_if(c, s->v.While.test, anchor, 0))
2875 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002876 }
2877 VISIT_SEQ(c, stmt, s->v.While.body);
2878 ADDOP_JABS(c, JUMP_ABSOLUTE, loop);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002879
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002880 /* XXX should the two POP instructions be in a separate block
2881 if there is no else clause ?
2882 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002883
Benjamin Peterson3cda0ed2014-12-13 16:06:19 -05002884 if (constant == -1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002885 compiler_use_next_block(c, anchor);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002886 compiler_pop_fblock(c, WHILE_LOOP, loop);
2887
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002888 if (orelse != NULL) /* what if orelse is just pass? */
2889 VISIT_SEQ(c, stmt, s->v.While.orelse);
2890 compiler_use_next_block(c, end);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002891
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002892 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002893}
2894
2895static int
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002896compiler_return(struct compiler *c, stmt_ty s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002897{
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002898 int preserve_tos = ((s->v.Return.value != NULL) &&
Serhiy Storchaka3f228112018-09-27 17:42:37 +03002899 (s->v.Return.value->kind != Constant_kind));
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002900 if (c->u->u_ste->ste_type != FunctionBlock)
2901 return compiler_error(c, "'return' outside function");
2902 if (s->v.Return.value != NULL &&
2903 c->u->u_ste->ste_coroutine && c->u->u_ste->ste_generator)
2904 {
2905 return compiler_error(
2906 c, "'return' with value in async generator");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002907 }
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002908 if (preserve_tos) {
2909 VISIT(c, expr, s->v.Return.value);
2910 }
Mark Shannonfee55262019-11-21 09:11:43 +00002911 if (!compiler_unwind_fblock_stack(c, preserve_tos, NULL))
2912 return 0;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002913 if (s->v.Return.value == NULL) {
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03002914 ADDOP_LOAD_CONST(c, Py_None);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002915 }
2916 else if (!preserve_tos) {
2917 VISIT(c, expr, s->v.Return.value);
2918 }
2919 ADDOP(c, RETURN_VALUE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002920
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002921 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002922}
2923
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002924static int
2925compiler_break(struct compiler *c)
2926{
Mark Shannonfee55262019-11-21 09:11:43 +00002927 struct fblockinfo *loop = NULL;
2928 if (!compiler_unwind_fblock_stack(c, 0, &loop)) {
2929 return 0;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002930 }
Mark Shannonfee55262019-11-21 09:11:43 +00002931 if (loop == NULL) {
2932 return compiler_error(c, "'break' outside loop");
2933 }
2934 if (!compiler_unwind_fblock(c, loop, 0)) {
2935 return 0;
2936 }
2937 ADDOP_JABS(c, JUMP_ABSOLUTE, loop->fb_exit);
2938 return 1;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002939}
2940
2941static int
2942compiler_continue(struct compiler *c)
2943{
Mark Shannonfee55262019-11-21 09:11:43 +00002944 struct fblockinfo *loop = NULL;
2945 if (!compiler_unwind_fblock_stack(c, 0, &loop)) {
2946 return 0;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002947 }
Mark Shannonfee55262019-11-21 09:11:43 +00002948 if (loop == NULL) {
2949 return compiler_error(c, "'continue' not properly in loop");
2950 }
2951 ADDOP_JABS(c, JUMP_ABSOLUTE, loop->fb_block);
2952 return 1;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002953}
2954
2955
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002956/* Code generated for "try: <body> finally: <finalbody>" is as follows:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002957
2958 SETUP_FINALLY L
2959 <code for body>
2960 POP_BLOCK
Mark Shannonfee55262019-11-21 09:11:43 +00002961 <code for finalbody>
2962 JUMP E
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002963 L:
2964 <code for finalbody>
Mark Shannonfee55262019-11-21 09:11:43 +00002965 E:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002966
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002967 The special instructions use the block stack. Each block
2968 stack entry contains the instruction that created it (here
2969 SETUP_FINALLY), the level of the value stack at the time the
2970 block stack entry was created, and a label (here L).
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002971
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002972 SETUP_FINALLY:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002973 Pushes the current value stack level and the label
2974 onto the block stack.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002975 POP_BLOCK:
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002976 Pops en entry from the block stack.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002977
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002978 The block stack is unwound when an exception is raised:
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002979 when a SETUP_FINALLY entry is found, the raised and the caught
2980 exceptions are pushed onto the value stack (and the exception
2981 condition is cleared), and the interpreter jumps to the label
2982 gotten from the block stack.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002983*/
2984
2985static int
2986compiler_try_finally(struct compiler *c, stmt_ty s)
2987{
Mark Shannonfee55262019-11-21 09:11:43 +00002988 basicblock *body, *end, *exit;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002989
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002990 body = compiler_new_block(c);
2991 end = compiler_new_block(c);
Mark Shannonfee55262019-11-21 09:11:43 +00002992 exit = compiler_new_block(c);
2993 if (body == NULL || end == NULL || exit == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002994 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002995
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002996 /* `try` block */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002997 ADDOP_JREL(c, SETUP_FINALLY, end);
2998 compiler_use_next_block(c, body);
Mark Shannonfee55262019-11-21 09:11:43 +00002999 if (!compiler_push_fblock(c, FINALLY_TRY, body, end, s->v.Try.finalbody))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003000 return 0;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003001 if (s->v.Try.handlers && asdl_seq_LEN(s->v.Try.handlers)) {
3002 if (!compiler_try_except(c, s))
3003 return 0;
3004 }
3005 else {
3006 VISIT_SEQ(c, stmt, s->v.Try.body);
3007 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003008 ADDOP(c, POP_BLOCK);
Mark Shannonfee55262019-11-21 09:11:43 +00003009 compiler_pop_fblock(c, FINALLY_TRY, body);
3010 VISIT_SEQ(c, stmt, s->v.Try.finalbody);
3011 ADDOP_JREL(c, JUMP_FORWARD, exit);
3012 /* `finally` block */
3013 compiler_use_next_block(c, end);
3014 if (!compiler_push_fblock(c, FINALLY_END, end, NULL, NULL))
3015 return 0;
3016 VISIT_SEQ(c, stmt, s->v.Try.finalbody);
3017 compiler_pop_fblock(c, FINALLY_END, end);
3018 ADDOP(c, RERAISE);
3019 compiler_use_next_block(c, exit);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003020 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003021}
3022
3023/*
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00003024 Code generated for "try: S except E1 as V1: S1 except E2 as V2: S2 ...":
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003025 (The contents of the value stack is shown in [], with the top
3026 at the right; 'tb' is trace-back info, 'val' the exception's
3027 associated value, and 'exc' the exception.)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003028
3029 Value stack Label Instruction Argument
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003030 [] SETUP_FINALLY L1
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003031 [] <code for S>
3032 [] POP_BLOCK
3033 [] JUMP_FORWARD L0
3034
3035 [tb, val, exc] L1: DUP )
3036 [tb, val, exc, exc] <evaluate E1> )
Mark Shannon9af0e472020-01-14 10:12:45 +00003037 [tb, val, exc, exc, E1] JUMP_IF_NOT_EXC_MATCH L2 ) only if E1
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003038 [tb, val, exc] POP
3039 [tb, val] <assign to V1> (or POP if no V1)
3040 [tb] POP
3041 [] <code for S1>
3042 JUMP_FORWARD L0
3043
3044 [tb, val, exc] L2: DUP
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003045 .............................etc.......................
3046
Mark Shannonfee55262019-11-21 09:11:43 +00003047 [tb, val, exc] Ln+1: RERAISE # re-raise exception
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003048
3049 [] L0: <next statement>
3050
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003051 Of course, parts are not generated if Vi or Ei is not present.
3052*/
3053static int
3054compiler_try_except(struct compiler *c, stmt_ty s)
3055{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003056 basicblock *body, *orelse, *except, *end;
Victor Stinnerad9a0662013-11-19 22:23:20 +01003057 Py_ssize_t i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003058
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003059 body = compiler_new_block(c);
3060 except = compiler_new_block(c);
3061 orelse = compiler_new_block(c);
3062 end = compiler_new_block(c);
3063 if (body == NULL || except == NULL || orelse == NULL || end == NULL)
3064 return 0;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003065 ADDOP_JREL(c, SETUP_FINALLY, except);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003066 compiler_use_next_block(c, body);
Mark Shannonfee55262019-11-21 09:11:43 +00003067 if (!compiler_push_fblock(c, EXCEPT, body, NULL, NULL))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003068 return 0;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003069 VISIT_SEQ(c, stmt, s->v.Try.body);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003070 ADDOP(c, POP_BLOCK);
3071 compiler_pop_fblock(c, EXCEPT, body);
3072 ADDOP_JREL(c, JUMP_FORWARD, orelse);
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003073 n = asdl_seq_LEN(s->v.Try.handlers);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003074 compiler_use_next_block(c, except);
3075 for (i = 0; i < n; i++) {
3076 excepthandler_ty handler = (excepthandler_ty)asdl_seq_GET(
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003077 s->v.Try.handlers, i);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003078 if (!handler->v.ExceptHandler.type && i < n-1)
3079 return compiler_error(c, "default 'except:' must be last");
Serhiy Storchaka61cb3d02020-03-17 18:07:30 +02003080 SET_LOC(c, handler);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003081 except = compiler_new_block(c);
3082 if (except == NULL)
3083 return 0;
3084 if (handler->v.ExceptHandler.type) {
3085 ADDOP(c, DUP_TOP);
3086 VISIT(c, expr, handler->v.ExceptHandler.type);
Mark Shannon9af0e472020-01-14 10:12:45 +00003087 ADDOP_JABS(c, JUMP_IF_NOT_EXC_MATCH, except);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003088 }
3089 ADDOP(c, POP_TOP);
3090 if (handler->v.ExceptHandler.name) {
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003091 basicblock *cleanup_end, *cleanup_body;
Guido van Rossumb940e112007-01-10 16:19:56 +00003092
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003093 cleanup_end = compiler_new_block(c);
3094 cleanup_body = compiler_new_block(c);
Zackery Spytz53ebf4b2018-10-11 23:54:03 -06003095 if (cleanup_end == NULL || cleanup_body == NULL) {
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003096 return 0;
Zackery Spytz53ebf4b2018-10-11 23:54:03 -06003097 }
Guido van Rossumb940e112007-01-10 16:19:56 +00003098
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003099 compiler_nameop(c, handler->v.ExceptHandler.name, Store);
3100 ADDOP(c, POP_TOP);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003101
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003102 /*
3103 try:
Ezio Melotti1b6424f2013-04-19 07:10:09 +03003104 # body
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003105 except type as name:
Ezio Melotti1b6424f2013-04-19 07:10:09 +03003106 try:
3107 # body
3108 finally:
Chris Angelicoad098b62019-05-21 23:34:19 +10003109 name = None # in case body contains "del name"
Ezio Melotti1b6424f2013-04-19 07:10:09 +03003110 del name
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003111 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003112
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003113 /* second try: */
3114 ADDOP_JREL(c, SETUP_FINALLY, cleanup_end);
3115 compiler_use_next_block(c, cleanup_body);
Mark Shannonfee55262019-11-21 09:11:43 +00003116 if (!compiler_push_fblock(c, HANDLER_CLEANUP, cleanup_body, NULL, handler->v.ExceptHandler.name))
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003117 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003118
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003119 /* second # body */
3120 VISIT_SEQ(c, stmt, handler->v.ExceptHandler.body);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003121 compiler_pop_fblock(c, HANDLER_CLEANUP, cleanup_body);
Mark Shannonfee55262019-11-21 09:11:43 +00003122 ADDOP(c, POP_BLOCK);
3123 ADDOP(c, POP_EXCEPT);
3124 /* name = None; del name */
3125 ADDOP_LOAD_CONST(c, Py_None);
3126 compiler_nameop(c, handler->v.ExceptHandler.name, Store);
3127 compiler_nameop(c, handler->v.ExceptHandler.name, Del);
3128 ADDOP_JREL(c, JUMP_FORWARD, end);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003129
Mark Shannonfee55262019-11-21 09:11:43 +00003130 /* except: */
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003131 compiler_use_next_block(c, cleanup_end);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003132
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003133 /* name = None; del name */
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03003134 ADDOP_LOAD_CONST(c, Py_None);
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003135 compiler_nameop(c, handler->v.ExceptHandler.name, Store);
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003136 compiler_nameop(c, handler->v.ExceptHandler.name, Del);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003137
Mark Shannonfee55262019-11-21 09:11:43 +00003138 ADDOP(c, RERAISE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003139 }
3140 else {
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003141 basicblock *cleanup_body;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003142
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003143 cleanup_body = compiler_new_block(c);
Benjamin Peterson0a5dad92011-05-27 14:17:04 -05003144 if (!cleanup_body)
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003145 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003146
Guido van Rossumb940e112007-01-10 16:19:56 +00003147 ADDOP(c, POP_TOP);
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003148 ADDOP(c, POP_TOP);
3149 compiler_use_next_block(c, cleanup_body);
Mark Shannonfee55262019-11-21 09:11:43 +00003150 if (!compiler_push_fblock(c, HANDLER_CLEANUP, cleanup_body, NULL, NULL))
Benjamin Peterson74897ba2011-05-27 14:10:24 -05003151 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003152 VISIT_SEQ(c, stmt, handler->v.ExceptHandler.body);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003153 compiler_pop_fblock(c, HANDLER_CLEANUP, cleanup_body);
Mark Shannonfee55262019-11-21 09:11:43 +00003154 ADDOP(c, POP_EXCEPT);
3155 ADDOP_JREL(c, JUMP_FORWARD, end);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003156 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003157 compiler_use_next_block(c, except);
3158 }
Mark Shannonfee55262019-11-21 09:11:43 +00003159 ADDOP(c, RERAISE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003160 compiler_use_next_block(c, orelse);
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003161 VISIT_SEQ(c, stmt, s->v.Try.orelse);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003162 compiler_use_next_block(c, end);
3163 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003164}
3165
3166static int
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003167compiler_try(struct compiler *c, stmt_ty s) {
3168 if (s->v.Try.finalbody && asdl_seq_LEN(s->v.Try.finalbody))
3169 return compiler_try_finally(c, s);
3170 else
3171 return compiler_try_except(c, s);
3172}
3173
3174
3175static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003176compiler_import_as(struct compiler *c, identifier name, identifier asname)
3177{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003178 /* The IMPORT_NAME opcode was already generated. This function
3179 merely needs to bind the result to a name.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003180
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003181 If there is a dot in name, we need to split it and emit a
Serhiy Storchakaf93234b2017-05-09 22:31:05 +03003182 IMPORT_FROM for each name.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003183 */
Serhiy Storchaka265fcc52017-08-29 15:47:44 +03003184 Py_ssize_t len = PyUnicode_GET_LENGTH(name);
3185 Py_ssize_t dot = PyUnicode_FindChar(name, '.', 0, len, 1);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003186 if (dot == -2)
Serhiy Storchaka694de3b2016-06-15 20:06:07 +03003187 return 0;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003188 if (dot != -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003189 /* Consume the base module name to get the first attribute */
Serhiy Storchaka265fcc52017-08-29 15:47:44 +03003190 while (1) {
3191 Py_ssize_t pos = dot + 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003192 PyObject *attr;
Serhiy Storchaka265fcc52017-08-29 15:47:44 +03003193 dot = PyUnicode_FindChar(name, '.', pos, len, 1);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003194 if (dot == -2)
Serhiy Storchaka694de3b2016-06-15 20:06:07 +03003195 return 0;
Serhiy Storchaka265fcc52017-08-29 15:47:44 +03003196 attr = PyUnicode_Substring(name, pos, (dot != -1) ? dot : len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003197 if (!attr)
Serhiy Storchaka694de3b2016-06-15 20:06:07 +03003198 return 0;
Serhiy Storchakaaa8e51f2018-04-01 00:29:37 +03003199 ADDOP_N(c, IMPORT_FROM, attr, names);
Serhiy Storchaka265fcc52017-08-29 15:47:44 +03003200 if (dot == -1) {
3201 break;
3202 }
3203 ADDOP(c, ROT_TWO);
3204 ADDOP(c, POP_TOP);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003205 }
Serhiy Storchaka265fcc52017-08-29 15:47:44 +03003206 if (!compiler_nameop(c, asname, Store)) {
3207 return 0;
3208 }
3209 ADDOP(c, POP_TOP);
3210 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003211 }
3212 return compiler_nameop(c, asname, Store);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003213}
3214
3215static int
3216compiler_import(struct compiler *c, stmt_ty s)
3217{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003218 /* The Import node stores a module name like a.b.c as a single
3219 string. This is convenient for all cases except
3220 import a.b.c as d
3221 where we need to parse that string to extract the individual
3222 module names.
3223 XXX Perhaps change the representation to make this case simpler?
3224 */
Victor Stinnerad9a0662013-11-19 22:23:20 +01003225 Py_ssize_t i, n = asdl_seq_LEN(s->v.Import.names);
Thomas Woutersf7f438b2006-02-28 16:09:29 +00003226
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003227 for (i = 0; i < n; i++) {
3228 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.Import.names, i);
3229 int r;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003230
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03003231 ADDOP_LOAD_CONST(c, _PyLong_Zero);
3232 ADDOP_LOAD_CONST(c, Py_None);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003233 ADDOP_NAME(c, IMPORT_NAME, alias->name, names);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003234
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003235 if (alias->asname) {
3236 r = compiler_import_as(c, alias->name, alias->asname);
3237 if (!r)
3238 return r;
3239 }
3240 else {
3241 identifier tmp = alias->name;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003242 Py_ssize_t dot = PyUnicode_FindChar(
3243 alias->name, '.', 0, PyUnicode_GET_LENGTH(alias->name), 1);
Victor Stinner6b64a682013-07-11 22:50:45 +02003244 if (dot != -1) {
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003245 tmp = PyUnicode_Substring(alias->name, 0, dot);
Victor Stinner6b64a682013-07-11 22:50:45 +02003246 if (tmp == NULL)
3247 return 0;
3248 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003249 r = compiler_nameop(c, tmp, Store);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003250 if (dot != -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003251 Py_DECREF(tmp);
3252 }
3253 if (!r)
3254 return r;
3255 }
3256 }
3257 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003258}
3259
3260static int
3261compiler_from_import(struct compiler *c, stmt_ty s)
3262{
Victor Stinnerad9a0662013-11-19 22:23:20 +01003263 Py_ssize_t i, n = asdl_seq_LEN(s->v.ImportFrom.names);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03003264 PyObject *names;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003265 static PyObject *empty_string;
Benjamin Peterson78565b22009-06-28 19:19:51 +00003266
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003267 if (!empty_string) {
3268 empty_string = PyUnicode_FromString("");
3269 if (!empty_string)
3270 return 0;
3271 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003272
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03003273 ADDOP_LOAD_CONST_NEW(c, PyLong_FromLong(s->v.ImportFrom.level));
Serhiy Storchakaa95d9862018-03-24 22:42:35 +02003274
3275 names = PyTuple_New(n);
3276 if (!names)
3277 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003278
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003279 /* build up the names */
3280 for (i = 0; i < n; i++) {
3281 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);
3282 Py_INCREF(alias->name);
3283 PyTuple_SET_ITEM(names, i, alias->name);
3284 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003285
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003286 if (s->lineno > c->c_future->ff_lineno && s->v.ImportFrom.module &&
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02003287 _PyUnicode_EqualToASCIIString(s->v.ImportFrom.module, "__future__")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003288 Py_DECREF(names);
3289 return compiler_error(c, "from __future__ imports must occur "
3290 "at the beginning of the file");
3291 }
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03003292 ADDOP_LOAD_CONST_NEW(c, names);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003293
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003294 if (s->v.ImportFrom.module) {
3295 ADDOP_NAME(c, IMPORT_NAME, s->v.ImportFrom.module, names);
3296 }
3297 else {
3298 ADDOP_NAME(c, IMPORT_NAME, empty_string, names);
3299 }
3300 for (i = 0; i < n; i++) {
3301 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);
3302 identifier store_name;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003303
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003304 if (i == 0 && PyUnicode_READ_CHAR(alias->name, 0) == '*') {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003305 assert(n == 1);
3306 ADDOP(c, IMPORT_STAR);
3307 return 1;
3308 }
3309
3310 ADDOP_NAME(c, IMPORT_FROM, alias->name, names);
3311 store_name = alias->name;
3312 if (alias->asname)
3313 store_name = alias->asname;
3314
3315 if (!compiler_nameop(c, store_name, Store)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003316 return 0;
3317 }
3318 }
3319 /* remove imported module */
3320 ADDOP(c, POP_TOP);
3321 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003322}
3323
3324static int
3325compiler_assert(struct compiler *c, stmt_ty s)
3326{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003327 basicblock *end;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003328
Georg Brandl8334fd92010-12-04 10:26:46 +00003329 if (c->c_optimize)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003330 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003331 if (s->v.Assert.test->kind == Tuple_kind &&
Serhiy Storchakad31e7732018-10-21 10:09:39 +03003332 asdl_seq_LEN(s->v.Assert.test->v.Tuple.elts) > 0)
3333 {
3334 if (!compiler_warn(c, "assertion is always true, "
3335 "perhaps remove parentheses?"))
3336 {
Victor Stinner14e461d2013-08-26 22:28:21 +02003337 return 0;
3338 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003339 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003340 end = compiler_new_block(c);
3341 if (end == NULL)
3342 return 0;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03003343 if (!compiler_jump_if(c, s->v.Assert.test, end, 1))
3344 return 0;
Zackery Spytzce6a0702019-08-25 03:44:09 -06003345 ADDOP(c, LOAD_ASSERTION_ERROR);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003346 if (s->v.Assert.msg) {
3347 VISIT(c, expr, s->v.Assert.msg);
3348 ADDOP_I(c, CALL_FUNCTION, 1);
3349 }
3350 ADDOP_I(c, RAISE_VARARGS, 1);
3351 compiler_use_next_block(c, end);
3352 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003353}
3354
3355static int
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01003356compiler_visit_stmt_expr(struct compiler *c, expr_ty value)
3357{
3358 if (c->c_interactive && c->c_nestlevel <= 1) {
3359 VISIT(c, expr, value);
3360 ADDOP(c, PRINT_EXPR);
3361 return 1;
3362 }
3363
Serhiy Storchaka3f228112018-09-27 17:42:37 +03003364 if (value->kind == Constant_kind) {
Victor Stinner15a30952016-02-08 22:45:06 +01003365 /* ignore constant statement */
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01003366 return 1;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01003367 }
3368
3369 VISIT(c, expr, value);
3370 ADDOP(c, POP_TOP);
3371 return 1;
3372}
3373
3374static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003375compiler_visit_stmt(struct compiler *c, stmt_ty s)
3376{
Victor Stinnerad9a0662013-11-19 22:23:20 +01003377 Py_ssize_t i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003378
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003379 /* Always assign a lineno to the next instruction for a stmt. */
Serhiy Storchaka61cb3d02020-03-17 18:07:30 +02003380 SET_LOC(c, s);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003381
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003382 switch (s->kind) {
3383 case FunctionDef_kind:
Yury Selivanov75445082015-05-11 22:57:16 -04003384 return compiler_function(c, s, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003385 case ClassDef_kind:
3386 return compiler_class(c, s);
3387 case Return_kind:
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003388 return compiler_return(c, s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003389 case Delete_kind:
3390 VISIT_SEQ(c, expr, s->v.Delete.targets)
3391 break;
3392 case Assign_kind:
3393 n = asdl_seq_LEN(s->v.Assign.targets);
3394 VISIT(c, expr, s->v.Assign.value);
3395 for (i = 0; i < n; i++) {
3396 if (i < n - 1)
3397 ADDOP(c, DUP_TOP);
3398 VISIT(c, expr,
3399 (expr_ty)asdl_seq_GET(s->v.Assign.targets, i));
3400 }
3401 break;
3402 case AugAssign_kind:
3403 return compiler_augassign(c, s);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003404 case AnnAssign_kind:
3405 return compiler_annassign(c, s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003406 case For_kind:
3407 return compiler_for(c, s);
3408 case While_kind:
3409 return compiler_while(c, s);
3410 case If_kind:
3411 return compiler_if(c, s);
3412 case Raise_kind:
3413 n = 0;
3414 if (s->v.Raise.exc) {
3415 VISIT(c, expr, s->v.Raise.exc);
3416 n++;
Victor Stinnerad9a0662013-11-19 22:23:20 +01003417 if (s->v.Raise.cause) {
3418 VISIT(c, expr, s->v.Raise.cause);
3419 n++;
3420 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003421 }
Victor Stinnerad9a0662013-11-19 22:23:20 +01003422 ADDOP_I(c, RAISE_VARARGS, (int)n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003423 break;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003424 case Try_kind:
3425 return compiler_try(c, s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003426 case Assert_kind:
3427 return compiler_assert(c, s);
3428 case Import_kind:
3429 return compiler_import(c, s);
3430 case ImportFrom_kind:
3431 return compiler_from_import(c, s);
3432 case Global_kind:
3433 case Nonlocal_kind:
3434 break;
3435 case Expr_kind:
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01003436 return compiler_visit_stmt_expr(c, s->v.Expr.value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003437 case Pass_kind:
3438 break;
3439 case Break_kind:
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003440 return compiler_break(c);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003441 case Continue_kind:
3442 return compiler_continue(c);
3443 case With_kind:
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003444 return compiler_with(c, s, 0);
Yury Selivanov75445082015-05-11 22:57:16 -04003445 case AsyncFunctionDef_kind:
3446 return compiler_function(c, s, 1);
3447 case AsyncWith_kind:
3448 return compiler_async_with(c, s, 0);
3449 case AsyncFor_kind:
3450 return compiler_async_for(c, s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003451 }
Yury Selivanov75445082015-05-11 22:57:16 -04003452
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003453 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003454}
3455
3456static int
3457unaryop(unaryop_ty op)
3458{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003459 switch (op) {
3460 case Invert:
3461 return UNARY_INVERT;
3462 case Not:
3463 return UNARY_NOT;
3464 case UAdd:
3465 return UNARY_POSITIVE;
3466 case USub:
3467 return UNARY_NEGATIVE;
3468 default:
3469 PyErr_Format(PyExc_SystemError,
3470 "unary op %d should not be possible", op);
3471 return 0;
3472 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003473}
3474
3475static int
Andy Lester76d58772020-03-10 21:18:12 -05003476binop(operator_ty op)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003477{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003478 switch (op) {
3479 case Add:
3480 return BINARY_ADD;
3481 case Sub:
3482 return BINARY_SUBTRACT;
3483 case Mult:
3484 return BINARY_MULTIPLY;
Benjamin Petersond51374e2014-04-09 23:55:56 -04003485 case MatMult:
3486 return BINARY_MATRIX_MULTIPLY;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003487 case Div:
3488 return BINARY_TRUE_DIVIDE;
3489 case Mod:
3490 return BINARY_MODULO;
3491 case Pow:
3492 return BINARY_POWER;
3493 case LShift:
3494 return BINARY_LSHIFT;
3495 case RShift:
3496 return BINARY_RSHIFT;
3497 case BitOr:
3498 return BINARY_OR;
3499 case BitXor:
3500 return BINARY_XOR;
3501 case BitAnd:
3502 return BINARY_AND;
3503 case FloorDiv:
3504 return BINARY_FLOOR_DIVIDE;
3505 default:
3506 PyErr_Format(PyExc_SystemError,
3507 "binary op %d should not be possible", op);
3508 return 0;
3509 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003510}
3511
3512static int
Andy Lester76d58772020-03-10 21:18:12 -05003513inplace_binop(operator_ty op)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003514{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003515 switch (op) {
3516 case Add:
3517 return INPLACE_ADD;
3518 case Sub:
3519 return INPLACE_SUBTRACT;
3520 case Mult:
3521 return INPLACE_MULTIPLY;
Benjamin Petersond51374e2014-04-09 23:55:56 -04003522 case MatMult:
3523 return INPLACE_MATRIX_MULTIPLY;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003524 case Div:
3525 return INPLACE_TRUE_DIVIDE;
3526 case Mod:
3527 return INPLACE_MODULO;
3528 case Pow:
3529 return INPLACE_POWER;
3530 case LShift:
3531 return INPLACE_LSHIFT;
3532 case RShift:
3533 return INPLACE_RSHIFT;
3534 case BitOr:
3535 return INPLACE_OR;
3536 case BitXor:
3537 return INPLACE_XOR;
3538 case BitAnd:
3539 return INPLACE_AND;
3540 case FloorDiv:
3541 return INPLACE_FLOOR_DIVIDE;
3542 default:
3543 PyErr_Format(PyExc_SystemError,
3544 "inplace binary op %d should not be possible", op);
3545 return 0;
3546 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003547}
3548
3549static int
3550compiler_nameop(struct compiler *c, identifier name, expr_context_ty ctx)
3551{
Victor Stinnerad9a0662013-11-19 22:23:20 +01003552 int op, scope;
3553 Py_ssize_t arg;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003554 enum { OP_FAST, OP_GLOBAL, OP_DEREF, OP_NAME } optype;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003555
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003556 PyObject *dict = c->u->u_names;
3557 PyObject *mangled;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003558
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02003559 assert(!_PyUnicode_EqualToASCIIString(name, "None") &&
3560 !_PyUnicode_EqualToASCIIString(name, "True") &&
3561 !_PyUnicode_EqualToASCIIString(name, "False"));
Benjamin Peterson70b224d2012-12-06 17:49:58 -05003562
Pablo Galindoc5fc1562020-04-22 23:29:27 +01003563 if (forbidden_name(c, name, ctx))
3564 return 0;
3565
Serhiy Storchakabd6ec4d2017-12-18 14:29:12 +02003566 mangled = _Py_Mangle(c->u->u_private, name);
3567 if (!mangled)
3568 return 0;
3569
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003570 op = 0;
3571 optype = OP_NAME;
3572 scope = PyST_GetScope(c->u->u_ste, mangled);
3573 switch (scope) {
3574 case FREE:
3575 dict = c->u->u_freevars;
3576 optype = OP_DEREF;
3577 break;
3578 case CELL:
3579 dict = c->u->u_cellvars;
3580 optype = OP_DEREF;
3581 break;
3582 case LOCAL:
3583 if (c->u->u_ste->ste_type == FunctionBlock)
3584 optype = OP_FAST;
3585 break;
3586 case GLOBAL_IMPLICIT:
Benjamin Peterson1dfd2472015-04-27 21:44:22 -04003587 if (c->u->u_ste->ste_type == FunctionBlock)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003588 optype = OP_GLOBAL;
3589 break;
3590 case GLOBAL_EXPLICIT:
3591 optype = OP_GLOBAL;
3592 break;
3593 default:
3594 /* scope can be 0 */
3595 break;
3596 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003597
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003598 /* XXX Leave assert here, but handle __doc__ and the like better */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003599 assert(scope || PyUnicode_READ_CHAR(name, 0) == '_');
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003600
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003601 switch (optype) {
3602 case OP_DEREF:
3603 switch (ctx) {
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04003604 case Load:
3605 op = (c->u->u_ste->ste_type == ClassBlock) ? LOAD_CLASSDEREF : LOAD_DEREF;
3606 break;
Serhiy Storchaka6b975982020-03-17 23:41:08 +02003607 case Store: op = STORE_DEREF; break;
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00003608 case Del: op = DELETE_DEREF; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003609 }
3610 break;
3611 case OP_FAST:
3612 switch (ctx) {
3613 case Load: op = LOAD_FAST; break;
Serhiy Storchaka6b975982020-03-17 23:41:08 +02003614 case Store: op = STORE_FAST; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003615 case Del: op = DELETE_FAST; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003616 }
Serhiy Storchakaaa8e51f2018-04-01 00:29:37 +03003617 ADDOP_N(c, op, mangled, varnames);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003618 return 1;
3619 case OP_GLOBAL:
3620 switch (ctx) {
3621 case Load: op = LOAD_GLOBAL; break;
Serhiy Storchaka6b975982020-03-17 23:41:08 +02003622 case Store: op = STORE_GLOBAL; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003623 case Del: op = DELETE_GLOBAL; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003624 }
3625 break;
3626 case OP_NAME:
3627 switch (ctx) {
Benjamin Peterson20f9c3c2010-07-20 22:39:34 +00003628 case Load: op = LOAD_NAME; break;
Serhiy Storchaka6b975982020-03-17 23:41:08 +02003629 case Store: op = STORE_NAME; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003630 case Del: op = DELETE_NAME; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003631 }
3632 break;
3633 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003634
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003635 assert(op);
Andy Lester76d58772020-03-10 21:18:12 -05003636 arg = compiler_add_o(dict, mangled);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003637 Py_DECREF(mangled);
3638 if (arg < 0)
3639 return 0;
3640 return compiler_addop_i(c, op, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003641}
3642
3643static int
3644compiler_boolop(struct compiler *c, expr_ty e)
3645{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003646 basicblock *end;
Victor Stinnerad9a0662013-11-19 22:23:20 +01003647 int jumpi;
3648 Py_ssize_t i, n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003649 asdl_seq *s;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003650
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003651 assert(e->kind == BoolOp_kind);
3652 if (e->v.BoolOp.op == And)
3653 jumpi = JUMP_IF_FALSE_OR_POP;
3654 else
3655 jumpi = JUMP_IF_TRUE_OR_POP;
3656 end = compiler_new_block(c);
3657 if (end == NULL)
3658 return 0;
3659 s = e->v.BoolOp.values;
3660 n = asdl_seq_LEN(s) - 1;
3661 assert(n >= 0);
3662 for (i = 0; i < n; ++i) {
3663 VISIT(c, expr, (expr_ty)asdl_seq_GET(s, i));
3664 ADDOP_JABS(c, jumpi, end);
3665 }
3666 VISIT(c, expr, (expr_ty)asdl_seq_GET(s, n));
3667 compiler_use_next_block(c, end);
3668 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003669}
3670
3671static int
Mark Shannon13bc1392020-01-23 09:25:17 +00003672starunpack_helper(struct compiler *c, asdl_seq *elts, int pushed,
3673 int build, int add, int extend, int tuple)
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003674{
3675 Py_ssize_t n = asdl_seq_LEN(elts);
Mark Shannon13bc1392020-01-23 09:25:17 +00003676 Py_ssize_t i, seen_star = 0;
Brandt Bucher6dd9b642019-11-25 22:16:53 -08003677 if (n > 2 && are_all_items_const(elts, 0, n)) {
3678 PyObject *folded = PyTuple_New(n);
3679 if (folded == NULL) {
3680 return 0;
3681 }
3682 PyObject *val;
3683 for (i = 0; i < n; i++) {
3684 val = ((expr_ty)asdl_seq_GET(elts, i))->v.Constant.value;
3685 Py_INCREF(val);
3686 PyTuple_SET_ITEM(folded, i, val);
3687 }
Mark Shannon13bc1392020-01-23 09:25:17 +00003688 if (tuple) {
3689 ADDOP_LOAD_CONST_NEW(c, folded);
3690 } else {
3691 if (add == SET_ADD) {
3692 Py_SETREF(folded, PyFrozenSet_New(folded));
3693 if (folded == NULL) {
3694 return 0;
3695 }
Brandt Bucher6dd9b642019-11-25 22:16:53 -08003696 }
Mark Shannon13bc1392020-01-23 09:25:17 +00003697 ADDOP_I(c, build, pushed);
3698 ADDOP_LOAD_CONST_NEW(c, folded);
3699 ADDOP_I(c, extend, 1);
Brandt Bucher6dd9b642019-11-25 22:16:53 -08003700 }
Brandt Bucher6dd9b642019-11-25 22:16:53 -08003701 return 1;
3702 }
Mark Shannon13bc1392020-01-23 09:25:17 +00003703
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003704 for (i = 0; i < n; i++) {
3705 expr_ty elt = asdl_seq_GET(elts, i);
3706 if (elt->kind == Starred_kind) {
Mark Shannon13bc1392020-01-23 09:25:17 +00003707 seen_star = 1;
3708 }
3709 }
3710 if (seen_star) {
3711 seen_star = 0;
3712 for (i = 0; i < n; i++) {
3713 expr_ty elt = asdl_seq_GET(elts, i);
3714 if (elt->kind == Starred_kind) {
3715 if (seen_star == 0) {
3716 ADDOP_I(c, build, i+pushed);
3717 seen_star = 1;
3718 }
3719 VISIT(c, expr, elt->v.Starred.value);
3720 ADDOP_I(c, extend, 1);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003721 }
Mark Shannon13bc1392020-01-23 09:25:17 +00003722 else {
3723 VISIT(c, expr, elt);
3724 if (seen_star) {
3725 ADDOP_I(c, add, 1);
3726 }
3727 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003728 }
Mark Shannon13bc1392020-01-23 09:25:17 +00003729 assert(seen_star);
3730 if (tuple) {
3731 ADDOP(c, LIST_TO_TUPLE);
3732 }
3733 }
3734 else {
3735 for (i = 0; i < n; i++) {
3736 expr_ty elt = asdl_seq_GET(elts, i);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003737 VISIT(c, expr, elt);
Mark Shannon13bc1392020-01-23 09:25:17 +00003738 }
3739 if (tuple) {
3740 ADDOP_I(c, BUILD_TUPLE, n+pushed);
3741 } else {
3742 ADDOP_I(c, build, n+pushed);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003743 }
3744 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003745 return 1;
3746}
3747
3748static int
3749assignment_helper(struct compiler *c, asdl_seq *elts)
3750{
3751 Py_ssize_t n = asdl_seq_LEN(elts);
3752 Py_ssize_t i;
3753 int seen_star = 0;
3754 for (i = 0; i < n; i++) {
3755 expr_ty elt = asdl_seq_GET(elts, i);
3756 if (elt->kind == Starred_kind && !seen_star) {
3757 if ((i >= (1 << 8)) ||
3758 (n-i-1 >= (INT_MAX >> 8)))
3759 return compiler_error(c,
3760 "too many expressions in "
3761 "star-unpacking assignment");
3762 ADDOP_I(c, UNPACK_EX, (i + ((n-i-1) << 8)));
3763 seen_star = 1;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003764 }
3765 else if (elt->kind == Starred_kind) {
3766 return compiler_error(c,
Furkan Öndercb6534e2020-03-26 04:54:31 +03003767 "multiple starred expressions in assignment");
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003768 }
3769 }
3770 if (!seen_star) {
3771 ADDOP_I(c, UNPACK_SEQUENCE, n);
3772 }
Brandt Bucherd5aa2e92020-03-07 19:44:18 -08003773 for (i = 0; i < n; i++) {
3774 expr_ty elt = asdl_seq_GET(elts, i);
3775 VISIT(c, expr, elt->kind != Starred_kind ? elt : elt->v.Starred.value);
3776 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003777 return 1;
3778}
3779
3780static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003781compiler_list(struct compiler *c, expr_ty e)
3782{
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003783 asdl_seq *elts = e->v.List.elts;
Serhiy Storchakad8b3a982019-03-05 20:42:06 +02003784 if (e->v.List.ctx == Store) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003785 return assignment_helper(c, elts);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003786 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003787 else if (e->v.List.ctx == Load) {
Mark Shannon13bc1392020-01-23 09:25:17 +00003788 return starunpack_helper(c, elts, 0, BUILD_LIST,
3789 LIST_APPEND, LIST_EXTEND, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003790 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003791 else
3792 VISIT_SEQ(c, expr, elts);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003793 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003794}
3795
3796static int
3797compiler_tuple(struct compiler *c, expr_ty e)
3798{
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003799 asdl_seq *elts = e->v.Tuple.elts;
Serhiy Storchakad8b3a982019-03-05 20:42:06 +02003800 if (e->v.Tuple.ctx == Store) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003801 return assignment_helper(c, elts);
3802 }
3803 else if (e->v.Tuple.ctx == Load) {
Mark Shannon13bc1392020-01-23 09:25:17 +00003804 return starunpack_helper(c, elts, 0, BUILD_LIST,
3805 LIST_APPEND, LIST_EXTEND, 1);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003806 }
3807 else
3808 VISIT_SEQ(c, expr, elts);
3809 return 1;
3810}
3811
3812static int
3813compiler_set(struct compiler *c, expr_ty e)
3814{
Mark Shannon13bc1392020-01-23 09:25:17 +00003815 return starunpack_helper(c, e->v.Set.elts, 0, BUILD_SET,
3816 SET_ADD, SET_UPDATE, 0);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003817}
3818
3819static int
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003820are_all_items_const(asdl_seq *seq, Py_ssize_t begin, Py_ssize_t end)
3821{
3822 Py_ssize_t i;
3823 for (i = begin; i < end; i++) {
3824 expr_ty key = (expr_ty)asdl_seq_GET(seq, i);
Serhiy Storchaka3f228112018-09-27 17:42:37 +03003825 if (key == NULL || key->kind != Constant_kind)
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003826 return 0;
3827 }
3828 return 1;
3829}
3830
3831static int
3832compiler_subdict(struct compiler *c, expr_ty e, Py_ssize_t begin, Py_ssize_t end)
3833{
3834 Py_ssize_t i, n = end - begin;
3835 PyObject *keys, *key;
3836 if (n > 1 && are_all_items_const(e->v.Dict.keys, begin, end)) {
3837 for (i = begin; i < end; i++) {
3838 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Dict.values, i));
3839 }
3840 keys = PyTuple_New(n);
3841 if (keys == NULL) {
3842 return 0;
3843 }
3844 for (i = begin; i < end; i++) {
Serhiy Storchaka3f228112018-09-27 17:42:37 +03003845 key = ((expr_ty)asdl_seq_GET(e->v.Dict.keys, i))->v.Constant.value;
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003846 Py_INCREF(key);
3847 PyTuple_SET_ITEM(keys, i - begin, key);
3848 }
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03003849 ADDOP_LOAD_CONST_NEW(c, keys);
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003850 ADDOP_I(c, BUILD_CONST_KEY_MAP, n);
3851 }
3852 else {
3853 for (i = begin; i < end; i++) {
3854 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Dict.keys, i));
3855 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Dict.values, i));
3856 }
3857 ADDOP_I(c, BUILD_MAP, n);
3858 }
3859 return 1;
3860}
3861
3862static int
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003863compiler_dict(struct compiler *c, expr_ty e)
3864{
Victor Stinner976bb402016-03-23 11:36:19 +01003865 Py_ssize_t i, n, elements;
Mark Shannon8a4cd702020-01-27 09:57:45 +00003866 int have_dict;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003867 int is_unpacking = 0;
3868 n = asdl_seq_LEN(e->v.Dict.values);
Mark Shannon8a4cd702020-01-27 09:57:45 +00003869 have_dict = 0;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003870 elements = 0;
3871 for (i = 0; i < n; i++) {
3872 is_unpacking = (expr_ty)asdl_seq_GET(e->v.Dict.keys, i) == NULL;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003873 if (is_unpacking) {
Mark Shannon8a4cd702020-01-27 09:57:45 +00003874 if (elements) {
3875 if (!compiler_subdict(c, e, i - elements, i)) {
3876 return 0;
3877 }
3878 if (have_dict) {
3879 ADDOP_I(c, DICT_UPDATE, 1);
3880 }
3881 have_dict = 1;
3882 elements = 0;
3883 }
3884 if (have_dict == 0) {
3885 ADDOP_I(c, BUILD_MAP, 0);
3886 have_dict = 1;
3887 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003888 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Dict.values, i));
Mark Shannon8a4cd702020-01-27 09:57:45 +00003889 ADDOP_I(c, DICT_UPDATE, 1);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003890 }
3891 else {
Mark Shannon8a4cd702020-01-27 09:57:45 +00003892 if (elements == 0xFFFF) {
3893 if (!compiler_subdict(c, e, i - elements, i)) {
3894 return 0;
3895 }
3896 if (have_dict) {
3897 ADDOP_I(c, DICT_UPDATE, 1);
3898 }
3899 have_dict = 1;
3900 elements = 0;
3901 }
3902 else {
3903 elements++;
3904 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003905 }
3906 }
Mark Shannon8a4cd702020-01-27 09:57:45 +00003907 if (elements) {
3908 if (!compiler_subdict(c, e, n - elements, n)) {
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003909 return 0;
Mark Shannon8a4cd702020-01-27 09:57:45 +00003910 }
3911 if (have_dict) {
3912 ADDOP_I(c, DICT_UPDATE, 1);
3913 }
3914 have_dict = 1;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003915 }
Mark Shannon8a4cd702020-01-27 09:57:45 +00003916 if (!have_dict) {
3917 ADDOP_I(c, BUILD_MAP, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003918 }
3919 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003920}
3921
3922static int
3923compiler_compare(struct compiler *c, expr_ty e)
3924{
Victor Stinnerad9a0662013-11-19 22:23:20 +01003925 Py_ssize_t i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003926
Serhiy Storchaka3bcbedc2019-01-18 07:47:48 +02003927 if (!check_compare(c, e)) {
3928 return 0;
3929 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003930 VISIT(c, expr, e->v.Compare.left);
Serhiy Storchaka02b9ef22017-12-30 09:47:42 +02003931 assert(asdl_seq_LEN(e->v.Compare.ops) > 0);
3932 n = asdl_seq_LEN(e->v.Compare.ops) - 1;
3933 if (n == 0) {
3934 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, 0));
Mark Shannon9af0e472020-01-14 10:12:45 +00003935 ADDOP_COMPARE(c, asdl_seq_GET(e->v.Compare.ops, 0));
Serhiy Storchaka02b9ef22017-12-30 09:47:42 +02003936 }
3937 else {
3938 basicblock *cleanup = compiler_new_block(c);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003939 if (cleanup == NULL)
3940 return 0;
Serhiy Storchaka02b9ef22017-12-30 09:47:42 +02003941 for (i = 0; i < n; i++) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003942 VISIT(c, expr,
3943 (expr_ty)asdl_seq_GET(e->v.Compare.comparators, i));
Serhiy Storchaka02b9ef22017-12-30 09:47:42 +02003944 ADDOP(c, DUP_TOP);
3945 ADDOP(c, ROT_THREE);
Mark Shannon9af0e472020-01-14 10:12:45 +00003946 ADDOP_COMPARE(c, asdl_seq_GET(e->v.Compare.ops, i));
Serhiy Storchaka02b9ef22017-12-30 09:47:42 +02003947 ADDOP_JABS(c, JUMP_IF_FALSE_OR_POP, cleanup);
3948 NEXT_BLOCK(c);
3949 }
3950 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, n));
Mark Shannon9af0e472020-01-14 10:12:45 +00003951 ADDOP_COMPARE(c, asdl_seq_GET(e->v.Compare.ops, n));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003952 basicblock *end = compiler_new_block(c);
3953 if (end == NULL)
3954 return 0;
3955 ADDOP_JREL(c, JUMP_FORWARD, end);
3956 compiler_use_next_block(c, cleanup);
3957 ADDOP(c, ROT_TWO);
3958 ADDOP(c, POP_TOP);
3959 compiler_use_next_block(c, end);
3960 }
3961 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003962}
3963
Serhiy Storchaka62e44812019-02-16 08:12:19 +02003964static PyTypeObject *
3965infer_type(expr_ty e)
3966{
3967 switch (e->kind) {
3968 case Tuple_kind:
3969 return &PyTuple_Type;
3970 case List_kind:
3971 case ListComp_kind:
3972 return &PyList_Type;
3973 case Dict_kind:
3974 case DictComp_kind:
3975 return &PyDict_Type;
3976 case Set_kind:
3977 case SetComp_kind:
3978 return &PySet_Type;
3979 case GeneratorExp_kind:
3980 return &PyGen_Type;
3981 case Lambda_kind:
3982 return &PyFunction_Type;
3983 case JoinedStr_kind:
3984 case FormattedValue_kind:
3985 return &PyUnicode_Type;
3986 case Constant_kind:
Victor Stinnera102ed72020-02-07 02:24:48 +01003987 return Py_TYPE(e->v.Constant.value);
Serhiy Storchaka62e44812019-02-16 08:12:19 +02003988 default:
3989 return NULL;
3990 }
3991}
3992
3993static int
3994check_caller(struct compiler *c, expr_ty e)
3995{
3996 switch (e->kind) {
3997 case Constant_kind:
3998 case Tuple_kind:
3999 case List_kind:
4000 case ListComp_kind:
4001 case Dict_kind:
4002 case DictComp_kind:
4003 case Set_kind:
4004 case SetComp_kind:
4005 case GeneratorExp_kind:
4006 case JoinedStr_kind:
4007 case FormattedValue_kind:
4008 return compiler_warn(c, "'%.200s' object is not callable; "
4009 "perhaps you missed a comma?",
4010 infer_type(e)->tp_name);
4011 default:
4012 return 1;
4013 }
4014}
4015
4016static int
4017check_subscripter(struct compiler *c, expr_ty e)
4018{
4019 PyObject *v;
4020
4021 switch (e->kind) {
4022 case Constant_kind:
4023 v = e->v.Constant.value;
4024 if (!(v == Py_None || v == Py_Ellipsis ||
4025 PyLong_Check(v) || PyFloat_Check(v) || PyComplex_Check(v) ||
4026 PyAnySet_Check(v)))
4027 {
4028 return 1;
4029 }
4030 /* fall through */
4031 case Set_kind:
4032 case SetComp_kind:
4033 case GeneratorExp_kind:
4034 case Lambda_kind:
4035 return compiler_warn(c, "'%.200s' object is not subscriptable; "
4036 "perhaps you missed a comma?",
4037 infer_type(e)->tp_name);
4038 default:
4039 return 1;
4040 }
4041}
4042
4043static int
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02004044check_index(struct compiler *c, expr_ty e, expr_ty s)
Serhiy Storchaka62e44812019-02-16 08:12:19 +02004045{
4046 PyObject *v;
4047
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02004048 PyTypeObject *index_type = infer_type(s);
Serhiy Storchaka62e44812019-02-16 08:12:19 +02004049 if (index_type == NULL
4050 || PyType_FastSubclass(index_type, Py_TPFLAGS_LONG_SUBCLASS)
4051 || index_type == &PySlice_Type) {
4052 return 1;
4053 }
4054
4055 switch (e->kind) {
4056 case Constant_kind:
4057 v = e->v.Constant.value;
4058 if (!(PyUnicode_Check(v) || PyBytes_Check(v) || PyTuple_Check(v))) {
4059 return 1;
4060 }
4061 /* fall through */
4062 case Tuple_kind:
4063 case List_kind:
4064 case ListComp_kind:
4065 case JoinedStr_kind:
4066 case FormattedValue_kind:
4067 return compiler_warn(c, "%.200s indices must be integers or slices, "
4068 "not %.200s; "
4069 "perhaps you missed a comma?",
4070 infer_type(e)->tp_name,
4071 index_type->tp_name);
4072 default:
4073 return 1;
4074 }
4075}
4076
Zackery Spytz97f5de02019-03-22 01:30:32 -06004077// Return 1 if the method call was optimized, -1 if not, and 0 on error.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004078static int
Yury Selivanovf2392132016-12-13 19:03:51 -05004079maybe_optimize_method_call(struct compiler *c, expr_ty e)
4080{
4081 Py_ssize_t argsl, i;
4082 expr_ty meth = e->v.Call.func;
4083 asdl_seq *args = e->v.Call.args;
4084
4085 /* Check that the call node is an attribute access, and that
4086 the call doesn't have keyword parameters. */
4087 if (meth->kind != Attribute_kind || meth->v.Attribute.ctx != Load ||
4088 asdl_seq_LEN(e->v.Call.keywords))
4089 return -1;
4090
4091 /* Check that there are no *varargs types of arguments. */
4092 argsl = asdl_seq_LEN(args);
4093 for (i = 0; i < argsl; i++) {
4094 expr_ty elt = asdl_seq_GET(args, i);
4095 if (elt->kind == Starred_kind) {
4096 return -1;
4097 }
4098 }
4099
4100 /* Alright, we can optimize the code. */
4101 VISIT(c, expr, meth->v.Attribute.value);
4102 ADDOP_NAME(c, LOAD_METHOD, meth->v.Attribute.attr, names);
4103 VISIT_SEQ(c, expr, e->v.Call.args);
4104 ADDOP_I(c, CALL_METHOD, asdl_seq_LEN(e->v.Call.args));
4105 return 1;
4106}
4107
4108static int
Zackery Spytz08050e92020-04-06 00:47:47 -06004109validate_keywords(struct compiler *c, asdl_seq *keywords)
4110{
4111 Py_ssize_t nkeywords = asdl_seq_LEN(keywords);
4112 for (Py_ssize_t i = 0; i < nkeywords; i++) {
Pablo Galindo254ec782020-04-03 20:37:13 +01004113 keyword_ty key = ((keyword_ty)asdl_seq_GET(keywords, i));
4114 if (key->arg == NULL) {
4115 continue;
4116 }
Pablo Galindoc5fc1562020-04-22 23:29:27 +01004117 if (forbidden_name(c, key->arg, Store)) {
4118 return -1;
4119 }
Zackery Spytz08050e92020-04-06 00:47:47 -06004120 for (Py_ssize_t j = i + 1; j < nkeywords; j++) {
Pablo Galindo254ec782020-04-03 20:37:13 +01004121 keyword_ty other = ((keyword_ty)asdl_seq_GET(keywords, j));
4122 if (other->arg && !PyUnicode_Compare(key->arg, other->arg)) {
4123 PyObject *msg = PyUnicode_FromFormat("keyword argument repeated: %U", key->arg);
4124 if (msg == NULL) {
4125 return -1;
4126 }
4127 c->u->u_col_offset = other->col_offset;
4128 compiler_error(c, PyUnicode_AsUTF8(msg));
4129 Py_DECREF(msg);
4130 return -1;
4131 }
4132 }
4133 }
4134 return 0;
4135}
4136
4137static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004138compiler_call(struct compiler *c, expr_ty e)
4139{
Zackery Spytz97f5de02019-03-22 01:30:32 -06004140 int ret = maybe_optimize_method_call(c, e);
4141 if (ret >= 0) {
4142 return ret;
4143 }
Serhiy Storchaka62e44812019-02-16 08:12:19 +02004144 if (!check_caller(c, e->v.Call.func)) {
4145 return 0;
4146 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004147 VISIT(c, expr, e->v.Call.func);
4148 return compiler_call_helper(c, 0,
4149 e->v.Call.args,
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004150 e->v.Call.keywords);
Guido van Rossum52cc1d82007-03-18 15:41:51 +00004151}
4152
Eric V. Smith235a6f02015-09-19 14:51:32 -04004153static int
4154compiler_joined_str(struct compiler *c, expr_ty e)
4155{
Eric V. Smith235a6f02015-09-19 14:51:32 -04004156 VISIT_SEQ(c, expr, e->v.JoinedStr.values);
Serhiy Storchaka4cc30ae2016-12-11 19:37:19 +02004157 if (asdl_seq_LEN(e->v.JoinedStr.values) != 1)
4158 ADDOP_I(c, BUILD_STRING, asdl_seq_LEN(e->v.JoinedStr.values));
Eric V. Smith235a6f02015-09-19 14:51:32 -04004159 return 1;
4160}
4161
Eric V. Smitha78c7952015-11-03 12:45:05 -05004162/* Used to implement f-strings. Format a single value. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04004163static int
4164compiler_formatted_value(struct compiler *c, expr_ty e)
4165{
Eric V. Smitha78c7952015-11-03 12:45:05 -05004166 /* Our oparg encodes 2 pieces of information: the conversion
4167 character, and whether or not a format_spec was provided.
Eric V. Smith235a6f02015-09-19 14:51:32 -04004168
Eric V. Smith9a4135e2019-05-08 16:28:48 -04004169 Convert the conversion char to 3 bits:
4170 : 000 0x0 FVC_NONE The default if nothing specified.
Eric V. Smitha78c7952015-11-03 12:45:05 -05004171 !s : 001 0x1 FVC_STR
4172 !r : 010 0x2 FVC_REPR
4173 !a : 011 0x3 FVC_ASCII
Eric V. Smith235a6f02015-09-19 14:51:32 -04004174
Eric V. Smitha78c7952015-11-03 12:45:05 -05004175 next bit is whether or not we have a format spec:
4176 yes : 100 0x4
4177 no : 000 0x0
4178 */
Eric V. Smith235a6f02015-09-19 14:51:32 -04004179
Eric V. Smith9a4135e2019-05-08 16:28:48 -04004180 int conversion = e->v.FormattedValue.conversion;
Eric V. Smitha78c7952015-11-03 12:45:05 -05004181 int oparg;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004182
Eric V. Smith9a4135e2019-05-08 16:28:48 -04004183 /* The expression to be formatted. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04004184 VISIT(c, expr, e->v.FormattedValue.value);
4185
Eric V. Smith9a4135e2019-05-08 16:28:48 -04004186 switch (conversion) {
Eric V. Smitha78c7952015-11-03 12:45:05 -05004187 case 's': oparg = FVC_STR; break;
4188 case 'r': oparg = FVC_REPR; break;
4189 case 'a': oparg = FVC_ASCII; break;
4190 case -1: oparg = FVC_NONE; break;
4191 default:
Eric V. Smith9a4135e2019-05-08 16:28:48 -04004192 PyErr_Format(PyExc_SystemError,
4193 "Unrecognized conversion character %d", conversion);
Eric V. Smitha78c7952015-11-03 12:45:05 -05004194 return 0;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004195 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04004196 if (e->v.FormattedValue.format_spec) {
Eric V. Smitha78c7952015-11-03 12:45:05 -05004197 /* Evaluate the format spec, and update our opcode arg. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04004198 VISIT(c, expr, e->v.FormattedValue.format_spec);
Eric V. Smitha78c7952015-11-03 12:45:05 -05004199 oparg |= FVS_HAVE_SPEC;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004200 }
4201
Eric V. Smitha78c7952015-11-03 12:45:05 -05004202 /* And push our opcode and oparg */
4203 ADDOP_I(c, FORMAT_VALUE, oparg);
Eric V. Smith9a4135e2019-05-08 16:28:48 -04004204
Eric V. Smith235a6f02015-09-19 14:51:32 -04004205 return 1;
4206}
4207
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03004208static int
4209compiler_subkwargs(struct compiler *c, asdl_seq *keywords, Py_ssize_t begin, Py_ssize_t end)
4210{
4211 Py_ssize_t i, n = end - begin;
4212 keyword_ty kw;
4213 PyObject *keys, *key;
4214 assert(n > 0);
4215 if (n > 1) {
4216 for (i = begin; i < end; i++) {
4217 kw = asdl_seq_GET(keywords, i);
4218 VISIT(c, expr, kw->value);
4219 }
4220 keys = PyTuple_New(n);
4221 if (keys == NULL) {
4222 return 0;
4223 }
4224 for (i = begin; i < end; i++) {
4225 key = ((keyword_ty) asdl_seq_GET(keywords, i))->arg;
4226 Py_INCREF(key);
4227 PyTuple_SET_ITEM(keys, i - begin, key);
4228 }
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03004229 ADDOP_LOAD_CONST_NEW(c, keys);
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03004230 ADDOP_I(c, BUILD_CONST_KEY_MAP, n);
4231 }
4232 else {
4233 /* a for loop only executes once */
4234 for (i = begin; i < end; i++) {
4235 kw = asdl_seq_GET(keywords, i);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03004236 ADDOP_LOAD_CONST(c, kw->arg);
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03004237 VISIT(c, expr, kw->value);
4238 }
4239 ADDOP_I(c, BUILD_MAP, n);
4240 }
4241 return 1;
4242}
4243
Guido van Rossum52cc1d82007-03-18 15:41:51 +00004244/* shared code between compiler_call and compiler_class */
4245static int
4246compiler_call_helper(struct compiler *c,
Victor Stinner976bb402016-03-23 11:36:19 +01004247 int n, /* Args already pushed */
Victor Stinnerad9a0662013-11-19 22:23:20 +01004248 asdl_seq *args,
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004249 asdl_seq *keywords)
Guido van Rossum52cc1d82007-03-18 15:41:51 +00004250{
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004251 Py_ssize_t i, nseen, nelts, nkwelts;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004252
Pablo Galindo254ec782020-04-03 20:37:13 +01004253 if (validate_keywords(c, keywords) == -1) {
4254 return 0;
4255 }
4256
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004257 nelts = asdl_seq_LEN(args);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004258 nkwelts = asdl_seq_LEN(keywords);
4259
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004260 for (i = 0; i < nelts; i++) {
4261 expr_ty elt = asdl_seq_GET(args, i);
4262 if (elt->kind == Starred_kind) {
Mark Shannon13bc1392020-01-23 09:25:17 +00004263 goto ex_call;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004264 }
Mark Shannon13bc1392020-01-23 09:25:17 +00004265 }
4266 for (i = 0; i < nkwelts; i++) {
4267 keyword_ty kw = asdl_seq_GET(keywords, i);
4268 if (kw->arg == NULL) {
4269 goto ex_call;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004270 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004271 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004272
Mark Shannon13bc1392020-01-23 09:25:17 +00004273 /* No * or ** args, so can use faster calling sequence */
4274 for (i = 0; i < nelts; i++) {
4275 expr_ty elt = asdl_seq_GET(args, i);
4276 assert(elt->kind != Starred_kind);
4277 VISIT(c, expr, elt);
4278 }
4279 if (nkwelts) {
4280 PyObject *names;
4281 VISIT_SEQ(c, keyword, keywords);
4282 names = PyTuple_New(nkwelts);
4283 if (names == NULL) {
4284 return 0;
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004285 }
Mark Shannon13bc1392020-01-23 09:25:17 +00004286 for (i = 0; i < nkwelts; i++) {
4287 keyword_ty kw = asdl_seq_GET(keywords, i);
4288 Py_INCREF(kw->arg);
4289 PyTuple_SET_ITEM(names, i, kw->arg);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004290 }
Mark Shannon13bc1392020-01-23 09:25:17 +00004291 ADDOP_LOAD_CONST_NEW(c, names);
4292 ADDOP_I(c, CALL_FUNCTION_KW, n + nelts + nkwelts);
4293 return 1;
4294 }
4295 else {
4296 ADDOP_I(c, CALL_FUNCTION, n + nelts);
4297 return 1;
4298 }
4299
4300ex_call:
4301
4302 /* Do positional arguments. */
4303 if (n ==0 && nelts == 1 && ((expr_ty)asdl_seq_GET(args, 0))->kind == Starred_kind) {
4304 VISIT(c, expr, ((expr_ty)asdl_seq_GET(args, 0))->v.Starred.value);
4305 }
4306 else if (starunpack_helper(c, args, n, BUILD_LIST,
4307 LIST_APPEND, LIST_EXTEND, 1) == 0) {
4308 return 0;
4309 }
4310 /* Then keyword arguments */
4311 if (nkwelts) {
Mark Shannon8a4cd702020-01-27 09:57:45 +00004312 /* Has a new dict been pushed */
4313 int have_dict = 0;
Mark Shannon13bc1392020-01-23 09:25:17 +00004314
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004315 nseen = 0; /* the number of keyword arguments on the stack following */
4316 for (i = 0; i < nkwelts; i++) {
4317 keyword_ty kw = asdl_seq_GET(keywords, i);
4318 if (kw->arg == NULL) {
4319 /* A keyword argument unpacking. */
4320 if (nseen) {
Mark Shannon8a4cd702020-01-27 09:57:45 +00004321 if (!compiler_subkwargs(c, keywords, i - nseen, i)) {
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03004322 return 0;
Mark Shannon8a4cd702020-01-27 09:57:45 +00004323 }
Miss Islington (bot)410b7302020-06-01 09:07:32 -07004324 if (have_dict) {
4325 ADDOP_I(c, DICT_MERGE, 1);
4326 }
Mark Shannon8a4cd702020-01-27 09:57:45 +00004327 have_dict = 1;
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004328 nseen = 0;
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03004329 }
Mark Shannon8a4cd702020-01-27 09:57:45 +00004330 if (!have_dict) {
4331 ADDOP_I(c, BUILD_MAP, 0);
4332 have_dict = 1;
4333 }
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004334 VISIT(c, expr, kw->value);
Mark Shannon8a4cd702020-01-27 09:57:45 +00004335 ADDOP_I(c, DICT_MERGE, 1);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004336 }
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004337 else {
4338 nseen++;
4339 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004340 }
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004341 if (nseen) {
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03004342 /* Pack up any trailing keyword arguments. */
Mark Shannon8a4cd702020-01-27 09:57:45 +00004343 if (!compiler_subkwargs(c, keywords, nkwelts - nseen, nkwelts)) {
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03004344 return 0;
Mark Shannon8a4cd702020-01-27 09:57:45 +00004345 }
4346 if (have_dict) {
4347 ADDOP_I(c, DICT_MERGE, 1);
4348 }
4349 have_dict = 1;
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03004350 }
Mark Shannon8a4cd702020-01-27 09:57:45 +00004351 assert(have_dict);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004352 }
Mark Shannon13bc1392020-01-23 09:25:17 +00004353 ADDOP_I(c, CALL_FUNCTION_EX, nkwelts > 0);
4354 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004355}
4356
Nick Coghlan650f0d02007-04-15 12:05:43 +00004357
4358/* List and set comprehensions and generator expressions work by creating a
4359 nested function to perform the actual iteration. This means that the
4360 iteration variables don't leak into the current scope.
4361 The defined function is called immediately following its definition, with the
4362 result of that call being the result of the expression.
4363 The LC/SC version returns the populated container, while the GE version is
4364 flagged in symtable.c as a generator, so it returns the generator object
4365 when the function is called.
Nick Coghlan650f0d02007-04-15 12:05:43 +00004366
4367 Possible cleanups:
4368 - iterate over the generator sequence instead of using recursion
4369*/
4370
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004371
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004372static int
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004373compiler_comprehension_generator(struct compiler *c,
4374 asdl_seq *generators, int gen_index,
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004375 int depth,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004376 expr_ty elt, expr_ty val, int type)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004377{
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004378 comprehension_ty gen;
4379 gen = (comprehension_ty)asdl_seq_GET(generators, gen_index);
4380 if (gen->is_async) {
4381 return compiler_async_comprehension_generator(
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004382 c, generators, gen_index, depth, elt, val, type);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004383 } else {
4384 return compiler_sync_comprehension_generator(
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004385 c, generators, gen_index, depth, elt, val, type);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004386 }
4387}
4388
4389static int
4390compiler_sync_comprehension_generator(struct compiler *c,
4391 asdl_seq *generators, int gen_index,
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004392 int depth,
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004393 expr_ty elt, expr_ty val, int type)
4394{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004395 /* generate code for the iterator, then each of the ifs,
4396 and then write to the element */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004397
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004398 comprehension_ty gen;
4399 basicblock *start, *anchor, *skip, *if_cleanup;
Victor Stinnerad9a0662013-11-19 22:23:20 +01004400 Py_ssize_t i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004401
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004402 start = compiler_new_block(c);
4403 skip = compiler_new_block(c);
4404 if_cleanup = compiler_new_block(c);
4405 anchor = compiler_new_block(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004406
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004407 if (start == NULL || skip == NULL || if_cleanup == NULL ||
4408 anchor == NULL)
4409 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004410
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004411 gen = (comprehension_ty)asdl_seq_GET(generators, gen_index);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004412
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004413 if (gen_index == 0) {
4414 /* Receive outermost iter as an implicit argument */
4415 c->u->u_argcount = 1;
4416 ADDOP_I(c, LOAD_FAST, 0);
4417 }
4418 else {
4419 /* Sub-iter - calculate on the fly */
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004420 /* Fast path for the temporary variable assignment idiom:
4421 for y in [f(x)]
4422 */
4423 asdl_seq *elts;
4424 switch (gen->iter->kind) {
4425 case List_kind:
4426 elts = gen->iter->v.List.elts;
4427 break;
4428 case Tuple_kind:
4429 elts = gen->iter->v.Tuple.elts;
4430 break;
4431 default:
4432 elts = NULL;
4433 }
4434 if (asdl_seq_LEN(elts) == 1) {
4435 expr_ty elt = asdl_seq_GET(elts, 0);
4436 if (elt->kind != Starred_kind) {
4437 VISIT(c, expr, elt);
4438 start = NULL;
4439 }
4440 }
4441 if (start) {
4442 VISIT(c, expr, gen->iter);
4443 ADDOP(c, GET_ITER);
4444 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004445 }
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004446 if (start) {
4447 depth++;
4448 compiler_use_next_block(c, start);
4449 ADDOP_JREL(c, FOR_ITER, anchor);
4450 NEXT_BLOCK(c);
4451 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004452 VISIT(c, expr, gen->target);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004453
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004454 /* XXX this needs to be cleaned up...a lot! */
4455 n = asdl_seq_LEN(gen->ifs);
4456 for (i = 0; i < n; i++) {
4457 expr_ty e = (expr_ty)asdl_seq_GET(gen->ifs, i);
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03004458 if (!compiler_jump_if(c, e, if_cleanup, 0))
4459 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004460 NEXT_BLOCK(c);
4461 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004462
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004463 if (++gen_index < asdl_seq_LEN(generators))
4464 if (!compiler_comprehension_generator(c,
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004465 generators, gen_index, depth,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004466 elt, val, type))
4467 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004468
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004469 /* only append after the last for generator */
4470 if (gen_index >= asdl_seq_LEN(generators)) {
4471 /* comprehension specific code */
4472 switch (type) {
4473 case COMP_GENEXP:
4474 VISIT(c, expr, elt);
4475 ADDOP(c, YIELD_VALUE);
4476 ADDOP(c, POP_TOP);
4477 break;
4478 case COMP_LISTCOMP:
4479 VISIT(c, expr, elt);
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004480 ADDOP_I(c, LIST_APPEND, depth + 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004481 break;
4482 case COMP_SETCOMP:
4483 VISIT(c, expr, elt);
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004484 ADDOP_I(c, SET_ADD, depth + 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004485 break;
4486 case COMP_DICTCOMP:
Jörn Heisslerc8a35412019-06-22 16:40:55 +02004487 /* With '{k: v}', k is evaluated before v, so we do
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004488 the same. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004489 VISIT(c, expr, elt);
Jörn Heisslerc8a35412019-06-22 16:40:55 +02004490 VISIT(c, expr, val);
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004491 ADDOP_I(c, MAP_ADD, depth + 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004492 break;
4493 default:
4494 return 0;
4495 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004496
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004497 compiler_use_next_block(c, skip);
4498 }
4499 compiler_use_next_block(c, if_cleanup);
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004500 if (start) {
4501 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
4502 compiler_use_next_block(c, anchor);
4503 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004504
4505 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004506}
4507
4508static int
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004509compiler_async_comprehension_generator(struct compiler *c,
4510 asdl_seq *generators, int gen_index,
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004511 int depth,
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004512 expr_ty elt, expr_ty val, int type)
4513{
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004514 comprehension_ty gen;
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02004515 basicblock *start, *if_cleanup, *except;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004516 Py_ssize_t i, n;
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02004517 start = compiler_new_block(c);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004518 except = compiler_new_block(c);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004519 if_cleanup = compiler_new_block(c);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004520
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02004521 if (start == NULL || if_cleanup == NULL || except == NULL) {
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004522 return 0;
4523 }
4524
4525 gen = (comprehension_ty)asdl_seq_GET(generators, gen_index);
4526
4527 if (gen_index == 0) {
4528 /* Receive outermost iter as an implicit argument */
4529 c->u->u_argcount = 1;
4530 ADDOP_I(c, LOAD_FAST, 0);
4531 }
4532 else {
4533 /* Sub-iter - calculate on the fly */
4534 VISIT(c, expr, gen->iter);
4535 ADDOP(c, GET_AITER);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004536 }
4537
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02004538 compiler_use_next_block(c, start);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004539
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004540 ADDOP_JREL(c, SETUP_FINALLY, except);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004541 ADDOP(c, GET_ANEXT);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03004542 ADDOP_LOAD_CONST(c, Py_None);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004543 ADDOP(c, YIELD_FROM);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004544 ADDOP(c, POP_BLOCK);
Serhiy Storchaka24d32012018-03-10 18:22:34 +02004545 VISIT(c, expr, gen->target);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004546
4547 n = asdl_seq_LEN(gen->ifs);
4548 for (i = 0; i < n; i++) {
4549 expr_ty e = (expr_ty)asdl_seq_GET(gen->ifs, i);
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03004550 if (!compiler_jump_if(c, e, if_cleanup, 0))
4551 return 0;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004552 NEXT_BLOCK(c);
4553 }
4554
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004555 depth++;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004556 if (++gen_index < asdl_seq_LEN(generators))
4557 if (!compiler_comprehension_generator(c,
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004558 generators, gen_index, depth,
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004559 elt, val, type))
4560 return 0;
4561
4562 /* only append after the last for generator */
4563 if (gen_index >= asdl_seq_LEN(generators)) {
4564 /* comprehension specific code */
4565 switch (type) {
4566 case COMP_GENEXP:
4567 VISIT(c, expr, elt);
4568 ADDOP(c, YIELD_VALUE);
4569 ADDOP(c, POP_TOP);
4570 break;
4571 case COMP_LISTCOMP:
4572 VISIT(c, expr, elt);
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004573 ADDOP_I(c, LIST_APPEND, depth + 1);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004574 break;
4575 case COMP_SETCOMP:
4576 VISIT(c, expr, elt);
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004577 ADDOP_I(c, SET_ADD, depth + 1);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004578 break;
4579 case COMP_DICTCOMP:
Jörn Heisslerc8a35412019-06-22 16:40:55 +02004580 /* With '{k: v}', k is evaluated before v, so we do
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004581 the same. */
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004582 VISIT(c, expr, elt);
Jörn Heisslerc8a35412019-06-22 16:40:55 +02004583 VISIT(c, expr, val);
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004584 ADDOP_I(c, MAP_ADD, depth + 1);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004585 break;
4586 default:
4587 return 0;
4588 }
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004589 }
4590 compiler_use_next_block(c, if_cleanup);
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02004591 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
4592
4593 compiler_use_next_block(c, except);
4594 ADDOP(c, END_ASYNC_FOR);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004595
4596 return 1;
4597}
4598
4599static int
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004600compiler_comprehension(struct compiler *c, expr_ty e, int type,
4601 identifier name, asdl_seq *generators, expr_ty elt,
4602 expr_ty val)
Nick Coghlan650f0d02007-04-15 12:05:43 +00004603{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004604 PyCodeObject *co = NULL;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004605 comprehension_ty outermost;
Antoine Pitrou86a36b52011-11-25 18:56:07 +01004606 PyObject *qualname = NULL;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004607 int is_async_generator = 0;
Pablo Galindo6488a4a2020-07-06 23:30:20 +01004608 int top_level_await = IS_TOP_LEVEL_AWAIT(c);
Nick Coghlan650f0d02007-04-15 12:05:43 +00004609
Pablo Galindo6488a4a2020-07-06 23:30:20 +01004610
Batuhan TaÅŸkaya9052f7a2020-03-19 14:35:44 +03004611 int is_async_function = c->u->u_ste->ste_coroutine;
Nick Coghlan650f0d02007-04-15 12:05:43 +00004612
Batuhan TaÅŸkaya9052f7a2020-03-19 14:35:44 +03004613 outermost = (comprehension_ty) asdl_seq_GET(generators, 0);
Antoine Pitrou86a36b52011-11-25 18:56:07 +01004614 if (!compiler_enter_scope(c, name, COMPILER_SCOPE_COMPREHENSION,
4615 (void *)e, e->lineno))
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004616 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004617 goto error;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004618 }
4619
4620 is_async_generator = c->u->u_ste->ste_coroutine;
4621
Pablo Galindo6488a4a2020-07-06 23:30:20 +01004622 if (is_async_generator && !is_async_function && type != COMP_GENEXP && !top_level_await) {
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004623 compiler_error(c, "asynchronous comprehension outside of "
4624 "an asynchronous function");
4625 goto error_in_scope;
4626 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00004627
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004628 if (type != COMP_GENEXP) {
4629 int op;
4630 switch (type) {
4631 case COMP_LISTCOMP:
4632 op = BUILD_LIST;
4633 break;
4634 case COMP_SETCOMP:
4635 op = BUILD_SET;
4636 break;
4637 case COMP_DICTCOMP:
4638 op = BUILD_MAP;
4639 break;
4640 default:
4641 PyErr_Format(PyExc_SystemError,
4642 "unknown comprehension type %d", type);
4643 goto error_in_scope;
4644 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00004645
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004646 ADDOP_I(c, op, 0);
4647 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00004648
Serhiy Storchaka8c579b12020-02-12 12:18:59 +02004649 if (!compiler_comprehension_generator(c, generators, 0, 0, elt,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004650 val, type))
4651 goto error_in_scope;
Nick Coghlan650f0d02007-04-15 12:05:43 +00004652
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004653 if (type != COMP_GENEXP) {
4654 ADDOP(c, RETURN_VALUE);
4655 }
4656
4657 co = assemble(c, 1);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04004658 qualname = c->u->u_qualname;
4659 Py_INCREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004660 compiler_exit_scope(c);
Pablo Galindo6488a4a2020-07-06 23:30:20 +01004661 if (top_level_await && is_async_generator){
4662 c->u->u_ste->ste_coroutine = 1;
4663 }
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04004664 if (co == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004665 goto error;
4666
Antoine Pitrou86a36b52011-11-25 18:56:07 +01004667 if (!compiler_make_closure(c, co, 0, qualname))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004668 goto error;
Antoine Pitrou86a36b52011-11-25 18:56:07 +01004669 Py_DECREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004670 Py_DECREF(co);
4671
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004672 VISIT(c, expr, outermost->iter);
4673
4674 if (outermost->is_async) {
4675 ADDOP(c, GET_AITER);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004676 } else {
4677 ADDOP(c, GET_ITER);
4678 }
4679
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004680 ADDOP_I(c, CALL_FUNCTION, 1);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004681
4682 if (is_async_generator && type != COMP_GENEXP) {
4683 ADDOP(c, GET_AWAITABLE);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03004684 ADDOP_LOAD_CONST(c, Py_None);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004685 ADDOP(c, YIELD_FROM);
4686 }
4687
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004688 return 1;
Nick Coghlan650f0d02007-04-15 12:05:43 +00004689error_in_scope:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004690 compiler_exit_scope(c);
Nick Coghlan650f0d02007-04-15 12:05:43 +00004691error:
Antoine Pitrou86a36b52011-11-25 18:56:07 +01004692 Py_XDECREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004693 Py_XDECREF(co);
4694 return 0;
Nick Coghlan650f0d02007-04-15 12:05:43 +00004695}
4696
4697static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004698compiler_genexp(struct compiler *c, expr_ty e)
4699{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004700 static identifier name;
4701 if (!name) {
Zackery Spytzf3036392018-04-15 16:12:29 -06004702 name = PyUnicode_InternFromString("<genexpr>");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004703 if (!name)
4704 return 0;
4705 }
4706 assert(e->kind == GeneratorExp_kind);
4707 return compiler_comprehension(c, e, COMP_GENEXP, name,
4708 e->v.GeneratorExp.generators,
4709 e->v.GeneratorExp.elt, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004710}
4711
4712static int
Nick Coghlan650f0d02007-04-15 12:05:43 +00004713compiler_listcomp(struct compiler *c, expr_ty e)
4714{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004715 static identifier name;
4716 if (!name) {
Zackery Spytzf3036392018-04-15 16:12:29 -06004717 name = PyUnicode_InternFromString("<listcomp>");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004718 if (!name)
4719 return 0;
4720 }
4721 assert(e->kind == ListComp_kind);
4722 return compiler_comprehension(c, e, COMP_LISTCOMP, name,
4723 e->v.ListComp.generators,
4724 e->v.ListComp.elt, NULL);
Nick Coghlan650f0d02007-04-15 12:05:43 +00004725}
4726
4727static int
4728compiler_setcomp(struct compiler *c, expr_ty e)
4729{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004730 static identifier name;
4731 if (!name) {
Zackery Spytzf3036392018-04-15 16:12:29 -06004732 name = PyUnicode_InternFromString("<setcomp>");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004733 if (!name)
4734 return 0;
4735 }
4736 assert(e->kind == SetComp_kind);
4737 return compiler_comprehension(c, e, COMP_SETCOMP, name,
4738 e->v.SetComp.generators,
4739 e->v.SetComp.elt, NULL);
Guido van Rossum992d4a32007-07-11 13:09:30 +00004740}
4741
4742
4743static int
4744compiler_dictcomp(struct compiler *c, expr_ty e)
4745{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004746 static identifier name;
4747 if (!name) {
Zackery Spytzf3036392018-04-15 16:12:29 -06004748 name = PyUnicode_InternFromString("<dictcomp>");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004749 if (!name)
4750 return 0;
4751 }
4752 assert(e->kind == DictComp_kind);
4753 return compiler_comprehension(c, e, COMP_DICTCOMP, name,
4754 e->v.DictComp.generators,
4755 e->v.DictComp.key, e->v.DictComp.value);
Nick Coghlan650f0d02007-04-15 12:05:43 +00004756}
4757
4758
4759static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004760compiler_visit_keyword(struct compiler *c, keyword_ty k)
4761{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004762 VISIT(c, expr, k->value);
4763 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004764}
4765
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004766/* Test whether expression is constant. For constants, report
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004767 whether they are true or false.
4768
4769 Return values: 1 for true, 0 for false, -1 for non-constant.
4770 */
4771
4772static int
Serhiy Storchaka3dfbaf52017-12-25 12:47:50 +02004773expr_constant(expr_ty e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004774{
Serhiy Storchaka3f228112018-09-27 17:42:37 +03004775 if (e->kind == Constant_kind) {
4776 return PyObject_IsTrue(e->v.Constant.value);
Benjamin Peterson442f2092012-12-06 17:41:04 -05004777 }
Serhiy Storchaka3325a672017-12-15 12:35:48 +02004778 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004779}
4780
Mark Shannonfee55262019-11-21 09:11:43 +00004781static int
4782compiler_with_except_finish(struct compiler *c) {
4783 basicblock *exit;
4784 exit = compiler_new_block(c);
4785 if (exit == NULL)
4786 return 0;
4787 ADDOP_JABS(c, POP_JUMP_IF_TRUE, exit);
4788 ADDOP(c, RERAISE);
4789 compiler_use_next_block(c, exit);
4790 ADDOP(c, POP_TOP);
4791 ADDOP(c, POP_TOP);
4792 ADDOP(c, POP_TOP);
4793 ADDOP(c, POP_EXCEPT);
4794 ADDOP(c, POP_TOP);
4795 return 1;
4796}
Yury Selivanov75445082015-05-11 22:57:16 -04004797
4798/*
4799 Implements the async with statement.
4800
4801 The semantics outlined in that PEP are as follows:
4802
4803 async with EXPR as VAR:
4804 BLOCK
4805
4806 It is implemented roughly as:
4807
4808 context = EXPR
4809 exit = context.__aexit__ # not calling it
4810 value = await context.__aenter__()
4811 try:
4812 VAR = value # if VAR present in the syntax
4813 BLOCK
4814 finally:
4815 if an exception was raised:
Serhiy Storchakaec466a12015-06-11 00:09:32 +03004816 exc = copy of (exception, instance, traceback)
Yury Selivanov75445082015-05-11 22:57:16 -04004817 else:
Serhiy Storchakaec466a12015-06-11 00:09:32 +03004818 exc = (None, None, None)
Yury Selivanov75445082015-05-11 22:57:16 -04004819 if not (await exit(*exc)):
4820 raise
4821 */
4822static int
4823compiler_async_with(struct compiler *c, stmt_ty s, int pos)
4824{
Mark Shannonfee55262019-11-21 09:11:43 +00004825 basicblock *block, *final, *exit;
Yury Selivanov75445082015-05-11 22:57:16 -04004826 withitem_ty item = asdl_seq_GET(s->v.AsyncWith.items, pos);
4827
4828 assert(s->kind == AsyncWith_kind);
Pablo Galindo90235812020-03-15 04:29:22 +00004829 if (IS_TOP_LEVEL_AWAIT(c)){
Matthias Bussonnier565b4f12019-05-21 13:12:03 -07004830 c->u->u_ste->ste_coroutine = 1;
4831 } else if (c->u->u_scope_type != COMPILER_SCOPE_ASYNC_FUNCTION){
Zsolt Dollensteine2396502018-04-27 08:58:56 -07004832 return compiler_error(c, "'async with' outside async function");
4833 }
Yury Selivanov75445082015-05-11 22:57:16 -04004834
4835 block = compiler_new_block(c);
Mark Shannonfee55262019-11-21 09:11:43 +00004836 final = compiler_new_block(c);
4837 exit = compiler_new_block(c);
4838 if (!block || !final || !exit)
Yury Selivanov75445082015-05-11 22:57:16 -04004839 return 0;
4840
4841 /* Evaluate EXPR */
4842 VISIT(c, expr, item->context_expr);
4843
4844 ADDOP(c, BEFORE_ASYNC_WITH);
4845 ADDOP(c, GET_AWAITABLE);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03004846 ADDOP_LOAD_CONST(c, Py_None);
Yury Selivanov75445082015-05-11 22:57:16 -04004847 ADDOP(c, YIELD_FROM);
4848
Mark Shannonfee55262019-11-21 09:11:43 +00004849 ADDOP_JREL(c, SETUP_ASYNC_WITH, final);
Yury Selivanov75445082015-05-11 22:57:16 -04004850
4851 /* SETUP_ASYNC_WITH pushes a finally block. */
4852 compiler_use_next_block(c, block);
Mark Shannonfee55262019-11-21 09:11:43 +00004853 if (!compiler_push_fblock(c, ASYNC_WITH, block, final, NULL)) {
Yury Selivanov75445082015-05-11 22:57:16 -04004854 return 0;
4855 }
4856
4857 if (item->optional_vars) {
4858 VISIT(c, expr, item->optional_vars);
4859 }
4860 else {
4861 /* Discard result from context.__aenter__() */
4862 ADDOP(c, POP_TOP);
4863 }
4864
4865 pos++;
4866 if (pos == asdl_seq_LEN(s->v.AsyncWith.items))
4867 /* BLOCK code */
4868 VISIT_SEQ(c, stmt, s->v.AsyncWith.body)
4869 else if (!compiler_async_with(c, s, pos))
4870 return 0;
4871
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004872 compiler_pop_fblock(c, ASYNC_WITH, block);
Mark Shannonfee55262019-11-21 09:11:43 +00004873 ADDOP(c, POP_BLOCK);
4874 /* End of body; start the cleanup */
Yury Selivanov75445082015-05-11 22:57:16 -04004875
Mark Shannonfee55262019-11-21 09:11:43 +00004876 /* For successful outcome:
4877 * call __exit__(None, None, None)
4878 */
4879 if(!compiler_call_exit_with_nones(c))
Yury Selivanov75445082015-05-11 22:57:16 -04004880 return 0;
Mark Shannonfee55262019-11-21 09:11:43 +00004881 ADDOP(c, GET_AWAITABLE);
4882 ADDOP_O(c, LOAD_CONST, Py_None, consts);
4883 ADDOP(c, YIELD_FROM);
Yury Selivanov75445082015-05-11 22:57:16 -04004884
Mark Shannonfee55262019-11-21 09:11:43 +00004885 ADDOP(c, POP_TOP);
Yury Selivanov75445082015-05-11 22:57:16 -04004886
Mark Shannonfee55262019-11-21 09:11:43 +00004887 ADDOP_JABS(c, JUMP_ABSOLUTE, exit);
4888
4889 /* For exceptional outcome: */
4890 compiler_use_next_block(c, final);
4891
4892 ADDOP(c, WITH_EXCEPT_START);
Yury Selivanov75445082015-05-11 22:57:16 -04004893 ADDOP(c, GET_AWAITABLE);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03004894 ADDOP_LOAD_CONST(c, Py_None);
Yury Selivanov75445082015-05-11 22:57:16 -04004895 ADDOP(c, YIELD_FROM);
Mark Shannonfee55262019-11-21 09:11:43 +00004896 compiler_with_except_finish(c);
Yury Selivanov75445082015-05-11 22:57:16 -04004897
Mark Shannonfee55262019-11-21 09:11:43 +00004898compiler_use_next_block(c, exit);
Yury Selivanov75445082015-05-11 22:57:16 -04004899 return 1;
4900}
4901
4902
Guido van Rossumc2e20742006-02-27 22:32:47 +00004903/*
4904 Implements the with statement from PEP 343.
Guido van Rossumc2e20742006-02-27 22:32:47 +00004905 with EXPR as VAR:
4906 BLOCK
Mark Shannonfee55262019-11-21 09:11:43 +00004907 is implemented as:
4908 <code for EXPR>
4909 SETUP_WITH E
4910 <code to store to VAR> or POP_TOP
4911 <code for BLOCK>
4912 LOAD_CONST (None, None, None)
4913 CALL_FUNCTION_EX 0
4914 JUMP_FORWARD EXIT
4915 E: WITH_EXCEPT_START (calls EXPR.__exit__)
4916 POP_JUMP_IF_TRUE T:
4917 RERAISE
4918 T: POP_TOP * 3 (remove exception from stack)
4919 POP_EXCEPT
4920 POP_TOP
4921 EXIT:
Guido van Rossumc2e20742006-02-27 22:32:47 +00004922 */
Mark Shannonfee55262019-11-21 09:11:43 +00004923
Guido van Rossumc2e20742006-02-27 22:32:47 +00004924static int
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004925compiler_with(struct compiler *c, stmt_ty s, int pos)
Guido van Rossumc2e20742006-02-27 22:32:47 +00004926{
Mark Shannonfee55262019-11-21 09:11:43 +00004927 basicblock *block, *final, *exit;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004928 withitem_ty item = asdl_seq_GET(s->v.With.items, pos);
Guido van Rossumc2e20742006-02-27 22:32:47 +00004929
4930 assert(s->kind == With_kind);
4931
Guido van Rossumc2e20742006-02-27 22:32:47 +00004932 block = compiler_new_block(c);
Mark Shannonfee55262019-11-21 09:11:43 +00004933 final = compiler_new_block(c);
4934 exit = compiler_new_block(c);
4935 if (!block || !final || !exit)
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00004936 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00004937
Thomas Wouters477c8d52006-05-27 19:21:47 +00004938 /* Evaluate EXPR */
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004939 VISIT(c, expr, item->context_expr);
Mark Shannonfee55262019-11-21 09:11:43 +00004940 /* Will push bound __exit__ */
4941 ADDOP_JREL(c, SETUP_WITH, final);
Guido van Rossumc2e20742006-02-27 22:32:47 +00004942
Benjamin Peterson876b2f22009-06-28 03:18:59 +00004943 /* SETUP_WITH pushes a finally block. */
Guido van Rossumc2e20742006-02-27 22:32:47 +00004944 compiler_use_next_block(c, block);
Mark Shannonfee55262019-11-21 09:11:43 +00004945 if (!compiler_push_fblock(c, WITH, block, final, NULL)) {
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00004946 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00004947 }
4948
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004949 if (item->optional_vars) {
4950 VISIT(c, expr, item->optional_vars);
Benjamin Peterson876b2f22009-06-28 03:18:59 +00004951 }
4952 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004953 /* Discard result from context.__enter__() */
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00004954 ADDOP(c, POP_TOP);
Guido van Rossumc2e20742006-02-27 22:32:47 +00004955 }
4956
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004957 pos++;
4958 if (pos == asdl_seq_LEN(s->v.With.items))
4959 /* BLOCK code */
4960 VISIT_SEQ(c, stmt, s->v.With.body)
4961 else if (!compiler_with(c, s, pos))
4962 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00004963
Guido van Rossumc2e20742006-02-27 22:32:47 +00004964 ADDOP(c, POP_BLOCK);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004965 compiler_pop_fblock(c, WITH, block);
Mark Shannon13bc1392020-01-23 09:25:17 +00004966
Mark Shannonfee55262019-11-21 09:11:43 +00004967 /* End of body; start the cleanup. */
Mark Shannon13bc1392020-01-23 09:25:17 +00004968
Mark Shannonfee55262019-11-21 09:11:43 +00004969 /* For successful outcome:
4970 * call __exit__(None, None, None)
4971 */
4972 if (!compiler_call_exit_with_nones(c))
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00004973 return 0;
Mark Shannonfee55262019-11-21 09:11:43 +00004974 ADDOP(c, POP_TOP);
4975 ADDOP_JREL(c, JUMP_FORWARD, exit);
Guido van Rossumc2e20742006-02-27 22:32:47 +00004976
Mark Shannonfee55262019-11-21 09:11:43 +00004977 /* For exceptional outcome: */
4978 compiler_use_next_block(c, final);
Guido van Rossumc2e20742006-02-27 22:32:47 +00004979
Mark Shannonfee55262019-11-21 09:11:43 +00004980 ADDOP(c, WITH_EXCEPT_START);
4981 compiler_with_except_finish(c);
4982
4983 compiler_use_next_block(c, exit);
Guido van Rossumc2e20742006-02-27 22:32:47 +00004984 return 1;
4985}
4986
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004987static int
Serhiy Storchakada8d72c2018-09-17 15:17:29 +03004988compiler_visit_expr1(struct compiler *c, expr_ty e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004989{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004990 switch (e->kind) {
Emily Morehouse8f59ee02019-01-24 16:49:56 -07004991 case NamedExpr_kind:
4992 VISIT(c, expr, e->v.NamedExpr.value);
4993 ADDOP(c, DUP_TOP);
4994 VISIT(c, expr, e->v.NamedExpr.target);
4995 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004996 case BoolOp_kind:
4997 return compiler_boolop(c, e);
4998 case BinOp_kind:
4999 VISIT(c, expr, e->v.BinOp.left);
5000 VISIT(c, expr, e->v.BinOp.right);
Andy Lester76d58772020-03-10 21:18:12 -05005001 ADDOP(c, binop(e->v.BinOp.op));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005002 break;
5003 case UnaryOp_kind:
5004 VISIT(c, expr, e->v.UnaryOp.operand);
5005 ADDOP(c, unaryop(e->v.UnaryOp.op));
5006 break;
5007 case Lambda_kind:
5008 return compiler_lambda(c, e);
5009 case IfExp_kind:
5010 return compiler_ifexp(c, e);
5011 case Dict_kind:
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04005012 return compiler_dict(c, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005013 case Set_kind:
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04005014 return compiler_set(c, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005015 case GeneratorExp_kind:
5016 return compiler_genexp(c, e);
5017 case ListComp_kind:
5018 return compiler_listcomp(c, e);
5019 case SetComp_kind:
5020 return compiler_setcomp(c, e);
5021 case DictComp_kind:
5022 return compiler_dictcomp(c, e);
5023 case Yield_kind:
5024 if (c->u->u_ste->ste_type != FunctionBlock)
5025 return compiler_error(c, "'yield' outside function");
Mark Dickinsonded35ae2012-11-25 14:36:26 +00005026 if (e->v.Yield.value) {
5027 VISIT(c, expr, e->v.Yield.value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005028 }
5029 else {
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005030 ADDOP_LOAD_CONST(c, Py_None);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005031 }
Mark Dickinsonded35ae2012-11-25 14:36:26 +00005032 ADDOP(c, YIELD_VALUE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005033 break;
Mark Dickinsonded35ae2012-11-25 14:36:26 +00005034 case YieldFrom_kind:
5035 if (c->u->u_ste->ste_type != FunctionBlock)
5036 return compiler_error(c, "'yield' outside function");
Yury Selivanov75445082015-05-11 22:57:16 -04005037
5038 if (c->u->u_scope_type == COMPILER_SCOPE_ASYNC_FUNCTION)
5039 return compiler_error(c, "'yield from' inside async function");
5040
Mark Dickinsonded35ae2012-11-25 14:36:26 +00005041 VISIT(c, expr, e->v.YieldFrom.value);
Yury Selivanov5376ba92015-06-22 12:19:30 -04005042 ADDOP(c, GET_YIELD_FROM_ITER);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005043 ADDOP_LOAD_CONST(c, Py_None);
Mark Dickinsonded35ae2012-11-25 14:36:26 +00005044 ADDOP(c, YIELD_FROM);
5045 break;
Yury Selivanov75445082015-05-11 22:57:16 -04005046 case Await_kind:
Pablo Galindo90235812020-03-15 04:29:22 +00005047 if (!IS_TOP_LEVEL_AWAIT(c)){
Matthias Bussonnier565b4f12019-05-21 13:12:03 -07005048 if (c->u->u_ste->ste_type != FunctionBlock){
5049 return compiler_error(c, "'await' outside function");
5050 }
Yury Selivanov75445082015-05-11 22:57:16 -04005051
Victor Stinner331a6a52019-05-27 16:39:22 +02005052 if (c->u->u_scope_type != COMPILER_SCOPE_ASYNC_FUNCTION &&
Matthias Bussonnier565b4f12019-05-21 13:12:03 -07005053 c->u->u_scope_type != COMPILER_SCOPE_COMPREHENSION){
5054 return compiler_error(c, "'await' outside async function");
5055 }
5056 }
Yury Selivanov75445082015-05-11 22:57:16 -04005057
5058 VISIT(c, expr, e->v.Await.value);
5059 ADDOP(c, GET_AWAITABLE);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005060 ADDOP_LOAD_CONST(c, Py_None);
Yury Selivanov75445082015-05-11 22:57:16 -04005061 ADDOP(c, YIELD_FROM);
5062 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005063 case Compare_kind:
5064 return compiler_compare(c, e);
5065 case Call_kind:
5066 return compiler_call(c, e);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01005067 case Constant_kind:
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005068 ADDOP_LOAD_CONST(c, e->v.Constant.value);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01005069 break;
Eric V. Smith235a6f02015-09-19 14:51:32 -04005070 case JoinedStr_kind:
5071 return compiler_joined_str(c, e);
5072 case FormattedValue_kind:
5073 return compiler_formatted_value(c, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005074 /* The following exprs can be assignment targets. */
5075 case Attribute_kind:
Serhiy Storchaka6b975982020-03-17 23:41:08 +02005076 VISIT(c, expr, e->v.Attribute.value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005077 switch (e->v.Attribute.ctx) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005078 case Load:
5079 ADDOP_NAME(c, LOAD_ATTR, e->v.Attribute.attr, names);
5080 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005081 case Store:
Pablo Galindoc5fc1562020-04-22 23:29:27 +01005082 if (forbidden_name(c, e->v.Attribute.attr, e->v.Attribute.ctx))
5083 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005084 ADDOP_NAME(c, STORE_ATTR, e->v.Attribute.attr, names);
5085 break;
5086 case Del:
5087 ADDOP_NAME(c, DELETE_ATTR, e->v.Attribute.attr, names);
5088 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005089 }
5090 break;
5091 case Subscript_kind:
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005092 return compiler_subscript(c, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005093 case Starred_kind:
5094 switch (e->v.Starred.ctx) {
5095 case Store:
5096 /* In all legitimate cases, the Starred node was already replaced
5097 * by compiler_list/compiler_tuple. XXX: is that okay? */
5098 return compiler_error(c,
5099 "starred assignment target must be in a list or tuple");
5100 default:
5101 return compiler_error(c,
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04005102 "can't use starred expression here");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005103 }
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005104 break;
5105 case Slice_kind:
5106 return compiler_slice(c, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005107 case Name_kind:
5108 return compiler_nameop(c, e->v.Name.id, e->v.Name.ctx);
5109 /* child nodes of List and Tuple will have expr_context set */
5110 case List_kind:
5111 return compiler_list(c, e);
5112 case Tuple_kind:
5113 return compiler_tuple(c, e);
5114 }
5115 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005116}
5117
5118static int
Serhiy Storchakada8d72c2018-09-17 15:17:29 +03005119compiler_visit_expr(struct compiler *c, expr_ty e)
5120{
Serhiy Storchakada8d72c2018-09-17 15:17:29 +03005121 int old_lineno = c->u->u_lineno;
5122 int old_col_offset = c->u->u_col_offset;
Serhiy Storchaka61cb3d02020-03-17 18:07:30 +02005123 SET_LOC(c, e);
Serhiy Storchakada8d72c2018-09-17 15:17:29 +03005124 int res = compiler_visit_expr1(c, e);
Serhiy Storchaka61cb3d02020-03-17 18:07:30 +02005125 c->u->u_lineno = old_lineno;
Serhiy Storchakada8d72c2018-09-17 15:17:29 +03005126 c->u->u_col_offset = old_col_offset;
5127 return res;
5128}
5129
5130static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005131compiler_augassign(struct compiler *c, stmt_ty s)
5132{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005133 assert(s->kind == AugAssign_kind);
Serhiy Storchaka6b975982020-03-17 23:41:08 +02005134 expr_ty e = s->v.AugAssign.target;
5135
5136 int old_lineno = c->u->u_lineno;
5137 int old_col_offset = c->u->u_col_offset;
5138 SET_LOC(c, e);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005139
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005140 switch (e->kind) {
5141 case Attribute_kind:
Serhiy Storchaka6b975982020-03-17 23:41:08 +02005142 VISIT(c, expr, e->v.Attribute.value);
5143 ADDOP(c, DUP_TOP);
5144 ADDOP_NAME(c, LOAD_ATTR, e->v.Attribute.attr, names);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005145 break;
5146 case Subscript_kind:
Serhiy Storchaka6b975982020-03-17 23:41:08 +02005147 VISIT(c, expr, e->v.Subscript.value);
5148 VISIT(c, expr, e->v.Subscript.slice);
5149 ADDOP(c, DUP_TOP_TWO);
5150 ADDOP(c, BINARY_SUBSCR);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005151 break;
5152 case Name_kind:
5153 if (!compiler_nameop(c, e->v.Name.id, Load))
5154 return 0;
Serhiy Storchaka6b975982020-03-17 23:41:08 +02005155 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005156 default:
5157 PyErr_Format(PyExc_SystemError,
5158 "invalid node type (%d) for augmented assignment",
5159 e->kind);
5160 return 0;
5161 }
Serhiy Storchaka6b975982020-03-17 23:41:08 +02005162
5163 c->u->u_lineno = old_lineno;
5164 c->u->u_col_offset = old_col_offset;
5165
5166 VISIT(c, expr, s->v.AugAssign.value);
5167 ADDOP(c, inplace_binop(s->v.AugAssign.op));
5168
5169 SET_LOC(c, e);
5170
5171 switch (e->kind) {
5172 case Attribute_kind:
5173 ADDOP(c, ROT_TWO);
5174 ADDOP_NAME(c, STORE_ATTR, e->v.Attribute.attr, names);
5175 break;
5176 case Subscript_kind:
5177 ADDOP(c, ROT_THREE);
5178 ADDOP(c, STORE_SUBSCR);
5179 break;
5180 case Name_kind:
5181 return compiler_nameop(c, e->v.Name.id, Store);
5182 default:
5183 Py_UNREACHABLE();
5184 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005185 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005186}
5187
5188static int
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005189check_ann_expr(struct compiler *c, expr_ty e)
5190{
5191 VISIT(c, expr, e);
5192 ADDOP(c, POP_TOP);
5193 return 1;
5194}
5195
5196static int
5197check_annotation(struct compiler *c, stmt_ty s)
5198{
5199 /* Annotations are only evaluated in a module or class. */
5200 if (c->u->u_scope_type == COMPILER_SCOPE_MODULE ||
5201 c->u->u_scope_type == COMPILER_SCOPE_CLASS) {
5202 return check_ann_expr(c, s->v.AnnAssign.annotation);
5203 }
5204 return 1;
5205}
5206
5207static int
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005208check_ann_subscr(struct compiler *c, expr_ty e)
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005209{
5210 /* We check that everything in a subscript is defined at runtime. */
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005211 switch (e->kind) {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005212 case Slice_kind:
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005213 if (e->v.Slice.lower && !check_ann_expr(c, e->v.Slice.lower)) {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005214 return 0;
5215 }
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005216 if (e->v.Slice.upper && !check_ann_expr(c, e->v.Slice.upper)) {
5217 return 0;
5218 }
5219 if (e->v.Slice.step && !check_ann_expr(c, e->v.Slice.step)) {
5220 return 0;
5221 }
5222 return 1;
5223 case Tuple_kind: {
5224 /* extended slice */
5225 asdl_seq *elts = e->v.Tuple.elts;
5226 Py_ssize_t i, n = asdl_seq_LEN(elts);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005227 for (i = 0; i < n; i++) {
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005228 if (!check_ann_subscr(c, asdl_seq_GET(elts, i))) {
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005229 return 0;
5230 }
5231 }
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005232 return 1;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005233 }
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005234 default:
5235 return check_ann_expr(c, e);
5236 }
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005237}
5238
5239static int
5240compiler_annassign(struct compiler *c, stmt_ty s)
5241{
5242 expr_ty targ = s->v.AnnAssign.target;
Guido van Rossum015d8742016-09-11 09:45:24 -07005243 PyObject* mangled;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005244
5245 assert(s->kind == AnnAssign_kind);
5246
5247 /* We perform the actual assignment first. */
5248 if (s->v.AnnAssign.value) {
5249 VISIT(c, expr, s->v.AnnAssign.value);
5250 VISIT(c, expr, targ);
5251 }
5252 switch (targ->kind) {
5253 case Name_kind:
Pablo Galindoc5fc1562020-04-22 23:29:27 +01005254 if (forbidden_name(c, targ->v.Name.id, Store))
5255 return 0;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005256 /* If we have a simple name in a module or class, store annotation. */
5257 if (s->v.AnnAssign.simple &&
5258 (c->u->u_scope_type == COMPILER_SCOPE_MODULE ||
5259 c->u->u_scope_type == COMPILER_SCOPE_CLASS)) {
Guido van Rossum95e4d582018-01-26 08:20:18 -08005260 if (c->c_future->ff_features & CO_FUTURE_ANNOTATIONS) {
5261 VISIT(c, annexpr, s->v.AnnAssign.annotation)
5262 }
5263 else {
5264 VISIT(c, expr, s->v.AnnAssign.annotation);
5265 }
Mark Shannon332cd5e2018-01-30 00:41:04 +00005266 ADDOP_NAME(c, LOAD_NAME, __annotations__, names);
Serhiy Storchakaa95d9862018-03-24 22:42:35 +02005267 mangled = _Py_Mangle(c->u->u_private, targ->v.Name.id);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005268 ADDOP_LOAD_CONST_NEW(c, mangled);
Mark Shannon332cd5e2018-01-30 00:41:04 +00005269 ADDOP(c, STORE_SUBSCR);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005270 }
5271 break;
5272 case Attribute_kind:
Pablo Galindoc5fc1562020-04-22 23:29:27 +01005273 if (forbidden_name(c, targ->v.Attribute.attr, Store))
5274 return 0;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005275 if (!s->v.AnnAssign.value &&
5276 !check_ann_expr(c, targ->v.Attribute.value)) {
5277 return 0;
5278 }
5279 break;
5280 case Subscript_kind:
5281 if (!s->v.AnnAssign.value &&
5282 (!check_ann_expr(c, targ->v.Subscript.value) ||
5283 !check_ann_subscr(c, targ->v.Subscript.slice))) {
5284 return 0;
5285 }
5286 break;
5287 default:
5288 PyErr_Format(PyExc_SystemError,
5289 "invalid node type (%d) for annotated assignment",
5290 targ->kind);
5291 return 0;
5292 }
5293 /* Annotation is evaluated last. */
5294 if (!s->v.AnnAssign.simple && !check_annotation(c, s)) {
5295 return 0;
5296 }
5297 return 1;
5298}
5299
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005300/* Raises a SyntaxError and returns 0.
5301 If something goes wrong, a different exception may be raised.
5302*/
5303
5304static int
5305compiler_error(struct compiler *c, const char *errstr)
5306{
Benjamin Peterson43b06862011-05-27 09:08:01 -05005307 PyObject *loc;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005308 PyObject *u = NULL, *v = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005309
Victor Stinner14e461d2013-08-26 22:28:21 +02005310 loc = PyErr_ProgramTextObject(c->c_filename, c->u->u_lineno);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005311 if (!loc) {
5312 Py_INCREF(Py_None);
5313 loc = Py_None;
5314 }
Victor Stinner14e461d2013-08-26 22:28:21 +02005315 u = Py_BuildValue("(OiiO)", c->c_filename, c->u->u_lineno,
Ammar Askar025eb982018-09-24 17:12:49 -04005316 c->u->u_col_offset + 1, loc);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005317 if (!u)
5318 goto exit;
5319 v = Py_BuildValue("(zO)", errstr, u);
5320 if (!v)
5321 goto exit;
5322 PyErr_SetObject(PyExc_SyntaxError, v);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005323 exit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005324 Py_DECREF(loc);
5325 Py_XDECREF(u);
5326 Py_XDECREF(v);
5327 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005328}
5329
Serhiy Storchakad31e7732018-10-21 10:09:39 +03005330/* Emits a SyntaxWarning and returns 1 on success.
5331 If a SyntaxWarning raised as error, replaces it with a SyntaxError
5332 and returns 0.
5333*/
5334static int
Serhiy Storchaka62e44812019-02-16 08:12:19 +02005335compiler_warn(struct compiler *c, const char *format, ...)
Serhiy Storchakad31e7732018-10-21 10:09:39 +03005336{
Serhiy Storchaka62e44812019-02-16 08:12:19 +02005337 va_list vargs;
5338#ifdef HAVE_STDARG_PROTOTYPES
5339 va_start(vargs, format);
5340#else
5341 va_start(vargs);
5342#endif
5343 PyObject *msg = PyUnicode_FromFormatV(format, vargs);
5344 va_end(vargs);
Serhiy Storchakad31e7732018-10-21 10:09:39 +03005345 if (msg == NULL) {
5346 return 0;
5347 }
5348 if (PyErr_WarnExplicitObject(PyExc_SyntaxWarning, msg, c->c_filename,
5349 c->u->u_lineno, NULL, NULL) < 0)
5350 {
Serhiy Storchakad31e7732018-10-21 10:09:39 +03005351 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
Serhiy Storchaka62e44812019-02-16 08:12:19 +02005352 /* Replace the SyntaxWarning exception with a SyntaxError
5353 to get a more accurate error report */
Serhiy Storchakad31e7732018-10-21 10:09:39 +03005354 PyErr_Clear();
Serhiy Storchaka62e44812019-02-16 08:12:19 +02005355 assert(PyUnicode_AsUTF8(msg) != NULL);
5356 compiler_error(c, PyUnicode_AsUTF8(msg));
Serhiy Storchakad31e7732018-10-21 10:09:39 +03005357 }
Serhiy Storchaka62e44812019-02-16 08:12:19 +02005358 Py_DECREF(msg);
Serhiy Storchakad31e7732018-10-21 10:09:39 +03005359 return 0;
5360 }
5361 Py_DECREF(msg);
5362 return 1;
5363}
5364
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005365static int
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005366compiler_subscript(struct compiler *c, expr_ty e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005367{
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005368 expr_context_ty ctx = e->v.Subscript.ctx;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005369 int op = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005370
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005371 if (ctx == Load) {
5372 if (!check_subscripter(c, e->v.Subscript.value)) {
5373 return 0;
5374 }
5375 if (!check_index(c, e->v.Subscript.value, e->v.Subscript.slice)) {
5376 return 0;
5377 }
5378 }
5379
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005380 switch (ctx) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005381 case Load: op = BINARY_SUBSCR; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005382 case Store: op = STORE_SUBSCR; break;
5383 case Del: op = DELETE_SUBSCR; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005384 }
Serhiy Storchaka6b975982020-03-17 23:41:08 +02005385 assert(op);
5386 VISIT(c, expr, e->v.Subscript.value);
5387 VISIT(c, expr, e->v.Subscript.slice);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005388 ADDOP(c, op);
5389 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005390}
5391
5392static int
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02005393compiler_slice(struct compiler *c, expr_ty s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005394{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005395 int n = 2;
5396 assert(s->kind == Slice_kind);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005397
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005398 /* only handles the cases where BUILD_SLICE is emitted */
5399 if (s->v.Slice.lower) {
5400 VISIT(c, expr, s->v.Slice.lower);
5401 }
5402 else {
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005403 ADDOP_LOAD_CONST(c, Py_None);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005404 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005405
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005406 if (s->v.Slice.upper) {
5407 VISIT(c, expr, s->v.Slice.upper);
5408 }
5409 else {
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005410 ADDOP_LOAD_CONST(c, Py_None);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005411 }
5412
5413 if (s->v.Slice.step) {
5414 n++;
5415 VISIT(c, expr, s->v.Slice.step);
5416 }
5417 ADDOP_I(c, BUILD_SLICE, n);
5418 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005419}
5420
Thomas Wouters89f507f2006-12-13 04:49:30 +00005421/* End of the compiler section, beginning of the assembler section */
5422
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005423/* do depth-first search of basic block graph, starting with block.
T. Wouters99b54d62019-09-12 07:05:33 -07005424 post records the block indices in post-order.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005425
5426 XXX must handle implicit jumps from one block to next
5427*/
5428
Thomas Wouters89f507f2006-12-13 04:49:30 +00005429struct assembler {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005430 PyObject *a_bytecode; /* string containing bytecode */
5431 int a_offset; /* offset into bytecode */
5432 int a_nblocks; /* number of reachable blocks */
T. Wouters99b54d62019-09-12 07:05:33 -07005433 basicblock **a_postorder; /* list of blocks in dfs postorder */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005434 PyObject *a_lnotab; /* string containing lnotab */
5435 int a_lnotab_off; /* offset into lnotab */
5436 int a_lineno; /* last lineno of emitted instruction */
5437 int a_lineno_off; /* bytecode offset of last lineno */
Thomas Wouters89f507f2006-12-13 04:49:30 +00005438};
5439
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005440static void
T. Wouters99b54d62019-09-12 07:05:33 -07005441dfs(struct compiler *c, basicblock *b, struct assembler *a, int end)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005442{
T. Wouters99b54d62019-09-12 07:05:33 -07005443 int i, j;
5444
5445 /* Get rid of recursion for normal control flow.
5446 Since the number of blocks is limited, unused space in a_postorder
5447 (from a_nblocks to end) can be used as a stack for still not ordered
5448 blocks. */
5449 for (j = end; b && !b->b_seen; b = b->b_next) {
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005450 b->b_seen = 1;
T. Wouters99b54d62019-09-12 07:05:33 -07005451 assert(a->a_nblocks < j);
5452 a->a_postorder[--j] = b;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005453 }
T. Wouters99b54d62019-09-12 07:05:33 -07005454 while (j < end) {
5455 b = a->a_postorder[j++];
5456 for (i = 0; i < b->b_iused; i++) {
5457 struct instr *instr = &b->b_instr[i];
5458 if (instr->i_jrel || instr->i_jabs)
5459 dfs(c, instr->i_target, a, j);
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005460 }
T. Wouters99b54d62019-09-12 07:05:33 -07005461 assert(a->a_nblocks < j);
5462 a->a_postorder[a->a_nblocks++] = b;
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005463 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005464}
5465
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005466Py_LOCAL_INLINE(void)
5467stackdepth_push(basicblock ***sp, basicblock *b, int depth)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005468{
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02005469 assert(b->b_startdepth < 0 || b->b_startdepth == depth);
Mark Shannonfee55262019-11-21 09:11:43 +00005470 if (b->b_startdepth < depth && b->b_startdepth < 100) {
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005471 assert(b->b_startdepth < 0);
5472 b->b_startdepth = depth;
5473 *(*sp)++ = b;
Serhiy Storchakad4864c62018-01-09 21:54:52 +02005474 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005475}
5476
5477/* Find the flow path that needs the largest stack. We assume that
5478 * cycles in the flow graph have no net effect on the stack depth.
5479 */
5480static int
5481stackdepth(struct compiler *c)
5482{
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005483 basicblock *b, *entryblock = NULL;
5484 basicblock **stack, **sp;
5485 int nblocks = 0, maxdepth = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005486 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005487 b->b_startdepth = INT_MIN;
5488 entryblock = b;
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005489 nblocks++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005490 }
5491 if (!entryblock)
5492 return 0;
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005493 stack = (basicblock **)PyObject_Malloc(sizeof(basicblock *) * nblocks);
5494 if (!stack) {
5495 PyErr_NoMemory();
5496 return -1;
5497 }
5498
5499 sp = stack;
5500 stackdepth_push(&sp, entryblock, 0);
5501 while (sp != stack) {
5502 b = *--sp;
5503 int depth = b->b_startdepth;
5504 assert(depth >= 0);
5505 basicblock *next = b->b_next;
5506 for (int i = 0; i < b->b_iused; i++) {
5507 struct instr *instr = &b->b_instr[i];
5508 int effect = stack_effect(instr->i_opcode, instr->i_oparg, 0);
5509 if (effect == PY_INVALID_STACK_EFFECT) {
Victor Stinner87d3b9d2020-03-25 19:27:36 +01005510 _Py_FatalErrorFormat(__func__,
5511 "opcode = %d", instr->i_opcode);
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005512 }
5513 int new_depth = depth + effect;
5514 if (new_depth > maxdepth) {
5515 maxdepth = new_depth;
5516 }
5517 assert(depth >= 0); /* invalid code or bug in stackdepth() */
5518 if (instr->i_jrel || instr->i_jabs) {
5519 effect = stack_effect(instr->i_opcode, instr->i_oparg, 1);
5520 assert(effect != PY_INVALID_STACK_EFFECT);
5521 int target_depth = depth + effect;
5522 if (target_depth > maxdepth) {
5523 maxdepth = target_depth;
5524 }
5525 assert(target_depth >= 0); /* invalid code or bug in stackdepth() */
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005526 stackdepth_push(&sp, instr->i_target, target_depth);
5527 }
5528 depth = new_depth;
5529 if (instr->i_opcode == JUMP_ABSOLUTE ||
5530 instr->i_opcode == JUMP_FORWARD ||
5531 instr->i_opcode == RETURN_VALUE ||
Mark Shannonfee55262019-11-21 09:11:43 +00005532 instr->i_opcode == RAISE_VARARGS ||
5533 instr->i_opcode == RERAISE)
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005534 {
5535 /* remaining code is dead */
5536 next = NULL;
5537 break;
5538 }
5539 }
5540 if (next != NULL) {
5541 stackdepth_push(&sp, next, depth);
5542 }
5543 }
5544 PyObject_Free(stack);
5545 return maxdepth;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005546}
5547
5548static int
5549assemble_init(struct assembler *a, int nblocks, int firstlineno)
5550{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005551 memset(a, 0, sizeof(struct assembler));
5552 a->a_lineno = firstlineno;
5553 a->a_bytecode = PyBytes_FromStringAndSize(NULL, DEFAULT_CODE_SIZE);
5554 if (!a->a_bytecode)
5555 return 0;
5556 a->a_lnotab = PyBytes_FromStringAndSize(NULL, DEFAULT_LNOTAB_SIZE);
5557 if (!a->a_lnotab)
5558 return 0;
Benjamin Peterson2f8bfef2016-09-07 09:26:18 -07005559 if ((size_t)nblocks > SIZE_MAX / sizeof(basicblock *)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005560 PyErr_NoMemory();
5561 return 0;
5562 }
T. Wouters99b54d62019-09-12 07:05:33 -07005563 a->a_postorder = (basicblock **)PyObject_Malloc(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005564 sizeof(basicblock *) * nblocks);
T. Wouters99b54d62019-09-12 07:05:33 -07005565 if (!a->a_postorder) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005566 PyErr_NoMemory();
5567 return 0;
5568 }
5569 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005570}
5571
5572static void
5573assemble_free(struct assembler *a)
5574{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005575 Py_XDECREF(a->a_bytecode);
5576 Py_XDECREF(a->a_lnotab);
T. Wouters99b54d62019-09-12 07:05:33 -07005577 if (a->a_postorder)
5578 PyObject_Free(a->a_postorder);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005579}
5580
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005581static int
5582blocksize(basicblock *b)
5583{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005584 int i;
5585 int size = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005586
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005587 for (i = 0; i < b->b_iused; i++)
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005588 size += instrsize(b->b_instr[i].i_oparg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005589 return size;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005590}
5591
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00005592/* Appends a pair to the end of the line number table, a_lnotab, representing
5593 the instruction's bytecode offset and line number. See
5594 Objects/lnotab_notes.txt for the description of the line number table. */
Tim Peters2a7f3842001-06-09 09:26:21 +00005595
Guido van Rossumf68d8e52001-04-14 17:55:09 +00005596static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005597assemble_lnotab(struct assembler *a, struct instr *i)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005598{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005599 int d_bytecode, d_lineno;
Victor Stinnerad9a0662013-11-19 22:23:20 +01005600 Py_ssize_t len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005601 unsigned char *lnotab;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005602
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005603 d_lineno = i->i_lineno - a->a_lineno;
Serhiy Storchaka61cb3d02020-03-17 18:07:30 +02005604 if (d_lineno == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005605 return 1;
Serhiy Storchaka61cb3d02020-03-17 18:07:30 +02005606 }
5607
5608 d_bytecode = (a->a_offset - a->a_lineno_off) * sizeof(_Py_CODEUNIT);
5609 assert(d_bytecode >= 0);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00005610
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005611 if (d_bytecode > 255) {
5612 int j, nbytes, ncodes = d_bytecode / 255;
5613 nbytes = a->a_lnotab_off + 2 * ncodes;
5614 len = PyBytes_GET_SIZE(a->a_lnotab);
5615 if (nbytes >= len) {
5616 if ((len <= INT_MAX / 2) && (len * 2 < nbytes))
5617 len = nbytes;
5618 else if (len <= INT_MAX / 2)
5619 len *= 2;
5620 else {
5621 PyErr_NoMemory();
5622 return 0;
5623 }
5624 if (_PyBytes_Resize(&a->a_lnotab, len) < 0)
5625 return 0;
5626 }
5627 lnotab = (unsigned char *)
5628 PyBytes_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
5629 for (j = 0; j < ncodes; j++) {
5630 *lnotab++ = 255;
5631 *lnotab++ = 0;
5632 }
5633 d_bytecode -= ncodes * 255;
5634 a->a_lnotab_off += ncodes * 2;
5635 }
Victor Stinnerf3914eb2016-01-20 12:16:21 +01005636 assert(0 <= d_bytecode && d_bytecode <= 255);
5637
5638 if (d_lineno < -128 || 127 < d_lineno) {
5639 int j, nbytes, ncodes, k;
5640 if (d_lineno < 0) {
5641 k = -128;
5642 /* use division on positive numbers */
5643 ncodes = (-d_lineno) / 128;
5644 }
5645 else {
5646 k = 127;
5647 ncodes = d_lineno / 127;
5648 }
5649 d_lineno -= ncodes * k;
5650 assert(ncodes >= 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005651 nbytes = a->a_lnotab_off + 2 * ncodes;
5652 len = PyBytes_GET_SIZE(a->a_lnotab);
5653 if (nbytes >= len) {
5654 if ((len <= INT_MAX / 2) && len * 2 < nbytes)
5655 len = nbytes;
5656 else if (len <= INT_MAX / 2)
5657 len *= 2;
5658 else {
5659 PyErr_NoMemory();
5660 return 0;
5661 }
5662 if (_PyBytes_Resize(&a->a_lnotab, len) < 0)
5663 return 0;
5664 }
5665 lnotab = (unsigned char *)
5666 PyBytes_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
5667 *lnotab++ = d_bytecode;
Victor Stinnerf3914eb2016-01-20 12:16:21 +01005668 *lnotab++ = k;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005669 d_bytecode = 0;
5670 for (j = 1; j < ncodes; j++) {
5671 *lnotab++ = 0;
Victor Stinnerf3914eb2016-01-20 12:16:21 +01005672 *lnotab++ = k;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005673 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005674 a->a_lnotab_off += ncodes * 2;
5675 }
Victor Stinnerf3914eb2016-01-20 12:16:21 +01005676 assert(-128 <= d_lineno && d_lineno <= 127);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005677
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005678 len = PyBytes_GET_SIZE(a->a_lnotab);
5679 if (a->a_lnotab_off + 2 >= len) {
5680 if (_PyBytes_Resize(&a->a_lnotab, len * 2) < 0)
5681 return 0;
5682 }
5683 lnotab = (unsigned char *)
5684 PyBytes_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
Tim Peters51e26512001-09-07 08:45:55 +00005685
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005686 a->a_lnotab_off += 2;
5687 if (d_bytecode) {
5688 *lnotab++ = d_bytecode;
Victor Stinner4f2dab52011-05-27 16:46:51 +02005689 *lnotab++ = d_lineno;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005690 }
5691 else { /* First line of a block; def stmt, etc. */
5692 *lnotab++ = 0;
Victor Stinner4f2dab52011-05-27 16:46:51 +02005693 *lnotab++ = d_lineno;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005694 }
5695 a->a_lineno = i->i_lineno;
5696 a->a_lineno_off = a->a_offset;
5697 return 1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005698}
5699
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005700/* assemble_emit()
5701 Extend the bytecode with a new instruction.
5702 Update lnotab if necessary.
Jeremy Hylton376e63d2003-08-28 14:42:14 +00005703*/
5704
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00005705static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005706assemble_emit(struct assembler *a, struct instr *i)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00005707{
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005708 int size, arg = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005709 Py_ssize_t len = PyBytes_GET_SIZE(a->a_bytecode);
Serhiy Storchakaab874002016-09-11 13:48:15 +03005710 _Py_CODEUNIT *code;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005711
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005712 arg = i->i_oparg;
5713 size = instrsize(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005714 if (i->i_lineno && !assemble_lnotab(a, i))
5715 return 0;
Serhiy Storchakaab874002016-09-11 13:48:15 +03005716 if (a->a_offset + size >= len / (int)sizeof(_Py_CODEUNIT)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005717 if (len > PY_SSIZE_T_MAX / 2)
5718 return 0;
5719 if (_PyBytes_Resize(&a->a_bytecode, len * 2) < 0)
5720 return 0;
5721 }
Serhiy Storchakaab874002016-09-11 13:48:15 +03005722 code = (_Py_CODEUNIT *)PyBytes_AS_STRING(a->a_bytecode) + a->a_offset;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005723 a->a_offset += size;
Serhiy Storchakaab874002016-09-11 13:48:15 +03005724 write_op_arg(code, i->i_opcode, arg, size);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005725 return 1;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00005726}
5727
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00005728static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005729assemble_jump_offsets(struct assembler *a, struct compiler *c)
Anthony Baxterc2a5a632004-08-02 06:10:11 +00005730{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005731 basicblock *b;
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005732 int bsize, totsize, extended_arg_recompile;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005733 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00005734
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005735 /* Compute the size of each block and fixup jump args.
5736 Replace block pointer with position in bytecode. */
5737 do {
5738 totsize = 0;
T. Wouters99b54d62019-09-12 07:05:33 -07005739 for (i = a->a_nblocks - 1; i >= 0; i--) {
5740 b = a->a_postorder[i];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005741 bsize = blocksize(b);
5742 b->b_offset = totsize;
5743 totsize += bsize;
5744 }
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005745 extended_arg_recompile = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005746 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
5747 bsize = b->b_offset;
5748 for (i = 0; i < b->b_iused; i++) {
5749 struct instr *instr = &b->b_instr[i];
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005750 int isize = instrsize(instr->i_oparg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005751 /* Relative jumps are computed relative to
5752 the instruction pointer after fetching
5753 the jump instruction.
5754 */
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005755 bsize += isize;
5756 if (instr->i_jabs || instr->i_jrel) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005757 instr->i_oparg = instr->i_target->b_offset;
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005758 if (instr->i_jrel) {
5759 instr->i_oparg -= bsize;
5760 }
Serhiy Storchakaab874002016-09-11 13:48:15 +03005761 instr->i_oparg *= sizeof(_Py_CODEUNIT);
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005762 if (instrsize(instr->i_oparg) != isize) {
5763 extended_arg_recompile = 1;
5764 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005765 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005766 }
5767 }
Neal Norwitzf1d50682005-10-23 23:00:41 +00005768
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005769 /* XXX: This is an awful hack that could hurt performance, but
5770 on the bright side it should work until we come up
5771 with a better solution.
Neal Norwitzf1d50682005-10-23 23:00:41 +00005772
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005773 The issue is that in the first loop blocksize() is called
5774 which calls instrsize() which requires i_oparg be set
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005775 appropriately. There is a bootstrap problem because
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005776 i_oparg is calculated in the second loop above.
Neal Norwitzf1d50682005-10-23 23:00:41 +00005777
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005778 So we loop until we stop seeing new EXTENDED_ARGs.
5779 The only EXTENDED_ARGs that could be popping up are
5780 ones in jump instructions. So this should converge
5781 fairly quickly.
5782 */
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005783 } while (extended_arg_recompile);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005784}
5785
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005786static PyObject *
Victor Stinnerad9a0662013-11-19 22:23:20 +01005787dict_keys_inorder(PyObject *dict, Py_ssize_t offset)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005788{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005789 PyObject *tuple, *k, *v;
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +02005790 Py_ssize_t i, pos = 0, size = PyDict_GET_SIZE(dict);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005791
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005792 tuple = PyTuple_New(size);
5793 if (tuple == NULL)
5794 return NULL;
5795 while (PyDict_Next(dict, &pos, &k, &v)) {
5796 i = PyLong_AS_LONG(v);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005797 Py_INCREF(k);
5798 assert((i - offset) < size);
5799 assert((i - offset) >= 0);
5800 PyTuple_SET_ITEM(tuple, i - offset, k);
5801 }
5802 return tuple;
5803}
5804
5805static PyObject *
5806consts_dict_keys_inorder(PyObject *dict)
5807{
5808 PyObject *consts, *k, *v;
5809 Py_ssize_t i, pos = 0, size = PyDict_GET_SIZE(dict);
5810
5811 consts = PyList_New(size); /* PyCode_Optimize() requires a list */
5812 if (consts == NULL)
5813 return NULL;
5814 while (PyDict_Next(dict, &pos, &k, &v)) {
5815 i = PyLong_AS_LONG(v);
Serhiy Storchakab7e1eff2018-04-19 08:28:04 +03005816 /* The keys of the dictionary can be tuples wrapping a contant.
5817 * (see compiler_add_o and _PyCode_ConstantKey). In that case
5818 * the object we want is always second. */
5819 if (PyTuple_CheckExact(k)) {
5820 k = PyTuple_GET_ITEM(k, 1);
5821 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005822 Py_INCREF(k);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005823 assert(i < size);
5824 assert(i >= 0);
5825 PyList_SET_ITEM(consts, i, k);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005826 }
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005827 return consts;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005828}
5829
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005830static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005831compute_code_flags(struct compiler *c)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005832{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005833 PySTEntryObject *ste = c->u->u_ste;
Victor Stinnerad9a0662013-11-19 22:23:20 +01005834 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005835 if (ste->ste_type == FunctionBlock) {
Benjamin Peterson1dfd2472015-04-27 21:44:22 -04005836 flags |= CO_NEWLOCALS | CO_OPTIMIZED;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005837 if (ste->ste_nested)
5838 flags |= CO_NESTED;
Yury Selivanoveb636452016-09-08 22:01:51 -07005839 if (ste->ste_generator && !ste->ste_coroutine)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005840 flags |= CO_GENERATOR;
Yury Selivanoveb636452016-09-08 22:01:51 -07005841 if (!ste->ste_generator && ste->ste_coroutine)
5842 flags |= CO_COROUTINE;
5843 if (ste->ste_generator && ste->ste_coroutine)
5844 flags |= CO_ASYNC_GENERATOR;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005845 if (ste->ste_varargs)
5846 flags |= CO_VARARGS;
5847 if (ste->ste_varkeywords)
5848 flags |= CO_VARKEYWORDS;
5849 }
Thomas Wouters5e9f1fa2006-02-28 20:02:27 +00005850
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005851 /* (Only) inherit compilerflags in PyCF_MASK */
5852 flags |= (c->c_flags->cf_flags & PyCF_MASK);
Thomas Wouters5e9f1fa2006-02-28 20:02:27 +00005853
Pablo Galindo90235812020-03-15 04:29:22 +00005854 if ((IS_TOP_LEVEL_AWAIT(c)) &&
Matthias Bussonnier565b4f12019-05-21 13:12:03 -07005855 ste->ste_coroutine &&
5856 !ste->ste_generator) {
5857 flags |= CO_COROUTINE;
5858 }
5859
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005860 return flags;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005861}
5862
INADA Naokic2e16072018-11-26 21:23:22 +09005863// Merge *tuple* with constant cache.
5864// Unlike merge_consts_recursive(), this function doesn't work recursively.
5865static int
5866merge_const_tuple(struct compiler *c, PyObject **tuple)
5867{
5868 assert(PyTuple_CheckExact(*tuple));
5869
5870 PyObject *key = _PyCode_ConstantKey(*tuple);
5871 if (key == NULL) {
5872 return 0;
5873 }
5874
5875 // t is borrowed reference
5876 PyObject *t = PyDict_SetDefault(c->c_const_cache, key, key);
5877 Py_DECREF(key);
5878 if (t == NULL) {
5879 return 0;
5880 }
5881 if (t == key) { // tuple is new constant.
5882 return 1;
5883 }
5884
5885 PyObject *u = PyTuple_GET_ITEM(t, 1);
5886 Py_INCREF(u);
5887 Py_DECREF(*tuple);
5888 *tuple = u;
5889 return 1;
5890}
5891
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005892static PyCodeObject *
5893makecode(struct compiler *c, struct assembler *a)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005894{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005895 PyObject *tmp;
5896 PyCodeObject *co = NULL;
5897 PyObject *consts = NULL;
5898 PyObject *names = NULL;
5899 PyObject *varnames = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005900 PyObject *name = NULL;
5901 PyObject *freevars = NULL;
5902 PyObject *cellvars = NULL;
5903 PyObject *bytecode = NULL;
Victor Stinnerad9a0662013-11-19 22:23:20 +01005904 Py_ssize_t nlocals;
5905 int nlocals_int;
5906 int flags;
Pablo Galindocd74e662019-06-01 18:08:04 +01005907 int posorkeywordargcount, posonlyargcount, kwonlyargcount, maxdepth;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005908
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005909 consts = consts_dict_keys_inorder(c->u->u_consts);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005910 names = dict_keys_inorder(c->u->u_names, 0);
5911 varnames = dict_keys_inorder(c->u->u_varnames, 0);
5912 if (!consts || !names || !varnames)
5913 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005914
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005915 cellvars = dict_keys_inorder(c->u->u_cellvars, 0);
5916 if (!cellvars)
5917 goto error;
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005918 freevars = dict_keys_inorder(c->u->u_freevars, PyTuple_GET_SIZE(cellvars));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005919 if (!freevars)
5920 goto error;
Victor Stinnerad9a0662013-11-19 22:23:20 +01005921
INADA Naokic2e16072018-11-26 21:23:22 +09005922 if (!merge_const_tuple(c, &names) ||
5923 !merge_const_tuple(c, &varnames) ||
5924 !merge_const_tuple(c, &cellvars) ||
5925 !merge_const_tuple(c, &freevars))
5926 {
5927 goto error;
5928 }
5929
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +02005930 nlocals = PyDict_GET_SIZE(c->u->u_varnames);
Victor Stinnerad9a0662013-11-19 22:23:20 +01005931 assert(nlocals < INT_MAX);
5932 nlocals_int = Py_SAFE_DOWNCAST(nlocals, Py_ssize_t, int);
5933
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005934 flags = compute_code_flags(c);
5935 if (flags < 0)
5936 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005937
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005938 bytecode = PyCode_Optimize(a->a_bytecode, consts, names, a->a_lnotab);
5939 if (!bytecode)
5940 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005941
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005942 tmp = PyList_AsTuple(consts); /* PyCode_New requires a tuple */
5943 if (!tmp)
5944 goto error;
5945 Py_DECREF(consts);
5946 consts = tmp;
INADA Naokic2e16072018-11-26 21:23:22 +09005947 if (!merge_const_tuple(c, &consts)) {
5948 goto error;
5949 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005950
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01005951 posonlyargcount = Py_SAFE_DOWNCAST(c->u->u_posonlyargcount, Py_ssize_t, int);
Pablo Galindocd74e662019-06-01 18:08:04 +01005952 posorkeywordargcount = Py_SAFE_DOWNCAST(c->u->u_argcount, Py_ssize_t, int);
Victor Stinnerf8e32212013-11-19 23:56:34 +01005953 kwonlyargcount = Py_SAFE_DOWNCAST(c->u->u_kwonlyargcount, Py_ssize_t, int);
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005954 maxdepth = stackdepth(c);
5955 if (maxdepth < 0) {
5956 goto error;
5957 }
Pablo Galindo4a2edc32019-07-01 11:35:05 +01005958 co = PyCode_NewWithPosOnlyArgs(posonlyargcount+posorkeywordargcount,
Mark Shannon13bc1392020-01-23 09:25:17 +00005959 posonlyargcount, kwonlyargcount, nlocals_int,
Pablo Galindo4a2edc32019-07-01 11:35:05 +01005960 maxdepth, flags, bytecode, consts, names,
5961 varnames, freevars, cellvars, c->c_filename,
5962 c->u->u_name, c->u->u_firstlineno, a->a_lnotab);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005963 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005964 Py_XDECREF(consts);
5965 Py_XDECREF(names);
5966 Py_XDECREF(varnames);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005967 Py_XDECREF(name);
5968 Py_XDECREF(freevars);
5969 Py_XDECREF(cellvars);
5970 Py_XDECREF(bytecode);
5971 return co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005972}
5973
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005974
5975/* For debugging purposes only */
5976#if 0
5977static void
5978dump_instr(const struct instr *i)
5979{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005980 const char *jrel = i->i_jrel ? "jrel " : "";
5981 const char *jabs = i->i_jabs ? "jabs " : "";
5982 char arg[128];
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005983
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005984 *arg = '\0';
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005985 if (HAS_ARG(i->i_opcode)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005986 sprintf(arg, "arg: %d ", i->i_oparg);
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005987 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005988 fprintf(stderr, "line: %d, opcode: %d %s%s%s\n",
5989 i->i_lineno, i->i_opcode, arg, jabs, jrel);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005990}
5991
5992static void
5993dump_basicblock(const basicblock *b)
5994{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005995 const char *seen = b->b_seen ? "seen " : "";
5996 const char *b_return = b->b_return ? "return " : "";
5997 fprintf(stderr, "used: %d, depth: %d, offset: %d %s%s\n",
5998 b->b_iused, b->b_startdepth, b->b_offset, seen, b_return);
5999 if (b->b_instr) {
6000 int i;
6001 for (i = 0; i < b->b_iused; i++) {
6002 fprintf(stderr, " [%02d] ", i);
6003 dump_instr(b->b_instr + i);
6004 }
6005 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00006006}
6007#endif
6008
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00006009static PyCodeObject *
6010assemble(struct compiler *c, int addNone)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006011{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006012 basicblock *b, *entryblock;
6013 struct assembler a;
6014 int i, j, nblocks;
6015 PyCodeObject *co = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006016
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006017 /* Make sure every block that falls off the end returns None.
6018 XXX NEXT_BLOCK() isn't quite right, because if the last
6019 block ends with a jump or return b_next shouldn't set.
6020 */
6021 if (!c->u->u_curblock->b_return) {
6022 NEXT_BLOCK(c);
6023 if (addNone)
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03006024 ADDOP_LOAD_CONST(c, Py_None);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006025 ADDOP(c, RETURN_VALUE);
6026 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006027
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006028 nblocks = 0;
6029 entryblock = NULL;
6030 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
6031 nblocks++;
6032 entryblock = b;
6033 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006034
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006035 /* Set firstlineno if it wasn't explicitly set. */
6036 if (!c->u->u_firstlineno) {
Ned Deilydc35cda2016-08-17 17:18:33 -04006037 if (entryblock && entryblock->b_instr && entryblock->b_instr->i_lineno)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006038 c->u->u_firstlineno = entryblock->b_instr->i_lineno;
6039 else
6040 c->u->u_firstlineno = 1;
6041 }
6042 if (!assemble_init(&a, nblocks, c->u->u_firstlineno))
6043 goto error;
T. Wouters99b54d62019-09-12 07:05:33 -07006044 dfs(c, entryblock, &a, nblocks);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006045
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006046 /* Can't modify the bytecode after computing jump offsets. */
6047 assemble_jump_offsets(&a, c);
Tim Petersb6c3cea2001-06-26 03:36:28 +00006048
T. Wouters99b54d62019-09-12 07:05:33 -07006049 /* Emit code in reverse postorder from dfs. */
6050 for (i = a.a_nblocks - 1; i >= 0; i--) {
6051 b = a.a_postorder[i];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006052 for (j = 0; j < b->b_iused; j++)
6053 if (!assemble_emit(&a, &b->b_instr[j]))
6054 goto error;
6055 }
Tim Petersb6c3cea2001-06-26 03:36:28 +00006056
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006057 if (_PyBytes_Resize(&a.a_lnotab, a.a_lnotab_off) < 0)
6058 goto error;
Serhiy Storchakaab874002016-09-11 13:48:15 +03006059 if (_PyBytes_Resize(&a.a_bytecode, a.a_offset * sizeof(_Py_CODEUNIT)) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006060 goto error;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006061
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006062 co = makecode(c, &a);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00006063 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006064 assemble_free(&a);
6065 return co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006066}
Georg Brandl8334fd92010-12-04 10:26:46 +00006067
6068#undef PyAST_Compile
Benjamin Petersone5024512018-09-12 12:06:42 -07006069PyCodeObject *
Georg Brandl8334fd92010-12-04 10:26:46 +00006070PyAST_Compile(mod_ty mod, const char *filename, PyCompilerFlags *flags,
6071 PyArena *arena)
6072{
6073 return PyAST_CompileEx(mod, filename, flags, -1, arena);
6074}