blob: 734e8401ff024755d6095c775ab87a36f179ddf5 [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
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000026#include "Python-ast.h"
Victor Stinnerc96be812019-05-14 17:34:56 +020027#include "pycore_pystate.h" /* _PyInterpreterState_GET_UNSAFE() */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000028#include "ast.h"
29#include "code.h"
Jeremy Hylton4b38da62001-02-02 18:19:15 +000030#include "symtable.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000031#include "opcode.h"
Serhiy Storchakab0f80b02016-05-24 09:15:14 +030032#include "wordcode_helpers.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000033
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000034#define DEFAULT_BLOCK_SIZE 16
35#define DEFAULT_BLOCKS 8
36#define DEFAULT_CODE_SIZE 128
37#define DEFAULT_LNOTAB_SIZE 16
Jeremy Hylton29906ee2001-02-27 04:23:34 +000038
Nick Coghlan650f0d02007-04-15 12:05:43 +000039#define COMP_GENEXP 0
40#define COMP_LISTCOMP 1
41#define COMP_SETCOMP 2
Guido van Rossum992d4a32007-07-11 13:09:30 +000042#define COMP_DICTCOMP 3
Nick Coghlan650f0d02007-04-15 12:05:43 +000043
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000044struct instr {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000045 unsigned i_jabs : 1;
46 unsigned i_jrel : 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000047 unsigned char i_opcode;
48 int i_oparg;
49 struct basicblock_ *i_target; /* target block (if jump instruction) */
50 int i_lineno;
Guido van Rossum3f5da241990-12-20 15:06:42 +000051};
52
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000053typedef struct basicblock_ {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000054 /* Each basicblock in a compilation unit is linked via b_list in the
55 reverse order that the block are allocated. b_list points to the next
56 block, not to be confused with b_next, which is next by control flow. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000057 struct basicblock_ *b_list;
58 /* number of instructions used */
59 int b_iused;
60 /* length of instruction array (b_instr) */
61 int b_ialloc;
62 /* pointer to an array of instructions, initially NULL */
63 struct instr *b_instr;
64 /* If b_next is non-NULL, it is a pointer to the next
65 block reached by normal control flow. */
66 struct basicblock_ *b_next;
67 /* b_seen is used to perform a DFS of basicblocks. */
68 unsigned b_seen : 1;
69 /* b_return is true if a RETURN_VALUE opcode is inserted. */
70 unsigned b_return : 1;
71 /* depth of stack upon entry of block, computed by stackdepth() */
72 int b_startdepth;
73 /* instruction offset for block, computed by assemble_jump_offsets() */
74 int b_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000075} basicblock;
76
77/* fblockinfo tracks the current frame block.
78
Jeremy Hyltone9357b22006-03-01 15:47:05 +000079A frame block is used to handle loops, try/except, and try/finally.
80It's called a frame block to distinguish it from a basic block in the
81compiler IR.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000082*/
83
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +020084enum fblocktype { WHILE_LOOP, FOR_LOOP, EXCEPT, FINALLY_TRY, FINALLY_END,
85 WITH, ASYNC_WITH, HANDLER_CLEANUP };
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000086
87struct fblockinfo {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000088 enum fblocktype fb_type;
89 basicblock *fb_block;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +020090 /* (optional) type-specific exit or cleanup block */
91 basicblock *fb_exit;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000092};
93
Antoine Pitrou86a36b52011-11-25 18:56:07 +010094enum {
95 COMPILER_SCOPE_MODULE,
96 COMPILER_SCOPE_CLASS,
97 COMPILER_SCOPE_FUNCTION,
Yury Selivanov75445082015-05-11 22:57:16 -040098 COMPILER_SCOPE_ASYNC_FUNCTION,
Benjamin Peterson6b4f7802013-10-20 17:50:28 -040099 COMPILER_SCOPE_LAMBDA,
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100100 COMPILER_SCOPE_COMPREHENSION,
101};
102
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000103/* The following items change on entry and exit of code blocks.
104 They must be saved and restored when returning to a block.
105*/
106struct compiler_unit {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000107 PySTEntryObject *u_ste;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000108
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000109 PyObject *u_name;
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400110 PyObject *u_qualname; /* dot-separated qualified name (lazy) */
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100111 int u_scope_type;
112
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000113 /* The following fields are dicts that map objects to
114 the index of them in co_XXX. The index is used as
115 the argument for opcodes that refer to those collections.
116 */
117 PyObject *u_consts; /* all constants */
118 PyObject *u_names; /* all names */
119 PyObject *u_varnames; /* local variables */
120 PyObject *u_cellvars; /* cell variables */
121 PyObject *u_freevars; /* free variables */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000122
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000123 PyObject *u_private; /* for private name mangling */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000124
Victor Stinnerf8e32212013-11-19 23:56:34 +0100125 Py_ssize_t u_argcount; /* number of arguments for block */
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100126 Py_ssize_t u_posonlyargcount; /* number of positional only arguments for block */
Victor Stinnerf8e32212013-11-19 23:56:34 +0100127 Py_ssize_t u_kwonlyargcount; /* number of keyword only arguments for block */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000128 /* Pointer to the most recently allocated block. By following b_list
129 members, you can reach all early allocated blocks. */
130 basicblock *u_blocks;
131 basicblock *u_curblock; /* pointer to current block */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000132
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000133 int u_nfblocks;
134 struct fblockinfo u_fblock[CO_MAXBLOCKS];
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000135
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000136 int u_firstlineno; /* the first lineno of the block */
137 int u_lineno; /* the lineno for the current stmt */
Benjamin Petersond4efd9e2010-09-20 23:02:10 +0000138 int u_col_offset; /* the offset of the current stmt */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000139 int u_lineno_set; /* boolean to indicate whether instr
140 has been generated with current lineno */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000141};
142
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000143/* This struct captures the global state of a compilation.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000144
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000145The u pointer points to the current compilation unit, while units
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000146for enclosing blocks are stored in c_stack. The u and c_stack are
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000147managed by compiler_enter_scope() and compiler_exit_scope().
Nick Coghlanaab9c2b2012-11-04 23:14:34 +1000148
149Note that we don't track recursion levels during compilation - the
150task of detecting and rejecting excessive levels of nesting is
151handled by the symbol analysis pass.
152
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000153*/
154
155struct compiler {
Victor Stinner14e461d2013-08-26 22:28:21 +0200156 PyObject *c_filename;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000157 struct symtable *c_st;
158 PyFutureFeatures *c_future; /* pointer to module's __future__ */
159 PyCompilerFlags *c_flags;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000160
Georg Brandl8334fd92010-12-04 10:26:46 +0000161 int c_optimize; /* optimization level */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000162 int c_interactive; /* true if in interactive mode */
163 int c_nestlevel;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000164
INADA Naokic2e16072018-11-26 21:23:22 +0900165 PyObject *c_const_cache; /* Python dict holding all constants,
166 including names tuple */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000167 struct compiler_unit *u; /* compiler state for current block */
168 PyObject *c_stack; /* Python list holding compiler_unit ptrs */
169 PyArena *c_arena; /* pointer to memory allocation arena */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000170};
171
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100172static int compiler_enter_scope(struct compiler *, identifier, int, void *, int);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000173static void compiler_free(struct compiler *);
174static basicblock *compiler_new_block(struct compiler *);
175static int compiler_next_instr(struct compiler *, basicblock *);
176static int compiler_addop(struct compiler *, int);
Victor Stinnerf8e32212013-11-19 23:56:34 +0100177static int compiler_addop_i(struct compiler *, int, Py_ssize_t);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000178static int compiler_addop_j(struct compiler *, int, basicblock *, int);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000179static int compiler_error(struct compiler *, const char *);
Serhiy Storchaka62e44812019-02-16 08:12:19 +0200180static int compiler_warn(struct compiler *, const char *, ...);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000181static int compiler_nameop(struct compiler *, identifier, expr_context_ty);
182
183static PyCodeObject *compiler_mod(struct compiler *, mod_ty);
184static int compiler_visit_stmt(struct compiler *, stmt_ty);
185static int compiler_visit_keyword(struct compiler *, keyword_ty);
186static int compiler_visit_expr(struct compiler *, expr_ty);
187static int compiler_augassign(struct compiler *, stmt_ty);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -0700188static int compiler_annassign(struct compiler *, stmt_ty);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000189static int compiler_visit_slice(struct compiler *, slice_ty,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000190 expr_context_ty);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000191
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000192static int inplace_binop(struct compiler *, operator_ty);
Serhiy Storchaka3dfbaf52017-12-25 12:47:50 +0200193static int expr_constant(expr_ty);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000194
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -0500195static int compiler_with(struct compiler *, stmt_ty, int);
Yury Selivanov75445082015-05-11 22:57:16 -0400196static int compiler_async_with(struct compiler *, stmt_ty, int);
197static int compiler_async_for(struct compiler *, stmt_ty);
Victor Stinner976bb402016-03-23 11:36:19 +0100198static int compiler_call_helper(struct compiler *c, int n,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000199 asdl_seq *args,
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400200 asdl_seq *keywords);
Benjamin Peterson43af12b2011-05-29 11:43:10 -0500201static int compiler_try_except(struct compiler *, stmt_ty);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400202static int compiler_set_qualname(struct compiler *);
Guido van Rossumc2e20742006-02-27 22:32:47 +0000203
Yury Selivanov52c4e7c2016-09-09 10:36:01 -0700204static int compiler_sync_comprehension_generator(
205 struct compiler *c,
206 asdl_seq *generators, int gen_index,
207 expr_ty elt, expr_ty val, int type);
208
209static int compiler_async_comprehension_generator(
210 struct compiler *c,
211 asdl_seq *generators, int gen_index,
212 expr_ty elt, expr_ty val, int type);
213
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000214static PyCodeObject *assemble(struct compiler *, int addNone);
Mark Shannon332cd5e2018-01-30 00:41:04 +0000215static PyObject *__doc__, *__annotations__;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000216
Benjamin Peterson9e77f722015-05-07 18:41:47 -0400217#define CAPSULE_NAME "compile.c compiler unit"
Benjamin Petersonb173f782009-05-05 22:31:58 +0000218
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000219PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000220_Py_Mangle(PyObject *privateobj, PyObject *ident)
Michael W. Hudson60934622004-08-12 17:56:29 +0000221{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000222 /* Name mangling: __private becomes _classname__private.
223 This is independent from how the name is used. */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200224 PyObject *result;
225 size_t nlen, plen, ipriv;
226 Py_UCS4 maxchar;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000227 if (privateobj == NULL || !PyUnicode_Check(privateobj) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200228 PyUnicode_READ_CHAR(ident, 0) != '_' ||
229 PyUnicode_READ_CHAR(ident, 1) != '_') {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000230 Py_INCREF(ident);
231 return ident;
232 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200233 nlen = PyUnicode_GET_LENGTH(ident);
234 plen = PyUnicode_GET_LENGTH(privateobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000235 /* Don't mangle __id__ or names with dots.
Guido van Rossumd8faa362007-04-27 19:54:29 +0000236
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000237 The only time a name with a dot can occur is when
238 we are compiling an import statement that has a
239 package name.
Guido van Rossumd8faa362007-04-27 19:54:29 +0000240
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000241 TODO(jhylton): Decide whether we want to support
242 mangling of the module name, e.g. __M.X.
243 */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200244 if ((PyUnicode_READ_CHAR(ident, nlen-1) == '_' &&
245 PyUnicode_READ_CHAR(ident, nlen-2) == '_') ||
246 PyUnicode_FindChar(ident, '.', 0, nlen, 1) != -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000247 Py_INCREF(ident);
248 return ident; /* Don't mangle __whatever__ */
249 }
250 /* Strip leading underscores from class name */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200251 ipriv = 0;
252 while (PyUnicode_READ_CHAR(privateobj, ipriv) == '_')
253 ipriv++;
254 if (ipriv == plen) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000255 Py_INCREF(ident);
256 return ident; /* Don't mangle if class is just underscores */
257 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200258 plen -= ipriv;
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000259
Antoine Pitrou55bff892013-04-06 21:21:04 +0200260 if (plen + nlen >= PY_SSIZE_T_MAX - 1) {
261 PyErr_SetString(PyExc_OverflowError,
262 "private identifier too large to be mangled");
263 return NULL;
264 }
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000265
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200266 maxchar = PyUnicode_MAX_CHAR_VALUE(ident);
267 if (PyUnicode_MAX_CHAR_VALUE(privateobj) > maxchar)
268 maxchar = PyUnicode_MAX_CHAR_VALUE(privateobj);
269
270 result = PyUnicode_New(1 + nlen + plen, maxchar);
271 if (!result)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000272 return 0;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200273 /* ident = "_" + priv[ipriv:] + ident # i.e. 1+plen+nlen bytes */
274 PyUnicode_WRITE(PyUnicode_KIND(result), PyUnicode_DATA(result), 0, '_');
Victor Stinner6c7a52a2011-09-28 21:39:17 +0200275 if (PyUnicode_CopyCharacters(result, 1, privateobj, ipriv, plen) < 0) {
276 Py_DECREF(result);
277 return NULL;
278 }
279 if (PyUnicode_CopyCharacters(result, plen+1, ident, 0, nlen) < 0) {
280 Py_DECREF(result);
281 return NULL;
282 }
Victor Stinner8f825062012-04-27 13:55:39 +0200283 assert(_PyUnicode_CheckConsistency(result, 1));
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200284 return result;
Michael W. Hudson60934622004-08-12 17:56:29 +0000285}
286
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000287static int
288compiler_init(struct compiler *c)
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000289{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000290 memset(c, 0, sizeof(struct compiler));
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000291
INADA Naokic2e16072018-11-26 21:23:22 +0900292 c->c_const_cache = PyDict_New();
293 if (!c->c_const_cache) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000294 return 0;
INADA Naokic2e16072018-11-26 21:23:22 +0900295 }
296
297 c->c_stack = PyList_New(0);
298 if (!c->c_stack) {
299 Py_CLEAR(c->c_const_cache);
300 return 0;
301 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000302
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000303 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000304}
305
306PyCodeObject *
Victor Stinner14e461d2013-08-26 22:28:21 +0200307PyAST_CompileObject(mod_ty mod, PyObject *filename, PyCompilerFlags *flags,
308 int optimize, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000309{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000310 struct compiler c;
311 PyCodeObject *co = NULL;
312 PyCompilerFlags local_flags;
313 int merged;
Victor Stinnerc96be812019-05-14 17:34:56 +0200314 _PyCoreConfig *config = &_PyInterpreterState_GET_UNSAFE()->core_config;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000315
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000316 if (!__doc__) {
317 __doc__ = PyUnicode_InternFromString("__doc__");
318 if (!__doc__)
319 return NULL;
320 }
Mark Shannon332cd5e2018-01-30 00:41:04 +0000321 if (!__annotations__) {
322 __annotations__ = PyUnicode_InternFromString("__annotations__");
323 if (!__annotations__)
324 return NULL;
325 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000326 if (!compiler_init(&c))
327 return NULL;
Victor Stinner14e461d2013-08-26 22:28:21 +0200328 Py_INCREF(filename);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000329 c.c_filename = filename;
330 c.c_arena = arena;
Victor Stinner14e461d2013-08-26 22:28:21 +0200331 c.c_future = PyFuture_FromASTObject(mod, filename);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000332 if (c.c_future == NULL)
333 goto finally;
334 if (!flags) {
335 local_flags.cf_flags = 0;
Guido van Rossum495da292019-03-07 12:38:08 -0800336 local_flags.cf_feature_version = PY_MINOR_VERSION;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000337 flags = &local_flags;
338 }
339 merged = c.c_future->ff_features | flags->cf_flags;
340 c.c_future->ff_features = merged;
341 flags->cf_flags = merged;
342 c.c_flags = flags;
Victor Stinnerc96be812019-05-14 17:34:56 +0200343 c.c_optimize = (optimize == -1) ? config->optimization_level : optimize;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000344 c.c_nestlevel = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000345
Serhiy Storchaka3dfbaf52017-12-25 12:47:50 +0200346 if (!_PyAST_Optimize(mod, arena, c.c_optimize)) {
INADA Naoki7ea143a2017-12-14 16:47:20 +0900347 goto finally;
348 }
349
Victor Stinner14e461d2013-08-26 22:28:21 +0200350 c.c_st = PySymtable_BuildObject(mod, filename, c.c_future);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000351 if (c.c_st == NULL) {
352 if (!PyErr_Occurred())
353 PyErr_SetString(PyExc_SystemError, "no symtable");
354 goto finally;
355 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000356
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000357 co = compiler_mod(&c, mod);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000358
Thomas Wouters1175c432006-02-27 22:49:54 +0000359 finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000360 compiler_free(&c);
361 assert(co || PyErr_Occurred());
362 return co;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000363}
364
365PyCodeObject *
Victor Stinner14e461d2013-08-26 22:28:21 +0200366PyAST_CompileEx(mod_ty mod, const char *filename_str, PyCompilerFlags *flags,
367 int optimize, PyArena *arena)
368{
369 PyObject *filename;
370 PyCodeObject *co;
371 filename = PyUnicode_DecodeFSDefault(filename_str);
372 if (filename == NULL)
373 return NULL;
374 co = PyAST_CompileObject(mod, filename, flags, optimize, arena);
375 Py_DECREF(filename);
376 return co;
377
378}
379
380PyCodeObject *
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000381PyNode_Compile(struct _node *n, const char *filename)
382{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000383 PyCodeObject *co = NULL;
384 mod_ty mod;
385 PyArena *arena = PyArena_New();
386 if (!arena)
387 return NULL;
388 mod = PyAST_FromNode(n, NULL, filename, arena);
389 if (mod)
390 co = PyAST_Compile(mod, filename, NULL, arena);
391 PyArena_Free(arena);
392 return co;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000393}
394
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000395static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000396compiler_free(struct compiler *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000397{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000398 if (c->c_st)
399 PySymtable_Free(c->c_st);
400 if (c->c_future)
401 PyObject_Free(c->c_future);
Victor Stinner14e461d2013-08-26 22:28:21 +0200402 Py_XDECREF(c->c_filename);
INADA Naokic2e16072018-11-26 21:23:22 +0900403 Py_DECREF(c->c_const_cache);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000404 Py_DECREF(c->c_stack);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000405}
406
Guido van Rossum79f25d91997-04-29 20:08:16 +0000407static PyObject *
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000408list2dict(PyObject *list)
Guido van Rossum2dff9911992-09-03 20:50:59 +0000409{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000410 Py_ssize_t i, n;
411 PyObject *v, *k;
412 PyObject *dict = PyDict_New();
413 if (!dict) return NULL;
Guido van Rossumd076c731998-10-07 19:42:25 +0000414
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000415 n = PyList_Size(list);
416 for (i = 0; i < n; i++) {
Victor Stinnerad9a0662013-11-19 22:23:20 +0100417 v = PyLong_FromSsize_t(i);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000418 if (!v) {
419 Py_DECREF(dict);
420 return NULL;
421 }
422 k = PyList_GET_ITEM(list, i);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +0300423 if (PyDict_SetItem(dict, k, v) < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000424 Py_DECREF(v);
425 Py_DECREF(dict);
426 return NULL;
427 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000428 Py_DECREF(v);
429 }
430 return dict;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000431}
432
433/* Return new dict containing names from src that match scope(s).
434
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000435src is a symbol table dictionary. If the scope of a name matches
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000436either scope_type or flag is set, insert it into the new dict. The
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000437values are integers, starting at offset and increasing by one for
438each key.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000439*/
440
441static PyObject *
Victor Stinnerad9a0662013-11-19 22:23:20 +0100442dictbytype(PyObject *src, int scope_type, int flag, Py_ssize_t offset)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000443{
Benjamin Peterson51ab2832012-07-18 15:12:47 -0700444 Py_ssize_t i = offset, scope, num_keys, key_i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000445 PyObject *k, *v, *dest = PyDict_New();
Meador Inge2ca63152012-07-18 14:20:11 -0500446 PyObject *sorted_keys;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000447
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000448 assert(offset >= 0);
449 if (dest == NULL)
450 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000451
Meador Inge2ca63152012-07-18 14:20:11 -0500452 /* Sort the keys so that we have a deterministic order on the indexes
453 saved in the returned dictionary. These indexes are used as indexes
454 into the free and cell var storage. Therefore if they aren't
455 deterministic, then the generated bytecode is not deterministic.
456 */
457 sorted_keys = PyDict_Keys(src);
458 if (sorted_keys == NULL)
459 return NULL;
460 if (PyList_Sort(sorted_keys) != 0) {
461 Py_DECREF(sorted_keys);
462 return NULL;
463 }
Meador Ingef69e24e2012-07-18 16:41:03 -0500464 num_keys = PyList_GET_SIZE(sorted_keys);
Meador Inge2ca63152012-07-18 14:20:11 -0500465
466 for (key_i = 0; key_i < num_keys; key_i++) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000467 /* XXX this should probably be a macro in symtable.h */
468 long vi;
Meador Inge2ca63152012-07-18 14:20:11 -0500469 k = PyList_GET_ITEM(sorted_keys, key_i);
470 v = PyDict_GetItem(src, k);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000471 assert(PyLong_Check(v));
472 vi = PyLong_AS_LONG(v);
473 scope = (vi >> SCOPE_OFFSET) & SCOPE_MASK;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000474
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000475 if (scope == scope_type || vi & flag) {
Serhiy Storchakad70c2a62018-04-20 16:01:25 +0300476 PyObject *item = PyLong_FromSsize_t(i);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000477 if (item == NULL) {
Meador Inge2ca63152012-07-18 14:20:11 -0500478 Py_DECREF(sorted_keys);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000479 Py_DECREF(dest);
480 return NULL;
481 }
482 i++;
Serhiy Storchakad70c2a62018-04-20 16:01:25 +0300483 if (PyDict_SetItem(dest, k, item) < 0) {
Meador Inge2ca63152012-07-18 14:20:11 -0500484 Py_DECREF(sorted_keys);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000485 Py_DECREF(item);
486 Py_DECREF(dest);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000487 return NULL;
488 }
489 Py_DECREF(item);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000490 }
491 }
Meador Inge2ca63152012-07-18 14:20:11 -0500492 Py_DECREF(sorted_keys);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000493 return dest;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000494}
495
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000496static void
497compiler_unit_check(struct compiler_unit *u)
498{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000499 basicblock *block;
500 for (block = u->u_blocks; block != NULL; block = block->b_list) {
Benjamin Petersonca470632016-09-06 13:47:26 -0700501 assert((uintptr_t)block != 0xcbcbcbcbU);
502 assert((uintptr_t)block != 0xfbfbfbfbU);
503 assert((uintptr_t)block != 0xdbdbdbdbU);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000504 if (block->b_instr != NULL) {
505 assert(block->b_ialloc > 0);
506 assert(block->b_iused > 0);
507 assert(block->b_ialloc >= block->b_iused);
508 }
509 else {
510 assert (block->b_iused == 0);
511 assert (block->b_ialloc == 0);
512 }
513 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000514}
515
516static void
517compiler_unit_free(struct compiler_unit *u)
518{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000519 basicblock *b, *next;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000520
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000521 compiler_unit_check(u);
522 b = u->u_blocks;
523 while (b != NULL) {
524 if (b->b_instr)
525 PyObject_Free((void *)b->b_instr);
526 next = b->b_list;
527 PyObject_Free((void *)b);
528 b = next;
529 }
530 Py_CLEAR(u->u_ste);
531 Py_CLEAR(u->u_name);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400532 Py_CLEAR(u->u_qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000533 Py_CLEAR(u->u_consts);
534 Py_CLEAR(u->u_names);
535 Py_CLEAR(u->u_varnames);
536 Py_CLEAR(u->u_freevars);
537 Py_CLEAR(u->u_cellvars);
538 Py_CLEAR(u->u_private);
539 PyObject_Free(u);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000540}
541
542static int
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100543compiler_enter_scope(struct compiler *c, identifier name,
544 int scope_type, void *key, int lineno)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000545{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000546 struct compiler_unit *u;
Victor Stinnerfc6f2ef2016-02-27 02:19:22 +0100547 basicblock *block;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000548
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000549 u = (struct compiler_unit *)PyObject_Malloc(sizeof(
550 struct compiler_unit));
551 if (!u) {
552 PyErr_NoMemory();
553 return 0;
554 }
555 memset(u, 0, sizeof(struct compiler_unit));
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100556 u->u_scope_type = scope_type;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000557 u->u_argcount = 0;
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100558 u->u_posonlyargcount = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000559 u->u_kwonlyargcount = 0;
560 u->u_ste = PySymtable_Lookup(c->c_st, key);
561 if (!u->u_ste) {
562 compiler_unit_free(u);
563 return 0;
564 }
565 Py_INCREF(name);
566 u->u_name = name;
567 u->u_varnames = list2dict(u->u_ste->ste_varnames);
568 u->u_cellvars = dictbytype(u->u_ste->ste_symbols, CELL, 0, 0);
569 if (!u->u_varnames || !u->u_cellvars) {
570 compiler_unit_free(u);
571 return 0;
572 }
Benjamin Peterson312595c2013-05-15 15:26:42 -0500573 if (u->u_ste->ste_needs_class_closure) {
Martin Panter7462b6492015-11-02 03:37:02 +0000574 /* Cook up an implicit __class__ cell. */
Benjamin Peterson312595c2013-05-15 15:26:42 -0500575 _Py_IDENTIFIER(__class__);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +0300576 PyObject *name;
Benjamin Peterson312595c2013-05-15 15:26:42 -0500577 int res;
578 assert(u->u_scope_type == COMPILER_SCOPE_CLASS);
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +0200579 assert(PyDict_GET_SIZE(u->u_cellvars) == 0);
Benjamin Peterson312595c2013-05-15 15:26:42 -0500580 name = _PyUnicode_FromId(&PyId___class__);
581 if (!name) {
582 compiler_unit_free(u);
583 return 0;
584 }
Serhiy Storchakad70c2a62018-04-20 16:01:25 +0300585 res = PyDict_SetItem(u->u_cellvars, name, _PyLong_Zero);
Benjamin Peterson312595c2013-05-15 15:26:42 -0500586 if (res < 0) {
587 compiler_unit_free(u);
588 return 0;
589 }
590 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000591
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000592 u->u_freevars = dictbytype(u->u_ste->ste_symbols, FREE, DEF_FREE_CLASS,
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +0200593 PyDict_GET_SIZE(u->u_cellvars));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000594 if (!u->u_freevars) {
595 compiler_unit_free(u);
596 return 0;
597 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000598
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000599 u->u_blocks = NULL;
600 u->u_nfblocks = 0;
601 u->u_firstlineno = lineno;
602 u->u_lineno = 0;
Benjamin Petersond4efd9e2010-09-20 23:02:10 +0000603 u->u_col_offset = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000604 u->u_lineno_set = 0;
605 u->u_consts = PyDict_New();
606 if (!u->u_consts) {
607 compiler_unit_free(u);
608 return 0;
609 }
610 u->u_names = PyDict_New();
611 if (!u->u_names) {
612 compiler_unit_free(u);
613 return 0;
614 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000615
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000616 u->u_private = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000617
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000618 /* Push the old compiler_unit on the stack. */
619 if (c->u) {
Benjamin Peterson9e77f722015-05-07 18:41:47 -0400620 PyObject *capsule = PyCapsule_New(c->u, CAPSULE_NAME, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000621 if (!capsule || PyList_Append(c->c_stack, capsule) < 0) {
622 Py_XDECREF(capsule);
623 compiler_unit_free(u);
624 return 0;
625 }
626 Py_DECREF(capsule);
627 u->u_private = c->u->u_private;
628 Py_XINCREF(u->u_private);
629 }
630 c->u = u;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000631
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000632 c->c_nestlevel++;
Victor Stinnerfc6f2ef2016-02-27 02:19:22 +0100633
634 block = compiler_new_block(c);
635 if (block == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000636 return 0;
Victor Stinnerfc6f2ef2016-02-27 02:19:22 +0100637 c->u->u_curblock = block;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000638
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400639 if (u->u_scope_type != COMPILER_SCOPE_MODULE) {
640 if (!compiler_set_qualname(c))
641 return 0;
642 }
643
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000644 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000645}
646
Neil Schemenauerc396d9e2005-10-25 06:30:14 +0000647static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000648compiler_exit_scope(struct compiler *c)
649{
Victor Stinnerad9a0662013-11-19 22:23:20 +0100650 Py_ssize_t n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000651 PyObject *capsule;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000652
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000653 c->c_nestlevel--;
654 compiler_unit_free(c->u);
655 /* Restore c->u to the parent unit. */
656 n = PyList_GET_SIZE(c->c_stack) - 1;
657 if (n >= 0) {
658 capsule = PyList_GET_ITEM(c->c_stack, n);
Benjamin Peterson9e77f722015-05-07 18:41:47 -0400659 c->u = (struct compiler_unit *)PyCapsule_GetPointer(capsule, CAPSULE_NAME);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000660 assert(c->u);
661 /* we are deleting from a list so this really shouldn't fail */
662 if (PySequence_DelItem(c->c_stack, n) < 0)
663 Py_FatalError("compiler_exit_scope()");
664 compiler_unit_check(c->u);
665 }
666 else
667 c->u = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000668
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000669}
670
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400671static int
672compiler_set_qualname(struct compiler *c)
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100673{
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100674 _Py_static_string(dot, ".");
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400675 _Py_static_string(dot_locals, ".<locals>");
676 Py_ssize_t stack_size;
677 struct compiler_unit *u = c->u;
678 PyObject *name, *base, *dot_str, *dot_locals_str;
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100679
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400680 base = NULL;
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100681 stack_size = PyList_GET_SIZE(c->c_stack);
Benjamin Petersona8a38b82013-10-19 16:14:39 -0400682 assert(stack_size >= 1);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400683 if (stack_size > 1) {
684 int scope, force_global = 0;
685 struct compiler_unit *parent;
686 PyObject *mangled, *capsule;
687
Benjamin Peterson3d9e4812013-10-19 16:01:13 -0400688 capsule = PyList_GET_ITEM(c->c_stack, stack_size - 1);
Benjamin Peterson9e77f722015-05-07 18:41:47 -0400689 parent = (struct compiler_unit *)PyCapsule_GetPointer(capsule, CAPSULE_NAME);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400690 assert(parent);
691
Yury Selivanov75445082015-05-11 22:57:16 -0400692 if (u->u_scope_type == COMPILER_SCOPE_FUNCTION
693 || u->u_scope_type == COMPILER_SCOPE_ASYNC_FUNCTION
694 || u->u_scope_type == COMPILER_SCOPE_CLASS) {
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400695 assert(u->u_name);
696 mangled = _Py_Mangle(parent->u_private, u->u_name);
697 if (!mangled)
698 return 0;
699 scope = PyST_GetScope(parent->u_ste, mangled);
700 Py_DECREF(mangled);
701 assert(scope != GLOBAL_IMPLICIT);
702 if (scope == GLOBAL_EXPLICIT)
703 force_global = 1;
704 }
705
706 if (!force_global) {
707 if (parent->u_scope_type == COMPILER_SCOPE_FUNCTION
Yury Selivanov75445082015-05-11 22:57:16 -0400708 || parent->u_scope_type == COMPILER_SCOPE_ASYNC_FUNCTION
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400709 || parent->u_scope_type == COMPILER_SCOPE_LAMBDA) {
710 dot_locals_str = _PyUnicode_FromId(&dot_locals);
711 if (dot_locals_str == NULL)
712 return 0;
713 base = PyUnicode_Concat(parent->u_qualname, dot_locals_str);
714 if (base == NULL)
715 return 0;
716 }
717 else {
718 Py_INCREF(parent->u_qualname);
719 base = parent->u_qualname;
Benjamin Peterson3d9e4812013-10-19 16:01:13 -0400720 }
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100721 }
722 }
Benjamin Peterson3d9e4812013-10-19 16:01:13 -0400723
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400724 if (base != NULL) {
725 dot_str = _PyUnicode_FromId(&dot);
726 if (dot_str == NULL) {
727 Py_DECREF(base);
728 return 0;
729 }
730 name = PyUnicode_Concat(base, dot_str);
731 Py_DECREF(base);
732 if (name == NULL)
733 return 0;
734 PyUnicode_Append(&name, u->u_name);
735 if (name == NULL)
736 return 0;
737 }
738 else {
739 Py_INCREF(u->u_name);
740 name = u->u_name;
741 }
742 u->u_qualname = name;
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100743
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400744 return 1;
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100745}
746
Eric V. Smith235a6f02015-09-19 14:51:32 -0400747
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000748/* Allocate a new block and return a pointer to it.
749 Returns NULL on error.
750*/
751
752static basicblock *
753compiler_new_block(struct compiler *c)
754{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000755 basicblock *b;
756 struct compiler_unit *u;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000757
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000758 u = c->u;
759 b = (basicblock *)PyObject_Malloc(sizeof(basicblock));
760 if (b == NULL) {
761 PyErr_NoMemory();
762 return NULL;
763 }
764 memset((void *)b, 0, sizeof(basicblock));
765 /* Extend the singly linked list of blocks with new block. */
766 b->b_list = u->u_blocks;
767 u->u_blocks = b;
768 return b;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000769}
770
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000771static basicblock *
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000772compiler_next_block(struct compiler *c)
773{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000774 basicblock *block = compiler_new_block(c);
775 if (block == NULL)
776 return NULL;
777 c->u->u_curblock->b_next = block;
778 c->u->u_curblock = block;
779 return block;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000780}
781
782static basicblock *
783compiler_use_next_block(struct compiler *c, basicblock *block)
784{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000785 assert(block != NULL);
786 c->u->u_curblock->b_next = block;
787 c->u->u_curblock = block;
788 return block;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000789}
790
791/* Returns the offset of the next instruction in the current block's
792 b_instr array. Resizes the b_instr as necessary.
793 Returns -1 on failure.
Thomas Wouters89f507f2006-12-13 04:49:30 +0000794*/
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000795
796static int
797compiler_next_instr(struct compiler *c, basicblock *b)
798{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000799 assert(b != NULL);
800 if (b->b_instr == NULL) {
801 b->b_instr = (struct instr *)PyObject_Malloc(
802 sizeof(struct instr) * DEFAULT_BLOCK_SIZE);
803 if (b->b_instr == NULL) {
804 PyErr_NoMemory();
805 return -1;
806 }
807 b->b_ialloc = DEFAULT_BLOCK_SIZE;
808 memset((char *)b->b_instr, 0,
809 sizeof(struct instr) * DEFAULT_BLOCK_SIZE);
810 }
811 else if (b->b_iused == b->b_ialloc) {
812 struct instr *tmp;
813 size_t oldsize, newsize;
814 oldsize = b->b_ialloc * sizeof(struct instr);
815 newsize = oldsize << 1;
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000816
Benjamin Peterson2f8bfef2016-09-07 09:26:18 -0700817 if (oldsize > (SIZE_MAX >> 1)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000818 PyErr_NoMemory();
819 return -1;
820 }
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000821
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000822 if (newsize == 0) {
823 PyErr_NoMemory();
824 return -1;
825 }
826 b->b_ialloc <<= 1;
827 tmp = (struct instr *)PyObject_Realloc(
828 (void *)b->b_instr, newsize);
829 if (tmp == NULL) {
830 PyErr_NoMemory();
831 return -1;
832 }
833 b->b_instr = tmp;
834 memset((char *)b->b_instr + oldsize, 0, newsize - oldsize);
835 }
836 return b->b_iused++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000837}
838
Christian Heimes2202f872008-02-06 14:31:34 +0000839/* Set the i_lineno member of the instruction at offset off if the
840 line number for the current expression/statement has not
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000841 already been set. If it has been set, the call has no effect.
842
Christian Heimes2202f872008-02-06 14:31:34 +0000843 The line number is reset in the following cases:
844 - when entering a new scope
845 - on each statement
846 - on each expression that start a new line
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +0200847 - before the "except" and "finally" clauses
Christian Heimes2202f872008-02-06 14:31:34 +0000848 - before the "for" and "while" expressions
Thomas Wouters89f507f2006-12-13 04:49:30 +0000849*/
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000850
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000851static void
852compiler_set_lineno(struct compiler *c, int off)
853{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000854 basicblock *b;
855 if (c->u->u_lineno_set)
856 return;
857 c->u->u_lineno_set = 1;
858 b = c->u->u_curblock;
859 b->b_instr[off].i_lineno = c->u->u_lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000860}
861
Serhiy Storchakad4864c62018-01-09 21:54:52 +0200862/* Return the stack effect of opcode with argument oparg.
863
864 Some opcodes have different stack effect when jump to the target and
865 when not jump. The 'jump' parameter specifies the case:
866
867 * 0 -- when not jump
868 * 1 -- when jump
869 * -1 -- maximal
870 */
871/* XXX Make the stack effect of WITH_CLEANUP_START and
872 WITH_CLEANUP_FINISH deterministic. */
873static int
874stack_effect(int opcode, int oparg, int jump)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000875{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000876 switch (opcode) {
Serhiy Storchaka57faf342018-04-25 22:04:06 +0300877 case NOP:
878 case EXTENDED_ARG:
879 return 0;
880
Serhiy Storchakad4864c62018-01-09 21:54:52 +0200881 /* Stack manipulation */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000882 case POP_TOP:
883 return -1;
884 case ROT_TWO:
885 case ROT_THREE:
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +0200886 case ROT_FOUR:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000887 return 0;
888 case DUP_TOP:
889 return 1;
Antoine Pitrou74a69fa2010-09-04 18:43:52 +0000890 case DUP_TOP_TWO:
891 return 2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000892
Serhiy Storchakad4864c62018-01-09 21:54:52 +0200893 /* Unary operators */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000894 case UNARY_POSITIVE:
895 case UNARY_NEGATIVE:
896 case UNARY_NOT:
897 case UNARY_INVERT:
898 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000899
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000900 case SET_ADD:
901 case LIST_APPEND:
902 return -1;
903 case MAP_ADD:
904 return -2;
Neal Norwitz10be2ea2006-03-03 20:29:11 +0000905
Serhiy Storchakad4864c62018-01-09 21:54:52 +0200906 /* Binary operators */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000907 case BINARY_POWER:
908 case BINARY_MULTIPLY:
Benjamin Petersond51374e2014-04-09 23:55:56 -0400909 case BINARY_MATRIX_MULTIPLY:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000910 case BINARY_MODULO:
911 case BINARY_ADD:
912 case BINARY_SUBTRACT:
913 case BINARY_SUBSCR:
914 case BINARY_FLOOR_DIVIDE:
915 case BINARY_TRUE_DIVIDE:
916 return -1;
917 case INPLACE_FLOOR_DIVIDE:
918 case INPLACE_TRUE_DIVIDE:
919 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000920
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000921 case INPLACE_ADD:
922 case INPLACE_SUBTRACT:
923 case INPLACE_MULTIPLY:
Benjamin Petersond51374e2014-04-09 23:55:56 -0400924 case INPLACE_MATRIX_MULTIPLY:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000925 case INPLACE_MODULO:
926 return -1;
927 case STORE_SUBSCR:
928 return -3;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000929 case DELETE_SUBSCR:
930 return -2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000931
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000932 case BINARY_LSHIFT:
933 case BINARY_RSHIFT:
934 case BINARY_AND:
935 case BINARY_XOR:
936 case BINARY_OR:
937 return -1;
938 case INPLACE_POWER:
939 return -1;
940 case GET_ITER:
941 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000942
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000943 case PRINT_EXPR:
944 return -1;
945 case LOAD_BUILD_CLASS:
946 return 1;
947 case INPLACE_LSHIFT:
948 case INPLACE_RSHIFT:
949 case INPLACE_AND:
950 case INPLACE_XOR:
951 case INPLACE_OR:
952 return -1;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +0200953
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000954 case SETUP_WITH:
Serhiy Storchakad4864c62018-01-09 21:54:52 +0200955 /* 1 in the normal flow.
956 * Restore the stack position and push 6 values before jumping to
957 * the handler if an exception be raised. */
958 return jump ? 6 : 1;
Yury Selivanov75445082015-05-11 22:57:16 -0400959 case WITH_CLEANUP_START:
Serhiy Storchakad4864c62018-01-09 21:54:52 +0200960 return 2; /* or 1, depending on TOS */
Yury Selivanov75445082015-05-11 22:57:16 -0400961 case WITH_CLEANUP_FINISH:
Serhiy Storchakad4864c62018-01-09 21:54:52 +0200962 /* Pop a variable number of values pushed by WITH_CLEANUP_START
963 * + __exit__ or __aexit__. */
964 return -3;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000965 case RETURN_VALUE:
966 return -1;
967 case IMPORT_STAR:
968 return -1;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -0700969 case SETUP_ANNOTATIONS:
970 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000971 case YIELD_VALUE:
972 return 0;
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -0500973 case YIELD_FROM:
974 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000975 case POP_BLOCK:
976 return 0;
977 case POP_EXCEPT:
Serhiy Storchakad4864c62018-01-09 21:54:52 +0200978 return -3;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000979 case END_FINALLY:
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +0200980 case POP_FINALLY:
Serhiy Storchakad4864c62018-01-09 21:54:52 +0200981 /* Pop 6 values when an exception was raised. */
982 return -6;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000983
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000984 case STORE_NAME:
985 return -1;
986 case DELETE_NAME:
987 return 0;
988 case UNPACK_SEQUENCE:
989 return oparg-1;
990 case UNPACK_EX:
991 return (oparg&0xFF) + (oparg>>8);
992 case FOR_ITER:
Serhiy Storchakad4864c62018-01-09 21:54:52 +0200993 /* -1 at end of iterator, 1 if continue iterating. */
994 return jump > 0 ? -1 : 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000995
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000996 case STORE_ATTR:
997 return -2;
998 case DELETE_ATTR:
999 return -1;
1000 case STORE_GLOBAL:
1001 return -1;
1002 case DELETE_GLOBAL:
1003 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001004 case LOAD_CONST:
1005 return 1;
1006 case LOAD_NAME:
1007 return 1;
1008 case BUILD_TUPLE:
1009 case BUILD_LIST:
1010 case BUILD_SET:
Serhiy Storchakaea525a22016-09-06 22:07:53 +03001011 case BUILD_STRING:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001012 return 1-oparg;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001013 case BUILD_LIST_UNPACK:
1014 case BUILD_TUPLE_UNPACK:
Serhiy Storchaka73442852016-10-02 10:33:46 +03001015 case BUILD_TUPLE_UNPACK_WITH_CALL:
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001016 case BUILD_SET_UNPACK:
1017 case BUILD_MAP_UNPACK:
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001018 case BUILD_MAP_UNPACK_WITH_CALL:
Victor Stinnerf9b760f2016-09-09 10:17:08 -07001019 return 1 - oparg;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001020 case BUILD_MAP:
Benjamin Petersonb6855152015-09-10 21:02:39 -07001021 return 1 - 2*oparg;
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03001022 case BUILD_CONST_KEY_MAP:
1023 return -oparg;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001024 case LOAD_ATTR:
1025 return 0;
1026 case COMPARE_OP:
1027 return -1;
1028 case IMPORT_NAME:
1029 return -1;
1030 case IMPORT_FROM:
1031 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001032
Serhiy Storchakad4864c62018-01-09 21:54:52 +02001033 /* Jumps */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001034 case JUMP_FORWARD:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001035 case JUMP_ABSOLUTE:
1036 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001037
Serhiy Storchakad4864c62018-01-09 21:54:52 +02001038 case JUMP_IF_TRUE_OR_POP:
1039 case JUMP_IF_FALSE_OR_POP:
1040 return jump ? 0 : -1;
1041
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001042 case POP_JUMP_IF_FALSE:
1043 case POP_JUMP_IF_TRUE:
1044 return -1;
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00001045
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001046 case LOAD_GLOBAL:
1047 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001048
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001049 /* Exception handling */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001050 case SETUP_FINALLY:
Serhiy Storchakad4864c62018-01-09 21:54:52 +02001051 /* 0 in the normal flow.
1052 * Restore the stack position and push 6 values before jumping to
1053 * the handler if an exception be raised. */
1054 return jump ? 6 : 0;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001055 case BEGIN_FINALLY:
1056 /* Actually pushes 1 value, but count 6 for balancing with
1057 * END_FINALLY and POP_FINALLY.
1058 * This is the main reason of using this opcode instead of
1059 * "LOAD_CONST None". */
1060 return 6;
1061 case CALL_FINALLY:
1062 return jump ? 1 : 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001063
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001064 case LOAD_FAST:
1065 return 1;
1066 case STORE_FAST:
1067 return -1;
1068 case DELETE_FAST:
1069 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001070
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001071 case RAISE_VARARGS:
1072 return -oparg;
Serhiy Storchakad4864c62018-01-09 21:54:52 +02001073
1074 /* Functions and calls */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001075 case CALL_FUNCTION:
Victor Stinnerf9b760f2016-09-09 10:17:08 -07001076 return -oparg;
Yury Selivanovf2392132016-12-13 19:03:51 -05001077 case CALL_METHOD:
1078 return -oparg-1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001079 case CALL_FUNCTION_KW:
Victor Stinnerf9b760f2016-09-09 10:17:08 -07001080 return -oparg-1;
1081 case CALL_FUNCTION_EX:
Matthieu Dartiailh3a9ac822017-02-21 14:25:22 +01001082 return -1 - ((oparg & 0x01) != 0);
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001083 case MAKE_FUNCTION:
1084 return -1 - ((oparg & 0x01) != 0) - ((oparg & 0x02) != 0) -
1085 ((oparg & 0x04) != 0) - ((oparg & 0x08) != 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001086 case BUILD_SLICE:
1087 if (oparg == 3)
1088 return -2;
1089 else
1090 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001091
Serhiy Storchakad4864c62018-01-09 21:54:52 +02001092 /* Closures */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001093 case LOAD_CLOSURE:
1094 return 1;
1095 case LOAD_DEREF:
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04001096 case LOAD_CLASSDEREF:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001097 return 1;
1098 case STORE_DEREF:
1099 return -1;
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00001100 case DELETE_DEREF:
1101 return 0;
Serhiy Storchakad4864c62018-01-09 21:54:52 +02001102
1103 /* Iterators and generators */
Yury Selivanov75445082015-05-11 22:57:16 -04001104 case GET_AWAITABLE:
1105 return 0;
1106 case SETUP_ASYNC_WITH:
Serhiy Storchakad4864c62018-01-09 21:54:52 +02001107 /* 0 in the normal flow.
1108 * Restore the stack position to the position before the result
1109 * of __aenter__ and push 6 values before jumping to the handler
1110 * if an exception be raised. */
1111 return jump ? -1 + 6 : 0;
Yury Selivanov75445082015-05-11 22:57:16 -04001112 case BEFORE_ASYNC_WITH:
1113 return 1;
1114 case GET_AITER:
1115 return 0;
1116 case GET_ANEXT:
1117 return 1;
Yury Selivanov5376ba92015-06-22 12:19:30 -04001118 case GET_YIELD_FROM_ITER:
1119 return 0;
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02001120 case END_ASYNC_FOR:
1121 return -7;
Eric V. Smitha78c7952015-11-03 12:45:05 -05001122 case FORMAT_VALUE:
1123 /* If there's a fmt_spec on the stack, we go from 2->1,
1124 else 1->1. */
1125 return (oparg & FVS_MASK) == FVS_HAVE_SPEC ? -1 : 0;
Yury Selivanovf2392132016-12-13 19:03:51 -05001126 case LOAD_METHOD:
1127 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001128 default:
Larry Hastings3a907972013-11-23 14:49:22 -08001129 return PY_INVALID_STACK_EFFECT;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001130 }
Larry Hastings3a907972013-11-23 14:49:22 -08001131 return PY_INVALID_STACK_EFFECT; /* not reachable */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001132}
1133
Serhiy Storchakad4864c62018-01-09 21:54:52 +02001134int
Serhiy Storchaka7bdf2822018-09-18 09:54:26 +03001135PyCompile_OpcodeStackEffectWithJump(int opcode, int oparg, int jump)
1136{
1137 return stack_effect(opcode, oparg, jump);
1138}
1139
1140int
Serhiy Storchakad4864c62018-01-09 21:54:52 +02001141PyCompile_OpcodeStackEffect(int opcode, int oparg)
1142{
1143 return stack_effect(opcode, oparg, -1);
1144}
1145
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001146/* Add an opcode with no argument.
1147 Returns 0 on failure, 1 on success.
1148*/
1149
1150static int
1151compiler_addop(struct compiler *c, int opcode)
1152{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001153 basicblock *b;
1154 struct instr *i;
1155 int off;
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001156 assert(!HAS_ARG(opcode));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001157 off = compiler_next_instr(c, c->u->u_curblock);
1158 if (off < 0)
1159 return 0;
1160 b = c->u->u_curblock;
1161 i = &b->b_instr[off];
1162 i->i_opcode = opcode;
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001163 i->i_oparg = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001164 if (opcode == RETURN_VALUE)
1165 b->b_return = 1;
1166 compiler_set_lineno(c, off);
1167 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001168}
1169
Victor Stinnerf8e32212013-11-19 23:56:34 +01001170static Py_ssize_t
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001171compiler_add_o(struct compiler *c, PyObject *dict, PyObject *o)
1172{
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001173 PyObject *v;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001174 Py_ssize_t arg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001175
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001176 v = PyDict_GetItemWithError(dict, o);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001177 if (!v) {
Stefan Krahc0cbed12015-07-27 12:56:49 +02001178 if (PyErr_Occurred()) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001179 return -1;
Stefan Krahc0cbed12015-07-27 12:56:49 +02001180 }
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +02001181 arg = PyDict_GET_SIZE(dict);
Victor Stinnerad9a0662013-11-19 22:23:20 +01001182 v = PyLong_FromSsize_t(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001183 if (!v) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001184 return -1;
1185 }
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001186 if (PyDict_SetItem(dict, o, v) < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001187 Py_DECREF(v);
1188 return -1;
1189 }
1190 Py_DECREF(v);
1191 }
1192 else
1193 arg = PyLong_AsLong(v);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001194 return arg;
1195}
1196
INADA Naokic2e16072018-11-26 21:23:22 +09001197// Merge const *o* recursively and return constant key object.
1198static PyObject*
1199merge_consts_recursive(struct compiler *c, PyObject *o)
1200{
1201 // None and Ellipsis are singleton, and key is the singleton.
1202 // No need to merge object and key.
1203 if (o == Py_None || o == Py_Ellipsis) {
1204 Py_INCREF(o);
1205 return o;
1206 }
1207
1208 PyObject *key = _PyCode_ConstantKey(o);
1209 if (key == NULL) {
1210 return NULL;
1211 }
1212
1213 // t is borrowed reference
1214 PyObject *t = PyDict_SetDefault(c->c_const_cache, key, key);
1215 if (t != key) {
INADA Naokif7e4d362018-11-29 00:58:46 +09001216 // o is registered in c_const_cache. Just use it.
Zackery Spytz9b4a1b12019-03-20 03:16:25 -06001217 Py_XINCREF(t);
INADA Naokic2e16072018-11-26 21:23:22 +09001218 Py_DECREF(key);
1219 return t;
1220 }
1221
INADA Naokif7e4d362018-11-29 00:58:46 +09001222 // We registered o in c_const_cache.
Simeon63b5fc52019-04-09 19:36:57 -04001223 // When o is a tuple or frozenset, we want to merge its
INADA Naokif7e4d362018-11-29 00:58:46 +09001224 // items too.
INADA Naokic2e16072018-11-26 21:23:22 +09001225 if (PyTuple_CheckExact(o)) {
INADA Naokif7e4d362018-11-29 00:58:46 +09001226 Py_ssize_t len = PyTuple_GET_SIZE(o);
1227 for (Py_ssize_t i = 0; i < len; i++) {
INADA Naokic2e16072018-11-26 21:23:22 +09001228 PyObject *item = PyTuple_GET_ITEM(o, i);
1229 PyObject *u = merge_consts_recursive(c, item);
1230 if (u == NULL) {
1231 Py_DECREF(key);
1232 return NULL;
1233 }
1234
1235 // See _PyCode_ConstantKey()
1236 PyObject *v; // borrowed
1237 if (PyTuple_CheckExact(u)) {
1238 v = PyTuple_GET_ITEM(u, 1);
1239 }
1240 else {
1241 v = u;
1242 }
1243 if (v != item) {
1244 Py_INCREF(v);
1245 PyTuple_SET_ITEM(o, i, v);
1246 Py_DECREF(item);
1247 }
1248
1249 Py_DECREF(u);
1250 }
1251 }
INADA Naokif7e4d362018-11-29 00:58:46 +09001252 else if (PyFrozenSet_CheckExact(o)) {
Simeon63b5fc52019-04-09 19:36:57 -04001253 // *key* is tuple. And its first item is frozenset of
INADA Naokif7e4d362018-11-29 00:58:46 +09001254 // constant keys.
1255 // See _PyCode_ConstantKey() for detail.
1256 assert(PyTuple_CheckExact(key));
1257 assert(PyTuple_GET_SIZE(key) == 2);
1258
1259 Py_ssize_t len = PySet_GET_SIZE(o);
1260 if (len == 0) { // empty frozenset should not be re-created.
1261 return key;
1262 }
1263 PyObject *tuple = PyTuple_New(len);
1264 if (tuple == NULL) {
1265 Py_DECREF(key);
1266 return NULL;
1267 }
1268 Py_ssize_t i = 0, pos = 0;
1269 PyObject *item;
1270 Py_hash_t hash;
1271 while (_PySet_NextEntry(o, &pos, &item, &hash)) {
1272 PyObject *k = merge_consts_recursive(c, item);
1273 if (k == NULL) {
1274 Py_DECREF(tuple);
1275 Py_DECREF(key);
1276 return NULL;
1277 }
1278 PyObject *u;
1279 if (PyTuple_CheckExact(k)) {
1280 u = PyTuple_GET_ITEM(k, 1);
1281 Py_INCREF(u);
1282 Py_DECREF(k);
1283 }
1284 else {
1285 u = k;
1286 }
1287 PyTuple_SET_ITEM(tuple, i, u); // Steals reference of u.
1288 i++;
1289 }
1290
1291 // Instead of rewriting o, we create new frozenset and embed in the
1292 // key tuple. Caller should get merged frozenset from the key tuple.
1293 PyObject *new = PyFrozenSet_New(tuple);
1294 Py_DECREF(tuple);
1295 if (new == NULL) {
1296 Py_DECREF(key);
1297 return NULL;
1298 }
1299 assert(PyTuple_GET_ITEM(key, 1) == o);
1300 Py_DECREF(o);
1301 PyTuple_SET_ITEM(key, 1, new);
1302 }
INADA Naokic2e16072018-11-26 21:23:22 +09001303
1304 return key;
1305}
1306
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001307static Py_ssize_t
1308compiler_add_const(struct compiler *c, PyObject *o)
1309{
INADA Naokic2e16072018-11-26 21:23:22 +09001310 PyObject *key = merge_consts_recursive(c, o);
1311 if (key == NULL) {
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001312 return -1;
INADA Naokic2e16072018-11-26 21:23:22 +09001313 }
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001314
INADA Naokic2e16072018-11-26 21:23:22 +09001315 Py_ssize_t arg = compiler_add_o(c, c->u->u_consts, key);
1316 Py_DECREF(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001317 return arg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001318}
1319
1320static int
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001321compiler_addop_load_const(struct compiler *c, PyObject *o)
1322{
1323 Py_ssize_t arg = compiler_add_const(c, o);
1324 if (arg < 0)
1325 return 0;
1326 return compiler_addop_i(c, LOAD_CONST, arg);
1327}
1328
1329static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001330compiler_addop_o(struct compiler *c, int opcode, PyObject *dict,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001331 PyObject *o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001332{
Victor Stinnerad9a0662013-11-19 22:23:20 +01001333 Py_ssize_t arg = compiler_add_o(c, dict, o);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001334 if (arg < 0)
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00001335 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001336 return compiler_addop_i(c, opcode, arg);
1337}
1338
1339static int
1340compiler_addop_name(struct compiler *c, int opcode, PyObject *dict,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001341 PyObject *o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001342{
Victor Stinnerad9a0662013-11-19 22:23:20 +01001343 Py_ssize_t arg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001344 PyObject *mangled = _Py_Mangle(c->u->u_private, o);
1345 if (!mangled)
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00001346 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001347 arg = compiler_add_o(c, dict, mangled);
1348 Py_DECREF(mangled);
1349 if (arg < 0)
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00001350 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001351 return compiler_addop_i(c, opcode, arg);
1352}
1353
1354/* Add an opcode with an integer argument.
1355 Returns 0 on failure, 1 on success.
1356*/
1357
1358static int
Victor Stinnerf8e32212013-11-19 23:56:34 +01001359compiler_addop_i(struct compiler *c, int opcode, Py_ssize_t oparg)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001360{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001361 struct instr *i;
1362 int off;
Victor Stinnerad9a0662013-11-19 22:23:20 +01001363
Victor Stinner2ad474b2016-03-01 23:34:47 +01001364 /* oparg value is unsigned, but a signed C int is usually used to store
1365 it in the C code (like Python/ceval.c).
1366
1367 Limit to 32-bit signed C int (rather than INT_MAX) for portability.
1368
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001369 The argument of a concrete bytecode instruction is limited to 8-bit.
1370 EXTENDED_ARG is used for 16, 24, and 32-bit arguments. */
1371 assert(HAS_ARG(opcode));
Victor Stinner2ad474b2016-03-01 23:34:47 +01001372 assert(0 <= oparg && oparg <= 2147483647);
Victor Stinnerad9a0662013-11-19 22:23:20 +01001373
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001374 off = compiler_next_instr(c, c->u->u_curblock);
1375 if (off < 0)
1376 return 0;
1377 i = &c->u->u_curblock->b_instr[off];
Victor Stinnerf8e32212013-11-19 23:56:34 +01001378 i->i_opcode = opcode;
1379 i->i_oparg = Py_SAFE_DOWNCAST(oparg, Py_ssize_t, int);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001380 compiler_set_lineno(c, off);
1381 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001382}
1383
1384static int
1385compiler_addop_j(struct compiler *c, int opcode, basicblock *b, int absolute)
1386{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001387 struct instr *i;
1388 int off;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001389
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001390 assert(HAS_ARG(opcode));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001391 assert(b != NULL);
1392 off = compiler_next_instr(c, c->u->u_curblock);
1393 if (off < 0)
1394 return 0;
1395 i = &c->u->u_curblock->b_instr[off];
1396 i->i_opcode = opcode;
1397 i->i_target = b;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001398 if (absolute)
1399 i->i_jabs = 1;
1400 else
1401 i->i_jrel = 1;
1402 compiler_set_lineno(c, off);
1403 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001404}
1405
Victor Stinnerfc6f2ef2016-02-27 02:19:22 +01001406/* NEXT_BLOCK() creates an implicit jump from the current block
1407 to the new block.
1408
1409 The returns inside this macro make it impossible to decref objects
1410 created in the local function. Local objects should use the arena.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001411*/
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001412#define NEXT_BLOCK(C) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001413 if (compiler_next_block((C)) == NULL) \
1414 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001415}
1416
1417#define ADDOP(C, OP) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001418 if (!compiler_addop((C), (OP))) \
1419 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001420}
1421
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001422#define ADDOP_IN_SCOPE(C, OP) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001423 if (!compiler_addop((C), (OP))) { \
1424 compiler_exit_scope(c); \
1425 return 0; \
1426 } \
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001427}
1428
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001429#define ADDOP_LOAD_CONST(C, O) { \
1430 if (!compiler_addop_load_const((C), (O))) \
1431 return 0; \
1432}
1433
1434/* Same as ADDOP_LOAD_CONST, but steals a reference. */
1435#define ADDOP_LOAD_CONST_NEW(C, O) { \
1436 PyObject *__new_const = (O); \
1437 if (__new_const == NULL) { \
1438 return 0; \
1439 } \
1440 if (!compiler_addop_load_const((C), __new_const)) { \
1441 Py_DECREF(__new_const); \
1442 return 0; \
1443 } \
1444 Py_DECREF(__new_const); \
1445}
1446
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001447#define ADDOP_O(C, OP, O, TYPE) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001448 if (!compiler_addop_o((C), (OP), (C)->u->u_ ## TYPE, (O))) \
1449 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001450}
1451
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03001452/* Same as ADDOP_O, but steals a reference. */
1453#define ADDOP_N(C, OP, O, TYPE) { \
1454 if (!compiler_addop_o((C), (OP), (C)->u->u_ ## TYPE, (O))) { \
1455 Py_DECREF((O)); \
1456 return 0; \
1457 } \
1458 Py_DECREF((O)); \
1459}
1460
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001461#define ADDOP_NAME(C, OP, O, TYPE) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001462 if (!compiler_addop_name((C), (OP), (C)->u->u_ ## TYPE, (O))) \
1463 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001464}
1465
1466#define ADDOP_I(C, OP, O) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001467 if (!compiler_addop_i((C), (OP), (O))) \
1468 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001469}
1470
1471#define ADDOP_JABS(C, OP, O) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001472 if (!compiler_addop_j((C), (OP), (O), 1)) \
1473 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001474}
1475
1476#define ADDOP_JREL(C, OP, O) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001477 if (!compiler_addop_j((C), (OP), (O), 0)) \
1478 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001479}
1480
1481/* VISIT and VISIT_SEQ takes an ASDL type as their second argument. They use
1482 the ASDL name to synthesize the name of the C type and the visit function.
1483*/
1484
1485#define VISIT(C, TYPE, V) {\
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001486 if (!compiler_visit_ ## TYPE((C), (V))) \
1487 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001488}
1489
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001490#define VISIT_IN_SCOPE(C, TYPE, V) {\
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001491 if (!compiler_visit_ ## TYPE((C), (V))) { \
1492 compiler_exit_scope(c); \
1493 return 0; \
1494 } \
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001495}
1496
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001497#define VISIT_SLICE(C, V, CTX) {\
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001498 if (!compiler_visit_slice((C), (V), (CTX))) \
1499 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001500}
1501
1502#define VISIT_SEQ(C, TYPE, SEQ) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001503 int _i; \
1504 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
1505 for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \
1506 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \
1507 if (!compiler_visit_ ## TYPE((C), elt)) \
1508 return 0; \
1509 } \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001510}
1511
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001512#define VISIT_SEQ_IN_SCOPE(C, TYPE, SEQ) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001513 int _i; \
1514 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
1515 for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \
1516 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \
1517 if (!compiler_visit_ ## TYPE((C), elt)) { \
1518 compiler_exit_scope(c); \
1519 return 0; \
1520 } \
1521 } \
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001522}
1523
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001524/* Search if variable annotations are present statically in a block. */
1525
1526static int
1527find_ann(asdl_seq *stmts)
1528{
1529 int i, j, res = 0;
1530 stmt_ty st;
1531
1532 for (i = 0; i < asdl_seq_LEN(stmts); i++) {
1533 st = (stmt_ty)asdl_seq_GET(stmts, i);
1534 switch (st->kind) {
1535 case AnnAssign_kind:
1536 return 1;
1537 case For_kind:
1538 res = find_ann(st->v.For.body) ||
1539 find_ann(st->v.For.orelse);
1540 break;
1541 case AsyncFor_kind:
1542 res = find_ann(st->v.AsyncFor.body) ||
1543 find_ann(st->v.AsyncFor.orelse);
1544 break;
1545 case While_kind:
1546 res = find_ann(st->v.While.body) ||
1547 find_ann(st->v.While.orelse);
1548 break;
1549 case If_kind:
1550 res = find_ann(st->v.If.body) ||
1551 find_ann(st->v.If.orelse);
1552 break;
1553 case With_kind:
1554 res = find_ann(st->v.With.body);
1555 break;
1556 case AsyncWith_kind:
1557 res = find_ann(st->v.AsyncWith.body);
1558 break;
1559 case Try_kind:
1560 for (j = 0; j < asdl_seq_LEN(st->v.Try.handlers); j++) {
1561 excepthandler_ty handler = (excepthandler_ty)asdl_seq_GET(
1562 st->v.Try.handlers, j);
1563 if (find_ann(handler->v.ExceptHandler.body)) {
1564 return 1;
1565 }
1566 }
1567 res = find_ann(st->v.Try.body) ||
1568 find_ann(st->v.Try.finalbody) ||
1569 find_ann(st->v.Try.orelse);
1570 break;
1571 default:
1572 res = 0;
1573 }
1574 if (res) {
1575 break;
1576 }
1577 }
1578 return res;
1579}
1580
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001581/*
1582 * Frame block handling functions
1583 */
1584
1585static int
1586compiler_push_fblock(struct compiler *c, enum fblocktype t, basicblock *b,
1587 basicblock *exit)
1588{
1589 struct fblockinfo *f;
1590 if (c->u->u_nfblocks >= CO_MAXBLOCKS) {
1591 PyErr_SetString(PyExc_SyntaxError,
1592 "too many statically nested blocks");
1593 return 0;
1594 }
1595 f = &c->u->u_fblock[c->u->u_nfblocks++];
1596 f->fb_type = t;
1597 f->fb_block = b;
1598 f->fb_exit = exit;
1599 return 1;
1600}
1601
1602static void
1603compiler_pop_fblock(struct compiler *c, enum fblocktype t, basicblock *b)
1604{
1605 struct compiler_unit *u = c->u;
1606 assert(u->u_nfblocks > 0);
1607 u->u_nfblocks--;
1608 assert(u->u_fblock[u->u_nfblocks].fb_type == t);
1609 assert(u->u_fblock[u->u_nfblocks].fb_block == b);
1610}
1611
1612/* Unwind a frame block. If preserve_tos is true, the TOS before
1613 * popping the blocks will be restored afterwards.
1614 */
1615static int
1616compiler_unwind_fblock(struct compiler *c, struct fblockinfo *info,
1617 int preserve_tos)
1618{
1619 switch (info->fb_type) {
1620 case WHILE_LOOP:
1621 return 1;
1622
1623 case FINALLY_END:
1624 ADDOP_I(c, POP_FINALLY, preserve_tos);
1625 return 1;
1626
1627 case FOR_LOOP:
1628 /* Pop the iterator */
1629 if (preserve_tos) {
1630 ADDOP(c, ROT_TWO);
1631 }
1632 ADDOP(c, POP_TOP);
1633 return 1;
1634
1635 case EXCEPT:
1636 ADDOP(c, POP_BLOCK);
1637 return 1;
1638
1639 case FINALLY_TRY:
1640 ADDOP(c, POP_BLOCK);
1641 ADDOP_JREL(c, CALL_FINALLY, info->fb_exit);
1642 return 1;
1643
1644 case WITH:
1645 case ASYNC_WITH:
1646 ADDOP(c, POP_BLOCK);
1647 if (preserve_tos) {
1648 ADDOP(c, ROT_TWO);
1649 }
1650 ADDOP(c, BEGIN_FINALLY);
1651 ADDOP(c, WITH_CLEANUP_START);
1652 if (info->fb_type == ASYNC_WITH) {
1653 ADDOP(c, GET_AWAITABLE);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001654 ADDOP_LOAD_CONST(c, Py_None);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02001655 ADDOP(c, YIELD_FROM);
1656 }
1657 ADDOP(c, WITH_CLEANUP_FINISH);
1658 ADDOP_I(c, POP_FINALLY, 0);
1659 return 1;
1660
1661 case HANDLER_CLEANUP:
1662 if (preserve_tos) {
1663 ADDOP(c, ROT_FOUR);
1664 }
1665 if (info->fb_exit) {
1666 ADDOP(c, POP_BLOCK);
1667 ADDOP(c, POP_EXCEPT);
1668 ADDOP_JREL(c, CALL_FINALLY, info->fb_exit);
1669 }
1670 else {
1671 ADDOP(c, POP_EXCEPT);
1672 }
1673 return 1;
1674 }
1675 Py_UNREACHABLE();
1676}
1677
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001678/* Compile a sequence of statements, checking for a docstring
1679 and for annotations. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001680
1681static int
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001682compiler_body(struct compiler *c, asdl_seq *stmts)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001683{
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001684 int i = 0;
1685 stmt_ty st;
Serhiy Storchaka143ce5c2018-05-30 10:56:16 +03001686 PyObject *docstring;
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001687
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001688 /* Set current line number to the line number of first statement.
1689 This way line number for SETUP_ANNOTATIONS will always
1690 coincide with the line number of first "real" statement in module.
1691 If body is empy, then lineno will be set later in assemble. */
1692 if (c->u->u_scope_type == COMPILER_SCOPE_MODULE &&
1693 !c->u->u_lineno && asdl_seq_LEN(stmts)) {
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001694 st = (stmt_ty)asdl_seq_GET(stmts, 0);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001695 c->u->u_lineno = st->lineno;
1696 }
1697 /* Every annotated class and module should have __annotations__. */
1698 if (find_ann(stmts)) {
1699 ADDOP(c, SETUP_ANNOTATIONS);
1700 }
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001701 if (!asdl_seq_LEN(stmts))
1702 return 1;
INADA Naokicb41b272017-02-23 00:31:59 +09001703 /* if not -OO mode, set docstring */
Serhiy Storchaka143ce5c2018-05-30 10:56:16 +03001704 if (c->c_optimize < 2) {
1705 docstring = _PyAST_GetDocString(stmts);
1706 if (docstring) {
1707 i = 1;
1708 st = (stmt_ty)asdl_seq_GET(stmts, 0);
1709 assert(st->kind == Expr_kind);
1710 VISIT(c, expr, st->v.Expr.value);
1711 if (!compiler_nameop(c, __doc__, Store))
1712 return 0;
1713 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001714 }
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001715 for (; i < asdl_seq_LEN(stmts); i++)
1716 VISIT(c, stmt, (stmt_ty)asdl_seq_GET(stmts, i));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001717 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001718}
1719
1720static PyCodeObject *
1721compiler_mod(struct compiler *c, mod_ty mod)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001722{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001723 PyCodeObject *co;
1724 int addNone = 1;
1725 static PyObject *module;
1726 if (!module) {
1727 module = PyUnicode_InternFromString("<module>");
1728 if (!module)
1729 return NULL;
1730 }
1731 /* Use 0 for firstlineno initially, will fixup in assemble(). */
Antoine Pitrou86a36b52011-11-25 18:56:07 +01001732 if (!compiler_enter_scope(c, module, COMPILER_SCOPE_MODULE, mod, 0))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001733 return NULL;
1734 switch (mod->kind) {
1735 case Module_kind:
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001736 if (!compiler_body(c, mod->v.Module.body)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001737 compiler_exit_scope(c);
1738 return 0;
1739 }
1740 break;
1741 case Interactive_kind:
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001742 if (find_ann(mod->v.Interactive.body)) {
1743 ADDOP(c, SETUP_ANNOTATIONS);
1744 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001745 c->c_interactive = 1;
1746 VISIT_SEQ_IN_SCOPE(c, stmt,
1747 mod->v.Interactive.body);
1748 break;
1749 case Expression_kind:
1750 VISIT_IN_SCOPE(c, expr, mod->v.Expression.body);
1751 addNone = 0;
1752 break;
1753 case Suite_kind:
1754 PyErr_SetString(PyExc_SystemError,
1755 "suite should not be possible");
1756 return 0;
1757 default:
1758 PyErr_Format(PyExc_SystemError,
1759 "module kind %d should not be possible",
1760 mod->kind);
1761 return 0;
1762 }
1763 co = assemble(c, addNone);
1764 compiler_exit_scope(c);
1765 return co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001766}
1767
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001768/* The test for LOCAL must come before the test for FREE in order to
1769 handle classes where name is both local and free. The local var is
1770 a method and the free var is a free var referenced within a method.
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001771*/
1772
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001773static int
1774get_ref_type(struct compiler *c, PyObject *name)
1775{
Victor Stinner0b1bc562013-05-16 22:17:17 +02001776 int scope;
Benjamin Peterson312595c2013-05-15 15:26:42 -05001777 if (c->u->u_scope_type == COMPILER_SCOPE_CLASS &&
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02001778 _PyUnicode_EqualToASCIIString(name, "__class__"))
Benjamin Peterson312595c2013-05-15 15:26:42 -05001779 return CELL;
Victor Stinner0b1bc562013-05-16 22:17:17 +02001780 scope = PyST_GetScope(c->u->u_ste, name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001781 if (scope == 0) {
1782 char buf[350];
1783 PyOS_snprintf(buf, sizeof(buf),
Victor Stinner14e461d2013-08-26 22:28:21 +02001784 "unknown scope for %.100s in %.100s(%s)\n"
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001785 "symbols: %s\nlocals: %s\nglobals: %s",
Serhiy Storchakadf4518c2014-11-18 23:34:33 +02001786 PyUnicode_AsUTF8(name),
1787 PyUnicode_AsUTF8(c->u->u_name),
1788 PyUnicode_AsUTF8(PyObject_Repr(c->u->u_ste->ste_id)),
1789 PyUnicode_AsUTF8(PyObject_Repr(c->u->u_ste->ste_symbols)),
1790 PyUnicode_AsUTF8(PyObject_Repr(c->u->u_varnames)),
1791 PyUnicode_AsUTF8(PyObject_Repr(c->u->u_names))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001792 );
1793 Py_FatalError(buf);
1794 }
Tim Peters2a7f3842001-06-09 09:26:21 +00001795
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001796 return scope;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001797}
1798
1799static int
1800compiler_lookup_arg(PyObject *dict, PyObject *name)
1801{
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001802 PyObject *v;
1803 v = PyDict_GetItem(dict, name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001804 if (v == NULL)
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00001805 return -1;
Christian Heimes217cfd12007-12-02 14:31:20 +00001806 return PyLong_AS_LONG(v);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001807}
1808
1809static int
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001810compiler_make_closure(struct compiler *c, PyCodeObject *co, Py_ssize_t flags, PyObject *qualname)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001811{
Victor Stinnerad9a0662013-11-19 22:23:20 +01001812 Py_ssize_t i, free = PyCode_GetNumFree(co);
Antoine Pitrou86a36b52011-11-25 18:56:07 +01001813 if (qualname == NULL)
1814 qualname = co->co_name;
1815
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001816 if (free) {
1817 for (i = 0; i < free; ++i) {
1818 /* Bypass com_addop_varname because it will generate
1819 LOAD_DEREF but LOAD_CLOSURE is needed.
1820 */
1821 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
1822 int arg, reftype;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001823
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001824 /* Special case: If a class contains a method with a
1825 free variable that has the same name as a method,
1826 the name will be considered free *and* local in the
1827 class. It should be handled by the closure, as
1828 well as by the normal name loookup logic.
1829 */
1830 reftype = get_ref_type(c, name);
1831 if (reftype == CELL)
1832 arg = compiler_lookup_arg(c->u->u_cellvars, name);
1833 else /* (reftype == FREE) */
1834 arg = compiler_lookup_arg(c->u->u_freevars, name);
1835 if (arg == -1) {
1836 fprintf(stderr,
1837 "lookup %s in %s %d %d\n"
1838 "freevars of %s: %s\n",
1839 PyUnicode_AsUTF8(PyObject_Repr(name)),
1840 PyUnicode_AsUTF8(c->u->u_name),
1841 reftype, arg,
1842 PyUnicode_AsUTF8(co->co_name),
1843 PyUnicode_AsUTF8(PyObject_Repr(co->co_freevars)));
1844 Py_FatalError("compiler_make_closure()");
1845 }
1846 ADDOP_I(c, LOAD_CLOSURE, arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001847 }
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001848 flags |= 0x08;
1849 ADDOP_I(c, BUILD_TUPLE, free);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001850 }
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001851 ADDOP_LOAD_CONST(c, (PyObject*)co);
1852 ADDOP_LOAD_CONST(c, qualname);
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001853 ADDOP_I(c, MAKE_FUNCTION, flags);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001854 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001855}
1856
1857static int
1858compiler_decorators(struct compiler *c, asdl_seq* decos)
1859{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001860 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001861
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001862 if (!decos)
1863 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001864
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001865 for (i = 0; i < asdl_seq_LEN(decos); i++) {
1866 VISIT(c, expr, (expr_ty)asdl_seq_GET(decos, i));
1867 }
1868 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001869}
1870
1871static int
Guido van Rossum4f72a782006-10-27 23:31:49 +00001872compiler_visit_kwonlydefaults(struct compiler *c, asdl_seq *kwonlyargs,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001873 asdl_seq *kw_defaults)
Guido van Rossum4f72a782006-10-27 23:31:49 +00001874{
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03001875 /* Push a dict of keyword-only default values.
1876
1877 Return 0 on error, -1 if no dict pushed, 1 if a dict is pushed.
1878 */
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001879 int i;
1880 PyObject *keys = NULL;
1881
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001882 for (i = 0; i < asdl_seq_LEN(kwonlyargs); i++) {
1883 arg_ty arg = asdl_seq_GET(kwonlyargs, i);
1884 expr_ty default_ = asdl_seq_GET(kw_defaults, i);
1885 if (default_) {
Benjamin Peterson32c59b62012-04-17 19:53:21 -04001886 PyObject *mangled = _Py_Mangle(c->u->u_private, arg->arg);
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001887 if (!mangled) {
1888 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001889 }
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001890 if (keys == NULL) {
1891 keys = PyList_New(1);
1892 if (keys == NULL) {
1893 Py_DECREF(mangled);
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03001894 return 0;
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001895 }
1896 PyList_SET_ITEM(keys, 0, mangled);
1897 }
1898 else {
1899 int res = PyList_Append(keys, mangled);
1900 Py_DECREF(mangled);
1901 if (res == -1) {
1902 goto error;
1903 }
1904 }
1905 if (!compiler_visit_expr(c, default_)) {
1906 goto error;
1907 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001908 }
1909 }
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001910 if (keys != NULL) {
1911 Py_ssize_t default_count = PyList_GET_SIZE(keys);
1912 PyObject *keys_tuple = PyList_AsTuple(keys);
1913 Py_DECREF(keys);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03001914 ADDOP_LOAD_CONST_NEW(c, keys_tuple);
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001915 ADDOP_I(c, BUILD_CONST_KEY_MAP, default_count);
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03001916 assert(default_count > 0);
1917 return 1;
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001918 }
1919 else {
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03001920 return -1;
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001921 }
1922
1923error:
1924 Py_XDECREF(keys);
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03001925 return 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001926}
1927
1928static int
Guido van Rossum95e4d582018-01-26 08:20:18 -08001929compiler_visit_annexpr(struct compiler *c, expr_ty annotation)
1930{
Serhiy Storchaka64fddc42018-05-17 06:17:48 +03001931 ADDOP_LOAD_CONST_NEW(c, _PyAST_ExprAsUnicode(annotation));
Guido van Rossum95e4d582018-01-26 08:20:18 -08001932 return 1;
1933}
1934
1935static int
Neal Norwitzc1505362006-12-28 06:47:50 +00001936compiler_visit_argannotation(struct compiler *c, identifier id,
1937 expr_ty annotation, PyObject *names)
1938{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001939 if (annotation) {
Victor Stinner065efc32014-02-18 22:07:56 +01001940 PyObject *mangled;
Guido van Rossum95e4d582018-01-26 08:20:18 -08001941 if (c->c_future->ff_features & CO_FUTURE_ANNOTATIONS) {
1942 VISIT(c, annexpr, annotation)
1943 }
1944 else {
1945 VISIT(c, expr, annotation);
1946 }
Victor Stinner065efc32014-02-18 22:07:56 +01001947 mangled = _Py_Mangle(c->u->u_private, id);
Yury Selivanov34ce99f2014-02-18 12:49:41 -05001948 if (!mangled)
Yury Selivanovf315c1c2015-07-23 09:10:44 +03001949 return 0;
Yury Selivanov34ce99f2014-02-18 12:49:41 -05001950 if (PyList_Append(names, mangled) < 0) {
1951 Py_DECREF(mangled);
Yury Selivanovf315c1c2015-07-23 09:10:44 +03001952 return 0;
Yury Selivanov34ce99f2014-02-18 12:49:41 -05001953 }
1954 Py_DECREF(mangled);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001955 }
Yury Selivanovf315c1c2015-07-23 09:10:44 +03001956 return 1;
Neal Norwitzc1505362006-12-28 06:47:50 +00001957}
1958
1959static int
1960compiler_visit_argannotations(struct compiler *c, asdl_seq* args,
1961 PyObject *names)
1962{
Yury Selivanovf315c1c2015-07-23 09:10:44 +03001963 int i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001964 for (i = 0; i < asdl_seq_LEN(args); i++) {
1965 arg_ty arg = (arg_ty)asdl_seq_GET(args, i);
Yury Selivanovf315c1c2015-07-23 09:10:44 +03001966 if (!compiler_visit_argannotation(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001967 c,
1968 arg->arg,
1969 arg->annotation,
Yury Selivanovf315c1c2015-07-23 09:10:44 +03001970 names))
1971 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001972 }
Yury Selivanovf315c1c2015-07-23 09:10:44 +03001973 return 1;
Neal Norwitzc1505362006-12-28 06:47:50 +00001974}
1975
1976static int
1977compiler_visit_annotations(struct compiler *c, arguments_ty args,
1978 expr_ty returns)
1979{
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03001980 /* Push arg annotation dict.
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001981 The expressions are evaluated out-of-order wrt the source code.
Neal Norwitzc1505362006-12-28 06:47:50 +00001982
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03001983 Return 0 on error, -1 if no dict pushed, 1 if a dict is pushed.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001984 */
1985 static identifier return_str;
1986 PyObject *names;
Victor Stinnerad9a0662013-11-19 22:23:20 +01001987 Py_ssize_t len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001988 names = PyList_New(0);
1989 if (!names)
Serhiy Storchaka694de3b2016-06-15 20:06:07 +03001990 return 0;
Neal Norwitzc1505362006-12-28 06:47:50 +00001991
Yury Selivanovf315c1c2015-07-23 09:10:44 +03001992 if (!compiler_visit_argannotations(c, args->args, names))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001993 goto error;
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001994 if (args->vararg && args->vararg->annotation &&
Yury Selivanovf315c1c2015-07-23 09:10:44 +03001995 !compiler_visit_argannotation(c, args->vararg->arg,
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001996 args->vararg->annotation, names))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001997 goto error;
Yury Selivanovf315c1c2015-07-23 09:10:44 +03001998 if (!compiler_visit_argannotations(c, args->kwonlyargs, names))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001999 goto error;
Benjamin Petersoncda75be2013-03-18 10:48:58 -07002000 if (args->kwarg && args->kwarg->annotation &&
Yury Selivanovf315c1c2015-07-23 09:10:44 +03002001 !compiler_visit_argannotation(c, args->kwarg->arg,
Benjamin Petersoncda75be2013-03-18 10:48:58 -07002002 args->kwarg->annotation, names))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002003 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +00002004
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002005 if (!return_str) {
2006 return_str = PyUnicode_InternFromString("return");
2007 if (!return_str)
2008 goto error;
2009 }
Yury Selivanovf315c1c2015-07-23 09:10:44 +03002010 if (!compiler_visit_argannotation(c, return_str, returns, names)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002011 goto error;
2012 }
2013
2014 len = PyList_GET_SIZE(names);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002015 if (len) {
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002016 PyObject *keytuple = PyList_AsTuple(names);
2017 Py_DECREF(names);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03002018 ADDOP_LOAD_CONST_NEW(c, keytuple);
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002019 ADDOP_I(c, BUILD_CONST_KEY_MAP, len);
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03002020 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002021 }
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002022 else {
2023 Py_DECREF(names);
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03002024 return -1;
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002025 }
Neal Norwitzc1505362006-12-28 06:47:50 +00002026
2027error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002028 Py_DECREF(names);
Serhiy Storchaka694de3b2016-06-15 20:06:07 +03002029 return 0;
Neal Norwitzc1505362006-12-28 06:47:50 +00002030}
2031
2032static int
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03002033compiler_visit_defaults(struct compiler *c, arguments_ty args)
2034{
2035 VISIT_SEQ(c, expr, args->defaults);
2036 ADDOP_I(c, BUILD_TUPLE, asdl_seq_LEN(args->defaults));
2037 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002038}
2039
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002040static Py_ssize_t
2041compiler_default_arguments(struct compiler *c, arguments_ty args)
2042{
2043 Py_ssize_t funcflags = 0;
2044 if (args->defaults && asdl_seq_LEN(args->defaults) > 0) {
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03002045 if (!compiler_visit_defaults(c, args))
2046 return -1;
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002047 funcflags |= 0x01;
2048 }
2049 if (args->kwonlyargs) {
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03002050 int res = compiler_visit_kwonlydefaults(c, args->kwonlyargs,
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002051 args->kw_defaults);
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03002052 if (res == 0) {
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002053 return -1;
2054 }
2055 else if (res > 0) {
2056 funcflags |= 0x02;
2057 }
2058 }
2059 return funcflags;
2060}
2061
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002062static int
Yury Selivanov75445082015-05-11 22:57:16 -04002063compiler_function(struct compiler *c, stmt_ty s, int is_async)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002064{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002065 PyCodeObject *co;
Serhiy Storchaka143ce5c2018-05-30 10:56:16 +03002066 PyObject *qualname, *docstring = NULL;
Yury Selivanov75445082015-05-11 22:57:16 -04002067 arguments_ty args;
2068 expr_ty returns;
2069 identifier name;
2070 asdl_seq* decos;
2071 asdl_seq *body;
INADA Naokicb41b272017-02-23 00:31:59 +09002072 Py_ssize_t i, funcflags;
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03002073 int annotations;
Yury Selivanov75445082015-05-11 22:57:16 -04002074 int scope_type;
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +02002075 int firstlineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002076
Yury Selivanov75445082015-05-11 22:57:16 -04002077 if (is_async) {
2078 assert(s->kind == AsyncFunctionDef_kind);
2079
2080 args = s->v.AsyncFunctionDef.args;
2081 returns = s->v.AsyncFunctionDef.returns;
2082 decos = s->v.AsyncFunctionDef.decorator_list;
2083 name = s->v.AsyncFunctionDef.name;
2084 body = s->v.AsyncFunctionDef.body;
2085
2086 scope_type = COMPILER_SCOPE_ASYNC_FUNCTION;
2087 } else {
2088 assert(s->kind == FunctionDef_kind);
2089
2090 args = s->v.FunctionDef.args;
2091 returns = s->v.FunctionDef.returns;
2092 decos = s->v.FunctionDef.decorator_list;
2093 name = s->v.FunctionDef.name;
2094 body = s->v.FunctionDef.body;
2095
2096 scope_type = COMPILER_SCOPE_FUNCTION;
2097 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002098
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002099 if (!compiler_decorators(c, decos))
2100 return 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +00002101
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +02002102 firstlineno = s->lineno;
2103 if (asdl_seq_LEN(decos)) {
2104 firstlineno = ((expr_ty)asdl_seq_GET(decos, 0))->lineno;
2105 }
2106
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002107 funcflags = compiler_default_arguments(c, args);
2108 if (funcflags == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002109 return 0;
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002110 }
2111
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03002112 annotations = compiler_visit_annotations(c, args, returns);
2113 if (annotations == 0) {
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002114 return 0;
2115 }
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03002116 else if (annotations > 0) {
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002117 funcflags |= 0x04;
2118 }
2119
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +02002120 if (!compiler_enter_scope(c, name, scope_type, (void *)s, firstlineno)) {
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002121 return 0;
2122 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002123
INADA Naokicb41b272017-02-23 00:31:59 +09002124 /* if not -OO mode, add docstring */
Serhiy Storchaka143ce5c2018-05-30 10:56:16 +03002125 if (c->c_optimize < 2) {
2126 docstring = _PyAST_GetDocString(body);
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03002127 }
Serhiy Storchaka143ce5c2018-05-30 10:56:16 +03002128 if (compiler_add_const(c, docstring ? docstring : Py_None) < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002129 compiler_exit_scope(c);
2130 return 0;
2131 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002132
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002133 c->u->u_argcount = asdl_seq_LEN(args->args);
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01002134 c->u->u_posonlyargcount = asdl_seq_LEN(args->posonlyargs);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002135 c->u->u_kwonlyargcount = asdl_seq_LEN(args->kwonlyargs);
INADA Naokicb41b272017-02-23 00:31:59 +09002136 VISIT_SEQ_IN_SCOPE(c, stmt, body);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002137 co = assemble(c, 1);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04002138 qualname = c->u->u_qualname;
2139 Py_INCREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002140 compiler_exit_scope(c);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04002141 if (co == NULL) {
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002142 Py_XDECREF(qualname);
2143 Py_XDECREF(co);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002144 return 0;
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002145 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002146
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002147 compiler_make_closure(c, co, funcflags, qualname);
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002148 Py_DECREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002149 Py_DECREF(co);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002150
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002151 /* decorators */
2152 for (i = 0; i < asdl_seq_LEN(decos); i++) {
2153 ADDOP_I(c, CALL_FUNCTION, 1);
2154 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002155
Yury Selivanov75445082015-05-11 22:57:16 -04002156 return compiler_nameop(c, name, Store);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002157}
2158
2159static int
2160compiler_class(struct compiler *c, stmt_ty s)
2161{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002162 PyCodeObject *co;
2163 PyObject *str;
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +02002164 int i, firstlineno;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002165 asdl_seq* decos = s->v.ClassDef.decorator_list;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002166
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002167 if (!compiler_decorators(c, decos))
2168 return 0;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002169
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +02002170 firstlineno = s->lineno;
2171 if (asdl_seq_LEN(decos)) {
2172 firstlineno = ((expr_ty)asdl_seq_GET(decos, 0))->lineno;
2173 }
2174
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002175 /* ultimately generate code for:
2176 <name> = __build_class__(<func>, <name>, *<bases>, **<keywords>)
2177 where:
2178 <func> is a function/closure created from the class body;
2179 it has a single argument (__locals__) where the dict
2180 (or MutableSequence) representing the locals is passed
2181 <name> is the class name
2182 <bases> is the positional arguments and *varargs argument
2183 <keywords> is the keyword arguments and **kwds argument
2184 This borrows from compiler_call.
2185 */
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002186
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002187 /* 1. compile the class body into a code object */
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002188 if (!compiler_enter_scope(c, s->v.ClassDef.name,
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +02002189 COMPILER_SCOPE_CLASS, (void *)s, firstlineno))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002190 return 0;
2191 /* this block represents what we do in the new scope */
2192 {
2193 /* use the class name for name mangling */
2194 Py_INCREF(s->v.ClassDef.name);
Serhiy Storchaka48842712016-04-06 09:45:48 +03002195 Py_XSETREF(c->u->u_private, s->v.ClassDef.name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002196 /* load (global) __name__ ... */
2197 str = PyUnicode_InternFromString("__name__");
2198 if (!str || !compiler_nameop(c, str, Load)) {
2199 Py_XDECREF(str);
2200 compiler_exit_scope(c);
2201 return 0;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002202 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002203 Py_DECREF(str);
2204 /* ... and store it as __module__ */
2205 str = PyUnicode_InternFromString("__module__");
2206 if (!str || !compiler_nameop(c, str, Store)) {
2207 Py_XDECREF(str);
2208 compiler_exit_scope(c);
2209 return 0;
2210 }
2211 Py_DECREF(str);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04002212 assert(c->u->u_qualname);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03002213 ADDOP_LOAD_CONST(c, c->u->u_qualname);
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002214 str = PyUnicode_InternFromString("__qualname__");
2215 if (!str || !compiler_nameop(c, str, Store)) {
2216 Py_XDECREF(str);
2217 compiler_exit_scope(c);
2218 return 0;
2219 }
2220 Py_DECREF(str);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002221 /* compile the body proper */
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03002222 if (!compiler_body(c, s->v.ClassDef.body)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002223 compiler_exit_scope(c);
2224 return 0;
2225 }
Nick Coghlan19d24672016-12-05 16:47:55 +10002226 /* Return __classcell__ if it is referenced, otherwise return None */
Benjamin Peterson312595c2013-05-15 15:26:42 -05002227 if (c->u->u_ste->ste_needs_class_closure) {
Nick Coghlan19d24672016-12-05 16:47:55 +10002228 /* Store __classcell__ into class namespace & return it */
Benjamin Peterson312595c2013-05-15 15:26:42 -05002229 str = PyUnicode_InternFromString("__class__");
2230 if (str == NULL) {
2231 compiler_exit_scope(c);
2232 return 0;
2233 }
2234 i = compiler_lookup_arg(c->u->u_cellvars, str);
2235 Py_DECREF(str);
Victor Stinner98e818b2013-11-05 18:07:34 +01002236 if (i < 0) {
2237 compiler_exit_scope(c);
2238 return 0;
2239 }
Benjamin Peterson312595c2013-05-15 15:26:42 -05002240 assert(i == 0);
Nick Coghlan944368e2016-09-11 14:45:49 +10002241
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002242 ADDOP_I(c, LOAD_CLOSURE, i);
Nick Coghlan19d24672016-12-05 16:47:55 +10002243 ADDOP(c, DUP_TOP);
Nick Coghlan944368e2016-09-11 14:45:49 +10002244 str = PyUnicode_InternFromString("__classcell__");
2245 if (!str || !compiler_nameop(c, str, Store)) {
2246 Py_XDECREF(str);
2247 compiler_exit_scope(c);
2248 return 0;
2249 }
2250 Py_DECREF(str);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002251 }
Benjamin Peterson312595c2013-05-15 15:26:42 -05002252 else {
Nick Coghlan19d24672016-12-05 16:47:55 +10002253 /* No methods referenced __class__, so just return None */
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +02002254 assert(PyDict_GET_SIZE(c->u->u_cellvars) == 0);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03002255 ADDOP_LOAD_CONST(c, Py_None);
Benjamin Peterson312595c2013-05-15 15:26:42 -05002256 }
Nick Coghlan19d24672016-12-05 16:47:55 +10002257 ADDOP_IN_SCOPE(c, RETURN_VALUE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002258 /* create the code object */
2259 co = assemble(c, 1);
2260 }
2261 /* leave the new scope */
2262 compiler_exit_scope(c);
2263 if (co == NULL)
2264 return 0;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002265
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002266 /* 2. load the 'build_class' function */
2267 ADDOP(c, LOAD_BUILD_CLASS);
2268
2269 /* 3. load a function (or closure) made from the code object */
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002270 compiler_make_closure(c, co, 0, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002271 Py_DECREF(co);
2272
2273 /* 4. load class name */
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03002274 ADDOP_LOAD_CONST(c, s->v.ClassDef.name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002275
2276 /* 5. generate the rest of the code for the call */
2277 if (!compiler_call_helper(c, 2,
2278 s->v.ClassDef.bases,
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002279 s->v.ClassDef.keywords))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002280 return 0;
2281
2282 /* 6. apply decorators */
2283 for (i = 0; i < asdl_seq_LEN(decos); i++) {
2284 ADDOP_I(c, CALL_FUNCTION, 1);
2285 }
2286
2287 /* 7. store into <name> */
2288 if (!compiler_nameop(c, s->v.ClassDef.name, Store))
2289 return 0;
2290 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002291}
2292
Serhiy Storchaka3bcbedc2019-01-18 07:47:48 +02002293/* Return 0 if the expression is a constant value except named singletons.
2294 Return 1 otherwise. */
2295static int
2296check_is_arg(expr_ty e)
2297{
2298 if (e->kind != Constant_kind) {
2299 return 1;
2300 }
2301 PyObject *value = e->v.Constant.value;
2302 return (value == Py_None
2303 || value == Py_False
2304 || value == Py_True
2305 || value == Py_Ellipsis);
2306}
2307
2308/* Check operands of identity chacks ("is" and "is not").
2309 Emit a warning if any operand is a constant except named singletons.
2310 Return 0 on error.
2311 */
2312static int
2313check_compare(struct compiler *c, expr_ty e)
2314{
2315 Py_ssize_t i, n;
2316 int left = check_is_arg(e->v.Compare.left);
2317 n = asdl_seq_LEN(e->v.Compare.ops);
2318 for (i = 0; i < n; i++) {
2319 cmpop_ty op = (cmpop_ty)asdl_seq_GET(e->v.Compare.ops, i);
2320 int right = check_is_arg((expr_ty)asdl_seq_GET(e->v.Compare.comparators, i));
2321 if (op == Is || op == IsNot) {
2322 if (!right || !left) {
2323 const char *msg = (op == Is)
2324 ? "\"is\" with a literal. Did you mean \"==\"?"
2325 : "\"is not\" with a literal. Did you mean \"!=\"?";
2326 return compiler_warn(c, msg);
2327 }
2328 }
2329 left = right;
2330 }
2331 return 1;
2332}
2333
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002334static int
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002335cmpop(cmpop_ty op)
2336{
2337 switch (op) {
2338 case Eq:
2339 return PyCmp_EQ;
2340 case NotEq:
2341 return PyCmp_NE;
2342 case Lt:
2343 return PyCmp_LT;
2344 case LtE:
2345 return PyCmp_LE;
2346 case Gt:
2347 return PyCmp_GT;
2348 case GtE:
2349 return PyCmp_GE;
2350 case Is:
2351 return PyCmp_IS;
2352 case IsNot:
2353 return PyCmp_IS_NOT;
2354 case In:
2355 return PyCmp_IN;
2356 case NotIn:
2357 return PyCmp_NOT_IN;
2358 default:
2359 return PyCmp_BAD;
2360 }
2361}
2362
2363static int
2364compiler_jump_if(struct compiler *c, expr_ty e, basicblock *next, int cond)
2365{
2366 switch (e->kind) {
2367 case UnaryOp_kind:
2368 if (e->v.UnaryOp.op == Not)
2369 return compiler_jump_if(c, e->v.UnaryOp.operand, next, !cond);
2370 /* fallback to general implementation */
2371 break;
2372 case BoolOp_kind: {
2373 asdl_seq *s = e->v.BoolOp.values;
2374 Py_ssize_t i, n = asdl_seq_LEN(s) - 1;
2375 assert(n >= 0);
2376 int cond2 = e->v.BoolOp.op == Or;
2377 basicblock *next2 = next;
2378 if (!cond2 != !cond) {
2379 next2 = compiler_new_block(c);
2380 if (next2 == NULL)
2381 return 0;
2382 }
2383 for (i = 0; i < n; ++i) {
2384 if (!compiler_jump_if(c, (expr_ty)asdl_seq_GET(s, i), next2, cond2))
2385 return 0;
2386 }
2387 if (!compiler_jump_if(c, (expr_ty)asdl_seq_GET(s, n), next, cond))
2388 return 0;
2389 if (next2 != next)
2390 compiler_use_next_block(c, next2);
2391 return 1;
2392 }
2393 case IfExp_kind: {
2394 basicblock *end, *next2;
2395 end = compiler_new_block(c);
2396 if (end == NULL)
2397 return 0;
2398 next2 = compiler_new_block(c);
2399 if (next2 == NULL)
2400 return 0;
2401 if (!compiler_jump_if(c, e->v.IfExp.test, next2, 0))
2402 return 0;
2403 if (!compiler_jump_if(c, e->v.IfExp.body, next, cond))
2404 return 0;
2405 ADDOP_JREL(c, JUMP_FORWARD, end);
2406 compiler_use_next_block(c, next2);
2407 if (!compiler_jump_if(c, e->v.IfExp.orelse, next, cond))
2408 return 0;
2409 compiler_use_next_block(c, end);
2410 return 1;
2411 }
2412 case Compare_kind: {
2413 Py_ssize_t i, n = asdl_seq_LEN(e->v.Compare.ops) - 1;
2414 if (n > 0) {
Serhiy Storchaka45835252019-02-16 08:29:46 +02002415 if (!check_compare(c, e)) {
2416 return 0;
2417 }
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002418 basicblock *cleanup = compiler_new_block(c);
2419 if (cleanup == NULL)
2420 return 0;
2421 VISIT(c, expr, e->v.Compare.left);
2422 for (i = 0; i < n; i++) {
2423 VISIT(c, expr,
2424 (expr_ty)asdl_seq_GET(e->v.Compare.comparators, i));
2425 ADDOP(c, DUP_TOP);
2426 ADDOP(c, ROT_THREE);
2427 ADDOP_I(c, COMPARE_OP,
2428 cmpop((cmpop_ty)(asdl_seq_GET(e->v.Compare.ops, i))));
2429 ADDOP_JABS(c, POP_JUMP_IF_FALSE, cleanup);
2430 NEXT_BLOCK(c);
2431 }
2432 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, n));
2433 ADDOP_I(c, COMPARE_OP,
2434 cmpop((cmpop_ty)(asdl_seq_GET(e->v.Compare.ops, n))));
2435 ADDOP_JABS(c, cond ? POP_JUMP_IF_TRUE : POP_JUMP_IF_FALSE, next);
2436 basicblock *end = compiler_new_block(c);
2437 if (end == NULL)
2438 return 0;
2439 ADDOP_JREL(c, JUMP_FORWARD, end);
2440 compiler_use_next_block(c, cleanup);
2441 ADDOP(c, POP_TOP);
2442 if (!cond) {
2443 ADDOP_JREL(c, JUMP_FORWARD, next);
2444 }
2445 compiler_use_next_block(c, end);
2446 return 1;
2447 }
2448 /* fallback to general implementation */
2449 break;
2450 }
2451 default:
2452 /* fallback to general implementation */
2453 break;
2454 }
2455
2456 /* general implementation */
2457 VISIT(c, expr, e);
2458 ADDOP_JABS(c, cond ? POP_JUMP_IF_TRUE : POP_JUMP_IF_FALSE, next);
2459 return 1;
2460}
2461
2462static int
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002463compiler_ifexp(struct compiler *c, expr_ty e)
2464{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002465 basicblock *end, *next;
2466
2467 assert(e->kind == IfExp_kind);
2468 end = compiler_new_block(c);
2469 if (end == NULL)
2470 return 0;
2471 next = compiler_new_block(c);
2472 if (next == NULL)
2473 return 0;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002474 if (!compiler_jump_if(c, e->v.IfExp.test, next, 0))
2475 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002476 VISIT(c, expr, e->v.IfExp.body);
2477 ADDOP_JREL(c, JUMP_FORWARD, end);
2478 compiler_use_next_block(c, next);
2479 VISIT(c, expr, e->v.IfExp.orelse);
2480 compiler_use_next_block(c, end);
2481 return 1;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002482}
2483
2484static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002485compiler_lambda(struct compiler *c, expr_ty e)
2486{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002487 PyCodeObject *co;
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002488 PyObject *qualname;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002489 static identifier name;
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002490 Py_ssize_t funcflags;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002491 arguments_ty args = e->v.Lambda.args;
2492 assert(e->kind == Lambda_kind);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002493
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002494 if (!name) {
2495 name = PyUnicode_InternFromString("<lambda>");
2496 if (!name)
2497 return 0;
2498 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002499
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002500 funcflags = compiler_default_arguments(c, args);
2501 if (funcflags == -1) {
2502 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002503 }
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002504
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04002505 if (!compiler_enter_scope(c, name, COMPILER_SCOPE_LAMBDA,
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002506 (void *)e, e->lineno))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002507 return 0;
Neal Norwitz4737b232005-11-19 23:58:29 +00002508
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002509 /* Make None the first constant, so the lambda can't have a
2510 docstring. */
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03002511 if (compiler_add_const(c, Py_None) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002512 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002513
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002514 c->u->u_argcount = asdl_seq_LEN(args->args);
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01002515 c->u->u_posonlyargcount = asdl_seq_LEN(args->posonlyargs);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002516 c->u->u_kwonlyargcount = asdl_seq_LEN(args->kwonlyargs);
2517 VISIT_IN_SCOPE(c, expr, e->v.Lambda.body);
2518 if (c->u->u_ste->ste_generator) {
Serhiy Storchakac775ad62015-03-11 18:20:35 +02002519 co = assemble(c, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002520 }
2521 else {
2522 ADDOP_IN_SCOPE(c, RETURN_VALUE);
Serhiy Storchakac775ad62015-03-11 18:20:35 +02002523 co = assemble(c, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002524 }
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04002525 qualname = c->u->u_qualname;
2526 Py_INCREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002527 compiler_exit_scope(c);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04002528 if (co == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002529 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002530
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002531 compiler_make_closure(c, co, funcflags, qualname);
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002532 Py_DECREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002533 Py_DECREF(co);
2534
2535 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002536}
2537
2538static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002539compiler_if(struct compiler *c, stmt_ty s)
2540{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002541 basicblock *end, *next;
2542 int constant;
2543 assert(s->kind == If_kind);
2544 end = compiler_new_block(c);
2545 if (end == NULL)
2546 return 0;
2547
Serhiy Storchaka3dfbaf52017-12-25 12:47:50 +02002548 constant = expr_constant(s->v.If.test);
Pablo Galindoaf8646c2019-05-17 11:37:08 +01002549 /* constant = 0: "if 0" Leave the optimizations to
2550 * the pephole optimizer to check for syntax errors
2551 * in the block.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002552 * constant = 1: "if 1", "if 2", ...
2553 * constant = -1: rest */
Pablo Galindoaf8646c2019-05-17 11:37:08 +01002554 if (constant == 1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002555 VISIT_SEQ(c, stmt, s->v.If.body);
2556 } else {
Antoine Pitroue7811fc2014-09-18 03:06:50 +02002557 if (asdl_seq_LEN(s->v.If.orelse)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002558 next = compiler_new_block(c);
2559 if (next == NULL)
2560 return 0;
2561 }
2562 else
2563 next = end;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002564 if (!compiler_jump_if(c, s->v.If.test, next, 0))
2565 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002566 VISIT_SEQ(c, stmt, s->v.If.body);
Antoine Pitroue7811fc2014-09-18 03:06:50 +02002567 if (asdl_seq_LEN(s->v.If.orelse)) {
2568 ADDOP_JREL(c, JUMP_FORWARD, end);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002569 compiler_use_next_block(c, next);
2570 VISIT_SEQ(c, stmt, s->v.If.orelse);
2571 }
2572 }
2573 compiler_use_next_block(c, end);
2574 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002575}
2576
2577static int
2578compiler_for(struct compiler *c, stmt_ty s)
2579{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002580 basicblock *start, *cleanup, *end;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002581
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002582 start = compiler_new_block(c);
2583 cleanup = compiler_new_block(c);
2584 end = compiler_new_block(c);
2585 if (start == NULL || end == NULL || cleanup == NULL)
2586 return 0;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002587
2588 if (!compiler_push_fblock(c, FOR_LOOP, start, end))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002589 return 0;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002590
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002591 VISIT(c, expr, s->v.For.iter);
2592 ADDOP(c, GET_ITER);
2593 compiler_use_next_block(c, start);
2594 ADDOP_JREL(c, FOR_ITER, cleanup);
2595 VISIT(c, expr, s->v.For.target);
2596 VISIT_SEQ(c, stmt, s->v.For.body);
2597 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
2598 compiler_use_next_block(c, cleanup);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002599
2600 compiler_pop_fblock(c, FOR_LOOP, start);
2601
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002602 VISIT_SEQ(c, stmt, s->v.For.orelse);
2603 compiler_use_next_block(c, end);
2604 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002605}
2606
Yury Selivanov75445082015-05-11 22:57:16 -04002607
2608static int
2609compiler_async_for(struct compiler *c, stmt_ty s)
2610{
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002611 basicblock *start, *except, *end;
Matthias Bussonnier565b4f12019-05-21 13:12:03 -07002612 if (c->c_flags->cf_flags & PyCF_ALLOW_TOP_LEVEL_AWAIT){
2613 c->u->u_ste->ste_coroutine = 1;
2614 } else if (c->u->u_scope_type != COMPILER_SCOPE_ASYNC_FUNCTION) {
Zsolt Dollensteine2396502018-04-27 08:58:56 -07002615 return compiler_error(c, "'async for' outside async function");
2616 }
2617
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002618 start = compiler_new_block(c);
Yury Selivanov75445082015-05-11 22:57:16 -04002619 except = compiler_new_block(c);
2620 end = compiler_new_block(c);
Yury Selivanov75445082015-05-11 22:57:16 -04002621
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002622 if (start == NULL || except == NULL || end == NULL)
Yury Selivanov75445082015-05-11 22:57:16 -04002623 return 0;
2624
2625 VISIT(c, expr, s->v.AsyncFor.iter);
2626 ADDOP(c, GET_AITER);
Yury Selivanov75445082015-05-11 22:57:16 -04002627
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002628 compiler_use_next_block(c, start);
2629 if (!compiler_push_fblock(c, FOR_LOOP, start, end))
2630 return 0;
Yury Selivanov75445082015-05-11 22:57:16 -04002631
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002632 /* SETUP_FINALLY to guard the __anext__ call */
2633 ADDOP_JREL(c, SETUP_FINALLY, except);
Yury Selivanov75445082015-05-11 22:57:16 -04002634 ADDOP(c, GET_ANEXT);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03002635 ADDOP_LOAD_CONST(c, Py_None);
Yury Selivanov75445082015-05-11 22:57:16 -04002636 ADDOP(c, YIELD_FROM);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002637 ADDOP(c, POP_BLOCK); /* for SETUP_FINALLY */
Yury Selivanov75445082015-05-11 22:57:16 -04002638
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002639 /* Success block for __anext__ */
2640 VISIT(c, expr, s->v.AsyncFor.target);
2641 VISIT_SEQ(c, stmt, s->v.AsyncFor.body);
2642 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
2643
2644 compiler_pop_fblock(c, FOR_LOOP, start);
Yury Selivanov75445082015-05-11 22:57:16 -04002645
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002646 /* Except block for __anext__ */
Yury Selivanov75445082015-05-11 22:57:16 -04002647 compiler_use_next_block(c, except);
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02002648 ADDOP(c, END_ASYNC_FOR);
Yury Selivanov75445082015-05-11 22:57:16 -04002649
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002650 /* `else` block */
Yury Selivanov75445082015-05-11 22:57:16 -04002651 VISIT_SEQ(c, stmt, s->v.For.orelse);
2652
2653 compiler_use_next_block(c, end);
2654
2655 return 1;
2656}
2657
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002658static int
2659compiler_while(struct compiler *c, stmt_ty s)
2660{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002661 basicblock *loop, *orelse, *end, *anchor = NULL;
Serhiy Storchaka3dfbaf52017-12-25 12:47:50 +02002662 int constant = expr_constant(s->v.While.test);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002663
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002664 if (constant == 0) {
2665 if (s->v.While.orelse)
2666 VISIT_SEQ(c, stmt, s->v.While.orelse);
2667 return 1;
2668 }
2669 loop = compiler_new_block(c);
2670 end = compiler_new_block(c);
2671 if (constant == -1) {
2672 anchor = compiler_new_block(c);
2673 if (anchor == NULL)
2674 return 0;
2675 }
2676 if (loop == NULL || end == NULL)
2677 return 0;
2678 if (s->v.While.orelse) {
2679 orelse = compiler_new_block(c);
2680 if (orelse == NULL)
2681 return 0;
2682 }
2683 else
2684 orelse = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002685
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002686 compiler_use_next_block(c, loop);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002687 if (!compiler_push_fblock(c, WHILE_LOOP, loop, end))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002688 return 0;
2689 if (constant == -1) {
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03002690 if (!compiler_jump_if(c, s->v.While.test, anchor, 0))
2691 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002692 }
2693 VISIT_SEQ(c, stmt, s->v.While.body);
2694 ADDOP_JABS(c, JUMP_ABSOLUTE, loop);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002695
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002696 /* XXX should the two POP instructions be in a separate block
2697 if there is no else clause ?
2698 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002699
Benjamin Peterson3cda0ed2014-12-13 16:06:19 -05002700 if (constant == -1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002701 compiler_use_next_block(c, anchor);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002702 compiler_pop_fblock(c, WHILE_LOOP, loop);
2703
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002704 if (orelse != NULL) /* what if orelse is just pass? */
2705 VISIT_SEQ(c, stmt, s->v.While.orelse);
2706 compiler_use_next_block(c, end);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002707
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002708 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002709}
2710
2711static int
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002712compiler_return(struct compiler *c, stmt_ty s)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002713{
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002714 int preserve_tos = ((s->v.Return.value != NULL) &&
Serhiy Storchaka3f228112018-09-27 17:42:37 +03002715 (s->v.Return.value->kind != Constant_kind));
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002716 if (c->u->u_ste->ste_type != FunctionBlock)
2717 return compiler_error(c, "'return' outside function");
2718 if (s->v.Return.value != NULL &&
2719 c->u->u_ste->ste_coroutine && c->u->u_ste->ste_generator)
2720 {
2721 return compiler_error(
2722 c, "'return' with value in async generator");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002723 }
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002724 if (preserve_tos) {
2725 VISIT(c, expr, s->v.Return.value);
2726 }
2727 for (int depth = c->u->u_nfblocks; depth--;) {
2728 struct fblockinfo *info = &c->u->u_fblock[depth];
2729
2730 if (!compiler_unwind_fblock(c, info, preserve_tos))
2731 return 0;
2732 }
2733 if (s->v.Return.value == NULL) {
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03002734 ADDOP_LOAD_CONST(c, Py_None);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002735 }
2736 else if (!preserve_tos) {
2737 VISIT(c, expr, s->v.Return.value);
2738 }
2739 ADDOP(c, RETURN_VALUE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002740
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002741 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002742}
2743
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002744static int
2745compiler_break(struct compiler *c)
2746{
2747 for (int depth = c->u->u_nfblocks; depth--;) {
2748 struct fblockinfo *info = &c->u->u_fblock[depth];
2749
2750 if (!compiler_unwind_fblock(c, info, 0))
2751 return 0;
2752 if (info->fb_type == WHILE_LOOP || info->fb_type == FOR_LOOP) {
2753 ADDOP_JABS(c, JUMP_ABSOLUTE, info->fb_exit);
2754 return 1;
2755 }
2756 }
2757 return compiler_error(c, "'break' outside loop");
2758}
2759
2760static int
2761compiler_continue(struct compiler *c)
2762{
2763 for (int depth = c->u->u_nfblocks; depth--;) {
2764 struct fblockinfo *info = &c->u->u_fblock[depth];
2765
2766 if (info->fb_type == WHILE_LOOP || info->fb_type == FOR_LOOP) {
2767 ADDOP_JABS(c, JUMP_ABSOLUTE, info->fb_block);
2768 return 1;
2769 }
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002770 if (!compiler_unwind_fblock(c, info, 0))
2771 return 0;
2772 }
2773 return compiler_error(c, "'continue' not properly in loop");
2774}
2775
2776
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002777/* Code generated for "try: <body> finally: <finalbody>" is as follows:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002778
2779 SETUP_FINALLY L
2780 <code for body>
2781 POP_BLOCK
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002782 BEGIN_FINALLY
2783 L:
2784 <code for finalbody>
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002785 END_FINALLY
2786
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002787 The special instructions use the block stack. Each block
2788 stack entry contains the instruction that created it (here
2789 SETUP_FINALLY), the level of the value stack at the time the
2790 block stack entry was created, and a label (here L).
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002791
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002792 SETUP_FINALLY:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002793 Pushes the current value stack level and the label
2794 onto the block stack.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002795 POP_BLOCK:
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002796 Pops en entry from the block stack.
2797 BEGIN_FINALLY
2798 Pushes NULL onto the value stack.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002799 END_FINALLY:
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002800 Pops 1 (NULL or int) or 6 entries from the *value* stack and restore
2801 the raised and the caught exceptions they specify.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002802
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002803 The block stack is unwound when an exception is raised:
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002804 when a SETUP_FINALLY entry is found, the raised and the caught
2805 exceptions are pushed onto the value stack (and the exception
2806 condition is cleared), and the interpreter jumps to the label
2807 gotten from the block stack.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002808*/
2809
2810static int
2811compiler_try_finally(struct compiler *c, stmt_ty s)
2812{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002813 basicblock *body, *end;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002814
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002815 body = compiler_new_block(c);
2816 end = compiler_new_block(c);
2817 if (body == NULL || end == NULL)
2818 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002819
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002820 /* `try` block */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002821 ADDOP_JREL(c, SETUP_FINALLY, end);
2822 compiler_use_next_block(c, body);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002823 if (!compiler_push_fblock(c, FINALLY_TRY, body, end))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002824 return 0;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002825 if (s->v.Try.handlers && asdl_seq_LEN(s->v.Try.handlers)) {
2826 if (!compiler_try_except(c, s))
2827 return 0;
2828 }
2829 else {
2830 VISIT_SEQ(c, stmt, s->v.Try.body);
2831 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002832 ADDOP(c, POP_BLOCK);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002833 ADDOP(c, BEGIN_FINALLY);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002834 compiler_pop_fblock(c, FINALLY_TRY, body);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002835
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002836 /* `finally` block */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002837 compiler_use_next_block(c, end);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002838 if (!compiler_push_fblock(c, FINALLY_END, end, NULL))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002839 return 0;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002840 VISIT_SEQ(c, stmt, s->v.Try.finalbody);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002841 ADDOP(c, END_FINALLY);
2842 compiler_pop_fblock(c, FINALLY_END, end);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002843 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002844}
2845
2846/*
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00002847 Code generated for "try: S except E1 as V1: S1 except E2 as V2: S2 ...":
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002848 (The contents of the value stack is shown in [], with the top
2849 at the right; 'tb' is trace-back info, 'val' the exception's
2850 associated value, and 'exc' the exception.)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002851
2852 Value stack Label Instruction Argument
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002853 [] SETUP_FINALLY L1
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002854 [] <code for S>
2855 [] POP_BLOCK
2856 [] JUMP_FORWARD L0
2857
2858 [tb, val, exc] L1: DUP )
2859 [tb, val, exc, exc] <evaluate E1> )
2860 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2861 [tb, val, exc, 1-or-0] POP_JUMP_IF_FALSE L2 )
2862 [tb, val, exc] POP
2863 [tb, val] <assign to V1> (or POP if no V1)
2864 [tb] POP
2865 [] <code for S1>
2866 JUMP_FORWARD L0
2867
2868 [tb, val, exc] L2: DUP
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002869 .............................etc.......................
2870
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002871 [tb, val, exc] Ln+1: END_FINALLY # re-raise exception
2872
2873 [] L0: <next statement>
2874
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002875 Of course, parts are not generated if Vi or Ei is not present.
2876*/
2877static int
2878compiler_try_except(struct compiler *c, stmt_ty s)
2879{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002880 basicblock *body, *orelse, *except, *end;
Victor Stinnerad9a0662013-11-19 22:23:20 +01002881 Py_ssize_t i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002882
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002883 body = compiler_new_block(c);
2884 except = compiler_new_block(c);
2885 orelse = compiler_new_block(c);
2886 end = compiler_new_block(c);
2887 if (body == NULL || except == NULL || orelse == NULL || end == NULL)
2888 return 0;
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002889 ADDOP_JREL(c, SETUP_FINALLY, except);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002890 compiler_use_next_block(c, body);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002891 if (!compiler_push_fblock(c, EXCEPT, body, NULL))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002892 return 0;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002893 VISIT_SEQ(c, stmt, s->v.Try.body);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002894 ADDOP(c, POP_BLOCK);
2895 compiler_pop_fblock(c, EXCEPT, body);
2896 ADDOP_JREL(c, JUMP_FORWARD, orelse);
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002897 n = asdl_seq_LEN(s->v.Try.handlers);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002898 compiler_use_next_block(c, except);
2899 for (i = 0; i < n; i++) {
2900 excepthandler_ty handler = (excepthandler_ty)asdl_seq_GET(
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002901 s->v.Try.handlers, i);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002902 if (!handler->v.ExceptHandler.type && i < n-1)
2903 return compiler_error(c, "default 'except:' must be last");
2904 c->u->u_lineno_set = 0;
2905 c->u->u_lineno = handler->lineno;
Benjamin Petersond4efd9e2010-09-20 23:02:10 +00002906 c->u->u_col_offset = handler->col_offset;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002907 except = compiler_new_block(c);
2908 if (except == NULL)
2909 return 0;
2910 if (handler->v.ExceptHandler.type) {
2911 ADDOP(c, DUP_TOP);
2912 VISIT(c, expr, handler->v.ExceptHandler.type);
2913 ADDOP_I(c, COMPARE_OP, PyCmp_EXC_MATCH);
2914 ADDOP_JABS(c, POP_JUMP_IF_FALSE, except);
2915 }
2916 ADDOP(c, POP_TOP);
2917 if (handler->v.ExceptHandler.name) {
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002918 basicblock *cleanup_end, *cleanup_body;
Guido van Rossumb940e112007-01-10 16:19:56 +00002919
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002920 cleanup_end = compiler_new_block(c);
2921 cleanup_body = compiler_new_block(c);
Zackery Spytz53ebf4b2018-10-11 23:54:03 -06002922 if (cleanup_end == NULL || cleanup_body == NULL) {
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002923 return 0;
Zackery Spytz53ebf4b2018-10-11 23:54:03 -06002924 }
Guido van Rossumb940e112007-01-10 16:19:56 +00002925
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002926 compiler_nameop(c, handler->v.ExceptHandler.name, Store);
2927 ADDOP(c, POP_TOP);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002928
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002929 /*
2930 try:
Ezio Melotti1b6424f2013-04-19 07:10:09 +03002931 # body
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002932 except type as name:
Ezio Melotti1b6424f2013-04-19 07:10:09 +03002933 try:
2934 # body
2935 finally:
Chris Angelicoad098b62019-05-21 23:34:19 +10002936 name = None # in case body contains "del name"
Ezio Melotti1b6424f2013-04-19 07:10:09 +03002937 del name
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002938 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002939
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002940 /* second try: */
2941 ADDOP_JREL(c, SETUP_FINALLY, cleanup_end);
2942 compiler_use_next_block(c, cleanup_body);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002943 if (!compiler_push_fblock(c, HANDLER_CLEANUP, cleanup_body, cleanup_end))
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002944 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002945
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002946 /* second # body */
2947 VISIT_SEQ(c, stmt, handler->v.ExceptHandler.body);
2948 ADDOP(c, POP_BLOCK);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002949 ADDOP(c, BEGIN_FINALLY);
2950 compiler_pop_fblock(c, HANDLER_CLEANUP, cleanup_body);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002951
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002952 /* finally: */
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002953 compiler_use_next_block(c, cleanup_end);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002954 if (!compiler_push_fblock(c, FINALLY_END, cleanup_end, NULL))
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002955 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002956
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002957 /* name = None; del name */
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03002958 ADDOP_LOAD_CONST(c, Py_None);
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002959 compiler_nameop(c, handler->v.ExceptHandler.name, Store);
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002960 compiler_nameop(c, handler->v.ExceptHandler.name, Del);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002961
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002962 ADDOP(c, END_FINALLY);
Serhiy Storchakad4864c62018-01-09 21:54:52 +02002963 ADDOP(c, POP_EXCEPT);
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002964 compiler_pop_fblock(c, FINALLY_END, cleanup_end);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002965 }
2966 else {
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002967 basicblock *cleanup_body;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002968
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002969 cleanup_body = compiler_new_block(c);
Benjamin Peterson0a5dad92011-05-27 14:17:04 -05002970 if (!cleanup_body)
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002971 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002972
Guido van Rossumb940e112007-01-10 16:19:56 +00002973 ADDOP(c, POP_TOP);
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002974 ADDOP(c, POP_TOP);
2975 compiler_use_next_block(c, cleanup_body);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002976 if (!compiler_push_fblock(c, HANDLER_CLEANUP, cleanup_body, NULL))
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002977 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002978 VISIT_SEQ(c, stmt, handler->v.ExceptHandler.body);
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002979 ADDOP(c, POP_EXCEPT);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02002980 compiler_pop_fblock(c, HANDLER_CLEANUP, cleanup_body);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002981 }
2982 ADDOP_JREL(c, JUMP_FORWARD, end);
2983 compiler_use_next_block(c, except);
2984 }
2985 ADDOP(c, END_FINALLY);
2986 compiler_use_next_block(c, orelse);
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002987 VISIT_SEQ(c, stmt, s->v.Try.orelse);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002988 compiler_use_next_block(c, end);
2989 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002990}
2991
2992static int
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002993compiler_try(struct compiler *c, stmt_ty s) {
2994 if (s->v.Try.finalbody && asdl_seq_LEN(s->v.Try.finalbody))
2995 return compiler_try_finally(c, s);
2996 else
2997 return compiler_try_except(c, s);
2998}
2999
3000
3001static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003002compiler_import_as(struct compiler *c, identifier name, identifier asname)
3003{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003004 /* The IMPORT_NAME opcode was already generated. This function
3005 merely needs to bind the result to a name.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003006
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003007 If there is a dot in name, we need to split it and emit a
Serhiy Storchakaf93234b2017-05-09 22:31:05 +03003008 IMPORT_FROM for each name.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003009 */
Serhiy Storchaka265fcc52017-08-29 15:47:44 +03003010 Py_ssize_t len = PyUnicode_GET_LENGTH(name);
3011 Py_ssize_t dot = PyUnicode_FindChar(name, '.', 0, len, 1);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003012 if (dot == -2)
Serhiy Storchaka694de3b2016-06-15 20:06:07 +03003013 return 0;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003014 if (dot != -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003015 /* Consume the base module name to get the first attribute */
Serhiy Storchaka265fcc52017-08-29 15:47:44 +03003016 while (1) {
3017 Py_ssize_t pos = dot + 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003018 PyObject *attr;
Serhiy Storchaka265fcc52017-08-29 15:47:44 +03003019 dot = PyUnicode_FindChar(name, '.', pos, len, 1);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003020 if (dot == -2)
Serhiy Storchaka694de3b2016-06-15 20:06:07 +03003021 return 0;
Serhiy Storchaka265fcc52017-08-29 15:47:44 +03003022 attr = PyUnicode_Substring(name, pos, (dot != -1) ? dot : len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003023 if (!attr)
Serhiy Storchaka694de3b2016-06-15 20:06:07 +03003024 return 0;
Serhiy Storchakaaa8e51f2018-04-01 00:29:37 +03003025 ADDOP_N(c, IMPORT_FROM, attr, names);
Serhiy Storchaka265fcc52017-08-29 15:47:44 +03003026 if (dot == -1) {
3027 break;
3028 }
3029 ADDOP(c, ROT_TWO);
3030 ADDOP(c, POP_TOP);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003031 }
Serhiy Storchaka265fcc52017-08-29 15:47:44 +03003032 if (!compiler_nameop(c, asname, Store)) {
3033 return 0;
3034 }
3035 ADDOP(c, POP_TOP);
3036 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003037 }
3038 return compiler_nameop(c, asname, Store);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003039}
3040
3041static int
3042compiler_import(struct compiler *c, stmt_ty s)
3043{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003044 /* The Import node stores a module name like a.b.c as a single
3045 string. This is convenient for all cases except
3046 import a.b.c as d
3047 where we need to parse that string to extract the individual
3048 module names.
3049 XXX Perhaps change the representation to make this case simpler?
3050 */
Victor Stinnerad9a0662013-11-19 22:23:20 +01003051 Py_ssize_t i, n = asdl_seq_LEN(s->v.Import.names);
Thomas Woutersf7f438b2006-02-28 16:09:29 +00003052
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003053 for (i = 0; i < n; i++) {
3054 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.Import.names, i);
3055 int r;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003056
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03003057 ADDOP_LOAD_CONST(c, _PyLong_Zero);
3058 ADDOP_LOAD_CONST(c, Py_None);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003059 ADDOP_NAME(c, IMPORT_NAME, alias->name, names);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003060
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003061 if (alias->asname) {
3062 r = compiler_import_as(c, alias->name, alias->asname);
3063 if (!r)
3064 return r;
3065 }
3066 else {
3067 identifier tmp = alias->name;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003068 Py_ssize_t dot = PyUnicode_FindChar(
3069 alias->name, '.', 0, PyUnicode_GET_LENGTH(alias->name), 1);
Victor Stinner6b64a682013-07-11 22:50:45 +02003070 if (dot != -1) {
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003071 tmp = PyUnicode_Substring(alias->name, 0, dot);
Victor Stinner6b64a682013-07-11 22:50:45 +02003072 if (tmp == NULL)
3073 return 0;
3074 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003075 r = compiler_nameop(c, tmp, Store);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003076 if (dot != -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003077 Py_DECREF(tmp);
3078 }
3079 if (!r)
3080 return r;
3081 }
3082 }
3083 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003084}
3085
3086static int
3087compiler_from_import(struct compiler *c, stmt_ty s)
3088{
Victor Stinnerad9a0662013-11-19 22:23:20 +01003089 Py_ssize_t i, n = asdl_seq_LEN(s->v.ImportFrom.names);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03003090 PyObject *names;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003091 static PyObject *empty_string;
Benjamin Peterson78565b22009-06-28 19:19:51 +00003092
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003093 if (!empty_string) {
3094 empty_string = PyUnicode_FromString("");
3095 if (!empty_string)
3096 return 0;
3097 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003098
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03003099 ADDOP_LOAD_CONST_NEW(c, PyLong_FromLong(s->v.ImportFrom.level));
Serhiy Storchakaa95d9862018-03-24 22:42:35 +02003100
3101 names = PyTuple_New(n);
3102 if (!names)
3103 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003104
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003105 /* build up the names */
3106 for (i = 0; i < n; i++) {
3107 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);
3108 Py_INCREF(alias->name);
3109 PyTuple_SET_ITEM(names, i, alias->name);
3110 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003111
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003112 if (s->lineno > c->c_future->ff_lineno && s->v.ImportFrom.module &&
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02003113 _PyUnicode_EqualToASCIIString(s->v.ImportFrom.module, "__future__")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003114 Py_DECREF(names);
3115 return compiler_error(c, "from __future__ imports must occur "
3116 "at the beginning of the file");
3117 }
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03003118 ADDOP_LOAD_CONST_NEW(c, names);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003119
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003120 if (s->v.ImportFrom.module) {
3121 ADDOP_NAME(c, IMPORT_NAME, s->v.ImportFrom.module, names);
3122 }
3123 else {
3124 ADDOP_NAME(c, IMPORT_NAME, empty_string, names);
3125 }
3126 for (i = 0; i < n; i++) {
3127 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);
3128 identifier store_name;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003129
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003130 if (i == 0 && PyUnicode_READ_CHAR(alias->name, 0) == '*') {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003131 assert(n == 1);
3132 ADDOP(c, IMPORT_STAR);
3133 return 1;
3134 }
3135
3136 ADDOP_NAME(c, IMPORT_FROM, alias->name, names);
3137 store_name = alias->name;
3138 if (alias->asname)
3139 store_name = alias->asname;
3140
3141 if (!compiler_nameop(c, store_name, Store)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003142 return 0;
3143 }
3144 }
3145 /* remove imported module */
3146 ADDOP(c, POP_TOP);
3147 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003148}
3149
3150static int
3151compiler_assert(struct compiler *c, stmt_ty s)
3152{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003153 static PyObject *assertion_error = NULL;
3154 basicblock *end;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003155
Georg Brandl8334fd92010-12-04 10:26:46 +00003156 if (c->c_optimize)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003157 return 1;
3158 if (assertion_error == NULL) {
3159 assertion_error = PyUnicode_InternFromString("AssertionError");
3160 if (assertion_error == NULL)
3161 return 0;
3162 }
3163 if (s->v.Assert.test->kind == Tuple_kind &&
Serhiy Storchakad31e7732018-10-21 10:09:39 +03003164 asdl_seq_LEN(s->v.Assert.test->v.Tuple.elts) > 0)
3165 {
3166 if (!compiler_warn(c, "assertion is always true, "
3167 "perhaps remove parentheses?"))
3168 {
Victor Stinner14e461d2013-08-26 22:28:21 +02003169 return 0;
3170 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003171 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003172 end = compiler_new_block(c);
3173 if (end == NULL)
3174 return 0;
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03003175 if (!compiler_jump_if(c, s->v.Assert.test, end, 1))
3176 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003177 ADDOP_O(c, LOAD_GLOBAL, assertion_error, names);
3178 if (s->v.Assert.msg) {
3179 VISIT(c, expr, s->v.Assert.msg);
3180 ADDOP_I(c, CALL_FUNCTION, 1);
3181 }
3182 ADDOP_I(c, RAISE_VARARGS, 1);
3183 compiler_use_next_block(c, end);
3184 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003185}
3186
3187static int
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01003188compiler_visit_stmt_expr(struct compiler *c, expr_ty value)
3189{
3190 if (c->c_interactive && c->c_nestlevel <= 1) {
3191 VISIT(c, expr, value);
3192 ADDOP(c, PRINT_EXPR);
3193 return 1;
3194 }
3195
Serhiy Storchaka3f228112018-09-27 17:42:37 +03003196 if (value->kind == Constant_kind) {
Victor Stinner15a30952016-02-08 22:45:06 +01003197 /* ignore constant statement */
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01003198 return 1;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01003199 }
3200
3201 VISIT(c, expr, value);
3202 ADDOP(c, POP_TOP);
3203 return 1;
3204}
3205
3206static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003207compiler_visit_stmt(struct compiler *c, stmt_ty s)
3208{
Victor Stinnerad9a0662013-11-19 22:23:20 +01003209 Py_ssize_t i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003210
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003211 /* Always assign a lineno to the next instruction for a stmt. */
3212 c->u->u_lineno = s->lineno;
Benjamin Petersond4efd9e2010-09-20 23:02:10 +00003213 c->u->u_col_offset = s->col_offset;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003214 c->u->u_lineno_set = 0;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003215
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003216 switch (s->kind) {
3217 case FunctionDef_kind:
Yury Selivanov75445082015-05-11 22:57:16 -04003218 return compiler_function(c, s, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003219 case ClassDef_kind:
3220 return compiler_class(c, s);
3221 case Return_kind:
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003222 return compiler_return(c, s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003223 case Delete_kind:
3224 VISIT_SEQ(c, expr, s->v.Delete.targets)
3225 break;
3226 case Assign_kind:
3227 n = asdl_seq_LEN(s->v.Assign.targets);
3228 VISIT(c, expr, s->v.Assign.value);
3229 for (i = 0; i < n; i++) {
3230 if (i < n - 1)
3231 ADDOP(c, DUP_TOP);
3232 VISIT(c, expr,
3233 (expr_ty)asdl_seq_GET(s->v.Assign.targets, i));
3234 }
3235 break;
3236 case AugAssign_kind:
3237 return compiler_augassign(c, s);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07003238 case AnnAssign_kind:
3239 return compiler_annassign(c, s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003240 case For_kind:
3241 return compiler_for(c, s);
3242 case While_kind:
3243 return compiler_while(c, s);
3244 case If_kind:
3245 return compiler_if(c, s);
3246 case Raise_kind:
3247 n = 0;
3248 if (s->v.Raise.exc) {
3249 VISIT(c, expr, s->v.Raise.exc);
3250 n++;
Victor Stinnerad9a0662013-11-19 22:23:20 +01003251 if (s->v.Raise.cause) {
3252 VISIT(c, expr, s->v.Raise.cause);
3253 n++;
3254 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003255 }
Victor Stinnerad9a0662013-11-19 22:23:20 +01003256 ADDOP_I(c, RAISE_VARARGS, (int)n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003257 break;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05003258 case Try_kind:
3259 return compiler_try(c, s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003260 case Assert_kind:
3261 return compiler_assert(c, s);
3262 case Import_kind:
3263 return compiler_import(c, s);
3264 case ImportFrom_kind:
3265 return compiler_from_import(c, s);
3266 case Global_kind:
3267 case Nonlocal_kind:
3268 break;
3269 case Expr_kind:
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01003270 return compiler_visit_stmt_expr(c, s->v.Expr.value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003271 case Pass_kind:
3272 break;
3273 case Break_kind:
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02003274 return compiler_break(c);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003275 case Continue_kind:
3276 return compiler_continue(c);
3277 case With_kind:
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003278 return compiler_with(c, s, 0);
Yury Selivanov75445082015-05-11 22:57:16 -04003279 case AsyncFunctionDef_kind:
3280 return compiler_function(c, s, 1);
3281 case AsyncWith_kind:
3282 return compiler_async_with(c, s, 0);
3283 case AsyncFor_kind:
3284 return compiler_async_for(c, s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003285 }
Yury Selivanov75445082015-05-11 22:57:16 -04003286
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003287 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003288}
3289
3290static int
3291unaryop(unaryop_ty op)
3292{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003293 switch (op) {
3294 case Invert:
3295 return UNARY_INVERT;
3296 case Not:
3297 return UNARY_NOT;
3298 case UAdd:
3299 return UNARY_POSITIVE;
3300 case USub:
3301 return UNARY_NEGATIVE;
3302 default:
3303 PyErr_Format(PyExc_SystemError,
3304 "unary op %d should not be possible", op);
3305 return 0;
3306 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003307}
3308
3309static int
3310binop(struct compiler *c, operator_ty op)
3311{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003312 switch (op) {
3313 case Add:
3314 return BINARY_ADD;
3315 case Sub:
3316 return BINARY_SUBTRACT;
3317 case Mult:
3318 return BINARY_MULTIPLY;
Benjamin Petersond51374e2014-04-09 23:55:56 -04003319 case MatMult:
3320 return BINARY_MATRIX_MULTIPLY;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003321 case Div:
3322 return BINARY_TRUE_DIVIDE;
3323 case Mod:
3324 return BINARY_MODULO;
3325 case Pow:
3326 return BINARY_POWER;
3327 case LShift:
3328 return BINARY_LSHIFT;
3329 case RShift:
3330 return BINARY_RSHIFT;
3331 case BitOr:
3332 return BINARY_OR;
3333 case BitXor:
3334 return BINARY_XOR;
3335 case BitAnd:
3336 return BINARY_AND;
3337 case FloorDiv:
3338 return BINARY_FLOOR_DIVIDE;
3339 default:
3340 PyErr_Format(PyExc_SystemError,
3341 "binary op %d should not be possible", op);
3342 return 0;
3343 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003344}
3345
3346static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003347inplace_binop(struct compiler *c, operator_ty op)
3348{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003349 switch (op) {
3350 case Add:
3351 return INPLACE_ADD;
3352 case Sub:
3353 return INPLACE_SUBTRACT;
3354 case Mult:
3355 return INPLACE_MULTIPLY;
Benjamin Petersond51374e2014-04-09 23:55:56 -04003356 case MatMult:
3357 return INPLACE_MATRIX_MULTIPLY;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003358 case Div:
3359 return INPLACE_TRUE_DIVIDE;
3360 case Mod:
3361 return INPLACE_MODULO;
3362 case Pow:
3363 return INPLACE_POWER;
3364 case LShift:
3365 return INPLACE_LSHIFT;
3366 case RShift:
3367 return INPLACE_RSHIFT;
3368 case BitOr:
3369 return INPLACE_OR;
3370 case BitXor:
3371 return INPLACE_XOR;
3372 case BitAnd:
3373 return INPLACE_AND;
3374 case FloorDiv:
3375 return INPLACE_FLOOR_DIVIDE;
3376 default:
3377 PyErr_Format(PyExc_SystemError,
3378 "inplace binary op %d should not be possible", op);
3379 return 0;
3380 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003381}
3382
3383static int
3384compiler_nameop(struct compiler *c, identifier name, expr_context_ty ctx)
3385{
Victor Stinnerad9a0662013-11-19 22:23:20 +01003386 int op, scope;
3387 Py_ssize_t arg;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003388 enum { OP_FAST, OP_GLOBAL, OP_DEREF, OP_NAME } optype;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003389
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003390 PyObject *dict = c->u->u_names;
3391 PyObject *mangled;
3392 /* XXX AugStore isn't used anywhere! */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003393
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02003394 assert(!_PyUnicode_EqualToASCIIString(name, "None") &&
3395 !_PyUnicode_EqualToASCIIString(name, "True") &&
3396 !_PyUnicode_EqualToASCIIString(name, "False"));
Benjamin Peterson70b224d2012-12-06 17:49:58 -05003397
Serhiy Storchakabd6ec4d2017-12-18 14:29:12 +02003398 mangled = _Py_Mangle(c->u->u_private, name);
3399 if (!mangled)
3400 return 0;
3401
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003402 op = 0;
3403 optype = OP_NAME;
3404 scope = PyST_GetScope(c->u->u_ste, mangled);
3405 switch (scope) {
3406 case FREE:
3407 dict = c->u->u_freevars;
3408 optype = OP_DEREF;
3409 break;
3410 case CELL:
3411 dict = c->u->u_cellvars;
3412 optype = OP_DEREF;
3413 break;
3414 case LOCAL:
3415 if (c->u->u_ste->ste_type == FunctionBlock)
3416 optype = OP_FAST;
3417 break;
3418 case GLOBAL_IMPLICIT:
Benjamin Peterson1dfd2472015-04-27 21:44:22 -04003419 if (c->u->u_ste->ste_type == FunctionBlock)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003420 optype = OP_GLOBAL;
3421 break;
3422 case GLOBAL_EXPLICIT:
3423 optype = OP_GLOBAL;
3424 break;
3425 default:
3426 /* scope can be 0 */
3427 break;
3428 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003429
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003430 /* XXX Leave assert here, but handle __doc__ and the like better */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003431 assert(scope || PyUnicode_READ_CHAR(name, 0) == '_');
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003432
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003433 switch (optype) {
3434 case OP_DEREF:
3435 switch (ctx) {
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04003436 case Load:
3437 op = (c->u->u_ste->ste_type == ClassBlock) ? LOAD_CLASSDEREF : LOAD_DEREF;
3438 break;
Emily Morehouse8f59ee02019-01-24 16:49:56 -07003439 case Store:
Emily Morehouse8f59ee02019-01-24 16:49:56 -07003440 op = STORE_DEREF;
3441 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003442 case AugLoad:
3443 case AugStore:
3444 break;
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00003445 case Del: op = DELETE_DEREF; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003446 case Param:
3447 default:
3448 PyErr_SetString(PyExc_SystemError,
3449 "param invalid for deref variable");
3450 return 0;
3451 }
3452 break;
3453 case OP_FAST:
3454 switch (ctx) {
3455 case Load: op = LOAD_FAST; break;
Emily Morehouse8f59ee02019-01-24 16:49:56 -07003456 case Store:
Emily Morehouse8f59ee02019-01-24 16:49:56 -07003457 op = STORE_FAST;
3458 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003459 case Del: op = DELETE_FAST; break;
3460 case AugLoad:
3461 case AugStore:
3462 break;
3463 case Param:
3464 default:
3465 PyErr_SetString(PyExc_SystemError,
3466 "param invalid for local variable");
3467 return 0;
3468 }
Serhiy Storchakaaa8e51f2018-04-01 00:29:37 +03003469 ADDOP_N(c, op, mangled, varnames);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003470 return 1;
3471 case OP_GLOBAL:
3472 switch (ctx) {
3473 case Load: op = LOAD_GLOBAL; break;
Emily Morehouse8f59ee02019-01-24 16:49:56 -07003474 case Store:
Emily Morehouse8f59ee02019-01-24 16:49:56 -07003475 op = STORE_GLOBAL;
3476 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003477 case Del: op = DELETE_GLOBAL; break;
3478 case AugLoad:
3479 case AugStore:
3480 break;
3481 case Param:
3482 default:
3483 PyErr_SetString(PyExc_SystemError,
3484 "param invalid for global variable");
3485 return 0;
3486 }
3487 break;
3488 case OP_NAME:
3489 switch (ctx) {
Benjamin Peterson20f9c3c2010-07-20 22:39:34 +00003490 case Load: op = LOAD_NAME; break;
Emily Morehouse8f59ee02019-01-24 16:49:56 -07003491 case Store:
Emily Morehouse8f59ee02019-01-24 16:49:56 -07003492 op = STORE_NAME;
3493 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003494 case Del: op = DELETE_NAME; break;
3495 case AugLoad:
3496 case AugStore:
3497 break;
3498 case Param:
3499 default:
3500 PyErr_SetString(PyExc_SystemError,
3501 "param invalid for name variable");
3502 return 0;
3503 }
3504 break;
3505 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003506
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003507 assert(op);
3508 arg = compiler_add_o(c, dict, mangled);
3509 Py_DECREF(mangled);
3510 if (arg < 0)
3511 return 0;
3512 return compiler_addop_i(c, op, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003513}
3514
3515static int
3516compiler_boolop(struct compiler *c, expr_ty e)
3517{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003518 basicblock *end;
Victor Stinnerad9a0662013-11-19 22:23:20 +01003519 int jumpi;
3520 Py_ssize_t i, n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003521 asdl_seq *s;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003522
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003523 assert(e->kind == BoolOp_kind);
3524 if (e->v.BoolOp.op == And)
3525 jumpi = JUMP_IF_FALSE_OR_POP;
3526 else
3527 jumpi = JUMP_IF_TRUE_OR_POP;
3528 end = compiler_new_block(c);
3529 if (end == NULL)
3530 return 0;
3531 s = e->v.BoolOp.values;
3532 n = asdl_seq_LEN(s) - 1;
3533 assert(n >= 0);
3534 for (i = 0; i < n; ++i) {
3535 VISIT(c, expr, (expr_ty)asdl_seq_GET(s, i));
3536 ADDOP_JABS(c, jumpi, end);
3537 }
3538 VISIT(c, expr, (expr_ty)asdl_seq_GET(s, n));
3539 compiler_use_next_block(c, end);
3540 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003541}
3542
3543static int
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003544starunpack_helper(struct compiler *c, asdl_seq *elts,
3545 int single_op, int inner_op, int outer_op)
3546{
3547 Py_ssize_t n = asdl_seq_LEN(elts);
3548 Py_ssize_t i, nsubitems = 0, nseen = 0;
3549 for (i = 0; i < n; i++) {
3550 expr_ty elt = asdl_seq_GET(elts, i);
3551 if (elt->kind == Starred_kind) {
3552 if (nseen) {
3553 ADDOP_I(c, inner_op, nseen);
3554 nseen = 0;
3555 nsubitems++;
3556 }
3557 VISIT(c, expr, elt->v.Starred.value);
3558 nsubitems++;
3559 }
3560 else {
3561 VISIT(c, expr, elt);
3562 nseen++;
3563 }
3564 }
3565 if (nsubitems) {
3566 if (nseen) {
3567 ADDOP_I(c, inner_op, nseen);
3568 nsubitems++;
3569 }
3570 ADDOP_I(c, outer_op, nsubitems);
3571 }
3572 else
3573 ADDOP_I(c, single_op, nseen);
3574 return 1;
3575}
3576
3577static int
3578assignment_helper(struct compiler *c, asdl_seq *elts)
3579{
3580 Py_ssize_t n = asdl_seq_LEN(elts);
3581 Py_ssize_t i;
3582 int seen_star = 0;
3583 for (i = 0; i < n; i++) {
3584 expr_ty elt = asdl_seq_GET(elts, i);
3585 if (elt->kind == Starred_kind && !seen_star) {
3586 if ((i >= (1 << 8)) ||
3587 (n-i-1 >= (INT_MAX >> 8)))
3588 return compiler_error(c,
3589 "too many expressions in "
3590 "star-unpacking assignment");
3591 ADDOP_I(c, UNPACK_EX, (i + ((n-i-1) << 8)));
3592 seen_star = 1;
3593 asdl_seq_SET(elts, i, elt->v.Starred.value);
3594 }
3595 else if (elt->kind == Starred_kind) {
3596 return compiler_error(c,
3597 "two starred expressions in assignment");
3598 }
3599 }
3600 if (!seen_star) {
3601 ADDOP_I(c, UNPACK_SEQUENCE, n);
3602 }
3603 VISIT_SEQ(c, expr, elts);
3604 return 1;
3605}
3606
3607static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003608compiler_list(struct compiler *c, expr_ty e)
3609{
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003610 asdl_seq *elts = e->v.List.elts;
Serhiy Storchakad8b3a982019-03-05 20:42:06 +02003611 if (e->v.List.ctx == Store) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003612 return assignment_helper(c, elts);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003613 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003614 else if (e->v.List.ctx == Load) {
3615 return starunpack_helper(c, elts,
3616 BUILD_LIST, BUILD_TUPLE, BUILD_LIST_UNPACK);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003617 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003618 else
3619 VISIT_SEQ(c, expr, elts);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003620 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003621}
3622
3623static int
3624compiler_tuple(struct compiler *c, expr_ty e)
3625{
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003626 asdl_seq *elts = e->v.Tuple.elts;
Serhiy Storchakad8b3a982019-03-05 20:42:06 +02003627 if (e->v.Tuple.ctx == Store) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003628 return assignment_helper(c, elts);
3629 }
3630 else if (e->v.Tuple.ctx == Load) {
3631 return starunpack_helper(c, elts,
3632 BUILD_TUPLE, BUILD_TUPLE, BUILD_TUPLE_UNPACK);
3633 }
3634 else
3635 VISIT_SEQ(c, expr, elts);
3636 return 1;
3637}
3638
3639static int
3640compiler_set(struct compiler *c, expr_ty e)
3641{
3642 return starunpack_helper(c, e->v.Set.elts, BUILD_SET,
3643 BUILD_SET, BUILD_SET_UNPACK);
3644}
3645
3646static int
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003647are_all_items_const(asdl_seq *seq, Py_ssize_t begin, Py_ssize_t end)
3648{
3649 Py_ssize_t i;
3650 for (i = begin; i < end; i++) {
3651 expr_ty key = (expr_ty)asdl_seq_GET(seq, i);
Serhiy Storchaka3f228112018-09-27 17:42:37 +03003652 if (key == NULL || key->kind != Constant_kind)
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003653 return 0;
3654 }
3655 return 1;
3656}
3657
3658static int
3659compiler_subdict(struct compiler *c, expr_ty e, Py_ssize_t begin, Py_ssize_t end)
3660{
3661 Py_ssize_t i, n = end - begin;
3662 PyObject *keys, *key;
3663 if (n > 1 && are_all_items_const(e->v.Dict.keys, begin, end)) {
3664 for (i = begin; i < end; i++) {
3665 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Dict.values, i));
3666 }
3667 keys = PyTuple_New(n);
3668 if (keys == NULL) {
3669 return 0;
3670 }
3671 for (i = begin; i < end; i++) {
Serhiy Storchaka3f228112018-09-27 17:42:37 +03003672 key = ((expr_ty)asdl_seq_GET(e->v.Dict.keys, i))->v.Constant.value;
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003673 Py_INCREF(key);
3674 PyTuple_SET_ITEM(keys, i - begin, key);
3675 }
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03003676 ADDOP_LOAD_CONST_NEW(c, keys);
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003677 ADDOP_I(c, BUILD_CONST_KEY_MAP, n);
3678 }
3679 else {
3680 for (i = begin; i < end; i++) {
3681 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Dict.keys, i));
3682 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Dict.values, i));
3683 }
3684 ADDOP_I(c, BUILD_MAP, n);
3685 }
3686 return 1;
3687}
3688
3689static int
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003690compiler_dict(struct compiler *c, expr_ty e)
3691{
Victor Stinner976bb402016-03-23 11:36:19 +01003692 Py_ssize_t i, n, elements;
3693 int containers;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003694 int is_unpacking = 0;
3695 n = asdl_seq_LEN(e->v.Dict.values);
3696 containers = 0;
3697 elements = 0;
3698 for (i = 0; i < n; i++) {
3699 is_unpacking = (expr_ty)asdl_seq_GET(e->v.Dict.keys, i) == NULL;
3700 if (elements == 0xFFFF || (elements && is_unpacking)) {
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003701 if (!compiler_subdict(c, e, i - elements, i))
3702 return 0;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003703 containers++;
3704 elements = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003705 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003706 if (is_unpacking) {
3707 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Dict.values, i));
3708 containers++;
3709 }
3710 else {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003711 elements++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003712 }
3713 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003714 if (elements || containers == 0) {
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003715 if (!compiler_subdict(c, e, n - elements, n))
3716 return 0;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003717 containers++;
3718 }
3719 /* If there is more than one dict, they need to be merged into a new
3720 * dict. If there is one dict and it's an unpacking, then it needs
3721 * to be copied into a new dict." */
Serhiy Storchaka3d85fae2016-11-28 20:56:37 +02003722 if (containers > 1 || is_unpacking) {
3723 ADDOP_I(c, BUILD_MAP_UNPACK, containers);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003724 }
3725 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003726}
3727
3728static int
3729compiler_compare(struct compiler *c, expr_ty e)
3730{
Victor Stinnerad9a0662013-11-19 22:23:20 +01003731 Py_ssize_t i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003732
Serhiy Storchaka3bcbedc2019-01-18 07:47:48 +02003733 if (!check_compare(c, e)) {
3734 return 0;
3735 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003736 VISIT(c, expr, e->v.Compare.left);
Serhiy Storchaka02b9ef22017-12-30 09:47:42 +02003737 assert(asdl_seq_LEN(e->v.Compare.ops) > 0);
3738 n = asdl_seq_LEN(e->v.Compare.ops) - 1;
3739 if (n == 0) {
3740 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, 0));
3741 ADDOP_I(c, COMPARE_OP,
3742 cmpop((cmpop_ty)(asdl_seq_GET(e->v.Compare.ops, 0))));
3743 }
3744 else {
3745 basicblock *cleanup = compiler_new_block(c);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003746 if (cleanup == NULL)
3747 return 0;
Serhiy Storchaka02b9ef22017-12-30 09:47:42 +02003748 for (i = 0; i < n; i++) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003749 VISIT(c, expr,
3750 (expr_ty)asdl_seq_GET(e->v.Compare.comparators, i));
Serhiy Storchaka02b9ef22017-12-30 09:47:42 +02003751 ADDOP(c, DUP_TOP);
3752 ADDOP(c, ROT_THREE);
3753 ADDOP_I(c, COMPARE_OP,
3754 cmpop((cmpop_ty)(asdl_seq_GET(e->v.Compare.ops, i))));
3755 ADDOP_JABS(c, JUMP_IF_FALSE_OR_POP, cleanup);
3756 NEXT_BLOCK(c);
3757 }
3758 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, n));
3759 ADDOP_I(c, COMPARE_OP,
3760 cmpop((cmpop_ty)(asdl_seq_GET(e->v.Compare.ops, n))));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003761 basicblock *end = compiler_new_block(c);
3762 if (end == NULL)
3763 return 0;
3764 ADDOP_JREL(c, JUMP_FORWARD, end);
3765 compiler_use_next_block(c, cleanup);
3766 ADDOP(c, ROT_TWO);
3767 ADDOP(c, POP_TOP);
3768 compiler_use_next_block(c, end);
3769 }
3770 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003771}
3772
Serhiy Storchaka62e44812019-02-16 08:12:19 +02003773static PyTypeObject *
3774infer_type(expr_ty e)
3775{
3776 switch (e->kind) {
3777 case Tuple_kind:
3778 return &PyTuple_Type;
3779 case List_kind:
3780 case ListComp_kind:
3781 return &PyList_Type;
3782 case Dict_kind:
3783 case DictComp_kind:
3784 return &PyDict_Type;
3785 case Set_kind:
3786 case SetComp_kind:
3787 return &PySet_Type;
3788 case GeneratorExp_kind:
3789 return &PyGen_Type;
3790 case Lambda_kind:
3791 return &PyFunction_Type;
3792 case JoinedStr_kind:
3793 case FormattedValue_kind:
3794 return &PyUnicode_Type;
3795 case Constant_kind:
3796 return e->v.Constant.value->ob_type;
3797 default:
3798 return NULL;
3799 }
3800}
3801
3802static int
3803check_caller(struct compiler *c, expr_ty e)
3804{
3805 switch (e->kind) {
3806 case Constant_kind:
3807 case Tuple_kind:
3808 case List_kind:
3809 case ListComp_kind:
3810 case Dict_kind:
3811 case DictComp_kind:
3812 case Set_kind:
3813 case SetComp_kind:
3814 case GeneratorExp_kind:
3815 case JoinedStr_kind:
3816 case FormattedValue_kind:
3817 return compiler_warn(c, "'%.200s' object is not callable; "
3818 "perhaps you missed a comma?",
3819 infer_type(e)->tp_name);
3820 default:
3821 return 1;
3822 }
3823}
3824
3825static int
3826check_subscripter(struct compiler *c, expr_ty e)
3827{
3828 PyObject *v;
3829
3830 switch (e->kind) {
3831 case Constant_kind:
3832 v = e->v.Constant.value;
3833 if (!(v == Py_None || v == Py_Ellipsis ||
3834 PyLong_Check(v) || PyFloat_Check(v) || PyComplex_Check(v) ||
3835 PyAnySet_Check(v)))
3836 {
3837 return 1;
3838 }
3839 /* fall through */
3840 case Set_kind:
3841 case SetComp_kind:
3842 case GeneratorExp_kind:
3843 case Lambda_kind:
3844 return compiler_warn(c, "'%.200s' object is not subscriptable; "
3845 "perhaps you missed a comma?",
3846 infer_type(e)->tp_name);
3847 default:
3848 return 1;
3849 }
3850}
3851
3852static int
3853check_index(struct compiler *c, expr_ty e, slice_ty s)
3854{
3855 PyObject *v;
3856
3857 if (s->kind != Index_kind) {
3858 return 1;
3859 }
3860 PyTypeObject *index_type = infer_type(s->v.Index.value);
3861 if (index_type == NULL
3862 || PyType_FastSubclass(index_type, Py_TPFLAGS_LONG_SUBCLASS)
3863 || index_type == &PySlice_Type) {
3864 return 1;
3865 }
3866
3867 switch (e->kind) {
3868 case Constant_kind:
3869 v = e->v.Constant.value;
3870 if (!(PyUnicode_Check(v) || PyBytes_Check(v) || PyTuple_Check(v))) {
3871 return 1;
3872 }
3873 /* fall through */
3874 case Tuple_kind:
3875 case List_kind:
3876 case ListComp_kind:
3877 case JoinedStr_kind:
3878 case FormattedValue_kind:
3879 return compiler_warn(c, "%.200s indices must be integers or slices, "
3880 "not %.200s; "
3881 "perhaps you missed a comma?",
3882 infer_type(e)->tp_name,
3883 index_type->tp_name);
3884 default:
3885 return 1;
3886 }
3887}
3888
Zackery Spytz97f5de02019-03-22 01:30:32 -06003889// Return 1 if the method call was optimized, -1 if not, and 0 on error.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003890static int
Yury Selivanovf2392132016-12-13 19:03:51 -05003891maybe_optimize_method_call(struct compiler *c, expr_ty e)
3892{
3893 Py_ssize_t argsl, i;
3894 expr_ty meth = e->v.Call.func;
3895 asdl_seq *args = e->v.Call.args;
3896
3897 /* Check that the call node is an attribute access, and that
3898 the call doesn't have keyword parameters. */
3899 if (meth->kind != Attribute_kind || meth->v.Attribute.ctx != Load ||
3900 asdl_seq_LEN(e->v.Call.keywords))
3901 return -1;
3902
3903 /* Check that there are no *varargs types of arguments. */
3904 argsl = asdl_seq_LEN(args);
3905 for (i = 0; i < argsl; i++) {
3906 expr_ty elt = asdl_seq_GET(args, i);
3907 if (elt->kind == Starred_kind) {
3908 return -1;
3909 }
3910 }
3911
3912 /* Alright, we can optimize the code. */
3913 VISIT(c, expr, meth->v.Attribute.value);
3914 ADDOP_NAME(c, LOAD_METHOD, meth->v.Attribute.attr, names);
3915 VISIT_SEQ(c, expr, e->v.Call.args);
3916 ADDOP_I(c, CALL_METHOD, asdl_seq_LEN(e->v.Call.args));
3917 return 1;
3918}
3919
3920static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003921compiler_call(struct compiler *c, expr_ty e)
3922{
Zackery Spytz97f5de02019-03-22 01:30:32 -06003923 int ret = maybe_optimize_method_call(c, e);
3924 if (ret >= 0) {
3925 return ret;
3926 }
Serhiy Storchaka62e44812019-02-16 08:12:19 +02003927 if (!check_caller(c, e->v.Call.func)) {
3928 return 0;
3929 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003930 VISIT(c, expr, e->v.Call.func);
3931 return compiler_call_helper(c, 0,
3932 e->v.Call.args,
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003933 e->v.Call.keywords);
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003934}
3935
Eric V. Smith235a6f02015-09-19 14:51:32 -04003936static int
3937compiler_joined_str(struct compiler *c, expr_ty e)
3938{
Eric V. Smith235a6f02015-09-19 14:51:32 -04003939 VISIT_SEQ(c, expr, e->v.JoinedStr.values);
Serhiy Storchaka4cc30ae2016-12-11 19:37:19 +02003940 if (asdl_seq_LEN(e->v.JoinedStr.values) != 1)
3941 ADDOP_I(c, BUILD_STRING, asdl_seq_LEN(e->v.JoinedStr.values));
Eric V. Smith235a6f02015-09-19 14:51:32 -04003942 return 1;
3943}
3944
Eric V. Smitha78c7952015-11-03 12:45:05 -05003945/* Used to implement f-strings. Format a single value. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04003946static int
3947compiler_formatted_value(struct compiler *c, expr_ty e)
3948{
Eric V. Smitha78c7952015-11-03 12:45:05 -05003949 /* Our oparg encodes 2 pieces of information: the conversion
3950 character, and whether or not a format_spec was provided.
Eric V. Smith235a6f02015-09-19 14:51:32 -04003951
Eric V. Smith9a4135e2019-05-08 16:28:48 -04003952 Convert the conversion char to 3 bits:
3953 : 000 0x0 FVC_NONE The default if nothing specified.
Eric V. Smitha78c7952015-11-03 12:45:05 -05003954 !s : 001 0x1 FVC_STR
3955 !r : 010 0x2 FVC_REPR
3956 !a : 011 0x3 FVC_ASCII
Eric V. Smith235a6f02015-09-19 14:51:32 -04003957
Eric V. Smitha78c7952015-11-03 12:45:05 -05003958 next bit is whether or not we have a format spec:
3959 yes : 100 0x4
3960 no : 000 0x0
3961 */
Eric V. Smith235a6f02015-09-19 14:51:32 -04003962
Eric V. Smith9a4135e2019-05-08 16:28:48 -04003963 int conversion = e->v.FormattedValue.conversion;
Eric V. Smitha78c7952015-11-03 12:45:05 -05003964 int oparg;
Eric V. Smith235a6f02015-09-19 14:51:32 -04003965
Eric V. Smith9a4135e2019-05-08 16:28:48 -04003966 if (e->v.FormattedValue.expr_text) {
3967 /* Push the text of the expression (which already has the '=' in
3968 it. */
3969 ADDOP_LOAD_CONST(c, e->v.FormattedValue.expr_text);
3970 }
3971
3972 /* The expression to be formatted. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04003973 VISIT(c, expr, e->v.FormattedValue.value);
3974
Eric V. Smith9a4135e2019-05-08 16:28:48 -04003975 switch (conversion) {
Eric V. Smitha78c7952015-11-03 12:45:05 -05003976 case 's': oparg = FVC_STR; break;
3977 case 'r': oparg = FVC_REPR; break;
3978 case 'a': oparg = FVC_ASCII; break;
3979 case -1: oparg = FVC_NONE; break;
3980 default:
Eric V. Smith9a4135e2019-05-08 16:28:48 -04003981 PyErr_Format(PyExc_SystemError,
3982 "Unrecognized conversion character %d", conversion);
Eric V. Smitha78c7952015-11-03 12:45:05 -05003983 return 0;
Eric V. Smith235a6f02015-09-19 14:51:32 -04003984 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04003985 if (e->v.FormattedValue.format_spec) {
Eric V. Smitha78c7952015-11-03 12:45:05 -05003986 /* Evaluate the format spec, and update our opcode arg. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04003987 VISIT(c, expr, e->v.FormattedValue.format_spec);
Eric V. Smitha78c7952015-11-03 12:45:05 -05003988 oparg |= FVS_HAVE_SPEC;
Eric V. Smith235a6f02015-09-19 14:51:32 -04003989 }
3990
Eric V. Smitha78c7952015-11-03 12:45:05 -05003991 /* And push our opcode and oparg */
3992 ADDOP_I(c, FORMAT_VALUE, oparg);
Eric V. Smith9a4135e2019-05-08 16:28:48 -04003993
3994 /* If we have expr_text, join the 2 strings on the stack. */
3995 if (e->v.FormattedValue.expr_text) {
3996 ADDOP_I(c, BUILD_STRING, 2);
3997 }
3998
Eric V. Smith235a6f02015-09-19 14:51:32 -04003999 return 1;
4000}
4001
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03004002static int
4003compiler_subkwargs(struct compiler *c, asdl_seq *keywords, Py_ssize_t begin, Py_ssize_t end)
4004{
4005 Py_ssize_t i, n = end - begin;
4006 keyword_ty kw;
4007 PyObject *keys, *key;
4008 assert(n > 0);
4009 if (n > 1) {
4010 for (i = begin; i < end; i++) {
4011 kw = asdl_seq_GET(keywords, i);
4012 VISIT(c, expr, kw->value);
4013 }
4014 keys = PyTuple_New(n);
4015 if (keys == NULL) {
4016 return 0;
4017 }
4018 for (i = begin; i < end; i++) {
4019 key = ((keyword_ty) asdl_seq_GET(keywords, i))->arg;
4020 Py_INCREF(key);
4021 PyTuple_SET_ITEM(keys, i - begin, key);
4022 }
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03004023 ADDOP_LOAD_CONST_NEW(c, keys);
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03004024 ADDOP_I(c, BUILD_CONST_KEY_MAP, n);
4025 }
4026 else {
4027 /* a for loop only executes once */
4028 for (i = begin; i < end; i++) {
4029 kw = asdl_seq_GET(keywords, i);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03004030 ADDOP_LOAD_CONST(c, kw->arg);
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03004031 VISIT(c, expr, kw->value);
4032 }
4033 ADDOP_I(c, BUILD_MAP, n);
4034 }
4035 return 1;
4036}
4037
Guido van Rossum52cc1d82007-03-18 15:41:51 +00004038/* shared code between compiler_call and compiler_class */
4039static int
4040compiler_call_helper(struct compiler *c,
Victor Stinner976bb402016-03-23 11:36:19 +01004041 int n, /* Args already pushed */
Victor Stinnerad9a0662013-11-19 22:23:20 +01004042 asdl_seq *args,
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004043 asdl_seq *keywords)
Guido van Rossum52cc1d82007-03-18 15:41:51 +00004044{
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004045 Py_ssize_t i, nseen, nelts, nkwelts;
Serhiy Storchakab7281052016-09-12 00:52:40 +03004046 int mustdictunpack = 0;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00004047
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004048 /* the number of tuples and dictionaries on the stack */
4049 Py_ssize_t nsubargs = 0, nsubkwargs = 0;
4050
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004051 nelts = asdl_seq_LEN(args);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004052 nkwelts = asdl_seq_LEN(keywords);
4053
4054 for (i = 0; i < nkwelts; i++) {
4055 keyword_ty kw = asdl_seq_GET(keywords, i);
4056 if (kw->arg == NULL) {
4057 mustdictunpack = 1;
4058 break;
4059 }
4060 }
4061
4062 nseen = n; /* the number of positional arguments on the stack */
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004063 for (i = 0; i < nelts; i++) {
4064 expr_ty elt = asdl_seq_GET(args, i);
4065 if (elt->kind == Starred_kind) {
4066 /* A star-arg. If we've seen positional arguments,
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004067 pack the positional arguments into a tuple. */
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004068 if (nseen) {
4069 ADDOP_I(c, BUILD_TUPLE, nseen);
4070 nseen = 0;
4071 nsubargs++;
4072 }
4073 VISIT(c, expr, elt->v.Starred.value);
4074 nsubargs++;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004075 }
4076 else {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004077 VISIT(c, expr, elt);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004078 nseen++;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004079 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004080 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004081
4082 /* Same dance again for keyword arguments */
Serhiy Storchakab7281052016-09-12 00:52:40 +03004083 if (nsubargs || mustdictunpack) {
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004084 if (nseen) {
4085 /* Pack up any trailing positional arguments. */
4086 ADDOP_I(c, BUILD_TUPLE, nseen);
4087 nsubargs++;
4088 }
Serhiy Storchakab7281052016-09-12 00:52:40 +03004089 if (nsubargs > 1) {
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004090 /* If we ended up with more than one stararg, we need
4091 to concatenate them into a single sequence. */
Serhiy Storchaka73442852016-10-02 10:33:46 +03004092 ADDOP_I(c, BUILD_TUPLE_UNPACK_WITH_CALL, nsubargs);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004093 }
4094 else if (nsubargs == 0) {
4095 ADDOP_I(c, BUILD_TUPLE, 0);
4096 }
4097 nseen = 0; /* the number of keyword arguments on the stack following */
4098 for (i = 0; i < nkwelts; i++) {
4099 keyword_ty kw = asdl_seq_GET(keywords, i);
4100 if (kw->arg == NULL) {
4101 /* A keyword argument unpacking. */
4102 if (nseen) {
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03004103 if (!compiler_subkwargs(c, keywords, i - nseen, i))
4104 return 0;
4105 nsubkwargs++;
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004106 nseen = 0;
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03004107 }
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004108 VISIT(c, expr, kw->value);
4109 nsubkwargs++;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004110 }
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004111 else {
4112 nseen++;
4113 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004114 }
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004115 if (nseen) {
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03004116 /* Pack up any trailing keyword arguments. */
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004117 if (!compiler_subkwargs(c, keywords, nkwelts - nseen, nkwelts))
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03004118 return 0;
4119 nsubkwargs++;
4120 }
Serhiy Storchakab7281052016-09-12 00:52:40 +03004121 if (nsubkwargs > 1) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004122 /* Pack it all up */
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004123 ADDOP_I(c, BUILD_MAP_UNPACK_WITH_CALL, nsubkwargs);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004124 }
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004125 ADDOP_I(c, CALL_FUNCTION_EX, nsubkwargs > 0);
4126 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004127 }
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004128 else if (nkwelts) {
4129 PyObject *names;
4130 VISIT_SEQ(c, keyword, keywords);
4131 names = PyTuple_New(nkwelts);
4132 if (names == NULL) {
4133 return 0;
4134 }
4135 for (i = 0; i < nkwelts; i++) {
4136 keyword_ty kw = asdl_seq_GET(keywords, i);
4137 Py_INCREF(kw->arg);
4138 PyTuple_SET_ITEM(names, i, kw->arg);
4139 }
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03004140 ADDOP_LOAD_CONST_NEW(c, names);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004141 ADDOP_I(c, CALL_FUNCTION_KW, n + nelts + nkwelts);
4142 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004143 }
Victor Stinnerf9b760f2016-09-09 10:17:08 -07004144 else {
4145 ADDOP_I(c, CALL_FUNCTION, n + nelts);
4146 return 1;
4147 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004148}
4149
Nick Coghlan650f0d02007-04-15 12:05:43 +00004150
4151/* List and set comprehensions and generator expressions work by creating a
4152 nested function to perform the actual iteration. This means that the
4153 iteration variables don't leak into the current scope.
4154 The defined function is called immediately following its definition, with the
4155 result of that call being the result of the expression.
4156 The LC/SC version returns the populated container, while the GE version is
4157 flagged in symtable.c as a generator, so it returns the generator object
4158 when the function is called.
Nick Coghlan650f0d02007-04-15 12:05:43 +00004159
4160 Possible cleanups:
4161 - iterate over the generator sequence instead of using recursion
4162*/
4163
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004164
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004165static int
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004166compiler_comprehension_generator(struct compiler *c,
4167 asdl_seq *generators, int gen_index,
4168 expr_ty elt, expr_ty val, int type)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004169{
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004170 comprehension_ty gen;
4171 gen = (comprehension_ty)asdl_seq_GET(generators, gen_index);
4172 if (gen->is_async) {
4173 return compiler_async_comprehension_generator(
4174 c, generators, gen_index, elt, val, type);
4175 } else {
4176 return compiler_sync_comprehension_generator(
4177 c, generators, gen_index, elt, val, type);
4178 }
4179}
4180
4181static int
4182compiler_sync_comprehension_generator(struct compiler *c,
4183 asdl_seq *generators, int gen_index,
4184 expr_ty elt, expr_ty val, int type)
4185{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004186 /* generate code for the iterator, then each of the ifs,
4187 and then write to the element */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004188
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004189 comprehension_ty gen;
4190 basicblock *start, *anchor, *skip, *if_cleanup;
Victor Stinnerad9a0662013-11-19 22:23:20 +01004191 Py_ssize_t i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004192
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004193 start = compiler_new_block(c);
4194 skip = compiler_new_block(c);
4195 if_cleanup = compiler_new_block(c);
4196 anchor = compiler_new_block(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004197
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004198 if (start == NULL || skip == NULL || if_cleanup == NULL ||
4199 anchor == NULL)
4200 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004201
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004202 gen = (comprehension_ty)asdl_seq_GET(generators, gen_index);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004203
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004204 if (gen_index == 0) {
4205 /* Receive outermost iter as an implicit argument */
4206 c->u->u_argcount = 1;
4207 ADDOP_I(c, LOAD_FAST, 0);
4208 }
4209 else {
4210 /* Sub-iter - calculate on the fly */
4211 VISIT(c, expr, gen->iter);
4212 ADDOP(c, GET_ITER);
4213 }
4214 compiler_use_next_block(c, start);
4215 ADDOP_JREL(c, FOR_ITER, anchor);
4216 NEXT_BLOCK(c);
4217 VISIT(c, expr, gen->target);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004218
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004219 /* XXX this needs to be cleaned up...a lot! */
4220 n = asdl_seq_LEN(gen->ifs);
4221 for (i = 0; i < n; i++) {
4222 expr_ty e = (expr_ty)asdl_seq_GET(gen->ifs, i);
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03004223 if (!compiler_jump_if(c, e, if_cleanup, 0))
4224 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004225 NEXT_BLOCK(c);
4226 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004227
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004228 if (++gen_index < asdl_seq_LEN(generators))
4229 if (!compiler_comprehension_generator(c,
4230 generators, gen_index,
4231 elt, val, type))
4232 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004233
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004234 /* only append after the last for generator */
4235 if (gen_index >= asdl_seq_LEN(generators)) {
4236 /* comprehension specific code */
4237 switch (type) {
4238 case COMP_GENEXP:
4239 VISIT(c, expr, elt);
4240 ADDOP(c, YIELD_VALUE);
4241 ADDOP(c, POP_TOP);
4242 break;
4243 case COMP_LISTCOMP:
4244 VISIT(c, expr, elt);
4245 ADDOP_I(c, LIST_APPEND, gen_index + 1);
4246 break;
4247 case COMP_SETCOMP:
4248 VISIT(c, expr, elt);
4249 ADDOP_I(c, SET_ADD, gen_index + 1);
4250 break;
4251 case COMP_DICTCOMP:
4252 /* With 'd[k] = v', v is evaluated before k, so we do
4253 the same. */
4254 VISIT(c, expr, val);
4255 VISIT(c, expr, elt);
4256 ADDOP_I(c, MAP_ADD, gen_index + 1);
4257 break;
4258 default:
4259 return 0;
4260 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004261
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004262 compiler_use_next_block(c, skip);
4263 }
4264 compiler_use_next_block(c, if_cleanup);
4265 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
4266 compiler_use_next_block(c, anchor);
4267
4268 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004269}
4270
4271static int
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004272compiler_async_comprehension_generator(struct compiler *c,
4273 asdl_seq *generators, int gen_index,
4274 expr_ty elt, expr_ty val, int type)
4275{
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004276 comprehension_ty gen;
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02004277 basicblock *start, *if_cleanup, *except;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004278 Py_ssize_t i, n;
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02004279 start = compiler_new_block(c);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004280 except = compiler_new_block(c);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004281 if_cleanup = compiler_new_block(c);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004282
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02004283 if (start == NULL || if_cleanup == NULL || except == NULL) {
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004284 return 0;
4285 }
4286
4287 gen = (comprehension_ty)asdl_seq_GET(generators, gen_index);
4288
4289 if (gen_index == 0) {
4290 /* Receive outermost iter as an implicit argument */
4291 c->u->u_argcount = 1;
4292 ADDOP_I(c, LOAD_FAST, 0);
4293 }
4294 else {
4295 /* Sub-iter - calculate on the fly */
4296 VISIT(c, expr, gen->iter);
4297 ADDOP(c, GET_AITER);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004298 }
4299
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02004300 compiler_use_next_block(c, start);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004301
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004302 ADDOP_JREL(c, SETUP_FINALLY, except);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004303 ADDOP(c, GET_ANEXT);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03004304 ADDOP_LOAD_CONST(c, Py_None);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004305 ADDOP(c, YIELD_FROM);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004306 ADDOP(c, POP_BLOCK);
Serhiy Storchaka24d32012018-03-10 18:22:34 +02004307 VISIT(c, expr, gen->target);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004308
4309 n = asdl_seq_LEN(gen->ifs);
4310 for (i = 0; i < n; i++) {
4311 expr_ty e = (expr_ty)asdl_seq_GET(gen->ifs, i);
Serhiy Storchaka36ff4512017-06-11 14:50:22 +03004312 if (!compiler_jump_if(c, e, if_cleanup, 0))
4313 return 0;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004314 NEXT_BLOCK(c);
4315 }
4316
4317 if (++gen_index < asdl_seq_LEN(generators))
4318 if (!compiler_comprehension_generator(c,
4319 generators, gen_index,
4320 elt, val, type))
4321 return 0;
4322
4323 /* only append after the last for generator */
4324 if (gen_index >= asdl_seq_LEN(generators)) {
4325 /* comprehension specific code */
4326 switch (type) {
4327 case COMP_GENEXP:
4328 VISIT(c, expr, elt);
4329 ADDOP(c, YIELD_VALUE);
4330 ADDOP(c, POP_TOP);
4331 break;
4332 case COMP_LISTCOMP:
4333 VISIT(c, expr, elt);
4334 ADDOP_I(c, LIST_APPEND, gen_index + 1);
4335 break;
4336 case COMP_SETCOMP:
4337 VISIT(c, expr, elt);
4338 ADDOP_I(c, SET_ADD, gen_index + 1);
4339 break;
4340 case COMP_DICTCOMP:
4341 /* With 'd[k] = v', v is evaluated before k, so we do
4342 the same. */
4343 VISIT(c, expr, val);
4344 VISIT(c, expr, elt);
4345 ADDOP_I(c, MAP_ADD, gen_index + 1);
4346 break;
4347 default:
4348 return 0;
4349 }
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004350 }
4351 compiler_use_next_block(c, if_cleanup);
Serhiy Storchaka702f8f32018-03-23 14:34:35 +02004352 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
4353
4354 compiler_use_next_block(c, except);
4355 ADDOP(c, END_ASYNC_FOR);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004356
4357 return 1;
4358}
4359
4360static int
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004361compiler_comprehension(struct compiler *c, expr_ty e, int type,
4362 identifier name, asdl_seq *generators, expr_ty elt,
4363 expr_ty val)
Nick Coghlan650f0d02007-04-15 12:05:43 +00004364{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004365 PyCodeObject *co = NULL;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004366 comprehension_ty outermost;
Antoine Pitrou86a36b52011-11-25 18:56:07 +01004367 PyObject *qualname = NULL;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004368 int is_async_function = c->u->u_ste->ste_coroutine;
4369 int is_async_generator = 0;
Nick Coghlan650f0d02007-04-15 12:05:43 +00004370
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004371 outermost = (comprehension_ty) asdl_seq_GET(generators, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00004372
Antoine Pitrou86a36b52011-11-25 18:56:07 +01004373 if (!compiler_enter_scope(c, name, COMPILER_SCOPE_COMPREHENSION,
4374 (void *)e, e->lineno))
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004375 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004376 goto error;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004377 }
4378
4379 is_async_generator = c->u->u_ste->ste_coroutine;
4380
Yury Selivanovb8ab9d32017-10-06 02:58:28 -04004381 if (is_async_generator && !is_async_function && type != COMP_GENEXP) {
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004382 compiler_error(c, "asynchronous comprehension outside of "
4383 "an asynchronous function");
4384 goto error_in_scope;
4385 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00004386
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004387 if (type != COMP_GENEXP) {
4388 int op;
4389 switch (type) {
4390 case COMP_LISTCOMP:
4391 op = BUILD_LIST;
4392 break;
4393 case COMP_SETCOMP:
4394 op = BUILD_SET;
4395 break;
4396 case COMP_DICTCOMP:
4397 op = BUILD_MAP;
4398 break;
4399 default:
4400 PyErr_Format(PyExc_SystemError,
4401 "unknown comprehension type %d", type);
4402 goto error_in_scope;
4403 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00004404
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004405 ADDOP_I(c, op, 0);
4406 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00004407
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004408 if (!compiler_comprehension_generator(c, generators, 0, elt,
4409 val, type))
4410 goto error_in_scope;
Nick Coghlan650f0d02007-04-15 12:05:43 +00004411
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004412 if (type != COMP_GENEXP) {
4413 ADDOP(c, RETURN_VALUE);
4414 }
4415
4416 co = assemble(c, 1);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04004417 qualname = c->u->u_qualname;
4418 Py_INCREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004419 compiler_exit_scope(c);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04004420 if (co == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004421 goto error;
4422
Antoine Pitrou86a36b52011-11-25 18:56:07 +01004423 if (!compiler_make_closure(c, co, 0, qualname))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004424 goto error;
Antoine Pitrou86a36b52011-11-25 18:56:07 +01004425 Py_DECREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004426 Py_DECREF(co);
4427
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004428 VISIT(c, expr, outermost->iter);
4429
4430 if (outermost->is_async) {
4431 ADDOP(c, GET_AITER);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004432 } else {
4433 ADDOP(c, GET_ITER);
4434 }
4435
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004436 ADDOP_I(c, CALL_FUNCTION, 1);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004437
4438 if (is_async_generator && type != COMP_GENEXP) {
4439 ADDOP(c, GET_AWAITABLE);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03004440 ADDOP_LOAD_CONST(c, Py_None);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004441 ADDOP(c, YIELD_FROM);
4442 }
4443
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004444 return 1;
Nick Coghlan650f0d02007-04-15 12:05:43 +00004445error_in_scope:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004446 compiler_exit_scope(c);
Nick Coghlan650f0d02007-04-15 12:05:43 +00004447error:
Antoine Pitrou86a36b52011-11-25 18:56:07 +01004448 Py_XDECREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004449 Py_XDECREF(co);
4450 return 0;
Nick Coghlan650f0d02007-04-15 12:05:43 +00004451}
4452
4453static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004454compiler_genexp(struct compiler *c, expr_ty e)
4455{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004456 static identifier name;
4457 if (!name) {
Zackery Spytzf3036392018-04-15 16:12:29 -06004458 name = PyUnicode_InternFromString("<genexpr>");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004459 if (!name)
4460 return 0;
4461 }
4462 assert(e->kind == GeneratorExp_kind);
4463 return compiler_comprehension(c, e, COMP_GENEXP, name,
4464 e->v.GeneratorExp.generators,
4465 e->v.GeneratorExp.elt, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004466}
4467
4468static int
Nick Coghlan650f0d02007-04-15 12:05:43 +00004469compiler_listcomp(struct compiler *c, expr_ty e)
4470{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004471 static identifier name;
4472 if (!name) {
Zackery Spytzf3036392018-04-15 16:12:29 -06004473 name = PyUnicode_InternFromString("<listcomp>");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004474 if (!name)
4475 return 0;
4476 }
4477 assert(e->kind == ListComp_kind);
4478 return compiler_comprehension(c, e, COMP_LISTCOMP, name,
4479 e->v.ListComp.generators,
4480 e->v.ListComp.elt, NULL);
Nick Coghlan650f0d02007-04-15 12:05:43 +00004481}
4482
4483static int
4484compiler_setcomp(struct compiler *c, expr_ty e)
4485{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004486 static identifier name;
4487 if (!name) {
Zackery Spytzf3036392018-04-15 16:12:29 -06004488 name = PyUnicode_InternFromString("<setcomp>");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004489 if (!name)
4490 return 0;
4491 }
4492 assert(e->kind == SetComp_kind);
4493 return compiler_comprehension(c, e, COMP_SETCOMP, name,
4494 e->v.SetComp.generators,
4495 e->v.SetComp.elt, NULL);
Guido van Rossum992d4a32007-07-11 13:09:30 +00004496}
4497
4498
4499static int
4500compiler_dictcomp(struct compiler *c, expr_ty e)
4501{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004502 static identifier name;
4503 if (!name) {
Zackery Spytzf3036392018-04-15 16:12:29 -06004504 name = PyUnicode_InternFromString("<dictcomp>");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004505 if (!name)
4506 return 0;
4507 }
4508 assert(e->kind == DictComp_kind);
4509 return compiler_comprehension(c, e, COMP_DICTCOMP, name,
4510 e->v.DictComp.generators,
4511 e->v.DictComp.key, e->v.DictComp.value);
Nick Coghlan650f0d02007-04-15 12:05:43 +00004512}
4513
4514
4515static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004516compiler_visit_keyword(struct compiler *c, keyword_ty k)
4517{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004518 VISIT(c, expr, k->value);
4519 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004520}
4521
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004522/* Test whether expression is constant. For constants, report
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004523 whether they are true or false.
4524
4525 Return values: 1 for true, 0 for false, -1 for non-constant.
4526 */
4527
4528static int
Serhiy Storchaka3dfbaf52017-12-25 12:47:50 +02004529expr_constant(expr_ty e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004530{
Serhiy Storchaka3f228112018-09-27 17:42:37 +03004531 if (e->kind == Constant_kind) {
4532 return PyObject_IsTrue(e->v.Constant.value);
Benjamin Peterson442f2092012-12-06 17:41:04 -05004533 }
Serhiy Storchaka3325a672017-12-15 12:35:48 +02004534 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004535}
4536
Yury Selivanov75445082015-05-11 22:57:16 -04004537
4538/*
4539 Implements the async with statement.
4540
4541 The semantics outlined in that PEP are as follows:
4542
4543 async with EXPR as VAR:
4544 BLOCK
4545
4546 It is implemented roughly as:
4547
4548 context = EXPR
4549 exit = context.__aexit__ # not calling it
4550 value = await context.__aenter__()
4551 try:
4552 VAR = value # if VAR present in the syntax
4553 BLOCK
4554 finally:
4555 if an exception was raised:
Serhiy Storchakaec466a12015-06-11 00:09:32 +03004556 exc = copy of (exception, instance, traceback)
Yury Selivanov75445082015-05-11 22:57:16 -04004557 else:
Serhiy Storchakaec466a12015-06-11 00:09:32 +03004558 exc = (None, None, None)
Yury Selivanov75445082015-05-11 22:57:16 -04004559 if not (await exit(*exc)):
4560 raise
4561 */
4562static int
4563compiler_async_with(struct compiler *c, stmt_ty s, int pos)
4564{
4565 basicblock *block, *finally;
4566 withitem_ty item = asdl_seq_GET(s->v.AsyncWith.items, pos);
4567
4568 assert(s->kind == AsyncWith_kind);
Matthias Bussonnier565b4f12019-05-21 13:12:03 -07004569 if (c->c_flags->cf_flags & PyCF_ALLOW_TOP_LEVEL_AWAIT){
4570 c->u->u_ste->ste_coroutine = 1;
4571 } else if (c->u->u_scope_type != COMPILER_SCOPE_ASYNC_FUNCTION){
Zsolt Dollensteine2396502018-04-27 08:58:56 -07004572 return compiler_error(c, "'async with' outside async function");
4573 }
Yury Selivanov75445082015-05-11 22:57:16 -04004574
4575 block = compiler_new_block(c);
4576 finally = compiler_new_block(c);
4577 if (!block || !finally)
4578 return 0;
4579
4580 /* Evaluate EXPR */
4581 VISIT(c, expr, item->context_expr);
4582
4583 ADDOP(c, BEFORE_ASYNC_WITH);
4584 ADDOP(c, GET_AWAITABLE);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03004585 ADDOP_LOAD_CONST(c, Py_None);
Yury Selivanov75445082015-05-11 22:57:16 -04004586 ADDOP(c, YIELD_FROM);
4587
4588 ADDOP_JREL(c, SETUP_ASYNC_WITH, finally);
4589
4590 /* SETUP_ASYNC_WITH pushes a finally block. */
4591 compiler_use_next_block(c, block);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004592 if (!compiler_push_fblock(c, ASYNC_WITH, block, finally)) {
Yury Selivanov75445082015-05-11 22:57:16 -04004593 return 0;
4594 }
4595
4596 if (item->optional_vars) {
4597 VISIT(c, expr, item->optional_vars);
4598 }
4599 else {
4600 /* Discard result from context.__aenter__() */
4601 ADDOP(c, POP_TOP);
4602 }
4603
4604 pos++;
4605 if (pos == asdl_seq_LEN(s->v.AsyncWith.items))
4606 /* BLOCK code */
4607 VISIT_SEQ(c, stmt, s->v.AsyncWith.body)
4608 else if (!compiler_async_with(c, s, pos))
4609 return 0;
4610
4611 /* End of try block; start the finally block */
4612 ADDOP(c, POP_BLOCK);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004613 ADDOP(c, BEGIN_FINALLY);
4614 compiler_pop_fblock(c, ASYNC_WITH, block);
Yury Selivanov75445082015-05-11 22:57:16 -04004615
Yury Selivanov75445082015-05-11 22:57:16 -04004616 compiler_use_next_block(c, finally);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004617 if (!compiler_push_fblock(c, FINALLY_END, finally, NULL))
Yury Selivanov75445082015-05-11 22:57:16 -04004618 return 0;
4619
4620 /* Finally block starts; context.__exit__ is on the stack under
4621 the exception or return information. Just issue our magic
4622 opcode. */
4623 ADDOP(c, WITH_CLEANUP_START);
4624
4625 ADDOP(c, GET_AWAITABLE);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03004626 ADDOP_LOAD_CONST(c, Py_None);
Yury Selivanov75445082015-05-11 22:57:16 -04004627 ADDOP(c, YIELD_FROM);
4628
4629 ADDOP(c, WITH_CLEANUP_FINISH);
4630
4631 /* Finally block ends. */
4632 ADDOP(c, END_FINALLY);
4633 compiler_pop_fblock(c, FINALLY_END, finally);
4634 return 1;
4635}
4636
4637
Guido van Rossumc2e20742006-02-27 22:32:47 +00004638/*
4639 Implements the with statement from PEP 343.
4640
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004641 The semantics outlined in that PEP are as follows:
Guido van Rossumc2e20742006-02-27 22:32:47 +00004642
4643 with EXPR as VAR:
4644 BLOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004645
Guido van Rossumc2e20742006-02-27 22:32:47 +00004646 It is implemented roughly as:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004647
Thomas Wouters477c8d52006-05-27 19:21:47 +00004648 context = EXPR
Guido van Rossumc2e20742006-02-27 22:32:47 +00004649 exit = context.__exit__ # not calling it
4650 value = context.__enter__()
4651 try:
4652 VAR = value # if VAR present in the syntax
4653 BLOCK
4654 finally:
4655 if an exception was raised:
Serhiy Storchakad741a882015-06-11 00:06:39 +03004656 exc = copy of (exception, instance, traceback)
Guido van Rossumc2e20742006-02-27 22:32:47 +00004657 else:
Serhiy Storchakad741a882015-06-11 00:06:39 +03004658 exc = (None, None, None)
Guido van Rossumc2e20742006-02-27 22:32:47 +00004659 exit(*exc)
4660 */
4661static int
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004662compiler_with(struct compiler *c, stmt_ty s, int pos)
Guido van Rossumc2e20742006-02-27 22:32:47 +00004663{
Guido van Rossumc2e20742006-02-27 22:32:47 +00004664 basicblock *block, *finally;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004665 withitem_ty item = asdl_seq_GET(s->v.With.items, pos);
Guido van Rossumc2e20742006-02-27 22:32:47 +00004666
4667 assert(s->kind == With_kind);
4668
Guido van Rossumc2e20742006-02-27 22:32:47 +00004669 block = compiler_new_block(c);
4670 finally = compiler_new_block(c);
4671 if (!block || !finally)
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00004672 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00004673
Thomas Wouters477c8d52006-05-27 19:21:47 +00004674 /* Evaluate EXPR */
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004675 VISIT(c, expr, item->context_expr);
Benjamin Peterson876b2f22009-06-28 03:18:59 +00004676 ADDOP_JREL(c, SETUP_WITH, finally);
Guido van Rossumc2e20742006-02-27 22:32:47 +00004677
Benjamin Peterson876b2f22009-06-28 03:18:59 +00004678 /* SETUP_WITH pushes a finally block. */
Guido van Rossumc2e20742006-02-27 22:32:47 +00004679 compiler_use_next_block(c, block);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004680 if (!compiler_push_fblock(c, WITH, block, finally)) {
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00004681 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00004682 }
4683
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004684 if (item->optional_vars) {
4685 VISIT(c, expr, item->optional_vars);
Benjamin Peterson876b2f22009-06-28 03:18:59 +00004686 }
4687 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004688 /* Discard result from context.__enter__() */
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00004689 ADDOP(c, POP_TOP);
Guido van Rossumc2e20742006-02-27 22:32:47 +00004690 }
4691
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004692 pos++;
4693 if (pos == asdl_seq_LEN(s->v.With.items))
4694 /* BLOCK code */
4695 VISIT_SEQ(c, stmt, s->v.With.body)
4696 else if (!compiler_with(c, s, pos))
4697 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00004698
4699 /* End of try block; start the finally block */
4700 ADDOP(c, POP_BLOCK);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004701 ADDOP(c, BEGIN_FINALLY);
4702 compiler_pop_fblock(c, WITH, block);
Guido van Rossumc2e20742006-02-27 22:32:47 +00004703
Guido van Rossumc2e20742006-02-27 22:32:47 +00004704 compiler_use_next_block(c, finally);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02004705 if (!compiler_push_fblock(c, FINALLY_END, finally, NULL))
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00004706 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00004707
Christian Heimesdd15f6c2008-03-16 00:07:10 +00004708 /* Finally block starts; context.__exit__ is on the stack under
4709 the exception or return information. Just issue our magic
4710 opcode. */
Yury Selivanov75445082015-05-11 22:57:16 -04004711 ADDOP(c, WITH_CLEANUP_START);
4712 ADDOP(c, WITH_CLEANUP_FINISH);
Guido van Rossumc2e20742006-02-27 22:32:47 +00004713
4714 /* Finally block ends. */
4715 ADDOP(c, END_FINALLY);
4716 compiler_pop_fblock(c, FINALLY_END, finally);
4717 return 1;
4718}
4719
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004720static int
Serhiy Storchakada8d72c2018-09-17 15:17:29 +03004721compiler_visit_expr1(struct compiler *c, expr_ty e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004722{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004723 switch (e->kind) {
Emily Morehouse8f59ee02019-01-24 16:49:56 -07004724 case NamedExpr_kind:
4725 VISIT(c, expr, e->v.NamedExpr.value);
4726 ADDOP(c, DUP_TOP);
4727 VISIT(c, expr, e->v.NamedExpr.target);
4728 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004729 case BoolOp_kind:
4730 return compiler_boolop(c, e);
4731 case BinOp_kind:
4732 VISIT(c, expr, e->v.BinOp.left);
4733 VISIT(c, expr, e->v.BinOp.right);
4734 ADDOP(c, binop(c, e->v.BinOp.op));
4735 break;
4736 case UnaryOp_kind:
4737 VISIT(c, expr, e->v.UnaryOp.operand);
4738 ADDOP(c, unaryop(e->v.UnaryOp.op));
4739 break;
4740 case Lambda_kind:
4741 return compiler_lambda(c, e);
4742 case IfExp_kind:
4743 return compiler_ifexp(c, e);
4744 case Dict_kind:
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004745 return compiler_dict(c, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004746 case Set_kind:
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004747 return compiler_set(c, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004748 case GeneratorExp_kind:
4749 return compiler_genexp(c, e);
4750 case ListComp_kind:
4751 return compiler_listcomp(c, e);
4752 case SetComp_kind:
4753 return compiler_setcomp(c, e);
4754 case DictComp_kind:
4755 return compiler_dictcomp(c, e);
4756 case Yield_kind:
4757 if (c->u->u_ste->ste_type != FunctionBlock)
4758 return compiler_error(c, "'yield' outside function");
Mark Dickinsonded35ae2012-11-25 14:36:26 +00004759 if (e->v.Yield.value) {
4760 VISIT(c, expr, e->v.Yield.value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004761 }
4762 else {
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03004763 ADDOP_LOAD_CONST(c, Py_None);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004764 }
Mark Dickinsonded35ae2012-11-25 14:36:26 +00004765 ADDOP(c, YIELD_VALUE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004766 break;
Mark Dickinsonded35ae2012-11-25 14:36:26 +00004767 case YieldFrom_kind:
4768 if (c->u->u_ste->ste_type != FunctionBlock)
4769 return compiler_error(c, "'yield' outside function");
Yury Selivanov75445082015-05-11 22:57:16 -04004770
4771 if (c->u->u_scope_type == COMPILER_SCOPE_ASYNC_FUNCTION)
4772 return compiler_error(c, "'yield from' inside async function");
4773
Mark Dickinsonded35ae2012-11-25 14:36:26 +00004774 VISIT(c, expr, e->v.YieldFrom.value);
Yury Selivanov5376ba92015-06-22 12:19:30 -04004775 ADDOP(c, GET_YIELD_FROM_ITER);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03004776 ADDOP_LOAD_CONST(c, Py_None);
Mark Dickinsonded35ae2012-11-25 14:36:26 +00004777 ADDOP(c, YIELD_FROM);
4778 break;
Yury Selivanov75445082015-05-11 22:57:16 -04004779 case Await_kind:
Matthias Bussonnier565b4f12019-05-21 13:12:03 -07004780 if (!(c->c_flags->cf_flags & PyCF_ALLOW_TOP_LEVEL_AWAIT)){
4781 if (c->u->u_ste->ste_type != FunctionBlock){
4782 return compiler_error(c, "'await' outside function");
4783 }
Yury Selivanov75445082015-05-11 22:57:16 -04004784
Matthias Bussonnier565b4f12019-05-21 13:12:03 -07004785 if (c->u->u_scope_type != COMPILER_SCOPE_ASYNC_FUNCTION &&
4786 c->u->u_scope_type != COMPILER_SCOPE_COMPREHENSION){
4787 return compiler_error(c, "'await' outside async function");
4788 }
4789 }
Yury Selivanov75445082015-05-11 22:57:16 -04004790
4791 VISIT(c, expr, e->v.Await.value);
4792 ADDOP(c, GET_AWAITABLE);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03004793 ADDOP_LOAD_CONST(c, Py_None);
Yury Selivanov75445082015-05-11 22:57:16 -04004794 ADDOP(c, YIELD_FROM);
4795 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004796 case Compare_kind:
4797 return compiler_compare(c, e);
4798 case Call_kind:
4799 return compiler_call(c, e);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01004800 case Constant_kind:
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03004801 ADDOP_LOAD_CONST(c, e->v.Constant.value);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01004802 break;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004803 case JoinedStr_kind:
4804 return compiler_joined_str(c, e);
4805 case FormattedValue_kind:
4806 return compiler_formatted_value(c, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004807 /* The following exprs can be assignment targets. */
4808 case Attribute_kind:
4809 if (e->v.Attribute.ctx != AugStore)
4810 VISIT(c, expr, e->v.Attribute.value);
4811 switch (e->v.Attribute.ctx) {
4812 case AugLoad:
4813 ADDOP(c, DUP_TOP);
Stefan Krahf432a322017-08-21 13:09:59 +02004814 /* Fall through */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004815 case Load:
4816 ADDOP_NAME(c, LOAD_ATTR, e->v.Attribute.attr, names);
4817 break;
4818 case AugStore:
4819 ADDOP(c, ROT_TWO);
Stefan Krahf432a322017-08-21 13:09:59 +02004820 /* Fall through */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004821 case Store:
4822 ADDOP_NAME(c, STORE_ATTR, e->v.Attribute.attr, names);
4823 break;
4824 case Del:
4825 ADDOP_NAME(c, DELETE_ATTR, e->v.Attribute.attr, names);
4826 break;
4827 case Param:
4828 default:
4829 PyErr_SetString(PyExc_SystemError,
4830 "param invalid in attribute expression");
4831 return 0;
4832 }
4833 break;
4834 case Subscript_kind:
4835 switch (e->v.Subscript.ctx) {
4836 case AugLoad:
4837 VISIT(c, expr, e->v.Subscript.value);
4838 VISIT_SLICE(c, e->v.Subscript.slice, AugLoad);
4839 break;
4840 case Load:
Serhiy Storchaka62e44812019-02-16 08:12:19 +02004841 if (!check_subscripter(c, e->v.Subscript.value)) {
4842 return 0;
4843 }
4844 if (!check_index(c, e->v.Subscript.value, e->v.Subscript.slice)) {
4845 return 0;
4846 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004847 VISIT(c, expr, e->v.Subscript.value);
4848 VISIT_SLICE(c, e->v.Subscript.slice, Load);
4849 break;
4850 case AugStore:
4851 VISIT_SLICE(c, e->v.Subscript.slice, AugStore);
4852 break;
4853 case Store:
4854 VISIT(c, expr, e->v.Subscript.value);
4855 VISIT_SLICE(c, e->v.Subscript.slice, Store);
4856 break;
4857 case Del:
4858 VISIT(c, expr, e->v.Subscript.value);
4859 VISIT_SLICE(c, e->v.Subscript.slice, Del);
4860 break;
4861 case Param:
4862 default:
4863 PyErr_SetString(PyExc_SystemError,
4864 "param invalid in subscript expression");
4865 return 0;
4866 }
4867 break;
4868 case Starred_kind:
4869 switch (e->v.Starred.ctx) {
4870 case Store:
4871 /* In all legitimate cases, the Starred node was already replaced
4872 * by compiler_list/compiler_tuple. XXX: is that okay? */
4873 return compiler_error(c,
4874 "starred assignment target must be in a list or tuple");
4875 default:
4876 return compiler_error(c,
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004877 "can't use starred expression here");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004878 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004879 case Name_kind:
4880 return compiler_nameop(c, e->v.Name.id, e->v.Name.ctx);
4881 /* child nodes of List and Tuple will have expr_context set */
4882 case List_kind:
4883 return compiler_list(c, e);
4884 case Tuple_kind:
4885 return compiler_tuple(c, e);
4886 }
4887 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004888}
4889
4890static int
Serhiy Storchakada8d72c2018-09-17 15:17:29 +03004891compiler_visit_expr(struct compiler *c, expr_ty e)
4892{
4893 /* If expr e has a different line number than the last expr/stmt,
4894 set a new line number for the next instruction.
4895 */
4896 int old_lineno = c->u->u_lineno;
4897 int old_col_offset = c->u->u_col_offset;
4898 if (e->lineno != c->u->u_lineno) {
4899 c->u->u_lineno = e->lineno;
4900 c->u->u_lineno_set = 0;
4901 }
4902 /* Updating the column offset is always harmless. */
4903 c->u->u_col_offset = e->col_offset;
4904
4905 int res = compiler_visit_expr1(c, e);
4906
4907 if (old_lineno != c->u->u_lineno) {
4908 c->u->u_lineno = old_lineno;
4909 c->u->u_lineno_set = 0;
4910 }
4911 c->u->u_col_offset = old_col_offset;
4912 return res;
4913}
4914
4915static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004916compiler_augassign(struct compiler *c, stmt_ty s)
4917{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004918 expr_ty e = s->v.AugAssign.target;
4919 expr_ty auge;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004920
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004921 assert(s->kind == AugAssign_kind);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004922
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004923 switch (e->kind) {
4924 case Attribute_kind:
4925 auge = Attribute(e->v.Attribute.value, e->v.Attribute.attr,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004926 AugLoad, e->lineno, e->col_offset,
4927 e->end_lineno, e->end_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004928 if (auge == NULL)
4929 return 0;
4930 VISIT(c, expr, auge);
4931 VISIT(c, expr, s->v.AugAssign.value);
4932 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
4933 auge->v.Attribute.ctx = AugStore;
4934 VISIT(c, expr, auge);
4935 break;
4936 case Subscript_kind:
4937 auge = Subscript(e->v.Subscript.value, e->v.Subscript.slice,
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00004938 AugLoad, e->lineno, e->col_offset,
4939 e->end_lineno, e->end_col_offset, c->c_arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004940 if (auge == NULL)
4941 return 0;
4942 VISIT(c, expr, auge);
4943 VISIT(c, expr, s->v.AugAssign.value);
4944 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
4945 auge->v.Subscript.ctx = AugStore;
4946 VISIT(c, expr, auge);
4947 break;
4948 case Name_kind:
4949 if (!compiler_nameop(c, e->v.Name.id, Load))
4950 return 0;
4951 VISIT(c, expr, s->v.AugAssign.value);
4952 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
4953 return compiler_nameop(c, e->v.Name.id, Store);
4954 default:
4955 PyErr_Format(PyExc_SystemError,
4956 "invalid node type (%d) for augmented assignment",
4957 e->kind);
4958 return 0;
4959 }
4960 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004961}
4962
4963static int
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004964check_ann_expr(struct compiler *c, expr_ty e)
4965{
4966 VISIT(c, expr, e);
4967 ADDOP(c, POP_TOP);
4968 return 1;
4969}
4970
4971static int
4972check_annotation(struct compiler *c, stmt_ty s)
4973{
4974 /* Annotations are only evaluated in a module or class. */
4975 if (c->u->u_scope_type == COMPILER_SCOPE_MODULE ||
4976 c->u->u_scope_type == COMPILER_SCOPE_CLASS) {
4977 return check_ann_expr(c, s->v.AnnAssign.annotation);
4978 }
4979 return 1;
4980}
4981
4982static int
4983check_ann_slice(struct compiler *c, slice_ty sl)
4984{
4985 switch(sl->kind) {
4986 case Index_kind:
4987 return check_ann_expr(c, sl->v.Index.value);
4988 case Slice_kind:
4989 if (sl->v.Slice.lower && !check_ann_expr(c, sl->v.Slice.lower)) {
4990 return 0;
4991 }
4992 if (sl->v.Slice.upper && !check_ann_expr(c, sl->v.Slice.upper)) {
4993 return 0;
4994 }
4995 if (sl->v.Slice.step && !check_ann_expr(c, sl->v.Slice.step)) {
4996 return 0;
4997 }
4998 break;
4999 default:
5000 PyErr_SetString(PyExc_SystemError,
5001 "unexpected slice kind");
5002 return 0;
5003 }
5004 return 1;
5005}
5006
5007static int
5008check_ann_subscr(struct compiler *c, slice_ty sl)
5009{
5010 /* We check that everything in a subscript is defined at runtime. */
5011 Py_ssize_t i, n;
5012
5013 switch (sl->kind) {
5014 case Index_kind:
5015 case Slice_kind:
5016 if (!check_ann_slice(c, sl)) {
5017 return 0;
5018 }
5019 break;
5020 case ExtSlice_kind:
5021 n = asdl_seq_LEN(sl->v.ExtSlice.dims);
5022 for (i = 0; i < n; i++) {
5023 slice_ty subsl = (slice_ty)asdl_seq_GET(sl->v.ExtSlice.dims, i);
5024 switch (subsl->kind) {
5025 case Index_kind:
5026 case Slice_kind:
5027 if (!check_ann_slice(c, subsl)) {
5028 return 0;
5029 }
5030 break;
5031 case ExtSlice_kind:
5032 default:
5033 PyErr_SetString(PyExc_SystemError,
5034 "extended slice invalid in nested slice");
5035 return 0;
5036 }
5037 }
5038 break;
5039 default:
5040 PyErr_Format(PyExc_SystemError,
5041 "invalid subscript kind %d", sl->kind);
5042 return 0;
5043 }
5044 return 1;
5045}
5046
5047static int
5048compiler_annassign(struct compiler *c, stmt_ty s)
5049{
5050 expr_ty targ = s->v.AnnAssign.target;
Guido van Rossum015d8742016-09-11 09:45:24 -07005051 PyObject* mangled;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005052
5053 assert(s->kind == AnnAssign_kind);
5054
5055 /* We perform the actual assignment first. */
5056 if (s->v.AnnAssign.value) {
5057 VISIT(c, expr, s->v.AnnAssign.value);
5058 VISIT(c, expr, targ);
5059 }
5060 switch (targ->kind) {
5061 case Name_kind:
5062 /* If we have a simple name in a module or class, store annotation. */
5063 if (s->v.AnnAssign.simple &&
5064 (c->u->u_scope_type == COMPILER_SCOPE_MODULE ||
5065 c->u->u_scope_type == COMPILER_SCOPE_CLASS)) {
Guido van Rossum95e4d582018-01-26 08:20:18 -08005066 if (c->c_future->ff_features & CO_FUTURE_ANNOTATIONS) {
5067 VISIT(c, annexpr, s->v.AnnAssign.annotation)
5068 }
5069 else {
5070 VISIT(c, expr, s->v.AnnAssign.annotation);
5071 }
Mark Shannon332cd5e2018-01-30 00:41:04 +00005072 ADDOP_NAME(c, LOAD_NAME, __annotations__, names);
Serhiy Storchakaa95d9862018-03-24 22:42:35 +02005073 mangled = _Py_Mangle(c->u->u_private, targ->v.Name.id);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005074 ADDOP_LOAD_CONST_NEW(c, mangled);
Mark Shannon332cd5e2018-01-30 00:41:04 +00005075 ADDOP(c, STORE_SUBSCR);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07005076 }
5077 break;
5078 case Attribute_kind:
5079 if (!s->v.AnnAssign.value &&
5080 !check_ann_expr(c, targ->v.Attribute.value)) {
5081 return 0;
5082 }
5083 break;
5084 case Subscript_kind:
5085 if (!s->v.AnnAssign.value &&
5086 (!check_ann_expr(c, targ->v.Subscript.value) ||
5087 !check_ann_subscr(c, targ->v.Subscript.slice))) {
5088 return 0;
5089 }
5090 break;
5091 default:
5092 PyErr_Format(PyExc_SystemError,
5093 "invalid node type (%d) for annotated assignment",
5094 targ->kind);
5095 return 0;
5096 }
5097 /* Annotation is evaluated last. */
5098 if (!s->v.AnnAssign.simple && !check_annotation(c, s)) {
5099 return 0;
5100 }
5101 return 1;
5102}
5103
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005104/* Raises a SyntaxError and returns 0.
5105 If something goes wrong, a different exception may be raised.
5106*/
5107
5108static int
5109compiler_error(struct compiler *c, const char *errstr)
5110{
Benjamin Peterson43b06862011-05-27 09:08:01 -05005111 PyObject *loc;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005112 PyObject *u = NULL, *v = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005113
Victor Stinner14e461d2013-08-26 22:28:21 +02005114 loc = PyErr_ProgramTextObject(c->c_filename, c->u->u_lineno);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005115 if (!loc) {
5116 Py_INCREF(Py_None);
5117 loc = Py_None;
5118 }
Victor Stinner14e461d2013-08-26 22:28:21 +02005119 u = Py_BuildValue("(OiiO)", c->c_filename, c->u->u_lineno,
Ammar Askar025eb982018-09-24 17:12:49 -04005120 c->u->u_col_offset + 1, loc);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005121 if (!u)
5122 goto exit;
5123 v = Py_BuildValue("(zO)", errstr, u);
5124 if (!v)
5125 goto exit;
5126 PyErr_SetObject(PyExc_SyntaxError, v);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005127 exit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005128 Py_DECREF(loc);
5129 Py_XDECREF(u);
5130 Py_XDECREF(v);
5131 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005132}
5133
Serhiy Storchakad31e7732018-10-21 10:09:39 +03005134/* Emits a SyntaxWarning and returns 1 on success.
5135 If a SyntaxWarning raised as error, replaces it with a SyntaxError
5136 and returns 0.
5137*/
5138static int
Serhiy Storchaka62e44812019-02-16 08:12:19 +02005139compiler_warn(struct compiler *c, const char *format, ...)
Serhiy Storchakad31e7732018-10-21 10:09:39 +03005140{
Serhiy Storchaka62e44812019-02-16 08:12:19 +02005141 va_list vargs;
5142#ifdef HAVE_STDARG_PROTOTYPES
5143 va_start(vargs, format);
5144#else
5145 va_start(vargs);
5146#endif
5147 PyObject *msg = PyUnicode_FromFormatV(format, vargs);
5148 va_end(vargs);
Serhiy Storchakad31e7732018-10-21 10:09:39 +03005149 if (msg == NULL) {
5150 return 0;
5151 }
5152 if (PyErr_WarnExplicitObject(PyExc_SyntaxWarning, msg, c->c_filename,
5153 c->u->u_lineno, NULL, NULL) < 0)
5154 {
Serhiy Storchakad31e7732018-10-21 10:09:39 +03005155 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
Serhiy Storchaka62e44812019-02-16 08:12:19 +02005156 /* Replace the SyntaxWarning exception with a SyntaxError
5157 to get a more accurate error report */
Serhiy Storchakad31e7732018-10-21 10:09:39 +03005158 PyErr_Clear();
Serhiy Storchaka62e44812019-02-16 08:12:19 +02005159 assert(PyUnicode_AsUTF8(msg) != NULL);
5160 compiler_error(c, PyUnicode_AsUTF8(msg));
Serhiy Storchakad31e7732018-10-21 10:09:39 +03005161 }
Serhiy Storchaka62e44812019-02-16 08:12:19 +02005162 Py_DECREF(msg);
Serhiy Storchakad31e7732018-10-21 10:09:39 +03005163 return 0;
5164 }
5165 Py_DECREF(msg);
5166 return 1;
5167}
5168
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005169static int
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005170compiler_handle_subscr(struct compiler *c, const char *kind,
5171 expr_context_ty ctx)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005172{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005173 int op = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005174
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005175 /* XXX this code is duplicated */
5176 switch (ctx) {
5177 case AugLoad: /* fall through to Load */
5178 case Load: op = BINARY_SUBSCR; break;
5179 case AugStore:/* fall through to Store */
5180 case Store: op = STORE_SUBSCR; break;
5181 case Del: op = DELETE_SUBSCR; break;
5182 case Param:
5183 PyErr_Format(PyExc_SystemError,
5184 "invalid %s kind %d in subscript\n",
5185 kind, ctx);
5186 return 0;
5187 }
5188 if (ctx == AugLoad) {
Antoine Pitrou74a69fa2010-09-04 18:43:52 +00005189 ADDOP(c, DUP_TOP_TWO);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005190 }
5191 else if (ctx == AugStore) {
5192 ADDOP(c, ROT_THREE);
5193 }
5194 ADDOP(c, op);
5195 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005196}
5197
5198static int
5199compiler_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)
5200{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005201 int n = 2;
5202 assert(s->kind == Slice_kind);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005203
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005204 /* only handles the cases where BUILD_SLICE is emitted */
5205 if (s->v.Slice.lower) {
5206 VISIT(c, expr, s->v.Slice.lower);
5207 }
5208 else {
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005209 ADDOP_LOAD_CONST(c, Py_None);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005210 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005211
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005212 if (s->v.Slice.upper) {
5213 VISIT(c, expr, s->v.Slice.upper);
5214 }
5215 else {
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005216 ADDOP_LOAD_CONST(c, Py_None);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005217 }
5218
5219 if (s->v.Slice.step) {
5220 n++;
5221 VISIT(c, expr, s->v.Slice.step);
5222 }
5223 ADDOP_I(c, BUILD_SLICE, n);
5224 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005225}
5226
5227static int
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005228compiler_visit_nested_slice(struct compiler *c, slice_ty s,
5229 expr_context_ty ctx)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005230{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005231 switch (s->kind) {
5232 case Slice_kind:
5233 return compiler_slice(c, s, ctx);
5234 case Index_kind:
5235 VISIT(c, expr, s->v.Index.value);
5236 break;
5237 case ExtSlice_kind:
5238 default:
5239 PyErr_SetString(PyExc_SystemError,
5240 "extended slice invalid in nested slice");
5241 return 0;
5242 }
5243 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005244}
5245
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005246static int
5247compiler_visit_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)
5248{
Serhiy Storchakae2f92de2017-11-11 13:06:26 +02005249 const char * kindname = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005250 switch (s->kind) {
5251 case Index_kind:
5252 kindname = "index";
5253 if (ctx != AugStore) {
5254 VISIT(c, expr, s->v.Index.value);
5255 }
5256 break;
5257 case Slice_kind:
5258 kindname = "slice";
5259 if (ctx != AugStore) {
5260 if (!compiler_slice(c, s, ctx))
5261 return 0;
5262 }
5263 break;
5264 case ExtSlice_kind:
5265 kindname = "extended slice";
5266 if (ctx != AugStore) {
Victor Stinnerad9a0662013-11-19 22:23:20 +01005267 Py_ssize_t i, n = asdl_seq_LEN(s->v.ExtSlice.dims);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005268 for (i = 0; i < n; i++) {
5269 slice_ty sub = (slice_ty)asdl_seq_GET(
5270 s->v.ExtSlice.dims, i);
5271 if (!compiler_visit_nested_slice(c, sub, ctx))
5272 return 0;
5273 }
5274 ADDOP_I(c, BUILD_TUPLE, n);
5275 }
5276 break;
5277 default:
5278 PyErr_Format(PyExc_SystemError,
5279 "invalid subscript kind %d", s->kind);
5280 return 0;
5281 }
5282 return compiler_handle_subscr(c, kindname, ctx);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005283}
5284
Thomas Wouters89f507f2006-12-13 04:49:30 +00005285/* End of the compiler section, beginning of the assembler section */
5286
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005287/* do depth-first search of basic block graph, starting with block.
5288 post records the block indices in post-order.
5289
5290 XXX must handle implicit jumps from one block to next
5291*/
5292
Thomas Wouters89f507f2006-12-13 04:49:30 +00005293struct assembler {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005294 PyObject *a_bytecode; /* string containing bytecode */
5295 int a_offset; /* offset into bytecode */
5296 int a_nblocks; /* number of reachable blocks */
5297 basicblock **a_postorder; /* list of blocks in dfs postorder */
5298 PyObject *a_lnotab; /* string containing lnotab */
5299 int a_lnotab_off; /* offset into lnotab */
5300 int a_lineno; /* last lineno of emitted instruction */
5301 int a_lineno_off; /* bytecode offset of last lineno */
Thomas Wouters89f507f2006-12-13 04:49:30 +00005302};
5303
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005304static void
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005305dfs(struct compiler *c, basicblock *b, struct assembler *a, int end)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005306{
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005307 int i, j;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005308
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005309 /* Get rid of recursion for normal control flow.
5310 Since the number of blocks is limited, unused space in a_postorder
5311 (from a_nblocks to end) can be used as a stack for still not ordered
5312 blocks. */
5313 for (j = end; b && !b->b_seen; b = b->b_next) {
5314 b->b_seen = 1;
5315 assert(a->a_nblocks < j);
5316 a->a_postorder[--j] = b;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005317 }
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005318 while (j < end) {
5319 b = a->a_postorder[j++];
5320 for (i = 0; i < b->b_iused; i++) {
5321 struct instr *instr = &b->b_instr[i];
5322 if (instr->i_jrel || instr->i_jabs)
5323 dfs(c, instr->i_target, a, j);
5324 }
5325 assert(a->a_nblocks < j);
5326 a->a_postorder[a->a_nblocks++] = b;
5327 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005328}
5329
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005330Py_LOCAL_INLINE(void)
5331stackdepth_push(basicblock ***sp, basicblock *b, int depth)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005332{
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02005333 assert(b->b_startdepth < 0 || b->b_startdepth == depth);
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005334 if (b->b_startdepth < depth) {
5335 assert(b->b_startdepth < 0);
5336 b->b_startdepth = depth;
5337 *(*sp)++ = b;
Serhiy Storchakad4864c62018-01-09 21:54:52 +02005338 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005339}
5340
5341/* Find the flow path that needs the largest stack. We assume that
5342 * cycles in the flow graph have no net effect on the stack depth.
5343 */
5344static int
5345stackdepth(struct compiler *c)
5346{
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005347 basicblock *b, *entryblock = NULL;
5348 basicblock **stack, **sp;
5349 int nblocks = 0, maxdepth = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005350 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005351 b->b_startdepth = INT_MIN;
5352 entryblock = b;
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005353 nblocks++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005354 }
5355 if (!entryblock)
5356 return 0;
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005357 stack = (basicblock **)PyObject_Malloc(sizeof(basicblock *) * nblocks);
5358 if (!stack) {
5359 PyErr_NoMemory();
5360 return -1;
5361 }
5362
5363 sp = stack;
5364 stackdepth_push(&sp, entryblock, 0);
5365 while (sp != stack) {
5366 b = *--sp;
5367 int depth = b->b_startdepth;
5368 assert(depth >= 0);
5369 basicblock *next = b->b_next;
5370 for (int i = 0; i < b->b_iused; i++) {
5371 struct instr *instr = &b->b_instr[i];
5372 int effect = stack_effect(instr->i_opcode, instr->i_oparg, 0);
5373 if (effect == PY_INVALID_STACK_EFFECT) {
5374 fprintf(stderr, "opcode = %d\n", instr->i_opcode);
5375 Py_FatalError("PyCompile_OpcodeStackEffect()");
5376 }
5377 int new_depth = depth + effect;
5378 if (new_depth > maxdepth) {
5379 maxdepth = new_depth;
5380 }
5381 assert(depth >= 0); /* invalid code or bug in stackdepth() */
5382 if (instr->i_jrel || instr->i_jabs) {
5383 effect = stack_effect(instr->i_opcode, instr->i_oparg, 1);
5384 assert(effect != PY_INVALID_STACK_EFFECT);
5385 int target_depth = depth + effect;
5386 if (target_depth > maxdepth) {
5387 maxdepth = target_depth;
5388 }
5389 assert(target_depth >= 0); /* invalid code or bug in stackdepth() */
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02005390 if (instr->i_opcode == CALL_FINALLY) {
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005391 assert(instr->i_target->b_startdepth >= 0);
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02005392 assert(instr->i_target->b_startdepth >= target_depth);
5393 depth = new_depth;
5394 continue;
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005395 }
5396 stackdepth_push(&sp, instr->i_target, target_depth);
5397 }
5398 depth = new_depth;
5399 if (instr->i_opcode == JUMP_ABSOLUTE ||
5400 instr->i_opcode == JUMP_FORWARD ||
5401 instr->i_opcode == RETURN_VALUE ||
Serhiy Storchaka520b7ae2018-02-22 23:33:30 +02005402 instr->i_opcode == RAISE_VARARGS)
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005403 {
5404 /* remaining code is dead */
5405 next = NULL;
5406 break;
5407 }
5408 }
5409 if (next != NULL) {
5410 stackdepth_push(&sp, next, depth);
5411 }
5412 }
5413 PyObject_Free(stack);
5414 return maxdepth;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005415}
5416
5417static int
5418assemble_init(struct assembler *a, int nblocks, int firstlineno)
5419{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005420 memset(a, 0, sizeof(struct assembler));
5421 a->a_lineno = firstlineno;
5422 a->a_bytecode = PyBytes_FromStringAndSize(NULL, DEFAULT_CODE_SIZE);
5423 if (!a->a_bytecode)
5424 return 0;
5425 a->a_lnotab = PyBytes_FromStringAndSize(NULL, DEFAULT_LNOTAB_SIZE);
5426 if (!a->a_lnotab)
5427 return 0;
Benjamin Peterson2f8bfef2016-09-07 09:26:18 -07005428 if ((size_t)nblocks > SIZE_MAX / sizeof(basicblock *)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005429 PyErr_NoMemory();
5430 return 0;
5431 }
5432 a->a_postorder = (basicblock **)PyObject_Malloc(
5433 sizeof(basicblock *) * nblocks);
5434 if (!a->a_postorder) {
5435 PyErr_NoMemory();
5436 return 0;
5437 }
5438 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005439}
5440
5441static void
5442assemble_free(struct assembler *a)
5443{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005444 Py_XDECREF(a->a_bytecode);
5445 Py_XDECREF(a->a_lnotab);
5446 if (a->a_postorder)
5447 PyObject_Free(a->a_postorder);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005448}
5449
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005450static int
5451blocksize(basicblock *b)
5452{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005453 int i;
5454 int size = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005455
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005456 for (i = 0; i < b->b_iused; i++)
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005457 size += instrsize(b->b_instr[i].i_oparg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005458 return size;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005459}
5460
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00005461/* Appends a pair to the end of the line number table, a_lnotab, representing
5462 the instruction's bytecode offset and line number. See
5463 Objects/lnotab_notes.txt for the description of the line number table. */
Tim Peters2a7f3842001-06-09 09:26:21 +00005464
Guido van Rossumf68d8e52001-04-14 17:55:09 +00005465static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005466assemble_lnotab(struct assembler *a, struct instr *i)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005467{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005468 int d_bytecode, d_lineno;
Victor Stinnerad9a0662013-11-19 22:23:20 +01005469 Py_ssize_t len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005470 unsigned char *lnotab;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005471
Serhiy Storchakaab874002016-09-11 13:48:15 +03005472 d_bytecode = (a->a_offset - a->a_lineno_off) * sizeof(_Py_CODEUNIT);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005473 d_lineno = i->i_lineno - a->a_lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005474
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005475 assert(d_bytecode >= 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005476
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005477 if(d_bytecode == 0 && d_lineno == 0)
5478 return 1;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00005479
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005480 if (d_bytecode > 255) {
5481 int j, nbytes, ncodes = d_bytecode / 255;
5482 nbytes = a->a_lnotab_off + 2 * ncodes;
5483 len = PyBytes_GET_SIZE(a->a_lnotab);
5484 if (nbytes >= len) {
5485 if ((len <= INT_MAX / 2) && (len * 2 < nbytes))
5486 len = nbytes;
5487 else if (len <= INT_MAX / 2)
5488 len *= 2;
5489 else {
5490 PyErr_NoMemory();
5491 return 0;
5492 }
5493 if (_PyBytes_Resize(&a->a_lnotab, len) < 0)
5494 return 0;
5495 }
5496 lnotab = (unsigned char *)
5497 PyBytes_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
5498 for (j = 0; j < ncodes; j++) {
5499 *lnotab++ = 255;
5500 *lnotab++ = 0;
5501 }
5502 d_bytecode -= ncodes * 255;
5503 a->a_lnotab_off += ncodes * 2;
5504 }
Victor Stinnerf3914eb2016-01-20 12:16:21 +01005505 assert(0 <= d_bytecode && d_bytecode <= 255);
5506
5507 if (d_lineno < -128 || 127 < d_lineno) {
5508 int j, nbytes, ncodes, k;
5509 if (d_lineno < 0) {
5510 k = -128;
5511 /* use division on positive numbers */
5512 ncodes = (-d_lineno) / 128;
5513 }
5514 else {
5515 k = 127;
5516 ncodes = d_lineno / 127;
5517 }
5518 d_lineno -= ncodes * k;
5519 assert(ncodes >= 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005520 nbytes = a->a_lnotab_off + 2 * ncodes;
5521 len = PyBytes_GET_SIZE(a->a_lnotab);
5522 if (nbytes >= len) {
5523 if ((len <= INT_MAX / 2) && len * 2 < nbytes)
5524 len = nbytes;
5525 else if (len <= INT_MAX / 2)
5526 len *= 2;
5527 else {
5528 PyErr_NoMemory();
5529 return 0;
5530 }
5531 if (_PyBytes_Resize(&a->a_lnotab, len) < 0)
5532 return 0;
5533 }
5534 lnotab = (unsigned char *)
5535 PyBytes_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
5536 *lnotab++ = d_bytecode;
Victor Stinnerf3914eb2016-01-20 12:16:21 +01005537 *lnotab++ = k;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005538 d_bytecode = 0;
5539 for (j = 1; j < ncodes; j++) {
5540 *lnotab++ = 0;
Victor Stinnerf3914eb2016-01-20 12:16:21 +01005541 *lnotab++ = k;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005542 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005543 a->a_lnotab_off += ncodes * 2;
5544 }
Victor Stinnerf3914eb2016-01-20 12:16:21 +01005545 assert(-128 <= d_lineno && d_lineno <= 127);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005546
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005547 len = PyBytes_GET_SIZE(a->a_lnotab);
5548 if (a->a_lnotab_off + 2 >= len) {
5549 if (_PyBytes_Resize(&a->a_lnotab, len * 2) < 0)
5550 return 0;
5551 }
5552 lnotab = (unsigned char *)
5553 PyBytes_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
Tim Peters51e26512001-09-07 08:45:55 +00005554
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005555 a->a_lnotab_off += 2;
5556 if (d_bytecode) {
5557 *lnotab++ = d_bytecode;
Victor Stinner4f2dab52011-05-27 16:46:51 +02005558 *lnotab++ = d_lineno;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005559 }
5560 else { /* First line of a block; def stmt, etc. */
5561 *lnotab++ = 0;
Victor Stinner4f2dab52011-05-27 16:46:51 +02005562 *lnotab++ = d_lineno;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005563 }
5564 a->a_lineno = i->i_lineno;
5565 a->a_lineno_off = a->a_offset;
5566 return 1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005567}
5568
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005569/* assemble_emit()
5570 Extend the bytecode with a new instruction.
5571 Update lnotab if necessary.
Jeremy Hylton376e63d2003-08-28 14:42:14 +00005572*/
5573
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00005574static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005575assemble_emit(struct assembler *a, struct instr *i)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00005576{
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005577 int size, arg = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005578 Py_ssize_t len = PyBytes_GET_SIZE(a->a_bytecode);
Serhiy Storchakaab874002016-09-11 13:48:15 +03005579 _Py_CODEUNIT *code;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005580
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005581 arg = i->i_oparg;
5582 size = instrsize(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005583 if (i->i_lineno && !assemble_lnotab(a, i))
5584 return 0;
Serhiy Storchakaab874002016-09-11 13:48:15 +03005585 if (a->a_offset + size >= len / (int)sizeof(_Py_CODEUNIT)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005586 if (len > PY_SSIZE_T_MAX / 2)
5587 return 0;
5588 if (_PyBytes_Resize(&a->a_bytecode, len * 2) < 0)
5589 return 0;
5590 }
Serhiy Storchakaab874002016-09-11 13:48:15 +03005591 code = (_Py_CODEUNIT *)PyBytes_AS_STRING(a->a_bytecode) + a->a_offset;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005592 a->a_offset += size;
Serhiy Storchakaab874002016-09-11 13:48:15 +03005593 write_op_arg(code, i->i_opcode, arg, size);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005594 return 1;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00005595}
5596
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00005597static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005598assemble_jump_offsets(struct assembler *a, struct compiler *c)
Anthony Baxterc2a5a632004-08-02 06:10:11 +00005599{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005600 basicblock *b;
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005601 int bsize, totsize, extended_arg_recompile;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005602 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00005603
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005604 /* Compute the size of each block and fixup jump args.
5605 Replace block pointer with position in bytecode. */
5606 do {
5607 totsize = 0;
5608 for (i = a->a_nblocks - 1; i >= 0; i--) {
5609 b = a->a_postorder[i];
5610 bsize = blocksize(b);
5611 b->b_offset = totsize;
5612 totsize += bsize;
5613 }
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005614 extended_arg_recompile = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005615 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
5616 bsize = b->b_offset;
5617 for (i = 0; i < b->b_iused; i++) {
5618 struct instr *instr = &b->b_instr[i];
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005619 int isize = instrsize(instr->i_oparg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005620 /* Relative jumps are computed relative to
5621 the instruction pointer after fetching
5622 the jump instruction.
5623 */
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005624 bsize += isize;
5625 if (instr->i_jabs || instr->i_jrel) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005626 instr->i_oparg = instr->i_target->b_offset;
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005627 if (instr->i_jrel) {
5628 instr->i_oparg -= bsize;
5629 }
Serhiy Storchakaab874002016-09-11 13:48:15 +03005630 instr->i_oparg *= sizeof(_Py_CODEUNIT);
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005631 if (instrsize(instr->i_oparg) != isize) {
5632 extended_arg_recompile = 1;
5633 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005634 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005635 }
5636 }
Neal Norwitzf1d50682005-10-23 23:00:41 +00005637
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005638 /* XXX: This is an awful hack that could hurt performance, but
5639 on the bright side it should work until we come up
5640 with a better solution.
Neal Norwitzf1d50682005-10-23 23:00:41 +00005641
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005642 The issue is that in the first loop blocksize() is called
5643 which calls instrsize() which requires i_oparg be set
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005644 appropriately. There is a bootstrap problem because
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005645 i_oparg is calculated in the second loop above.
Neal Norwitzf1d50682005-10-23 23:00:41 +00005646
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005647 So we loop until we stop seeing new EXTENDED_ARGs.
5648 The only EXTENDED_ARGs that could be popping up are
5649 ones in jump instructions. So this should converge
5650 fairly quickly.
5651 */
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005652 } while (extended_arg_recompile);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005653}
5654
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005655static PyObject *
Victor Stinnerad9a0662013-11-19 22:23:20 +01005656dict_keys_inorder(PyObject *dict, Py_ssize_t offset)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005657{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005658 PyObject *tuple, *k, *v;
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +02005659 Py_ssize_t i, pos = 0, size = PyDict_GET_SIZE(dict);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005660
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005661 tuple = PyTuple_New(size);
5662 if (tuple == NULL)
5663 return NULL;
5664 while (PyDict_Next(dict, &pos, &k, &v)) {
5665 i = PyLong_AS_LONG(v);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005666 Py_INCREF(k);
5667 assert((i - offset) < size);
5668 assert((i - offset) >= 0);
5669 PyTuple_SET_ITEM(tuple, i - offset, k);
5670 }
5671 return tuple;
5672}
5673
5674static PyObject *
5675consts_dict_keys_inorder(PyObject *dict)
5676{
5677 PyObject *consts, *k, *v;
5678 Py_ssize_t i, pos = 0, size = PyDict_GET_SIZE(dict);
5679
5680 consts = PyList_New(size); /* PyCode_Optimize() requires a list */
5681 if (consts == NULL)
5682 return NULL;
5683 while (PyDict_Next(dict, &pos, &k, &v)) {
5684 i = PyLong_AS_LONG(v);
Serhiy Storchakab7e1eff2018-04-19 08:28:04 +03005685 /* The keys of the dictionary can be tuples wrapping a contant.
5686 * (see compiler_add_o and _PyCode_ConstantKey). In that case
5687 * the object we want is always second. */
5688 if (PyTuple_CheckExact(k)) {
5689 k = PyTuple_GET_ITEM(k, 1);
5690 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005691 Py_INCREF(k);
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005692 assert(i < size);
5693 assert(i >= 0);
5694 PyList_SET_ITEM(consts, i, k);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005695 }
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005696 return consts;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005697}
5698
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005699static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005700compute_code_flags(struct compiler *c)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005701{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005702 PySTEntryObject *ste = c->u->u_ste;
Victor Stinnerad9a0662013-11-19 22:23:20 +01005703 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005704 if (ste->ste_type == FunctionBlock) {
Benjamin Peterson1dfd2472015-04-27 21:44:22 -04005705 flags |= CO_NEWLOCALS | CO_OPTIMIZED;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005706 if (ste->ste_nested)
5707 flags |= CO_NESTED;
Yury Selivanoveb636452016-09-08 22:01:51 -07005708 if (ste->ste_generator && !ste->ste_coroutine)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005709 flags |= CO_GENERATOR;
Yury Selivanoveb636452016-09-08 22:01:51 -07005710 if (!ste->ste_generator && ste->ste_coroutine)
5711 flags |= CO_COROUTINE;
5712 if (ste->ste_generator && ste->ste_coroutine)
5713 flags |= CO_ASYNC_GENERATOR;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005714 if (ste->ste_varargs)
5715 flags |= CO_VARARGS;
5716 if (ste->ste_varkeywords)
5717 flags |= CO_VARKEYWORDS;
5718 }
Thomas Wouters5e9f1fa2006-02-28 20:02:27 +00005719
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005720 /* (Only) inherit compilerflags in PyCF_MASK */
5721 flags |= (c->c_flags->cf_flags & PyCF_MASK);
Thomas Wouters5e9f1fa2006-02-28 20:02:27 +00005722
Matthias Bussonnier565b4f12019-05-21 13:12:03 -07005723 if ((c->c_flags->cf_flags & PyCF_ALLOW_TOP_LEVEL_AWAIT) &&
5724 ste->ste_coroutine &&
5725 !ste->ste_generator) {
5726 flags |= CO_COROUTINE;
5727 }
5728
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005729 return flags;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005730}
5731
INADA Naokic2e16072018-11-26 21:23:22 +09005732// Merge *tuple* with constant cache.
5733// Unlike merge_consts_recursive(), this function doesn't work recursively.
5734static int
5735merge_const_tuple(struct compiler *c, PyObject **tuple)
5736{
5737 assert(PyTuple_CheckExact(*tuple));
5738
5739 PyObject *key = _PyCode_ConstantKey(*tuple);
5740 if (key == NULL) {
5741 return 0;
5742 }
5743
5744 // t is borrowed reference
5745 PyObject *t = PyDict_SetDefault(c->c_const_cache, key, key);
5746 Py_DECREF(key);
5747 if (t == NULL) {
5748 return 0;
5749 }
5750 if (t == key) { // tuple is new constant.
5751 return 1;
5752 }
5753
5754 PyObject *u = PyTuple_GET_ITEM(t, 1);
5755 Py_INCREF(u);
5756 Py_DECREF(*tuple);
5757 *tuple = u;
5758 return 1;
5759}
5760
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005761static PyCodeObject *
5762makecode(struct compiler *c, struct assembler *a)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005763{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005764 PyObject *tmp;
5765 PyCodeObject *co = NULL;
5766 PyObject *consts = NULL;
5767 PyObject *names = NULL;
5768 PyObject *varnames = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005769 PyObject *name = NULL;
5770 PyObject *freevars = NULL;
5771 PyObject *cellvars = NULL;
5772 PyObject *bytecode = NULL;
Victor Stinnerad9a0662013-11-19 22:23:20 +01005773 Py_ssize_t nlocals;
5774 int nlocals_int;
5775 int flags;
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01005776 int argcount, posonlyargcount, kwonlyargcount, maxdepth;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005777
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005778 consts = consts_dict_keys_inorder(c->u->u_consts);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005779 names = dict_keys_inorder(c->u->u_names, 0);
5780 varnames = dict_keys_inorder(c->u->u_varnames, 0);
5781 if (!consts || !names || !varnames)
5782 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005783
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005784 cellvars = dict_keys_inorder(c->u->u_cellvars, 0);
5785 if (!cellvars)
5786 goto error;
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005787 freevars = dict_keys_inorder(c->u->u_freevars, PyTuple_GET_SIZE(cellvars));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005788 if (!freevars)
5789 goto error;
Victor Stinnerad9a0662013-11-19 22:23:20 +01005790
INADA Naokic2e16072018-11-26 21:23:22 +09005791 if (!merge_const_tuple(c, &names) ||
5792 !merge_const_tuple(c, &varnames) ||
5793 !merge_const_tuple(c, &cellvars) ||
5794 !merge_const_tuple(c, &freevars))
5795 {
5796 goto error;
5797 }
5798
Serhiy Storchaka5ab81d72016-12-16 16:18:57 +02005799 nlocals = PyDict_GET_SIZE(c->u->u_varnames);
Victor Stinnerad9a0662013-11-19 22:23:20 +01005800 assert(nlocals < INT_MAX);
5801 nlocals_int = Py_SAFE_DOWNCAST(nlocals, Py_ssize_t, int);
5802
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005803 flags = compute_code_flags(c);
5804 if (flags < 0)
5805 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005806
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005807 bytecode = PyCode_Optimize(a->a_bytecode, consts, names, a->a_lnotab);
5808 if (!bytecode)
5809 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005810
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005811 tmp = PyList_AsTuple(consts); /* PyCode_New requires a tuple */
5812 if (!tmp)
5813 goto error;
5814 Py_DECREF(consts);
5815 consts = tmp;
INADA Naokic2e16072018-11-26 21:23:22 +09005816 if (!merge_const_tuple(c, &consts)) {
5817 goto error;
5818 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005819
Victor Stinnerf8e32212013-11-19 23:56:34 +01005820 argcount = Py_SAFE_DOWNCAST(c->u->u_argcount, Py_ssize_t, int);
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01005821 posonlyargcount = Py_SAFE_DOWNCAST(c->u->u_posonlyargcount, Py_ssize_t, int);
Victor Stinnerf8e32212013-11-19 23:56:34 +01005822 kwonlyargcount = Py_SAFE_DOWNCAST(c->u->u_kwonlyargcount, Py_ssize_t, int);
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005823 maxdepth = stackdepth(c);
5824 if (maxdepth < 0) {
5825 goto error;
5826 }
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01005827 co = PyCode_New(argcount, posonlyargcount, kwonlyargcount,
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005828 nlocals_int, maxdepth, flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005829 bytecode, consts, names, varnames,
5830 freevars, cellvars,
Victor Stinner14e461d2013-08-26 22:28:21 +02005831 c->c_filename, c->u->u_name,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005832 c->u->u_firstlineno,
5833 a->a_lnotab);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005834 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005835 Py_XDECREF(consts);
5836 Py_XDECREF(names);
5837 Py_XDECREF(varnames);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005838 Py_XDECREF(name);
5839 Py_XDECREF(freevars);
5840 Py_XDECREF(cellvars);
5841 Py_XDECREF(bytecode);
5842 return co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005843}
5844
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005845
5846/* For debugging purposes only */
5847#if 0
5848static void
5849dump_instr(const struct instr *i)
5850{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005851 const char *jrel = i->i_jrel ? "jrel " : "";
5852 const char *jabs = i->i_jabs ? "jabs " : "";
5853 char arg[128];
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005854
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005855 *arg = '\0';
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005856 if (HAS_ARG(i->i_opcode)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005857 sprintf(arg, "arg: %d ", i->i_oparg);
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005858 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005859 fprintf(stderr, "line: %d, opcode: %d %s%s%s\n",
5860 i->i_lineno, i->i_opcode, arg, jabs, jrel);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005861}
5862
5863static void
5864dump_basicblock(const basicblock *b)
5865{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005866 const char *seen = b->b_seen ? "seen " : "";
5867 const char *b_return = b->b_return ? "return " : "";
5868 fprintf(stderr, "used: %d, depth: %d, offset: %d %s%s\n",
5869 b->b_iused, b->b_startdepth, b->b_offset, seen, b_return);
5870 if (b->b_instr) {
5871 int i;
5872 for (i = 0; i < b->b_iused; i++) {
5873 fprintf(stderr, " [%02d] ", i);
5874 dump_instr(b->b_instr + i);
5875 }
5876 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005877}
5878#endif
5879
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005880static PyCodeObject *
5881assemble(struct compiler *c, int addNone)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005882{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005883 basicblock *b, *entryblock;
5884 struct assembler a;
5885 int i, j, nblocks;
5886 PyCodeObject *co = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005887
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005888 /* Make sure every block that falls off the end returns None.
5889 XXX NEXT_BLOCK() isn't quite right, because if the last
5890 block ends with a jump or return b_next shouldn't set.
5891 */
5892 if (!c->u->u_curblock->b_return) {
5893 NEXT_BLOCK(c);
5894 if (addNone)
Serhiy Storchakad70c2a62018-04-20 16:01:25 +03005895 ADDOP_LOAD_CONST(c, Py_None);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005896 ADDOP(c, RETURN_VALUE);
5897 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005898
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005899 nblocks = 0;
5900 entryblock = NULL;
5901 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
5902 nblocks++;
5903 entryblock = b;
5904 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005905
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005906 /* Set firstlineno if it wasn't explicitly set. */
5907 if (!c->u->u_firstlineno) {
Ned Deilydc35cda2016-08-17 17:18:33 -04005908 if (entryblock && entryblock->b_instr && entryblock->b_instr->i_lineno)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005909 c->u->u_firstlineno = entryblock->b_instr->i_lineno;
5910 else
5911 c->u->u_firstlineno = 1;
5912 }
5913 if (!assemble_init(&a, nblocks, c->u->u_firstlineno))
5914 goto error;
Serhiy Storchaka782d6fe2018-01-11 20:20:13 +02005915 dfs(c, entryblock, &a, nblocks);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005916
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005917 /* Can't modify the bytecode after computing jump offsets. */
5918 assemble_jump_offsets(&a, c);
Tim Petersb6c3cea2001-06-26 03:36:28 +00005919
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005920 /* Emit code in reverse postorder from dfs. */
5921 for (i = a.a_nblocks - 1; i >= 0; i--) {
5922 b = a.a_postorder[i];
5923 for (j = 0; j < b->b_iused; j++)
5924 if (!assemble_emit(&a, &b->b_instr[j]))
5925 goto error;
5926 }
Tim Petersb6c3cea2001-06-26 03:36:28 +00005927
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005928 if (_PyBytes_Resize(&a.a_lnotab, a.a_lnotab_off) < 0)
5929 goto error;
Serhiy Storchakaab874002016-09-11 13:48:15 +03005930 if (_PyBytes_Resize(&a.a_bytecode, a.a_offset * sizeof(_Py_CODEUNIT)) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005931 goto error;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005932
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005933 co = makecode(c, &a);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005934 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005935 assemble_free(&a);
5936 return co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005937}
Georg Brandl8334fd92010-12-04 10:26:46 +00005938
5939#undef PyAST_Compile
Benjamin Petersone5024512018-09-12 12:06:42 -07005940PyCodeObject *
Georg Brandl8334fd92010-12-04 10:26:46 +00005941PyAST_Compile(mod_ty mod, const char *filename, PyCompilerFlags *flags,
5942 PyArena *arena)
5943{
5944 return PyAST_CompileEx(mod, filename, flags, -1, arena);
5945}