blob: 6bab86eb0ba09a0d10bed51e1a91a8278ffbf4c4 [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"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000027#include "node.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000028#include "ast.h"
29#include "code.h"
Jeremy Hylton4b38da62001-02-02 18:19:15 +000030#include "symtable.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000031#include "opcode.h"
Serhiy Storchakab0f80b02016-05-24 09:15:14 +030032#include "wordcode_helpers.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000033
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000034#define DEFAULT_BLOCK_SIZE 16
35#define DEFAULT_BLOCKS 8
36#define DEFAULT_CODE_SIZE 128
37#define DEFAULT_LNOTAB_SIZE 16
Jeremy Hylton29906ee2001-02-27 04:23:34 +000038
Nick Coghlan650f0d02007-04-15 12:05:43 +000039#define COMP_GENEXP 0
40#define COMP_LISTCOMP 1
41#define COMP_SETCOMP 2
Guido van Rossum992d4a32007-07-11 13:09:30 +000042#define COMP_DICTCOMP 3
Nick Coghlan650f0d02007-04-15 12:05:43 +000043
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
84enum fblocktype { LOOP, EXCEPT, FINALLY_TRY, FINALLY_END };
85
86struct fblockinfo {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000087 enum fblocktype fb_type;
88 basicblock *fb_block;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000089};
90
Antoine Pitrou86a36b52011-11-25 18:56:07 +010091enum {
92 COMPILER_SCOPE_MODULE,
93 COMPILER_SCOPE_CLASS,
94 COMPILER_SCOPE_FUNCTION,
Yury Selivanov75445082015-05-11 22:57:16 -040095 COMPILER_SCOPE_ASYNC_FUNCTION,
Benjamin Peterson6b4f7802013-10-20 17:50:28 -040096 COMPILER_SCOPE_LAMBDA,
Antoine Pitrou86a36b52011-11-25 18:56:07 +010097 COMPILER_SCOPE_COMPREHENSION,
98};
99
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000100/* The following items change on entry and exit of code blocks.
101 They must be saved and restored when returning to a block.
102*/
103struct compiler_unit {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000104 PySTEntryObject *u_ste;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000105
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000106 PyObject *u_name;
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400107 PyObject *u_qualname; /* dot-separated qualified name (lazy) */
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100108 int u_scope_type;
109
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000110 /* The following fields are dicts that map objects to
111 the index of them in co_XXX. The index is used as
112 the argument for opcodes that refer to those collections.
113 */
114 PyObject *u_consts; /* all constants */
115 PyObject *u_names; /* all names */
116 PyObject *u_varnames; /* local variables */
117 PyObject *u_cellvars; /* cell variables */
118 PyObject *u_freevars; /* free variables */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000119
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000120 PyObject *u_private; /* for private name mangling */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000121
Victor Stinnerf8e32212013-11-19 23:56:34 +0100122 Py_ssize_t u_argcount; /* number of arguments for block */
123 Py_ssize_t u_kwonlyargcount; /* number of keyword only arguments for block */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000124 /* Pointer to the most recently allocated block. By following b_list
125 members, you can reach all early allocated blocks. */
126 basicblock *u_blocks;
127 basicblock *u_curblock; /* pointer to current block */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000128
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000129 int u_nfblocks;
130 struct fblockinfo u_fblock[CO_MAXBLOCKS];
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000131
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000132 int u_firstlineno; /* the first lineno of the block */
133 int u_lineno; /* the lineno for the current stmt */
Benjamin Petersond4efd9e2010-09-20 23:02:10 +0000134 int u_col_offset; /* the offset of the current stmt */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000135 int u_lineno_set; /* boolean to indicate whether instr
136 has been generated with current lineno */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000137};
138
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000139/* This struct captures the global state of a compilation.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000140
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000141The u pointer points to the current compilation unit, while units
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000142for enclosing blocks are stored in c_stack. The u and c_stack are
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000143managed by compiler_enter_scope() and compiler_exit_scope().
Nick Coghlanaab9c2b2012-11-04 23:14:34 +1000144
145Note that we don't track recursion levels during compilation - the
146task of detecting and rejecting excessive levels of nesting is
147handled by the symbol analysis pass.
148
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000149*/
150
151struct compiler {
Victor Stinner14e461d2013-08-26 22:28:21 +0200152 PyObject *c_filename;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000153 struct symtable *c_st;
154 PyFutureFeatures *c_future; /* pointer to module's __future__ */
155 PyCompilerFlags *c_flags;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000156
Georg Brandl8334fd92010-12-04 10:26:46 +0000157 int c_optimize; /* optimization level */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000158 int c_interactive; /* true if in interactive mode */
159 int c_nestlevel;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000160
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000161 struct compiler_unit *u; /* compiler state for current block */
162 PyObject *c_stack; /* Python list holding compiler_unit ptrs */
163 PyArena *c_arena; /* pointer to memory allocation arena */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000164};
165
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100166static int compiler_enter_scope(struct compiler *, identifier, int, void *, int);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000167static void compiler_free(struct compiler *);
168static basicblock *compiler_new_block(struct compiler *);
169static int compiler_next_instr(struct compiler *, basicblock *);
170static int compiler_addop(struct compiler *, int);
171static int compiler_addop_o(struct compiler *, int, PyObject *, PyObject *);
Victor Stinnerf8e32212013-11-19 23:56:34 +0100172static int compiler_addop_i(struct compiler *, int, Py_ssize_t);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000173static int compiler_addop_j(struct compiler *, int, basicblock *, int);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000174static int compiler_error(struct compiler *, const char *);
175static int compiler_nameop(struct compiler *, identifier, expr_context_ty);
176
177static PyCodeObject *compiler_mod(struct compiler *, mod_ty);
178static int compiler_visit_stmt(struct compiler *, stmt_ty);
179static int compiler_visit_keyword(struct compiler *, keyword_ty);
180static int compiler_visit_expr(struct compiler *, expr_ty);
181static int compiler_augassign(struct compiler *, stmt_ty);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -0700182static int compiler_annassign(struct compiler *, stmt_ty);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000183static int compiler_visit_slice(struct compiler *, slice_ty,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000184 expr_context_ty);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000185
186static int compiler_push_fblock(struct compiler *, enum fblocktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000187 basicblock *);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000188static void compiler_pop_fblock(struct compiler *, enum fblocktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000189 basicblock *);
Thomas Wouters89f507f2006-12-13 04:49:30 +0000190/* Returns true if there is a loop on the fblock stack. */
191static int compiler_in_loop(struct compiler *);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000192
193static int inplace_binop(struct compiler *, operator_ty);
Georg Brandl8334fd92010-12-04 10:26:46 +0000194static int expr_constant(struct compiler *, expr_ty);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000195
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -0500196static int compiler_with(struct compiler *, stmt_ty, int);
Yury Selivanov75445082015-05-11 22:57:16 -0400197static int compiler_async_with(struct compiler *, stmt_ty, int);
198static int compiler_async_for(struct compiler *, stmt_ty);
Victor Stinner976bb402016-03-23 11:36:19 +0100199static int compiler_call_helper(struct compiler *c, int n,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000200 asdl_seq *args,
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400201 asdl_seq *keywords);
Benjamin Peterson43af12b2011-05-29 11:43:10 -0500202static int compiler_try_except(struct compiler *, stmt_ty);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400203static int compiler_set_qualname(struct compiler *);
Guido van Rossumc2e20742006-02-27 22:32:47 +0000204
Yury Selivanov52c4e7c2016-09-09 10:36:01 -0700205static int compiler_sync_comprehension_generator(
206 struct compiler *c,
207 asdl_seq *generators, int gen_index,
208 expr_ty elt, expr_ty val, int type);
209
210static int compiler_async_comprehension_generator(
211 struct compiler *c,
212 asdl_seq *generators, int gen_index,
213 expr_ty elt, expr_ty val, int type);
214
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000215static PyCodeObject *assemble(struct compiler *, int addNone);
216static PyObject *__doc__;
217
Benjamin Peterson9e77f722015-05-07 18:41:47 -0400218#define CAPSULE_NAME "compile.c compiler unit"
Benjamin Petersonb173f782009-05-05 22:31:58 +0000219
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000220PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000221_Py_Mangle(PyObject *privateobj, PyObject *ident)
Michael W. Hudson60934622004-08-12 17:56:29 +0000222{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000223 /* Name mangling: __private becomes _classname__private.
224 This is independent from how the name is used. */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200225 PyObject *result;
226 size_t nlen, plen, ipriv;
227 Py_UCS4 maxchar;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000228 if (privateobj == NULL || !PyUnicode_Check(privateobj) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200229 PyUnicode_READ_CHAR(ident, 0) != '_' ||
230 PyUnicode_READ_CHAR(ident, 1) != '_') {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000231 Py_INCREF(ident);
232 return ident;
233 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200234 nlen = PyUnicode_GET_LENGTH(ident);
235 plen = PyUnicode_GET_LENGTH(privateobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000236 /* Don't mangle __id__ or names with dots.
Guido van Rossumd8faa362007-04-27 19:54:29 +0000237
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000238 The only time a name with a dot can occur is when
239 we are compiling an import statement that has a
240 package name.
Guido van Rossumd8faa362007-04-27 19:54:29 +0000241
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000242 TODO(jhylton): Decide whether we want to support
243 mangling of the module name, e.g. __M.X.
244 */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200245 if ((PyUnicode_READ_CHAR(ident, nlen-1) == '_' &&
246 PyUnicode_READ_CHAR(ident, nlen-2) == '_') ||
247 PyUnicode_FindChar(ident, '.', 0, nlen, 1) != -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000248 Py_INCREF(ident);
249 return ident; /* Don't mangle __whatever__ */
250 }
251 /* Strip leading underscores from class name */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200252 ipriv = 0;
253 while (PyUnicode_READ_CHAR(privateobj, ipriv) == '_')
254 ipriv++;
255 if (ipriv == plen) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000256 Py_INCREF(ident);
257 return ident; /* Don't mangle if class is just underscores */
258 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200259 plen -= ipriv;
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000260
Antoine Pitrou55bff892013-04-06 21:21:04 +0200261 if (plen + nlen >= PY_SSIZE_T_MAX - 1) {
262 PyErr_SetString(PyExc_OverflowError,
263 "private identifier too large to be mangled");
264 return NULL;
265 }
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000266
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200267 maxchar = PyUnicode_MAX_CHAR_VALUE(ident);
268 if (PyUnicode_MAX_CHAR_VALUE(privateobj) > maxchar)
269 maxchar = PyUnicode_MAX_CHAR_VALUE(privateobj);
270
271 result = PyUnicode_New(1 + nlen + plen, maxchar);
272 if (!result)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000273 return 0;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200274 /* ident = "_" + priv[ipriv:] + ident # i.e. 1+plen+nlen bytes */
275 PyUnicode_WRITE(PyUnicode_KIND(result), PyUnicode_DATA(result), 0, '_');
Victor Stinner6c7a52a2011-09-28 21:39:17 +0200276 if (PyUnicode_CopyCharacters(result, 1, privateobj, ipriv, plen) < 0) {
277 Py_DECREF(result);
278 return NULL;
279 }
280 if (PyUnicode_CopyCharacters(result, plen+1, ident, 0, nlen) < 0) {
281 Py_DECREF(result);
282 return NULL;
283 }
Victor Stinner8f825062012-04-27 13:55:39 +0200284 assert(_PyUnicode_CheckConsistency(result, 1));
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200285 return result;
Michael W. Hudson60934622004-08-12 17:56:29 +0000286}
287
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000288static int
289compiler_init(struct compiler *c)
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000290{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000291 memset(c, 0, sizeof(struct compiler));
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000292
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000293 c->c_stack = PyList_New(0);
294 if (!c->c_stack)
295 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000296
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000297 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000298}
299
300PyCodeObject *
Victor Stinner14e461d2013-08-26 22:28:21 +0200301PyAST_CompileObject(mod_ty mod, PyObject *filename, PyCompilerFlags *flags,
302 int optimize, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000303{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000304 struct compiler c;
305 PyCodeObject *co = NULL;
306 PyCompilerFlags local_flags;
307 int merged;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000308
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000309 if (!__doc__) {
310 __doc__ = PyUnicode_InternFromString("__doc__");
311 if (!__doc__)
312 return NULL;
313 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000314
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000315 if (!compiler_init(&c))
316 return NULL;
Victor Stinner14e461d2013-08-26 22:28:21 +0200317 Py_INCREF(filename);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000318 c.c_filename = filename;
319 c.c_arena = arena;
Victor Stinner14e461d2013-08-26 22:28:21 +0200320 c.c_future = PyFuture_FromASTObject(mod, filename);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000321 if (c.c_future == NULL)
322 goto finally;
323 if (!flags) {
324 local_flags.cf_flags = 0;
325 flags = &local_flags;
326 }
327 merged = c.c_future->ff_features | flags->cf_flags;
328 c.c_future->ff_features = merged;
329 flags->cf_flags = merged;
330 c.c_flags = flags;
Georg Brandl8334fd92010-12-04 10:26:46 +0000331 c.c_optimize = (optimize == -1) ? Py_OptimizeFlag : optimize;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000332 c.c_nestlevel = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000333
Victor Stinner14e461d2013-08-26 22:28:21 +0200334 c.c_st = PySymtable_BuildObject(mod, filename, c.c_future);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000335 if (c.c_st == NULL) {
336 if (!PyErr_Occurred())
337 PyErr_SetString(PyExc_SystemError, "no symtable");
338 goto finally;
339 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000340
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000341 co = compiler_mod(&c, mod);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000342
Thomas Wouters1175c432006-02-27 22:49:54 +0000343 finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000344 compiler_free(&c);
345 assert(co || PyErr_Occurred());
346 return co;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000347}
348
349PyCodeObject *
Victor Stinner14e461d2013-08-26 22:28:21 +0200350PyAST_CompileEx(mod_ty mod, const char *filename_str, PyCompilerFlags *flags,
351 int optimize, PyArena *arena)
352{
353 PyObject *filename;
354 PyCodeObject *co;
355 filename = PyUnicode_DecodeFSDefault(filename_str);
356 if (filename == NULL)
357 return NULL;
358 co = PyAST_CompileObject(mod, filename, flags, optimize, arena);
359 Py_DECREF(filename);
360 return co;
361
362}
363
364PyCodeObject *
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000365PyNode_Compile(struct _node *n, const char *filename)
366{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000367 PyCodeObject *co = NULL;
368 mod_ty mod;
369 PyArena *arena = PyArena_New();
370 if (!arena)
371 return NULL;
372 mod = PyAST_FromNode(n, NULL, filename, arena);
373 if (mod)
374 co = PyAST_Compile(mod, filename, NULL, arena);
375 PyArena_Free(arena);
376 return co;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000377}
378
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000379static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000380compiler_free(struct compiler *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000381{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000382 if (c->c_st)
383 PySymtable_Free(c->c_st);
384 if (c->c_future)
385 PyObject_Free(c->c_future);
Victor Stinner14e461d2013-08-26 22:28:21 +0200386 Py_XDECREF(c->c_filename);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000387 Py_DECREF(c->c_stack);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000388}
389
Guido van Rossum79f25d91997-04-29 20:08:16 +0000390static PyObject *
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000391list2dict(PyObject *list)
Guido van Rossum2dff9911992-09-03 20:50:59 +0000392{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000393 Py_ssize_t i, n;
394 PyObject *v, *k;
395 PyObject *dict = PyDict_New();
396 if (!dict) return NULL;
Guido van Rossumd076c731998-10-07 19:42:25 +0000397
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000398 n = PyList_Size(list);
399 for (i = 0; i < n; i++) {
Victor Stinnerad9a0662013-11-19 22:23:20 +0100400 v = PyLong_FromSsize_t(i);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000401 if (!v) {
402 Py_DECREF(dict);
403 return NULL;
404 }
405 k = PyList_GET_ITEM(list, i);
Victor Stinnerefb24132016-01-22 12:33:12 +0100406 k = _PyCode_ConstantKey(k);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000407 if (k == NULL || PyDict_SetItem(dict, k, v) < 0) {
408 Py_XDECREF(k);
409 Py_DECREF(v);
410 Py_DECREF(dict);
411 return NULL;
412 }
413 Py_DECREF(k);
414 Py_DECREF(v);
415 }
416 return dict;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000417}
418
419/* Return new dict containing names from src that match scope(s).
420
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000421src is a symbol table dictionary. If the scope of a name matches
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000422either scope_type or flag is set, insert it into the new dict. The
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000423values are integers, starting at offset and increasing by one for
424each key.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000425*/
426
427static PyObject *
Victor Stinnerad9a0662013-11-19 22:23:20 +0100428dictbytype(PyObject *src, int scope_type, int flag, Py_ssize_t offset)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000429{
Benjamin Peterson51ab2832012-07-18 15:12:47 -0700430 Py_ssize_t i = offset, scope, num_keys, key_i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000431 PyObject *k, *v, *dest = PyDict_New();
Meador Inge2ca63152012-07-18 14:20:11 -0500432 PyObject *sorted_keys;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000433
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000434 assert(offset >= 0);
435 if (dest == NULL)
436 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000437
Meador Inge2ca63152012-07-18 14:20:11 -0500438 /* Sort the keys so that we have a deterministic order on the indexes
439 saved in the returned dictionary. These indexes are used as indexes
440 into the free and cell var storage. Therefore if they aren't
441 deterministic, then the generated bytecode is not deterministic.
442 */
443 sorted_keys = PyDict_Keys(src);
444 if (sorted_keys == NULL)
445 return NULL;
446 if (PyList_Sort(sorted_keys) != 0) {
447 Py_DECREF(sorted_keys);
448 return NULL;
449 }
Meador Ingef69e24e2012-07-18 16:41:03 -0500450 num_keys = PyList_GET_SIZE(sorted_keys);
Meador Inge2ca63152012-07-18 14:20:11 -0500451
452 for (key_i = 0; key_i < num_keys; key_i++) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000453 /* XXX this should probably be a macro in symtable.h */
454 long vi;
Meador Inge2ca63152012-07-18 14:20:11 -0500455 k = PyList_GET_ITEM(sorted_keys, key_i);
456 v = PyDict_GetItem(src, k);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000457 assert(PyLong_Check(v));
458 vi = PyLong_AS_LONG(v);
459 scope = (vi >> SCOPE_OFFSET) & SCOPE_MASK;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000460
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000461 if (scope == scope_type || vi & flag) {
Victor Stinnerad9a0662013-11-19 22:23:20 +0100462 PyObject *tuple, *item = PyLong_FromSsize_t(i);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000463 if (item == NULL) {
Meador Inge2ca63152012-07-18 14:20:11 -0500464 Py_DECREF(sorted_keys);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000465 Py_DECREF(dest);
466 return NULL;
467 }
468 i++;
Victor Stinnerefb24132016-01-22 12:33:12 +0100469 tuple = _PyCode_ConstantKey(k);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000470 if (!tuple || PyDict_SetItem(dest, tuple, item) < 0) {
Meador Inge2ca63152012-07-18 14:20:11 -0500471 Py_DECREF(sorted_keys);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000472 Py_DECREF(item);
473 Py_DECREF(dest);
474 Py_XDECREF(tuple);
475 return NULL;
476 }
477 Py_DECREF(item);
478 Py_DECREF(tuple);
479 }
480 }
Meador Inge2ca63152012-07-18 14:20:11 -0500481 Py_DECREF(sorted_keys);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000482 return dest;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000483}
484
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000485static void
486compiler_unit_check(struct compiler_unit *u)
487{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000488 basicblock *block;
489 for (block = u->u_blocks; block != NULL; block = block->b_list) {
Benjamin Petersonca470632016-09-06 13:47:26 -0700490 assert((uintptr_t)block != 0xcbcbcbcbU);
491 assert((uintptr_t)block != 0xfbfbfbfbU);
492 assert((uintptr_t)block != 0xdbdbdbdbU);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000493 if (block->b_instr != NULL) {
494 assert(block->b_ialloc > 0);
495 assert(block->b_iused > 0);
496 assert(block->b_ialloc >= block->b_iused);
497 }
498 else {
499 assert (block->b_iused == 0);
500 assert (block->b_ialloc == 0);
501 }
502 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000503}
504
505static void
506compiler_unit_free(struct compiler_unit *u)
507{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000508 basicblock *b, *next;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000509
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000510 compiler_unit_check(u);
511 b = u->u_blocks;
512 while (b != NULL) {
513 if (b->b_instr)
514 PyObject_Free((void *)b->b_instr);
515 next = b->b_list;
516 PyObject_Free((void *)b);
517 b = next;
518 }
519 Py_CLEAR(u->u_ste);
520 Py_CLEAR(u->u_name);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400521 Py_CLEAR(u->u_qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000522 Py_CLEAR(u->u_consts);
523 Py_CLEAR(u->u_names);
524 Py_CLEAR(u->u_varnames);
525 Py_CLEAR(u->u_freevars);
526 Py_CLEAR(u->u_cellvars);
527 Py_CLEAR(u->u_private);
528 PyObject_Free(u);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000529}
530
531static int
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100532compiler_enter_scope(struct compiler *c, identifier name,
533 int scope_type, void *key, int lineno)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000534{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000535 struct compiler_unit *u;
Victor Stinnerfc6f2ef2016-02-27 02:19:22 +0100536 basicblock *block;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000537
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000538 u = (struct compiler_unit *)PyObject_Malloc(sizeof(
539 struct compiler_unit));
540 if (!u) {
541 PyErr_NoMemory();
542 return 0;
543 }
544 memset(u, 0, sizeof(struct compiler_unit));
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100545 u->u_scope_type = scope_type;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000546 u->u_argcount = 0;
547 u->u_kwonlyargcount = 0;
548 u->u_ste = PySymtable_Lookup(c->c_st, key);
549 if (!u->u_ste) {
550 compiler_unit_free(u);
551 return 0;
552 }
553 Py_INCREF(name);
554 u->u_name = name;
555 u->u_varnames = list2dict(u->u_ste->ste_varnames);
556 u->u_cellvars = dictbytype(u->u_ste->ste_symbols, CELL, 0, 0);
557 if (!u->u_varnames || !u->u_cellvars) {
558 compiler_unit_free(u);
559 return 0;
560 }
Benjamin Peterson312595c2013-05-15 15:26:42 -0500561 if (u->u_ste->ste_needs_class_closure) {
Martin Panter7462b6492015-11-02 03:37:02 +0000562 /* Cook up an implicit __class__ cell. */
Benjamin Peterson312595c2013-05-15 15:26:42 -0500563 _Py_IDENTIFIER(__class__);
564 PyObject *tuple, *name, *zero;
565 int res;
566 assert(u->u_scope_type == COMPILER_SCOPE_CLASS);
567 assert(PyDict_Size(u->u_cellvars) == 0);
568 name = _PyUnicode_FromId(&PyId___class__);
569 if (!name) {
570 compiler_unit_free(u);
571 return 0;
572 }
Victor Stinnerefb24132016-01-22 12:33:12 +0100573 tuple = _PyCode_ConstantKey(name);
Benjamin Peterson312595c2013-05-15 15:26:42 -0500574 if (!tuple) {
575 compiler_unit_free(u);
576 return 0;
577 }
578 zero = PyLong_FromLong(0);
579 if (!zero) {
580 Py_DECREF(tuple);
581 compiler_unit_free(u);
582 return 0;
583 }
584 res = PyDict_SetItem(u->u_cellvars, tuple, zero);
585 Py_DECREF(tuple);
586 Py_DECREF(zero);
587 if (res < 0) {
588 compiler_unit_free(u);
589 return 0;
590 }
591 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000592
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000593 u->u_freevars = dictbytype(u->u_ste->ste_symbols, FREE, DEF_FREE_CLASS,
594 PyDict_Size(u->u_cellvars));
595 if (!u->u_freevars) {
596 compiler_unit_free(u);
597 return 0;
598 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000599
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000600 u->u_blocks = NULL;
601 u->u_nfblocks = 0;
602 u->u_firstlineno = lineno;
603 u->u_lineno = 0;
Benjamin Petersond4efd9e2010-09-20 23:02:10 +0000604 u->u_col_offset = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000605 u->u_lineno_set = 0;
606 u->u_consts = PyDict_New();
607 if (!u->u_consts) {
608 compiler_unit_free(u);
609 return 0;
610 }
611 u->u_names = PyDict_New();
612 if (!u->u_names) {
613 compiler_unit_free(u);
614 return 0;
615 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000616
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000617 u->u_private = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000618
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000619 /* Push the old compiler_unit on the stack. */
620 if (c->u) {
Benjamin Peterson9e77f722015-05-07 18:41:47 -0400621 PyObject *capsule = PyCapsule_New(c->u, CAPSULE_NAME, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000622 if (!capsule || PyList_Append(c->c_stack, capsule) < 0) {
623 Py_XDECREF(capsule);
624 compiler_unit_free(u);
625 return 0;
626 }
627 Py_DECREF(capsule);
628 u->u_private = c->u->u_private;
629 Py_XINCREF(u->u_private);
630 }
631 c->u = u;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000632
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000633 c->c_nestlevel++;
Victor Stinnerfc6f2ef2016-02-27 02:19:22 +0100634
635 block = compiler_new_block(c);
636 if (block == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000637 return 0;
Victor Stinnerfc6f2ef2016-02-27 02:19:22 +0100638 c->u->u_curblock = block;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000639
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400640 if (u->u_scope_type != COMPILER_SCOPE_MODULE) {
641 if (!compiler_set_qualname(c))
642 return 0;
643 }
644
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000645 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000646}
647
Neil Schemenauerc396d9e2005-10-25 06:30:14 +0000648static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000649compiler_exit_scope(struct compiler *c)
650{
Victor Stinnerad9a0662013-11-19 22:23:20 +0100651 Py_ssize_t n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000652 PyObject *capsule;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000653
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000654 c->c_nestlevel--;
655 compiler_unit_free(c->u);
656 /* Restore c->u to the parent unit. */
657 n = PyList_GET_SIZE(c->c_stack) - 1;
658 if (n >= 0) {
659 capsule = PyList_GET_ITEM(c->c_stack, n);
Benjamin Peterson9e77f722015-05-07 18:41:47 -0400660 c->u = (struct compiler_unit *)PyCapsule_GetPointer(capsule, CAPSULE_NAME);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000661 assert(c->u);
662 /* we are deleting from a list so this really shouldn't fail */
663 if (PySequence_DelItem(c->c_stack, n) < 0)
664 Py_FatalError("compiler_exit_scope()");
665 compiler_unit_check(c->u);
666 }
667 else
668 c->u = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000669
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000670}
671
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400672static int
673compiler_set_qualname(struct compiler *c)
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100674{
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100675 _Py_static_string(dot, ".");
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400676 _Py_static_string(dot_locals, ".<locals>");
677 Py_ssize_t stack_size;
678 struct compiler_unit *u = c->u;
679 PyObject *name, *base, *dot_str, *dot_locals_str;
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100680
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400681 base = NULL;
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100682 stack_size = PyList_GET_SIZE(c->c_stack);
Benjamin Petersona8a38b82013-10-19 16:14:39 -0400683 assert(stack_size >= 1);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400684 if (stack_size > 1) {
685 int scope, force_global = 0;
686 struct compiler_unit *parent;
687 PyObject *mangled, *capsule;
688
Benjamin Peterson3d9e4812013-10-19 16:01:13 -0400689 capsule = PyList_GET_ITEM(c->c_stack, stack_size - 1);
Benjamin Peterson9e77f722015-05-07 18:41:47 -0400690 parent = (struct compiler_unit *)PyCapsule_GetPointer(capsule, CAPSULE_NAME);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400691 assert(parent);
692
Yury Selivanov75445082015-05-11 22:57:16 -0400693 if (u->u_scope_type == COMPILER_SCOPE_FUNCTION
694 || u->u_scope_type == COMPILER_SCOPE_ASYNC_FUNCTION
695 || u->u_scope_type == COMPILER_SCOPE_CLASS) {
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400696 assert(u->u_name);
697 mangled = _Py_Mangle(parent->u_private, u->u_name);
698 if (!mangled)
699 return 0;
700 scope = PyST_GetScope(parent->u_ste, mangled);
701 Py_DECREF(mangled);
702 assert(scope != GLOBAL_IMPLICIT);
703 if (scope == GLOBAL_EXPLICIT)
704 force_global = 1;
705 }
706
707 if (!force_global) {
708 if (parent->u_scope_type == COMPILER_SCOPE_FUNCTION
Yury Selivanov75445082015-05-11 22:57:16 -0400709 || parent->u_scope_type == COMPILER_SCOPE_ASYNC_FUNCTION
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400710 || parent->u_scope_type == COMPILER_SCOPE_LAMBDA) {
711 dot_locals_str = _PyUnicode_FromId(&dot_locals);
712 if (dot_locals_str == NULL)
713 return 0;
714 base = PyUnicode_Concat(parent->u_qualname, dot_locals_str);
715 if (base == NULL)
716 return 0;
717 }
718 else {
719 Py_INCREF(parent->u_qualname);
720 base = parent->u_qualname;
Benjamin Peterson3d9e4812013-10-19 16:01:13 -0400721 }
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100722 }
723 }
Benjamin Peterson3d9e4812013-10-19 16:01:13 -0400724
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400725 if (base != NULL) {
726 dot_str = _PyUnicode_FromId(&dot);
727 if (dot_str == NULL) {
728 Py_DECREF(base);
729 return 0;
730 }
731 name = PyUnicode_Concat(base, dot_str);
732 Py_DECREF(base);
733 if (name == NULL)
734 return 0;
735 PyUnicode_Append(&name, u->u_name);
736 if (name == NULL)
737 return 0;
738 }
739 else {
740 Py_INCREF(u->u_name);
741 name = u->u_name;
742 }
743 u->u_qualname = name;
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100744
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400745 return 1;
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100746}
747
Eric V. Smith235a6f02015-09-19 14:51:32 -0400748
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000749/* Allocate a new block and return a pointer to it.
750 Returns NULL on error.
751*/
752
753static basicblock *
754compiler_new_block(struct compiler *c)
755{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000756 basicblock *b;
757 struct compiler_unit *u;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000758
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000759 u = c->u;
760 b = (basicblock *)PyObject_Malloc(sizeof(basicblock));
761 if (b == NULL) {
762 PyErr_NoMemory();
763 return NULL;
764 }
765 memset((void *)b, 0, sizeof(basicblock));
766 /* Extend the singly linked list of blocks with new block. */
767 b->b_list = u->u_blocks;
768 u->u_blocks = b;
769 return b;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000770}
771
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000772static basicblock *
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000773compiler_next_block(struct compiler *c)
774{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000775 basicblock *block = compiler_new_block(c);
776 if (block == NULL)
777 return NULL;
778 c->u->u_curblock->b_next = block;
779 c->u->u_curblock = block;
780 return block;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000781}
782
783static basicblock *
784compiler_use_next_block(struct compiler *c, basicblock *block)
785{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000786 assert(block != NULL);
787 c->u->u_curblock->b_next = block;
788 c->u->u_curblock = block;
789 return block;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000790}
791
792/* Returns the offset of the next instruction in the current block's
793 b_instr array. Resizes the b_instr as necessary.
794 Returns -1 on failure.
Thomas Wouters89f507f2006-12-13 04:49:30 +0000795*/
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000796
797static int
798compiler_next_instr(struct compiler *c, basicblock *b)
799{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000800 assert(b != NULL);
801 if (b->b_instr == NULL) {
802 b->b_instr = (struct instr *)PyObject_Malloc(
803 sizeof(struct instr) * DEFAULT_BLOCK_SIZE);
804 if (b->b_instr == NULL) {
805 PyErr_NoMemory();
806 return -1;
807 }
808 b->b_ialloc = DEFAULT_BLOCK_SIZE;
809 memset((char *)b->b_instr, 0,
810 sizeof(struct instr) * DEFAULT_BLOCK_SIZE);
811 }
812 else if (b->b_iused == b->b_ialloc) {
813 struct instr *tmp;
814 size_t oldsize, newsize;
815 oldsize = b->b_ialloc * sizeof(struct instr);
816 newsize = oldsize << 1;
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000817
Benjamin Peterson2f8bfef2016-09-07 09:26:18 -0700818 if (oldsize > (SIZE_MAX >> 1)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000819 PyErr_NoMemory();
820 return -1;
821 }
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000822
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000823 if (newsize == 0) {
824 PyErr_NoMemory();
825 return -1;
826 }
827 b->b_ialloc <<= 1;
828 tmp = (struct instr *)PyObject_Realloc(
829 (void *)b->b_instr, newsize);
830 if (tmp == NULL) {
831 PyErr_NoMemory();
832 return -1;
833 }
834 b->b_instr = tmp;
835 memset((char *)b->b_instr + oldsize, 0, newsize - oldsize);
836 }
837 return b->b_iused++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000838}
839
Christian Heimes2202f872008-02-06 14:31:34 +0000840/* Set the i_lineno member of the instruction at offset off if the
841 line number for the current expression/statement has not
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000842 already been set. If it has been set, the call has no effect.
843
Christian Heimes2202f872008-02-06 14:31:34 +0000844 The line number is reset in the following cases:
845 - when entering a new scope
846 - on each statement
847 - on each expression that start a new line
848 - before the "except" clause
849 - before the "for" and "while" expressions
Thomas Wouters89f507f2006-12-13 04:49:30 +0000850*/
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000851
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000852static void
853compiler_set_lineno(struct compiler *c, int off)
854{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000855 basicblock *b;
856 if (c->u->u_lineno_set)
857 return;
858 c->u->u_lineno_set = 1;
859 b = c->u->u_curblock;
860 b->b_instr[off].i_lineno = c->u->u_lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000861}
862
Larry Hastings3a907972013-11-23 14:49:22 -0800863int
864PyCompile_OpcodeStackEffect(int opcode, int oparg)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000865{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000866 switch (opcode) {
867 case POP_TOP:
868 return -1;
869 case ROT_TWO:
870 case ROT_THREE:
871 return 0;
872 case DUP_TOP:
873 return 1;
Antoine Pitrou74a69fa2010-09-04 18:43:52 +0000874 case DUP_TOP_TWO:
875 return 2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000876
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000877 case UNARY_POSITIVE:
878 case UNARY_NEGATIVE:
879 case UNARY_NOT:
880 case UNARY_INVERT:
881 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000882
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000883 case SET_ADD:
884 case LIST_APPEND:
885 return -1;
886 case MAP_ADD:
887 return -2;
Neal Norwitz10be2ea2006-03-03 20:29:11 +0000888
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000889 case BINARY_POWER:
890 case BINARY_MULTIPLY:
Benjamin Petersond51374e2014-04-09 23:55:56 -0400891 case BINARY_MATRIX_MULTIPLY:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000892 case BINARY_MODULO:
893 case BINARY_ADD:
894 case BINARY_SUBTRACT:
895 case BINARY_SUBSCR:
896 case BINARY_FLOOR_DIVIDE:
897 case BINARY_TRUE_DIVIDE:
898 return -1;
899 case INPLACE_FLOOR_DIVIDE:
900 case INPLACE_TRUE_DIVIDE:
901 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000902
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000903 case INPLACE_ADD:
904 case INPLACE_SUBTRACT:
905 case INPLACE_MULTIPLY:
Benjamin Petersond51374e2014-04-09 23:55:56 -0400906 case INPLACE_MATRIX_MULTIPLY:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000907 case INPLACE_MODULO:
908 return -1;
909 case STORE_SUBSCR:
910 return -3;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000911 case DELETE_SUBSCR:
912 return -2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000913
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000914 case BINARY_LSHIFT:
915 case BINARY_RSHIFT:
916 case BINARY_AND:
917 case BINARY_XOR:
918 case BINARY_OR:
919 return -1;
920 case INPLACE_POWER:
921 return -1;
922 case GET_ITER:
923 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000924
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000925 case PRINT_EXPR:
926 return -1;
927 case LOAD_BUILD_CLASS:
928 return 1;
929 case INPLACE_LSHIFT:
930 case INPLACE_RSHIFT:
931 case INPLACE_AND:
932 case INPLACE_XOR:
933 case INPLACE_OR:
934 return -1;
935 case BREAK_LOOP:
936 return 0;
937 case SETUP_WITH:
938 return 7;
Yury Selivanov75445082015-05-11 22:57:16 -0400939 case WITH_CLEANUP_START:
940 return 1;
941 case WITH_CLEANUP_FINISH:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000942 return -1; /* XXX Sometimes more */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000943 case RETURN_VALUE:
944 return -1;
945 case IMPORT_STAR:
946 return -1;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -0700947 case SETUP_ANNOTATIONS:
948 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000949 case YIELD_VALUE:
950 return 0;
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -0500951 case YIELD_FROM:
952 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000953 case POP_BLOCK:
954 return 0;
955 case POP_EXCEPT:
956 return 0; /* -3 except if bad bytecode */
957 case END_FINALLY:
958 return -1; /* or -2 or -3 if exception occurred */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000959
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000960 case STORE_NAME:
961 return -1;
962 case DELETE_NAME:
963 return 0;
964 case UNPACK_SEQUENCE:
965 return oparg-1;
966 case UNPACK_EX:
967 return (oparg&0xFF) + (oparg>>8);
968 case FOR_ITER:
969 return 1; /* or -1, at end of iterator */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000970
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000971 case STORE_ATTR:
972 return -2;
973 case DELETE_ATTR:
974 return -1;
975 case STORE_GLOBAL:
976 return -1;
977 case DELETE_GLOBAL:
978 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000979 case LOAD_CONST:
980 return 1;
981 case LOAD_NAME:
982 return 1;
983 case BUILD_TUPLE:
984 case BUILD_LIST:
985 case BUILD_SET:
Serhiy Storchakaea525a22016-09-06 22:07:53 +0300986 case BUILD_STRING:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000987 return 1-oparg;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400988 case BUILD_LIST_UNPACK:
989 case BUILD_TUPLE_UNPACK:
990 case BUILD_SET_UNPACK:
991 case BUILD_MAP_UNPACK:
992 return 1 - oparg;
993 case BUILD_MAP_UNPACK_WITH_CALL:
Victor Stinnerf9b760f2016-09-09 10:17:08 -0700994 return 1 - oparg;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000995 case BUILD_MAP:
Benjamin Petersonb6855152015-09-10 21:02:39 -0700996 return 1 - 2*oparg;
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +0300997 case BUILD_CONST_KEY_MAP:
998 return -oparg;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000999 case LOAD_ATTR:
1000 return 0;
1001 case COMPARE_OP:
1002 return -1;
1003 case IMPORT_NAME:
1004 return -1;
1005 case IMPORT_FROM:
1006 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001007
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001008 case JUMP_FORWARD:
1009 case JUMP_IF_TRUE_OR_POP: /* -1 if jump not taken */
1010 case JUMP_IF_FALSE_OR_POP: /* "" */
1011 case JUMP_ABSOLUTE:
1012 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001013
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001014 case POP_JUMP_IF_FALSE:
1015 case POP_JUMP_IF_TRUE:
1016 return -1;
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00001017
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001018 case LOAD_GLOBAL:
1019 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001020
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001021 case CONTINUE_LOOP:
1022 return 0;
1023 case SETUP_LOOP:
1024 return 0;
1025 case SETUP_EXCEPT:
1026 case SETUP_FINALLY:
1027 return 6; /* can push 3 values for the new exception
1028 + 3 others for the previous exception state */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001029
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001030 case LOAD_FAST:
1031 return 1;
1032 case STORE_FAST:
1033 return -1;
1034 case DELETE_FAST:
1035 return 0;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001036 case STORE_ANNOTATION:
1037 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001038
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001039 case RAISE_VARARGS:
1040 return -oparg;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001041 case CALL_FUNCTION:
Victor Stinnerf9b760f2016-09-09 10:17:08 -07001042 return -oparg;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001043 case CALL_FUNCTION_KW:
Victor Stinnerf9b760f2016-09-09 10:17:08 -07001044 return -oparg-1;
1045 case CALL_FUNCTION_EX:
1046 return - ((oparg & 0x01) != 0) - ((oparg & 0x02) != 0);
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001047 case MAKE_FUNCTION:
1048 return -1 - ((oparg & 0x01) != 0) - ((oparg & 0x02) != 0) -
1049 ((oparg & 0x04) != 0) - ((oparg & 0x08) != 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001050 case BUILD_SLICE:
1051 if (oparg == 3)
1052 return -2;
1053 else
1054 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001055
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001056 case LOAD_CLOSURE:
1057 return 1;
1058 case LOAD_DEREF:
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04001059 case LOAD_CLASSDEREF:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001060 return 1;
1061 case STORE_DEREF:
1062 return -1;
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00001063 case DELETE_DEREF:
1064 return 0;
Yury Selivanov75445082015-05-11 22:57:16 -04001065 case GET_AWAITABLE:
1066 return 0;
1067 case SETUP_ASYNC_WITH:
1068 return 6;
1069 case BEFORE_ASYNC_WITH:
1070 return 1;
1071 case GET_AITER:
1072 return 0;
1073 case GET_ANEXT:
1074 return 1;
Yury Selivanov5376ba92015-06-22 12:19:30 -04001075 case GET_YIELD_FROM_ITER:
1076 return 0;
Eric V. Smitha78c7952015-11-03 12:45:05 -05001077 case FORMAT_VALUE:
1078 /* If there's a fmt_spec on the stack, we go from 2->1,
1079 else 1->1. */
1080 return (oparg & FVS_MASK) == FVS_HAVE_SPEC ? -1 : 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001081 default:
Larry Hastings3a907972013-11-23 14:49:22 -08001082 return PY_INVALID_STACK_EFFECT;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001083 }
Larry Hastings3a907972013-11-23 14:49:22 -08001084 return PY_INVALID_STACK_EFFECT; /* not reachable */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001085}
1086
1087/* Add an opcode with no argument.
1088 Returns 0 on failure, 1 on success.
1089*/
1090
1091static int
1092compiler_addop(struct compiler *c, int opcode)
1093{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001094 basicblock *b;
1095 struct instr *i;
1096 int off;
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001097 assert(!HAS_ARG(opcode));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001098 off = compiler_next_instr(c, c->u->u_curblock);
1099 if (off < 0)
1100 return 0;
1101 b = c->u->u_curblock;
1102 i = &b->b_instr[off];
1103 i->i_opcode = opcode;
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001104 i->i_oparg = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001105 if (opcode == RETURN_VALUE)
1106 b->b_return = 1;
1107 compiler_set_lineno(c, off);
1108 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001109}
1110
Victor Stinnerf8e32212013-11-19 23:56:34 +01001111static Py_ssize_t
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001112compiler_add_o(struct compiler *c, PyObject *dict, PyObject *o)
1113{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001114 PyObject *t, *v;
1115 Py_ssize_t arg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001116
Victor Stinnerefb24132016-01-22 12:33:12 +01001117 t = _PyCode_ConstantKey(o);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001118 if (t == NULL)
1119 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001120
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001121 v = PyDict_GetItem(dict, t);
1122 if (!v) {
Stefan Krahc0cbed12015-07-27 12:56:49 +02001123 if (PyErr_Occurred()) {
1124 Py_DECREF(t);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001125 return -1;
Stefan Krahc0cbed12015-07-27 12:56:49 +02001126 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001127 arg = PyDict_Size(dict);
Victor Stinnerad9a0662013-11-19 22:23:20 +01001128 v = PyLong_FromSsize_t(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001129 if (!v) {
1130 Py_DECREF(t);
1131 return -1;
1132 }
1133 if (PyDict_SetItem(dict, t, v) < 0) {
1134 Py_DECREF(t);
1135 Py_DECREF(v);
1136 return -1;
1137 }
1138 Py_DECREF(v);
1139 }
1140 else
1141 arg = PyLong_AsLong(v);
1142 Py_DECREF(t);
1143 return arg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001144}
1145
1146static int
1147compiler_addop_o(struct compiler *c, int opcode, PyObject *dict,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001148 PyObject *o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001149{
Victor Stinnerad9a0662013-11-19 22:23:20 +01001150 Py_ssize_t arg = compiler_add_o(c, dict, o);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001151 if (arg < 0)
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00001152 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001153 return compiler_addop_i(c, opcode, arg);
1154}
1155
1156static int
1157compiler_addop_name(struct compiler *c, int opcode, PyObject *dict,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001158 PyObject *o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001159{
Victor Stinnerad9a0662013-11-19 22:23:20 +01001160 Py_ssize_t arg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001161 PyObject *mangled = _Py_Mangle(c->u->u_private, o);
1162 if (!mangled)
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00001163 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001164 arg = compiler_add_o(c, dict, mangled);
1165 Py_DECREF(mangled);
1166 if (arg < 0)
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00001167 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001168 return compiler_addop_i(c, opcode, arg);
1169}
1170
1171/* Add an opcode with an integer argument.
1172 Returns 0 on failure, 1 on success.
1173*/
1174
1175static int
Victor Stinnerf8e32212013-11-19 23:56:34 +01001176compiler_addop_i(struct compiler *c, int opcode, Py_ssize_t oparg)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001177{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001178 struct instr *i;
1179 int off;
Victor Stinnerad9a0662013-11-19 22:23:20 +01001180
Victor Stinner2ad474b2016-03-01 23:34:47 +01001181 /* oparg value is unsigned, but a signed C int is usually used to store
1182 it in the C code (like Python/ceval.c).
1183
1184 Limit to 32-bit signed C int (rather than INT_MAX) for portability.
1185
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001186 The argument of a concrete bytecode instruction is limited to 8-bit.
1187 EXTENDED_ARG is used for 16, 24, and 32-bit arguments. */
1188 assert(HAS_ARG(opcode));
Victor Stinner2ad474b2016-03-01 23:34:47 +01001189 assert(0 <= oparg && oparg <= 2147483647);
Victor Stinnerad9a0662013-11-19 22:23:20 +01001190
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001191 off = compiler_next_instr(c, c->u->u_curblock);
1192 if (off < 0)
1193 return 0;
1194 i = &c->u->u_curblock->b_instr[off];
Victor Stinnerf8e32212013-11-19 23:56:34 +01001195 i->i_opcode = opcode;
1196 i->i_oparg = Py_SAFE_DOWNCAST(oparg, Py_ssize_t, int);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001197 compiler_set_lineno(c, off);
1198 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001199}
1200
1201static int
1202compiler_addop_j(struct compiler *c, int opcode, basicblock *b, int absolute)
1203{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001204 struct instr *i;
1205 int off;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001206
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03001207 assert(HAS_ARG(opcode));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001208 assert(b != NULL);
1209 off = compiler_next_instr(c, c->u->u_curblock);
1210 if (off < 0)
1211 return 0;
1212 i = &c->u->u_curblock->b_instr[off];
1213 i->i_opcode = opcode;
1214 i->i_target = b;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001215 if (absolute)
1216 i->i_jabs = 1;
1217 else
1218 i->i_jrel = 1;
1219 compiler_set_lineno(c, off);
1220 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001221}
1222
Victor Stinnerfc6f2ef2016-02-27 02:19:22 +01001223/* NEXT_BLOCK() creates an implicit jump from the current block
1224 to the new block.
1225
1226 The returns inside this macro make it impossible to decref objects
1227 created in the local function. Local objects should use the arena.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001228*/
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001229#define NEXT_BLOCK(C) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001230 if (compiler_next_block((C)) == NULL) \
1231 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001232}
1233
1234#define ADDOP(C, OP) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001235 if (!compiler_addop((C), (OP))) \
1236 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001237}
1238
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001239#define ADDOP_IN_SCOPE(C, OP) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001240 if (!compiler_addop((C), (OP))) { \
1241 compiler_exit_scope(c); \
1242 return 0; \
1243 } \
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001244}
1245
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001246#define ADDOP_O(C, OP, O, TYPE) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001247 if (!compiler_addop_o((C), (OP), (C)->u->u_ ## TYPE, (O))) \
1248 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001249}
1250
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03001251/* Same as ADDOP_O, but steals a reference. */
1252#define ADDOP_N(C, OP, O, TYPE) { \
1253 if (!compiler_addop_o((C), (OP), (C)->u->u_ ## TYPE, (O))) { \
1254 Py_DECREF((O)); \
1255 return 0; \
1256 } \
1257 Py_DECREF((O)); \
1258}
1259
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001260#define ADDOP_NAME(C, OP, O, TYPE) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001261 if (!compiler_addop_name((C), (OP), (C)->u->u_ ## TYPE, (O))) \
1262 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001263}
1264
1265#define ADDOP_I(C, OP, O) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001266 if (!compiler_addop_i((C), (OP), (O))) \
1267 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001268}
1269
1270#define ADDOP_JABS(C, OP, O) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001271 if (!compiler_addop_j((C), (OP), (O), 1)) \
1272 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001273}
1274
1275#define ADDOP_JREL(C, OP, O) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001276 if (!compiler_addop_j((C), (OP), (O), 0)) \
1277 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001278}
1279
1280/* VISIT and VISIT_SEQ takes an ASDL type as their second argument. They use
1281 the ASDL name to synthesize the name of the C type and the visit function.
1282*/
1283
1284#define VISIT(C, TYPE, V) {\
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001285 if (!compiler_visit_ ## TYPE((C), (V))) \
1286 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001287}
1288
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001289#define VISIT_IN_SCOPE(C, TYPE, V) {\
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001290 if (!compiler_visit_ ## TYPE((C), (V))) { \
1291 compiler_exit_scope(c); \
1292 return 0; \
1293 } \
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001294}
1295
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001296#define VISIT_SLICE(C, V, CTX) {\
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001297 if (!compiler_visit_slice((C), (V), (CTX))) \
1298 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001299}
1300
1301#define VISIT_SEQ(C, TYPE, SEQ) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001302 int _i; \
1303 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
1304 for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \
1305 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \
1306 if (!compiler_visit_ ## TYPE((C), elt)) \
1307 return 0; \
1308 } \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001309}
1310
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001311#define VISIT_SEQ_IN_SCOPE(C, TYPE, SEQ) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001312 int _i; \
1313 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
1314 for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \
1315 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \
1316 if (!compiler_visit_ ## TYPE((C), elt)) { \
1317 compiler_exit_scope(c); \
1318 return 0; \
1319 } \
1320 } \
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001321}
1322
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001323static int
1324compiler_isdocstring(stmt_ty s)
1325{
1326 if (s->kind != Expr_kind)
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00001327 return 0;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001328 if (s->v.Expr.value->kind == Str_kind)
1329 return 1;
1330 if (s->v.Expr.value->kind == Constant_kind)
1331 return PyUnicode_CheckExact(s->v.Expr.value->v.Constant.value);
1332 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001333}
1334
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03001335static int
1336is_const(expr_ty e)
1337{
1338 switch (e->kind) {
1339 case Constant_kind:
1340 case Num_kind:
1341 case Str_kind:
1342 case Bytes_kind:
1343 case Ellipsis_kind:
1344 case NameConstant_kind:
1345 return 1;
1346 default:
1347 return 0;
1348 }
1349}
1350
1351static PyObject *
1352get_const_value(expr_ty e)
1353{
1354 switch (e->kind) {
1355 case Constant_kind:
1356 return e->v.Constant.value;
1357 case Num_kind:
1358 return e->v.Num.n;
1359 case Str_kind:
1360 return e->v.Str.s;
1361 case Bytes_kind:
1362 return e->v.Bytes.s;
1363 case Ellipsis_kind:
1364 return Py_Ellipsis;
1365 case NameConstant_kind:
1366 return e->v.NameConstant.value;
1367 default:
1368 assert(!is_const(e));
1369 return NULL;
1370 }
1371}
1372
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001373/* Search if variable annotations are present statically in a block. */
1374
1375static int
1376find_ann(asdl_seq *stmts)
1377{
1378 int i, j, res = 0;
1379 stmt_ty st;
1380
1381 for (i = 0; i < asdl_seq_LEN(stmts); i++) {
1382 st = (stmt_ty)asdl_seq_GET(stmts, i);
1383 switch (st->kind) {
1384 case AnnAssign_kind:
1385 return 1;
1386 case For_kind:
1387 res = find_ann(st->v.For.body) ||
1388 find_ann(st->v.For.orelse);
1389 break;
1390 case AsyncFor_kind:
1391 res = find_ann(st->v.AsyncFor.body) ||
1392 find_ann(st->v.AsyncFor.orelse);
1393 break;
1394 case While_kind:
1395 res = find_ann(st->v.While.body) ||
1396 find_ann(st->v.While.orelse);
1397 break;
1398 case If_kind:
1399 res = find_ann(st->v.If.body) ||
1400 find_ann(st->v.If.orelse);
1401 break;
1402 case With_kind:
1403 res = find_ann(st->v.With.body);
1404 break;
1405 case AsyncWith_kind:
1406 res = find_ann(st->v.AsyncWith.body);
1407 break;
1408 case Try_kind:
1409 for (j = 0; j < asdl_seq_LEN(st->v.Try.handlers); j++) {
1410 excepthandler_ty handler = (excepthandler_ty)asdl_seq_GET(
1411 st->v.Try.handlers, j);
1412 if (find_ann(handler->v.ExceptHandler.body)) {
1413 return 1;
1414 }
1415 }
1416 res = find_ann(st->v.Try.body) ||
1417 find_ann(st->v.Try.finalbody) ||
1418 find_ann(st->v.Try.orelse);
1419 break;
1420 default:
1421 res = 0;
1422 }
1423 if (res) {
1424 break;
1425 }
1426 }
1427 return res;
1428}
1429
1430/* Compile a sequence of statements, checking for a docstring
1431 and for annotations. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001432
1433static int
1434compiler_body(struct compiler *c, asdl_seq *stmts)
1435{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001436 int i = 0;
1437 stmt_ty st;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001438
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001439 /* Set current line number to the line number of first statement.
1440 This way line number for SETUP_ANNOTATIONS will always
1441 coincide with the line number of first "real" statement in module.
1442 If body is empy, then lineno will be set later in assemble. */
1443 if (c->u->u_scope_type == COMPILER_SCOPE_MODULE &&
1444 !c->u->u_lineno && asdl_seq_LEN(stmts)) {
1445 st = (stmt_ty)asdl_seq_GET(stmts, 0);
1446 c->u->u_lineno = st->lineno;
1447 }
1448 /* Every annotated class and module should have __annotations__. */
1449 if (find_ann(stmts)) {
1450 ADDOP(c, SETUP_ANNOTATIONS);
1451 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001452 if (!asdl_seq_LEN(stmts))
1453 return 1;
1454 st = (stmt_ty)asdl_seq_GET(stmts, 0);
Georg Brandl8334fd92010-12-04 10:26:46 +00001455 if (compiler_isdocstring(st) && c->c_optimize < 2) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001456 /* don't generate docstrings if -OO */
1457 i = 1;
1458 VISIT(c, expr, st->v.Expr.value);
1459 if (!compiler_nameop(c, __doc__, Store))
1460 return 0;
1461 }
1462 for (; i < asdl_seq_LEN(stmts); i++)
1463 VISIT(c, stmt, (stmt_ty)asdl_seq_GET(stmts, i));
1464 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001465}
1466
1467static PyCodeObject *
1468compiler_mod(struct compiler *c, mod_ty mod)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001469{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001470 PyCodeObject *co;
1471 int addNone = 1;
1472 static PyObject *module;
1473 if (!module) {
1474 module = PyUnicode_InternFromString("<module>");
1475 if (!module)
1476 return NULL;
1477 }
1478 /* Use 0 for firstlineno initially, will fixup in assemble(). */
Antoine Pitrou86a36b52011-11-25 18:56:07 +01001479 if (!compiler_enter_scope(c, module, COMPILER_SCOPE_MODULE, mod, 0))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001480 return NULL;
1481 switch (mod->kind) {
1482 case Module_kind:
1483 if (!compiler_body(c, mod->v.Module.body)) {
1484 compiler_exit_scope(c);
1485 return 0;
1486 }
1487 break;
1488 case Interactive_kind:
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001489 if (find_ann(mod->v.Interactive.body)) {
1490 ADDOP(c, SETUP_ANNOTATIONS);
1491 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001492 c->c_interactive = 1;
1493 VISIT_SEQ_IN_SCOPE(c, stmt,
1494 mod->v.Interactive.body);
1495 break;
1496 case Expression_kind:
1497 VISIT_IN_SCOPE(c, expr, mod->v.Expression.body);
1498 addNone = 0;
1499 break;
1500 case Suite_kind:
1501 PyErr_SetString(PyExc_SystemError,
1502 "suite should not be possible");
1503 return 0;
1504 default:
1505 PyErr_Format(PyExc_SystemError,
1506 "module kind %d should not be possible",
1507 mod->kind);
1508 return 0;
1509 }
1510 co = assemble(c, addNone);
1511 compiler_exit_scope(c);
1512 return co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001513}
1514
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001515/* The test for LOCAL must come before the test for FREE in order to
1516 handle classes where name is both local and free. The local var is
1517 a method and the free var is a free var referenced within a method.
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001518*/
1519
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001520static int
1521get_ref_type(struct compiler *c, PyObject *name)
1522{
Victor Stinner0b1bc562013-05-16 22:17:17 +02001523 int scope;
Benjamin Peterson312595c2013-05-15 15:26:42 -05001524 if (c->u->u_scope_type == COMPILER_SCOPE_CLASS &&
1525 !PyUnicode_CompareWithASCIIString(name, "__class__"))
1526 return CELL;
Victor Stinner0b1bc562013-05-16 22:17:17 +02001527 scope = PyST_GetScope(c->u->u_ste, name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001528 if (scope == 0) {
1529 char buf[350];
1530 PyOS_snprintf(buf, sizeof(buf),
Victor Stinner14e461d2013-08-26 22:28:21 +02001531 "unknown scope for %.100s in %.100s(%s)\n"
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001532 "symbols: %s\nlocals: %s\nglobals: %s",
Serhiy Storchakadf4518c2014-11-18 23:34:33 +02001533 PyUnicode_AsUTF8(name),
1534 PyUnicode_AsUTF8(c->u->u_name),
1535 PyUnicode_AsUTF8(PyObject_Repr(c->u->u_ste->ste_id)),
1536 PyUnicode_AsUTF8(PyObject_Repr(c->u->u_ste->ste_symbols)),
1537 PyUnicode_AsUTF8(PyObject_Repr(c->u->u_varnames)),
1538 PyUnicode_AsUTF8(PyObject_Repr(c->u->u_names))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001539 );
1540 Py_FatalError(buf);
1541 }
Tim Peters2a7f3842001-06-09 09:26:21 +00001542
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001543 return scope;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001544}
1545
1546static int
1547compiler_lookup_arg(PyObject *dict, PyObject *name)
1548{
1549 PyObject *k, *v;
Victor Stinnerefb24132016-01-22 12:33:12 +01001550 k = _PyCode_ConstantKey(name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001551 if (k == NULL)
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00001552 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001553 v = PyDict_GetItem(dict, k);
Neal Norwitz3715c3e2005-11-24 22:09:18 +00001554 Py_DECREF(k);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001555 if (v == NULL)
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00001556 return -1;
Christian Heimes217cfd12007-12-02 14:31:20 +00001557 return PyLong_AS_LONG(v);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001558}
1559
1560static int
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001561compiler_make_closure(struct compiler *c, PyCodeObject *co, Py_ssize_t flags, PyObject *qualname)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001562{
Victor Stinnerad9a0662013-11-19 22:23:20 +01001563 Py_ssize_t i, free = PyCode_GetNumFree(co);
Antoine Pitrou86a36b52011-11-25 18:56:07 +01001564 if (qualname == NULL)
1565 qualname = co->co_name;
1566
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001567 if (free) {
1568 for (i = 0; i < free; ++i) {
1569 /* Bypass com_addop_varname because it will generate
1570 LOAD_DEREF but LOAD_CLOSURE is needed.
1571 */
1572 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
1573 int arg, reftype;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001574
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001575 /* Special case: If a class contains a method with a
1576 free variable that has the same name as a method,
1577 the name will be considered free *and* local in the
1578 class. It should be handled by the closure, as
1579 well as by the normal name loookup logic.
1580 */
1581 reftype = get_ref_type(c, name);
1582 if (reftype == CELL)
1583 arg = compiler_lookup_arg(c->u->u_cellvars, name);
1584 else /* (reftype == FREE) */
1585 arg = compiler_lookup_arg(c->u->u_freevars, name);
1586 if (arg == -1) {
1587 fprintf(stderr,
1588 "lookup %s in %s %d %d\n"
1589 "freevars of %s: %s\n",
1590 PyUnicode_AsUTF8(PyObject_Repr(name)),
1591 PyUnicode_AsUTF8(c->u->u_name),
1592 reftype, arg,
1593 PyUnicode_AsUTF8(co->co_name),
1594 PyUnicode_AsUTF8(PyObject_Repr(co->co_freevars)));
1595 Py_FatalError("compiler_make_closure()");
1596 }
1597 ADDOP_I(c, LOAD_CLOSURE, arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001598 }
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001599 flags |= 0x08;
1600 ADDOP_I(c, BUILD_TUPLE, free);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001601 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001602 ADDOP_O(c, LOAD_CONST, (PyObject*)co, consts);
Antoine Pitrou86a36b52011-11-25 18:56:07 +01001603 ADDOP_O(c, LOAD_CONST, qualname, consts);
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001604 ADDOP_I(c, MAKE_FUNCTION, flags);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001605 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001606}
1607
1608static int
1609compiler_decorators(struct compiler *c, asdl_seq* decos)
1610{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001611 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001612
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001613 if (!decos)
1614 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001615
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001616 for (i = 0; i < asdl_seq_LEN(decos); i++) {
1617 VISIT(c, expr, (expr_ty)asdl_seq_GET(decos, i));
1618 }
1619 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001620}
1621
1622static int
Guido van Rossum4f72a782006-10-27 23:31:49 +00001623compiler_visit_kwonlydefaults(struct compiler *c, asdl_seq *kwonlyargs,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001624 asdl_seq *kw_defaults)
Guido van Rossum4f72a782006-10-27 23:31:49 +00001625{
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03001626 /* Push a dict of keyword-only default values.
1627
1628 Return 0 on error, -1 if no dict pushed, 1 if a dict is pushed.
1629 */
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001630 int i;
1631 PyObject *keys = NULL;
1632
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001633 for (i = 0; i < asdl_seq_LEN(kwonlyargs); i++) {
1634 arg_ty arg = asdl_seq_GET(kwonlyargs, i);
1635 expr_ty default_ = asdl_seq_GET(kw_defaults, i);
1636 if (default_) {
Benjamin Peterson32c59b62012-04-17 19:53:21 -04001637 PyObject *mangled = _Py_Mangle(c->u->u_private, arg->arg);
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001638 if (!mangled) {
1639 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001640 }
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001641 if (keys == NULL) {
1642 keys = PyList_New(1);
1643 if (keys == NULL) {
1644 Py_DECREF(mangled);
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03001645 return 0;
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001646 }
1647 PyList_SET_ITEM(keys, 0, mangled);
1648 }
1649 else {
1650 int res = PyList_Append(keys, mangled);
1651 Py_DECREF(mangled);
1652 if (res == -1) {
1653 goto error;
1654 }
1655 }
1656 if (!compiler_visit_expr(c, default_)) {
1657 goto error;
1658 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001659 }
1660 }
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001661 if (keys != NULL) {
1662 Py_ssize_t default_count = PyList_GET_SIZE(keys);
1663 PyObject *keys_tuple = PyList_AsTuple(keys);
1664 Py_DECREF(keys);
1665 if (keys_tuple == NULL) {
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03001666 return 0;
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001667 }
1668 ADDOP_N(c, LOAD_CONST, keys_tuple, consts);
1669 ADDOP_I(c, BUILD_CONST_KEY_MAP, default_count);
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03001670 assert(default_count > 0);
1671 return 1;
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001672 }
1673 else {
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03001674 return -1;
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001675 }
1676
1677error:
1678 Py_XDECREF(keys);
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03001679 return 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001680}
1681
1682static int
Neal Norwitzc1505362006-12-28 06:47:50 +00001683compiler_visit_argannotation(struct compiler *c, identifier id,
1684 expr_ty annotation, PyObject *names)
1685{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001686 if (annotation) {
Victor Stinner065efc32014-02-18 22:07:56 +01001687 PyObject *mangled;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001688 VISIT(c, expr, annotation);
Victor Stinner065efc32014-02-18 22:07:56 +01001689 mangled = _Py_Mangle(c->u->u_private, id);
Yury Selivanov34ce99f2014-02-18 12:49:41 -05001690 if (!mangled)
Yury Selivanovf315c1c2015-07-23 09:10:44 +03001691 return 0;
Yury Selivanov34ce99f2014-02-18 12:49:41 -05001692 if (PyList_Append(names, mangled) < 0) {
1693 Py_DECREF(mangled);
Yury Selivanovf315c1c2015-07-23 09:10:44 +03001694 return 0;
Yury Selivanov34ce99f2014-02-18 12:49:41 -05001695 }
1696 Py_DECREF(mangled);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001697 }
Yury Selivanovf315c1c2015-07-23 09:10:44 +03001698 return 1;
Neal Norwitzc1505362006-12-28 06:47:50 +00001699}
1700
1701static int
1702compiler_visit_argannotations(struct compiler *c, asdl_seq* args,
1703 PyObject *names)
1704{
Yury Selivanovf315c1c2015-07-23 09:10:44 +03001705 int i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001706 for (i = 0; i < asdl_seq_LEN(args); i++) {
1707 arg_ty arg = (arg_ty)asdl_seq_GET(args, i);
Yury Selivanovf315c1c2015-07-23 09:10:44 +03001708 if (!compiler_visit_argannotation(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001709 c,
1710 arg->arg,
1711 arg->annotation,
Yury Selivanovf315c1c2015-07-23 09:10:44 +03001712 names))
1713 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001714 }
Yury Selivanovf315c1c2015-07-23 09:10:44 +03001715 return 1;
Neal Norwitzc1505362006-12-28 06:47:50 +00001716}
1717
1718static int
1719compiler_visit_annotations(struct compiler *c, arguments_ty args,
1720 expr_ty returns)
1721{
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03001722 /* Push arg annotation dict.
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001723 The expressions are evaluated out-of-order wrt the source code.
Neal Norwitzc1505362006-12-28 06:47:50 +00001724
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03001725 Return 0 on error, -1 if no dict pushed, 1 if a dict is pushed.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001726 */
1727 static identifier return_str;
1728 PyObject *names;
Victor Stinnerad9a0662013-11-19 22:23:20 +01001729 Py_ssize_t len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001730 names = PyList_New(0);
1731 if (!names)
Serhiy Storchaka694de3b2016-06-15 20:06:07 +03001732 return 0;
Neal Norwitzc1505362006-12-28 06:47:50 +00001733
Yury Selivanovf315c1c2015-07-23 09:10:44 +03001734 if (!compiler_visit_argannotations(c, args->args, names))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001735 goto error;
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001736 if (args->vararg && args->vararg->annotation &&
Yury Selivanovf315c1c2015-07-23 09:10:44 +03001737 !compiler_visit_argannotation(c, args->vararg->arg,
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001738 args->vararg->annotation, names))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001739 goto error;
Yury Selivanovf315c1c2015-07-23 09:10:44 +03001740 if (!compiler_visit_argannotations(c, args->kwonlyargs, names))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001741 goto error;
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001742 if (args->kwarg && args->kwarg->annotation &&
Yury Selivanovf315c1c2015-07-23 09:10:44 +03001743 !compiler_visit_argannotation(c, args->kwarg->arg,
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001744 args->kwarg->annotation, names))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001745 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +00001746
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001747 if (!return_str) {
1748 return_str = PyUnicode_InternFromString("return");
1749 if (!return_str)
1750 goto error;
1751 }
Yury Selivanovf315c1c2015-07-23 09:10:44 +03001752 if (!compiler_visit_argannotation(c, return_str, returns, names)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001753 goto error;
1754 }
1755
1756 len = PyList_GET_SIZE(names);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001757 if (len) {
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001758 PyObject *keytuple = PyList_AsTuple(names);
1759 Py_DECREF(names);
1760 if (keytuple == NULL) {
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03001761 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001762 }
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001763 ADDOP_N(c, LOAD_CONST, keytuple, consts);
1764 ADDOP_I(c, BUILD_CONST_KEY_MAP, len);
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03001765 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001766 }
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001767 else {
1768 Py_DECREF(names);
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03001769 return -1;
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001770 }
Neal Norwitzc1505362006-12-28 06:47:50 +00001771
1772error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001773 Py_DECREF(names);
Serhiy Storchaka694de3b2016-06-15 20:06:07 +03001774 return 0;
Neal Norwitzc1505362006-12-28 06:47:50 +00001775}
1776
1777static int
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03001778compiler_visit_defaults(struct compiler *c, arguments_ty args)
1779{
1780 VISIT_SEQ(c, expr, args->defaults);
1781 ADDOP_I(c, BUILD_TUPLE, asdl_seq_LEN(args->defaults));
1782 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001783}
1784
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001785static Py_ssize_t
1786compiler_default_arguments(struct compiler *c, arguments_ty args)
1787{
1788 Py_ssize_t funcflags = 0;
1789 if (args->defaults && asdl_seq_LEN(args->defaults) > 0) {
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03001790 if (!compiler_visit_defaults(c, args))
1791 return -1;
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001792 funcflags |= 0x01;
1793 }
1794 if (args->kwonlyargs) {
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03001795 int res = compiler_visit_kwonlydefaults(c, args->kwonlyargs,
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001796 args->kw_defaults);
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03001797 if (res == 0) {
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001798 return -1;
1799 }
1800 else if (res > 0) {
1801 funcflags |= 0x02;
1802 }
1803 }
1804 return funcflags;
1805}
1806
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001807static int
Yury Selivanov75445082015-05-11 22:57:16 -04001808compiler_function(struct compiler *c, stmt_ty s, int is_async)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001809{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001810 PyCodeObject *co;
Antoine Pitrou86a36b52011-11-25 18:56:07 +01001811 PyObject *qualname, *first_const = Py_None;
Yury Selivanov75445082015-05-11 22:57:16 -04001812 arguments_ty args;
1813 expr_ty returns;
1814 identifier name;
1815 asdl_seq* decos;
1816 asdl_seq *body;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001817 stmt_ty st;
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001818 Py_ssize_t i, n, funcflags;
1819 int docstring;
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03001820 int annotations;
Yury Selivanov75445082015-05-11 22:57:16 -04001821 int scope_type;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001822
Yury Selivanov75445082015-05-11 22:57:16 -04001823 if (is_async) {
1824 assert(s->kind == AsyncFunctionDef_kind);
1825
1826 args = s->v.AsyncFunctionDef.args;
1827 returns = s->v.AsyncFunctionDef.returns;
1828 decos = s->v.AsyncFunctionDef.decorator_list;
1829 name = s->v.AsyncFunctionDef.name;
1830 body = s->v.AsyncFunctionDef.body;
1831
1832 scope_type = COMPILER_SCOPE_ASYNC_FUNCTION;
1833 } else {
1834 assert(s->kind == FunctionDef_kind);
1835
1836 args = s->v.FunctionDef.args;
1837 returns = s->v.FunctionDef.returns;
1838 decos = s->v.FunctionDef.decorator_list;
1839 name = s->v.FunctionDef.name;
1840 body = s->v.FunctionDef.body;
1841
1842 scope_type = COMPILER_SCOPE_FUNCTION;
1843 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001844
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001845 if (!compiler_decorators(c, decos))
1846 return 0;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001847
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001848 funcflags = compiler_default_arguments(c, args);
1849 if (funcflags == -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001850 return 0;
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001851 }
1852
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03001853 annotations = compiler_visit_annotations(c, args, returns);
1854 if (annotations == 0) {
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001855 return 0;
1856 }
Serhiy Storchaka607f8a52016-06-15 20:07:53 +03001857 else if (annotations > 0) {
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001858 funcflags |= 0x04;
1859 }
1860
1861 if (!compiler_enter_scope(c, name, scope_type, (void *)s, s->lineno)) {
1862 return 0;
1863 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001864
Yury Selivanov75445082015-05-11 22:57:16 -04001865 st = (stmt_ty)asdl_seq_GET(body, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001866 docstring = compiler_isdocstring(st);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001867 if (docstring && c->c_optimize < 2) {
1868 if (st->v.Expr.value->kind == Constant_kind)
1869 first_const = st->v.Expr.value->v.Constant.value;
1870 else
1871 first_const = st->v.Expr.value->v.Str.s;
1872 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001873 if (compiler_add_o(c, c->u->u_consts, first_const) < 0) {
1874 compiler_exit_scope(c);
1875 return 0;
1876 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001877
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001878 c->u->u_argcount = asdl_seq_LEN(args->args);
1879 c->u->u_kwonlyargcount = asdl_seq_LEN(args->kwonlyargs);
Yury Selivanov75445082015-05-11 22:57:16 -04001880 n = asdl_seq_LEN(body);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001881 /* if there was a docstring, we need to skip the first statement */
1882 for (i = docstring; i < n; i++) {
Yury Selivanov75445082015-05-11 22:57:16 -04001883 st = (stmt_ty)asdl_seq_GET(body, i);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001884 VISIT_IN_SCOPE(c, stmt, st);
1885 }
1886 co = assemble(c, 1);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04001887 qualname = c->u->u_qualname;
1888 Py_INCREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001889 compiler_exit_scope(c);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04001890 if (co == NULL) {
Antoine Pitrou86a36b52011-11-25 18:56:07 +01001891 Py_XDECREF(qualname);
1892 Py_XDECREF(co);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001893 return 0;
Antoine Pitrou86a36b52011-11-25 18:56:07 +01001894 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001895
Serhiy Storchaka64204de2016-06-12 17:36:24 +03001896 compiler_make_closure(c, co, funcflags, qualname);
Antoine Pitrou86a36b52011-11-25 18:56:07 +01001897 Py_DECREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001898 Py_DECREF(co);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001899
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001900 /* decorators */
1901 for (i = 0; i < asdl_seq_LEN(decos); i++) {
1902 ADDOP_I(c, CALL_FUNCTION, 1);
1903 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001904
Yury Selivanov75445082015-05-11 22:57:16 -04001905 return compiler_nameop(c, name, Store);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001906}
1907
1908static int
1909compiler_class(struct compiler *c, stmt_ty s)
1910{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001911 PyCodeObject *co;
1912 PyObject *str;
1913 int i;
1914 asdl_seq* decos = s->v.ClassDef.decorator_list;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001915
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001916 if (!compiler_decorators(c, decos))
1917 return 0;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001918
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001919 /* ultimately generate code for:
1920 <name> = __build_class__(<func>, <name>, *<bases>, **<keywords>)
1921 where:
1922 <func> is a function/closure created from the class body;
1923 it has a single argument (__locals__) where the dict
1924 (or MutableSequence) representing the locals is passed
1925 <name> is the class name
1926 <bases> is the positional arguments and *varargs argument
1927 <keywords> is the keyword arguments and **kwds argument
1928 This borrows from compiler_call.
1929 */
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001930
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001931 /* 1. compile the class body into a code object */
Antoine Pitrou86a36b52011-11-25 18:56:07 +01001932 if (!compiler_enter_scope(c, s->v.ClassDef.name,
1933 COMPILER_SCOPE_CLASS, (void *)s, s->lineno))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001934 return 0;
1935 /* this block represents what we do in the new scope */
1936 {
1937 /* use the class name for name mangling */
1938 Py_INCREF(s->v.ClassDef.name);
Serhiy Storchaka48842712016-04-06 09:45:48 +03001939 Py_XSETREF(c->u->u_private, s->v.ClassDef.name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001940 /* load (global) __name__ ... */
1941 str = PyUnicode_InternFromString("__name__");
1942 if (!str || !compiler_nameop(c, str, Load)) {
1943 Py_XDECREF(str);
1944 compiler_exit_scope(c);
1945 return 0;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001946 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001947 Py_DECREF(str);
1948 /* ... and store it as __module__ */
1949 str = PyUnicode_InternFromString("__module__");
1950 if (!str || !compiler_nameop(c, str, Store)) {
1951 Py_XDECREF(str);
1952 compiler_exit_scope(c);
1953 return 0;
1954 }
1955 Py_DECREF(str);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04001956 assert(c->u->u_qualname);
1957 ADDOP_O(c, LOAD_CONST, c->u->u_qualname, consts);
Antoine Pitrou86a36b52011-11-25 18:56:07 +01001958 str = PyUnicode_InternFromString("__qualname__");
1959 if (!str || !compiler_nameop(c, str, Store)) {
1960 Py_XDECREF(str);
1961 compiler_exit_scope(c);
1962 return 0;
1963 }
1964 Py_DECREF(str);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001965 /* compile the body proper */
1966 if (!compiler_body(c, s->v.ClassDef.body)) {
1967 compiler_exit_scope(c);
1968 return 0;
1969 }
Benjamin Peterson312595c2013-05-15 15:26:42 -05001970 if (c->u->u_ste->ste_needs_class_closure) {
Nick Coghlan944368e2016-09-11 14:45:49 +10001971 /* store __classcell__ into class namespace */
Benjamin Peterson312595c2013-05-15 15:26:42 -05001972 str = PyUnicode_InternFromString("__class__");
1973 if (str == NULL) {
1974 compiler_exit_scope(c);
1975 return 0;
1976 }
1977 i = compiler_lookup_arg(c->u->u_cellvars, str);
1978 Py_DECREF(str);
Victor Stinner98e818b2013-11-05 18:07:34 +01001979 if (i < 0) {
1980 compiler_exit_scope(c);
1981 return 0;
1982 }
Benjamin Peterson312595c2013-05-15 15:26:42 -05001983 assert(i == 0);
Nick Coghlan944368e2016-09-11 14:45:49 +10001984
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001985 ADDOP_I(c, LOAD_CLOSURE, i);
Nick Coghlan944368e2016-09-11 14:45:49 +10001986 str = PyUnicode_InternFromString("__classcell__");
1987 if (!str || !compiler_nameop(c, str, Store)) {
1988 Py_XDECREF(str);
1989 compiler_exit_scope(c);
1990 return 0;
1991 }
1992 Py_DECREF(str);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001993 }
Benjamin Peterson312595c2013-05-15 15:26:42 -05001994 else {
Nick Coghlan944368e2016-09-11 14:45:49 +10001995 /* This happens when nobody references the cell. */
Benjamin Peterson312595c2013-05-15 15:26:42 -05001996 assert(PyDict_Size(c->u->u_cellvars) == 0);
Benjamin Peterson312595c2013-05-15 15:26:42 -05001997 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001998 /* create the code object */
1999 co = assemble(c, 1);
2000 }
2001 /* leave the new scope */
2002 compiler_exit_scope(c);
2003 if (co == NULL)
2004 return 0;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002005
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002006 /* 2. load the 'build_class' function */
2007 ADDOP(c, LOAD_BUILD_CLASS);
2008
2009 /* 3. load a function (or closure) made from the code object */
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002010 compiler_make_closure(c, co, 0, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002011 Py_DECREF(co);
2012
2013 /* 4. load class name */
2014 ADDOP_O(c, LOAD_CONST, s->v.ClassDef.name, consts);
2015
2016 /* 5. generate the rest of the code for the call */
2017 if (!compiler_call_helper(c, 2,
2018 s->v.ClassDef.bases,
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002019 s->v.ClassDef.keywords))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002020 return 0;
2021
2022 /* 6. apply decorators */
2023 for (i = 0; i < asdl_seq_LEN(decos); i++) {
2024 ADDOP_I(c, CALL_FUNCTION, 1);
2025 }
2026
2027 /* 7. store into <name> */
2028 if (!compiler_nameop(c, s->v.ClassDef.name, Store))
2029 return 0;
2030 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002031}
2032
2033static int
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002034compiler_ifexp(struct compiler *c, expr_ty e)
2035{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002036 basicblock *end, *next;
2037
2038 assert(e->kind == IfExp_kind);
2039 end = compiler_new_block(c);
2040 if (end == NULL)
2041 return 0;
2042 next = compiler_new_block(c);
2043 if (next == NULL)
2044 return 0;
2045 VISIT(c, expr, e->v.IfExp.test);
2046 ADDOP_JABS(c, POP_JUMP_IF_FALSE, next);
2047 VISIT(c, expr, e->v.IfExp.body);
2048 ADDOP_JREL(c, JUMP_FORWARD, end);
2049 compiler_use_next_block(c, next);
2050 VISIT(c, expr, e->v.IfExp.orelse);
2051 compiler_use_next_block(c, end);
2052 return 1;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002053}
2054
2055static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002056compiler_lambda(struct compiler *c, expr_ty e)
2057{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002058 PyCodeObject *co;
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002059 PyObject *qualname;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002060 static identifier name;
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002061 Py_ssize_t funcflags;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002062 arguments_ty args = e->v.Lambda.args;
2063 assert(e->kind == Lambda_kind);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002064
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002065 if (!name) {
2066 name = PyUnicode_InternFromString("<lambda>");
2067 if (!name)
2068 return 0;
2069 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002070
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002071 funcflags = compiler_default_arguments(c, args);
2072 if (funcflags == -1) {
2073 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002074 }
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002075
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04002076 if (!compiler_enter_scope(c, name, COMPILER_SCOPE_LAMBDA,
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002077 (void *)e, e->lineno))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002078 return 0;
Neal Norwitz4737b232005-11-19 23:58:29 +00002079
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002080 /* Make None the first constant, so the lambda can't have a
2081 docstring. */
2082 if (compiler_add_o(c, c->u->u_consts, Py_None) < 0)
2083 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002084
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002085 c->u->u_argcount = asdl_seq_LEN(args->args);
2086 c->u->u_kwonlyargcount = asdl_seq_LEN(args->kwonlyargs);
2087 VISIT_IN_SCOPE(c, expr, e->v.Lambda.body);
2088 if (c->u->u_ste->ste_generator) {
Serhiy Storchakac775ad62015-03-11 18:20:35 +02002089 co = assemble(c, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002090 }
2091 else {
2092 ADDOP_IN_SCOPE(c, RETURN_VALUE);
Serhiy Storchakac775ad62015-03-11 18:20:35 +02002093 co = assemble(c, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002094 }
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04002095 qualname = c->u->u_qualname;
2096 Py_INCREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002097 compiler_exit_scope(c);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04002098 if (co == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002099 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002100
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002101 compiler_make_closure(c, co, funcflags, qualname);
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002102 Py_DECREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002103 Py_DECREF(co);
2104
2105 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002106}
2107
2108static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002109compiler_if(struct compiler *c, stmt_ty s)
2110{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002111 basicblock *end, *next;
2112 int constant;
2113 assert(s->kind == If_kind);
2114 end = compiler_new_block(c);
2115 if (end == NULL)
2116 return 0;
2117
Georg Brandl8334fd92010-12-04 10:26:46 +00002118 constant = expr_constant(c, s->v.If.test);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002119 /* constant = 0: "if 0"
2120 * constant = 1: "if 1", "if 2", ...
2121 * constant = -1: rest */
2122 if (constant == 0) {
2123 if (s->v.If.orelse)
2124 VISIT_SEQ(c, stmt, s->v.If.orelse);
2125 } else if (constant == 1) {
2126 VISIT_SEQ(c, stmt, s->v.If.body);
2127 } else {
Antoine Pitroue7811fc2014-09-18 03:06:50 +02002128 if (asdl_seq_LEN(s->v.If.orelse)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002129 next = compiler_new_block(c);
2130 if (next == NULL)
2131 return 0;
2132 }
2133 else
2134 next = end;
2135 VISIT(c, expr, s->v.If.test);
2136 ADDOP_JABS(c, POP_JUMP_IF_FALSE, next);
2137 VISIT_SEQ(c, stmt, s->v.If.body);
Antoine Pitroue7811fc2014-09-18 03:06:50 +02002138 if (asdl_seq_LEN(s->v.If.orelse)) {
2139 ADDOP_JREL(c, JUMP_FORWARD, end);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002140 compiler_use_next_block(c, next);
2141 VISIT_SEQ(c, stmt, s->v.If.orelse);
2142 }
2143 }
2144 compiler_use_next_block(c, end);
2145 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002146}
2147
2148static int
2149compiler_for(struct compiler *c, stmt_ty s)
2150{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002151 basicblock *start, *cleanup, *end;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002152
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002153 start = compiler_new_block(c);
2154 cleanup = compiler_new_block(c);
2155 end = compiler_new_block(c);
2156 if (start == NULL || end == NULL || cleanup == NULL)
2157 return 0;
2158 ADDOP_JREL(c, SETUP_LOOP, end);
2159 if (!compiler_push_fblock(c, LOOP, start))
2160 return 0;
2161 VISIT(c, expr, s->v.For.iter);
2162 ADDOP(c, GET_ITER);
2163 compiler_use_next_block(c, start);
2164 ADDOP_JREL(c, FOR_ITER, cleanup);
2165 VISIT(c, expr, s->v.For.target);
2166 VISIT_SEQ(c, stmt, s->v.For.body);
2167 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
2168 compiler_use_next_block(c, cleanup);
2169 ADDOP(c, POP_BLOCK);
2170 compiler_pop_fblock(c, LOOP, start);
2171 VISIT_SEQ(c, stmt, s->v.For.orelse);
2172 compiler_use_next_block(c, end);
2173 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002174}
2175
Yury Selivanov75445082015-05-11 22:57:16 -04002176
2177static int
2178compiler_async_for(struct compiler *c, stmt_ty s)
2179{
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07002180 _Py_IDENTIFIER(StopAsyncIteration);
2181
Yury Selivanov75445082015-05-11 22:57:16 -04002182 basicblock *try, *except, *end, *after_try, *try_cleanup,
2183 *after_loop, *after_loop_else;
2184
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07002185 PyObject *stop_aiter_error = _PyUnicode_FromId(&PyId_StopAsyncIteration);
2186 if (stop_aiter_error == NULL) {
2187 return 0;
Yury Selivanov75445082015-05-11 22:57:16 -04002188 }
2189
2190 try = compiler_new_block(c);
2191 except = compiler_new_block(c);
2192 end = compiler_new_block(c);
2193 after_try = compiler_new_block(c);
2194 try_cleanup = compiler_new_block(c);
2195 after_loop = compiler_new_block(c);
2196 after_loop_else = compiler_new_block(c);
2197
2198 if (try == NULL || except == NULL || end == NULL
2199 || after_try == NULL || try_cleanup == NULL)
2200 return 0;
2201
2202 ADDOP_JREL(c, SETUP_LOOP, after_loop);
2203 if (!compiler_push_fblock(c, LOOP, try))
2204 return 0;
2205
2206 VISIT(c, expr, s->v.AsyncFor.iter);
2207 ADDOP(c, GET_AITER);
2208 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2209 ADDOP(c, YIELD_FROM);
2210
2211 compiler_use_next_block(c, try);
2212
2213
2214 ADDOP_JREL(c, SETUP_EXCEPT, except);
2215 if (!compiler_push_fblock(c, EXCEPT, try))
2216 return 0;
2217
2218 ADDOP(c, GET_ANEXT);
2219 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2220 ADDOP(c, YIELD_FROM);
2221 VISIT(c, expr, s->v.AsyncFor.target);
2222 ADDOP(c, POP_BLOCK);
2223 compiler_pop_fblock(c, EXCEPT, try);
2224 ADDOP_JREL(c, JUMP_FORWARD, after_try);
2225
2226
2227 compiler_use_next_block(c, except);
2228 ADDOP(c, DUP_TOP);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07002229 ADDOP_O(c, LOAD_GLOBAL, stop_aiter_error, names);
Yury Selivanov75445082015-05-11 22:57:16 -04002230 ADDOP_I(c, COMPARE_OP, PyCmp_EXC_MATCH);
2231 ADDOP_JABS(c, POP_JUMP_IF_FALSE, try_cleanup);
2232
2233 ADDOP(c, POP_TOP);
2234 ADDOP(c, POP_TOP);
2235 ADDOP(c, POP_TOP);
2236 ADDOP(c, POP_EXCEPT); /* for SETUP_EXCEPT */
2237 ADDOP(c, POP_BLOCK); /* for SETUP_LOOP */
2238 ADDOP_JABS(c, JUMP_ABSOLUTE, after_loop_else);
2239
2240
2241 compiler_use_next_block(c, try_cleanup);
2242 ADDOP(c, END_FINALLY);
2243
2244 compiler_use_next_block(c, after_try);
2245 VISIT_SEQ(c, stmt, s->v.AsyncFor.body);
2246 ADDOP_JABS(c, JUMP_ABSOLUTE, try);
2247
2248 ADDOP(c, POP_BLOCK); /* for SETUP_LOOP */
2249 compiler_pop_fblock(c, LOOP, try);
2250
2251 compiler_use_next_block(c, after_loop);
2252 ADDOP_JABS(c, JUMP_ABSOLUTE, end);
2253
2254 compiler_use_next_block(c, after_loop_else);
2255 VISIT_SEQ(c, stmt, s->v.For.orelse);
2256
2257 compiler_use_next_block(c, end);
2258
2259 return 1;
2260}
2261
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002262static int
2263compiler_while(struct compiler *c, stmt_ty s)
2264{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002265 basicblock *loop, *orelse, *end, *anchor = NULL;
Georg Brandl8334fd92010-12-04 10:26:46 +00002266 int constant = expr_constant(c, s->v.While.test);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002267
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002268 if (constant == 0) {
2269 if (s->v.While.orelse)
2270 VISIT_SEQ(c, stmt, s->v.While.orelse);
2271 return 1;
2272 }
2273 loop = compiler_new_block(c);
2274 end = compiler_new_block(c);
2275 if (constant == -1) {
2276 anchor = compiler_new_block(c);
2277 if (anchor == NULL)
2278 return 0;
2279 }
2280 if (loop == NULL || end == NULL)
2281 return 0;
2282 if (s->v.While.orelse) {
2283 orelse = compiler_new_block(c);
2284 if (orelse == NULL)
2285 return 0;
2286 }
2287 else
2288 orelse = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002289
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002290 ADDOP_JREL(c, SETUP_LOOP, end);
2291 compiler_use_next_block(c, loop);
2292 if (!compiler_push_fblock(c, LOOP, loop))
2293 return 0;
2294 if (constant == -1) {
2295 VISIT(c, expr, s->v.While.test);
2296 ADDOP_JABS(c, POP_JUMP_IF_FALSE, anchor);
2297 }
2298 VISIT_SEQ(c, stmt, s->v.While.body);
2299 ADDOP_JABS(c, JUMP_ABSOLUTE, loop);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002300
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002301 /* XXX should the two POP instructions be in a separate block
2302 if there is no else clause ?
2303 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002304
Benjamin Peterson3cda0ed2014-12-13 16:06:19 -05002305 if (constant == -1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002306 compiler_use_next_block(c, anchor);
Benjamin Peterson3cda0ed2014-12-13 16:06:19 -05002307 ADDOP(c, POP_BLOCK);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002308 compiler_pop_fblock(c, LOOP, loop);
2309 if (orelse != NULL) /* what if orelse is just pass? */
2310 VISIT_SEQ(c, stmt, s->v.While.orelse);
2311 compiler_use_next_block(c, end);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002312
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002313 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002314}
2315
2316static int
2317compiler_continue(struct compiler *c)
2318{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002319 static const char LOOP_ERROR_MSG[] = "'continue' not properly in loop";
2320 static const char IN_FINALLY_ERROR_MSG[] =
2321 "'continue' not supported inside 'finally' clause";
2322 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002323
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002324 if (!c->u->u_nfblocks)
2325 return compiler_error(c, LOOP_ERROR_MSG);
2326 i = c->u->u_nfblocks - 1;
2327 switch (c->u->u_fblock[i].fb_type) {
2328 case LOOP:
2329 ADDOP_JABS(c, JUMP_ABSOLUTE, c->u->u_fblock[i].fb_block);
2330 break;
2331 case EXCEPT:
2332 case FINALLY_TRY:
2333 while (--i >= 0 && c->u->u_fblock[i].fb_type != LOOP) {
2334 /* Prevent continue anywhere under a finally
2335 even if hidden in a sub-try or except. */
2336 if (c->u->u_fblock[i].fb_type == FINALLY_END)
2337 return compiler_error(c, IN_FINALLY_ERROR_MSG);
2338 }
2339 if (i == -1)
2340 return compiler_error(c, LOOP_ERROR_MSG);
2341 ADDOP_JABS(c, CONTINUE_LOOP, c->u->u_fblock[i].fb_block);
2342 break;
2343 case FINALLY_END:
2344 return compiler_error(c, IN_FINALLY_ERROR_MSG);
2345 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002346
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002347 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002348}
2349
2350/* Code generated for "try: <body> finally: <finalbody>" is as follows:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002351
2352 SETUP_FINALLY L
2353 <code for body>
2354 POP_BLOCK
2355 LOAD_CONST <None>
2356 L: <code for finalbody>
2357 END_FINALLY
2358
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002359 The special instructions use the block stack. Each block
2360 stack entry contains the instruction that created it (here
2361 SETUP_FINALLY), the level of the value stack at the time the
2362 block stack entry was created, and a label (here L).
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002363
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002364 SETUP_FINALLY:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002365 Pushes the current value stack level and the label
2366 onto the block stack.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002367 POP_BLOCK:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002368 Pops en entry from the block stack, and pops the value
2369 stack until its level is the same as indicated on the
2370 block stack. (The label is ignored.)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002371 END_FINALLY:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002372 Pops a variable number of entries from the *value* stack
2373 and re-raises the exception they specify. The number of
2374 entries popped depends on the (pseudo) exception type.
2375
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002376 The block stack is unwound when an exception is raised:
2377 when a SETUP_FINALLY entry is found, the exception is pushed
2378 onto the value stack (and the exception condition is cleared),
2379 and the interpreter jumps to the label gotten from the block
2380 stack.
2381*/
2382
2383static int
2384compiler_try_finally(struct compiler *c, stmt_ty s)
2385{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002386 basicblock *body, *end;
2387 body = compiler_new_block(c);
2388 end = compiler_new_block(c);
2389 if (body == NULL || end == NULL)
2390 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002391
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002392 ADDOP_JREL(c, SETUP_FINALLY, end);
2393 compiler_use_next_block(c, body);
2394 if (!compiler_push_fblock(c, FINALLY_TRY, body))
2395 return 0;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002396 if (s->v.Try.handlers && asdl_seq_LEN(s->v.Try.handlers)) {
2397 if (!compiler_try_except(c, s))
2398 return 0;
2399 }
2400 else {
2401 VISIT_SEQ(c, stmt, s->v.Try.body);
2402 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002403 ADDOP(c, POP_BLOCK);
2404 compiler_pop_fblock(c, FINALLY_TRY, body);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002405
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002406 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2407 compiler_use_next_block(c, end);
2408 if (!compiler_push_fblock(c, FINALLY_END, end))
2409 return 0;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002410 VISIT_SEQ(c, stmt, s->v.Try.finalbody);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002411 ADDOP(c, END_FINALLY);
2412 compiler_pop_fblock(c, FINALLY_END, end);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002413
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002414 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002415}
2416
2417/*
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00002418 Code generated for "try: S except E1 as V1: S1 except E2 as V2: S2 ...":
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002419 (The contents of the value stack is shown in [], with the top
2420 at the right; 'tb' is trace-back info, 'val' the exception's
2421 associated value, and 'exc' the exception.)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002422
2423 Value stack Label Instruction Argument
2424 [] SETUP_EXCEPT L1
2425 [] <code for S>
2426 [] POP_BLOCK
2427 [] JUMP_FORWARD L0
2428
2429 [tb, val, exc] L1: DUP )
2430 [tb, val, exc, exc] <evaluate E1> )
2431 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2432 [tb, val, exc, 1-or-0] POP_JUMP_IF_FALSE L2 )
2433 [tb, val, exc] POP
2434 [tb, val] <assign to V1> (or POP if no V1)
2435 [tb] POP
2436 [] <code for S1>
2437 JUMP_FORWARD L0
2438
2439 [tb, val, exc] L2: DUP
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002440 .............................etc.......................
2441
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002442 [tb, val, exc] Ln+1: END_FINALLY # re-raise exception
2443
2444 [] L0: <next statement>
2445
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002446 Of course, parts are not generated if Vi or Ei is not present.
2447*/
2448static int
2449compiler_try_except(struct compiler *c, stmt_ty s)
2450{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002451 basicblock *body, *orelse, *except, *end;
Victor Stinnerad9a0662013-11-19 22:23:20 +01002452 Py_ssize_t i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002453
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002454 body = compiler_new_block(c);
2455 except = compiler_new_block(c);
2456 orelse = compiler_new_block(c);
2457 end = compiler_new_block(c);
2458 if (body == NULL || except == NULL || orelse == NULL || end == NULL)
2459 return 0;
2460 ADDOP_JREL(c, SETUP_EXCEPT, except);
2461 compiler_use_next_block(c, body);
2462 if (!compiler_push_fblock(c, EXCEPT, body))
2463 return 0;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002464 VISIT_SEQ(c, stmt, s->v.Try.body);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002465 ADDOP(c, POP_BLOCK);
2466 compiler_pop_fblock(c, EXCEPT, body);
2467 ADDOP_JREL(c, JUMP_FORWARD, orelse);
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002468 n = asdl_seq_LEN(s->v.Try.handlers);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002469 compiler_use_next_block(c, except);
2470 for (i = 0; i < n; i++) {
2471 excepthandler_ty handler = (excepthandler_ty)asdl_seq_GET(
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002472 s->v.Try.handlers, i);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002473 if (!handler->v.ExceptHandler.type && i < n-1)
2474 return compiler_error(c, "default 'except:' must be last");
2475 c->u->u_lineno_set = 0;
2476 c->u->u_lineno = handler->lineno;
Benjamin Petersond4efd9e2010-09-20 23:02:10 +00002477 c->u->u_col_offset = handler->col_offset;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002478 except = compiler_new_block(c);
2479 if (except == NULL)
2480 return 0;
2481 if (handler->v.ExceptHandler.type) {
2482 ADDOP(c, DUP_TOP);
2483 VISIT(c, expr, handler->v.ExceptHandler.type);
2484 ADDOP_I(c, COMPARE_OP, PyCmp_EXC_MATCH);
2485 ADDOP_JABS(c, POP_JUMP_IF_FALSE, except);
2486 }
2487 ADDOP(c, POP_TOP);
2488 if (handler->v.ExceptHandler.name) {
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002489 basicblock *cleanup_end, *cleanup_body;
Guido van Rossumb940e112007-01-10 16:19:56 +00002490
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002491 cleanup_end = compiler_new_block(c);
2492 cleanup_body = compiler_new_block(c);
Benjamin Peterson0a5dad92011-05-27 14:17:04 -05002493 if (!(cleanup_end || cleanup_body))
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002494 return 0;
Guido van Rossumb940e112007-01-10 16:19:56 +00002495
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002496 compiler_nameop(c, handler->v.ExceptHandler.name, Store);
2497 ADDOP(c, POP_TOP);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002498
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002499 /*
2500 try:
Ezio Melotti1b6424f2013-04-19 07:10:09 +03002501 # body
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002502 except type as name:
Ezio Melotti1b6424f2013-04-19 07:10:09 +03002503 try:
2504 # body
2505 finally:
2506 name = None
2507 del name
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002508 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002509
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002510 /* second try: */
2511 ADDOP_JREL(c, SETUP_FINALLY, cleanup_end);
2512 compiler_use_next_block(c, cleanup_body);
2513 if (!compiler_push_fblock(c, FINALLY_TRY, cleanup_body))
2514 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002515
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002516 /* second # body */
2517 VISIT_SEQ(c, stmt, handler->v.ExceptHandler.body);
2518 ADDOP(c, POP_BLOCK);
2519 ADDOP(c, POP_EXCEPT);
2520 compiler_pop_fblock(c, FINALLY_TRY, cleanup_body);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002521
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002522 /* finally: */
2523 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2524 compiler_use_next_block(c, cleanup_end);
2525 if (!compiler_push_fblock(c, FINALLY_END, cleanup_end))
2526 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002527
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002528 /* name = None */
2529 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2530 compiler_nameop(c, handler->v.ExceptHandler.name, Store);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002531
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002532 /* del name */
2533 compiler_nameop(c, handler->v.ExceptHandler.name, Del);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002534
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002535 ADDOP(c, END_FINALLY);
2536 compiler_pop_fblock(c, FINALLY_END, cleanup_end);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002537 }
2538 else {
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002539 basicblock *cleanup_body;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002540
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002541 cleanup_body = compiler_new_block(c);
Benjamin Peterson0a5dad92011-05-27 14:17:04 -05002542 if (!cleanup_body)
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002543 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002544
Guido van Rossumb940e112007-01-10 16:19:56 +00002545 ADDOP(c, POP_TOP);
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002546 ADDOP(c, POP_TOP);
2547 compiler_use_next_block(c, cleanup_body);
2548 if (!compiler_push_fblock(c, FINALLY_TRY, cleanup_body))
2549 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002550 VISIT_SEQ(c, stmt, handler->v.ExceptHandler.body);
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002551 ADDOP(c, POP_EXCEPT);
2552 compiler_pop_fblock(c, FINALLY_TRY, cleanup_body);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002553 }
2554 ADDOP_JREL(c, JUMP_FORWARD, end);
2555 compiler_use_next_block(c, except);
2556 }
2557 ADDOP(c, END_FINALLY);
2558 compiler_use_next_block(c, orelse);
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002559 VISIT_SEQ(c, stmt, s->v.Try.orelse);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002560 compiler_use_next_block(c, end);
2561 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002562}
2563
2564static int
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002565compiler_try(struct compiler *c, stmt_ty s) {
2566 if (s->v.Try.finalbody && asdl_seq_LEN(s->v.Try.finalbody))
2567 return compiler_try_finally(c, s);
2568 else
2569 return compiler_try_except(c, s);
2570}
2571
2572
2573static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002574compiler_import_as(struct compiler *c, identifier name, identifier asname)
2575{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002576 /* The IMPORT_NAME opcode was already generated. This function
2577 merely needs to bind the result to a name.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002578
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002579 If there is a dot in name, we need to split it and emit a
2580 LOAD_ATTR for each name.
2581 */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002582 Py_ssize_t dot = PyUnicode_FindChar(name, '.', 0,
2583 PyUnicode_GET_LENGTH(name), 1);
2584 if (dot == -2)
Serhiy Storchaka694de3b2016-06-15 20:06:07 +03002585 return 0;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002586 if (dot != -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002587 /* Consume the base module name to get the first attribute */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002588 Py_ssize_t pos = dot + 1;
2589 while (dot != -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002590 PyObject *attr;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002591 dot = PyUnicode_FindChar(name, '.', pos,
2592 PyUnicode_GET_LENGTH(name), 1);
2593 if (dot == -2)
Serhiy Storchaka694de3b2016-06-15 20:06:07 +03002594 return 0;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002595 attr = PyUnicode_Substring(name, pos,
2596 (dot != -1) ? dot :
2597 PyUnicode_GET_LENGTH(name));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002598 if (!attr)
Serhiy Storchaka694de3b2016-06-15 20:06:07 +03002599 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002600 ADDOP_O(c, LOAD_ATTR, attr, names);
2601 Py_DECREF(attr);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002602 pos = dot + 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002603 }
2604 }
2605 return compiler_nameop(c, asname, Store);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002606}
2607
2608static int
2609compiler_import(struct compiler *c, stmt_ty s)
2610{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002611 /* The Import node stores a module name like a.b.c as a single
2612 string. This is convenient for all cases except
2613 import a.b.c as d
2614 where we need to parse that string to extract the individual
2615 module names.
2616 XXX Perhaps change the representation to make this case simpler?
2617 */
Victor Stinnerad9a0662013-11-19 22:23:20 +01002618 Py_ssize_t i, n = asdl_seq_LEN(s->v.Import.names);
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002619
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002620 for (i = 0; i < n; i++) {
2621 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.Import.names, i);
2622 int r;
2623 PyObject *level;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002624
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002625 level = PyLong_FromLong(0);
2626 if (level == NULL)
2627 return 0;
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002628
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002629 ADDOP_O(c, LOAD_CONST, level, consts);
2630 Py_DECREF(level);
2631 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2632 ADDOP_NAME(c, IMPORT_NAME, alias->name, names);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002633
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002634 if (alias->asname) {
2635 r = compiler_import_as(c, alias->name, alias->asname);
2636 if (!r)
2637 return r;
2638 }
2639 else {
2640 identifier tmp = alias->name;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002641 Py_ssize_t dot = PyUnicode_FindChar(
2642 alias->name, '.', 0, PyUnicode_GET_LENGTH(alias->name), 1);
Victor Stinner6b64a682013-07-11 22:50:45 +02002643 if (dot != -1) {
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002644 tmp = PyUnicode_Substring(alias->name, 0, dot);
Victor Stinner6b64a682013-07-11 22:50:45 +02002645 if (tmp == NULL)
2646 return 0;
2647 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002648 r = compiler_nameop(c, tmp, Store);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002649 if (dot != -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002650 Py_DECREF(tmp);
2651 }
2652 if (!r)
2653 return r;
2654 }
2655 }
2656 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002657}
2658
2659static int
2660compiler_from_import(struct compiler *c, stmt_ty s)
2661{
Victor Stinnerad9a0662013-11-19 22:23:20 +01002662 Py_ssize_t i, n = asdl_seq_LEN(s->v.ImportFrom.names);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002663
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002664 PyObject *names = PyTuple_New(n);
2665 PyObject *level;
2666 static PyObject *empty_string;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002667
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002668 if (!empty_string) {
2669 empty_string = PyUnicode_FromString("");
2670 if (!empty_string)
2671 return 0;
2672 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002673
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002674 if (!names)
2675 return 0;
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002676
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002677 level = PyLong_FromLong(s->v.ImportFrom.level);
2678 if (!level) {
2679 Py_DECREF(names);
2680 return 0;
2681 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002682
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002683 /* build up the names */
2684 for (i = 0; i < n; i++) {
2685 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);
2686 Py_INCREF(alias->name);
2687 PyTuple_SET_ITEM(names, i, alias->name);
2688 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002689
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002690 if (s->lineno > c->c_future->ff_lineno && s->v.ImportFrom.module &&
2691 !PyUnicode_CompareWithASCIIString(s->v.ImportFrom.module, "__future__")) {
2692 Py_DECREF(level);
2693 Py_DECREF(names);
2694 return compiler_error(c, "from __future__ imports must occur "
2695 "at the beginning of the file");
2696 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002697
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002698 ADDOP_O(c, LOAD_CONST, level, consts);
2699 Py_DECREF(level);
2700 ADDOP_O(c, LOAD_CONST, names, consts);
2701 Py_DECREF(names);
2702 if (s->v.ImportFrom.module) {
2703 ADDOP_NAME(c, IMPORT_NAME, s->v.ImportFrom.module, names);
2704 }
2705 else {
2706 ADDOP_NAME(c, IMPORT_NAME, empty_string, names);
2707 }
2708 for (i = 0; i < n; i++) {
2709 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);
2710 identifier store_name;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002711
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002712 if (i == 0 && PyUnicode_READ_CHAR(alias->name, 0) == '*') {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002713 assert(n == 1);
2714 ADDOP(c, IMPORT_STAR);
2715 return 1;
2716 }
2717
2718 ADDOP_NAME(c, IMPORT_FROM, alias->name, names);
2719 store_name = alias->name;
2720 if (alias->asname)
2721 store_name = alias->asname;
2722
2723 if (!compiler_nameop(c, store_name, Store)) {
2724 Py_DECREF(names);
2725 return 0;
2726 }
2727 }
2728 /* remove imported module */
2729 ADDOP(c, POP_TOP);
2730 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002731}
2732
2733static int
2734compiler_assert(struct compiler *c, stmt_ty s)
2735{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002736 static PyObject *assertion_error = NULL;
2737 basicblock *end;
Victor Stinner14e461d2013-08-26 22:28:21 +02002738 PyObject* msg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002739
Georg Brandl8334fd92010-12-04 10:26:46 +00002740 if (c->c_optimize)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002741 return 1;
2742 if (assertion_error == NULL) {
2743 assertion_error = PyUnicode_InternFromString("AssertionError");
2744 if (assertion_error == NULL)
2745 return 0;
2746 }
2747 if (s->v.Assert.test->kind == Tuple_kind &&
2748 asdl_seq_LEN(s->v.Assert.test->v.Tuple.elts) > 0) {
Victor Stinner14e461d2013-08-26 22:28:21 +02002749 msg = PyUnicode_FromString("assertion is always true, "
2750 "perhaps remove parentheses?");
2751 if (msg == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002752 return 0;
Victor Stinner14e461d2013-08-26 22:28:21 +02002753 if (PyErr_WarnExplicitObject(PyExc_SyntaxWarning, msg,
2754 c->c_filename, c->u->u_lineno,
2755 NULL, NULL) == -1) {
2756 Py_DECREF(msg);
2757 return 0;
2758 }
2759 Py_DECREF(msg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002760 }
2761 VISIT(c, expr, s->v.Assert.test);
2762 end = compiler_new_block(c);
2763 if (end == NULL)
2764 return 0;
2765 ADDOP_JABS(c, POP_JUMP_IF_TRUE, end);
2766 ADDOP_O(c, LOAD_GLOBAL, assertion_error, names);
2767 if (s->v.Assert.msg) {
2768 VISIT(c, expr, s->v.Assert.msg);
2769 ADDOP_I(c, CALL_FUNCTION, 1);
2770 }
2771 ADDOP_I(c, RAISE_VARARGS, 1);
2772 compiler_use_next_block(c, end);
2773 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002774}
2775
2776static int
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01002777compiler_visit_stmt_expr(struct compiler *c, expr_ty value)
2778{
2779 if (c->c_interactive && c->c_nestlevel <= 1) {
2780 VISIT(c, expr, value);
2781 ADDOP(c, PRINT_EXPR);
2782 return 1;
2783 }
2784
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03002785 if (is_const(value)) {
Victor Stinner15a30952016-02-08 22:45:06 +01002786 /* ignore constant statement */
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01002787 return 1;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01002788 }
2789
2790 VISIT(c, expr, value);
2791 ADDOP(c, POP_TOP);
2792 return 1;
2793}
2794
2795static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002796compiler_visit_stmt(struct compiler *c, stmt_ty s)
2797{
Victor Stinnerad9a0662013-11-19 22:23:20 +01002798 Py_ssize_t i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002799
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002800 /* Always assign a lineno to the next instruction for a stmt. */
2801 c->u->u_lineno = s->lineno;
Benjamin Petersond4efd9e2010-09-20 23:02:10 +00002802 c->u->u_col_offset = s->col_offset;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002803 c->u->u_lineno_set = 0;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002804
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002805 switch (s->kind) {
2806 case FunctionDef_kind:
Yury Selivanov75445082015-05-11 22:57:16 -04002807 return compiler_function(c, s, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002808 case ClassDef_kind:
2809 return compiler_class(c, s);
2810 case Return_kind:
2811 if (c->u->u_ste->ste_type != FunctionBlock)
2812 return compiler_error(c, "'return' outside function");
2813 if (s->v.Return.value) {
Yury Selivanoveb636452016-09-08 22:01:51 -07002814 if (c->u->u_ste->ste_coroutine && c->u->u_ste->ste_generator)
2815 return compiler_error(
2816 c, "'return' with value in async generator");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002817 VISIT(c, expr, s->v.Return.value);
2818 }
2819 else
2820 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2821 ADDOP(c, RETURN_VALUE);
2822 break;
2823 case Delete_kind:
2824 VISIT_SEQ(c, expr, s->v.Delete.targets)
2825 break;
2826 case Assign_kind:
2827 n = asdl_seq_LEN(s->v.Assign.targets);
2828 VISIT(c, expr, s->v.Assign.value);
2829 for (i = 0; i < n; i++) {
2830 if (i < n - 1)
2831 ADDOP(c, DUP_TOP);
2832 VISIT(c, expr,
2833 (expr_ty)asdl_seq_GET(s->v.Assign.targets, i));
2834 }
2835 break;
2836 case AugAssign_kind:
2837 return compiler_augassign(c, s);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002838 case AnnAssign_kind:
2839 return compiler_annassign(c, s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002840 case For_kind:
2841 return compiler_for(c, s);
2842 case While_kind:
2843 return compiler_while(c, s);
2844 case If_kind:
2845 return compiler_if(c, s);
2846 case Raise_kind:
2847 n = 0;
2848 if (s->v.Raise.exc) {
2849 VISIT(c, expr, s->v.Raise.exc);
2850 n++;
Victor Stinnerad9a0662013-11-19 22:23:20 +01002851 if (s->v.Raise.cause) {
2852 VISIT(c, expr, s->v.Raise.cause);
2853 n++;
2854 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002855 }
Victor Stinnerad9a0662013-11-19 22:23:20 +01002856 ADDOP_I(c, RAISE_VARARGS, (int)n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002857 break;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002858 case Try_kind:
2859 return compiler_try(c, s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002860 case Assert_kind:
2861 return compiler_assert(c, s);
2862 case Import_kind:
2863 return compiler_import(c, s);
2864 case ImportFrom_kind:
2865 return compiler_from_import(c, s);
2866 case Global_kind:
2867 case Nonlocal_kind:
2868 break;
2869 case Expr_kind:
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01002870 return compiler_visit_stmt_expr(c, s->v.Expr.value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002871 case Pass_kind:
2872 break;
2873 case Break_kind:
2874 if (!compiler_in_loop(c))
2875 return compiler_error(c, "'break' outside loop");
2876 ADDOP(c, BREAK_LOOP);
2877 break;
2878 case Continue_kind:
2879 return compiler_continue(c);
2880 case With_kind:
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05002881 return compiler_with(c, s, 0);
Yury Selivanov75445082015-05-11 22:57:16 -04002882 case AsyncFunctionDef_kind:
2883 return compiler_function(c, s, 1);
2884 case AsyncWith_kind:
2885 return compiler_async_with(c, s, 0);
2886 case AsyncFor_kind:
2887 return compiler_async_for(c, s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002888 }
Yury Selivanov75445082015-05-11 22:57:16 -04002889
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002890 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002891}
2892
2893static int
2894unaryop(unaryop_ty op)
2895{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002896 switch (op) {
2897 case Invert:
2898 return UNARY_INVERT;
2899 case Not:
2900 return UNARY_NOT;
2901 case UAdd:
2902 return UNARY_POSITIVE;
2903 case USub:
2904 return UNARY_NEGATIVE;
2905 default:
2906 PyErr_Format(PyExc_SystemError,
2907 "unary op %d should not be possible", op);
2908 return 0;
2909 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002910}
2911
2912static int
2913binop(struct compiler *c, operator_ty op)
2914{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002915 switch (op) {
2916 case Add:
2917 return BINARY_ADD;
2918 case Sub:
2919 return BINARY_SUBTRACT;
2920 case Mult:
2921 return BINARY_MULTIPLY;
Benjamin Petersond51374e2014-04-09 23:55:56 -04002922 case MatMult:
2923 return BINARY_MATRIX_MULTIPLY;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002924 case Div:
2925 return BINARY_TRUE_DIVIDE;
2926 case Mod:
2927 return BINARY_MODULO;
2928 case Pow:
2929 return BINARY_POWER;
2930 case LShift:
2931 return BINARY_LSHIFT;
2932 case RShift:
2933 return BINARY_RSHIFT;
2934 case BitOr:
2935 return BINARY_OR;
2936 case BitXor:
2937 return BINARY_XOR;
2938 case BitAnd:
2939 return BINARY_AND;
2940 case FloorDiv:
2941 return BINARY_FLOOR_DIVIDE;
2942 default:
2943 PyErr_Format(PyExc_SystemError,
2944 "binary op %d should not be possible", op);
2945 return 0;
2946 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002947}
2948
2949static int
2950cmpop(cmpop_ty op)
2951{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002952 switch (op) {
2953 case Eq:
2954 return PyCmp_EQ;
2955 case NotEq:
2956 return PyCmp_NE;
2957 case Lt:
2958 return PyCmp_LT;
2959 case LtE:
2960 return PyCmp_LE;
2961 case Gt:
2962 return PyCmp_GT;
2963 case GtE:
2964 return PyCmp_GE;
2965 case Is:
2966 return PyCmp_IS;
2967 case IsNot:
2968 return PyCmp_IS_NOT;
2969 case In:
2970 return PyCmp_IN;
2971 case NotIn:
2972 return PyCmp_NOT_IN;
2973 default:
2974 return PyCmp_BAD;
2975 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002976}
2977
2978static int
2979inplace_binop(struct compiler *c, operator_ty op)
2980{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002981 switch (op) {
2982 case Add:
2983 return INPLACE_ADD;
2984 case Sub:
2985 return INPLACE_SUBTRACT;
2986 case Mult:
2987 return INPLACE_MULTIPLY;
Benjamin Petersond51374e2014-04-09 23:55:56 -04002988 case MatMult:
2989 return INPLACE_MATRIX_MULTIPLY;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002990 case Div:
2991 return INPLACE_TRUE_DIVIDE;
2992 case Mod:
2993 return INPLACE_MODULO;
2994 case Pow:
2995 return INPLACE_POWER;
2996 case LShift:
2997 return INPLACE_LSHIFT;
2998 case RShift:
2999 return INPLACE_RSHIFT;
3000 case BitOr:
3001 return INPLACE_OR;
3002 case BitXor:
3003 return INPLACE_XOR;
3004 case BitAnd:
3005 return INPLACE_AND;
3006 case FloorDiv:
3007 return INPLACE_FLOOR_DIVIDE;
3008 default:
3009 PyErr_Format(PyExc_SystemError,
3010 "inplace binary op %d should not be possible", op);
3011 return 0;
3012 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003013}
3014
3015static int
3016compiler_nameop(struct compiler *c, identifier name, expr_context_ty ctx)
3017{
Victor Stinnerad9a0662013-11-19 22:23:20 +01003018 int op, scope;
3019 Py_ssize_t arg;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003020 enum { OP_FAST, OP_GLOBAL, OP_DEREF, OP_NAME } optype;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003021
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003022 PyObject *dict = c->u->u_names;
3023 PyObject *mangled;
3024 /* XXX AugStore isn't used anywhere! */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003025
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003026 mangled = _Py_Mangle(c->u->u_private, name);
3027 if (!mangled)
3028 return 0;
Neil Schemenauer8b528b22005-10-23 18:37:42 +00003029
Benjamin Peterson70b224d2012-12-06 17:49:58 -05003030 assert(PyUnicode_CompareWithASCIIString(name, "None") &&
3031 PyUnicode_CompareWithASCIIString(name, "True") &&
3032 PyUnicode_CompareWithASCIIString(name, "False"));
3033
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003034 op = 0;
3035 optype = OP_NAME;
3036 scope = PyST_GetScope(c->u->u_ste, mangled);
3037 switch (scope) {
3038 case FREE:
3039 dict = c->u->u_freevars;
3040 optype = OP_DEREF;
3041 break;
3042 case CELL:
3043 dict = c->u->u_cellvars;
3044 optype = OP_DEREF;
3045 break;
3046 case LOCAL:
3047 if (c->u->u_ste->ste_type == FunctionBlock)
3048 optype = OP_FAST;
3049 break;
3050 case GLOBAL_IMPLICIT:
Benjamin Peterson1dfd2472015-04-27 21:44:22 -04003051 if (c->u->u_ste->ste_type == FunctionBlock)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003052 optype = OP_GLOBAL;
3053 break;
3054 case GLOBAL_EXPLICIT:
3055 optype = OP_GLOBAL;
3056 break;
3057 default:
3058 /* scope can be 0 */
3059 break;
3060 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003061
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003062 /* XXX Leave assert here, but handle __doc__ and the like better */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003063 assert(scope || PyUnicode_READ_CHAR(name, 0) == '_');
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003064
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003065 switch (optype) {
3066 case OP_DEREF:
3067 switch (ctx) {
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04003068 case Load:
3069 op = (c->u->u_ste->ste_type == ClassBlock) ? LOAD_CLASSDEREF : LOAD_DEREF;
3070 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003071 case Store: op = STORE_DEREF; break;
3072 case AugLoad:
3073 case AugStore:
3074 break;
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00003075 case Del: op = DELETE_DEREF; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003076 case Param:
3077 default:
3078 PyErr_SetString(PyExc_SystemError,
3079 "param invalid for deref variable");
3080 return 0;
3081 }
3082 break;
3083 case OP_FAST:
3084 switch (ctx) {
3085 case Load: op = LOAD_FAST; break;
3086 case Store: op = STORE_FAST; break;
3087 case Del: op = DELETE_FAST; break;
3088 case AugLoad:
3089 case AugStore:
3090 break;
3091 case Param:
3092 default:
3093 PyErr_SetString(PyExc_SystemError,
3094 "param invalid for local variable");
3095 return 0;
3096 }
3097 ADDOP_O(c, op, mangled, varnames);
3098 Py_DECREF(mangled);
3099 return 1;
3100 case OP_GLOBAL:
3101 switch (ctx) {
3102 case Load: op = LOAD_GLOBAL; break;
3103 case Store: op = STORE_GLOBAL; break;
3104 case Del: op = DELETE_GLOBAL; break;
3105 case AugLoad:
3106 case AugStore:
3107 break;
3108 case Param:
3109 default:
3110 PyErr_SetString(PyExc_SystemError,
3111 "param invalid for global variable");
3112 return 0;
3113 }
3114 break;
3115 case OP_NAME:
3116 switch (ctx) {
Benjamin Peterson20f9c3c2010-07-20 22:39:34 +00003117 case Load: op = LOAD_NAME; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003118 case Store: op = STORE_NAME; break;
3119 case Del: op = DELETE_NAME; break;
3120 case AugLoad:
3121 case AugStore:
3122 break;
3123 case Param:
3124 default:
3125 PyErr_SetString(PyExc_SystemError,
3126 "param invalid for name variable");
3127 return 0;
3128 }
3129 break;
3130 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003131
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003132 assert(op);
3133 arg = compiler_add_o(c, dict, mangled);
3134 Py_DECREF(mangled);
3135 if (arg < 0)
3136 return 0;
3137 return compiler_addop_i(c, op, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003138}
3139
3140static int
3141compiler_boolop(struct compiler *c, expr_ty e)
3142{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003143 basicblock *end;
Victor Stinnerad9a0662013-11-19 22:23:20 +01003144 int jumpi;
3145 Py_ssize_t i, n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003146 asdl_seq *s;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003147
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003148 assert(e->kind == BoolOp_kind);
3149 if (e->v.BoolOp.op == And)
3150 jumpi = JUMP_IF_FALSE_OR_POP;
3151 else
3152 jumpi = JUMP_IF_TRUE_OR_POP;
3153 end = compiler_new_block(c);
3154 if (end == NULL)
3155 return 0;
3156 s = e->v.BoolOp.values;
3157 n = asdl_seq_LEN(s) - 1;
3158 assert(n >= 0);
3159 for (i = 0; i < n; ++i) {
3160 VISIT(c, expr, (expr_ty)asdl_seq_GET(s, i));
3161 ADDOP_JABS(c, jumpi, end);
3162 }
3163 VISIT(c, expr, (expr_ty)asdl_seq_GET(s, n));
3164 compiler_use_next_block(c, end);
3165 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003166}
3167
3168static int
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003169starunpack_helper(struct compiler *c, asdl_seq *elts,
3170 int single_op, int inner_op, int outer_op)
3171{
3172 Py_ssize_t n = asdl_seq_LEN(elts);
3173 Py_ssize_t i, nsubitems = 0, nseen = 0;
3174 for (i = 0; i < n; i++) {
3175 expr_ty elt = asdl_seq_GET(elts, i);
3176 if (elt->kind == Starred_kind) {
3177 if (nseen) {
3178 ADDOP_I(c, inner_op, nseen);
3179 nseen = 0;
3180 nsubitems++;
3181 }
3182 VISIT(c, expr, elt->v.Starred.value);
3183 nsubitems++;
3184 }
3185 else {
3186 VISIT(c, expr, elt);
3187 nseen++;
3188 }
3189 }
3190 if (nsubitems) {
3191 if (nseen) {
3192 ADDOP_I(c, inner_op, nseen);
3193 nsubitems++;
3194 }
3195 ADDOP_I(c, outer_op, nsubitems);
3196 }
3197 else
3198 ADDOP_I(c, single_op, nseen);
3199 return 1;
3200}
3201
3202static int
3203assignment_helper(struct compiler *c, asdl_seq *elts)
3204{
3205 Py_ssize_t n = asdl_seq_LEN(elts);
3206 Py_ssize_t i;
3207 int seen_star = 0;
3208 for (i = 0; i < n; i++) {
3209 expr_ty elt = asdl_seq_GET(elts, i);
3210 if (elt->kind == Starred_kind && !seen_star) {
3211 if ((i >= (1 << 8)) ||
3212 (n-i-1 >= (INT_MAX >> 8)))
3213 return compiler_error(c,
3214 "too many expressions in "
3215 "star-unpacking assignment");
3216 ADDOP_I(c, UNPACK_EX, (i + ((n-i-1) << 8)));
3217 seen_star = 1;
3218 asdl_seq_SET(elts, i, elt->v.Starred.value);
3219 }
3220 else if (elt->kind == Starred_kind) {
3221 return compiler_error(c,
3222 "two starred expressions in assignment");
3223 }
3224 }
3225 if (!seen_star) {
3226 ADDOP_I(c, UNPACK_SEQUENCE, n);
3227 }
3228 VISIT_SEQ(c, expr, elts);
3229 return 1;
3230}
3231
3232static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003233compiler_list(struct compiler *c, expr_ty e)
3234{
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003235 asdl_seq *elts = e->v.List.elts;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003236 if (e->v.List.ctx == Store) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003237 return assignment_helper(c, elts);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003238 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003239 else if (e->v.List.ctx == Load) {
3240 return starunpack_helper(c, elts,
3241 BUILD_LIST, BUILD_TUPLE, BUILD_LIST_UNPACK);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003242 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003243 else
3244 VISIT_SEQ(c, expr, elts);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003245 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003246}
3247
3248static int
3249compiler_tuple(struct compiler *c, expr_ty e)
3250{
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003251 asdl_seq *elts = e->v.Tuple.elts;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003252 if (e->v.Tuple.ctx == Store) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003253 return assignment_helper(c, elts);
3254 }
3255 else if (e->v.Tuple.ctx == Load) {
3256 return starunpack_helper(c, elts,
3257 BUILD_TUPLE, BUILD_TUPLE, BUILD_TUPLE_UNPACK);
3258 }
3259 else
3260 VISIT_SEQ(c, expr, elts);
3261 return 1;
3262}
3263
3264static int
3265compiler_set(struct compiler *c, expr_ty e)
3266{
3267 return starunpack_helper(c, e->v.Set.elts, BUILD_SET,
3268 BUILD_SET, BUILD_SET_UNPACK);
3269}
3270
3271static int
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003272are_all_items_const(asdl_seq *seq, Py_ssize_t begin, Py_ssize_t end)
3273{
3274 Py_ssize_t i;
3275 for (i = begin; i < end; i++) {
3276 expr_ty key = (expr_ty)asdl_seq_GET(seq, i);
3277 if (key == NULL || !is_const(key))
3278 return 0;
3279 }
3280 return 1;
3281}
3282
3283static int
3284compiler_subdict(struct compiler *c, expr_ty e, Py_ssize_t begin, Py_ssize_t end)
3285{
3286 Py_ssize_t i, n = end - begin;
3287 PyObject *keys, *key;
3288 if (n > 1 && are_all_items_const(e->v.Dict.keys, begin, end)) {
3289 for (i = begin; i < end; i++) {
3290 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Dict.values, i));
3291 }
3292 keys = PyTuple_New(n);
3293 if (keys == NULL) {
3294 return 0;
3295 }
3296 for (i = begin; i < end; i++) {
3297 key = get_const_value((expr_ty)asdl_seq_GET(e->v.Dict.keys, i));
3298 Py_INCREF(key);
3299 PyTuple_SET_ITEM(keys, i - begin, key);
3300 }
3301 ADDOP_N(c, LOAD_CONST, keys, consts);
3302 ADDOP_I(c, BUILD_CONST_KEY_MAP, n);
3303 }
3304 else {
3305 for (i = begin; i < end; i++) {
3306 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Dict.keys, i));
3307 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Dict.values, i));
3308 }
3309 ADDOP_I(c, BUILD_MAP, n);
3310 }
3311 return 1;
3312}
3313
3314static int
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003315compiler_dict(struct compiler *c, expr_ty e)
3316{
Victor Stinner976bb402016-03-23 11:36:19 +01003317 Py_ssize_t i, n, elements;
3318 int containers;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003319 int is_unpacking = 0;
3320 n = asdl_seq_LEN(e->v.Dict.values);
3321 containers = 0;
3322 elements = 0;
3323 for (i = 0; i < n; i++) {
3324 is_unpacking = (expr_ty)asdl_seq_GET(e->v.Dict.keys, i) == NULL;
3325 if (elements == 0xFFFF || (elements && is_unpacking)) {
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003326 if (!compiler_subdict(c, e, i - elements, i))
3327 return 0;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003328 containers++;
3329 elements = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003330 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003331 if (is_unpacking) {
3332 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Dict.values, i));
3333 containers++;
3334 }
3335 else {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003336 elements++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003337 }
3338 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003339 if (elements || containers == 0) {
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003340 if (!compiler_subdict(c, e, n - elements, n))
3341 return 0;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003342 containers++;
3343 }
3344 /* If there is more than one dict, they need to be merged into a new
3345 * dict. If there is one dict and it's an unpacking, then it needs
3346 * to be copied into a new dict." */
3347 while (containers > 1 || is_unpacking) {
3348 int oparg = containers < 255 ? containers : 255;
3349 ADDOP_I(c, BUILD_MAP_UNPACK, oparg);
3350 containers -= (oparg - 1);
3351 is_unpacking = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003352 }
3353 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003354}
3355
3356static int
3357compiler_compare(struct compiler *c, expr_ty e)
3358{
Victor Stinnerad9a0662013-11-19 22:23:20 +01003359 Py_ssize_t i, n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003360 basicblock *cleanup = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003361
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003362 /* XXX the logic can be cleaned up for 1 or multiple comparisons */
3363 VISIT(c, expr, e->v.Compare.left);
3364 n = asdl_seq_LEN(e->v.Compare.ops);
3365 assert(n > 0);
3366 if (n > 1) {
3367 cleanup = compiler_new_block(c);
3368 if (cleanup == NULL)
3369 return 0;
3370 VISIT(c, expr,
3371 (expr_ty)asdl_seq_GET(e->v.Compare.comparators, 0));
3372 }
3373 for (i = 1; i < n; i++) {
3374 ADDOP(c, DUP_TOP);
3375 ADDOP(c, ROT_THREE);
3376 ADDOP_I(c, COMPARE_OP,
3377 cmpop((cmpop_ty)(asdl_seq_GET(
3378 e->v.Compare.ops, i - 1))));
3379 ADDOP_JABS(c, JUMP_IF_FALSE_OR_POP, cleanup);
3380 NEXT_BLOCK(c);
3381 if (i < (n - 1))
3382 VISIT(c, expr,
3383 (expr_ty)asdl_seq_GET(e->v.Compare.comparators, i));
3384 }
3385 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, n - 1));
3386 ADDOP_I(c, COMPARE_OP,
3387 cmpop((cmpop_ty)(asdl_seq_GET(e->v.Compare.ops, n - 1))));
3388 if (n > 1) {
3389 basicblock *end = compiler_new_block(c);
3390 if (end == NULL)
3391 return 0;
3392 ADDOP_JREL(c, JUMP_FORWARD, end);
3393 compiler_use_next_block(c, cleanup);
3394 ADDOP(c, ROT_TWO);
3395 ADDOP(c, POP_TOP);
3396 compiler_use_next_block(c, end);
3397 }
3398 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003399}
3400
3401static int
3402compiler_call(struct compiler *c, expr_ty e)
3403{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003404 VISIT(c, expr, e->v.Call.func);
3405 return compiler_call_helper(c, 0,
3406 e->v.Call.args,
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003407 e->v.Call.keywords);
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003408}
3409
Eric V. Smith235a6f02015-09-19 14:51:32 -04003410static int
3411compiler_joined_str(struct compiler *c, expr_ty e)
3412{
Eric V. Smith235a6f02015-09-19 14:51:32 -04003413 VISIT_SEQ(c, expr, e->v.JoinedStr.values);
Serhiy Storchakaea525a22016-09-06 22:07:53 +03003414 ADDOP_I(c, BUILD_STRING, asdl_seq_LEN(e->v.JoinedStr.values));
Eric V. Smith235a6f02015-09-19 14:51:32 -04003415 return 1;
3416}
3417
Eric V. Smitha78c7952015-11-03 12:45:05 -05003418/* Used to implement f-strings. Format a single value. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04003419static int
3420compiler_formatted_value(struct compiler *c, expr_ty e)
3421{
Eric V. Smitha78c7952015-11-03 12:45:05 -05003422 /* Our oparg encodes 2 pieces of information: the conversion
3423 character, and whether or not a format_spec was provided.
Eric V. Smith235a6f02015-09-19 14:51:32 -04003424
Eric V. Smitha78c7952015-11-03 12:45:05 -05003425 Convert the conversion char to 2 bits:
3426 None: 000 0x0 FVC_NONE
3427 !s : 001 0x1 FVC_STR
3428 !r : 010 0x2 FVC_REPR
3429 !a : 011 0x3 FVC_ASCII
Eric V. Smith235a6f02015-09-19 14:51:32 -04003430
Eric V. Smitha78c7952015-11-03 12:45:05 -05003431 next bit is whether or not we have a format spec:
3432 yes : 100 0x4
3433 no : 000 0x0
3434 */
Eric V. Smith235a6f02015-09-19 14:51:32 -04003435
Eric V. Smitha78c7952015-11-03 12:45:05 -05003436 int oparg;
Eric V. Smith235a6f02015-09-19 14:51:32 -04003437
Eric V. Smitha78c7952015-11-03 12:45:05 -05003438 /* Evaluate the expression to be formatted. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04003439 VISIT(c, expr, e->v.FormattedValue.value);
3440
Eric V. Smitha78c7952015-11-03 12:45:05 -05003441 switch (e->v.FormattedValue.conversion) {
3442 case 's': oparg = FVC_STR; break;
3443 case 'r': oparg = FVC_REPR; break;
3444 case 'a': oparg = FVC_ASCII; break;
3445 case -1: oparg = FVC_NONE; break;
3446 default:
3447 PyErr_SetString(PyExc_SystemError,
3448 "Unrecognized conversion character");
3449 return 0;
Eric V. Smith235a6f02015-09-19 14:51:32 -04003450 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04003451 if (e->v.FormattedValue.format_spec) {
Eric V. Smitha78c7952015-11-03 12:45:05 -05003452 /* Evaluate the format spec, and update our opcode arg. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04003453 VISIT(c, expr, e->v.FormattedValue.format_spec);
Eric V. Smitha78c7952015-11-03 12:45:05 -05003454 oparg |= FVS_HAVE_SPEC;
Eric V. Smith235a6f02015-09-19 14:51:32 -04003455 }
3456
Eric V. Smitha78c7952015-11-03 12:45:05 -05003457 /* And push our opcode and oparg */
3458 ADDOP_I(c, FORMAT_VALUE, oparg);
Eric V. Smith235a6f02015-09-19 14:51:32 -04003459 return 1;
3460}
3461
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003462static int
3463compiler_subkwargs(struct compiler *c, asdl_seq *keywords, Py_ssize_t begin, Py_ssize_t end)
3464{
3465 Py_ssize_t i, n = end - begin;
3466 keyword_ty kw;
3467 PyObject *keys, *key;
3468 assert(n > 0);
3469 if (n > 1) {
3470 for (i = begin; i < end; i++) {
3471 kw = asdl_seq_GET(keywords, i);
3472 VISIT(c, expr, kw->value);
3473 }
3474 keys = PyTuple_New(n);
3475 if (keys == NULL) {
3476 return 0;
3477 }
3478 for (i = begin; i < end; i++) {
3479 key = ((keyword_ty) asdl_seq_GET(keywords, i))->arg;
3480 Py_INCREF(key);
3481 PyTuple_SET_ITEM(keys, i - begin, key);
3482 }
3483 ADDOP_N(c, LOAD_CONST, keys, consts);
3484 ADDOP_I(c, BUILD_CONST_KEY_MAP, n);
3485 }
3486 else {
3487 /* a for loop only executes once */
3488 for (i = begin; i < end; i++) {
3489 kw = asdl_seq_GET(keywords, i);
3490 ADDOP_O(c, LOAD_CONST, kw->arg, consts);
3491 VISIT(c, expr, kw->value);
3492 }
3493 ADDOP_I(c, BUILD_MAP, n);
3494 }
3495 return 1;
3496}
3497
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003498/* shared code between compiler_call and compiler_class */
3499static int
3500compiler_call_helper(struct compiler *c,
Victor Stinner976bb402016-03-23 11:36:19 +01003501 int n, /* Args already pushed */
Victor Stinnerad9a0662013-11-19 22:23:20 +01003502 asdl_seq *args,
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003503 asdl_seq *keywords)
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003504{
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003505 Py_ssize_t i, nseen, nelts, nkwelts;
3506 int musttupleunpack = 0, mustdictunpack = 0;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003507
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003508 /* the number of tuples and dictionaries on the stack */
3509 Py_ssize_t nsubargs = 0, nsubkwargs = 0;
3510
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003511 nelts = asdl_seq_LEN(args);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003512 nkwelts = asdl_seq_LEN(keywords);
3513
3514 for (i = 0; i < nkwelts; i++) {
3515 keyword_ty kw = asdl_seq_GET(keywords, i);
3516 if (kw->arg == NULL) {
3517 mustdictunpack = 1;
3518 break;
3519 }
3520 }
3521
3522 nseen = n; /* the number of positional arguments on the stack */
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003523 for (i = 0; i < nelts; i++) {
3524 expr_ty elt = asdl_seq_GET(args, i);
3525 if (elt->kind == Starred_kind) {
3526 /* A star-arg. If we've seen positional arguments,
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003527 pack the positional arguments into a tuple. */
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003528 if (nseen) {
3529 ADDOP_I(c, BUILD_TUPLE, nseen);
3530 nseen = 0;
3531 nsubargs++;
3532 }
3533 VISIT(c, expr, elt->v.Starred.value);
3534 nsubargs++;
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003535 musttupleunpack = 1;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003536 }
3537 else {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003538 VISIT(c, expr, elt);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003539 nseen++;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003540 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003541 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003542
3543 /* Same dance again for keyword arguments */
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003544 if (musttupleunpack || mustdictunpack) {
3545 if (nseen) {
3546 /* Pack up any trailing positional arguments. */
3547 ADDOP_I(c, BUILD_TUPLE, nseen);
3548 nsubargs++;
3549 }
3550 if (musttupleunpack || nsubargs > 1) {
3551 /* If we ended up with more than one stararg, we need
3552 to concatenate them into a single sequence. */
3553 ADDOP_I(c, BUILD_TUPLE_UNPACK, nsubargs);
3554 }
3555 else if (nsubargs == 0) {
3556 ADDOP_I(c, BUILD_TUPLE, 0);
3557 }
3558 nseen = 0; /* the number of keyword arguments on the stack following */
3559 for (i = 0; i < nkwelts; i++) {
3560 keyword_ty kw = asdl_seq_GET(keywords, i);
3561 if (kw->arg == NULL) {
3562 /* A keyword argument unpacking. */
3563 if (nseen) {
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003564 if (!compiler_subkwargs(c, keywords, i - nseen, i))
3565 return 0;
3566 nsubkwargs++;
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003567 nseen = 0;
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003568 }
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003569 VISIT(c, expr, kw->value);
3570 nsubkwargs++;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003571 }
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003572 else {
3573 nseen++;
3574 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003575 }
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003576 if (nseen) {
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003577 /* Pack up any trailing keyword arguments. */
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003578 if (!compiler_subkwargs(c, keywords, nkwelts - nseen, nkwelts))
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003579 return 0;
3580 nsubkwargs++;
3581 }
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003582 if (mustdictunpack || nsubkwargs > 1) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003583 /* Pack it all up */
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003584 ADDOP_I(c, BUILD_MAP_UNPACK_WITH_CALL, nsubkwargs);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003585 }
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003586 ADDOP_I(c, CALL_FUNCTION_EX, nsubkwargs > 0);
3587 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003588 }
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003589 else if (nkwelts) {
3590 PyObject *names;
3591 VISIT_SEQ(c, keyword, keywords);
3592 names = PyTuple_New(nkwelts);
3593 if (names == NULL) {
3594 return 0;
3595 }
3596 for (i = 0; i < nkwelts; i++) {
3597 keyword_ty kw = asdl_seq_GET(keywords, i);
3598 Py_INCREF(kw->arg);
3599 PyTuple_SET_ITEM(names, i, kw->arg);
3600 }
3601 ADDOP_N(c, LOAD_CONST, names, consts);
3602 ADDOP_I(c, CALL_FUNCTION_KW, n + nelts + nkwelts);
3603 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003604 }
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003605 else {
3606 ADDOP_I(c, CALL_FUNCTION, n + nelts);
3607 return 1;
3608 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003609}
3610
Nick Coghlan650f0d02007-04-15 12:05:43 +00003611
3612/* List and set comprehensions and generator expressions work by creating a
3613 nested function to perform the actual iteration. This means that the
3614 iteration variables don't leak into the current scope.
3615 The defined function is called immediately following its definition, with the
3616 result of that call being the result of the expression.
3617 The LC/SC version returns the populated container, while the GE version is
3618 flagged in symtable.c as a generator, so it returns the generator object
3619 when the function is called.
3620 This code *knows* that the loop cannot contain break, continue, or return,
3621 so it cheats and skips the SETUP_LOOP/POP_BLOCK steps used in normal loops.
3622
3623 Possible cleanups:
3624 - iterate over the generator sequence instead of using recursion
3625*/
3626
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07003627
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003628static int
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003629compiler_comprehension_generator(struct compiler *c,
3630 asdl_seq *generators, int gen_index,
3631 expr_ty elt, expr_ty val, int type)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003632{
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07003633 comprehension_ty gen;
3634 gen = (comprehension_ty)asdl_seq_GET(generators, gen_index);
3635 if (gen->is_async) {
3636 return compiler_async_comprehension_generator(
3637 c, generators, gen_index, elt, val, type);
3638 } else {
3639 return compiler_sync_comprehension_generator(
3640 c, generators, gen_index, elt, val, type);
3641 }
3642}
3643
3644static int
3645compiler_sync_comprehension_generator(struct compiler *c,
3646 asdl_seq *generators, int gen_index,
3647 expr_ty elt, expr_ty val, int type)
3648{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003649 /* generate code for the iterator, then each of the ifs,
3650 and then write to the element */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003651
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003652 comprehension_ty gen;
3653 basicblock *start, *anchor, *skip, *if_cleanup;
Victor Stinnerad9a0662013-11-19 22:23:20 +01003654 Py_ssize_t i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003655
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003656 start = compiler_new_block(c);
3657 skip = compiler_new_block(c);
3658 if_cleanup = compiler_new_block(c);
3659 anchor = compiler_new_block(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003660
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003661 if (start == NULL || skip == NULL || if_cleanup == NULL ||
3662 anchor == NULL)
3663 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003664
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003665 gen = (comprehension_ty)asdl_seq_GET(generators, gen_index);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003666
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003667 if (gen_index == 0) {
3668 /* Receive outermost iter as an implicit argument */
3669 c->u->u_argcount = 1;
3670 ADDOP_I(c, LOAD_FAST, 0);
3671 }
3672 else {
3673 /* Sub-iter - calculate on the fly */
3674 VISIT(c, expr, gen->iter);
3675 ADDOP(c, GET_ITER);
3676 }
3677 compiler_use_next_block(c, start);
3678 ADDOP_JREL(c, FOR_ITER, anchor);
3679 NEXT_BLOCK(c);
3680 VISIT(c, expr, gen->target);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003681
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003682 /* XXX this needs to be cleaned up...a lot! */
3683 n = asdl_seq_LEN(gen->ifs);
3684 for (i = 0; i < n; i++) {
3685 expr_ty e = (expr_ty)asdl_seq_GET(gen->ifs, i);
3686 VISIT(c, expr, e);
3687 ADDOP_JABS(c, POP_JUMP_IF_FALSE, if_cleanup);
3688 NEXT_BLOCK(c);
3689 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003690
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003691 if (++gen_index < asdl_seq_LEN(generators))
3692 if (!compiler_comprehension_generator(c,
3693 generators, gen_index,
3694 elt, val, type))
3695 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003696
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003697 /* only append after the last for generator */
3698 if (gen_index >= asdl_seq_LEN(generators)) {
3699 /* comprehension specific code */
3700 switch (type) {
3701 case COMP_GENEXP:
3702 VISIT(c, expr, elt);
3703 ADDOP(c, YIELD_VALUE);
3704 ADDOP(c, POP_TOP);
3705 break;
3706 case COMP_LISTCOMP:
3707 VISIT(c, expr, elt);
3708 ADDOP_I(c, LIST_APPEND, gen_index + 1);
3709 break;
3710 case COMP_SETCOMP:
3711 VISIT(c, expr, elt);
3712 ADDOP_I(c, SET_ADD, gen_index + 1);
3713 break;
3714 case COMP_DICTCOMP:
3715 /* With 'd[k] = v', v is evaluated before k, so we do
3716 the same. */
3717 VISIT(c, expr, val);
3718 VISIT(c, expr, elt);
3719 ADDOP_I(c, MAP_ADD, gen_index + 1);
3720 break;
3721 default:
3722 return 0;
3723 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003724
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003725 compiler_use_next_block(c, skip);
3726 }
3727 compiler_use_next_block(c, if_cleanup);
3728 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
3729 compiler_use_next_block(c, anchor);
3730
3731 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003732}
3733
3734static int
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07003735compiler_async_comprehension_generator(struct compiler *c,
3736 asdl_seq *generators, int gen_index,
3737 expr_ty elt, expr_ty val, int type)
3738{
3739 _Py_IDENTIFIER(StopAsyncIteration);
3740
3741 comprehension_ty gen;
3742 basicblock *anchor, *skip, *if_cleanup, *try,
3743 *after_try, *except, *try_cleanup;
3744 Py_ssize_t i, n;
3745
3746 PyObject *stop_aiter_error = _PyUnicode_FromId(&PyId_StopAsyncIteration);
3747 if (stop_aiter_error == NULL) {
3748 return 0;
3749 }
3750
3751 try = compiler_new_block(c);
3752 after_try = compiler_new_block(c);
3753 try_cleanup = compiler_new_block(c);
3754 except = compiler_new_block(c);
3755 skip = compiler_new_block(c);
3756 if_cleanup = compiler_new_block(c);
3757 anchor = compiler_new_block(c);
3758
3759 if (skip == NULL || if_cleanup == NULL || anchor == NULL ||
3760 try == NULL || after_try == NULL ||
3761 except == NULL || after_try == NULL) {
3762 return 0;
3763 }
3764
3765 gen = (comprehension_ty)asdl_seq_GET(generators, gen_index);
3766
3767 if (gen_index == 0) {
3768 /* Receive outermost iter as an implicit argument */
3769 c->u->u_argcount = 1;
3770 ADDOP_I(c, LOAD_FAST, 0);
3771 }
3772 else {
3773 /* Sub-iter - calculate on the fly */
3774 VISIT(c, expr, gen->iter);
3775 ADDOP(c, GET_AITER);
3776 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3777 ADDOP(c, YIELD_FROM);
3778 }
3779
3780 compiler_use_next_block(c, try);
3781
3782
3783 ADDOP_JREL(c, SETUP_EXCEPT, except);
3784 if (!compiler_push_fblock(c, EXCEPT, try))
3785 return 0;
3786
3787 ADDOP(c, GET_ANEXT);
3788 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3789 ADDOP(c, YIELD_FROM);
3790 VISIT(c, expr, gen->target);
3791 ADDOP(c, POP_BLOCK);
3792 compiler_pop_fblock(c, EXCEPT, try);
3793 ADDOP_JREL(c, JUMP_FORWARD, after_try);
3794
3795
3796 compiler_use_next_block(c, except);
3797 ADDOP(c, DUP_TOP);
3798 ADDOP_O(c, LOAD_GLOBAL, stop_aiter_error, names);
3799 ADDOP_I(c, COMPARE_OP, PyCmp_EXC_MATCH);
3800 ADDOP_JABS(c, POP_JUMP_IF_FALSE, try_cleanup);
3801
3802 ADDOP(c, POP_TOP);
3803 ADDOP(c, POP_TOP);
3804 ADDOP(c, POP_TOP);
3805 ADDOP(c, POP_EXCEPT); /* for SETUP_EXCEPT */
3806 ADDOP_JABS(c, JUMP_ABSOLUTE, anchor);
3807
3808
3809 compiler_use_next_block(c, try_cleanup);
3810 ADDOP(c, END_FINALLY);
3811
3812 compiler_use_next_block(c, after_try);
3813
3814 n = asdl_seq_LEN(gen->ifs);
3815 for (i = 0; i < n; i++) {
3816 expr_ty e = (expr_ty)asdl_seq_GET(gen->ifs, i);
3817 VISIT(c, expr, e);
3818 ADDOP_JABS(c, POP_JUMP_IF_FALSE, if_cleanup);
3819 NEXT_BLOCK(c);
3820 }
3821
3822 if (++gen_index < asdl_seq_LEN(generators))
3823 if (!compiler_comprehension_generator(c,
3824 generators, gen_index,
3825 elt, val, type))
3826 return 0;
3827
3828 /* only append after the last for generator */
3829 if (gen_index >= asdl_seq_LEN(generators)) {
3830 /* comprehension specific code */
3831 switch (type) {
3832 case COMP_GENEXP:
3833 VISIT(c, expr, elt);
3834 ADDOP(c, YIELD_VALUE);
3835 ADDOP(c, POP_TOP);
3836 break;
3837 case COMP_LISTCOMP:
3838 VISIT(c, expr, elt);
3839 ADDOP_I(c, LIST_APPEND, gen_index + 1);
3840 break;
3841 case COMP_SETCOMP:
3842 VISIT(c, expr, elt);
3843 ADDOP_I(c, SET_ADD, gen_index + 1);
3844 break;
3845 case COMP_DICTCOMP:
3846 /* With 'd[k] = v', v is evaluated before k, so we do
3847 the same. */
3848 VISIT(c, expr, val);
3849 VISIT(c, expr, elt);
3850 ADDOP_I(c, MAP_ADD, gen_index + 1);
3851 break;
3852 default:
3853 return 0;
3854 }
3855
3856 compiler_use_next_block(c, skip);
3857 }
3858 compiler_use_next_block(c, if_cleanup);
3859 ADDOP_JABS(c, JUMP_ABSOLUTE, try);
3860 compiler_use_next_block(c, anchor);
3861 ADDOP(c, POP_TOP);
3862
3863 return 1;
3864}
3865
3866static int
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003867compiler_comprehension(struct compiler *c, expr_ty e, int type,
3868 identifier name, asdl_seq *generators, expr_ty elt,
3869 expr_ty val)
Nick Coghlan650f0d02007-04-15 12:05:43 +00003870{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003871 PyCodeObject *co = NULL;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07003872 comprehension_ty outermost;
Antoine Pitrou86a36b52011-11-25 18:56:07 +01003873 PyObject *qualname = NULL;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07003874 int is_async_function = c->u->u_ste->ste_coroutine;
3875 int is_async_generator = 0;
Nick Coghlan650f0d02007-04-15 12:05:43 +00003876
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07003877 outermost = (comprehension_ty) asdl_seq_GET(generators, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00003878
Antoine Pitrou86a36b52011-11-25 18:56:07 +01003879 if (!compiler_enter_scope(c, name, COMPILER_SCOPE_COMPREHENSION,
3880 (void *)e, e->lineno))
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07003881 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003882 goto error;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07003883 }
3884
3885 is_async_generator = c->u->u_ste->ste_coroutine;
3886
3887 if (is_async_generator && !is_async_function) {
3888 if (e->lineno > c->u->u_lineno) {
3889 c->u->u_lineno = e->lineno;
3890 c->u->u_lineno_set = 0;
3891 }
3892 compiler_error(c, "asynchronous comprehension outside of "
3893 "an asynchronous function");
3894 goto error_in_scope;
3895 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00003896
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003897 if (type != COMP_GENEXP) {
3898 int op;
3899 switch (type) {
3900 case COMP_LISTCOMP:
3901 op = BUILD_LIST;
3902 break;
3903 case COMP_SETCOMP:
3904 op = BUILD_SET;
3905 break;
3906 case COMP_DICTCOMP:
3907 op = BUILD_MAP;
3908 break;
3909 default:
3910 PyErr_Format(PyExc_SystemError,
3911 "unknown comprehension type %d", type);
3912 goto error_in_scope;
3913 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00003914
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003915 ADDOP_I(c, op, 0);
3916 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00003917
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003918 if (!compiler_comprehension_generator(c, generators, 0, elt,
3919 val, type))
3920 goto error_in_scope;
Nick Coghlan650f0d02007-04-15 12:05:43 +00003921
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003922 if (type != COMP_GENEXP) {
3923 ADDOP(c, RETURN_VALUE);
3924 }
3925
3926 co = assemble(c, 1);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04003927 qualname = c->u->u_qualname;
3928 Py_INCREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003929 compiler_exit_scope(c);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04003930 if (co == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003931 goto error;
3932
Antoine Pitrou86a36b52011-11-25 18:56:07 +01003933 if (!compiler_make_closure(c, co, 0, qualname))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003934 goto error;
Antoine Pitrou86a36b52011-11-25 18:56:07 +01003935 Py_DECREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003936 Py_DECREF(co);
3937
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07003938 VISIT(c, expr, outermost->iter);
3939
3940 if (outermost->is_async) {
3941 ADDOP(c, GET_AITER);
3942 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3943 ADDOP(c, YIELD_FROM);
3944 } else {
3945 ADDOP(c, GET_ITER);
3946 }
3947
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003948 ADDOP_I(c, CALL_FUNCTION, 1);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07003949
3950 if (is_async_generator && type != COMP_GENEXP) {
3951 ADDOP(c, GET_AWAITABLE);
3952 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3953 ADDOP(c, YIELD_FROM);
3954 }
3955
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003956 return 1;
Nick Coghlan650f0d02007-04-15 12:05:43 +00003957error_in_scope:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003958 compiler_exit_scope(c);
Nick Coghlan650f0d02007-04-15 12:05:43 +00003959error:
Antoine Pitrou86a36b52011-11-25 18:56:07 +01003960 Py_XDECREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003961 Py_XDECREF(co);
3962 return 0;
Nick Coghlan650f0d02007-04-15 12:05:43 +00003963}
3964
3965static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003966compiler_genexp(struct compiler *c, expr_ty e)
3967{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003968 static identifier name;
3969 if (!name) {
3970 name = PyUnicode_FromString("<genexpr>");
3971 if (!name)
3972 return 0;
3973 }
3974 assert(e->kind == GeneratorExp_kind);
3975 return compiler_comprehension(c, e, COMP_GENEXP, name,
3976 e->v.GeneratorExp.generators,
3977 e->v.GeneratorExp.elt, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003978}
3979
3980static int
Nick Coghlan650f0d02007-04-15 12:05:43 +00003981compiler_listcomp(struct compiler *c, expr_ty e)
3982{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003983 static identifier name;
3984 if (!name) {
3985 name = PyUnicode_FromString("<listcomp>");
3986 if (!name)
3987 return 0;
3988 }
3989 assert(e->kind == ListComp_kind);
3990 return compiler_comprehension(c, e, COMP_LISTCOMP, name,
3991 e->v.ListComp.generators,
3992 e->v.ListComp.elt, NULL);
Nick Coghlan650f0d02007-04-15 12:05:43 +00003993}
3994
3995static int
3996compiler_setcomp(struct compiler *c, expr_ty e)
3997{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003998 static identifier name;
3999 if (!name) {
4000 name = PyUnicode_FromString("<setcomp>");
4001 if (!name)
4002 return 0;
4003 }
4004 assert(e->kind == SetComp_kind);
4005 return compiler_comprehension(c, e, COMP_SETCOMP, name,
4006 e->v.SetComp.generators,
4007 e->v.SetComp.elt, NULL);
Guido van Rossum992d4a32007-07-11 13:09:30 +00004008}
4009
4010
4011static int
4012compiler_dictcomp(struct compiler *c, expr_ty e)
4013{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004014 static identifier name;
4015 if (!name) {
4016 name = PyUnicode_FromString("<dictcomp>");
4017 if (!name)
4018 return 0;
4019 }
4020 assert(e->kind == DictComp_kind);
4021 return compiler_comprehension(c, e, COMP_DICTCOMP, name,
4022 e->v.DictComp.generators,
4023 e->v.DictComp.key, e->v.DictComp.value);
Nick Coghlan650f0d02007-04-15 12:05:43 +00004024}
4025
4026
4027static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004028compiler_visit_keyword(struct compiler *c, keyword_ty k)
4029{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004030 VISIT(c, expr, k->value);
4031 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004032}
4033
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004034/* Test whether expression is constant. For constants, report
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004035 whether they are true or false.
4036
4037 Return values: 1 for true, 0 for false, -1 for non-constant.
4038 */
4039
4040static int
Georg Brandl8334fd92010-12-04 10:26:46 +00004041expr_constant(struct compiler *c, expr_ty e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004042{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004043 char *id;
4044 switch (e->kind) {
4045 case Ellipsis_kind:
4046 return 1;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01004047 case Constant_kind:
4048 return PyObject_IsTrue(e->v.Constant.value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004049 case Num_kind:
4050 return PyObject_IsTrue(e->v.Num.n);
4051 case Str_kind:
4052 return PyObject_IsTrue(e->v.Str.s);
4053 case Name_kind:
4054 /* optimize away names that can't be reassigned */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02004055 id = PyUnicode_AsUTF8(e->v.Name.id);
Benjamin Peterson442f2092012-12-06 17:41:04 -05004056 if (id && strcmp(id, "__debug__") == 0)
4057 return !c->c_optimize;
4058 return -1;
4059 case NameConstant_kind: {
4060 PyObject *o = e->v.NameConstant.value;
4061 if (o == Py_None)
4062 return 0;
4063 else if (o == Py_True)
4064 return 1;
4065 else if (o == Py_False)
4066 return 0;
4067 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004068 default:
4069 return -1;
4070 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004071}
4072
Yury Selivanov75445082015-05-11 22:57:16 -04004073
4074/*
4075 Implements the async with statement.
4076
4077 The semantics outlined in that PEP are as follows:
4078
4079 async with EXPR as VAR:
4080 BLOCK
4081
4082 It is implemented roughly as:
4083
4084 context = EXPR
4085 exit = context.__aexit__ # not calling it
4086 value = await context.__aenter__()
4087 try:
4088 VAR = value # if VAR present in the syntax
4089 BLOCK
4090 finally:
4091 if an exception was raised:
Serhiy Storchakaec466a12015-06-11 00:09:32 +03004092 exc = copy of (exception, instance, traceback)
Yury Selivanov75445082015-05-11 22:57:16 -04004093 else:
Serhiy Storchakaec466a12015-06-11 00:09:32 +03004094 exc = (None, None, None)
Yury Selivanov75445082015-05-11 22:57:16 -04004095 if not (await exit(*exc)):
4096 raise
4097 */
4098static int
4099compiler_async_with(struct compiler *c, stmt_ty s, int pos)
4100{
4101 basicblock *block, *finally;
4102 withitem_ty item = asdl_seq_GET(s->v.AsyncWith.items, pos);
4103
4104 assert(s->kind == AsyncWith_kind);
4105
4106 block = compiler_new_block(c);
4107 finally = compiler_new_block(c);
4108 if (!block || !finally)
4109 return 0;
4110
4111 /* Evaluate EXPR */
4112 VISIT(c, expr, item->context_expr);
4113
4114 ADDOP(c, BEFORE_ASYNC_WITH);
4115 ADDOP(c, GET_AWAITABLE);
4116 ADDOP_O(c, LOAD_CONST, Py_None, consts);
4117 ADDOP(c, YIELD_FROM);
4118
4119 ADDOP_JREL(c, SETUP_ASYNC_WITH, finally);
4120
4121 /* SETUP_ASYNC_WITH pushes a finally block. */
4122 compiler_use_next_block(c, block);
4123 if (!compiler_push_fblock(c, FINALLY_TRY, block)) {
4124 return 0;
4125 }
4126
4127 if (item->optional_vars) {
4128 VISIT(c, expr, item->optional_vars);
4129 }
4130 else {
4131 /* Discard result from context.__aenter__() */
4132 ADDOP(c, POP_TOP);
4133 }
4134
4135 pos++;
4136 if (pos == asdl_seq_LEN(s->v.AsyncWith.items))
4137 /* BLOCK code */
4138 VISIT_SEQ(c, stmt, s->v.AsyncWith.body)
4139 else if (!compiler_async_with(c, s, pos))
4140 return 0;
4141
4142 /* End of try block; start the finally block */
4143 ADDOP(c, POP_BLOCK);
4144 compiler_pop_fblock(c, FINALLY_TRY, block);
4145
4146 ADDOP_O(c, LOAD_CONST, Py_None, consts);
4147 compiler_use_next_block(c, finally);
4148 if (!compiler_push_fblock(c, FINALLY_END, finally))
4149 return 0;
4150
4151 /* Finally block starts; context.__exit__ is on the stack under
4152 the exception or return information. Just issue our magic
4153 opcode. */
4154 ADDOP(c, WITH_CLEANUP_START);
4155
4156 ADDOP(c, GET_AWAITABLE);
4157 ADDOP_O(c, LOAD_CONST, Py_None, consts);
4158 ADDOP(c, YIELD_FROM);
4159
4160 ADDOP(c, WITH_CLEANUP_FINISH);
4161
4162 /* Finally block ends. */
4163 ADDOP(c, END_FINALLY);
4164 compiler_pop_fblock(c, FINALLY_END, finally);
4165 return 1;
4166}
4167
4168
Guido van Rossumc2e20742006-02-27 22:32:47 +00004169/*
4170 Implements the with statement from PEP 343.
4171
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004172 The semantics outlined in that PEP are as follows:
Guido van Rossumc2e20742006-02-27 22:32:47 +00004173
4174 with EXPR as VAR:
4175 BLOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004176
Guido van Rossumc2e20742006-02-27 22:32:47 +00004177 It is implemented roughly as:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004178
Thomas Wouters477c8d52006-05-27 19:21:47 +00004179 context = EXPR
Guido van Rossumc2e20742006-02-27 22:32:47 +00004180 exit = context.__exit__ # not calling it
4181 value = context.__enter__()
4182 try:
4183 VAR = value # if VAR present in the syntax
4184 BLOCK
4185 finally:
4186 if an exception was raised:
Serhiy Storchakad741a882015-06-11 00:06:39 +03004187 exc = copy of (exception, instance, traceback)
Guido van Rossumc2e20742006-02-27 22:32:47 +00004188 else:
Serhiy Storchakad741a882015-06-11 00:06:39 +03004189 exc = (None, None, None)
Guido van Rossumc2e20742006-02-27 22:32:47 +00004190 exit(*exc)
4191 */
4192static int
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004193compiler_with(struct compiler *c, stmt_ty s, int pos)
Guido van Rossumc2e20742006-02-27 22:32:47 +00004194{
Guido van Rossumc2e20742006-02-27 22:32:47 +00004195 basicblock *block, *finally;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004196 withitem_ty item = asdl_seq_GET(s->v.With.items, pos);
Guido van Rossumc2e20742006-02-27 22:32:47 +00004197
4198 assert(s->kind == With_kind);
4199
Guido van Rossumc2e20742006-02-27 22:32:47 +00004200 block = compiler_new_block(c);
4201 finally = compiler_new_block(c);
4202 if (!block || !finally)
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00004203 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00004204
Thomas Wouters477c8d52006-05-27 19:21:47 +00004205 /* Evaluate EXPR */
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004206 VISIT(c, expr, item->context_expr);
Benjamin Peterson876b2f22009-06-28 03:18:59 +00004207 ADDOP_JREL(c, SETUP_WITH, finally);
Guido van Rossumc2e20742006-02-27 22:32:47 +00004208
Benjamin Peterson876b2f22009-06-28 03:18:59 +00004209 /* SETUP_WITH pushes a finally block. */
Guido van Rossumc2e20742006-02-27 22:32:47 +00004210 compiler_use_next_block(c, block);
4211 if (!compiler_push_fblock(c, FINALLY_TRY, block)) {
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00004212 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00004213 }
4214
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004215 if (item->optional_vars) {
4216 VISIT(c, expr, item->optional_vars);
Benjamin Peterson876b2f22009-06-28 03:18:59 +00004217 }
4218 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004219 /* Discard result from context.__enter__() */
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00004220 ADDOP(c, POP_TOP);
Guido van Rossumc2e20742006-02-27 22:32:47 +00004221 }
4222
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004223 pos++;
4224 if (pos == asdl_seq_LEN(s->v.With.items))
4225 /* BLOCK code */
4226 VISIT_SEQ(c, stmt, s->v.With.body)
4227 else if (!compiler_with(c, s, pos))
4228 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00004229
4230 /* End of try block; start the finally block */
4231 ADDOP(c, POP_BLOCK);
4232 compiler_pop_fblock(c, FINALLY_TRY, block);
4233
4234 ADDOP_O(c, LOAD_CONST, Py_None, consts);
4235 compiler_use_next_block(c, finally);
4236 if (!compiler_push_fblock(c, FINALLY_END, finally))
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00004237 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00004238
Christian Heimesdd15f6c2008-03-16 00:07:10 +00004239 /* Finally block starts; context.__exit__ is on the stack under
4240 the exception or return information. Just issue our magic
4241 opcode. */
Yury Selivanov75445082015-05-11 22:57:16 -04004242 ADDOP(c, WITH_CLEANUP_START);
4243 ADDOP(c, WITH_CLEANUP_FINISH);
Guido van Rossumc2e20742006-02-27 22:32:47 +00004244
4245 /* Finally block ends. */
4246 ADDOP(c, END_FINALLY);
4247 compiler_pop_fblock(c, FINALLY_END, finally);
4248 return 1;
4249}
4250
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004251static int
4252compiler_visit_expr(struct compiler *c, expr_ty e)
4253{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004254 /* If expr e has a different line number than the last expr/stmt,
4255 set a new line number for the next instruction.
4256 */
4257 if (e->lineno > c->u->u_lineno) {
4258 c->u->u_lineno = e->lineno;
4259 c->u->u_lineno_set = 0;
4260 }
Benjamin Petersond4efd9e2010-09-20 23:02:10 +00004261 /* Updating the column offset is always harmless. */
4262 c->u->u_col_offset = e->col_offset;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004263 switch (e->kind) {
4264 case BoolOp_kind:
4265 return compiler_boolop(c, e);
4266 case BinOp_kind:
4267 VISIT(c, expr, e->v.BinOp.left);
4268 VISIT(c, expr, e->v.BinOp.right);
4269 ADDOP(c, binop(c, e->v.BinOp.op));
4270 break;
4271 case UnaryOp_kind:
4272 VISIT(c, expr, e->v.UnaryOp.operand);
4273 ADDOP(c, unaryop(e->v.UnaryOp.op));
4274 break;
4275 case Lambda_kind:
4276 return compiler_lambda(c, e);
4277 case IfExp_kind:
4278 return compiler_ifexp(c, e);
4279 case Dict_kind:
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004280 return compiler_dict(c, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004281 case Set_kind:
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004282 return compiler_set(c, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004283 case GeneratorExp_kind:
4284 return compiler_genexp(c, e);
4285 case ListComp_kind:
4286 return compiler_listcomp(c, e);
4287 case SetComp_kind:
4288 return compiler_setcomp(c, e);
4289 case DictComp_kind:
4290 return compiler_dictcomp(c, e);
4291 case Yield_kind:
4292 if (c->u->u_ste->ste_type != FunctionBlock)
4293 return compiler_error(c, "'yield' outside function");
Mark Dickinsonded35ae2012-11-25 14:36:26 +00004294 if (e->v.Yield.value) {
4295 VISIT(c, expr, e->v.Yield.value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004296 }
4297 else {
4298 ADDOP_O(c, LOAD_CONST, Py_None, consts);
4299 }
Mark Dickinsonded35ae2012-11-25 14:36:26 +00004300 ADDOP(c, YIELD_VALUE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004301 break;
Mark Dickinsonded35ae2012-11-25 14:36:26 +00004302 case YieldFrom_kind:
4303 if (c->u->u_ste->ste_type != FunctionBlock)
4304 return compiler_error(c, "'yield' outside function");
Yury Selivanov75445082015-05-11 22:57:16 -04004305
4306 if (c->u->u_scope_type == COMPILER_SCOPE_ASYNC_FUNCTION)
4307 return compiler_error(c, "'yield from' inside async function");
4308
Mark Dickinsonded35ae2012-11-25 14:36:26 +00004309 VISIT(c, expr, e->v.YieldFrom.value);
Yury Selivanov5376ba92015-06-22 12:19:30 -04004310 ADDOP(c, GET_YIELD_FROM_ITER);
Mark Dickinsonded35ae2012-11-25 14:36:26 +00004311 ADDOP_O(c, LOAD_CONST, Py_None, consts);
4312 ADDOP(c, YIELD_FROM);
4313 break;
Yury Selivanov75445082015-05-11 22:57:16 -04004314 case Await_kind:
4315 if (c->u->u_ste->ste_type != FunctionBlock)
4316 return compiler_error(c, "'await' outside function");
4317
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004318 if (c->u->u_scope_type != COMPILER_SCOPE_ASYNC_FUNCTION &&
4319 c->u->u_scope_type != COMPILER_SCOPE_COMPREHENSION)
Yury Selivanov75445082015-05-11 22:57:16 -04004320 return compiler_error(c, "'await' outside async function");
4321
4322 VISIT(c, expr, e->v.Await.value);
4323 ADDOP(c, GET_AWAITABLE);
4324 ADDOP_O(c, LOAD_CONST, Py_None, consts);
4325 ADDOP(c, YIELD_FROM);
4326 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004327 case Compare_kind:
4328 return compiler_compare(c, e);
4329 case Call_kind:
4330 return compiler_call(c, e);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01004331 case Constant_kind:
4332 ADDOP_O(c, LOAD_CONST, e->v.Constant.value, consts);
4333 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004334 case Num_kind:
4335 ADDOP_O(c, LOAD_CONST, e->v.Num.n, consts);
4336 break;
4337 case Str_kind:
4338 ADDOP_O(c, LOAD_CONST, e->v.Str.s, consts);
4339 break;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004340 case JoinedStr_kind:
4341 return compiler_joined_str(c, e);
4342 case FormattedValue_kind:
4343 return compiler_formatted_value(c, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004344 case Bytes_kind:
4345 ADDOP_O(c, LOAD_CONST, e->v.Bytes.s, consts);
4346 break;
4347 case Ellipsis_kind:
4348 ADDOP_O(c, LOAD_CONST, Py_Ellipsis, consts);
4349 break;
Benjamin Peterson442f2092012-12-06 17:41:04 -05004350 case NameConstant_kind:
4351 ADDOP_O(c, LOAD_CONST, e->v.NameConstant.value, consts);
4352 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004353 /* The following exprs can be assignment targets. */
4354 case Attribute_kind:
4355 if (e->v.Attribute.ctx != AugStore)
4356 VISIT(c, expr, e->v.Attribute.value);
4357 switch (e->v.Attribute.ctx) {
4358 case AugLoad:
4359 ADDOP(c, DUP_TOP);
4360 /* Fall through to load */
4361 case Load:
4362 ADDOP_NAME(c, LOAD_ATTR, e->v.Attribute.attr, names);
4363 break;
4364 case AugStore:
4365 ADDOP(c, ROT_TWO);
4366 /* Fall through to save */
4367 case Store:
4368 ADDOP_NAME(c, STORE_ATTR, e->v.Attribute.attr, names);
4369 break;
4370 case Del:
4371 ADDOP_NAME(c, DELETE_ATTR, e->v.Attribute.attr, names);
4372 break;
4373 case Param:
4374 default:
4375 PyErr_SetString(PyExc_SystemError,
4376 "param invalid in attribute expression");
4377 return 0;
4378 }
4379 break;
4380 case Subscript_kind:
4381 switch (e->v.Subscript.ctx) {
4382 case AugLoad:
4383 VISIT(c, expr, e->v.Subscript.value);
4384 VISIT_SLICE(c, e->v.Subscript.slice, AugLoad);
4385 break;
4386 case Load:
4387 VISIT(c, expr, e->v.Subscript.value);
4388 VISIT_SLICE(c, e->v.Subscript.slice, Load);
4389 break;
4390 case AugStore:
4391 VISIT_SLICE(c, e->v.Subscript.slice, AugStore);
4392 break;
4393 case Store:
4394 VISIT(c, expr, e->v.Subscript.value);
4395 VISIT_SLICE(c, e->v.Subscript.slice, Store);
4396 break;
4397 case Del:
4398 VISIT(c, expr, e->v.Subscript.value);
4399 VISIT_SLICE(c, e->v.Subscript.slice, Del);
4400 break;
4401 case Param:
4402 default:
4403 PyErr_SetString(PyExc_SystemError,
4404 "param invalid in subscript expression");
4405 return 0;
4406 }
4407 break;
4408 case Starred_kind:
4409 switch (e->v.Starred.ctx) {
4410 case Store:
4411 /* In all legitimate cases, the Starred node was already replaced
4412 * by compiler_list/compiler_tuple. XXX: is that okay? */
4413 return compiler_error(c,
4414 "starred assignment target must be in a list or tuple");
4415 default:
4416 return compiler_error(c,
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004417 "can't use starred expression here");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004418 }
4419 break;
4420 case Name_kind:
4421 return compiler_nameop(c, e->v.Name.id, e->v.Name.ctx);
4422 /* child nodes of List and Tuple will have expr_context set */
4423 case List_kind:
4424 return compiler_list(c, e);
4425 case Tuple_kind:
4426 return compiler_tuple(c, e);
4427 }
4428 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004429}
4430
4431static int
4432compiler_augassign(struct compiler *c, stmt_ty s)
4433{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004434 expr_ty e = s->v.AugAssign.target;
4435 expr_ty auge;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004436
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004437 assert(s->kind == AugAssign_kind);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004438
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004439 switch (e->kind) {
4440 case Attribute_kind:
4441 auge = Attribute(e->v.Attribute.value, e->v.Attribute.attr,
4442 AugLoad, e->lineno, e->col_offset, c->c_arena);
4443 if (auge == NULL)
4444 return 0;
4445 VISIT(c, expr, auge);
4446 VISIT(c, expr, s->v.AugAssign.value);
4447 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
4448 auge->v.Attribute.ctx = AugStore;
4449 VISIT(c, expr, auge);
4450 break;
4451 case Subscript_kind:
4452 auge = Subscript(e->v.Subscript.value, e->v.Subscript.slice,
4453 AugLoad, e->lineno, e->col_offset, c->c_arena);
4454 if (auge == NULL)
4455 return 0;
4456 VISIT(c, expr, auge);
4457 VISIT(c, expr, s->v.AugAssign.value);
4458 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
4459 auge->v.Subscript.ctx = AugStore;
4460 VISIT(c, expr, auge);
4461 break;
4462 case Name_kind:
4463 if (!compiler_nameop(c, e->v.Name.id, Load))
4464 return 0;
4465 VISIT(c, expr, s->v.AugAssign.value);
4466 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
4467 return compiler_nameop(c, e->v.Name.id, Store);
4468 default:
4469 PyErr_Format(PyExc_SystemError,
4470 "invalid node type (%d) for augmented assignment",
4471 e->kind);
4472 return 0;
4473 }
4474 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004475}
4476
4477static int
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004478check_ann_expr(struct compiler *c, expr_ty e)
4479{
4480 VISIT(c, expr, e);
4481 ADDOP(c, POP_TOP);
4482 return 1;
4483}
4484
4485static int
4486check_annotation(struct compiler *c, stmt_ty s)
4487{
4488 /* Annotations are only evaluated in a module or class. */
4489 if (c->u->u_scope_type == COMPILER_SCOPE_MODULE ||
4490 c->u->u_scope_type == COMPILER_SCOPE_CLASS) {
4491 return check_ann_expr(c, s->v.AnnAssign.annotation);
4492 }
4493 return 1;
4494}
4495
4496static int
4497check_ann_slice(struct compiler *c, slice_ty sl)
4498{
4499 switch(sl->kind) {
4500 case Index_kind:
4501 return check_ann_expr(c, sl->v.Index.value);
4502 case Slice_kind:
4503 if (sl->v.Slice.lower && !check_ann_expr(c, sl->v.Slice.lower)) {
4504 return 0;
4505 }
4506 if (sl->v.Slice.upper && !check_ann_expr(c, sl->v.Slice.upper)) {
4507 return 0;
4508 }
4509 if (sl->v.Slice.step && !check_ann_expr(c, sl->v.Slice.step)) {
4510 return 0;
4511 }
4512 break;
4513 default:
4514 PyErr_SetString(PyExc_SystemError,
4515 "unexpected slice kind");
4516 return 0;
4517 }
4518 return 1;
4519}
4520
4521static int
4522check_ann_subscr(struct compiler *c, slice_ty sl)
4523{
4524 /* We check that everything in a subscript is defined at runtime. */
4525 Py_ssize_t i, n;
4526
4527 switch (sl->kind) {
4528 case Index_kind:
4529 case Slice_kind:
4530 if (!check_ann_slice(c, sl)) {
4531 return 0;
4532 }
4533 break;
4534 case ExtSlice_kind:
4535 n = asdl_seq_LEN(sl->v.ExtSlice.dims);
4536 for (i = 0; i < n; i++) {
4537 slice_ty subsl = (slice_ty)asdl_seq_GET(sl->v.ExtSlice.dims, i);
4538 switch (subsl->kind) {
4539 case Index_kind:
4540 case Slice_kind:
4541 if (!check_ann_slice(c, subsl)) {
4542 return 0;
4543 }
4544 break;
4545 case ExtSlice_kind:
4546 default:
4547 PyErr_SetString(PyExc_SystemError,
4548 "extended slice invalid in nested slice");
4549 return 0;
4550 }
4551 }
4552 break;
4553 default:
4554 PyErr_Format(PyExc_SystemError,
4555 "invalid subscript kind %d", sl->kind);
4556 return 0;
4557 }
4558 return 1;
4559}
4560
4561static int
4562compiler_annassign(struct compiler *c, stmt_ty s)
4563{
4564 expr_ty targ = s->v.AnnAssign.target;
Guido van Rossum015d8742016-09-11 09:45:24 -07004565 PyObject* mangled;
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004566
4567 assert(s->kind == AnnAssign_kind);
4568
4569 /* We perform the actual assignment first. */
4570 if (s->v.AnnAssign.value) {
4571 VISIT(c, expr, s->v.AnnAssign.value);
4572 VISIT(c, expr, targ);
4573 }
4574 switch (targ->kind) {
4575 case Name_kind:
4576 /* If we have a simple name in a module or class, store annotation. */
4577 if (s->v.AnnAssign.simple &&
4578 (c->u->u_scope_type == COMPILER_SCOPE_MODULE ||
4579 c->u->u_scope_type == COMPILER_SCOPE_CLASS)) {
Guido van Rossum015d8742016-09-11 09:45:24 -07004580 mangled = _Py_Mangle(c->u->u_private, targ->v.Name.id);
4581 if (!mangled) {
4582 return 0;
4583 }
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004584 VISIT(c, expr, s->v.AnnAssign.annotation);
Guido van Rossum015d8742016-09-11 09:45:24 -07004585 /* ADDOP_N decrefs its argument */
4586 ADDOP_N(c, STORE_ANNOTATION, mangled, names);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004587 }
4588 break;
4589 case Attribute_kind:
4590 if (!s->v.AnnAssign.value &&
4591 !check_ann_expr(c, targ->v.Attribute.value)) {
4592 return 0;
4593 }
4594 break;
4595 case Subscript_kind:
4596 if (!s->v.AnnAssign.value &&
4597 (!check_ann_expr(c, targ->v.Subscript.value) ||
4598 !check_ann_subscr(c, targ->v.Subscript.slice))) {
4599 return 0;
4600 }
4601 break;
4602 default:
4603 PyErr_Format(PyExc_SystemError,
4604 "invalid node type (%d) for annotated assignment",
4605 targ->kind);
4606 return 0;
4607 }
4608 /* Annotation is evaluated last. */
4609 if (!s->v.AnnAssign.simple && !check_annotation(c, s)) {
4610 return 0;
4611 }
4612 return 1;
4613}
4614
4615static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004616compiler_push_fblock(struct compiler *c, enum fblocktype t, basicblock *b)
4617{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004618 struct fblockinfo *f;
4619 if (c->u->u_nfblocks >= CO_MAXBLOCKS) {
Benjamin Petersone09ed542016-07-14 22:00:03 -07004620 PyErr_SetString(PyExc_SyntaxError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004621 "too many statically nested blocks");
4622 return 0;
4623 }
4624 f = &c->u->u_fblock[c->u->u_nfblocks++];
4625 f->fb_type = t;
4626 f->fb_block = b;
4627 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004628}
4629
4630static void
4631compiler_pop_fblock(struct compiler *c, enum fblocktype t, basicblock *b)
4632{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004633 struct compiler_unit *u = c->u;
4634 assert(u->u_nfblocks > 0);
4635 u->u_nfblocks--;
4636 assert(u->u_fblock[u->u_nfblocks].fb_type == t);
4637 assert(u->u_fblock[u->u_nfblocks].fb_block == b);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004638}
4639
Thomas Wouters89f507f2006-12-13 04:49:30 +00004640static int
4641compiler_in_loop(struct compiler *c) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004642 int i;
4643 struct compiler_unit *u = c->u;
4644 for (i = 0; i < u->u_nfblocks; ++i) {
4645 if (u->u_fblock[i].fb_type == LOOP)
4646 return 1;
4647 }
4648 return 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00004649}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004650/* Raises a SyntaxError and returns 0.
4651 If something goes wrong, a different exception may be raised.
4652*/
4653
4654static int
4655compiler_error(struct compiler *c, const char *errstr)
4656{
Benjamin Peterson43b06862011-05-27 09:08:01 -05004657 PyObject *loc;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004658 PyObject *u = NULL, *v = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004659
Victor Stinner14e461d2013-08-26 22:28:21 +02004660 loc = PyErr_ProgramTextObject(c->c_filename, c->u->u_lineno);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004661 if (!loc) {
4662 Py_INCREF(Py_None);
4663 loc = Py_None;
4664 }
Victor Stinner14e461d2013-08-26 22:28:21 +02004665 u = Py_BuildValue("(OiiO)", c->c_filename, c->u->u_lineno,
Benjamin Petersond4efd9e2010-09-20 23:02:10 +00004666 c->u->u_col_offset, loc);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004667 if (!u)
4668 goto exit;
4669 v = Py_BuildValue("(zO)", errstr, u);
4670 if (!v)
4671 goto exit;
4672 PyErr_SetObject(PyExc_SyntaxError, v);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004673 exit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004674 Py_DECREF(loc);
4675 Py_XDECREF(u);
4676 Py_XDECREF(v);
4677 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004678}
4679
4680static int
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004681compiler_handle_subscr(struct compiler *c, const char *kind,
4682 expr_context_ty ctx)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004683{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004684 int op = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004685
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004686 /* XXX this code is duplicated */
4687 switch (ctx) {
4688 case AugLoad: /* fall through to Load */
4689 case Load: op = BINARY_SUBSCR; break;
4690 case AugStore:/* fall through to Store */
4691 case Store: op = STORE_SUBSCR; break;
4692 case Del: op = DELETE_SUBSCR; break;
4693 case Param:
4694 PyErr_Format(PyExc_SystemError,
4695 "invalid %s kind %d in subscript\n",
4696 kind, ctx);
4697 return 0;
4698 }
4699 if (ctx == AugLoad) {
Antoine Pitrou74a69fa2010-09-04 18:43:52 +00004700 ADDOP(c, DUP_TOP_TWO);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004701 }
4702 else if (ctx == AugStore) {
4703 ADDOP(c, ROT_THREE);
4704 }
4705 ADDOP(c, op);
4706 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004707}
4708
4709static int
4710compiler_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)
4711{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004712 int n = 2;
4713 assert(s->kind == Slice_kind);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004714
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004715 /* only handles the cases where BUILD_SLICE is emitted */
4716 if (s->v.Slice.lower) {
4717 VISIT(c, expr, s->v.Slice.lower);
4718 }
4719 else {
4720 ADDOP_O(c, LOAD_CONST, Py_None, consts);
4721 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004722
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004723 if (s->v.Slice.upper) {
4724 VISIT(c, expr, s->v.Slice.upper);
4725 }
4726 else {
4727 ADDOP_O(c, LOAD_CONST, Py_None, consts);
4728 }
4729
4730 if (s->v.Slice.step) {
4731 n++;
4732 VISIT(c, expr, s->v.Slice.step);
4733 }
4734 ADDOP_I(c, BUILD_SLICE, n);
4735 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004736}
4737
4738static int
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004739compiler_visit_nested_slice(struct compiler *c, slice_ty s,
4740 expr_context_ty ctx)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004741{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004742 switch (s->kind) {
4743 case Slice_kind:
4744 return compiler_slice(c, s, ctx);
4745 case Index_kind:
4746 VISIT(c, expr, s->v.Index.value);
4747 break;
4748 case ExtSlice_kind:
4749 default:
4750 PyErr_SetString(PyExc_SystemError,
4751 "extended slice invalid in nested slice");
4752 return 0;
4753 }
4754 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004755}
4756
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004757static int
4758compiler_visit_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)
4759{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004760 char * kindname = NULL;
4761 switch (s->kind) {
4762 case Index_kind:
4763 kindname = "index";
4764 if (ctx != AugStore) {
4765 VISIT(c, expr, s->v.Index.value);
4766 }
4767 break;
4768 case Slice_kind:
4769 kindname = "slice";
4770 if (ctx != AugStore) {
4771 if (!compiler_slice(c, s, ctx))
4772 return 0;
4773 }
4774 break;
4775 case ExtSlice_kind:
4776 kindname = "extended slice";
4777 if (ctx != AugStore) {
Victor Stinnerad9a0662013-11-19 22:23:20 +01004778 Py_ssize_t i, n = asdl_seq_LEN(s->v.ExtSlice.dims);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004779 for (i = 0; i < n; i++) {
4780 slice_ty sub = (slice_ty)asdl_seq_GET(
4781 s->v.ExtSlice.dims, i);
4782 if (!compiler_visit_nested_slice(c, sub, ctx))
4783 return 0;
4784 }
4785 ADDOP_I(c, BUILD_TUPLE, n);
4786 }
4787 break;
4788 default:
4789 PyErr_Format(PyExc_SystemError,
4790 "invalid subscript kind %d", s->kind);
4791 return 0;
4792 }
4793 return compiler_handle_subscr(c, kindname, ctx);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004794}
4795
Thomas Wouters89f507f2006-12-13 04:49:30 +00004796/* End of the compiler section, beginning of the assembler section */
4797
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004798/* do depth-first search of basic block graph, starting with block.
4799 post records the block indices in post-order.
4800
4801 XXX must handle implicit jumps from one block to next
4802*/
4803
Thomas Wouters89f507f2006-12-13 04:49:30 +00004804struct assembler {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004805 PyObject *a_bytecode; /* string containing bytecode */
4806 int a_offset; /* offset into bytecode */
4807 int a_nblocks; /* number of reachable blocks */
4808 basicblock **a_postorder; /* list of blocks in dfs postorder */
4809 PyObject *a_lnotab; /* string containing lnotab */
4810 int a_lnotab_off; /* offset into lnotab */
4811 int a_lineno; /* last lineno of emitted instruction */
4812 int a_lineno_off; /* bytecode offset of last lineno */
Thomas Wouters89f507f2006-12-13 04:49:30 +00004813};
4814
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004815static void
4816dfs(struct compiler *c, basicblock *b, struct assembler *a)
4817{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004818 int i;
4819 struct instr *instr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004820
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004821 if (b->b_seen)
4822 return;
4823 b->b_seen = 1;
4824 if (b->b_next != NULL)
4825 dfs(c, b->b_next, a);
4826 for (i = 0; i < b->b_iused; i++) {
4827 instr = &b->b_instr[i];
4828 if (instr->i_jrel || instr->i_jabs)
4829 dfs(c, instr->i_target, a);
4830 }
4831 a->a_postorder[a->a_nblocks++] = b;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004832}
4833
Neal Norwitz2744c6c2005-11-13 01:08:38 +00004834static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004835stackdepth_walk(struct compiler *c, basicblock *b, int depth, int maxdepth)
4836{
Larry Hastings3a907972013-11-23 14:49:22 -08004837 int i, target_depth, effect;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004838 struct instr *instr;
4839 if (b->b_seen || b->b_startdepth >= depth)
4840 return maxdepth;
4841 b->b_seen = 1;
4842 b->b_startdepth = depth;
4843 for (i = 0; i < b->b_iused; i++) {
4844 instr = &b->b_instr[i];
Larry Hastings3a907972013-11-23 14:49:22 -08004845 effect = PyCompile_OpcodeStackEffect(instr->i_opcode, instr->i_oparg);
4846 if (effect == PY_INVALID_STACK_EFFECT) {
4847 fprintf(stderr, "opcode = %d\n", instr->i_opcode);
4848 Py_FatalError("PyCompile_OpcodeStackEffect()");
4849 }
4850 depth += effect;
4851
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004852 if (depth > maxdepth)
4853 maxdepth = depth;
4854 assert(depth >= 0); /* invalid code or bug in stackdepth() */
4855 if (instr->i_jrel || instr->i_jabs) {
4856 target_depth = depth;
4857 if (instr->i_opcode == FOR_ITER) {
4858 target_depth = depth-2;
Antoine Pitrou99614052014-05-23 11:46:03 +02004859 }
4860 else if (instr->i_opcode == SETUP_FINALLY ||
4861 instr->i_opcode == SETUP_EXCEPT) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004862 target_depth = depth+3;
4863 if (target_depth > maxdepth)
4864 maxdepth = target_depth;
4865 }
Antoine Pitrou99614052014-05-23 11:46:03 +02004866 else if (instr->i_opcode == JUMP_IF_TRUE_OR_POP ||
4867 instr->i_opcode == JUMP_IF_FALSE_OR_POP)
4868 depth = depth - 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004869 maxdepth = stackdepth_walk(c, instr->i_target,
4870 target_depth, maxdepth);
4871 if (instr->i_opcode == JUMP_ABSOLUTE ||
4872 instr->i_opcode == JUMP_FORWARD) {
4873 goto out; /* remaining code is dead */
4874 }
4875 }
4876 }
4877 if (b->b_next)
4878 maxdepth = stackdepth_walk(c, b->b_next, depth, maxdepth);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004879out:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004880 b->b_seen = 0;
4881 return maxdepth;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004882}
4883
4884/* Find the flow path that needs the largest stack. We assume that
4885 * cycles in the flow graph have no net effect on the stack depth.
4886 */
4887static int
4888stackdepth(struct compiler *c)
4889{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004890 basicblock *b, *entryblock;
4891 entryblock = NULL;
4892 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
4893 b->b_seen = 0;
4894 b->b_startdepth = INT_MIN;
4895 entryblock = b;
4896 }
4897 if (!entryblock)
4898 return 0;
4899 return stackdepth_walk(c, entryblock, 0, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004900}
4901
4902static int
4903assemble_init(struct assembler *a, int nblocks, int firstlineno)
4904{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004905 memset(a, 0, sizeof(struct assembler));
4906 a->a_lineno = firstlineno;
4907 a->a_bytecode = PyBytes_FromStringAndSize(NULL, DEFAULT_CODE_SIZE);
4908 if (!a->a_bytecode)
4909 return 0;
4910 a->a_lnotab = PyBytes_FromStringAndSize(NULL, DEFAULT_LNOTAB_SIZE);
4911 if (!a->a_lnotab)
4912 return 0;
Benjamin Peterson2f8bfef2016-09-07 09:26:18 -07004913 if ((size_t)nblocks > SIZE_MAX / sizeof(basicblock *)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004914 PyErr_NoMemory();
4915 return 0;
4916 }
4917 a->a_postorder = (basicblock **)PyObject_Malloc(
4918 sizeof(basicblock *) * nblocks);
4919 if (!a->a_postorder) {
4920 PyErr_NoMemory();
4921 return 0;
4922 }
4923 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004924}
4925
4926static void
4927assemble_free(struct assembler *a)
4928{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004929 Py_XDECREF(a->a_bytecode);
4930 Py_XDECREF(a->a_lnotab);
4931 if (a->a_postorder)
4932 PyObject_Free(a->a_postorder);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004933}
4934
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004935static int
4936blocksize(basicblock *b)
4937{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004938 int i;
4939 int size = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004940
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004941 for (i = 0; i < b->b_iused; i++)
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03004942 size += instrsize(b->b_instr[i].i_oparg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004943 return size;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004944}
4945
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00004946/* Appends a pair to the end of the line number table, a_lnotab, representing
4947 the instruction's bytecode offset and line number. See
4948 Objects/lnotab_notes.txt for the description of the line number table. */
Tim Peters2a7f3842001-06-09 09:26:21 +00004949
Guido van Rossumf68d8e52001-04-14 17:55:09 +00004950static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004951assemble_lnotab(struct assembler *a, struct instr *i)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004952{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004953 int d_bytecode, d_lineno;
Victor Stinnerad9a0662013-11-19 22:23:20 +01004954 Py_ssize_t len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004955 unsigned char *lnotab;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004956
Serhiy Storchakaab874002016-09-11 13:48:15 +03004957 d_bytecode = (a->a_offset - a->a_lineno_off) * sizeof(_Py_CODEUNIT);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004958 d_lineno = i->i_lineno - a->a_lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004959
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004960 assert(d_bytecode >= 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004961
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004962 if(d_bytecode == 0 && d_lineno == 0)
4963 return 1;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004964
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004965 if (d_bytecode > 255) {
4966 int j, nbytes, ncodes = d_bytecode / 255;
4967 nbytes = a->a_lnotab_off + 2 * ncodes;
4968 len = PyBytes_GET_SIZE(a->a_lnotab);
4969 if (nbytes >= len) {
4970 if ((len <= INT_MAX / 2) && (len * 2 < nbytes))
4971 len = nbytes;
4972 else if (len <= INT_MAX / 2)
4973 len *= 2;
4974 else {
4975 PyErr_NoMemory();
4976 return 0;
4977 }
4978 if (_PyBytes_Resize(&a->a_lnotab, len) < 0)
4979 return 0;
4980 }
4981 lnotab = (unsigned char *)
4982 PyBytes_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
4983 for (j = 0; j < ncodes; j++) {
4984 *lnotab++ = 255;
4985 *lnotab++ = 0;
4986 }
4987 d_bytecode -= ncodes * 255;
4988 a->a_lnotab_off += ncodes * 2;
4989 }
Victor Stinnerf3914eb2016-01-20 12:16:21 +01004990 assert(0 <= d_bytecode && d_bytecode <= 255);
4991
4992 if (d_lineno < -128 || 127 < d_lineno) {
4993 int j, nbytes, ncodes, k;
4994 if (d_lineno < 0) {
4995 k = -128;
4996 /* use division on positive numbers */
4997 ncodes = (-d_lineno) / 128;
4998 }
4999 else {
5000 k = 127;
5001 ncodes = d_lineno / 127;
5002 }
5003 d_lineno -= ncodes * k;
5004 assert(ncodes >= 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005005 nbytes = a->a_lnotab_off + 2 * ncodes;
5006 len = PyBytes_GET_SIZE(a->a_lnotab);
5007 if (nbytes >= len) {
5008 if ((len <= INT_MAX / 2) && len * 2 < nbytes)
5009 len = nbytes;
5010 else if (len <= INT_MAX / 2)
5011 len *= 2;
5012 else {
5013 PyErr_NoMemory();
5014 return 0;
5015 }
5016 if (_PyBytes_Resize(&a->a_lnotab, len) < 0)
5017 return 0;
5018 }
5019 lnotab = (unsigned char *)
5020 PyBytes_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
5021 *lnotab++ = d_bytecode;
Victor Stinnerf3914eb2016-01-20 12:16:21 +01005022 *lnotab++ = k;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005023 d_bytecode = 0;
5024 for (j = 1; j < ncodes; j++) {
5025 *lnotab++ = 0;
Victor Stinnerf3914eb2016-01-20 12:16:21 +01005026 *lnotab++ = k;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005027 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005028 a->a_lnotab_off += ncodes * 2;
5029 }
Victor Stinnerf3914eb2016-01-20 12:16:21 +01005030 assert(-128 <= d_lineno && d_lineno <= 127);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005031
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005032 len = PyBytes_GET_SIZE(a->a_lnotab);
5033 if (a->a_lnotab_off + 2 >= len) {
5034 if (_PyBytes_Resize(&a->a_lnotab, len * 2) < 0)
5035 return 0;
5036 }
5037 lnotab = (unsigned char *)
5038 PyBytes_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
Tim Peters51e26512001-09-07 08:45:55 +00005039
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005040 a->a_lnotab_off += 2;
5041 if (d_bytecode) {
5042 *lnotab++ = d_bytecode;
Victor Stinner4f2dab52011-05-27 16:46:51 +02005043 *lnotab++ = d_lineno;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005044 }
5045 else { /* First line of a block; def stmt, etc. */
5046 *lnotab++ = 0;
Victor Stinner4f2dab52011-05-27 16:46:51 +02005047 *lnotab++ = d_lineno;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005048 }
5049 a->a_lineno = i->i_lineno;
5050 a->a_lineno_off = a->a_offset;
5051 return 1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005052}
5053
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005054/* assemble_emit()
5055 Extend the bytecode with a new instruction.
5056 Update lnotab if necessary.
Jeremy Hylton376e63d2003-08-28 14:42:14 +00005057*/
5058
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00005059static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005060assemble_emit(struct assembler *a, struct instr *i)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00005061{
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005062 int size, arg = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005063 Py_ssize_t len = PyBytes_GET_SIZE(a->a_bytecode);
Serhiy Storchakaab874002016-09-11 13:48:15 +03005064 _Py_CODEUNIT *code;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005065
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005066 arg = i->i_oparg;
5067 size = instrsize(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005068 if (i->i_lineno && !assemble_lnotab(a, i))
5069 return 0;
Serhiy Storchakaab874002016-09-11 13:48:15 +03005070 if (a->a_offset + size >= len / (int)sizeof(_Py_CODEUNIT)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005071 if (len > PY_SSIZE_T_MAX / 2)
5072 return 0;
5073 if (_PyBytes_Resize(&a->a_bytecode, len * 2) < 0)
5074 return 0;
5075 }
Serhiy Storchakaab874002016-09-11 13:48:15 +03005076 code = (_Py_CODEUNIT *)PyBytes_AS_STRING(a->a_bytecode) + a->a_offset;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005077 a->a_offset += size;
Serhiy Storchakaab874002016-09-11 13:48:15 +03005078 write_op_arg(code, i->i_opcode, arg, size);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005079 return 1;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00005080}
5081
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00005082static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005083assemble_jump_offsets(struct assembler *a, struct compiler *c)
Anthony Baxterc2a5a632004-08-02 06:10:11 +00005084{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005085 basicblock *b;
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005086 int bsize, totsize, extended_arg_recompile;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005087 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00005088
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005089 /* Compute the size of each block and fixup jump args.
5090 Replace block pointer with position in bytecode. */
5091 do {
5092 totsize = 0;
5093 for (i = a->a_nblocks - 1; i >= 0; i--) {
5094 b = a->a_postorder[i];
5095 bsize = blocksize(b);
5096 b->b_offset = totsize;
5097 totsize += bsize;
5098 }
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005099 extended_arg_recompile = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005100 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
5101 bsize = b->b_offset;
5102 for (i = 0; i < b->b_iused; i++) {
5103 struct instr *instr = &b->b_instr[i];
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005104 int isize = instrsize(instr->i_oparg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005105 /* Relative jumps are computed relative to
5106 the instruction pointer after fetching
5107 the jump instruction.
5108 */
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005109 bsize += isize;
5110 if (instr->i_jabs || instr->i_jrel) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005111 instr->i_oparg = instr->i_target->b_offset;
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005112 if (instr->i_jrel) {
5113 instr->i_oparg -= bsize;
5114 }
Serhiy Storchakaab874002016-09-11 13:48:15 +03005115 instr->i_oparg *= sizeof(_Py_CODEUNIT);
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005116 if (instrsize(instr->i_oparg) != isize) {
5117 extended_arg_recompile = 1;
5118 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005119 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005120 }
5121 }
Neal Norwitzf1d50682005-10-23 23:00:41 +00005122
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005123 /* XXX: This is an awful hack that could hurt performance, but
5124 on the bright side it should work until we come up
5125 with a better solution.
Neal Norwitzf1d50682005-10-23 23:00:41 +00005126
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005127 The issue is that in the first loop blocksize() is called
5128 which calls instrsize() which requires i_oparg be set
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005129 appropriately. There is a bootstrap problem because
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005130 i_oparg is calculated in the second loop above.
Neal Norwitzf1d50682005-10-23 23:00:41 +00005131
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005132 So we loop until we stop seeing new EXTENDED_ARGs.
5133 The only EXTENDED_ARGs that could be popping up are
5134 ones in jump instructions. So this should converge
5135 fairly quickly.
5136 */
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005137 } while (extended_arg_recompile);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005138}
5139
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005140static PyObject *
Victor Stinnerad9a0662013-11-19 22:23:20 +01005141dict_keys_inorder(PyObject *dict, Py_ssize_t offset)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005142{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005143 PyObject *tuple, *k, *v;
5144 Py_ssize_t i, pos = 0, size = PyDict_Size(dict);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005145
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005146 tuple = PyTuple_New(size);
5147 if (tuple == NULL)
5148 return NULL;
5149 while (PyDict_Next(dict, &pos, &k, &v)) {
5150 i = PyLong_AS_LONG(v);
Victor Stinnerefb24132016-01-22 12:33:12 +01005151 /* The keys of the dictionary are tuples. (see compiler_add_o
5152 * and _PyCode_ConstantKey). The object we want is always second,
5153 * though. */
5154 k = PyTuple_GET_ITEM(k, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005155 Py_INCREF(k);
5156 assert((i - offset) < size);
5157 assert((i - offset) >= 0);
5158 PyTuple_SET_ITEM(tuple, i - offset, k);
5159 }
5160 return tuple;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005161}
5162
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005163static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005164compute_code_flags(struct compiler *c)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005165{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005166 PySTEntryObject *ste = c->u->u_ste;
Victor Stinnerad9a0662013-11-19 22:23:20 +01005167 int flags = 0;
5168 Py_ssize_t n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005169 if (ste->ste_type == FunctionBlock) {
Benjamin Peterson1dfd2472015-04-27 21:44:22 -04005170 flags |= CO_NEWLOCALS | CO_OPTIMIZED;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005171 if (ste->ste_nested)
5172 flags |= CO_NESTED;
Yury Selivanoveb636452016-09-08 22:01:51 -07005173 if (ste->ste_generator && !ste->ste_coroutine)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005174 flags |= CO_GENERATOR;
Yury Selivanoveb636452016-09-08 22:01:51 -07005175 if (!ste->ste_generator && ste->ste_coroutine)
5176 flags |= CO_COROUTINE;
5177 if (ste->ste_generator && ste->ste_coroutine)
5178 flags |= CO_ASYNC_GENERATOR;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005179 if (ste->ste_varargs)
5180 flags |= CO_VARARGS;
5181 if (ste->ste_varkeywords)
5182 flags |= CO_VARKEYWORDS;
5183 }
Thomas Wouters5e9f1fa2006-02-28 20:02:27 +00005184
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005185 /* (Only) inherit compilerflags in PyCF_MASK */
5186 flags |= (c->c_flags->cf_flags & PyCF_MASK);
Thomas Wouters5e9f1fa2006-02-28 20:02:27 +00005187
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005188 n = PyDict_Size(c->u->u_freevars);
5189 if (n < 0)
5190 return -1;
5191 if (n == 0) {
5192 n = PyDict_Size(c->u->u_cellvars);
5193 if (n < 0)
Victor Stinnerad9a0662013-11-19 22:23:20 +01005194 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005195 if (n == 0) {
Victor Stinnerad9a0662013-11-19 22:23:20 +01005196 flags |= CO_NOFREE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005197 }
5198 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005199
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005200 return flags;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005201}
5202
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005203static PyCodeObject *
5204makecode(struct compiler *c, struct assembler *a)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005205{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005206 PyObject *tmp;
5207 PyCodeObject *co = NULL;
5208 PyObject *consts = NULL;
5209 PyObject *names = NULL;
5210 PyObject *varnames = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005211 PyObject *name = NULL;
5212 PyObject *freevars = NULL;
5213 PyObject *cellvars = NULL;
5214 PyObject *bytecode = NULL;
Victor Stinnerad9a0662013-11-19 22:23:20 +01005215 Py_ssize_t nlocals;
5216 int nlocals_int;
5217 int flags;
Victor Stinnerf8e32212013-11-19 23:56:34 +01005218 int argcount, kwonlyargcount;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005219
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005220 tmp = dict_keys_inorder(c->u->u_consts, 0);
5221 if (!tmp)
5222 goto error;
5223 consts = PySequence_List(tmp); /* optimize_code requires a list */
5224 Py_DECREF(tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005225
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005226 names = dict_keys_inorder(c->u->u_names, 0);
5227 varnames = dict_keys_inorder(c->u->u_varnames, 0);
5228 if (!consts || !names || !varnames)
5229 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005230
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005231 cellvars = dict_keys_inorder(c->u->u_cellvars, 0);
5232 if (!cellvars)
5233 goto error;
5234 freevars = dict_keys_inorder(c->u->u_freevars, PyTuple_Size(cellvars));
5235 if (!freevars)
5236 goto error;
Victor Stinnerad9a0662013-11-19 22:23:20 +01005237
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005238 nlocals = PyDict_Size(c->u->u_varnames);
Victor Stinnerad9a0662013-11-19 22:23:20 +01005239 assert(nlocals < INT_MAX);
5240 nlocals_int = Py_SAFE_DOWNCAST(nlocals, Py_ssize_t, int);
5241
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005242 flags = compute_code_flags(c);
5243 if (flags < 0)
5244 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005245
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005246 bytecode = PyCode_Optimize(a->a_bytecode, consts, names, a->a_lnotab);
5247 if (!bytecode)
5248 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005249
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005250 tmp = PyList_AsTuple(consts); /* PyCode_New requires a tuple */
5251 if (!tmp)
5252 goto error;
5253 Py_DECREF(consts);
5254 consts = tmp;
5255
Victor Stinnerf8e32212013-11-19 23:56:34 +01005256 argcount = Py_SAFE_DOWNCAST(c->u->u_argcount, Py_ssize_t, int);
5257 kwonlyargcount = Py_SAFE_DOWNCAST(c->u->u_kwonlyargcount, Py_ssize_t, int);
5258 co = PyCode_New(argcount, kwonlyargcount,
Victor Stinnerad9a0662013-11-19 22:23:20 +01005259 nlocals_int, stackdepth(c), flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005260 bytecode, consts, names, varnames,
5261 freevars, cellvars,
Victor Stinner14e461d2013-08-26 22:28:21 +02005262 c->c_filename, c->u->u_name,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005263 c->u->u_firstlineno,
5264 a->a_lnotab);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005265 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005266 Py_XDECREF(consts);
5267 Py_XDECREF(names);
5268 Py_XDECREF(varnames);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005269 Py_XDECREF(name);
5270 Py_XDECREF(freevars);
5271 Py_XDECREF(cellvars);
5272 Py_XDECREF(bytecode);
5273 return co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005274}
5275
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005276
5277/* For debugging purposes only */
5278#if 0
5279static void
5280dump_instr(const struct instr *i)
5281{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005282 const char *jrel = i->i_jrel ? "jrel " : "";
5283 const char *jabs = i->i_jabs ? "jabs " : "";
5284 char arg[128];
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005285
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005286 *arg = '\0';
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005287 if (HAS_ARG(i->i_opcode)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005288 sprintf(arg, "arg: %d ", i->i_oparg);
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005289 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005290 fprintf(stderr, "line: %d, opcode: %d %s%s%s\n",
5291 i->i_lineno, i->i_opcode, arg, jabs, jrel);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005292}
5293
5294static void
5295dump_basicblock(const basicblock *b)
5296{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005297 const char *seen = b->b_seen ? "seen " : "";
5298 const char *b_return = b->b_return ? "return " : "";
5299 fprintf(stderr, "used: %d, depth: %d, offset: %d %s%s\n",
5300 b->b_iused, b->b_startdepth, b->b_offset, seen, b_return);
5301 if (b->b_instr) {
5302 int i;
5303 for (i = 0; i < b->b_iused; i++) {
5304 fprintf(stderr, " [%02d] ", i);
5305 dump_instr(b->b_instr + i);
5306 }
5307 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005308}
5309#endif
5310
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005311static PyCodeObject *
5312assemble(struct compiler *c, int addNone)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005313{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005314 basicblock *b, *entryblock;
5315 struct assembler a;
5316 int i, j, nblocks;
5317 PyCodeObject *co = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005318
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005319 /* Make sure every block that falls off the end returns None.
5320 XXX NEXT_BLOCK() isn't quite right, because if the last
5321 block ends with a jump or return b_next shouldn't set.
5322 */
5323 if (!c->u->u_curblock->b_return) {
5324 NEXT_BLOCK(c);
5325 if (addNone)
5326 ADDOP_O(c, LOAD_CONST, Py_None, consts);
5327 ADDOP(c, RETURN_VALUE);
5328 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005329
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005330 nblocks = 0;
5331 entryblock = NULL;
5332 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
5333 nblocks++;
5334 entryblock = b;
5335 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005336
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005337 /* Set firstlineno if it wasn't explicitly set. */
5338 if (!c->u->u_firstlineno) {
Ned Deilydc35cda2016-08-17 17:18:33 -04005339 if (entryblock && entryblock->b_instr && entryblock->b_instr->i_lineno)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005340 c->u->u_firstlineno = entryblock->b_instr->i_lineno;
5341 else
5342 c->u->u_firstlineno = 1;
5343 }
5344 if (!assemble_init(&a, nblocks, c->u->u_firstlineno))
5345 goto error;
5346 dfs(c, entryblock, &a);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005347
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005348 /* Can't modify the bytecode after computing jump offsets. */
5349 assemble_jump_offsets(&a, c);
Tim Petersb6c3cea2001-06-26 03:36:28 +00005350
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005351 /* Emit code in reverse postorder from dfs. */
5352 for (i = a.a_nblocks - 1; i >= 0; i--) {
5353 b = a.a_postorder[i];
5354 for (j = 0; j < b->b_iused; j++)
5355 if (!assemble_emit(&a, &b->b_instr[j]))
5356 goto error;
5357 }
Tim Petersb6c3cea2001-06-26 03:36:28 +00005358
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005359 if (_PyBytes_Resize(&a.a_lnotab, a.a_lnotab_off) < 0)
5360 goto error;
Serhiy Storchakaab874002016-09-11 13:48:15 +03005361 if (_PyBytes_Resize(&a.a_bytecode, a.a_offset * sizeof(_Py_CODEUNIT)) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005362 goto error;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005363
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005364 co = makecode(c, &a);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005365 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005366 assemble_free(&a);
5367 return co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005368}
Georg Brandl8334fd92010-12-04 10:26:46 +00005369
5370#undef PyAST_Compile
5371PyAPI_FUNC(PyCodeObject *)
5372PyAST_Compile(mod_ty mod, const char *filename, PyCompilerFlags *flags,
5373 PyArena *arena)
5374{
5375 return PyAST_CompileEx(mod, filename, flags, -1, arena);
5376}