blob: 36683d30e12956417c25c715bf4e56ac21a8b760 [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) {
1971 /* return the (empty) __class__ cell */
1972 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);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001984 /* Return the cell where to store __class__ */
1985 ADDOP_I(c, LOAD_CLOSURE, i);
1986 }
Benjamin Peterson312595c2013-05-15 15:26:42 -05001987 else {
1988 assert(PyDict_Size(c->u->u_cellvars) == 0);
1989 /* This happens when nobody references the cell. Return None. */
1990 ADDOP_O(c, LOAD_CONST, Py_None, consts);
1991 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001992 ADDOP_IN_SCOPE(c, RETURN_VALUE);
1993 /* create the code object */
1994 co = assemble(c, 1);
1995 }
1996 /* leave the new scope */
1997 compiler_exit_scope(c);
1998 if (co == NULL)
1999 return 0;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00002000
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002001 /* 2. load the 'build_class' function */
2002 ADDOP(c, LOAD_BUILD_CLASS);
2003
2004 /* 3. load a function (or closure) made from the code object */
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002005 compiler_make_closure(c, co, 0, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002006 Py_DECREF(co);
2007
2008 /* 4. load class name */
2009 ADDOP_O(c, LOAD_CONST, s->v.ClassDef.name, consts);
2010
2011 /* 5. generate the rest of the code for the call */
2012 if (!compiler_call_helper(c, 2,
2013 s->v.ClassDef.bases,
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04002014 s->v.ClassDef.keywords))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002015 return 0;
2016
2017 /* 6. apply decorators */
2018 for (i = 0; i < asdl_seq_LEN(decos); i++) {
2019 ADDOP_I(c, CALL_FUNCTION, 1);
2020 }
2021
2022 /* 7. store into <name> */
2023 if (!compiler_nameop(c, s->v.ClassDef.name, Store))
2024 return 0;
2025 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002026}
2027
2028static int
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002029compiler_ifexp(struct compiler *c, expr_ty e)
2030{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002031 basicblock *end, *next;
2032
2033 assert(e->kind == IfExp_kind);
2034 end = compiler_new_block(c);
2035 if (end == NULL)
2036 return 0;
2037 next = compiler_new_block(c);
2038 if (next == NULL)
2039 return 0;
2040 VISIT(c, expr, e->v.IfExp.test);
2041 ADDOP_JABS(c, POP_JUMP_IF_FALSE, next);
2042 VISIT(c, expr, e->v.IfExp.body);
2043 ADDOP_JREL(c, JUMP_FORWARD, end);
2044 compiler_use_next_block(c, next);
2045 VISIT(c, expr, e->v.IfExp.orelse);
2046 compiler_use_next_block(c, end);
2047 return 1;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002048}
2049
2050static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002051compiler_lambda(struct compiler *c, expr_ty e)
2052{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002053 PyCodeObject *co;
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002054 PyObject *qualname;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002055 static identifier name;
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002056 Py_ssize_t funcflags;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002057 arguments_ty args = e->v.Lambda.args;
2058 assert(e->kind == Lambda_kind);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002059
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002060 if (!name) {
2061 name = PyUnicode_InternFromString("<lambda>");
2062 if (!name)
2063 return 0;
2064 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002065
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002066 funcflags = compiler_default_arguments(c, args);
2067 if (funcflags == -1) {
2068 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002069 }
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002070
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04002071 if (!compiler_enter_scope(c, name, COMPILER_SCOPE_LAMBDA,
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002072 (void *)e, e->lineno))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002073 return 0;
Neal Norwitz4737b232005-11-19 23:58:29 +00002074
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002075 /* Make None the first constant, so the lambda can't have a
2076 docstring. */
2077 if (compiler_add_o(c, c->u->u_consts, Py_None) < 0)
2078 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002079
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002080 c->u->u_argcount = asdl_seq_LEN(args->args);
2081 c->u->u_kwonlyargcount = asdl_seq_LEN(args->kwonlyargs);
2082 VISIT_IN_SCOPE(c, expr, e->v.Lambda.body);
2083 if (c->u->u_ste->ste_generator) {
Serhiy Storchakac775ad62015-03-11 18:20:35 +02002084 co = assemble(c, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002085 }
2086 else {
2087 ADDOP_IN_SCOPE(c, RETURN_VALUE);
Serhiy Storchakac775ad62015-03-11 18:20:35 +02002088 co = assemble(c, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002089 }
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04002090 qualname = c->u->u_qualname;
2091 Py_INCREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002092 compiler_exit_scope(c);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04002093 if (co == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002094 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002095
Serhiy Storchaka64204de2016-06-12 17:36:24 +03002096 compiler_make_closure(c, co, funcflags, qualname);
Antoine Pitrou86a36b52011-11-25 18:56:07 +01002097 Py_DECREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002098 Py_DECREF(co);
2099
2100 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002101}
2102
2103static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002104compiler_if(struct compiler *c, stmt_ty s)
2105{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002106 basicblock *end, *next;
2107 int constant;
2108 assert(s->kind == If_kind);
2109 end = compiler_new_block(c);
2110 if (end == NULL)
2111 return 0;
2112
Georg Brandl8334fd92010-12-04 10:26:46 +00002113 constant = expr_constant(c, s->v.If.test);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002114 /* constant = 0: "if 0"
2115 * constant = 1: "if 1", "if 2", ...
2116 * constant = -1: rest */
2117 if (constant == 0) {
2118 if (s->v.If.orelse)
2119 VISIT_SEQ(c, stmt, s->v.If.orelse);
2120 } else if (constant == 1) {
2121 VISIT_SEQ(c, stmt, s->v.If.body);
2122 } else {
Antoine Pitroue7811fc2014-09-18 03:06:50 +02002123 if (asdl_seq_LEN(s->v.If.orelse)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002124 next = compiler_new_block(c);
2125 if (next == NULL)
2126 return 0;
2127 }
2128 else
2129 next = end;
2130 VISIT(c, expr, s->v.If.test);
2131 ADDOP_JABS(c, POP_JUMP_IF_FALSE, next);
2132 VISIT_SEQ(c, stmt, s->v.If.body);
Antoine Pitroue7811fc2014-09-18 03:06:50 +02002133 if (asdl_seq_LEN(s->v.If.orelse)) {
2134 ADDOP_JREL(c, JUMP_FORWARD, end);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002135 compiler_use_next_block(c, next);
2136 VISIT_SEQ(c, stmt, s->v.If.orelse);
2137 }
2138 }
2139 compiler_use_next_block(c, end);
2140 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002141}
2142
2143static int
2144compiler_for(struct compiler *c, stmt_ty s)
2145{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002146 basicblock *start, *cleanup, *end;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002147
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002148 start = compiler_new_block(c);
2149 cleanup = compiler_new_block(c);
2150 end = compiler_new_block(c);
2151 if (start == NULL || end == NULL || cleanup == NULL)
2152 return 0;
2153 ADDOP_JREL(c, SETUP_LOOP, end);
2154 if (!compiler_push_fblock(c, LOOP, start))
2155 return 0;
2156 VISIT(c, expr, s->v.For.iter);
2157 ADDOP(c, GET_ITER);
2158 compiler_use_next_block(c, start);
2159 ADDOP_JREL(c, FOR_ITER, cleanup);
2160 VISIT(c, expr, s->v.For.target);
2161 VISIT_SEQ(c, stmt, s->v.For.body);
2162 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
2163 compiler_use_next_block(c, cleanup);
2164 ADDOP(c, POP_BLOCK);
2165 compiler_pop_fblock(c, LOOP, start);
2166 VISIT_SEQ(c, stmt, s->v.For.orelse);
2167 compiler_use_next_block(c, end);
2168 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002169}
2170
Yury Selivanov75445082015-05-11 22:57:16 -04002171
2172static int
2173compiler_async_for(struct compiler *c, stmt_ty s)
2174{
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07002175 _Py_IDENTIFIER(StopAsyncIteration);
2176
Yury Selivanov75445082015-05-11 22:57:16 -04002177 basicblock *try, *except, *end, *after_try, *try_cleanup,
2178 *after_loop, *after_loop_else;
2179
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07002180 PyObject *stop_aiter_error = _PyUnicode_FromId(&PyId_StopAsyncIteration);
2181 if (stop_aiter_error == NULL) {
2182 return 0;
Yury Selivanov75445082015-05-11 22:57:16 -04002183 }
2184
2185 try = compiler_new_block(c);
2186 except = compiler_new_block(c);
2187 end = compiler_new_block(c);
2188 after_try = compiler_new_block(c);
2189 try_cleanup = compiler_new_block(c);
2190 after_loop = compiler_new_block(c);
2191 after_loop_else = compiler_new_block(c);
2192
2193 if (try == NULL || except == NULL || end == NULL
2194 || after_try == NULL || try_cleanup == NULL)
2195 return 0;
2196
2197 ADDOP_JREL(c, SETUP_LOOP, after_loop);
2198 if (!compiler_push_fblock(c, LOOP, try))
2199 return 0;
2200
2201 VISIT(c, expr, s->v.AsyncFor.iter);
2202 ADDOP(c, GET_AITER);
2203 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2204 ADDOP(c, YIELD_FROM);
2205
2206 compiler_use_next_block(c, try);
2207
2208
2209 ADDOP_JREL(c, SETUP_EXCEPT, except);
2210 if (!compiler_push_fblock(c, EXCEPT, try))
2211 return 0;
2212
2213 ADDOP(c, GET_ANEXT);
2214 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2215 ADDOP(c, YIELD_FROM);
2216 VISIT(c, expr, s->v.AsyncFor.target);
2217 ADDOP(c, POP_BLOCK);
2218 compiler_pop_fblock(c, EXCEPT, try);
2219 ADDOP_JREL(c, JUMP_FORWARD, after_try);
2220
2221
2222 compiler_use_next_block(c, except);
2223 ADDOP(c, DUP_TOP);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07002224 ADDOP_O(c, LOAD_GLOBAL, stop_aiter_error, names);
Yury Selivanov75445082015-05-11 22:57:16 -04002225 ADDOP_I(c, COMPARE_OP, PyCmp_EXC_MATCH);
2226 ADDOP_JABS(c, POP_JUMP_IF_FALSE, try_cleanup);
2227
2228 ADDOP(c, POP_TOP);
2229 ADDOP(c, POP_TOP);
2230 ADDOP(c, POP_TOP);
2231 ADDOP(c, POP_EXCEPT); /* for SETUP_EXCEPT */
2232 ADDOP(c, POP_BLOCK); /* for SETUP_LOOP */
2233 ADDOP_JABS(c, JUMP_ABSOLUTE, after_loop_else);
2234
2235
2236 compiler_use_next_block(c, try_cleanup);
2237 ADDOP(c, END_FINALLY);
2238
2239 compiler_use_next_block(c, after_try);
2240 VISIT_SEQ(c, stmt, s->v.AsyncFor.body);
2241 ADDOP_JABS(c, JUMP_ABSOLUTE, try);
2242
2243 ADDOP(c, POP_BLOCK); /* for SETUP_LOOP */
2244 compiler_pop_fblock(c, LOOP, try);
2245
2246 compiler_use_next_block(c, after_loop);
2247 ADDOP_JABS(c, JUMP_ABSOLUTE, end);
2248
2249 compiler_use_next_block(c, after_loop_else);
2250 VISIT_SEQ(c, stmt, s->v.For.orelse);
2251
2252 compiler_use_next_block(c, end);
2253
2254 return 1;
2255}
2256
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002257static int
2258compiler_while(struct compiler *c, stmt_ty s)
2259{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002260 basicblock *loop, *orelse, *end, *anchor = NULL;
Georg Brandl8334fd92010-12-04 10:26:46 +00002261 int constant = expr_constant(c, s->v.While.test);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002262
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002263 if (constant == 0) {
2264 if (s->v.While.orelse)
2265 VISIT_SEQ(c, stmt, s->v.While.orelse);
2266 return 1;
2267 }
2268 loop = compiler_new_block(c);
2269 end = compiler_new_block(c);
2270 if (constant == -1) {
2271 anchor = compiler_new_block(c);
2272 if (anchor == NULL)
2273 return 0;
2274 }
2275 if (loop == NULL || end == NULL)
2276 return 0;
2277 if (s->v.While.orelse) {
2278 orelse = compiler_new_block(c);
2279 if (orelse == NULL)
2280 return 0;
2281 }
2282 else
2283 orelse = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002284
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002285 ADDOP_JREL(c, SETUP_LOOP, end);
2286 compiler_use_next_block(c, loop);
2287 if (!compiler_push_fblock(c, LOOP, loop))
2288 return 0;
2289 if (constant == -1) {
2290 VISIT(c, expr, s->v.While.test);
2291 ADDOP_JABS(c, POP_JUMP_IF_FALSE, anchor);
2292 }
2293 VISIT_SEQ(c, stmt, s->v.While.body);
2294 ADDOP_JABS(c, JUMP_ABSOLUTE, loop);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002295
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002296 /* XXX should the two POP instructions be in a separate block
2297 if there is no else clause ?
2298 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002299
Benjamin Peterson3cda0ed2014-12-13 16:06:19 -05002300 if (constant == -1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002301 compiler_use_next_block(c, anchor);
Benjamin Peterson3cda0ed2014-12-13 16:06:19 -05002302 ADDOP(c, POP_BLOCK);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002303 compiler_pop_fblock(c, LOOP, loop);
2304 if (orelse != NULL) /* what if orelse is just pass? */
2305 VISIT_SEQ(c, stmt, s->v.While.orelse);
2306 compiler_use_next_block(c, end);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002307
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002308 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002309}
2310
2311static int
2312compiler_continue(struct compiler *c)
2313{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002314 static const char LOOP_ERROR_MSG[] = "'continue' not properly in loop";
2315 static const char IN_FINALLY_ERROR_MSG[] =
2316 "'continue' not supported inside 'finally' clause";
2317 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002318
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002319 if (!c->u->u_nfblocks)
2320 return compiler_error(c, LOOP_ERROR_MSG);
2321 i = c->u->u_nfblocks - 1;
2322 switch (c->u->u_fblock[i].fb_type) {
2323 case LOOP:
2324 ADDOP_JABS(c, JUMP_ABSOLUTE, c->u->u_fblock[i].fb_block);
2325 break;
2326 case EXCEPT:
2327 case FINALLY_TRY:
2328 while (--i >= 0 && c->u->u_fblock[i].fb_type != LOOP) {
2329 /* Prevent continue anywhere under a finally
2330 even if hidden in a sub-try or except. */
2331 if (c->u->u_fblock[i].fb_type == FINALLY_END)
2332 return compiler_error(c, IN_FINALLY_ERROR_MSG);
2333 }
2334 if (i == -1)
2335 return compiler_error(c, LOOP_ERROR_MSG);
2336 ADDOP_JABS(c, CONTINUE_LOOP, c->u->u_fblock[i].fb_block);
2337 break;
2338 case FINALLY_END:
2339 return compiler_error(c, IN_FINALLY_ERROR_MSG);
2340 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002341
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002342 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002343}
2344
2345/* Code generated for "try: <body> finally: <finalbody>" is as follows:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002346
2347 SETUP_FINALLY L
2348 <code for body>
2349 POP_BLOCK
2350 LOAD_CONST <None>
2351 L: <code for finalbody>
2352 END_FINALLY
2353
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002354 The special instructions use the block stack. Each block
2355 stack entry contains the instruction that created it (here
2356 SETUP_FINALLY), the level of the value stack at the time the
2357 block stack entry was created, and a label (here L).
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002358
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002359 SETUP_FINALLY:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002360 Pushes the current value stack level and the label
2361 onto the block stack.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002362 POP_BLOCK:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002363 Pops en entry from the block stack, and pops the value
2364 stack until its level is the same as indicated on the
2365 block stack. (The label is ignored.)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002366 END_FINALLY:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002367 Pops a variable number of entries from the *value* stack
2368 and re-raises the exception they specify. The number of
2369 entries popped depends on the (pseudo) exception type.
2370
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002371 The block stack is unwound when an exception is raised:
2372 when a SETUP_FINALLY entry is found, the exception is pushed
2373 onto the value stack (and the exception condition is cleared),
2374 and the interpreter jumps to the label gotten from the block
2375 stack.
2376*/
2377
2378static int
2379compiler_try_finally(struct compiler *c, stmt_ty s)
2380{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002381 basicblock *body, *end;
2382 body = compiler_new_block(c);
2383 end = compiler_new_block(c);
2384 if (body == NULL || end == NULL)
2385 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002386
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002387 ADDOP_JREL(c, SETUP_FINALLY, end);
2388 compiler_use_next_block(c, body);
2389 if (!compiler_push_fblock(c, FINALLY_TRY, body))
2390 return 0;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002391 if (s->v.Try.handlers && asdl_seq_LEN(s->v.Try.handlers)) {
2392 if (!compiler_try_except(c, s))
2393 return 0;
2394 }
2395 else {
2396 VISIT_SEQ(c, stmt, s->v.Try.body);
2397 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002398 ADDOP(c, POP_BLOCK);
2399 compiler_pop_fblock(c, FINALLY_TRY, body);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002400
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002401 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2402 compiler_use_next_block(c, end);
2403 if (!compiler_push_fblock(c, FINALLY_END, end))
2404 return 0;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002405 VISIT_SEQ(c, stmt, s->v.Try.finalbody);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002406 ADDOP(c, END_FINALLY);
2407 compiler_pop_fblock(c, FINALLY_END, end);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002408
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002409 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002410}
2411
2412/*
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00002413 Code generated for "try: S except E1 as V1: S1 except E2 as V2: S2 ...":
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002414 (The contents of the value stack is shown in [], with the top
2415 at the right; 'tb' is trace-back info, 'val' the exception's
2416 associated value, and 'exc' the exception.)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002417
2418 Value stack Label Instruction Argument
2419 [] SETUP_EXCEPT L1
2420 [] <code for S>
2421 [] POP_BLOCK
2422 [] JUMP_FORWARD L0
2423
2424 [tb, val, exc] L1: DUP )
2425 [tb, val, exc, exc] <evaluate E1> )
2426 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2427 [tb, val, exc, 1-or-0] POP_JUMP_IF_FALSE L2 )
2428 [tb, val, exc] POP
2429 [tb, val] <assign to V1> (or POP if no V1)
2430 [tb] POP
2431 [] <code for S1>
2432 JUMP_FORWARD L0
2433
2434 [tb, val, exc] L2: DUP
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002435 .............................etc.......................
2436
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002437 [tb, val, exc] Ln+1: END_FINALLY # re-raise exception
2438
2439 [] L0: <next statement>
2440
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002441 Of course, parts are not generated if Vi or Ei is not present.
2442*/
2443static int
2444compiler_try_except(struct compiler *c, stmt_ty s)
2445{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002446 basicblock *body, *orelse, *except, *end;
Victor Stinnerad9a0662013-11-19 22:23:20 +01002447 Py_ssize_t i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002448
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002449 body = compiler_new_block(c);
2450 except = compiler_new_block(c);
2451 orelse = compiler_new_block(c);
2452 end = compiler_new_block(c);
2453 if (body == NULL || except == NULL || orelse == NULL || end == NULL)
2454 return 0;
2455 ADDOP_JREL(c, SETUP_EXCEPT, except);
2456 compiler_use_next_block(c, body);
2457 if (!compiler_push_fblock(c, EXCEPT, body))
2458 return 0;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002459 VISIT_SEQ(c, stmt, s->v.Try.body);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002460 ADDOP(c, POP_BLOCK);
2461 compiler_pop_fblock(c, EXCEPT, body);
2462 ADDOP_JREL(c, JUMP_FORWARD, orelse);
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002463 n = asdl_seq_LEN(s->v.Try.handlers);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002464 compiler_use_next_block(c, except);
2465 for (i = 0; i < n; i++) {
2466 excepthandler_ty handler = (excepthandler_ty)asdl_seq_GET(
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002467 s->v.Try.handlers, i);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002468 if (!handler->v.ExceptHandler.type && i < n-1)
2469 return compiler_error(c, "default 'except:' must be last");
2470 c->u->u_lineno_set = 0;
2471 c->u->u_lineno = handler->lineno;
Benjamin Petersond4efd9e2010-09-20 23:02:10 +00002472 c->u->u_col_offset = handler->col_offset;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002473 except = compiler_new_block(c);
2474 if (except == NULL)
2475 return 0;
2476 if (handler->v.ExceptHandler.type) {
2477 ADDOP(c, DUP_TOP);
2478 VISIT(c, expr, handler->v.ExceptHandler.type);
2479 ADDOP_I(c, COMPARE_OP, PyCmp_EXC_MATCH);
2480 ADDOP_JABS(c, POP_JUMP_IF_FALSE, except);
2481 }
2482 ADDOP(c, POP_TOP);
2483 if (handler->v.ExceptHandler.name) {
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002484 basicblock *cleanup_end, *cleanup_body;
Guido van Rossumb940e112007-01-10 16:19:56 +00002485
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002486 cleanup_end = compiler_new_block(c);
2487 cleanup_body = compiler_new_block(c);
Benjamin Peterson0a5dad92011-05-27 14:17:04 -05002488 if (!(cleanup_end || cleanup_body))
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002489 return 0;
Guido van Rossumb940e112007-01-10 16:19:56 +00002490
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002491 compiler_nameop(c, handler->v.ExceptHandler.name, Store);
2492 ADDOP(c, POP_TOP);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002493
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002494 /*
2495 try:
Ezio Melotti1b6424f2013-04-19 07:10:09 +03002496 # body
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002497 except type as name:
Ezio Melotti1b6424f2013-04-19 07:10:09 +03002498 try:
2499 # body
2500 finally:
2501 name = None
2502 del name
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002503 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002504
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002505 /* second try: */
2506 ADDOP_JREL(c, SETUP_FINALLY, cleanup_end);
2507 compiler_use_next_block(c, cleanup_body);
2508 if (!compiler_push_fblock(c, FINALLY_TRY, cleanup_body))
2509 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002510
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002511 /* second # body */
2512 VISIT_SEQ(c, stmt, handler->v.ExceptHandler.body);
2513 ADDOP(c, POP_BLOCK);
2514 ADDOP(c, POP_EXCEPT);
2515 compiler_pop_fblock(c, FINALLY_TRY, cleanup_body);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002516
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002517 /* finally: */
2518 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2519 compiler_use_next_block(c, cleanup_end);
2520 if (!compiler_push_fblock(c, FINALLY_END, cleanup_end))
2521 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002522
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002523 /* name = None */
2524 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2525 compiler_nameop(c, handler->v.ExceptHandler.name, Store);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002526
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002527 /* del name */
2528 compiler_nameop(c, handler->v.ExceptHandler.name, Del);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002529
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002530 ADDOP(c, END_FINALLY);
2531 compiler_pop_fblock(c, FINALLY_END, cleanup_end);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002532 }
2533 else {
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002534 basicblock *cleanup_body;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002535
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002536 cleanup_body = compiler_new_block(c);
Benjamin Peterson0a5dad92011-05-27 14:17:04 -05002537 if (!cleanup_body)
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002538 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002539
Guido van Rossumb940e112007-01-10 16:19:56 +00002540 ADDOP(c, POP_TOP);
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002541 ADDOP(c, POP_TOP);
2542 compiler_use_next_block(c, cleanup_body);
2543 if (!compiler_push_fblock(c, FINALLY_TRY, cleanup_body))
2544 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002545 VISIT_SEQ(c, stmt, handler->v.ExceptHandler.body);
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002546 ADDOP(c, POP_EXCEPT);
2547 compiler_pop_fblock(c, FINALLY_TRY, cleanup_body);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002548 }
2549 ADDOP_JREL(c, JUMP_FORWARD, end);
2550 compiler_use_next_block(c, except);
2551 }
2552 ADDOP(c, END_FINALLY);
2553 compiler_use_next_block(c, orelse);
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002554 VISIT_SEQ(c, stmt, s->v.Try.orelse);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002555 compiler_use_next_block(c, end);
2556 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002557}
2558
2559static int
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002560compiler_try(struct compiler *c, stmt_ty s) {
2561 if (s->v.Try.finalbody && asdl_seq_LEN(s->v.Try.finalbody))
2562 return compiler_try_finally(c, s);
2563 else
2564 return compiler_try_except(c, s);
2565}
2566
2567
2568static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002569compiler_import_as(struct compiler *c, identifier name, identifier asname)
2570{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002571 /* The IMPORT_NAME opcode was already generated. This function
2572 merely needs to bind the result to a name.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002573
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002574 If there is a dot in name, we need to split it and emit a
2575 LOAD_ATTR for each name.
2576 */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002577 Py_ssize_t dot = PyUnicode_FindChar(name, '.', 0,
2578 PyUnicode_GET_LENGTH(name), 1);
2579 if (dot == -2)
Serhiy Storchaka694de3b2016-06-15 20:06:07 +03002580 return 0;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002581 if (dot != -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002582 /* Consume the base module name to get the first attribute */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002583 Py_ssize_t pos = dot + 1;
2584 while (dot != -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002585 PyObject *attr;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002586 dot = PyUnicode_FindChar(name, '.', pos,
2587 PyUnicode_GET_LENGTH(name), 1);
2588 if (dot == -2)
Serhiy Storchaka694de3b2016-06-15 20:06:07 +03002589 return 0;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002590 attr = PyUnicode_Substring(name, pos,
2591 (dot != -1) ? dot :
2592 PyUnicode_GET_LENGTH(name));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002593 if (!attr)
Serhiy Storchaka694de3b2016-06-15 20:06:07 +03002594 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002595 ADDOP_O(c, LOAD_ATTR, attr, names);
2596 Py_DECREF(attr);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002597 pos = dot + 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002598 }
2599 }
2600 return compiler_nameop(c, asname, Store);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002601}
2602
2603static int
2604compiler_import(struct compiler *c, stmt_ty s)
2605{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002606 /* The Import node stores a module name like a.b.c as a single
2607 string. This is convenient for all cases except
2608 import a.b.c as d
2609 where we need to parse that string to extract the individual
2610 module names.
2611 XXX Perhaps change the representation to make this case simpler?
2612 */
Victor Stinnerad9a0662013-11-19 22:23:20 +01002613 Py_ssize_t i, n = asdl_seq_LEN(s->v.Import.names);
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002614
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002615 for (i = 0; i < n; i++) {
2616 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.Import.names, i);
2617 int r;
2618 PyObject *level;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002619
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002620 level = PyLong_FromLong(0);
2621 if (level == NULL)
2622 return 0;
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002623
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002624 ADDOP_O(c, LOAD_CONST, level, consts);
2625 Py_DECREF(level);
2626 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2627 ADDOP_NAME(c, IMPORT_NAME, alias->name, names);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002628
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002629 if (alias->asname) {
2630 r = compiler_import_as(c, alias->name, alias->asname);
2631 if (!r)
2632 return r;
2633 }
2634 else {
2635 identifier tmp = alias->name;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002636 Py_ssize_t dot = PyUnicode_FindChar(
2637 alias->name, '.', 0, PyUnicode_GET_LENGTH(alias->name), 1);
Victor Stinner6b64a682013-07-11 22:50:45 +02002638 if (dot != -1) {
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002639 tmp = PyUnicode_Substring(alias->name, 0, dot);
Victor Stinner6b64a682013-07-11 22:50:45 +02002640 if (tmp == NULL)
2641 return 0;
2642 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002643 r = compiler_nameop(c, tmp, Store);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002644 if (dot != -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002645 Py_DECREF(tmp);
2646 }
2647 if (!r)
2648 return r;
2649 }
2650 }
2651 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002652}
2653
2654static int
2655compiler_from_import(struct compiler *c, stmt_ty s)
2656{
Victor Stinnerad9a0662013-11-19 22:23:20 +01002657 Py_ssize_t i, n = asdl_seq_LEN(s->v.ImportFrom.names);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002658
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002659 PyObject *names = PyTuple_New(n);
2660 PyObject *level;
2661 static PyObject *empty_string;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002662
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002663 if (!empty_string) {
2664 empty_string = PyUnicode_FromString("");
2665 if (!empty_string)
2666 return 0;
2667 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002668
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002669 if (!names)
2670 return 0;
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002671
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002672 level = PyLong_FromLong(s->v.ImportFrom.level);
2673 if (!level) {
2674 Py_DECREF(names);
2675 return 0;
2676 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002677
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002678 /* build up the names */
2679 for (i = 0; i < n; i++) {
2680 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);
2681 Py_INCREF(alias->name);
2682 PyTuple_SET_ITEM(names, i, alias->name);
2683 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002684
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002685 if (s->lineno > c->c_future->ff_lineno && s->v.ImportFrom.module &&
2686 !PyUnicode_CompareWithASCIIString(s->v.ImportFrom.module, "__future__")) {
2687 Py_DECREF(level);
2688 Py_DECREF(names);
2689 return compiler_error(c, "from __future__ imports must occur "
2690 "at the beginning of the file");
2691 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002692
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002693 ADDOP_O(c, LOAD_CONST, level, consts);
2694 Py_DECREF(level);
2695 ADDOP_O(c, LOAD_CONST, names, consts);
2696 Py_DECREF(names);
2697 if (s->v.ImportFrom.module) {
2698 ADDOP_NAME(c, IMPORT_NAME, s->v.ImportFrom.module, names);
2699 }
2700 else {
2701 ADDOP_NAME(c, IMPORT_NAME, empty_string, names);
2702 }
2703 for (i = 0; i < n; i++) {
2704 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);
2705 identifier store_name;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002706
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002707 if (i == 0 && PyUnicode_READ_CHAR(alias->name, 0) == '*') {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002708 assert(n == 1);
2709 ADDOP(c, IMPORT_STAR);
2710 return 1;
2711 }
2712
2713 ADDOP_NAME(c, IMPORT_FROM, alias->name, names);
2714 store_name = alias->name;
2715 if (alias->asname)
2716 store_name = alias->asname;
2717
2718 if (!compiler_nameop(c, store_name, Store)) {
2719 Py_DECREF(names);
2720 return 0;
2721 }
2722 }
2723 /* remove imported module */
2724 ADDOP(c, POP_TOP);
2725 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002726}
2727
2728static int
2729compiler_assert(struct compiler *c, stmt_ty s)
2730{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002731 static PyObject *assertion_error = NULL;
2732 basicblock *end;
Victor Stinner14e461d2013-08-26 22:28:21 +02002733 PyObject* msg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002734
Georg Brandl8334fd92010-12-04 10:26:46 +00002735 if (c->c_optimize)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002736 return 1;
2737 if (assertion_error == NULL) {
2738 assertion_error = PyUnicode_InternFromString("AssertionError");
2739 if (assertion_error == NULL)
2740 return 0;
2741 }
2742 if (s->v.Assert.test->kind == Tuple_kind &&
2743 asdl_seq_LEN(s->v.Assert.test->v.Tuple.elts) > 0) {
Victor Stinner14e461d2013-08-26 22:28:21 +02002744 msg = PyUnicode_FromString("assertion is always true, "
2745 "perhaps remove parentheses?");
2746 if (msg == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002747 return 0;
Victor Stinner14e461d2013-08-26 22:28:21 +02002748 if (PyErr_WarnExplicitObject(PyExc_SyntaxWarning, msg,
2749 c->c_filename, c->u->u_lineno,
2750 NULL, NULL) == -1) {
2751 Py_DECREF(msg);
2752 return 0;
2753 }
2754 Py_DECREF(msg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002755 }
2756 VISIT(c, expr, s->v.Assert.test);
2757 end = compiler_new_block(c);
2758 if (end == NULL)
2759 return 0;
2760 ADDOP_JABS(c, POP_JUMP_IF_TRUE, end);
2761 ADDOP_O(c, LOAD_GLOBAL, assertion_error, names);
2762 if (s->v.Assert.msg) {
2763 VISIT(c, expr, s->v.Assert.msg);
2764 ADDOP_I(c, CALL_FUNCTION, 1);
2765 }
2766 ADDOP_I(c, RAISE_VARARGS, 1);
2767 compiler_use_next_block(c, end);
2768 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002769}
2770
2771static int
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01002772compiler_visit_stmt_expr(struct compiler *c, expr_ty value)
2773{
2774 if (c->c_interactive && c->c_nestlevel <= 1) {
2775 VISIT(c, expr, value);
2776 ADDOP(c, PRINT_EXPR);
2777 return 1;
2778 }
2779
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03002780 if (is_const(value)) {
Victor Stinner15a30952016-02-08 22:45:06 +01002781 /* ignore constant statement */
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01002782 return 1;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01002783 }
2784
2785 VISIT(c, expr, value);
2786 ADDOP(c, POP_TOP);
2787 return 1;
2788}
2789
2790static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002791compiler_visit_stmt(struct compiler *c, stmt_ty s)
2792{
Victor Stinnerad9a0662013-11-19 22:23:20 +01002793 Py_ssize_t i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002794
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002795 /* Always assign a lineno to the next instruction for a stmt. */
2796 c->u->u_lineno = s->lineno;
Benjamin Petersond4efd9e2010-09-20 23:02:10 +00002797 c->u->u_col_offset = s->col_offset;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002798 c->u->u_lineno_set = 0;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002799
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002800 switch (s->kind) {
2801 case FunctionDef_kind:
Yury Selivanov75445082015-05-11 22:57:16 -04002802 return compiler_function(c, s, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002803 case ClassDef_kind:
2804 return compiler_class(c, s);
2805 case Return_kind:
2806 if (c->u->u_ste->ste_type != FunctionBlock)
2807 return compiler_error(c, "'return' outside function");
2808 if (s->v.Return.value) {
Yury Selivanoveb636452016-09-08 22:01:51 -07002809 if (c->u->u_ste->ste_coroutine && c->u->u_ste->ste_generator)
2810 return compiler_error(
2811 c, "'return' with value in async generator");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002812 VISIT(c, expr, s->v.Return.value);
2813 }
2814 else
2815 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2816 ADDOP(c, RETURN_VALUE);
2817 break;
2818 case Delete_kind:
2819 VISIT_SEQ(c, expr, s->v.Delete.targets)
2820 break;
2821 case Assign_kind:
2822 n = asdl_seq_LEN(s->v.Assign.targets);
2823 VISIT(c, expr, s->v.Assign.value);
2824 for (i = 0; i < n; i++) {
2825 if (i < n - 1)
2826 ADDOP(c, DUP_TOP);
2827 VISIT(c, expr,
2828 (expr_ty)asdl_seq_GET(s->v.Assign.targets, i));
2829 }
2830 break;
2831 case AugAssign_kind:
2832 return compiler_augassign(c, s);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07002833 case AnnAssign_kind:
2834 return compiler_annassign(c, s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002835 case For_kind:
2836 return compiler_for(c, s);
2837 case While_kind:
2838 return compiler_while(c, s);
2839 case If_kind:
2840 return compiler_if(c, s);
2841 case Raise_kind:
2842 n = 0;
2843 if (s->v.Raise.exc) {
2844 VISIT(c, expr, s->v.Raise.exc);
2845 n++;
Victor Stinnerad9a0662013-11-19 22:23:20 +01002846 if (s->v.Raise.cause) {
2847 VISIT(c, expr, s->v.Raise.cause);
2848 n++;
2849 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002850 }
Victor Stinnerad9a0662013-11-19 22:23:20 +01002851 ADDOP_I(c, RAISE_VARARGS, (int)n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002852 break;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002853 case Try_kind:
2854 return compiler_try(c, s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002855 case Assert_kind:
2856 return compiler_assert(c, s);
2857 case Import_kind:
2858 return compiler_import(c, s);
2859 case ImportFrom_kind:
2860 return compiler_from_import(c, s);
2861 case Global_kind:
2862 case Nonlocal_kind:
2863 break;
2864 case Expr_kind:
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01002865 return compiler_visit_stmt_expr(c, s->v.Expr.value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002866 case Pass_kind:
2867 break;
2868 case Break_kind:
2869 if (!compiler_in_loop(c))
2870 return compiler_error(c, "'break' outside loop");
2871 ADDOP(c, BREAK_LOOP);
2872 break;
2873 case Continue_kind:
2874 return compiler_continue(c);
2875 case With_kind:
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05002876 return compiler_with(c, s, 0);
Yury Selivanov75445082015-05-11 22:57:16 -04002877 case AsyncFunctionDef_kind:
2878 return compiler_function(c, s, 1);
2879 case AsyncWith_kind:
2880 return compiler_async_with(c, s, 0);
2881 case AsyncFor_kind:
2882 return compiler_async_for(c, s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002883 }
Yury Selivanov75445082015-05-11 22:57:16 -04002884
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002885 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002886}
2887
2888static int
2889unaryop(unaryop_ty op)
2890{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002891 switch (op) {
2892 case Invert:
2893 return UNARY_INVERT;
2894 case Not:
2895 return UNARY_NOT;
2896 case UAdd:
2897 return UNARY_POSITIVE;
2898 case USub:
2899 return UNARY_NEGATIVE;
2900 default:
2901 PyErr_Format(PyExc_SystemError,
2902 "unary op %d should not be possible", op);
2903 return 0;
2904 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002905}
2906
2907static int
2908binop(struct compiler *c, operator_ty op)
2909{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002910 switch (op) {
2911 case Add:
2912 return BINARY_ADD;
2913 case Sub:
2914 return BINARY_SUBTRACT;
2915 case Mult:
2916 return BINARY_MULTIPLY;
Benjamin Petersond51374e2014-04-09 23:55:56 -04002917 case MatMult:
2918 return BINARY_MATRIX_MULTIPLY;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002919 case Div:
2920 return BINARY_TRUE_DIVIDE;
2921 case Mod:
2922 return BINARY_MODULO;
2923 case Pow:
2924 return BINARY_POWER;
2925 case LShift:
2926 return BINARY_LSHIFT;
2927 case RShift:
2928 return BINARY_RSHIFT;
2929 case BitOr:
2930 return BINARY_OR;
2931 case BitXor:
2932 return BINARY_XOR;
2933 case BitAnd:
2934 return BINARY_AND;
2935 case FloorDiv:
2936 return BINARY_FLOOR_DIVIDE;
2937 default:
2938 PyErr_Format(PyExc_SystemError,
2939 "binary op %d should not be possible", op);
2940 return 0;
2941 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002942}
2943
2944static int
2945cmpop(cmpop_ty op)
2946{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002947 switch (op) {
2948 case Eq:
2949 return PyCmp_EQ;
2950 case NotEq:
2951 return PyCmp_NE;
2952 case Lt:
2953 return PyCmp_LT;
2954 case LtE:
2955 return PyCmp_LE;
2956 case Gt:
2957 return PyCmp_GT;
2958 case GtE:
2959 return PyCmp_GE;
2960 case Is:
2961 return PyCmp_IS;
2962 case IsNot:
2963 return PyCmp_IS_NOT;
2964 case In:
2965 return PyCmp_IN;
2966 case NotIn:
2967 return PyCmp_NOT_IN;
2968 default:
2969 return PyCmp_BAD;
2970 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002971}
2972
2973static int
2974inplace_binop(struct compiler *c, operator_ty op)
2975{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002976 switch (op) {
2977 case Add:
2978 return INPLACE_ADD;
2979 case Sub:
2980 return INPLACE_SUBTRACT;
2981 case Mult:
2982 return INPLACE_MULTIPLY;
Benjamin Petersond51374e2014-04-09 23:55:56 -04002983 case MatMult:
2984 return INPLACE_MATRIX_MULTIPLY;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002985 case Div:
2986 return INPLACE_TRUE_DIVIDE;
2987 case Mod:
2988 return INPLACE_MODULO;
2989 case Pow:
2990 return INPLACE_POWER;
2991 case LShift:
2992 return INPLACE_LSHIFT;
2993 case RShift:
2994 return INPLACE_RSHIFT;
2995 case BitOr:
2996 return INPLACE_OR;
2997 case BitXor:
2998 return INPLACE_XOR;
2999 case BitAnd:
3000 return INPLACE_AND;
3001 case FloorDiv:
3002 return INPLACE_FLOOR_DIVIDE;
3003 default:
3004 PyErr_Format(PyExc_SystemError,
3005 "inplace binary op %d should not be possible", op);
3006 return 0;
3007 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003008}
3009
3010static int
3011compiler_nameop(struct compiler *c, identifier name, expr_context_ty ctx)
3012{
Victor Stinnerad9a0662013-11-19 22:23:20 +01003013 int op, scope;
3014 Py_ssize_t arg;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003015 enum { OP_FAST, OP_GLOBAL, OP_DEREF, OP_NAME } optype;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003016
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003017 PyObject *dict = c->u->u_names;
3018 PyObject *mangled;
3019 /* XXX AugStore isn't used anywhere! */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003020
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003021 mangled = _Py_Mangle(c->u->u_private, name);
3022 if (!mangled)
3023 return 0;
Neil Schemenauer8b528b22005-10-23 18:37:42 +00003024
Benjamin Peterson70b224d2012-12-06 17:49:58 -05003025 assert(PyUnicode_CompareWithASCIIString(name, "None") &&
3026 PyUnicode_CompareWithASCIIString(name, "True") &&
3027 PyUnicode_CompareWithASCIIString(name, "False"));
3028
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003029 op = 0;
3030 optype = OP_NAME;
3031 scope = PyST_GetScope(c->u->u_ste, mangled);
3032 switch (scope) {
3033 case FREE:
3034 dict = c->u->u_freevars;
3035 optype = OP_DEREF;
3036 break;
3037 case CELL:
3038 dict = c->u->u_cellvars;
3039 optype = OP_DEREF;
3040 break;
3041 case LOCAL:
3042 if (c->u->u_ste->ste_type == FunctionBlock)
3043 optype = OP_FAST;
3044 break;
3045 case GLOBAL_IMPLICIT:
Benjamin Peterson1dfd2472015-04-27 21:44:22 -04003046 if (c->u->u_ste->ste_type == FunctionBlock)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003047 optype = OP_GLOBAL;
3048 break;
3049 case GLOBAL_EXPLICIT:
3050 optype = OP_GLOBAL;
3051 break;
3052 default:
3053 /* scope can be 0 */
3054 break;
3055 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003056
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003057 /* XXX Leave assert here, but handle __doc__ and the like better */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003058 assert(scope || PyUnicode_READ_CHAR(name, 0) == '_');
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003059
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003060 switch (optype) {
3061 case OP_DEREF:
3062 switch (ctx) {
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04003063 case Load:
3064 op = (c->u->u_ste->ste_type == ClassBlock) ? LOAD_CLASSDEREF : LOAD_DEREF;
3065 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003066 case Store: op = STORE_DEREF; break;
3067 case AugLoad:
3068 case AugStore:
3069 break;
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00003070 case Del: op = DELETE_DEREF; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003071 case Param:
3072 default:
3073 PyErr_SetString(PyExc_SystemError,
3074 "param invalid for deref variable");
3075 return 0;
3076 }
3077 break;
3078 case OP_FAST:
3079 switch (ctx) {
3080 case Load: op = LOAD_FAST; break;
3081 case Store: op = STORE_FAST; break;
3082 case Del: op = DELETE_FAST; break;
3083 case AugLoad:
3084 case AugStore:
3085 break;
3086 case Param:
3087 default:
3088 PyErr_SetString(PyExc_SystemError,
3089 "param invalid for local variable");
3090 return 0;
3091 }
3092 ADDOP_O(c, op, mangled, varnames);
3093 Py_DECREF(mangled);
3094 return 1;
3095 case OP_GLOBAL:
3096 switch (ctx) {
3097 case Load: op = LOAD_GLOBAL; break;
3098 case Store: op = STORE_GLOBAL; break;
3099 case Del: op = DELETE_GLOBAL; break;
3100 case AugLoad:
3101 case AugStore:
3102 break;
3103 case Param:
3104 default:
3105 PyErr_SetString(PyExc_SystemError,
3106 "param invalid for global variable");
3107 return 0;
3108 }
3109 break;
3110 case OP_NAME:
3111 switch (ctx) {
Benjamin Peterson20f9c3c2010-07-20 22:39:34 +00003112 case Load: op = LOAD_NAME; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003113 case Store: op = STORE_NAME; break;
3114 case Del: op = DELETE_NAME; break;
3115 case AugLoad:
3116 case AugStore:
3117 break;
3118 case Param:
3119 default:
3120 PyErr_SetString(PyExc_SystemError,
3121 "param invalid for name variable");
3122 return 0;
3123 }
3124 break;
3125 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003126
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003127 assert(op);
3128 arg = compiler_add_o(c, dict, mangled);
3129 Py_DECREF(mangled);
3130 if (arg < 0)
3131 return 0;
3132 return compiler_addop_i(c, op, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003133}
3134
3135static int
3136compiler_boolop(struct compiler *c, expr_ty e)
3137{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003138 basicblock *end;
Victor Stinnerad9a0662013-11-19 22:23:20 +01003139 int jumpi;
3140 Py_ssize_t i, n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003141 asdl_seq *s;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003142
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003143 assert(e->kind == BoolOp_kind);
3144 if (e->v.BoolOp.op == And)
3145 jumpi = JUMP_IF_FALSE_OR_POP;
3146 else
3147 jumpi = JUMP_IF_TRUE_OR_POP;
3148 end = compiler_new_block(c);
3149 if (end == NULL)
3150 return 0;
3151 s = e->v.BoolOp.values;
3152 n = asdl_seq_LEN(s) - 1;
3153 assert(n >= 0);
3154 for (i = 0; i < n; ++i) {
3155 VISIT(c, expr, (expr_ty)asdl_seq_GET(s, i));
3156 ADDOP_JABS(c, jumpi, end);
3157 }
3158 VISIT(c, expr, (expr_ty)asdl_seq_GET(s, n));
3159 compiler_use_next_block(c, end);
3160 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003161}
3162
3163static int
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003164starunpack_helper(struct compiler *c, asdl_seq *elts,
3165 int single_op, int inner_op, int outer_op)
3166{
3167 Py_ssize_t n = asdl_seq_LEN(elts);
3168 Py_ssize_t i, nsubitems = 0, nseen = 0;
3169 for (i = 0; i < n; i++) {
3170 expr_ty elt = asdl_seq_GET(elts, i);
3171 if (elt->kind == Starred_kind) {
3172 if (nseen) {
3173 ADDOP_I(c, inner_op, nseen);
3174 nseen = 0;
3175 nsubitems++;
3176 }
3177 VISIT(c, expr, elt->v.Starred.value);
3178 nsubitems++;
3179 }
3180 else {
3181 VISIT(c, expr, elt);
3182 nseen++;
3183 }
3184 }
3185 if (nsubitems) {
3186 if (nseen) {
3187 ADDOP_I(c, inner_op, nseen);
3188 nsubitems++;
3189 }
3190 ADDOP_I(c, outer_op, nsubitems);
3191 }
3192 else
3193 ADDOP_I(c, single_op, nseen);
3194 return 1;
3195}
3196
3197static int
3198assignment_helper(struct compiler *c, asdl_seq *elts)
3199{
3200 Py_ssize_t n = asdl_seq_LEN(elts);
3201 Py_ssize_t i;
3202 int seen_star = 0;
3203 for (i = 0; i < n; i++) {
3204 expr_ty elt = asdl_seq_GET(elts, i);
3205 if (elt->kind == Starred_kind && !seen_star) {
3206 if ((i >= (1 << 8)) ||
3207 (n-i-1 >= (INT_MAX >> 8)))
3208 return compiler_error(c,
3209 "too many expressions in "
3210 "star-unpacking assignment");
3211 ADDOP_I(c, UNPACK_EX, (i + ((n-i-1) << 8)));
3212 seen_star = 1;
3213 asdl_seq_SET(elts, i, elt->v.Starred.value);
3214 }
3215 else if (elt->kind == Starred_kind) {
3216 return compiler_error(c,
3217 "two starred expressions in assignment");
3218 }
3219 }
3220 if (!seen_star) {
3221 ADDOP_I(c, UNPACK_SEQUENCE, n);
3222 }
3223 VISIT_SEQ(c, expr, elts);
3224 return 1;
3225}
3226
3227static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003228compiler_list(struct compiler *c, expr_ty e)
3229{
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003230 asdl_seq *elts = e->v.List.elts;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003231 if (e->v.List.ctx == Store) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003232 return assignment_helper(c, elts);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003233 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003234 else if (e->v.List.ctx == Load) {
3235 return starunpack_helper(c, elts,
3236 BUILD_LIST, BUILD_TUPLE, BUILD_LIST_UNPACK);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003237 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003238 else
3239 VISIT_SEQ(c, expr, elts);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003240 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003241}
3242
3243static int
3244compiler_tuple(struct compiler *c, expr_ty e)
3245{
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003246 asdl_seq *elts = e->v.Tuple.elts;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003247 if (e->v.Tuple.ctx == Store) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003248 return assignment_helper(c, elts);
3249 }
3250 else if (e->v.Tuple.ctx == Load) {
3251 return starunpack_helper(c, elts,
3252 BUILD_TUPLE, BUILD_TUPLE, BUILD_TUPLE_UNPACK);
3253 }
3254 else
3255 VISIT_SEQ(c, expr, elts);
3256 return 1;
3257}
3258
3259static int
3260compiler_set(struct compiler *c, expr_ty e)
3261{
3262 return starunpack_helper(c, e->v.Set.elts, BUILD_SET,
3263 BUILD_SET, BUILD_SET_UNPACK);
3264}
3265
3266static int
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003267are_all_items_const(asdl_seq *seq, Py_ssize_t begin, Py_ssize_t end)
3268{
3269 Py_ssize_t i;
3270 for (i = begin; i < end; i++) {
3271 expr_ty key = (expr_ty)asdl_seq_GET(seq, i);
3272 if (key == NULL || !is_const(key))
3273 return 0;
3274 }
3275 return 1;
3276}
3277
3278static int
3279compiler_subdict(struct compiler *c, expr_ty e, Py_ssize_t begin, Py_ssize_t end)
3280{
3281 Py_ssize_t i, n = end - begin;
3282 PyObject *keys, *key;
3283 if (n > 1 && are_all_items_const(e->v.Dict.keys, begin, end)) {
3284 for (i = begin; i < end; i++) {
3285 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Dict.values, i));
3286 }
3287 keys = PyTuple_New(n);
3288 if (keys == NULL) {
3289 return 0;
3290 }
3291 for (i = begin; i < end; i++) {
3292 key = get_const_value((expr_ty)asdl_seq_GET(e->v.Dict.keys, i));
3293 Py_INCREF(key);
3294 PyTuple_SET_ITEM(keys, i - begin, key);
3295 }
3296 ADDOP_N(c, LOAD_CONST, keys, consts);
3297 ADDOP_I(c, BUILD_CONST_KEY_MAP, n);
3298 }
3299 else {
3300 for (i = begin; i < end; i++) {
3301 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Dict.keys, i));
3302 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Dict.values, i));
3303 }
3304 ADDOP_I(c, BUILD_MAP, n);
3305 }
3306 return 1;
3307}
3308
3309static int
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003310compiler_dict(struct compiler *c, expr_ty e)
3311{
Victor Stinner976bb402016-03-23 11:36:19 +01003312 Py_ssize_t i, n, elements;
3313 int containers;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003314 int is_unpacking = 0;
3315 n = asdl_seq_LEN(e->v.Dict.values);
3316 containers = 0;
3317 elements = 0;
3318 for (i = 0; i < n; i++) {
3319 is_unpacking = (expr_ty)asdl_seq_GET(e->v.Dict.keys, i) == NULL;
3320 if (elements == 0xFFFF || (elements && is_unpacking)) {
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003321 if (!compiler_subdict(c, e, i - elements, i))
3322 return 0;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003323 containers++;
3324 elements = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003325 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003326 if (is_unpacking) {
3327 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Dict.values, i));
3328 containers++;
3329 }
3330 else {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003331 elements++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003332 }
3333 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003334 if (elements || containers == 0) {
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003335 if (!compiler_subdict(c, e, n - elements, n))
3336 return 0;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003337 containers++;
3338 }
3339 /* If there is more than one dict, they need to be merged into a new
3340 * dict. If there is one dict and it's an unpacking, then it needs
3341 * to be copied into a new dict." */
3342 while (containers > 1 || is_unpacking) {
3343 int oparg = containers < 255 ? containers : 255;
3344 ADDOP_I(c, BUILD_MAP_UNPACK, oparg);
3345 containers -= (oparg - 1);
3346 is_unpacking = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003347 }
3348 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003349}
3350
3351static int
3352compiler_compare(struct compiler *c, expr_ty e)
3353{
Victor Stinnerad9a0662013-11-19 22:23:20 +01003354 Py_ssize_t i, n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003355 basicblock *cleanup = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003356
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003357 /* XXX the logic can be cleaned up for 1 or multiple comparisons */
3358 VISIT(c, expr, e->v.Compare.left);
3359 n = asdl_seq_LEN(e->v.Compare.ops);
3360 assert(n > 0);
3361 if (n > 1) {
3362 cleanup = compiler_new_block(c);
3363 if (cleanup == NULL)
3364 return 0;
3365 VISIT(c, expr,
3366 (expr_ty)asdl_seq_GET(e->v.Compare.comparators, 0));
3367 }
3368 for (i = 1; i < n; i++) {
3369 ADDOP(c, DUP_TOP);
3370 ADDOP(c, ROT_THREE);
3371 ADDOP_I(c, COMPARE_OP,
3372 cmpop((cmpop_ty)(asdl_seq_GET(
3373 e->v.Compare.ops, i - 1))));
3374 ADDOP_JABS(c, JUMP_IF_FALSE_OR_POP, cleanup);
3375 NEXT_BLOCK(c);
3376 if (i < (n - 1))
3377 VISIT(c, expr,
3378 (expr_ty)asdl_seq_GET(e->v.Compare.comparators, i));
3379 }
3380 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, n - 1));
3381 ADDOP_I(c, COMPARE_OP,
3382 cmpop((cmpop_ty)(asdl_seq_GET(e->v.Compare.ops, n - 1))));
3383 if (n > 1) {
3384 basicblock *end = compiler_new_block(c);
3385 if (end == NULL)
3386 return 0;
3387 ADDOP_JREL(c, JUMP_FORWARD, end);
3388 compiler_use_next_block(c, cleanup);
3389 ADDOP(c, ROT_TWO);
3390 ADDOP(c, POP_TOP);
3391 compiler_use_next_block(c, end);
3392 }
3393 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003394}
3395
3396static int
3397compiler_call(struct compiler *c, expr_ty e)
3398{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003399 VISIT(c, expr, e->v.Call.func);
3400 return compiler_call_helper(c, 0,
3401 e->v.Call.args,
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003402 e->v.Call.keywords);
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003403}
3404
Eric V. Smith235a6f02015-09-19 14:51:32 -04003405static int
3406compiler_joined_str(struct compiler *c, expr_ty e)
3407{
Eric V. Smith235a6f02015-09-19 14:51:32 -04003408 VISIT_SEQ(c, expr, e->v.JoinedStr.values);
Serhiy Storchakaea525a22016-09-06 22:07:53 +03003409 ADDOP_I(c, BUILD_STRING, asdl_seq_LEN(e->v.JoinedStr.values));
Eric V. Smith235a6f02015-09-19 14:51:32 -04003410 return 1;
3411}
3412
Eric V. Smitha78c7952015-11-03 12:45:05 -05003413/* Used to implement f-strings. Format a single value. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04003414static int
3415compiler_formatted_value(struct compiler *c, expr_ty e)
3416{
Eric V. Smitha78c7952015-11-03 12:45:05 -05003417 /* Our oparg encodes 2 pieces of information: the conversion
3418 character, and whether or not a format_spec was provided.
Eric V. Smith235a6f02015-09-19 14:51:32 -04003419
Eric V. Smitha78c7952015-11-03 12:45:05 -05003420 Convert the conversion char to 2 bits:
3421 None: 000 0x0 FVC_NONE
3422 !s : 001 0x1 FVC_STR
3423 !r : 010 0x2 FVC_REPR
3424 !a : 011 0x3 FVC_ASCII
Eric V. Smith235a6f02015-09-19 14:51:32 -04003425
Eric V. Smitha78c7952015-11-03 12:45:05 -05003426 next bit is whether or not we have a format spec:
3427 yes : 100 0x4
3428 no : 000 0x0
3429 */
Eric V. Smith235a6f02015-09-19 14:51:32 -04003430
Eric V. Smitha78c7952015-11-03 12:45:05 -05003431 int oparg;
Eric V. Smith235a6f02015-09-19 14:51:32 -04003432
Eric V. Smitha78c7952015-11-03 12:45:05 -05003433 /* Evaluate the expression to be formatted. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04003434 VISIT(c, expr, e->v.FormattedValue.value);
3435
Eric V. Smitha78c7952015-11-03 12:45:05 -05003436 switch (e->v.FormattedValue.conversion) {
3437 case 's': oparg = FVC_STR; break;
3438 case 'r': oparg = FVC_REPR; break;
3439 case 'a': oparg = FVC_ASCII; break;
3440 case -1: oparg = FVC_NONE; break;
3441 default:
3442 PyErr_SetString(PyExc_SystemError,
3443 "Unrecognized conversion character");
3444 return 0;
Eric V. Smith235a6f02015-09-19 14:51:32 -04003445 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04003446 if (e->v.FormattedValue.format_spec) {
Eric V. Smitha78c7952015-11-03 12:45:05 -05003447 /* Evaluate the format spec, and update our opcode arg. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04003448 VISIT(c, expr, e->v.FormattedValue.format_spec);
Eric V. Smitha78c7952015-11-03 12:45:05 -05003449 oparg |= FVS_HAVE_SPEC;
Eric V. Smith235a6f02015-09-19 14:51:32 -04003450 }
3451
Eric V. Smitha78c7952015-11-03 12:45:05 -05003452 /* And push our opcode and oparg */
3453 ADDOP_I(c, FORMAT_VALUE, oparg);
Eric V. Smith235a6f02015-09-19 14:51:32 -04003454 return 1;
3455}
3456
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003457static int
3458compiler_subkwargs(struct compiler *c, asdl_seq *keywords, Py_ssize_t begin, Py_ssize_t end)
3459{
3460 Py_ssize_t i, n = end - begin;
3461 keyword_ty kw;
3462 PyObject *keys, *key;
3463 assert(n > 0);
3464 if (n > 1) {
3465 for (i = begin; i < end; i++) {
3466 kw = asdl_seq_GET(keywords, i);
3467 VISIT(c, expr, kw->value);
3468 }
3469 keys = PyTuple_New(n);
3470 if (keys == NULL) {
3471 return 0;
3472 }
3473 for (i = begin; i < end; i++) {
3474 key = ((keyword_ty) asdl_seq_GET(keywords, i))->arg;
3475 Py_INCREF(key);
3476 PyTuple_SET_ITEM(keys, i - begin, key);
3477 }
3478 ADDOP_N(c, LOAD_CONST, keys, consts);
3479 ADDOP_I(c, BUILD_CONST_KEY_MAP, n);
3480 }
3481 else {
3482 /* a for loop only executes once */
3483 for (i = begin; i < end; i++) {
3484 kw = asdl_seq_GET(keywords, i);
3485 ADDOP_O(c, LOAD_CONST, kw->arg, consts);
3486 VISIT(c, expr, kw->value);
3487 }
3488 ADDOP_I(c, BUILD_MAP, n);
3489 }
3490 return 1;
3491}
3492
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003493/* shared code between compiler_call and compiler_class */
3494static int
3495compiler_call_helper(struct compiler *c,
Victor Stinner976bb402016-03-23 11:36:19 +01003496 int n, /* Args already pushed */
Victor Stinnerad9a0662013-11-19 22:23:20 +01003497 asdl_seq *args,
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003498 asdl_seq *keywords)
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003499{
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003500 Py_ssize_t i, nseen, nelts, nkwelts;
3501 int musttupleunpack = 0, mustdictunpack = 0;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003502
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003503 /* the number of tuples and dictionaries on the stack */
3504 Py_ssize_t nsubargs = 0, nsubkwargs = 0;
3505
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003506 nelts = asdl_seq_LEN(args);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003507 nkwelts = asdl_seq_LEN(keywords);
3508
3509 for (i = 0; i < nkwelts; i++) {
3510 keyword_ty kw = asdl_seq_GET(keywords, i);
3511 if (kw->arg == NULL) {
3512 mustdictunpack = 1;
3513 break;
3514 }
3515 }
3516
3517 nseen = n; /* the number of positional arguments on the stack */
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003518 for (i = 0; i < nelts; i++) {
3519 expr_ty elt = asdl_seq_GET(args, i);
3520 if (elt->kind == Starred_kind) {
3521 /* A star-arg. If we've seen positional arguments,
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003522 pack the positional arguments into a tuple. */
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003523 if (nseen) {
3524 ADDOP_I(c, BUILD_TUPLE, nseen);
3525 nseen = 0;
3526 nsubargs++;
3527 }
3528 VISIT(c, expr, elt->v.Starred.value);
3529 nsubargs++;
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003530 musttupleunpack = 1;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003531 }
3532 else {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003533 VISIT(c, expr, elt);
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003534 nseen++;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003535 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003536 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003537
3538 /* Same dance again for keyword arguments */
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003539 if (musttupleunpack || mustdictunpack) {
3540 if (nseen) {
3541 /* Pack up any trailing positional arguments. */
3542 ADDOP_I(c, BUILD_TUPLE, nseen);
3543 nsubargs++;
3544 }
3545 if (musttupleunpack || nsubargs > 1) {
3546 /* If we ended up with more than one stararg, we need
3547 to concatenate them into a single sequence. */
3548 ADDOP_I(c, BUILD_TUPLE_UNPACK, nsubargs);
3549 }
3550 else if (nsubargs == 0) {
3551 ADDOP_I(c, BUILD_TUPLE, 0);
3552 }
3553 nseen = 0; /* the number of keyword arguments on the stack following */
3554 for (i = 0; i < nkwelts; i++) {
3555 keyword_ty kw = asdl_seq_GET(keywords, i);
3556 if (kw->arg == NULL) {
3557 /* A keyword argument unpacking. */
3558 if (nseen) {
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003559 if (!compiler_subkwargs(c, keywords, i - nseen, i))
3560 return 0;
3561 nsubkwargs++;
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003562 nseen = 0;
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003563 }
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003564 VISIT(c, expr, kw->value);
3565 nsubkwargs++;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003566 }
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003567 else {
3568 nseen++;
3569 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003570 }
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003571 if (nseen) {
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003572 /* Pack up any trailing keyword arguments. */
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003573 if (!compiler_subkwargs(c, keywords, nkwelts - nseen, nkwelts))
Serhiy Storchaka6a7506a2016-06-12 00:39:41 +03003574 return 0;
3575 nsubkwargs++;
3576 }
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003577 if (mustdictunpack || nsubkwargs > 1) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003578 /* Pack it all up */
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003579 ADDOP_I(c, BUILD_MAP_UNPACK_WITH_CALL, nsubkwargs);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003580 }
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003581 ADDOP_I(c, CALL_FUNCTION_EX, nsubkwargs > 0);
3582 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003583 }
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003584 else if (nkwelts) {
3585 PyObject *names;
3586 VISIT_SEQ(c, keyword, keywords);
3587 names = PyTuple_New(nkwelts);
3588 if (names == NULL) {
3589 return 0;
3590 }
3591 for (i = 0; i < nkwelts; i++) {
3592 keyword_ty kw = asdl_seq_GET(keywords, i);
3593 Py_INCREF(kw->arg);
3594 PyTuple_SET_ITEM(names, i, kw->arg);
3595 }
3596 ADDOP_N(c, LOAD_CONST, names, consts);
3597 ADDOP_I(c, CALL_FUNCTION_KW, n + nelts + nkwelts);
3598 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003599 }
Victor Stinnerf9b760f2016-09-09 10:17:08 -07003600 else {
3601 ADDOP_I(c, CALL_FUNCTION, n + nelts);
3602 return 1;
3603 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003604}
3605
Nick Coghlan650f0d02007-04-15 12:05:43 +00003606
3607/* List and set comprehensions and generator expressions work by creating a
3608 nested function to perform the actual iteration. This means that the
3609 iteration variables don't leak into the current scope.
3610 The defined function is called immediately following its definition, with the
3611 result of that call being the result of the expression.
3612 The LC/SC version returns the populated container, while the GE version is
3613 flagged in symtable.c as a generator, so it returns the generator object
3614 when the function is called.
3615 This code *knows* that the loop cannot contain break, continue, or return,
3616 so it cheats and skips the SETUP_LOOP/POP_BLOCK steps used in normal loops.
3617
3618 Possible cleanups:
3619 - iterate over the generator sequence instead of using recursion
3620*/
3621
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07003622
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003623static int
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003624compiler_comprehension_generator(struct compiler *c,
3625 asdl_seq *generators, int gen_index,
3626 expr_ty elt, expr_ty val, int type)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003627{
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07003628 comprehension_ty gen;
3629 gen = (comprehension_ty)asdl_seq_GET(generators, gen_index);
3630 if (gen->is_async) {
3631 return compiler_async_comprehension_generator(
3632 c, generators, gen_index, elt, val, type);
3633 } else {
3634 return compiler_sync_comprehension_generator(
3635 c, generators, gen_index, elt, val, type);
3636 }
3637}
3638
3639static int
3640compiler_sync_comprehension_generator(struct compiler *c,
3641 asdl_seq *generators, int gen_index,
3642 expr_ty elt, expr_ty val, int type)
3643{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003644 /* generate code for the iterator, then each of the ifs,
3645 and then write to the element */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003646
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003647 comprehension_ty gen;
3648 basicblock *start, *anchor, *skip, *if_cleanup;
Victor Stinnerad9a0662013-11-19 22:23:20 +01003649 Py_ssize_t i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003650
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003651 start = compiler_new_block(c);
3652 skip = compiler_new_block(c);
3653 if_cleanup = compiler_new_block(c);
3654 anchor = compiler_new_block(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003655
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003656 if (start == NULL || skip == NULL || if_cleanup == NULL ||
3657 anchor == NULL)
3658 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003659
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003660 gen = (comprehension_ty)asdl_seq_GET(generators, gen_index);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003661
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003662 if (gen_index == 0) {
3663 /* Receive outermost iter as an implicit argument */
3664 c->u->u_argcount = 1;
3665 ADDOP_I(c, LOAD_FAST, 0);
3666 }
3667 else {
3668 /* Sub-iter - calculate on the fly */
3669 VISIT(c, expr, gen->iter);
3670 ADDOP(c, GET_ITER);
3671 }
3672 compiler_use_next_block(c, start);
3673 ADDOP_JREL(c, FOR_ITER, anchor);
3674 NEXT_BLOCK(c);
3675 VISIT(c, expr, gen->target);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003676
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003677 /* XXX this needs to be cleaned up...a lot! */
3678 n = asdl_seq_LEN(gen->ifs);
3679 for (i = 0; i < n; i++) {
3680 expr_ty e = (expr_ty)asdl_seq_GET(gen->ifs, i);
3681 VISIT(c, expr, e);
3682 ADDOP_JABS(c, POP_JUMP_IF_FALSE, if_cleanup);
3683 NEXT_BLOCK(c);
3684 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003685
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003686 if (++gen_index < asdl_seq_LEN(generators))
3687 if (!compiler_comprehension_generator(c,
3688 generators, gen_index,
3689 elt, val, type))
3690 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003691
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003692 /* only append after the last for generator */
3693 if (gen_index >= asdl_seq_LEN(generators)) {
3694 /* comprehension specific code */
3695 switch (type) {
3696 case COMP_GENEXP:
3697 VISIT(c, expr, elt);
3698 ADDOP(c, YIELD_VALUE);
3699 ADDOP(c, POP_TOP);
3700 break;
3701 case COMP_LISTCOMP:
3702 VISIT(c, expr, elt);
3703 ADDOP_I(c, LIST_APPEND, gen_index + 1);
3704 break;
3705 case COMP_SETCOMP:
3706 VISIT(c, expr, elt);
3707 ADDOP_I(c, SET_ADD, gen_index + 1);
3708 break;
3709 case COMP_DICTCOMP:
3710 /* With 'd[k] = v', v is evaluated before k, so we do
3711 the same. */
3712 VISIT(c, expr, val);
3713 VISIT(c, expr, elt);
3714 ADDOP_I(c, MAP_ADD, gen_index + 1);
3715 break;
3716 default:
3717 return 0;
3718 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003719
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003720 compiler_use_next_block(c, skip);
3721 }
3722 compiler_use_next_block(c, if_cleanup);
3723 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
3724 compiler_use_next_block(c, anchor);
3725
3726 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003727}
3728
3729static int
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07003730compiler_async_comprehension_generator(struct compiler *c,
3731 asdl_seq *generators, int gen_index,
3732 expr_ty elt, expr_ty val, int type)
3733{
3734 _Py_IDENTIFIER(StopAsyncIteration);
3735
3736 comprehension_ty gen;
3737 basicblock *anchor, *skip, *if_cleanup, *try,
3738 *after_try, *except, *try_cleanup;
3739 Py_ssize_t i, n;
3740
3741 PyObject *stop_aiter_error = _PyUnicode_FromId(&PyId_StopAsyncIteration);
3742 if (stop_aiter_error == NULL) {
3743 return 0;
3744 }
3745
3746 try = compiler_new_block(c);
3747 after_try = compiler_new_block(c);
3748 try_cleanup = compiler_new_block(c);
3749 except = compiler_new_block(c);
3750 skip = compiler_new_block(c);
3751 if_cleanup = compiler_new_block(c);
3752 anchor = compiler_new_block(c);
3753
3754 if (skip == NULL || if_cleanup == NULL || anchor == NULL ||
3755 try == NULL || after_try == NULL ||
3756 except == NULL || after_try == NULL) {
3757 return 0;
3758 }
3759
3760 gen = (comprehension_ty)asdl_seq_GET(generators, gen_index);
3761
3762 if (gen_index == 0) {
3763 /* Receive outermost iter as an implicit argument */
3764 c->u->u_argcount = 1;
3765 ADDOP_I(c, LOAD_FAST, 0);
3766 }
3767 else {
3768 /* Sub-iter - calculate on the fly */
3769 VISIT(c, expr, gen->iter);
3770 ADDOP(c, GET_AITER);
3771 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3772 ADDOP(c, YIELD_FROM);
3773 }
3774
3775 compiler_use_next_block(c, try);
3776
3777
3778 ADDOP_JREL(c, SETUP_EXCEPT, except);
3779 if (!compiler_push_fblock(c, EXCEPT, try))
3780 return 0;
3781
3782 ADDOP(c, GET_ANEXT);
3783 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3784 ADDOP(c, YIELD_FROM);
3785 VISIT(c, expr, gen->target);
3786 ADDOP(c, POP_BLOCK);
3787 compiler_pop_fblock(c, EXCEPT, try);
3788 ADDOP_JREL(c, JUMP_FORWARD, after_try);
3789
3790
3791 compiler_use_next_block(c, except);
3792 ADDOP(c, DUP_TOP);
3793 ADDOP_O(c, LOAD_GLOBAL, stop_aiter_error, names);
3794 ADDOP_I(c, COMPARE_OP, PyCmp_EXC_MATCH);
3795 ADDOP_JABS(c, POP_JUMP_IF_FALSE, try_cleanup);
3796
3797 ADDOP(c, POP_TOP);
3798 ADDOP(c, POP_TOP);
3799 ADDOP(c, POP_TOP);
3800 ADDOP(c, POP_EXCEPT); /* for SETUP_EXCEPT */
3801 ADDOP_JABS(c, JUMP_ABSOLUTE, anchor);
3802
3803
3804 compiler_use_next_block(c, try_cleanup);
3805 ADDOP(c, END_FINALLY);
3806
3807 compiler_use_next_block(c, after_try);
3808
3809 n = asdl_seq_LEN(gen->ifs);
3810 for (i = 0; i < n; i++) {
3811 expr_ty e = (expr_ty)asdl_seq_GET(gen->ifs, i);
3812 VISIT(c, expr, e);
3813 ADDOP_JABS(c, POP_JUMP_IF_FALSE, if_cleanup);
3814 NEXT_BLOCK(c);
3815 }
3816
3817 if (++gen_index < asdl_seq_LEN(generators))
3818 if (!compiler_comprehension_generator(c,
3819 generators, gen_index,
3820 elt, val, type))
3821 return 0;
3822
3823 /* only append after the last for generator */
3824 if (gen_index >= asdl_seq_LEN(generators)) {
3825 /* comprehension specific code */
3826 switch (type) {
3827 case COMP_GENEXP:
3828 VISIT(c, expr, elt);
3829 ADDOP(c, YIELD_VALUE);
3830 ADDOP(c, POP_TOP);
3831 break;
3832 case COMP_LISTCOMP:
3833 VISIT(c, expr, elt);
3834 ADDOP_I(c, LIST_APPEND, gen_index + 1);
3835 break;
3836 case COMP_SETCOMP:
3837 VISIT(c, expr, elt);
3838 ADDOP_I(c, SET_ADD, gen_index + 1);
3839 break;
3840 case COMP_DICTCOMP:
3841 /* With 'd[k] = v', v is evaluated before k, so we do
3842 the same. */
3843 VISIT(c, expr, val);
3844 VISIT(c, expr, elt);
3845 ADDOP_I(c, MAP_ADD, gen_index + 1);
3846 break;
3847 default:
3848 return 0;
3849 }
3850
3851 compiler_use_next_block(c, skip);
3852 }
3853 compiler_use_next_block(c, if_cleanup);
3854 ADDOP_JABS(c, JUMP_ABSOLUTE, try);
3855 compiler_use_next_block(c, anchor);
3856 ADDOP(c, POP_TOP);
3857
3858 return 1;
3859}
3860
3861static int
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003862compiler_comprehension(struct compiler *c, expr_ty e, int type,
3863 identifier name, asdl_seq *generators, expr_ty elt,
3864 expr_ty val)
Nick Coghlan650f0d02007-04-15 12:05:43 +00003865{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003866 PyCodeObject *co = NULL;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07003867 comprehension_ty outermost;
Antoine Pitrou86a36b52011-11-25 18:56:07 +01003868 PyObject *qualname = NULL;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07003869 int is_async_function = c->u->u_ste->ste_coroutine;
3870 int is_async_generator = 0;
Nick Coghlan650f0d02007-04-15 12:05:43 +00003871
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07003872 outermost = (comprehension_ty) asdl_seq_GET(generators, 0);
Nick Coghlan650f0d02007-04-15 12:05:43 +00003873
Antoine Pitrou86a36b52011-11-25 18:56:07 +01003874 if (!compiler_enter_scope(c, name, COMPILER_SCOPE_COMPREHENSION,
3875 (void *)e, e->lineno))
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07003876 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003877 goto error;
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07003878 }
3879
3880 is_async_generator = c->u->u_ste->ste_coroutine;
3881
3882 if (is_async_generator && !is_async_function) {
3883 if (e->lineno > c->u->u_lineno) {
3884 c->u->u_lineno = e->lineno;
3885 c->u->u_lineno_set = 0;
3886 }
3887 compiler_error(c, "asynchronous comprehension outside of "
3888 "an asynchronous function");
3889 goto error_in_scope;
3890 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00003891
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003892 if (type != COMP_GENEXP) {
3893 int op;
3894 switch (type) {
3895 case COMP_LISTCOMP:
3896 op = BUILD_LIST;
3897 break;
3898 case COMP_SETCOMP:
3899 op = BUILD_SET;
3900 break;
3901 case COMP_DICTCOMP:
3902 op = BUILD_MAP;
3903 break;
3904 default:
3905 PyErr_Format(PyExc_SystemError,
3906 "unknown comprehension type %d", type);
3907 goto error_in_scope;
3908 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00003909
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003910 ADDOP_I(c, op, 0);
3911 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00003912
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003913 if (!compiler_comprehension_generator(c, generators, 0, elt,
3914 val, type))
3915 goto error_in_scope;
Nick Coghlan650f0d02007-04-15 12:05:43 +00003916
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003917 if (type != COMP_GENEXP) {
3918 ADDOP(c, RETURN_VALUE);
3919 }
3920
3921 co = assemble(c, 1);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04003922 qualname = c->u->u_qualname;
3923 Py_INCREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003924 compiler_exit_scope(c);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04003925 if (co == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003926 goto error;
3927
Antoine Pitrou86a36b52011-11-25 18:56:07 +01003928 if (!compiler_make_closure(c, co, 0, qualname))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003929 goto error;
Antoine Pitrou86a36b52011-11-25 18:56:07 +01003930 Py_DECREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003931 Py_DECREF(co);
3932
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07003933 VISIT(c, expr, outermost->iter);
3934
3935 if (outermost->is_async) {
3936 ADDOP(c, GET_AITER);
3937 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3938 ADDOP(c, YIELD_FROM);
3939 } else {
3940 ADDOP(c, GET_ITER);
3941 }
3942
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003943 ADDOP_I(c, CALL_FUNCTION, 1);
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07003944
3945 if (is_async_generator && type != COMP_GENEXP) {
3946 ADDOP(c, GET_AWAITABLE);
3947 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3948 ADDOP(c, YIELD_FROM);
3949 }
3950
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003951 return 1;
Nick Coghlan650f0d02007-04-15 12:05:43 +00003952error_in_scope:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003953 compiler_exit_scope(c);
Nick Coghlan650f0d02007-04-15 12:05:43 +00003954error:
Antoine Pitrou86a36b52011-11-25 18:56:07 +01003955 Py_XDECREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003956 Py_XDECREF(co);
3957 return 0;
Nick Coghlan650f0d02007-04-15 12:05:43 +00003958}
3959
3960static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003961compiler_genexp(struct compiler *c, expr_ty e)
3962{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003963 static identifier name;
3964 if (!name) {
3965 name = PyUnicode_FromString("<genexpr>");
3966 if (!name)
3967 return 0;
3968 }
3969 assert(e->kind == GeneratorExp_kind);
3970 return compiler_comprehension(c, e, COMP_GENEXP, name,
3971 e->v.GeneratorExp.generators,
3972 e->v.GeneratorExp.elt, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003973}
3974
3975static int
Nick Coghlan650f0d02007-04-15 12:05:43 +00003976compiler_listcomp(struct compiler *c, expr_ty e)
3977{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003978 static identifier name;
3979 if (!name) {
3980 name = PyUnicode_FromString("<listcomp>");
3981 if (!name)
3982 return 0;
3983 }
3984 assert(e->kind == ListComp_kind);
3985 return compiler_comprehension(c, e, COMP_LISTCOMP, name,
3986 e->v.ListComp.generators,
3987 e->v.ListComp.elt, NULL);
Nick Coghlan650f0d02007-04-15 12:05:43 +00003988}
3989
3990static int
3991compiler_setcomp(struct compiler *c, expr_ty e)
3992{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003993 static identifier name;
3994 if (!name) {
3995 name = PyUnicode_FromString("<setcomp>");
3996 if (!name)
3997 return 0;
3998 }
3999 assert(e->kind == SetComp_kind);
4000 return compiler_comprehension(c, e, COMP_SETCOMP, name,
4001 e->v.SetComp.generators,
4002 e->v.SetComp.elt, NULL);
Guido van Rossum992d4a32007-07-11 13:09:30 +00004003}
4004
4005
4006static int
4007compiler_dictcomp(struct compiler *c, expr_ty e)
4008{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004009 static identifier name;
4010 if (!name) {
4011 name = PyUnicode_FromString("<dictcomp>");
4012 if (!name)
4013 return 0;
4014 }
4015 assert(e->kind == DictComp_kind);
4016 return compiler_comprehension(c, e, COMP_DICTCOMP, name,
4017 e->v.DictComp.generators,
4018 e->v.DictComp.key, e->v.DictComp.value);
Nick Coghlan650f0d02007-04-15 12:05:43 +00004019}
4020
4021
4022static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004023compiler_visit_keyword(struct compiler *c, keyword_ty k)
4024{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004025 VISIT(c, expr, k->value);
4026 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004027}
4028
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004029/* Test whether expression is constant. For constants, report
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004030 whether they are true or false.
4031
4032 Return values: 1 for true, 0 for false, -1 for non-constant.
4033 */
4034
4035static int
Georg Brandl8334fd92010-12-04 10:26:46 +00004036expr_constant(struct compiler *c, expr_ty e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004037{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004038 char *id;
4039 switch (e->kind) {
4040 case Ellipsis_kind:
4041 return 1;
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01004042 case Constant_kind:
4043 return PyObject_IsTrue(e->v.Constant.value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004044 case Num_kind:
4045 return PyObject_IsTrue(e->v.Num.n);
4046 case Str_kind:
4047 return PyObject_IsTrue(e->v.Str.s);
4048 case Name_kind:
4049 /* optimize away names that can't be reassigned */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02004050 id = PyUnicode_AsUTF8(e->v.Name.id);
Benjamin Peterson442f2092012-12-06 17:41:04 -05004051 if (id && strcmp(id, "__debug__") == 0)
4052 return !c->c_optimize;
4053 return -1;
4054 case NameConstant_kind: {
4055 PyObject *o = e->v.NameConstant.value;
4056 if (o == Py_None)
4057 return 0;
4058 else if (o == Py_True)
4059 return 1;
4060 else if (o == Py_False)
4061 return 0;
4062 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004063 default:
4064 return -1;
4065 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004066}
4067
Yury Selivanov75445082015-05-11 22:57:16 -04004068
4069/*
4070 Implements the async with statement.
4071
4072 The semantics outlined in that PEP are as follows:
4073
4074 async with EXPR as VAR:
4075 BLOCK
4076
4077 It is implemented roughly as:
4078
4079 context = EXPR
4080 exit = context.__aexit__ # not calling it
4081 value = await context.__aenter__()
4082 try:
4083 VAR = value # if VAR present in the syntax
4084 BLOCK
4085 finally:
4086 if an exception was raised:
Serhiy Storchakaec466a12015-06-11 00:09:32 +03004087 exc = copy of (exception, instance, traceback)
Yury Selivanov75445082015-05-11 22:57:16 -04004088 else:
Serhiy Storchakaec466a12015-06-11 00:09:32 +03004089 exc = (None, None, None)
Yury Selivanov75445082015-05-11 22:57:16 -04004090 if not (await exit(*exc)):
4091 raise
4092 */
4093static int
4094compiler_async_with(struct compiler *c, stmt_ty s, int pos)
4095{
4096 basicblock *block, *finally;
4097 withitem_ty item = asdl_seq_GET(s->v.AsyncWith.items, pos);
4098
4099 assert(s->kind == AsyncWith_kind);
4100
4101 block = compiler_new_block(c);
4102 finally = compiler_new_block(c);
4103 if (!block || !finally)
4104 return 0;
4105
4106 /* Evaluate EXPR */
4107 VISIT(c, expr, item->context_expr);
4108
4109 ADDOP(c, BEFORE_ASYNC_WITH);
4110 ADDOP(c, GET_AWAITABLE);
4111 ADDOP_O(c, LOAD_CONST, Py_None, consts);
4112 ADDOP(c, YIELD_FROM);
4113
4114 ADDOP_JREL(c, SETUP_ASYNC_WITH, finally);
4115
4116 /* SETUP_ASYNC_WITH pushes a finally block. */
4117 compiler_use_next_block(c, block);
4118 if (!compiler_push_fblock(c, FINALLY_TRY, block)) {
4119 return 0;
4120 }
4121
4122 if (item->optional_vars) {
4123 VISIT(c, expr, item->optional_vars);
4124 }
4125 else {
4126 /* Discard result from context.__aenter__() */
4127 ADDOP(c, POP_TOP);
4128 }
4129
4130 pos++;
4131 if (pos == asdl_seq_LEN(s->v.AsyncWith.items))
4132 /* BLOCK code */
4133 VISIT_SEQ(c, stmt, s->v.AsyncWith.body)
4134 else if (!compiler_async_with(c, s, pos))
4135 return 0;
4136
4137 /* End of try block; start the finally block */
4138 ADDOP(c, POP_BLOCK);
4139 compiler_pop_fblock(c, FINALLY_TRY, block);
4140
4141 ADDOP_O(c, LOAD_CONST, Py_None, consts);
4142 compiler_use_next_block(c, finally);
4143 if (!compiler_push_fblock(c, FINALLY_END, finally))
4144 return 0;
4145
4146 /* Finally block starts; context.__exit__ is on the stack under
4147 the exception or return information. Just issue our magic
4148 opcode. */
4149 ADDOP(c, WITH_CLEANUP_START);
4150
4151 ADDOP(c, GET_AWAITABLE);
4152 ADDOP_O(c, LOAD_CONST, Py_None, consts);
4153 ADDOP(c, YIELD_FROM);
4154
4155 ADDOP(c, WITH_CLEANUP_FINISH);
4156
4157 /* Finally block ends. */
4158 ADDOP(c, END_FINALLY);
4159 compiler_pop_fblock(c, FINALLY_END, finally);
4160 return 1;
4161}
4162
4163
Guido van Rossumc2e20742006-02-27 22:32:47 +00004164/*
4165 Implements the with statement from PEP 343.
4166
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004167 The semantics outlined in that PEP are as follows:
Guido van Rossumc2e20742006-02-27 22:32:47 +00004168
4169 with EXPR as VAR:
4170 BLOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004171
Guido van Rossumc2e20742006-02-27 22:32:47 +00004172 It is implemented roughly as:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004173
Thomas Wouters477c8d52006-05-27 19:21:47 +00004174 context = EXPR
Guido van Rossumc2e20742006-02-27 22:32:47 +00004175 exit = context.__exit__ # not calling it
4176 value = context.__enter__()
4177 try:
4178 VAR = value # if VAR present in the syntax
4179 BLOCK
4180 finally:
4181 if an exception was raised:
Serhiy Storchakad741a882015-06-11 00:06:39 +03004182 exc = copy of (exception, instance, traceback)
Guido van Rossumc2e20742006-02-27 22:32:47 +00004183 else:
Serhiy Storchakad741a882015-06-11 00:06:39 +03004184 exc = (None, None, None)
Guido van Rossumc2e20742006-02-27 22:32:47 +00004185 exit(*exc)
4186 */
4187static int
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004188compiler_with(struct compiler *c, stmt_ty s, int pos)
Guido van Rossumc2e20742006-02-27 22:32:47 +00004189{
Guido van Rossumc2e20742006-02-27 22:32:47 +00004190 basicblock *block, *finally;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004191 withitem_ty item = asdl_seq_GET(s->v.With.items, pos);
Guido van Rossumc2e20742006-02-27 22:32:47 +00004192
4193 assert(s->kind == With_kind);
4194
Guido van Rossumc2e20742006-02-27 22:32:47 +00004195 block = compiler_new_block(c);
4196 finally = compiler_new_block(c);
4197 if (!block || !finally)
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00004198 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00004199
Thomas Wouters477c8d52006-05-27 19:21:47 +00004200 /* Evaluate EXPR */
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004201 VISIT(c, expr, item->context_expr);
Benjamin Peterson876b2f22009-06-28 03:18:59 +00004202 ADDOP_JREL(c, SETUP_WITH, finally);
Guido van Rossumc2e20742006-02-27 22:32:47 +00004203
Benjamin Peterson876b2f22009-06-28 03:18:59 +00004204 /* SETUP_WITH pushes a finally block. */
Guido van Rossumc2e20742006-02-27 22:32:47 +00004205 compiler_use_next_block(c, block);
4206 if (!compiler_push_fblock(c, FINALLY_TRY, block)) {
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00004207 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00004208 }
4209
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004210 if (item->optional_vars) {
4211 VISIT(c, expr, item->optional_vars);
Benjamin Peterson876b2f22009-06-28 03:18:59 +00004212 }
4213 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004214 /* Discard result from context.__enter__() */
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00004215 ADDOP(c, POP_TOP);
Guido van Rossumc2e20742006-02-27 22:32:47 +00004216 }
4217
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05004218 pos++;
4219 if (pos == asdl_seq_LEN(s->v.With.items))
4220 /* BLOCK code */
4221 VISIT_SEQ(c, stmt, s->v.With.body)
4222 else if (!compiler_with(c, s, pos))
4223 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00004224
4225 /* End of try block; start the finally block */
4226 ADDOP(c, POP_BLOCK);
4227 compiler_pop_fblock(c, FINALLY_TRY, block);
4228
4229 ADDOP_O(c, LOAD_CONST, Py_None, consts);
4230 compiler_use_next_block(c, finally);
4231 if (!compiler_push_fblock(c, FINALLY_END, finally))
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00004232 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00004233
Christian Heimesdd15f6c2008-03-16 00:07:10 +00004234 /* Finally block starts; context.__exit__ is on the stack under
4235 the exception or return information. Just issue our magic
4236 opcode. */
Yury Selivanov75445082015-05-11 22:57:16 -04004237 ADDOP(c, WITH_CLEANUP_START);
4238 ADDOP(c, WITH_CLEANUP_FINISH);
Guido van Rossumc2e20742006-02-27 22:32:47 +00004239
4240 /* Finally block ends. */
4241 ADDOP(c, END_FINALLY);
4242 compiler_pop_fblock(c, FINALLY_END, finally);
4243 return 1;
4244}
4245
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004246static int
4247compiler_visit_expr(struct compiler *c, expr_ty e)
4248{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004249 /* If expr e has a different line number than the last expr/stmt,
4250 set a new line number for the next instruction.
4251 */
4252 if (e->lineno > c->u->u_lineno) {
4253 c->u->u_lineno = e->lineno;
4254 c->u->u_lineno_set = 0;
4255 }
Benjamin Petersond4efd9e2010-09-20 23:02:10 +00004256 /* Updating the column offset is always harmless. */
4257 c->u->u_col_offset = e->col_offset;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004258 switch (e->kind) {
4259 case BoolOp_kind:
4260 return compiler_boolop(c, e);
4261 case BinOp_kind:
4262 VISIT(c, expr, e->v.BinOp.left);
4263 VISIT(c, expr, e->v.BinOp.right);
4264 ADDOP(c, binop(c, e->v.BinOp.op));
4265 break;
4266 case UnaryOp_kind:
4267 VISIT(c, expr, e->v.UnaryOp.operand);
4268 ADDOP(c, unaryop(e->v.UnaryOp.op));
4269 break;
4270 case Lambda_kind:
4271 return compiler_lambda(c, e);
4272 case IfExp_kind:
4273 return compiler_ifexp(c, e);
4274 case Dict_kind:
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004275 return compiler_dict(c, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004276 case Set_kind:
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004277 return compiler_set(c, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004278 case GeneratorExp_kind:
4279 return compiler_genexp(c, e);
4280 case ListComp_kind:
4281 return compiler_listcomp(c, e);
4282 case SetComp_kind:
4283 return compiler_setcomp(c, e);
4284 case DictComp_kind:
4285 return compiler_dictcomp(c, e);
4286 case Yield_kind:
4287 if (c->u->u_ste->ste_type != FunctionBlock)
4288 return compiler_error(c, "'yield' outside function");
Mark Dickinsonded35ae2012-11-25 14:36:26 +00004289 if (e->v.Yield.value) {
4290 VISIT(c, expr, e->v.Yield.value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004291 }
4292 else {
4293 ADDOP_O(c, LOAD_CONST, Py_None, consts);
4294 }
Mark Dickinsonded35ae2012-11-25 14:36:26 +00004295 ADDOP(c, YIELD_VALUE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004296 break;
Mark Dickinsonded35ae2012-11-25 14:36:26 +00004297 case YieldFrom_kind:
4298 if (c->u->u_ste->ste_type != FunctionBlock)
4299 return compiler_error(c, "'yield' outside function");
Yury Selivanov75445082015-05-11 22:57:16 -04004300
4301 if (c->u->u_scope_type == COMPILER_SCOPE_ASYNC_FUNCTION)
4302 return compiler_error(c, "'yield from' inside async function");
4303
Mark Dickinsonded35ae2012-11-25 14:36:26 +00004304 VISIT(c, expr, e->v.YieldFrom.value);
Yury Selivanov5376ba92015-06-22 12:19:30 -04004305 ADDOP(c, GET_YIELD_FROM_ITER);
Mark Dickinsonded35ae2012-11-25 14:36:26 +00004306 ADDOP_O(c, LOAD_CONST, Py_None, consts);
4307 ADDOP(c, YIELD_FROM);
4308 break;
Yury Selivanov75445082015-05-11 22:57:16 -04004309 case Await_kind:
4310 if (c->u->u_ste->ste_type != FunctionBlock)
4311 return compiler_error(c, "'await' outside function");
4312
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07004313 if (c->u->u_scope_type != COMPILER_SCOPE_ASYNC_FUNCTION &&
4314 c->u->u_scope_type != COMPILER_SCOPE_COMPREHENSION)
Yury Selivanov75445082015-05-11 22:57:16 -04004315 return compiler_error(c, "'await' outside async function");
4316
4317 VISIT(c, expr, e->v.Await.value);
4318 ADDOP(c, GET_AWAITABLE);
4319 ADDOP_O(c, LOAD_CONST, Py_None, consts);
4320 ADDOP(c, YIELD_FROM);
4321 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004322 case Compare_kind:
4323 return compiler_compare(c, e);
4324 case Call_kind:
4325 return compiler_call(c, e);
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01004326 case Constant_kind:
4327 ADDOP_O(c, LOAD_CONST, e->v.Constant.value, consts);
4328 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004329 case Num_kind:
4330 ADDOP_O(c, LOAD_CONST, e->v.Num.n, consts);
4331 break;
4332 case Str_kind:
4333 ADDOP_O(c, LOAD_CONST, e->v.Str.s, consts);
4334 break;
Eric V. Smith235a6f02015-09-19 14:51:32 -04004335 case JoinedStr_kind:
4336 return compiler_joined_str(c, e);
4337 case FormattedValue_kind:
4338 return compiler_formatted_value(c, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004339 case Bytes_kind:
4340 ADDOP_O(c, LOAD_CONST, e->v.Bytes.s, consts);
4341 break;
4342 case Ellipsis_kind:
4343 ADDOP_O(c, LOAD_CONST, Py_Ellipsis, consts);
4344 break;
Benjamin Peterson442f2092012-12-06 17:41:04 -05004345 case NameConstant_kind:
4346 ADDOP_O(c, LOAD_CONST, e->v.NameConstant.value, consts);
4347 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004348 /* The following exprs can be assignment targets. */
4349 case Attribute_kind:
4350 if (e->v.Attribute.ctx != AugStore)
4351 VISIT(c, expr, e->v.Attribute.value);
4352 switch (e->v.Attribute.ctx) {
4353 case AugLoad:
4354 ADDOP(c, DUP_TOP);
4355 /* Fall through to load */
4356 case Load:
4357 ADDOP_NAME(c, LOAD_ATTR, e->v.Attribute.attr, names);
4358 break;
4359 case AugStore:
4360 ADDOP(c, ROT_TWO);
4361 /* Fall through to save */
4362 case Store:
4363 ADDOP_NAME(c, STORE_ATTR, e->v.Attribute.attr, names);
4364 break;
4365 case Del:
4366 ADDOP_NAME(c, DELETE_ATTR, e->v.Attribute.attr, names);
4367 break;
4368 case Param:
4369 default:
4370 PyErr_SetString(PyExc_SystemError,
4371 "param invalid in attribute expression");
4372 return 0;
4373 }
4374 break;
4375 case Subscript_kind:
4376 switch (e->v.Subscript.ctx) {
4377 case AugLoad:
4378 VISIT(c, expr, e->v.Subscript.value);
4379 VISIT_SLICE(c, e->v.Subscript.slice, AugLoad);
4380 break;
4381 case Load:
4382 VISIT(c, expr, e->v.Subscript.value);
4383 VISIT_SLICE(c, e->v.Subscript.slice, Load);
4384 break;
4385 case AugStore:
4386 VISIT_SLICE(c, e->v.Subscript.slice, AugStore);
4387 break;
4388 case Store:
4389 VISIT(c, expr, e->v.Subscript.value);
4390 VISIT_SLICE(c, e->v.Subscript.slice, Store);
4391 break;
4392 case Del:
4393 VISIT(c, expr, e->v.Subscript.value);
4394 VISIT_SLICE(c, e->v.Subscript.slice, Del);
4395 break;
4396 case Param:
4397 default:
4398 PyErr_SetString(PyExc_SystemError,
4399 "param invalid in subscript expression");
4400 return 0;
4401 }
4402 break;
4403 case Starred_kind:
4404 switch (e->v.Starred.ctx) {
4405 case Store:
4406 /* In all legitimate cases, the Starred node was already replaced
4407 * by compiler_list/compiler_tuple. XXX: is that okay? */
4408 return compiler_error(c,
4409 "starred assignment target must be in a list or tuple");
4410 default:
4411 return compiler_error(c,
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004412 "can't use starred expression here");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004413 }
4414 break;
4415 case Name_kind:
4416 return compiler_nameop(c, e->v.Name.id, e->v.Name.ctx);
4417 /* child nodes of List and Tuple will have expr_context set */
4418 case List_kind:
4419 return compiler_list(c, e);
4420 case Tuple_kind:
4421 return compiler_tuple(c, e);
4422 }
4423 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004424}
4425
4426static int
4427compiler_augassign(struct compiler *c, stmt_ty s)
4428{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004429 expr_ty e = s->v.AugAssign.target;
4430 expr_ty auge;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004431
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004432 assert(s->kind == AugAssign_kind);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004433
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004434 switch (e->kind) {
4435 case Attribute_kind:
4436 auge = Attribute(e->v.Attribute.value, e->v.Attribute.attr,
4437 AugLoad, e->lineno, e->col_offset, c->c_arena);
4438 if (auge == NULL)
4439 return 0;
4440 VISIT(c, expr, auge);
4441 VISIT(c, expr, s->v.AugAssign.value);
4442 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
4443 auge->v.Attribute.ctx = AugStore;
4444 VISIT(c, expr, auge);
4445 break;
4446 case Subscript_kind:
4447 auge = Subscript(e->v.Subscript.value, e->v.Subscript.slice,
4448 AugLoad, e->lineno, e->col_offset, c->c_arena);
4449 if (auge == NULL)
4450 return 0;
4451 VISIT(c, expr, auge);
4452 VISIT(c, expr, s->v.AugAssign.value);
4453 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
4454 auge->v.Subscript.ctx = AugStore;
4455 VISIT(c, expr, auge);
4456 break;
4457 case Name_kind:
4458 if (!compiler_nameop(c, e->v.Name.id, Load))
4459 return 0;
4460 VISIT(c, expr, s->v.AugAssign.value);
4461 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
4462 return compiler_nameop(c, e->v.Name.id, Store);
4463 default:
4464 PyErr_Format(PyExc_SystemError,
4465 "invalid node type (%d) for augmented assignment",
4466 e->kind);
4467 return 0;
4468 }
4469 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004470}
4471
4472static int
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07004473check_ann_expr(struct compiler *c, expr_ty e)
4474{
4475 VISIT(c, expr, e);
4476 ADDOP(c, POP_TOP);
4477 return 1;
4478}
4479
4480static int
4481check_annotation(struct compiler *c, stmt_ty s)
4482{
4483 /* Annotations are only evaluated in a module or class. */
4484 if (c->u->u_scope_type == COMPILER_SCOPE_MODULE ||
4485 c->u->u_scope_type == COMPILER_SCOPE_CLASS) {
4486 return check_ann_expr(c, s->v.AnnAssign.annotation);
4487 }
4488 return 1;
4489}
4490
4491static int
4492check_ann_slice(struct compiler *c, slice_ty sl)
4493{
4494 switch(sl->kind) {
4495 case Index_kind:
4496 return check_ann_expr(c, sl->v.Index.value);
4497 case Slice_kind:
4498 if (sl->v.Slice.lower && !check_ann_expr(c, sl->v.Slice.lower)) {
4499 return 0;
4500 }
4501 if (sl->v.Slice.upper && !check_ann_expr(c, sl->v.Slice.upper)) {
4502 return 0;
4503 }
4504 if (sl->v.Slice.step && !check_ann_expr(c, sl->v.Slice.step)) {
4505 return 0;
4506 }
4507 break;
4508 default:
4509 PyErr_SetString(PyExc_SystemError,
4510 "unexpected slice kind");
4511 return 0;
4512 }
4513 return 1;
4514}
4515
4516static int
4517check_ann_subscr(struct compiler *c, slice_ty sl)
4518{
4519 /* We check that everything in a subscript is defined at runtime. */
4520 Py_ssize_t i, n;
4521
4522 switch (sl->kind) {
4523 case Index_kind:
4524 case Slice_kind:
4525 if (!check_ann_slice(c, sl)) {
4526 return 0;
4527 }
4528 break;
4529 case ExtSlice_kind:
4530 n = asdl_seq_LEN(sl->v.ExtSlice.dims);
4531 for (i = 0; i < n; i++) {
4532 slice_ty subsl = (slice_ty)asdl_seq_GET(sl->v.ExtSlice.dims, i);
4533 switch (subsl->kind) {
4534 case Index_kind:
4535 case Slice_kind:
4536 if (!check_ann_slice(c, subsl)) {
4537 return 0;
4538 }
4539 break;
4540 case ExtSlice_kind:
4541 default:
4542 PyErr_SetString(PyExc_SystemError,
4543 "extended slice invalid in nested slice");
4544 return 0;
4545 }
4546 }
4547 break;
4548 default:
4549 PyErr_Format(PyExc_SystemError,
4550 "invalid subscript kind %d", sl->kind);
4551 return 0;
4552 }
4553 return 1;
4554}
4555
4556static int
4557compiler_annassign(struct compiler *c, stmt_ty s)
4558{
4559 expr_ty targ = s->v.AnnAssign.target;
4560
4561 assert(s->kind == AnnAssign_kind);
4562
4563 /* We perform the actual assignment first. */
4564 if (s->v.AnnAssign.value) {
4565 VISIT(c, expr, s->v.AnnAssign.value);
4566 VISIT(c, expr, targ);
4567 }
4568 switch (targ->kind) {
4569 case Name_kind:
4570 /* If we have a simple name in a module or class, store annotation. */
4571 if (s->v.AnnAssign.simple &&
4572 (c->u->u_scope_type == COMPILER_SCOPE_MODULE ||
4573 c->u->u_scope_type == COMPILER_SCOPE_CLASS)) {
4574 VISIT(c, expr, s->v.AnnAssign.annotation);
4575 ADDOP_O(c, STORE_ANNOTATION, targ->v.Name.id, names)
4576 }
4577 break;
4578 case Attribute_kind:
4579 if (!s->v.AnnAssign.value &&
4580 !check_ann_expr(c, targ->v.Attribute.value)) {
4581 return 0;
4582 }
4583 break;
4584 case Subscript_kind:
4585 if (!s->v.AnnAssign.value &&
4586 (!check_ann_expr(c, targ->v.Subscript.value) ||
4587 !check_ann_subscr(c, targ->v.Subscript.slice))) {
4588 return 0;
4589 }
4590 break;
4591 default:
4592 PyErr_Format(PyExc_SystemError,
4593 "invalid node type (%d) for annotated assignment",
4594 targ->kind);
4595 return 0;
4596 }
4597 /* Annotation is evaluated last. */
4598 if (!s->v.AnnAssign.simple && !check_annotation(c, s)) {
4599 return 0;
4600 }
4601 return 1;
4602}
4603
4604static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004605compiler_push_fblock(struct compiler *c, enum fblocktype t, basicblock *b)
4606{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004607 struct fblockinfo *f;
4608 if (c->u->u_nfblocks >= CO_MAXBLOCKS) {
Benjamin Petersone09ed542016-07-14 22:00:03 -07004609 PyErr_SetString(PyExc_SyntaxError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004610 "too many statically nested blocks");
4611 return 0;
4612 }
4613 f = &c->u->u_fblock[c->u->u_nfblocks++];
4614 f->fb_type = t;
4615 f->fb_block = b;
4616 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004617}
4618
4619static void
4620compiler_pop_fblock(struct compiler *c, enum fblocktype t, basicblock *b)
4621{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004622 struct compiler_unit *u = c->u;
4623 assert(u->u_nfblocks > 0);
4624 u->u_nfblocks--;
4625 assert(u->u_fblock[u->u_nfblocks].fb_type == t);
4626 assert(u->u_fblock[u->u_nfblocks].fb_block == b);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004627}
4628
Thomas Wouters89f507f2006-12-13 04:49:30 +00004629static int
4630compiler_in_loop(struct compiler *c) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004631 int i;
4632 struct compiler_unit *u = c->u;
4633 for (i = 0; i < u->u_nfblocks; ++i) {
4634 if (u->u_fblock[i].fb_type == LOOP)
4635 return 1;
4636 }
4637 return 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00004638}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004639/* Raises a SyntaxError and returns 0.
4640 If something goes wrong, a different exception may be raised.
4641*/
4642
4643static int
4644compiler_error(struct compiler *c, const char *errstr)
4645{
Benjamin Peterson43b06862011-05-27 09:08:01 -05004646 PyObject *loc;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004647 PyObject *u = NULL, *v = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004648
Victor Stinner14e461d2013-08-26 22:28:21 +02004649 loc = PyErr_ProgramTextObject(c->c_filename, c->u->u_lineno);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004650 if (!loc) {
4651 Py_INCREF(Py_None);
4652 loc = Py_None;
4653 }
Victor Stinner14e461d2013-08-26 22:28:21 +02004654 u = Py_BuildValue("(OiiO)", c->c_filename, c->u->u_lineno,
Benjamin Petersond4efd9e2010-09-20 23:02:10 +00004655 c->u->u_col_offset, loc);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004656 if (!u)
4657 goto exit;
4658 v = Py_BuildValue("(zO)", errstr, u);
4659 if (!v)
4660 goto exit;
4661 PyErr_SetObject(PyExc_SyntaxError, v);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004662 exit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004663 Py_DECREF(loc);
4664 Py_XDECREF(u);
4665 Py_XDECREF(v);
4666 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004667}
4668
4669static int
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004670compiler_handle_subscr(struct compiler *c, const char *kind,
4671 expr_context_ty ctx)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004672{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004673 int op = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004674
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004675 /* XXX this code is duplicated */
4676 switch (ctx) {
4677 case AugLoad: /* fall through to Load */
4678 case Load: op = BINARY_SUBSCR; break;
4679 case AugStore:/* fall through to Store */
4680 case Store: op = STORE_SUBSCR; break;
4681 case Del: op = DELETE_SUBSCR; break;
4682 case Param:
4683 PyErr_Format(PyExc_SystemError,
4684 "invalid %s kind %d in subscript\n",
4685 kind, ctx);
4686 return 0;
4687 }
4688 if (ctx == AugLoad) {
Antoine Pitrou74a69fa2010-09-04 18:43:52 +00004689 ADDOP(c, DUP_TOP_TWO);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004690 }
4691 else if (ctx == AugStore) {
4692 ADDOP(c, ROT_THREE);
4693 }
4694 ADDOP(c, op);
4695 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004696}
4697
4698static int
4699compiler_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)
4700{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004701 int n = 2;
4702 assert(s->kind == Slice_kind);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004703
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004704 /* only handles the cases where BUILD_SLICE is emitted */
4705 if (s->v.Slice.lower) {
4706 VISIT(c, expr, s->v.Slice.lower);
4707 }
4708 else {
4709 ADDOP_O(c, LOAD_CONST, Py_None, consts);
4710 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004711
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004712 if (s->v.Slice.upper) {
4713 VISIT(c, expr, s->v.Slice.upper);
4714 }
4715 else {
4716 ADDOP_O(c, LOAD_CONST, Py_None, consts);
4717 }
4718
4719 if (s->v.Slice.step) {
4720 n++;
4721 VISIT(c, expr, s->v.Slice.step);
4722 }
4723 ADDOP_I(c, BUILD_SLICE, n);
4724 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004725}
4726
4727static int
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004728compiler_visit_nested_slice(struct compiler *c, slice_ty s,
4729 expr_context_ty ctx)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004730{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004731 switch (s->kind) {
4732 case Slice_kind:
4733 return compiler_slice(c, s, ctx);
4734 case Index_kind:
4735 VISIT(c, expr, s->v.Index.value);
4736 break;
4737 case ExtSlice_kind:
4738 default:
4739 PyErr_SetString(PyExc_SystemError,
4740 "extended slice invalid in nested slice");
4741 return 0;
4742 }
4743 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004744}
4745
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004746static int
4747compiler_visit_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)
4748{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004749 char * kindname = NULL;
4750 switch (s->kind) {
4751 case Index_kind:
4752 kindname = "index";
4753 if (ctx != AugStore) {
4754 VISIT(c, expr, s->v.Index.value);
4755 }
4756 break;
4757 case Slice_kind:
4758 kindname = "slice";
4759 if (ctx != AugStore) {
4760 if (!compiler_slice(c, s, ctx))
4761 return 0;
4762 }
4763 break;
4764 case ExtSlice_kind:
4765 kindname = "extended slice";
4766 if (ctx != AugStore) {
Victor Stinnerad9a0662013-11-19 22:23:20 +01004767 Py_ssize_t i, n = asdl_seq_LEN(s->v.ExtSlice.dims);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004768 for (i = 0; i < n; i++) {
4769 slice_ty sub = (slice_ty)asdl_seq_GET(
4770 s->v.ExtSlice.dims, i);
4771 if (!compiler_visit_nested_slice(c, sub, ctx))
4772 return 0;
4773 }
4774 ADDOP_I(c, BUILD_TUPLE, n);
4775 }
4776 break;
4777 default:
4778 PyErr_Format(PyExc_SystemError,
4779 "invalid subscript kind %d", s->kind);
4780 return 0;
4781 }
4782 return compiler_handle_subscr(c, kindname, ctx);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004783}
4784
Thomas Wouters89f507f2006-12-13 04:49:30 +00004785/* End of the compiler section, beginning of the assembler section */
4786
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004787/* do depth-first search of basic block graph, starting with block.
4788 post records the block indices in post-order.
4789
4790 XXX must handle implicit jumps from one block to next
4791*/
4792
Thomas Wouters89f507f2006-12-13 04:49:30 +00004793struct assembler {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004794 PyObject *a_bytecode; /* string containing bytecode */
4795 int a_offset; /* offset into bytecode */
4796 int a_nblocks; /* number of reachable blocks */
4797 basicblock **a_postorder; /* list of blocks in dfs postorder */
4798 PyObject *a_lnotab; /* string containing lnotab */
4799 int a_lnotab_off; /* offset into lnotab */
4800 int a_lineno; /* last lineno of emitted instruction */
4801 int a_lineno_off; /* bytecode offset of last lineno */
Thomas Wouters89f507f2006-12-13 04:49:30 +00004802};
4803
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004804static void
4805dfs(struct compiler *c, basicblock *b, struct assembler *a)
4806{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004807 int i;
4808 struct instr *instr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004809
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004810 if (b->b_seen)
4811 return;
4812 b->b_seen = 1;
4813 if (b->b_next != NULL)
4814 dfs(c, b->b_next, a);
4815 for (i = 0; i < b->b_iused; i++) {
4816 instr = &b->b_instr[i];
4817 if (instr->i_jrel || instr->i_jabs)
4818 dfs(c, instr->i_target, a);
4819 }
4820 a->a_postorder[a->a_nblocks++] = b;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004821}
4822
Neal Norwitz2744c6c2005-11-13 01:08:38 +00004823static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004824stackdepth_walk(struct compiler *c, basicblock *b, int depth, int maxdepth)
4825{
Larry Hastings3a907972013-11-23 14:49:22 -08004826 int i, target_depth, effect;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004827 struct instr *instr;
4828 if (b->b_seen || b->b_startdepth >= depth)
4829 return maxdepth;
4830 b->b_seen = 1;
4831 b->b_startdepth = depth;
4832 for (i = 0; i < b->b_iused; i++) {
4833 instr = &b->b_instr[i];
Larry Hastings3a907972013-11-23 14:49:22 -08004834 effect = PyCompile_OpcodeStackEffect(instr->i_opcode, instr->i_oparg);
4835 if (effect == PY_INVALID_STACK_EFFECT) {
4836 fprintf(stderr, "opcode = %d\n", instr->i_opcode);
4837 Py_FatalError("PyCompile_OpcodeStackEffect()");
4838 }
4839 depth += effect;
4840
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004841 if (depth > maxdepth)
4842 maxdepth = depth;
4843 assert(depth >= 0); /* invalid code or bug in stackdepth() */
4844 if (instr->i_jrel || instr->i_jabs) {
4845 target_depth = depth;
4846 if (instr->i_opcode == FOR_ITER) {
4847 target_depth = depth-2;
Antoine Pitrou99614052014-05-23 11:46:03 +02004848 }
4849 else if (instr->i_opcode == SETUP_FINALLY ||
4850 instr->i_opcode == SETUP_EXCEPT) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004851 target_depth = depth+3;
4852 if (target_depth > maxdepth)
4853 maxdepth = target_depth;
4854 }
Antoine Pitrou99614052014-05-23 11:46:03 +02004855 else if (instr->i_opcode == JUMP_IF_TRUE_OR_POP ||
4856 instr->i_opcode == JUMP_IF_FALSE_OR_POP)
4857 depth = depth - 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004858 maxdepth = stackdepth_walk(c, instr->i_target,
4859 target_depth, maxdepth);
4860 if (instr->i_opcode == JUMP_ABSOLUTE ||
4861 instr->i_opcode == JUMP_FORWARD) {
4862 goto out; /* remaining code is dead */
4863 }
4864 }
4865 }
4866 if (b->b_next)
4867 maxdepth = stackdepth_walk(c, b->b_next, depth, maxdepth);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004868out:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004869 b->b_seen = 0;
4870 return maxdepth;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004871}
4872
4873/* Find the flow path that needs the largest stack. We assume that
4874 * cycles in the flow graph have no net effect on the stack depth.
4875 */
4876static int
4877stackdepth(struct compiler *c)
4878{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004879 basicblock *b, *entryblock;
4880 entryblock = NULL;
4881 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
4882 b->b_seen = 0;
4883 b->b_startdepth = INT_MIN;
4884 entryblock = b;
4885 }
4886 if (!entryblock)
4887 return 0;
4888 return stackdepth_walk(c, entryblock, 0, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004889}
4890
4891static int
4892assemble_init(struct assembler *a, int nblocks, int firstlineno)
4893{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004894 memset(a, 0, sizeof(struct assembler));
4895 a->a_lineno = firstlineno;
4896 a->a_bytecode = PyBytes_FromStringAndSize(NULL, DEFAULT_CODE_SIZE);
4897 if (!a->a_bytecode)
4898 return 0;
4899 a->a_lnotab = PyBytes_FromStringAndSize(NULL, DEFAULT_LNOTAB_SIZE);
4900 if (!a->a_lnotab)
4901 return 0;
Benjamin Peterson2f8bfef2016-09-07 09:26:18 -07004902 if ((size_t)nblocks > SIZE_MAX / sizeof(basicblock *)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004903 PyErr_NoMemory();
4904 return 0;
4905 }
4906 a->a_postorder = (basicblock **)PyObject_Malloc(
4907 sizeof(basicblock *) * nblocks);
4908 if (!a->a_postorder) {
4909 PyErr_NoMemory();
4910 return 0;
4911 }
4912 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004913}
4914
4915static void
4916assemble_free(struct assembler *a)
4917{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004918 Py_XDECREF(a->a_bytecode);
4919 Py_XDECREF(a->a_lnotab);
4920 if (a->a_postorder)
4921 PyObject_Free(a->a_postorder);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004922}
4923
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004924static int
4925blocksize(basicblock *b)
4926{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004927 int i;
4928 int size = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004929
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004930 for (i = 0; i < b->b_iused; i++)
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03004931 size += instrsize(b->b_instr[i].i_oparg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004932 return size;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004933}
4934
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00004935/* Appends a pair to the end of the line number table, a_lnotab, representing
4936 the instruction's bytecode offset and line number. See
4937 Objects/lnotab_notes.txt for the description of the line number table. */
Tim Peters2a7f3842001-06-09 09:26:21 +00004938
Guido van Rossumf68d8e52001-04-14 17:55:09 +00004939static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004940assemble_lnotab(struct assembler *a, struct instr *i)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004941{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004942 int d_bytecode, d_lineno;
Victor Stinnerad9a0662013-11-19 22:23:20 +01004943 Py_ssize_t len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004944 unsigned char *lnotab;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004945
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004946 d_bytecode = a->a_offset - a->a_lineno_off;
4947 d_lineno = i->i_lineno - a->a_lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004948
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004949 assert(d_bytecode >= 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004950
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004951 if(d_bytecode == 0 && d_lineno == 0)
4952 return 1;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004953
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004954 if (d_bytecode > 255) {
4955 int j, nbytes, ncodes = d_bytecode / 255;
4956 nbytes = a->a_lnotab_off + 2 * ncodes;
4957 len = PyBytes_GET_SIZE(a->a_lnotab);
4958 if (nbytes >= len) {
4959 if ((len <= INT_MAX / 2) && (len * 2 < nbytes))
4960 len = nbytes;
4961 else if (len <= INT_MAX / 2)
4962 len *= 2;
4963 else {
4964 PyErr_NoMemory();
4965 return 0;
4966 }
4967 if (_PyBytes_Resize(&a->a_lnotab, len) < 0)
4968 return 0;
4969 }
4970 lnotab = (unsigned char *)
4971 PyBytes_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
4972 for (j = 0; j < ncodes; j++) {
4973 *lnotab++ = 255;
4974 *lnotab++ = 0;
4975 }
4976 d_bytecode -= ncodes * 255;
4977 a->a_lnotab_off += ncodes * 2;
4978 }
Victor Stinnerf3914eb2016-01-20 12:16:21 +01004979 assert(0 <= d_bytecode && d_bytecode <= 255);
4980
4981 if (d_lineno < -128 || 127 < d_lineno) {
4982 int j, nbytes, ncodes, k;
4983 if (d_lineno < 0) {
4984 k = -128;
4985 /* use division on positive numbers */
4986 ncodes = (-d_lineno) / 128;
4987 }
4988 else {
4989 k = 127;
4990 ncodes = d_lineno / 127;
4991 }
4992 d_lineno -= ncodes * k;
4993 assert(ncodes >= 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004994 nbytes = a->a_lnotab_off + 2 * ncodes;
4995 len = PyBytes_GET_SIZE(a->a_lnotab);
4996 if (nbytes >= len) {
4997 if ((len <= INT_MAX / 2) && len * 2 < nbytes)
4998 len = nbytes;
4999 else if (len <= INT_MAX / 2)
5000 len *= 2;
5001 else {
5002 PyErr_NoMemory();
5003 return 0;
5004 }
5005 if (_PyBytes_Resize(&a->a_lnotab, len) < 0)
5006 return 0;
5007 }
5008 lnotab = (unsigned char *)
5009 PyBytes_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
5010 *lnotab++ = d_bytecode;
Victor Stinnerf3914eb2016-01-20 12:16:21 +01005011 *lnotab++ = k;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005012 d_bytecode = 0;
5013 for (j = 1; j < ncodes; j++) {
5014 *lnotab++ = 0;
Victor Stinnerf3914eb2016-01-20 12:16:21 +01005015 *lnotab++ = k;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005016 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005017 a->a_lnotab_off += ncodes * 2;
5018 }
Victor Stinnerf3914eb2016-01-20 12:16:21 +01005019 assert(-128 <= d_lineno && d_lineno <= 127);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005020
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005021 len = PyBytes_GET_SIZE(a->a_lnotab);
5022 if (a->a_lnotab_off + 2 >= len) {
5023 if (_PyBytes_Resize(&a->a_lnotab, len * 2) < 0)
5024 return 0;
5025 }
5026 lnotab = (unsigned char *)
5027 PyBytes_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
Tim Peters51e26512001-09-07 08:45:55 +00005028
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005029 a->a_lnotab_off += 2;
5030 if (d_bytecode) {
5031 *lnotab++ = d_bytecode;
Victor Stinner4f2dab52011-05-27 16:46:51 +02005032 *lnotab++ = d_lineno;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005033 }
5034 else { /* First line of a block; def stmt, etc. */
5035 *lnotab++ = 0;
Victor Stinner4f2dab52011-05-27 16:46:51 +02005036 *lnotab++ = d_lineno;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005037 }
5038 a->a_lineno = i->i_lineno;
5039 a->a_lineno_off = a->a_offset;
5040 return 1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005041}
5042
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005043/* assemble_emit()
5044 Extend the bytecode with a new instruction.
5045 Update lnotab if necessary.
Jeremy Hylton376e63d2003-08-28 14:42:14 +00005046*/
5047
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00005048static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005049assemble_emit(struct assembler *a, struct instr *i)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00005050{
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005051 int size, arg = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005052 Py_ssize_t len = PyBytes_GET_SIZE(a->a_bytecode);
5053 char *code;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005054
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005055 arg = i->i_oparg;
5056 size = instrsize(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005057 if (i->i_lineno && !assemble_lnotab(a, i))
5058 return 0;
5059 if (a->a_offset + size >= len) {
5060 if (len > PY_SSIZE_T_MAX / 2)
5061 return 0;
5062 if (_PyBytes_Resize(&a->a_bytecode, len * 2) < 0)
5063 return 0;
5064 }
5065 code = PyBytes_AS_STRING(a->a_bytecode) + a->a_offset;
5066 a->a_offset += size;
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005067 write_op_arg((unsigned char*)code, i->i_opcode, arg, size);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005068 return 1;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00005069}
5070
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00005071static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005072assemble_jump_offsets(struct assembler *a, struct compiler *c)
Anthony Baxterc2a5a632004-08-02 06:10:11 +00005073{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005074 basicblock *b;
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005075 int bsize, totsize, extended_arg_recompile;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005076 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00005077
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005078 /* Compute the size of each block and fixup jump args.
5079 Replace block pointer with position in bytecode. */
5080 do {
5081 totsize = 0;
5082 for (i = a->a_nblocks - 1; i >= 0; i--) {
5083 b = a->a_postorder[i];
5084 bsize = blocksize(b);
5085 b->b_offset = totsize;
5086 totsize += bsize;
5087 }
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005088 extended_arg_recompile = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005089 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
5090 bsize = b->b_offset;
5091 for (i = 0; i < b->b_iused; i++) {
5092 struct instr *instr = &b->b_instr[i];
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005093 int isize = instrsize(instr->i_oparg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005094 /* Relative jumps are computed relative to
5095 the instruction pointer after fetching
5096 the jump instruction.
5097 */
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005098 bsize += isize;
5099 if (instr->i_jabs || instr->i_jrel) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005100 instr->i_oparg = instr->i_target->b_offset;
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005101 if (instr->i_jrel) {
5102 instr->i_oparg -= bsize;
5103 }
5104 if (instrsize(instr->i_oparg) != isize) {
5105 extended_arg_recompile = 1;
5106 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005107 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005108 }
5109 }
Neal Norwitzf1d50682005-10-23 23:00:41 +00005110
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005111 /* XXX: This is an awful hack that could hurt performance, but
5112 on the bright side it should work until we come up
5113 with a better solution.
Neal Norwitzf1d50682005-10-23 23:00:41 +00005114
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005115 The issue is that in the first loop blocksize() is called
5116 which calls instrsize() which requires i_oparg be set
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005117 appropriately. There is a bootstrap problem because
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005118 i_oparg is calculated in the second loop above.
Neal Norwitzf1d50682005-10-23 23:00:41 +00005119
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005120 So we loop until we stop seeing new EXTENDED_ARGs.
5121 The only EXTENDED_ARGs that could be popping up are
5122 ones in jump instructions. So this should converge
5123 fairly quickly.
5124 */
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005125 } while (extended_arg_recompile);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005126}
5127
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005128static PyObject *
Victor Stinnerad9a0662013-11-19 22:23:20 +01005129dict_keys_inorder(PyObject *dict, Py_ssize_t offset)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005130{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005131 PyObject *tuple, *k, *v;
5132 Py_ssize_t i, pos = 0, size = PyDict_Size(dict);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005133
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005134 tuple = PyTuple_New(size);
5135 if (tuple == NULL)
5136 return NULL;
5137 while (PyDict_Next(dict, &pos, &k, &v)) {
5138 i = PyLong_AS_LONG(v);
Victor Stinnerefb24132016-01-22 12:33:12 +01005139 /* The keys of the dictionary are tuples. (see compiler_add_o
5140 * and _PyCode_ConstantKey). The object we want is always second,
5141 * though. */
5142 k = PyTuple_GET_ITEM(k, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005143 Py_INCREF(k);
5144 assert((i - offset) < size);
5145 assert((i - offset) >= 0);
5146 PyTuple_SET_ITEM(tuple, i - offset, k);
5147 }
5148 return tuple;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005149}
5150
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005151static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005152compute_code_flags(struct compiler *c)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005153{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005154 PySTEntryObject *ste = c->u->u_ste;
Victor Stinnerad9a0662013-11-19 22:23:20 +01005155 int flags = 0;
5156 Py_ssize_t n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005157 if (ste->ste_type == FunctionBlock) {
Benjamin Peterson1dfd2472015-04-27 21:44:22 -04005158 flags |= CO_NEWLOCALS | CO_OPTIMIZED;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005159 if (ste->ste_nested)
5160 flags |= CO_NESTED;
Yury Selivanoveb636452016-09-08 22:01:51 -07005161 if (ste->ste_generator && !ste->ste_coroutine)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005162 flags |= CO_GENERATOR;
Yury Selivanoveb636452016-09-08 22:01:51 -07005163 if (!ste->ste_generator && ste->ste_coroutine)
5164 flags |= CO_COROUTINE;
5165 if (ste->ste_generator && ste->ste_coroutine)
5166 flags |= CO_ASYNC_GENERATOR;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005167 if (ste->ste_varargs)
5168 flags |= CO_VARARGS;
5169 if (ste->ste_varkeywords)
5170 flags |= CO_VARKEYWORDS;
5171 }
Thomas Wouters5e9f1fa2006-02-28 20:02:27 +00005172
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005173 /* (Only) inherit compilerflags in PyCF_MASK */
5174 flags |= (c->c_flags->cf_flags & PyCF_MASK);
Thomas Wouters5e9f1fa2006-02-28 20:02:27 +00005175
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005176 n = PyDict_Size(c->u->u_freevars);
5177 if (n < 0)
5178 return -1;
5179 if (n == 0) {
5180 n = PyDict_Size(c->u->u_cellvars);
5181 if (n < 0)
Victor Stinnerad9a0662013-11-19 22:23:20 +01005182 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005183 if (n == 0) {
Victor Stinnerad9a0662013-11-19 22:23:20 +01005184 flags |= CO_NOFREE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005185 }
5186 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005187
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005188 return flags;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005189}
5190
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005191static PyCodeObject *
5192makecode(struct compiler *c, struct assembler *a)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005193{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005194 PyObject *tmp;
5195 PyCodeObject *co = NULL;
5196 PyObject *consts = NULL;
5197 PyObject *names = NULL;
5198 PyObject *varnames = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005199 PyObject *name = NULL;
5200 PyObject *freevars = NULL;
5201 PyObject *cellvars = NULL;
5202 PyObject *bytecode = NULL;
Victor Stinnerad9a0662013-11-19 22:23:20 +01005203 Py_ssize_t nlocals;
5204 int nlocals_int;
5205 int flags;
Victor Stinnerf8e32212013-11-19 23:56:34 +01005206 int argcount, kwonlyargcount;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005207
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005208 tmp = dict_keys_inorder(c->u->u_consts, 0);
5209 if (!tmp)
5210 goto error;
5211 consts = PySequence_List(tmp); /* optimize_code requires a list */
5212 Py_DECREF(tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005213
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005214 names = dict_keys_inorder(c->u->u_names, 0);
5215 varnames = dict_keys_inorder(c->u->u_varnames, 0);
5216 if (!consts || !names || !varnames)
5217 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005218
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005219 cellvars = dict_keys_inorder(c->u->u_cellvars, 0);
5220 if (!cellvars)
5221 goto error;
5222 freevars = dict_keys_inorder(c->u->u_freevars, PyTuple_Size(cellvars));
5223 if (!freevars)
5224 goto error;
Victor Stinnerad9a0662013-11-19 22:23:20 +01005225
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005226 nlocals = PyDict_Size(c->u->u_varnames);
Victor Stinnerad9a0662013-11-19 22:23:20 +01005227 assert(nlocals < INT_MAX);
5228 nlocals_int = Py_SAFE_DOWNCAST(nlocals, Py_ssize_t, int);
5229
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005230 flags = compute_code_flags(c);
5231 if (flags < 0)
5232 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005233
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005234 bytecode = PyCode_Optimize(a->a_bytecode, consts, names, a->a_lnotab);
5235 if (!bytecode)
5236 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005237
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005238 tmp = PyList_AsTuple(consts); /* PyCode_New requires a tuple */
5239 if (!tmp)
5240 goto error;
5241 Py_DECREF(consts);
5242 consts = tmp;
5243
Victor Stinnerf8e32212013-11-19 23:56:34 +01005244 argcount = Py_SAFE_DOWNCAST(c->u->u_argcount, Py_ssize_t, int);
5245 kwonlyargcount = Py_SAFE_DOWNCAST(c->u->u_kwonlyargcount, Py_ssize_t, int);
5246 co = PyCode_New(argcount, kwonlyargcount,
Victor Stinnerad9a0662013-11-19 22:23:20 +01005247 nlocals_int, stackdepth(c), flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005248 bytecode, consts, names, varnames,
5249 freevars, cellvars,
Victor Stinner14e461d2013-08-26 22:28:21 +02005250 c->c_filename, c->u->u_name,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005251 c->u->u_firstlineno,
5252 a->a_lnotab);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005253 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005254 Py_XDECREF(consts);
5255 Py_XDECREF(names);
5256 Py_XDECREF(varnames);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005257 Py_XDECREF(name);
5258 Py_XDECREF(freevars);
5259 Py_XDECREF(cellvars);
5260 Py_XDECREF(bytecode);
5261 return co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005262}
5263
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005264
5265/* For debugging purposes only */
5266#if 0
5267static void
5268dump_instr(const struct instr *i)
5269{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005270 const char *jrel = i->i_jrel ? "jrel " : "";
5271 const char *jabs = i->i_jabs ? "jabs " : "";
5272 char arg[128];
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005273
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005274 *arg = '\0';
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005275 if (HAS_ARG(i->i_opcode)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005276 sprintf(arg, "arg: %d ", i->i_oparg);
Serhiy Storchakab0f80b02016-05-24 09:15:14 +03005277 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005278 fprintf(stderr, "line: %d, opcode: %d %s%s%s\n",
5279 i->i_lineno, i->i_opcode, arg, jabs, jrel);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005280}
5281
5282static void
5283dump_basicblock(const basicblock *b)
5284{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005285 const char *seen = b->b_seen ? "seen " : "";
5286 const char *b_return = b->b_return ? "return " : "";
5287 fprintf(stderr, "used: %d, depth: %d, offset: %d %s%s\n",
5288 b->b_iused, b->b_startdepth, b->b_offset, seen, b_return);
5289 if (b->b_instr) {
5290 int i;
5291 for (i = 0; i < b->b_iused; i++) {
5292 fprintf(stderr, " [%02d] ", i);
5293 dump_instr(b->b_instr + i);
5294 }
5295 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005296}
5297#endif
5298
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005299static PyCodeObject *
5300assemble(struct compiler *c, int addNone)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005301{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005302 basicblock *b, *entryblock;
5303 struct assembler a;
5304 int i, j, nblocks;
5305 PyCodeObject *co = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005306
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005307 /* Make sure every block that falls off the end returns None.
5308 XXX NEXT_BLOCK() isn't quite right, because if the last
5309 block ends with a jump or return b_next shouldn't set.
5310 */
5311 if (!c->u->u_curblock->b_return) {
5312 NEXT_BLOCK(c);
5313 if (addNone)
5314 ADDOP_O(c, LOAD_CONST, Py_None, consts);
5315 ADDOP(c, RETURN_VALUE);
5316 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005317
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005318 nblocks = 0;
5319 entryblock = NULL;
5320 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
5321 nblocks++;
5322 entryblock = b;
5323 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005324
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005325 /* Set firstlineno if it wasn't explicitly set. */
5326 if (!c->u->u_firstlineno) {
Ned Deilydc35cda2016-08-17 17:18:33 -04005327 if (entryblock && entryblock->b_instr && entryblock->b_instr->i_lineno)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005328 c->u->u_firstlineno = entryblock->b_instr->i_lineno;
5329 else
5330 c->u->u_firstlineno = 1;
5331 }
5332 if (!assemble_init(&a, nblocks, c->u->u_firstlineno))
5333 goto error;
5334 dfs(c, entryblock, &a);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005335
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005336 /* Can't modify the bytecode after computing jump offsets. */
5337 assemble_jump_offsets(&a, c);
Tim Petersb6c3cea2001-06-26 03:36:28 +00005338
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005339 /* Emit code in reverse postorder from dfs. */
5340 for (i = a.a_nblocks - 1; i >= 0; i--) {
5341 b = a.a_postorder[i];
5342 for (j = 0; j < b->b_iused; j++)
5343 if (!assemble_emit(&a, &b->b_instr[j]))
5344 goto error;
5345 }
Tim Petersb6c3cea2001-06-26 03:36:28 +00005346
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005347 if (_PyBytes_Resize(&a.a_lnotab, a.a_lnotab_off) < 0)
5348 goto error;
5349 if (_PyBytes_Resize(&a.a_bytecode, a.a_offset) < 0)
5350 goto error;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005351
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005352 co = makecode(c, &a);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00005353 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005354 assemble_free(&a);
5355 return co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005356}
Georg Brandl8334fd92010-12-04 10:26:46 +00005357
5358#undef PyAST_Compile
5359PyAPI_FUNC(PyCodeObject *)
5360PyAST_Compile(mod_ty mod, const char *filename, PyCompilerFlags *flags,
5361 PyArena *arena)
5362{
5363 return PyAST_CompileEx(mod, filename, flags, -1, arena);
5364}