blob: 030afedd29c987ec8909dc12ddb6eb4ebe4f1fe0 [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"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000032
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000033#define DEFAULT_BLOCK_SIZE 16
34#define DEFAULT_BLOCKS 8
35#define DEFAULT_CODE_SIZE 128
36#define DEFAULT_LNOTAB_SIZE 16
Jeremy Hylton29906ee2001-02-27 04:23:34 +000037
Nick Coghlan650f0d02007-04-15 12:05:43 +000038#define COMP_GENEXP 0
39#define COMP_LISTCOMP 1
40#define COMP_SETCOMP 2
Guido van Rossum992d4a32007-07-11 13:09:30 +000041#define COMP_DICTCOMP 3
Nick Coghlan650f0d02007-04-15 12:05:43 +000042
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000043struct instr {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000044 unsigned i_jabs : 1;
45 unsigned i_jrel : 1;
46 unsigned i_hasarg : 1;
47 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 basicblock *compiler_use_new_block(struct compiler *);
175static int compiler_error(struct compiler *, const char *);
176static int compiler_nameop(struct compiler *, identifier, expr_context_ty);
177
178static PyCodeObject *compiler_mod(struct compiler *, mod_ty);
179static int compiler_visit_stmt(struct compiler *, stmt_ty);
180static int compiler_visit_keyword(struct compiler *, keyword_ty);
181static int compiler_visit_expr(struct compiler *, expr_ty);
182static int compiler_augassign(struct compiler *, stmt_ty);
183static 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 Stinnerad9a0662013-11-19 22:23:20 +0100199static int compiler_call_helper(struct compiler *c, Py_ssize_t 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
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000205static PyCodeObject *assemble(struct compiler *, int addNone);
206static PyObject *__doc__;
207
Benjamin Peterson9e77f722015-05-07 18:41:47 -0400208#define CAPSULE_NAME "compile.c compiler unit"
Benjamin Petersonb173f782009-05-05 22:31:58 +0000209
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000210PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000211_Py_Mangle(PyObject *privateobj, PyObject *ident)
Michael W. Hudson60934622004-08-12 17:56:29 +0000212{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000213 /* Name mangling: __private becomes _classname__private.
214 This is independent from how the name is used. */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200215 PyObject *result;
216 size_t nlen, plen, ipriv;
217 Py_UCS4 maxchar;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000218 if (privateobj == NULL || !PyUnicode_Check(privateobj) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200219 PyUnicode_READ_CHAR(ident, 0) != '_' ||
220 PyUnicode_READ_CHAR(ident, 1) != '_') {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000221 Py_INCREF(ident);
222 return ident;
223 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200224 nlen = PyUnicode_GET_LENGTH(ident);
225 plen = PyUnicode_GET_LENGTH(privateobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000226 /* Don't mangle __id__ or names with dots.
Guido van Rossumd8faa362007-04-27 19:54:29 +0000227
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000228 The only time a name with a dot can occur is when
229 we are compiling an import statement that has a
230 package name.
Guido van Rossumd8faa362007-04-27 19:54:29 +0000231
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000232 TODO(jhylton): Decide whether we want to support
233 mangling of the module name, e.g. __M.X.
234 */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200235 if ((PyUnicode_READ_CHAR(ident, nlen-1) == '_' &&
236 PyUnicode_READ_CHAR(ident, nlen-2) == '_') ||
237 PyUnicode_FindChar(ident, '.', 0, nlen, 1) != -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000238 Py_INCREF(ident);
239 return ident; /* Don't mangle __whatever__ */
240 }
241 /* Strip leading underscores from class name */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200242 ipriv = 0;
243 while (PyUnicode_READ_CHAR(privateobj, ipriv) == '_')
244 ipriv++;
245 if (ipriv == plen) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000246 Py_INCREF(ident);
247 return ident; /* Don't mangle if class is just underscores */
248 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200249 plen -= ipriv;
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000250
Antoine Pitrou55bff892013-04-06 21:21:04 +0200251 if (plen + nlen >= PY_SSIZE_T_MAX - 1) {
252 PyErr_SetString(PyExc_OverflowError,
253 "private identifier too large to be mangled");
254 return NULL;
255 }
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000256
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200257 maxchar = PyUnicode_MAX_CHAR_VALUE(ident);
258 if (PyUnicode_MAX_CHAR_VALUE(privateobj) > maxchar)
259 maxchar = PyUnicode_MAX_CHAR_VALUE(privateobj);
260
261 result = PyUnicode_New(1 + nlen + plen, maxchar);
262 if (!result)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000263 return 0;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200264 /* ident = "_" + priv[ipriv:] + ident # i.e. 1+plen+nlen bytes */
265 PyUnicode_WRITE(PyUnicode_KIND(result), PyUnicode_DATA(result), 0, '_');
Victor Stinner6c7a52a2011-09-28 21:39:17 +0200266 if (PyUnicode_CopyCharacters(result, 1, privateobj, ipriv, plen) < 0) {
267 Py_DECREF(result);
268 return NULL;
269 }
270 if (PyUnicode_CopyCharacters(result, plen+1, ident, 0, nlen) < 0) {
271 Py_DECREF(result);
272 return NULL;
273 }
Victor Stinner8f825062012-04-27 13:55:39 +0200274 assert(_PyUnicode_CheckConsistency(result, 1));
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200275 return result;
Michael W. Hudson60934622004-08-12 17:56:29 +0000276}
277
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000278static int
279compiler_init(struct compiler *c)
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000280{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000281 memset(c, 0, sizeof(struct compiler));
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000282
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000283 c->c_stack = PyList_New(0);
284 if (!c->c_stack)
285 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000286
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000287 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000288}
289
290PyCodeObject *
Victor Stinner14e461d2013-08-26 22:28:21 +0200291PyAST_CompileObject(mod_ty mod, PyObject *filename, PyCompilerFlags *flags,
292 int optimize, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000293{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000294 struct compiler c;
295 PyCodeObject *co = NULL;
296 PyCompilerFlags local_flags;
297 int merged;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000298
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000299 if (!__doc__) {
300 __doc__ = PyUnicode_InternFromString("__doc__");
301 if (!__doc__)
302 return NULL;
303 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000304
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000305 if (!compiler_init(&c))
306 return NULL;
Victor Stinner14e461d2013-08-26 22:28:21 +0200307 Py_INCREF(filename);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000308 c.c_filename = filename;
309 c.c_arena = arena;
Victor Stinner14e461d2013-08-26 22:28:21 +0200310 c.c_future = PyFuture_FromASTObject(mod, filename);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000311 if (c.c_future == NULL)
312 goto finally;
313 if (!flags) {
314 local_flags.cf_flags = 0;
315 flags = &local_flags;
316 }
317 merged = c.c_future->ff_features | flags->cf_flags;
318 c.c_future->ff_features = merged;
319 flags->cf_flags = merged;
320 c.c_flags = flags;
Georg Brandl8334fd92010-12-04 10:26:46 +0000321 c.c_optimize = (optimize == -1) ? Py_OptimizeFlag : optimize;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000322 c.c_nestlevel = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000323
Victor Stinner14e461d2013-08-26 22:28:21 +0200324 c.c_st = PySymtable_BuildObject(mod, filename, c.c_future);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000325 if (c.c_st == NULL) {
326 if (!PyErr_Occurred())
327 PyErr_SetString(PyExc_SystemError, "no symtable");
328 goto finally;
329 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000330
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000331 co = compiler_mod(&c, mod);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000332
Thomas Wouters1175c432006-02-27 22:49:54 +0000333 finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000334 compiler_free(&c);
335 assert(co || PyErr_Occurred());
336 return co;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000337}
338
339PyCodeObject *
Victor Stinner14e461d2013-08-26 22:28:21 +0200340PyAST_CompileEx(mod_ty mod, const char *filename_str, PyCompilerFlags *flags,
341 int optimize, PyArena *arena)
342{
343 PyObject *filename;
344 PyCodeObject *co;
345 filename = PyUnicode_DecodeFSDefault(filename_str);
346 if (filename == NULL)
347 return NULL;
348 co = PyAST_CompileObject(mod, filename, flags, optimize, arena);
349 Py_DECREF(filename);
350 return co;
351
352}
353
354PyCodeObject *
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000355PyNode_Compile(struct _node *n, const char *filename)
356{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000357 PyCodeObject *co = NULL;
358 mod_ty mod;
359 PyArena *arena = PyArena_New();
360 if (!arena)
361 return NULL;
362 mod = PyAST_FromNode(n, NULL, filename, arena);
363 if (mod)
364 co = PyAST_Compile(mod, filename, NULL, arena);
365 PyArena_Free(arena);
366 return co;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000367}
368
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000369static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000370compiler_free(struct compiler *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000371{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000372 if (c->c_st)
373 PySymtable_Free(c->c_st);
374 if (c->c_future)
375 PyObject_Free(c->c_future);
Victor Stinner14e461d2013-08-26 22:28:21 +0200376 Py_XDECREF(c->c_filename);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000377 Py_DECREF(c->c_stack);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000378}
379
Guido van Rossum79f25d91997-04-29 20:08:16 +0000380static PyObject *
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000381list2dict(PyObject *list)
Guido van Rossum2dff9911992-09-03 20:50:59 +0000382{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000383 Py_ssize_t i, n;
384 PyObject *v, *k;
385 PyObject *dict = PyDict_New();
386 if (!dict) return NULL;
Guido van Rossumd076c731998-10-07 19:42:25 +0000387
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000388 n = PyList_Size(list);
389 for (i = 0; i < n; i++) {
Victor Stinnerad9a0662013-11-19 22:23:20 +0100390 v = PyLong_FromSsize_t(i);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000391 if (!v) {
392 Py_DECREF(dict);
393 return NULL;
394 }
395 k = PyList_GET_ITEM(list, i);
396 k = PyTuple_Pack(2, k, k->ob_type);
397 if (k == NULL || PyDict_SetItem(dict, k, v) < 0) {
398 Py_XDECREF(k);
399 Py_DECREF(v);
400 Py_DECREF(dict);
401 return NULL;
402 }
403 Py_DECREF(k);
404 Py_DECREF(v);
405 }
406 return dict;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000407}
408
409/* Return new dict containing names from src that match scope(s).
410
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000411src is a symbol table dictionary. If the scope of a name matches
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000412either scope_type or flag is set, insert it into the new dict. The
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000413values are integers, starting at offset and increasing by one for
414each key.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000415*/
416
417static PyObject *
Victor Stinnerad9a0662013-11-19 22:23:20 +0100418dictbytype(PyObject *src, int scope_type, int flag, Py_ssize_t offset)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000419{
Benjamin Peterson51ab2832012-07-18 15:12:47 -0700420 Py_ssize_t i = offset, scope, num_keys, key_i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000421 PyObject *k, *v, *dest = PyDict_New();
Meador Inge2ca63152012-07-18 14:20:11 -0500422 PyObject *sorted_keys;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000423
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000424 assert(offset >= 0);
425 if (dest == NULL)
426 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000427
Meador Inge2ca63152012-07-18 14:20:11 -0500428 /* Sort the keys so that we have a deterministic order on the indexes
429 saved in the returned dictionary. These indexes are used as indexes
430 into the free and cell var storage. Therefore if they aren't
431 deterministic, then the generated bytecode is not deterministic.
432 */
433 sorted_keys = PyDict_Keys(src);
434 if (sorted_keys == NULL)
435 return NULL;
436 if (PyList_Sort(sorted_keys) != 0) {
437 Py_DECREF(sorted_keys);
438 return NULL;
439 }
Meador Ingef69e24e2012-07-18 16:41:03 -0500440 num_keys = PyList_GET_SIZE(sorted_keys);
Meador Inge2ca63152012-07-18 14:20:11 -0500441
442 for (key_i = 0; key_i < num_keys; key_i++) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000443 /* XXX this should probably be a macro in symtable.h */
444 long vi;
Meador Inge2ca63152012-07-18 14:20:11 -0500445 k = PyList_GET_ITEM(sorted_keys, key_i);
446 v = PyDict_GetItem(src, k);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000447 assert(PyLong_Check(v));
448 vi = PyLong_AS_LONG(v);
449 scope = (vi >> SCOPE_OFFSET) & SCOPE_MASK;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000450
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000451 if (scope == scope_type || vi & flag) {
Victor Stinnerad9a0662013-11-19 22:23:20 +0100452 PyObject *tuple, *item = PyLong_FromSsize_t(i);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000453 if (item == NULL) {
Meador Inge2ca63152012-07-18 14:20:11 -0500454 Py_DECREF(sorted_keys);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000455 Py_DECREF(dest);
456 return NULL;
457 }
458 i++;
459 tuple = PyTuple_Pack(2, k, k->ob_type);
460 if (!tuple || PyDict_SetItem(dest, tuple, item) < 0) {
Meador Inge2ca63152012-07-18 14:20:11 -0500461 Py_DECREF(sorted_keys);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000462 Py_DECREF(item);
463 Py_DECREF(dest);
464 Py_XDECREF(tuple);
465 return NULL;
466 }
467 Py_DECREF(item);
468 Py_DECREF(tuple);
469 }
470 }
Meador Inge2ca63152012-07-18 14:20:11 -0500471 Py_DECREF(sorted_keys);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000472 return dest;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000473}
474
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000475static void
476compiler_unit_check(struct compiler_unit *u)
477{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000478 basicblock *block;
479 for (block = u->u_blocks; block != NULL; block = block->b_list) {
480 assert((void *)block != (void *)0xcbcbcbcb);
481 assert((void *)block != (void *)0xfbfbfbfb);
482 assert((void *)block != (void *)0xdbdbdbdb);
483 if (block->b_instr != NULL) {
484 assert(block->b_ialloc > 0);
485 assert(block->b_iused > 0);
486 assert(block->b_ialloc >= block->b_iused);
487 }
488 else {
489 assert (block->b_iused == 0);
490 assert (block->b_ialloc == 0);
491 }
492 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000493}
494
495static void
496compiler_unit_free(struct compiler_unit *u)
497{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000498 basicblock *b, *next;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000499
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000500 compiler_unit_check(u);
501 b = u->u_blocks;
502 while (b != NULL) {
503 if (b->b_instr)
504 PyObject_Free((void *)b->b_instr);
505 next = b->b_list;
506 PyObject_Free((void *)b);
507 b = next;
508 }
509 Py_CLEAR(u->u_ste);
510 Py_CLEAR(u->u_name);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400511 Py_CLEAR(u->u_qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000512 Py_CLEAR(u->u_consts);
513 Py_CLEAR(u->u_names);
514 Py_CLEAR(u->u_varnames);
515 Py_CLEAR(u->u_freevars);
516 Py_CLEAR(u->u_cellvars);
517 Py_CLEAR(u->u_private);
518 PyObject_Free(u);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000519}
520
521static int
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100522compiler_enter_scope(struct compiler *c, identifier name,
523 int scope_type, void *key, int lineno)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000524{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000525 struct compiler_unit *u;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000526
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000527 u = (struct compiler_unit *)PyObject_Malloc(sizeof(
528 struct compiler_unit));
529 if (!u) {
530 PyErr_NoMemory();
531 return 0;
532 }
533 memset(u, 0, sizeof(struct compiler_unit));
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100534 u->u_scope_type = scope_type;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000535 u->u_argcount = 0;
536 u->u_kwonlyargcount = 0;
537 u->u_ste = PySymtable_Lookup(c->c_st, key);
538 if (!u->u_ste) {
539 compiler_unit_free(u);
540 return 0;
541 }
542 Py_INCREF(name);
543 u->u_name = name;
544 u->u_varnames = list2dict(u->u_ste->ste_varnames);
545 u->u_cellvars = dictbytype(u->u_ste->ste_symbols, CELL, 0, 0);
546 if (!u->u_varnames || !u->u_cellvars) {
547 compiler_unit_free(u);
548 return 0;
549 }
Benjamin Peterson312595c2013-05-15 15:26:42 -0500550 if (u->u_ste->ste_needs_class_closure) {
Martin Panter7462b6492015-11-02 03:37:02 +0000551 /* Cook up an implicit __class__ cell. */
Benjamin Peterson312595c2013-05-15 15:26:42 -0500552 _Py_IDENTIFIER(__class__);
553 PyObject *tuple, *name, *zero;
554 int res;
555 assert(u->u_scope_type == COMPILER_SCOPE_CLASS);
556 assert(PyDict_Size(u->u_cellvars) == 0);
557 name = _PyUnicode_FromId(&PyId___class__);
558 if (!name) {
559 compiler_unit_free(u);
560 return 0;
561 }
562 tuple = PyTuple_Pack(2, name, Py_TYPE(name));
563 if (!tuple) {
564 compiler_unit_free(u);
565 return 0;
566 }
567 zero = PyLong_FromLong(0);
568 if (!zero) {
569 Py_DECREF(tuple);
570 compiler_unit_free(u);
571 return 0;
572 }
573 res = PyDict_SetItem(u->u_cellvars, tuple, zero);
574 Py_DECREF(tuple);
575 Py_DECREF(zero);
576 if (res < 0) {
577 compiler_unit_free(u);
578 return 0;
579 }
580 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000581
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000582 u->u_freevars = dictbytype(u->u_ste->ste_symbols, FREE, DEF_FREE_CLASS,
583 PyDict_Size(u->u_cellvars));
584 if (!u->u_freevars) {
585 compiler_unit_free(u);
586 return 0;
587 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000588
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000589 u->u_blocks = NULL;
590 u->u_nfblocks = 0;
591 u->u_firstlineno = lineno;
592 u->u_lineno = 0;
Benjamin Petersond4efd9e2010-09-20 23:02:10 +0000593 u->u_col_offset = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000594 u->u_lineno_set = 0;
595 u->u_consts = PyDict_New();
596 if (!u->u_consts) {
597 compiler_unit_free(u);
598 return 0;
599 }
600 u->u_names = PyDict_New();
601 if (!u->u_names) {
602 compiler_unit_free(u);
603 return 0;
604 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000605
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000606 u->u_private = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000607
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000608 /* Push the old compiler_unit on the stack. */
609 if (c->u) {
Benjamin Peterson9e77f722015-05-07 18:41:47 -0400610 PyObject *capsule = PyCapsule_New(c->u, CAPSULE_NAME, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000611 if (!capsule || PyList_Append(c->c_stack, capsule) < 0) {
612 Py_XDECREF(capsule);
613 compiler_unit_free(u);
614 return 0;
615 }
616 Py_DECREF(capsule);
617 u->u_private = c->u->u_private;
618 Py_XINCREF(u->u_private);
619 }
620 c->u = u;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000621
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000622 c->c_nestlevel++;
623 if (compiler_use_new_block(c) == NULL)
624 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000625
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400626 if (u->u_scope_type != COMPILER_SCOPE_MODULE) {
627 if (!compiler_set_qualname(c))
628 return 0;
629 }
630
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000631 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000632}
633
Neil Schemenauerc396d9e2005-10-25 06:30:14 +0000634static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000635compiler_exit_scope(struct compiler *c)
636{
Victor Stinnerad9a0662013-11-19 22:23:20 +0100637 Py_ssize_t n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000638 PyObject *capsule;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000639
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000640 c->c_nestlevel--;
641 compiler_unit_free(c->u);
642 /* Restore c->u to the parent unit. */
643 n = PyList_GET_SIZE(c->c_stack) - 1;
644 if (n >= 0) {
645 capsule = PyList_GET_ITEM(c->c_stack, n);
Benjamin Peterson9e77f722015-05-07 18:41:47 -0400646 c->u = (struct compiler_unit *)PyCapsule_GetPointer(capsule, CAPSULE_NAME);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000647 assert(c->u);
648 /* we are deleting from a list so this really shouldn't fail */
649 if (PySequence_DelItem(c->c_stack, n) < 0)
650 Py_FatalError("compiler_exit_scope()");
651 compiler_unit_check(c->u);
652 }
653 else
654 c->u = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000655
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000656}
657
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400658static int
659compiler_set_qualname(struct compiler *c)
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100660{
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100661 _Py_static_string(dot, ".");
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400662 _Py_static_string(dot_locals, ".<locals>");
663 Py_ssize_t stack_size;
664 struct compiler_unit *u = c->u;
665 PyObject *name, *base, *dot_str, *dot_locals_str;
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100666
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400667 base = NULL;
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100668 stack_size = PyList_GET_SIZE(c->c_stack);
Benjamin Petersona8a38b82013-10-19 16:14:39 -0400669 assert(stack_size >= 1);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400670 if (stack_size > 1) {
671 int scope, force_global = 0;
672 struct compiler_unit *parent;
673 PyObject *mangled, *capsule;
674
Benjamin Peterson3d9e4812013-10-19 16:01:13 -0400675 capsule = PyList_GET_ITEM(c->c_stack, stack_size - 1);
Benjamin Peterson9e77f722015-05-07 18:41:47 -0400676 parent = (struct compiler_unit *)PyCapsule_GetPointer(capsule, CAPSULE_NAME);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400677 assert(parent);
678
Yury Selivanov75445082015-05-11 22:57:16 -0400679 if (u->u_scope_type == COMPILER_SCOPE_FUNCTION
680 || u->u_scope_type == COMPILER_SCOPE_ASYNC_FUNCTION
681 || u->u_scope_type == COMPILER_SCOPE_CLASS) {
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400682 assert(u->u_name);
683 mangled = _Py_Mangle(parent->u_private, u->u_name);
684 if (!mangled)
685 return 0;
686 scope = PyST_GetScope(parent->u_ste, mangled);
687 Py_DECREF(mangled);
688 assert(scope != GLOBAL_IMPLICIT);
689 if (scope == GLOBAL_EXPLICIT)
690 force_global = 1;
691 }
692
693 if (!force_global) {
694 if (parent->u_scope_type == COMPILER_SCOPE_FUNCTION
Yury Selivanov75445082015-05-11 22:57:16 -0400695 || parent->u_scope_type == COMPILER_SCOPE_ASYNC_FUNCTION
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400696 || parent->u_scope_type == COMPILER_SCOPE_LAMBDA) {
697 dot_locals_str = _PyUnicode_FromId(&dot_locals);
698 if (dot_locals_str == NULL)
699 return 0;
700 base = PyUnicode_Concat(parent->u_qualname, dot_locals_str);
701 if (base == NULL)
702 return 0;
703 }
704 else {
705 Py_INCREF(parent->u_qualname);
706 base = parent->u_qualname;
Benjamin Peterson3d9e4812013-10-19 16:01:13 -0400707 }
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100708 }
709 }
Benjamin Peterson3d9e4812013-10-19 16:01:13 -0400710
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400711 if (base != NULL) {
712 dot_str = _PyUnicode_FromId(&dot);
713 if (dot_str == NULL) {
714 Py_DECREF(base);
715 return 0;
716 }
717 name = PyUnicode_Concat(base, dot_str);
718 Py_DECREF(base);
719 if (name == NULL)
720 return 0;
721 PyUnicode_Append(&name, u->u_name);
722 if (name == NULL)
723 return 0;
724 }
725 else {
726 Py_INCREF(u->u_name);
727 name = u->u_name;
728 }
729 u->u_qualname = name;
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100730
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400731 return 1;
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100732}
733
Eric V. Smith235a6f02015-09-19 14:51:32 -0400734
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000735/* Allocate a new block and return a pointer to it.
736 Returns NULL on error.
737*/
738
739static basicblock *
740compiler_new_block(struct compiler *c)
741{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000742 basicblock *b;
743 struct compiler_unit *u;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000744
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000745 u = c->u;
746 b = (basicblock *)PyObject_Malloc(sizeof(basicblock));
747 if (b == NULL) {
748 PyErr_NoMemory();
749 return NULL;
750 }
751 memset((void *)b, 0, sizeof(basicblock));
752 /* Extend the singly linked list of blocks with new block. */
753 b->b_list = u->u_blocks;
754 u->u_blocks = b;
755 return b;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000756}
757
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000758static basicblock *
759compiler_use_new_block(struct compiler *c)
760{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000761 basicblock *block = compiler_new_block(c);
762 if (block == NULL)
763 return NULL;
764 c->u->u_curblock = block;
765 return block;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000766}
767
768static basicblock *
769compiler_next_block(struct compiler *c)
770{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000771 basicblock *block = compiler_new_block(c);
772 if (block == NULL)
773 return NULL;
774 c->u->u_curblock->b_next = block;
775 c->u->u_curblock = block;
776 return block;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000777}
778
779static basicblock *
780compiler_use_next_block(struct compiler *c, basicblock *block)
781{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000782 assert(block != NULL);
783 c->u->u_curblock->b_next = block;
784 c->u->u_curblock = block;
785 return block;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000786}
787
788/* Returns the offset of the next instruction in the current block's
789 b_instr array. Resizes the b_instr as necessary.
790 Returns -1 on failure.
Thomas Wouters89f507f2006-12-13 04:49:30 +0000791*/
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000792
793static int
794compiler_next_instr(struct compiler *c, basicblock *b)
795{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000796 assert(b != NULL);
797 if (b->b_instr == NULL) {
798 b->b_instr = (struct instr *)PyObject_Malloc(
799 sizeof(struct instr) * DEFAULT_BLOCK_SIZE);
800 if (b->b_instr == NULL) {
801 PyErr_NoMemory();
802 return -1;
803 }
804 b->b_ialloc = DEFAULT_BLOCK_SIZE;
805 memset((char *)b->b_instr, 0,
806 sizeof(struct instr) * DEFAULT_BLOCK_SIZE);
807 }
808 else if (b->b_iused == b->b_ialloc) {
809 struct instr *tmp;
810 size_t oldsize, newsize;
811 oldsize = b->b_ialloc * sizeof(struct instr);
812 newsize = oldsize << 1;
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000813
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000814 if (oldsize > (PY_SIZE_MAX >> 1)) {
815 PyErr_NoMemory();
816 return -1;
817 }
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000818
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000819 if (newsize == 0) {
820 PyErr_NoMemory();
821 return -1;
822 }
823 b->b_ialloc <<= 1;
824 tmp = (struct instr *)PyObject_Realloc(
825 (void *)b->b_instr, newsize);
826 if (tmp == NULL) {
827 PyErr_NoMemory();
828 return -1;
829 }
830 b->b_instr = tmp;
831 memset((char *)b->b_instr + oldsize, 0, newsize - oldsize);
832 }
833 return b->b_iused++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000834}
835
Christian Heimes2202f872008-02-06 14:31:34 +0000836/* Set the i_lineno member of the instruction at offset off if the
837 line number for the current expression/statement has not
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000838 already been set. If it has been set, the call has no effect.
839
Christian Heimes2202f872008-02-06 14:31:34 +0000840 The line number is reset in the following cases:
841 - when entering a new scope
842 - on each statement
843 - on each expression that start a new line
844 - before the "except" clause
845 - before the "for" and "while" expressions
Thomas Wouters89f507f2006-12-13 04:49:30 +0000846*/
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000847
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000848static void
849compiler_set_lineno(struct compiler *c, int off)
850{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000851 basicblock *b;
852 if (c->u->u_lineno_set)
853 return;
854 c->u->u_lineno_set = 1;
855 b = c->u->u_curblock;
856 b->b_instr[off].i_lineno = c->u->u_lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000857}
858
Larry Hastings3a907972013-11-23 14:49:22 -0800859int
860PyCompile_OpcodeStackEffect(int opcode, int oparg)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000861{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000862 switch (opcode) {
863 case POP_TOP:
864 return -1;
865 case ROT_TWO:
866 case ROT_THREE:
867 return 0;
868 case DUP_TOP:
869 return 1;
Antoine Pitrou74a69fa2010-09-04 18:43:52 +0000870 case DUP_TOP_TWO:
871 return 2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000872
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000873 case UNARY_POSITIVE:
874 case UNARY_NEGATIVE:
875 case UNARY_NOT:
876 case UNARY_INVERT:
877 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000878
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000879 case SET_ADD:
880 case LIST_APPEND:
881 return -1;
882 case MAP_ADD:
883 return -2;
Neal Norwitz10be2ea2006-03-03 20:29:11 +0000884
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000885 case BINARY_POWER:
886 case BINARY_MULTIPLY:
Benjamin Petersond51374e2014-04-09 23:55:56 -0400887 case BINARY_MATRIX_MULTIPLY:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000888 case BINARY_MODULO:
889 case BINARY_ADD:
890 case BINARY_SUBTRACT:
891 case BINARY_SUBSCR:
892 case BINARY_FLOOR_DIVIDE:
893 case BINARY_TRUE_DIVIDE:
894 return -1;
895 case INPLACE_FLOOR_DIVIDE:
896 case INPLACE_TRUE_DIVIDE:
897 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000898
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000899 case INPLACE_ADD:
900 case INPLACE_SUBTRACT:
901 case INPLACE_MULTIPLY:
Benjamin Petersond51374e2014-04-09 23:55:56 -0400902 case INPLACE_MATRIX_MULTIPLY:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000903 case INPLACE_MODULO:
904 return -1;
905 case STORE_SUBSCR:
906 return -3;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000907 case DELETE_SUBSCR:
908 return -2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000909
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000910 case BINARY_LSHIFT:
911 case BINARY_RSHIFT:
912 case BINARY_AND:
913 case BINARY_XOR:
914 case BINARY_OR:
915 return -1;
916 case INPLACE_POWER:
917 return -1;
918 case GET_ITER:
919 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000920
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000921 case PRINT_EXPR:
922 return -1;
923 case LOAD_BUILD_CLASS:
924 return 1;
925 case INPLACE_LSHIFT:
926 case INPLACE_RSHIFT:
927 case INPLACE_AND:
928 case INPLACE_XOR:
929 case INPLACE_OR:
930 return -1;
931 case BREAK_LOOP:
932 return 0;
933 case SETUP_WITH:
934 return 7;
Yury Selivanov75445082015-05-11 22:57:16 -0400935 case WITH_CLEANUP_START:
936 return 1;
937 case WITH_CLEANUP_FINISH:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000938 return -1; /* XXX Sometimes more */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000939 case RETURN_VALUE:
940 return -1;
941 case IMPORT_STAR:
942 return -1;
943 case YIELD_VALUE:
944 return 0;
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -0500945 case YIELD_FROM:
946 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000947 case POP_BLOCK:
948 return 0;
949 case POP_EXCEPT:
950 return 0; /* -3 except if bad bytecode */
951 case END_FINALLY:
952 return -1; /* or -2 or -3 if exception occurred */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000953
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000954 case STORE_NAME:
955 return -1;
956 case DELETE_NAME:
957 return 0;
958 case UNPACK_SEQUENCE:
959 return oparg-1;
960 case UNPACK_EX:
961 return (oparg&0xFF) + (oparg>>8);
962 case FOR_ITER:
963 return 1; /* or -1, at end of iterator */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000964
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000965 case STORE_ATTR:
966 return -2;
967 case DELETE_ATTR:
968 return -1;
969 case STORE_GLOBAL:
970 return -1;
971 case DELETE_GLOBAL:
972 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000973 case LOAD_CONST:
974 return 1;
975 case LOAD_NAME:
976 return 1;
977 case BUILD_TUPLE:
978 case BUILD_LIST:
979 case BUILD_SET:
980 return 1-oparg;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400981 case BUILD_LIST_UNPACK:
982 case BUILD_TUPLE_UNPACK:
983 case BUILD_SET_UNPACK:
984 case BUILD_MAP_UNPACK:
985 return 1 - oparg;
986 case BUILD_MAP_UNPACK_WITH_CALL:
987 return 1 - (oparg & 0xFF);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000988 case BUILD_MAP:
Benjamin Petersonb6855152015-09-10 21:02:39 -0700989 return 1 - 2*oparg;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000990 case LOAD_ATTR:
991 return 0;
992 case COMPARE_OP:
993 return -1;
994 case IMPORT_NAME:
995 return -1;
996 case IMPORT_FROM:
997 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000998
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000999 case JUMP_FORWARD:
1000 case JUMP_IF_TRUE_OR_POP: /* -1 if jump not taken */
1001 case JUMP_IF_FALSE_OR_POP: /* "" */
1002 case JUMP_ABSOLUTE:
1003 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001004
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001005 case POP_JUMP_IF_FALSE:
1006 case POP_JUMP_IF_TRUE:
1007 return -1;
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00001008
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001009 case LOAD_GLOBAL:
1010 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001011
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001012 case CONTINUE_LOOP:
1013 return 0;
1014 case SETUP_LOOP:
1015 return 0;
1016 case SETUP_EXCEPT:
1017 case SETUP_FINALLY:
1018 return 6; /* can push 3 values for the new exception
1019 + 3 others for the previous exception state */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001020
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001021 case LOAD_FAST:
1022 return 1;
1023 case STORE_FAST:
1024 return -1;
1025 case DELETE_FAST:
1026 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001027
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001028 case RAISE_VARARGS:
1029 return -oparg;
Neal Norwitzc1505362006-12-28 06:47:50 +00001030#define NARGS(o) (((o) % 256) + 2*(((o) / 256) % 256))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001031 case CALL_FUNCTION:
1032 return -NARGS(oparg);
1033 case CALL_FUNCTION_VAR:
1034 case CALL_FUNCTION_KW:
1035 return -NARGS(oparg)-1;
1036 case CALL_FUNCTION_VAR_KW:
1037 return -NARGS(oparg)-2;
1038 case MAKE_FUNCTION:
Antoine Pitrou86a36b52011-11-25 18:56:07 +01001039 return -1 -NARGS(oparg) - ((oparg >> 16) & 0xffff);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001040 case MAKE_CLOSURE:
Antoine Pitrou86a36b52011-11-25 18:56:07 +01001041 return -2 - NARGS(oparg) - ((oparg >> 16) & 0xffff);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001042#undef NARGS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001043 case BUILD_SLICE:
1044 if (oparg == 3)
1045 return -2;
1046 else
1047 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001048
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001049 case LOAD_CLOSURE:
1050 return 1;
1051 case LOAD_DEREF:
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04001052 case LOAD_CLASSDEREF:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001053 return 1;
1054 case STORE_DEREF:
1055 return -1;
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00001056 case DELETE_DEREF:
1057 return 0;
Yury Selivanov75445082015-05-11 22:57:16 -04001058 case GET_AWAITABLE:
1059 return 0;
1060 case SETUP_ASYNC_WITH:
1061 return 6;
1062 case BEFORE_ASYNC_WITH:
1063 return 1;
1064 case GET_AITER:
1065 return 0;
1066 case GET_ANEXT:
1067 return 1;
Yury Selivanov5376ba92015-06-22 12:19:30 -04001068 case GET_YIELD_FROM_ITER:
1069 return 0;
Eric V. Smitha78c7952015-11-03 12:45:05 -05001070 case FORMAT_VALUE:
1071 /* If there's a fmt_spec on the stack, we go from 2->1,
1072 else 1->1. */
1073 return (oparg & FVS_MASK) == FVS_HAVE_SPEC ? -1 : 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001074 default:
Larry Hastings3a907972013-11-23 14:49:22 -08001075 return PY_INVALID_STACK_EFFECT;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001076 }
Larry Hastings3a907972013-11-23 14:49:22 -08001077 return PY_INVALID_STACK_EFFECT; /* not reachable */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001078}
1079
1080/* Add an opcode with no argument.
1081 Returns 0 on failure, 1 on success.
1082*/
1083
1084static int
1085compiler_addop(struct compiler *c, int opcode)
1086{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001087 basicblock *b;
1088 struct instr *i;
1089 int off;
1090 off = compiler_next_instr(c, c->u->u_curblock);
1091 if (off < 0)
1092 return 0;
1093 b = c->u->u_curblock;
1094 i = &b->b_instr[off];
1095 i->i_opcode = opcode;
1096 i->i_hasarg = 0;
1097 if (opcode == RETURN_VALUE)
1098 b->b_return = 1;
1099 compiler_set_lineno(c, off);
1100 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001101}
1102
Victor Stinnerf8e32212013-11-19 23:56:34 +01001103static Py_ssize_t
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001104compiler_add_o(struct compiler *c, PyObject *dict, PyObject *o)
1105{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001106 PyObject *t, *v;
1107 Py_ssize_t arg;
1108 double d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001109
Serhiy Storchaka95949422013-08-27 19:40:23 +03001110 /* necessary to make sure types aren't coerced (e.g., float and complex) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001111 /* _and_ to distinguish 0.0 from -0.0 e.g. on IEEE platforms */
1112 if (PyFloat_Check(o)) {
1113 d = PyFloat_AS_DOUBLE(o);
1114 /* all we need is to make the tuple different in either the 0.0
1115 * or -0.0 case from all others, just to avoid the "coercion".
1116 */
1117 if (d == 0.0 && copysign(1.0, d) < 0.0)
1118 t = PyTuple_Pack(3, o, o->ob_type, Py_None);
1119 else
1120 t = PyTuple_Pack(2, o, o->ob_type);
1121 }
1122 else if (PyComplex_Check(o)) {
1123 Py_complex z;
1124 int real_negzero, imag_negzero;
1125 /* For the complex case we must make complex(x, 0.)
1126 different from complex(x, -0.) and complex(0., y)
1127 different from complex(-0., y), for any x and y.
1128 All four complex zeros must be distinguished.*/
1129 z = PyComplex_AsCComplex(o);
1130 real_negzero = z.real == 0.0 && copysign(1.0, z.real) < 0.0;
1131 imag_negzero = z.imag == 0.0 && copysign(1.0, z.imag) < 0.0;
1132 if (real_negzero && imag_negzero) {
1133 t = PyTuple_Pack(5, o, o->ob_type,
1134 Py_None, Py_None, Py_None);
Christian Heimes400adb02008-02-01 08:12:03 +00001135 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001136 else if (imag_negzero) {
1137 t = PyTuple_Pack(4, o, o->ob_type, Py_None, Py_None);
Guido van Rossum04110fb2007-08-24 16:32:05 +00001138 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001139 else if (real_negzero) {
1140 t = PyTuple_Pack(3, o, o->ob_type, Py_None);
1141 }
1142 else {
1143 t = PyTuple_Pack(2, o, o->ob_type);
1144 }
1145 }
1146 else {
1147 t = PyTuple_Pack(2, o, o->ob_type);
1148 }
1149 if (t == NULL)
1150 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001151
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001152 v = PyDict_GetItem(dict, t);
1153 if (!v) {
Stefan Krahc0cbed12015-07-27 12:56:49 +02001154 if (PyErr_Occurred()) {
1155 Py_DECREF(t);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001156 return -1;
Stefan Krahc0cbed12015-07-27 12:56:49 +02001157 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001158 arg = PyDict_Size(dict);
Victor Stinnerad9a0662013-11-19 22:23:20 +01001159 v = PyLong_FromSsize_t(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001160 if (!v) {
1161 Py_DECREF(t);
1162 return -1;
1163 }
1164 if (PyDict_SetItem(dict, t, v) < 0) {
1165 Py_DECREF(t);
1166 Py_DECREF(v);
1167 return -1;
1168 }
1169 Py_DECREF(v);
1170 }
1171 else
1172 arg = PyLong_AsLong(v);
1173 Py_DECREF(t);
1174 return arg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001175}
1176
1177static int
1178compiler_addop_o(struct compiler *c, int opcode, PyObject *dict,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001179 PyObject *o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001180{
Victor Stinnerad9a0662013-11-19 22:23:20 +01001181 Py_ssize_t arg = compiler_add_o(c, dict, o);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001182 if (arg < 0)
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00001183 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001184 return compiler_addop_i(c, opcode, arg);
1185}
1186
1187static int
1188compiler_addop_name(struct compiler *c, int opcode, PyObject *dict,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001189 PyObject *o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001190{
Victor Stinnerad9a0662013-11-19 22:23:20 +01001191 Py_ssize_t arg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001192 PyObject *mangled = _Py_Mangle(c->u->u_private, o);
1193 if (!mangled)
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00001194 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001195 arg = compiler_add_o(c, dict, mangled);
1196 Py_DECREF(mangled);
1197 if (arg < 0)
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00001198 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001199 return compiler_addop_i(c, opcode, arg);
1200}
1201
1202/* Add an opcode with an integer argument.
1203 Returns 0 on failure, 1 on success.
1204*/
1205
1206static int
Victor Stinnerf8e32212013-11-19 23:56:34 +01001207compiler_addop_i(struct compiler *c, int opcode, Py_ssize_t oparg)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001208{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001209 struct instr *i;
1210 int off;
Victor Stinnerad9a0662013-11-19 22:23:20 +01001211
1212 /* Integer arguments are limit to 16-bit. There is an extension for 32-bit
1213 integer arguments. */
Victor Stinnerf8e32212013-11-19 23:56:34 +01001214 assert((-2147483647-1) <= oparg);
1215 assert(oparg <= 2147483647);
Victor Stinnerad9a0662013-11-19 22:23:20 +01001216
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001217 off = compiler_next_instr(c, c->u->u_curblock);
1218 if (off < 0)
1219 return 0;
1220 i = &c->u->u_curblock->b_instr[off];
Victor Stinnerf8e32212013-11-19 23:56:34 +01001221 i->i_opcode = opcode;
1222 i->i_oparg = Py_SAFE_DOWNCAST(oparg, Py_ssize_t, int);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001223 i->i_hasarg = 1;
1224 compiler_set_lineno(c, off);
1225 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001226}
1227
1228static int
1229compiler_addop_j(struct compiler *c, int opcode, basicblock *b, int absolute)
1230{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001231 struct instr *i;
1232 int off;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001233
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001234 assert(b != NULL);
1235 off = compiler_next_instr(c, c->u->u_curblock);
1236 if (off < 0)
1237 return 0;
1238 i = &c->u->u_curblock->b_instr[off];
1239 i->i_opcode = opcode;
1240 i->i_target = b;
1241 i->i_hasarg = 1;
1242 if (absolute)
1243 i->i_jabs = 1;
1244 else
1245 i->i_jrel = 1;
1246 compiler_set_lineno(c, off);
1247 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001248}
1249
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001250/* The distinction between NEW_BLOCK and NEXT_BLOCK is subtle. (I'd
1251 like to find better names.) NEW_BLOCK() creates a new block and sets
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001252 it as the current block. NEXT_BLOCK() also creates an implicit jump
1253 from the current block to the new block.
1254*/
1255
Thomas Wouters89f507f2006-12-13 04:49:30 +00001256/* The returns inside these macros make it impossible to decref objects
1257 created in the local function. Local objects should use the arena.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001258*/
1259
1260
1261#define NEW_BLOCK(C) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001262 if (compiler_use_new_block((C)) == NULL) \
1263 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001264}
1265
1266#define NEXT_BLOCK(C) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001267 if (compiler_next_block((C)) == NULL) \
1268 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001269}
1270
1271#define ADDOP(C, OP) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001272 if (!compiler_addop((C), (OP))) \
1273 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001274}
1275
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001276#define ADDOP_IN_SCOPE(C, OP) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001277 if (!compiler_addop((C), (OP))) { \
1278 compiler_exit_scope(c); \
1279 return 0; \
1280 } \
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001281}
1282
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001283#define ADDOP_O(C, OP, O, TYPE) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001284 if (!compiler_addop_o((C), (OP), (C)->u->u_ ## TYPE, (O))) \
1285 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001286}
1287
1288#define ADDOP_NAME(C, OP, O, TYPE) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001289 if (!compiler_addop_name((C), (OP), (C)->u->u_ ## TYPE, (O))) \
1290 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001291}
1292
1293#define ADDOP_I(C, OP, O) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001294 if (!compiler_addop_i((C), (OP), (O))) \
1295 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001296}
1297
1298#define ADDOP_JABS(C, OP, O) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001299 if (!compiler_addop_j((C), (OP), (O), 1)) \
1300 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001301}
1302
1303#define ADDOP_JREL(C, OP, O) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001304 if (!compiler_addop_j((C), (OP), (O), 0)) \
1305 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001306}
1307
1308/* VISIT and VISIT_SEQ takes an ASDL type as their second argument. They use
1309 the ASDL name to synthesize the name of the C type and the visit function.
1310*/
1311
1312#define VISIT(C, TYPE, V) {\
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001313 if (!compiler_visit_ ## TYPE((C), (V))) \
1314 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001315}
1316
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001317#define VISIT_IN_SCOPE(C, TYPE, V) {\
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001318 if (!compiler_visit_ ## TYPE((C), (V))) { \
1319 compiler_exit_scope(c); \
1320 return 0; \
1321 } \
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001322}
1323
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001324#define VISIT_SLICE(C, V, CTX) {\
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001325 if (!compiler_visit_slice((C), (V), (CTX))) \
1326 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001327}
1328
1329#define VISIT_SEQ(C, TYPE, SEQ) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001330 int _i; \
1331 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
1332 for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \
1333 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \
1334 if (!compiler_visit_ ## TYPE((C), elt)) \
1335 return 0; \
1336 } \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001337}
1338
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001339#define VISIT_SEQ_IN_SCOPE(C, TYPE, SEQ) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001340 int _i; \
1341 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
1342 for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \
1343 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \
1344 if (!compiler_visit_ ## TYPE((C), elt)) { \
1345 compiler_exit_scope(c); \
1346 return 0; \
1347 } \
1348 } \
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001349}
1350
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001351static int
1352compiler_isdocstring(stmt_ty s)
1353{
1354 if (s->kind != Expr_kind)
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00001355 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001356 return s->v.Expr.value->kind == Str_kind;
1357}
1358
1359/* Compile a sequence of statements, checking for a docstring. */
1360
1361static int
1362compiler_body(struct compiler *c, asdl_seq *stmts)
1363{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001364 int i = 0;
1365 stmt_ty st;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001366
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001367 if (!asdl_seq_LEN(stmts))
1368 return 1;
1369 st = (stmt_ty)asdl_seq_GET(stmts, 0);
Georg Brandl8334fd92010-12-04 10:26:46 +00001370 if (compiler_isdocstring(st) && c->c_optimize < 2) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001371 /* don't generate docstrings if -OO */
1372 i = 1;
1373 VISIT(c, expr, st->v.Expr.value);
1374 if (!compiler_nameop(c, __doc__, Store))
1375 return 0;
1376 }
1377 for (; i < asdl_seq_LEN(stmts); i++)
1378 VISIT(c, stmt, (stmt_ty)asdl_seq_GET(stmts, i));
1379 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001380}
1381
1382static PyCodeObject *
1383compiler_mod(struct compiler *c, mod_ty mod)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001384{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001385 PyCodeObject *co;
1386 int addNone = 1;
1387 static PyObject *module;
1388 if (!module) {
1389 module = PyUnicode_InternFromString("<module>");
1390 if (!module)
1391 return NULL;
1392 }
1393 /* Use 0 for firstlineno initially, will fixup in assemble(). */
Antoine Pitrou86a36b52011-11-25 18:56:07 +01001394 if (!compiler_enter_scope(c, module, COMPILER_SCOPE_MODULE, mod, 0))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001395 return NULL;
1396 switch (mod->kind) {
1397 case Module_kind:
1398 if (!compiler_body(c, mod->v.Module.body)) {
1399 compiler_exit_scope(c);
1400 return 0;
1401 }
1402 break;
1403 case Interactive_kind:
1404 c->c_interactive = 1;
1405 VISIT_SEQ_IN_SCOPE(c, stmt,
1406 mod->v.Interactive.body);
1407 break;
1408 case Expression_kind:
1409 VISIT_IN_SCOPE(c, expr, mod->v.Expression.body);
1410 addNone = 0;
1411 break;
1412 case Suite_kind:
1413 PyErr_SetString(PyExc_SystemError,
1414 "suite should not be possible");
1415 return 0;
1416 default:
1417 PyErr_Format(PyExc_SystemError,
1418 "module kind %d should not be possible",
1419 mod->kind);
1420 return 0;
1421 }
1422 co = assemble(c, addNone);
1423 compiler_exit_scope(c);
1424 return co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001425}
1426
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001427/* The test for LOCAL must come before the test for FREE in order to
1428 handle classes where name is both local and free. The local var is
1429 a method and the free var is a free var referenced within a method.
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001430*/
1431
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001432static int
1433get_ref_type(struct compiler *c, PyObject *name)
1434{
Victor Stinner0b1bc562013-05-16 22:17:17 +02001435 int scope;
Benjamin Peterson312595c2013-05-15 15:26:42 -05001436 if (c->u->u_scope_type == COMPILER_SCOPE_CLASS &&
1437 !PyUnicode_CompareWithASCIIString(name, "__class__"))
1438 return CELL;
Victor Stinner0b1bc562013-05-16 22:17:17 +02001439 scope = PyST_GetScope(c->u->u_ste, name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001440 if (scope == 0) {
1441 char buf[350];
1442 PyOS_snprintf(buf, sizeof(buf),
Victor Stinner14e461d2013-08-26 22:28:21 +02001443 "unknown scope for %.100s in %.100s(%s)\n"
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001444 "symbols: %s\nlocals: %s\nglobals: %s",
Serhiy Storchakadf4518c2014-11-18 23:34:33 +02001445 PyUnicode_AsUTF8(name),
1446 PyUnicode_AsUTF8(c->u->u_name),
1447 PyUnicode_AsUTF8(PyObject_Repr(c->u->u_ste->ste_id)),
1448 PyUnicode_AsUTF8(PyObject_Repr(c->u->u_ste->ste_symbols)),
1449 PyUnicode_AsUTF8(PyObject_Repr(c->u->u_varnames)),
1450 PyUnicode_AsUTF8(PyObject_Repr(c->u->u_names))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001451 );
1452 Py_FatalError(buf);
1453 }
Tim Peters2a7f3842001-06-09 09:26:21 +00001454
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001455 return scope;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001456}
1457
1458static int
1459compiler_lookup_arg(PyObject *dict, PyObject *name)
1460{
1461 PyObject *k, *v;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001462 k = PyTuple_Pack(2, name, name->ob_type);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001463 if (k == NULL)
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00001464 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001465 v = PyDict_GetItem(dict, k);
Neal Norwitz3715c3e2005-11-24 22:09:18 +00001466 Py_DECREF(k);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001467 if (v == NULL)
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00001468 return -1;
Christian Heimes217cfd12007-12-02 14:31:20 +00001469 return PyLong_AS_LONG(v);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001470}
1471
1472static int
Victor Stinnerad9a0662013-11-19 22:23:20 +01001473compiler_make_closure(struct compiler *c, PyCodeObject *co, Py_ssize_t args, PyObject *qualname)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001474{
Victor Stinnerad9a0662013-11-19 22:23:20 +01001475 Py_ssize_t i, free = PyCode_GetNumFree(co);
Antoine Pitrou86a36b52011-11-25 18:56:07 +01001476 if (qualname == NULL)
1477 qualname = co->co_name;
1478
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001479 if (free == 0) {
1480 ADDOP_O(c, LOAD_CONST, (PyObject*)co, consts);
Antoine Pitrou86a36b52011-11-25 18:56:07 +01001481 ADDOP_O(c, LOAD_CONST, qualname, consts);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001482 ADDOP_I(c, MAKE_FUNCTION, args);
1483 return 1;
1484 }
1485 for (i = 0; i < free; ++i) {
1486 /* Bypass com_addop_varname because it will generate
1487 LOAD_DEREF but LOAD_CLOSURE is needed.
1488 */
1489 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
1490 int arg, reftype;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001491
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001492 /* Special case: If a class contains a method with a
1493 free variable that has the same name as a method,
1494 the name will be considered free *and* local in the
1495 class. It should be handled by the closure, as
1496 well as by the normal name loookup logic.
1497 */
1498 reftype = get_ref_type(c, name);
1499 if (reftype == CELL)
1500 arg = compiler_lookup_arg(c->u->u_cellvars, name);
1501 else /* (reftype == FREE) */
1502 arg = compiler_lookup_arg(c->u->u_freevars, name);
1503 if (arg == -1) {
1504 fprintf(stderr,
1505 "lookup %s in %s %d %d\n"
1506 "freevars of %s: %s\n",
Serhiy Storchakadf4518c2014-11-18 23:34:33 +02001507 PyUnicode_AsUTF8(PyObject_Repr(name)),
1508 PyUnicode_AsUTF8(c->u->u_name),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001509 reftype, arg,
Serhiy Storchakadf4518c2014-11-18 23:34:33 +02001510 PyUnicode_AsUTF8(co->co_name),
1511 PyUnicode_AsUTF8(PyObject_Repr(co->co_freevars)));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001512 Py_FatalError("compiler_make_closure()");
1513 }
1514 ADDOP_I(c, LOAD_CLOSURE, arg);
1515 }
1516 ADDOP_I(c, BUILD_TUPLE, free);
1517 ADDOP_O(c, LOAD_CONST, (PyObject*)co, consts);
Antoine Pitrou86a36b52011-11-25 18:56:07 +01001518 ADDOP_O(c, LOAD_CONST, qualname, consts);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001519 ADDOP_I(c, MAKE_CLOSURE, args);
1520 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001521}
1522
1523static int
1524compiler_decorators(struct compiler *c, asdl_seq* decos)
1525{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001526 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001527
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001528 if (!decos)
1529 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001530
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001531 for (i = 0; i < asdl_seq_LEN(decos); i++) {
1532 VISIT(c, expr, (expr_ty)asdl_seq_GET(decos, i));
1533 }
1534 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001535}
1536
1537static int
Guido van Rossum4f72a782006-10-27 23:31:49 +00001538compiler_visit_kwonlydefaults(struct compiler *c, asdl_seq *kwonlyargs,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001539 asdl_seq *kw_defaults)
Guido van Rossum4f72a782006-10-27 23:31:49 +00001540{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001541 int i, default_count = 0;
1542 for (i = 0; i < asdl_seq_LEN(kwonlyargs); i++) {
1543 arg_ty arg = asdl_seq_GET(kwonlyargs, i);
1544 expr_ty default_ = asdl_seq_GET(kw_defaults, i);
1545 if (default_) {
Benjamin Peterson32c59b62012-04-17 19:53:21 -04001546 PyObject *mangled = _Py_Mangle(c->u->u_private, arg->arg);
1547 if (!mangled)
1548 return -1;
1549 ADDOP_O(c, LOAD_CONST, mangled, consts);
1550 Py_DECREF(mangled);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001551 if (!compiler_visit_expr(c, default_)) {
1552 return -1;
1553 }
1554 default_count++;
1555 }
1556 }
1557 return default_count;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001558}
1559
1560static int
Neal Norwitzc1505362006-12-28 06:47:50 +00001561compiler_visit_argannotation(struct compiler *c, identifier id,
1562 expr_ty annotation, PyObject *names)
1563{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001564 if (annotation) {
Victor Stinner065efc32014-02-18 22:07:56 +01001565 PyObject *mangled;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001566 VISIT(c, expr, annotation);
Victor Stinner065efc32014-02-18 22:07:56 +01001567 mangled = _Py_Mangle(c->u->u_private, id);
Yury Selivanov34ce99f2014-02-18 12:49:41 -05001568 if (!mangled)
Yury Selivanovf315c1c2015-07-23 09:10:44 +03001569 return 0;
Yury Selivanov34ce99f2014-02-18 12:49:41 -05001570 if (PyList_Append(names, mangled) < 0) {
1571 Py_DECREF(mangled);
Yury Selivanovf315c1c2015-07-23 09:10:44 +03001572 return 0;
Yury Selivanov34ce99f2014-02-18 12:49:41 -05001573 }
1574 Py_DECREF(mangled);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001575 }
Yury Selivanovf315c1c2015-07-23 09:10:44 +03001576 return 1;
Neal Norwitzc1505362006-12-28 06:47:50 +00001577}
1578
1579static int
1580compiler_visit_argannotations(struct compiler *c, asdl_seq* args,
1581 PyObject *names)
1582{
Yury Selivanovf315c1c2015-07-23 09:10:44 +03001583 int i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001584 for (i = 0; i < asdl_seq_LEN(args); i++) {
1585 arg_ty arg = (arg_ty)asdl_seq_GET(args, i);
Yury Selivanovf315c1c2015-07-23 09:10:44 +03001586 if (!compiler_visit_argannotation(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001587 c,
1588 arg->arg,
1589 arg->annotation,
Yury Selivanovf315c1c2015-07-23 09:10:44 +03001590 names))
1591 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001592 }
Yury Selivanovf315c1c2015-07-23 09:10:44 +03001593 return 1;
Neal Norwitzc1505362006-12-28 06:47:50 +00001594}
1595
1596static int
1597compiler_visit_annotations(struct compiler *c, arguments_ty args,
1598 expr_ty returns)
1599{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001600 /* Push arg annotations and a list of the argument names. Return the #
1601 of items pushed. The expressions are evaluated out-of-order wrt the
1602 source code.
Neal Norwitzc1505362006-12-28 06:47:50 +00001603
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001604 More than 2^16-1 annotations is a SyntaxError. Returns -1 on error.
1605 */
1606 static identifier return_str;
1607 PyObject *names;
Victor Stinnerad9a0662013-11-19 22:23:20 +01001608 Py_ssize_t len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001609 names = PyList_New(0);
1610 if (!names)
1611 return -1;
Neal Norwitzc1505362006-12-28 06:47:50 +00001612
Yury Selivanovf315c1c2015-07-23 09:10:44 +03001613 if (!compiler_visit_argannotations(c, args->args, names))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001614 goto error;
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001615 if (args->vararg && args->vararg->annotation &&
Yury Selivanovf315c1c2015-07-23 09:10:44 +03001616 !compiler_visit_argannotation(c, args->vararg->arg,
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001617 args->vararg->annotation, names))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001618 goto error;
Yury Selivanovf315c1c2015-07-23 09:10:44 +03001619 if (!compiler_visit_argannotations(c, args->kwonlyargs, names))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001620 goto error;
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001621 if (args->kwarg && args->kwarg->annotation &&
Yury Selivanovf315c1c2015-07-23 09:10:44 +03001622 !compiler_visit_argannotation(c, args->kwarg->arg,
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001623 args->kwarg->annotation, names))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001624 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +00001625
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001626 if (!return_str) {
1627 return_str = PyUnicode_InternFromString("return");
1628 if (!return_str)
1629 goto error;
1630 }
Yury Selivanovf315c1c2015-07-23 09:10:44 +03001631 if (!compiler_visit_argannotation(c, return_str, returns, names)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001632 goto error;
1633 }
1634
1635 len = PyList_GET_SIZE(names);
1636 if (len > 65534) {
1637 /* len must fit in 16 bits, and len is incremented below */
1638 PyErr_SetString(PyExc_SyntaxError,
1639 "too many annotations");
1640 goto error;
1641 }
1642 if (len) {
1643 /* convert names to a tuple and place on stack */
1644 PyObject *elt;
Victor Stinnerad9a0662013-11-19 22:23:20 +01001645 Py_ssize_t i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001646 PyObject *s = PyTuple_New(len);
1647 if (!s)
1648 goto error;
1649 for (i = 0; i < len; i++) {
1650 elt = PyList_GET_ITEM(names, i);
1651 Py_INCREF(elt);
1652 PyTuple_SET_ITEM(s, i, elt);
1653 }
1654 ADDOP_O(c, LOAD_CONST, s, consts);
1655 Py_DECREF(s);
1656 len++; /* include the just-pushed tuple */
1657 }
1658 Py_DECREF(names);
Victor Stinnerad9a0662013-11-19 22:23:20 +01001659
1660 /* We just checked that len <= 65535, see above */
1661 return Py_SAFE_DOWNCAST(len, Py_ssize_t, int);
Neal Norwitzc1505362006-12-28 06:47:50 +00001662
1663error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001664 Py_DECREF(names);
1665 return -1;
Neal Norwitzc1505362006-12-28 06:47:50 +00001666}
1667
1668static int
Yury Selivanov75445082015-05-11 22:57:16 -04001669compiler_function(struct compiler *c, stmt_ty s, int is_async)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001670{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001671 PyCodeObject *co;
Antoine Pitrou86a36b52011-11-25 18:56:07 +01001672 PyObject *qualname, *first_const = Py_None;
Yury Selivanov75445082015-05-11 22:57:16 -04001673 arguments_ty args;
1674 expr_ty returns;
1675 identifier name;
1676 asdl_seq* decos;
1677 asdl_seq *body;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001678 stmt_ty st;
Victor Stinnerad9a0662013-11-19 22:23:20 +01001679 Py_ssize_t i, n, arglength;
1680 int docstring, kw_default_count = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001681 int num_annotations;
Yury Selivanov75445082015-05-11 22:57:16 -04001682 int scope_type;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001683
Yury Selivanov75445082015-05-11 22:57:16 -04001684
1685 if (is_async) {
1686 assert(s->kind == AsyncFunctionDef_kind);
1687
1688 args = s->v.AsyncFunctionDef.args;
1689 returns = s->v.AsyncFunctionDef.returns;
1690 decos = s->v.AsyncFunctionDef.decorator_list;
1691 name = s->v.AsyncFunctionDef.name;
1692 body = s->v.AsyncFunctionDef.body;
1693
1694 scope_type = COMPILER_SCOPE_ASYNC_FUNCTION;
1695 } else {
1696 assert(s->kind == FunctionDef_kind);
1697
1698 args = s->v.FunctionDef.args;
1699 returns = s->v.FunctionDef.returns;
1700 decos = s->v.FunctionDef.decorator_list;
1701 name = s->v.FunctionDef.name;
1702 body = s->v.FunctionDef.body;
1703
1704 scope_type = COMPILER_SCOPE_FUNCTION;
1705 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001706
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001707 if (!compiler_decorators(c, decos))
1708 return 0;
Benjamin Peterson1ef876c2013-02-10 09:29:59 -05001709 if (args->defaults)
1710 VISIT_SEQ(c, expr, args->defaults);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001711 if (args->kwonlyargs) {
1712 int res = compiler_visit_kwonlydefaults(c, args->kwonlyargs,
1713 args->kw_defaults);
1714 if (res < 0)
1715 return 0;
1716 kw_default_count = res;
1717 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001718 num_annotations = compiler_visit_annotations(c, args, returns);
1719 if (num_annotations < 0)
1720 return 0;
1721 assert((num_annotations & 0xFFFF) == num_annotations);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001722
Yury Selivanov75445082015-05-11 22:57:16 -04001723 if (!compiler_enter_scope(c, name,
1724 scope_type, (void *)s,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001725 s->lineno))
1726 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001727
Yury Selivanov75445082015-05-11 22:57:16 -04001728 st = (stmt_ty)asdl_seq_GET(body, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001729 docstring = compiler_isdocstring(st);
Georg Brandl8334fd92010-12-04 10:26:46 +00001730 if (docstring && c->c_optimize < 2)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001731 first_const = st->v.Expr.value->v.Str.s;
1732 if (compiler_add_o(c, c->u->u_consts, first_const) < 0) {
1733 compiler_exit_scope(c);
1734 return 0;
1735 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001736
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001737 c->u->u_argcount = asdl_seq_LEN(args->args);
1738 c->u->u_kwonlyargcount = asdl_seq_LEN(args->kwonlyargs);
Yury Selivanov75445082015-05-11 22:57:16 -04001739 n = asdl_seq_LEN(body);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001740 /* if there was a docstring, we need to skip the first statement */
1741 for (i = docstring; i < n; i++) {
Yury Selivanov75445082015-05-11 22:57:16 -04001742 st = (stmt_ty)asdl_seq_GET(body, i);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001743 VISIT_IN_SCOPE(c, stmt, st);
1744 }
1745 co = assemble(c, 1);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04001746 qualname = c->u->u_qualname;
1747 Py_INCREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001748 compiler_exit_scope(c);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04001749 if (co == NULL) {
Antoine Pitrou86a36b52011-11-25 18:56:07 +01001750 Py_XDECREF(qualname);
1751 Py_XDECREF(co);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001752 return 0;
Antoine Pitrou86a36b52011-11-25 18:56:07 +01001753 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001754
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001755 arglength = asdl_seq_LEN(args->defaults);
1756 arglength |= kw_default_count << 8;
1757 arglength |= num_annotations << 16;
Yury Selivanovb7666a32015-07-22 14:48:57 +03001758 if (is_async)
1759 co->co_flags |= CO_COROUTINE;
Antoine Pitrou86a36b52011-11-25 18:56:07 +01001760 compiler_make_closure(c, co, arglength, qualname);
1761 Py_DECREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001762 Py_DECREF(co);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001763
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001764 /* decorators */
1765 for (i = 0; i < asdl_seq_LEN(decos); i++) {
1766 ADDOP_I(c, CALL_FUNCTION, 1);
1767 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001768
Yury Selivanov75445082015-05-11 22:57:16 -04001769 return compiler_nameop(c, name, Store);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001770}
1771
1772static int
1773compiler_class(struct compiler *c, stmt_ty s)
1774{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001775 PyCodeObject *co;
1776 PyObject *str;
1777 int i;
1778 asdl_seq* decos = s->v.ClassDef.decorator_list;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001779
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001780 if (!compiler_decorators(c, decos))
1781 return 0;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001782
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001783 /* ultimately generate code for:
1784 <name> = __build_class__(<func>, <name>, *<bases>, **<keywords>)
1785 where:
1786 <func> is a function/closure created from the class body;
1787 it has a single argument (__locals__) where the dict
1788 (or MutableSequence) representing the locals is passed
1789 <name> is the class name
1790 <bases> is the positional arguments and *varargs argument
1791 <keywords> is the keyword arguments and **kwds argument
1792 This borrows from compiler_call.
1793 */
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001794
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001795 /* 1. compile the class body into a code object */
Antoine Pitrou86a36b52011-11-25 18:56:07 +01001796 if (!compiler_enter_scope(c, s->v.ClassDef.name,
1797 COMPILER_SCOPE_CLASS, (void *)s, s->lineno))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001798 return 0;
1799 /* this block represents what we do in the new scope */
1800 {
1801 /* use the class name for name mangling */
1802 Py_INCREF(s->v.ClassDef.name);
1803 Py_XDECREF(c->u->u_private);
1804 c->u->u_private = s->v.ClassDef.name;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001805 /* load (global) __name__ ... */
1806 str = PyUnicode_InternFromString("__name__");
1807 if (!str || !compiler_nameop(c, str, Load)) {
1808 Py_XDECREF(str);
1809 compiler_exit_scope(c);
1810 return 0;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001811 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001812 Py_DECREF(str);
1813 /* ... and store it as __module__ */
1814 str = PyUnicode_InternFromString("__module__");
1815 if (!str || !compiler_nameop(c, str, Store)) {
1816 Py_XDECREF(str);
1817 compiler_exit_scope(c);
1818 return 0;
1819 }
1820 Py_DECREF(str);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04001821 assert(c->u->u_qualname);
1822 ADDOP_O(c, LOAD_CONST, c->u->u_qualname, consts);
Antoine Pitrou86a36b52011-11-25 18:56:07 +01001823 str = PyUnicode_InternFromString("__qualname__");
1824 if (!str || !compiler_nameop(c, str, Store)) {
1825 Py_XDECREF(str);
1826 compiler_exit_scope(c);
1827 return 0;
1828 }
1829 Py_DECREF(str);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001830 /* compile the body proper */
1831 if (!compiler_body(c, s->v.ClassDef.body)) {
1832 compiler_exit_scope(c);
1833 return 0;
1834 }
Benjamin Peterson312595c2013-05-15 15:26:42 -05001835 if (c->u->u_ste->ste_needs_class_closure) {
1836 /* return the (empty) __class__ cell */
1837 str = PyUnicode_InternFromString("__class__");
1838 if (str == NULL) {
1839 compiler_exit_scope(c);
1840 return 0;
1841 }
1842 i = compiler_lookup_arg(c->u->u_cellvars, str);
1843 Py_DECREF(str);
Victor Stinner98e818b2013-11-05 18:07:34 +01001844 if (i < 0) {
1845 compiler_exit_scope(c);
1846 return 0;
1847 }
Benjamin Peterson312595c2013-05-15 15:26:42 -05001848 assert(i == 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001849 /* Return the cell where to store __class__ */
1850 ADDOP_I(c, LOAD_CLOSURE, i);
1851 }
Benjamin Peterson312595c2013-05-15 15:26:42 -05001852 else {
1853 assert(PyDict_Size(c->u->u_cellvars) == 0);
1854 /* This happens when nobody references the cell. Return None. */
1855 ADDOP_O(c, LOAD_CONST, Py_None, consts);
1856 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001857 ADDOP_IN_SCOPE(c, RETURN_VALUE);
1858 /* create the code object */
1859 co = assemble(c, 1);
1860 }
1861 /* leave the new scope */
1862 compiler_exit_scope(c);
1863 if (co == NULL)
1864 return 0;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001865
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001866 /* 2. load the 'build_class' function */
1867 ADDOP(c, LOAD_BUILD_CLASS);
1868
1869 /* 3. load a function (or closure) made from the code object */
Antoine Pitrou86a36b52011-11-25 18:56:07 +01001870 compiler_make_closure(c, co, 0, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001871 Py_DECREF(co);
1872
1873 /* 4. load class name */
1874 ADDOP_O(c, LOAD_CONST, s->v.ClassDef.name, consts);
1875
1876 /* 5. generate the rest of the code for the call */
1877 if (!compiler_call_helper(c, 2,
1878 s->v.ClassDef.bases,
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001879 s->v.ClassDef.keywords))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001880 return 0;
1881
1882 /* 6. apply decorators */
1883 for (i = 0; i < asdl_seq_LEN(decos); i++) {
1884 ADDOP_I(c, CALL_FUNCTION, 1);
1885 }
1886
1887 /* 7. store into <name> */
1888 if (!compiler_nameop(c, s->v.ClassDef.name, Store))
1889 return 0;
1890 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001891}
1892
1893static int
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001894compiler_ifexp(struct compiler *c, expr_ty e)
1895{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001896 basicblock *end, *next;
1897
1898 assert(e->kind == IfExp_kind);
1899 end = compiler_new_block(c);
1900 if (end == NULL)
1901 return 0;
1902 next = compiler_new_block(c);
1903 if (next == NULL)
1904 return 0;
1905 VISIT(c, expr, e->v.IfExp.test);
1906 ADDOP_JABS(c, POP_JUMP_IF_FALSE, next);
1907 VISIT(c, expr, e->v.IfExp.body);
1908 ADDOP_JREL(c, JUMP_FORWARD, end);
1909 compiler_use_next_block(c, next);
1910 VISIT(c, expr, e->v.IfExp.orelse);
1911 compiler_use_next_block(c, end);
1912 return 1;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001913}
1914
1915static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001916compiler_lambda(struct compiler *c, expr_ty e)
1917{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001918 PyCodeObject *co;
Antoine Pitrou86a36b52011-11-25 18:56:07 +01001919 PyObject *qualname;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001920 static identifier name;
Victor Stinnerad9a0662013-11-19 22:23:20 +01001921 int kw_default_count = 0;
1922 Py_ssize_t arglength;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001923 arguments_ty args = e->v.Lambda.args;
1924 assert(e->kind == Lambda_kind);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001925
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001926 if (!name) {
1927 name = PyUnicode_InternFromString("<lambda>");
1928 if (!name)
1929 return 0;
1930 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001931
Benjamin Peterson419d9a82013-02-10 09:48:22 -05001932 if (args->defaults)
1933 VISIT_SEQ(c, expr, args->defaults);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001934 if (args->kwonlyargs) {
1935 int res = compiler_visit_kwonlydefaults(c, args->kwonlyargs,
1936 args->kw_defaults);
1937 if (res < 0) return 0;
1938 kw_default_count = res;
1939 }
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04001940 if (!compiler_enter_scope(c, name, COMPILER_SCOPE_LAMBDA,
Antoine Pitrou86a36b52011-11-25 18:56:07 +01001941 (void *)e, e->lineno))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001942 return 0;
Neal Norwitz4737b232005-11-19 23:58:29 +00001943
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001944 /* Make None the first constant, so the lambda can't have a
1945 docstring. */
1946 if (compiler_add_o(c, c->u->u_consts, Py_None) < 0)
1947 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001948
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001949 c->u->u_argcount = asdl_seq_LEN(args->args);
1950 c->u->u_kwonlyargcount = asdl_seq_LEN(args->kwonlyargs);
1951 VISIT_IN_SCOPE(c, expr, e->v.Lambda.body);
1952 if (c->u->u_ste->ste_generator) {
Serhiy Storchakac775ad62015-03-11 18:20:35 +02001953 co = assemble(c, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001954 }
1955 else {
1956 ADDOP_IN_SCOPE(c, RETURN_VALUE);
Serhiy Storchakac775ad62015-03-11 18:20:35 +02001957 co = assemble(c, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001958 }
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04001959 qualname = c->u->u_qualname;
1960 Py_INCREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001961 compiler_exit_scope(c);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04001962 if (co == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001963 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001964
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001965 arglength = asdl_seq_LEN(args->defaults);
1966 arglength |= kw_default_count << 8;
Antoine Pitrou86a36b52011-11-25 18:56:07 +01001967 compiler_make_closure(c, co, arglength, qualname);
1968 Py_DECREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001969 Py_DECREF(co);
1970
1971 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001972}
1973
1974static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001975compiler_if(struct compiler *c, stmt_ty s)
1976{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001977 basicblock *end, *next;
1978 int constant;
1979 assert(s->kind == If_kind);
1980 end = compiler_new_block(c);
1981 if (end == NULL)
1982 return 0;
1983
Georg Brandl8334fd92010-12-04 10:26:46 +00001984 constant = expr_constant(c, s->v.If.test);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001985 /* constant = 0: "if 0"
1986 * constant = 1: "if 1", "if 2", ...
1987 * constant = -1: rest */
1988 if (constant == 0) {
1989 if (s->v.If.orelse)
1990 VISIT_SEQ(c, stmt, s->v.If.orelse);
1991 } else if (constant == 1) {
1992 VISIT_SEQ(c, stmt, s->v.If.body);
1993 } else {
Antoine Pitroue7811fc2014-09-18 03:06:50 +02001994 if (asdl_seq_LEN(s->v.If.orelse)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001995 next = compiler_new_block(c);
1996 if (next == NULL)
1997 return 0;
1998 }
1999 else
2000 next = end;
2001 VISIT(c, expr, s->v.If.test);
2002 ADDOP_JABS(c, POP_JUMP_IF_FALSE, next);
2003 VISIT_SEQ(c, stmt, s->v.If.body);
Antoine Pitroue7811fc2014-09-18 03:06:50 +02002004 if (asdl_seq_LEN(s->v.If.orelse)) {
2005 ADDOP_JREL(c, JUMP_FORWARD, end);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002006 compiler_use_next_block(c, next);
2007 VISIT_SEQ(c, stmt, s->v.If.orelse);
2008 }
2009 }
2010 compiler_use_next_block(c, end);
2011 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002012}
2013
2014static int
2015compiler_for(struct compiler *c, stmt_ty s)
2016{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002017 basicblock *start, *cleanup, *end;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002018
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002019 start = compiler_new_block(c);
2020 cleanup = compiler_new_block(c);
2021 end = compiler_new_block(c);
2022 if (start == NULL || end == NULL || cleanup == NULL)
2023 return 0;
2024 ADDOP_JREL(c, SETUP_LOOP, end);
2025 if (!compiler_push_fblock(c, LOOP, start))
2026 return 0;
2027 VISIT(c, expr, s->v.For.iter);
2028 ADDOP(c, GET_ITER);
2029 compiler_use_next_block(c, start);
2030 ADDOP_JREL(c, FOR_ITER, cleanup);
2031 VISIT(c, expr, s->v.For.target);
2032 VISIT_SEQ(c, stmt, s->v.For.body);
2033 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
2034 compiler_use_next_block(c, cleanup);
2035 ADDOP(c, POP_BLOCK);
2036 compiler_pop_fblock(c, LOOP, start);
2037 VISIT_SEQ(c, stmt, s->v.For.orelse);
2038 compiler_use_next_block(c, end);
2039 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002040}
2041
Yury Selivanov75445082015-05-11 22:57:16 -04002042
2043static int
2044compiler_async_for(struct compiler *c, stmt_ty s)
2045{
2046 static PyObject *stopiter_error = NULL;
2047 basicblock *try, *except, *end, *after_try, *try_cleanup,
2048 *after_loop, *after_loop_else;
2049
2050 if (stopiter_error == NULL) {
2051 stopiter_error = PyUnicode_InternFromString("StopAsyncIteration");
2052 if (stopiter_error == NULL)
2053 return 0;
2054 }
2055
2056 try = compiler_new_block(c);
2057 except = compiler_new_block(c);
2058 end = compiler_new_block(c);
2059 after_try = compiler_new_block(c);
2060 try_cleanup = compiler_new_block(c);
2061 after_loop = compiler_new_block(c);
2062 after_loop_else = compiler_new_block(c);
2063
2064 if (try == NULL || except == NULL || end == NULL
2065 || after_try == NULL || try_cleanup == NULL)
2066 return 0;
2067
2068 ADDOP_JREL(c, SETUP_LOOP, after_loop);
2069 if (!compiler_push_fblock(c, LOOP, try))
2070 return 0;
2071
2072 VISIT(c, expr, s->v.AsyncFor.iter);
2073 ADDOP(c, GET_AITER);
2074 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2075 ADDOP(c, YIELD_FROM);
2076
2077 compiler_use_next_block(c, try);
2078
2079
2080 ADDOP_JREL(c, SETUP_EXCEPT, except);
2081 if (!compiler_push_fblock(c, EXCEPT, try))
2082 return 0;
2083
2084 ADDOP(c, GET_ANEXT);
2085 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2086 ADDOP(c, YIELD_FROM);
2087 VISIT(c, expr, s->v.AsyncFor.target);
2088 ADDOP(c, POP_BLOCK);
2089 compiler_pop_fblock(c, EXCEPT, try);
2090 ADDOP_JREL(c, JUMP_FORWARD, after_try);
2091
2092
2093 compiler_use_next_block(c, except);
2094 ADDOP(c, DUP_TOP);
2095 ADDOP_O(c, LOAD_GLOBAL, stopiter_error, names);
2096 ADDOP_I(c, COMPARE_OP, PyCmp_EXC_MATCH);
2097 ADDOP_JABS(c, POP_JUMP_IF_FALSE, try_cleanup);
2098
2099 ADDOP(c, POP_TOP);
2100 ADDOP(c, POP_TOP);
2101 ADDOP(c, POP_TOP);
2102 ADDOP(c, POP_EXCEPT); /* for SETUP_EXCEPT */
2103 ADDOP(c, POP_BLOCK); /* for SETUP_LOOP */
2104 ADDOP_JABS(c, JUMP_ABSOLUTE, after_loop_else);
2105
2106
2107 compiler_use_next_block(c, try_cleanup);
2108 ADDOP(c, END_FINALLY);
2109
2110 compiler_use_next_block(c, after_try);
2111 VISIT_SEQ(c, stmt, s->v.AsyncFor.body);
2112 ADDOP_JABS(c, JUMP_ABSOLUTE, try);
2113
2114 ADDOP(c, POP_BLOCK); /* for SETUP_LOOP */
2115 compiler_pop_fblock(c, LOOP, try);
2116
2117 compiler_use_next_block(c, after_loop);
2118 ADDOP_JABS(c, JUMP_ABSOLUTE, end);
2119
2120 compiler_use_next_block(c, after_loop_else);
2121 VISIT_SEQ(c, stmt, s->v.For.orelse);
2122
2123 compiler_use_next_block(c, end);
2124
2125 return 1;
2126}
2127
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002128static int
2129compiler_while(struct compiler *c, stmt_ty s)
2130{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002131 basicblock *loop, *orelse, *end, *anchor = NULL;
Georg Brandl8334fd92010-12-04 10:26:46 +00002132 int constant = expr_constant(c, s->v.While.test);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002133
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002134 if (constant == 0) {
2135 if (s->v.While.orelse)
2136 VISIT_SEQ(c, stmt, s->v.While.orelse);
2137 return 1;
2138 }
2139 loop = compiler_new_block(c);
2140 end = compiler_new_block(c);
2141 if (constant == -1) {
2142 anchor = compiler_new_block(c);
2143 if (anchor == NULL)
2144 return 0;
2145 }
2146 if (loop == NULL || end == NULL)
2147 return 0;
2148 if (s->v.While.orelse) {
2149 orelse = compiler_new_block(c);
2150 if (orelse == NULL)
2151 return 0;
2152 }
2153 else
2154 orelse = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002155
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002156 ADDOP_JREL(c, SETUP_LOOP, end);
2157 compiler_use_next_block(c, loop);
2158 if (!compiler_push_fblock(c, LOOP, loop))
2159 return 0;
2160 if (constant == -1) {
2161 VISIT(c, expr, s->v.While.test);
2162 ADDOP_JABS(c, POP_JUMP_IF_FALSE, anchor);
2163 }
2164 VISIT_SEQ(c, stmt, s->v.While.body);
2165 ADDOP_JABS(c, JUMP_ABSOLUTE, loop);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002166
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002167 /* XXX should the two POP instructions be in a separate block
2168 if there is no else clause ?
2169 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002170
Benjamin Peterson3cda0ed2014-12-13 16:06:19 -05002171 if (constant == -1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002172 compiler_use_next_block(c, anchor);
Benjamin Peterson3cda0ed2014-12-13 16:06:19 -05002173 ADDOP(c, POP_BLOCK);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002174 compiler_pop_fblock(c, LOOP, loop);
2175 if (orelse != NULL) /* what if orelse is just pass? */
2176 VISIT_SEQ(c, stmt, s->v.While.orelse);
2177 compiler_use_next_block(c, end);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002178
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002179 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002180}
2181
2182static int
2183compiler_continue(struct compiler *c)
2184{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002185 static const char LOOP_ERROR_MSG[] = "'continue' not properly in loop";
2186 static const char IN_FINALLY_ERROR_MSG[] =
2187 "'continue' not supported inside 'finally' clause";
2188 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002189
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002190 if (!c->u->u_nfblocks)
2191 return compiler_error(c, LOOP_ERROR_MSG);
2192 i = c->u->u_nfblocks - 1;
2193 switch (c->u->u_fblock[i].fb_type) {
2194 case LOOP:
2195 ADDOP_JABS(c, JUMP_ABSOLUTE, c->u->u_fblock[i].fb_block);
2196 break;
2197 case EXCEPT:
2198 case FINALLY_TRY:
2199 while (--i >= 0 && c->u->u_fblock[i].fb_type != LOOP) {
2200 /* Prevent continue anywhere under a finally
2201 even if hidden in a sub-try or except. */
2202 if (c->u->u_fblock[i].fb_type == FINALLY_END)
2203 return compiler_error(c, IN_FINALLY_ERROR_MSG);
2204 }
2205 if (i == -1)
2206 return compiler_error(c, LOOP_ERROR_MSG);
2207 ADDOP_JABS(c, CONTINUE_LOOP, c->u->u_fblock[i].fb_block);
2208 break;
2209 case FINALLY_END:
2210 return compiler_error(c, IN_FINALLY_ERROR_MSG);
2211 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002212
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002213 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002214}
2215
2216/* Code generated for "try: <body> finally: <finalbody>" is as follows:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002217
2218 SETUP_FINALLY L
2219 <code for body>
2220 POP_BLOCK
2221 LOAD_CONST <None>
2222 L: <code for finalbody>
2223 END_FINALLY
2224
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002225 The special instructions use the block stack. Each block
2226 stack entry contains the instruction that created it (here
2227 SETUP_FINALLY), the level of the value stack at the time the
2228 block stack entry was created, and a label (here L).
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002229
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002230 SETUP_FINALLY:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002231 Pushes the current value stack level and the label
2232 onto the block stack.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002233 POP_BLOCK:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002234 Pops en entry from the block stack, and pops the value
2235 stack until its level is the same as indicated on the
2236 block stack. (The label is ignored.)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002237 END_FINALLY:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002238 Pops a variable number of entries from the *value* stack
2239 and re-raises the exception they specify. The number of
2240 entries popped depends on the (pseudo) exception type.
2241
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002242 The block stack is unwound when an exception is raised:
2243 when a SETUP_FINALLY entry is found, the exception is pushed
2244 onto the value stack (and the exception condition is cleared),
2245 and the interpreter jumps to the label gotten from the block
2246 stack.
2247*/
2248
2249static int
2250compiler_try_finally(struct compiler *c, stmt_ty s)
2251{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002252 basicblock *body, *end;
2253 body = compiler_new_block(c);
2254 end = compiler_new_block(c);
2255 if (body == NULL || end == NULL)
2256 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002257
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002258 ADDOP_JREL(c, SETUP_FINALLY, end);
2259 compiler_use_next_block(c, body);
2260 if (!compiler_push_fblock(c, FINALLY_TRY, body))
2261 return 0;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002262 if (s->v.Try.handlers && asdl_seq_LEN(s->v.Try.handlers)) {
2263 if (!compiler_try_except(c, s))
2264 return 0;
2265 }
2266 else {
2267 VISIT_SEQ(c, stmt, s->v.Try.body);
2268 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002269 ADDOP(c, POP_BLOCK);
2270 compiler_pop_fblock(c, FINALLY_TRY, body);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002271
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002272 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2273 compiler_use_next_block(c, end);
2274 if (!compiler_push_fblock(c, FINALLY_END, end))
2275 return 0;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002276 VISIT_SEQ(c, stmt, s->v.Try.finalbody);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002277 ADDOP(c, END_FINALLY);
2278 compiler_pop_fblock(c, FINALLY_END, end);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002279
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002280 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002281}
2282
2283/*
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00002284 Code generated for "try: S except E1 as V1: S1 except E2 as V2: S2 ...":
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002285 (The contents of the value stack is shown in [], with the top
2286 at the right; 'tb' is trace-back info, 'val' the exception's
2287 associated value, and 'exc' the exception.)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002288
2289 Value stack Label Instruction Argument
2290 [] SETUP_EXCEPT L1
2291 [] <code for S>
2292 [] POP_BLOCK
2293 [] JUMP_FORWARD L0
2294
2295 [tb, val, exc] L1: DUP )
2296 [tb, val, exc, exc] <evaluate E1> )
2297 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2298 [tb, val, exc, 1-or-0] POP_JUMP_IF_FALSE L2 )
2299 [tb, val, exc] POP
2300 [tb, val] <assign to V1> (or POP if no V1)
2301 [tb] POP
2302 [] <code for S1>
2303 JUMP_FORWARD L0
2304
2305 [tb, val, exc] L2: DUP
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002306 .............................etc.......................
2307
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002308 [tb, val, exc] Ln+1: END_FINALLY # re-raise exception
2309
2310 [] L0: <next statement>
2311
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002312 Of course, parts are not generated if Vi or Ei is not present.
2313*/
2314static int
2315compiler_try_except(struct compiler *c, stmt_ty s)
2316{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002317 basicblock *body, *orelse, *except, *end;
Victor Stinnerad9a0662013-11-19 22:23:20 +01002318 Py_ssize_t i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002319
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002320 body = compiler_new_block(c);
2321 except = compiler_new_block(c);
2322 orelse = compiler_new_block(c);
2323 end = compiler_new_block(c);
2324 if (body == NULL || except == NULL || orelse == NULL || end == NULL)
2325 return 0;
2326 ADDOP_JREL(c, SETUP_EXCEPT, except);
2327 compiler_use_next_block(c, body);
2328 if (!compiler_push_fblock(c, EXCEPT, body))
2329 return 0;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002330 VISIT_SEQ(c, stmt, s->v.Try.body);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002331 ADDOP(c, POP_BLOCK);
2332 compiler_pop_fblock(c, EXCEPT, body);
2333 ADDOP_JREL(c, JUMP_FORWARD, orelse);
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002334 n = asdl_seq_LEN(s->v.Try.handlers);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002335 compiler_use_next_block(c, except);
2336 for (i = 0; i < n; i++) {
2337 excepthandler_ty handler = (excepthandler_ty)asdl_seq_GET(
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002338 s->v.Try.handlers, i);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002339 if (!handler->v.ExceptHandler.type && i < n-1)
2340 return compiler_error(c, "default 'except:' must be last");
2341 c->u->u_lineno_set = 0;
2342 c->u->u_lineno = handler->lineno;
Benjamin Petersond4efd9e2010-09-20 23:02:10 +00002343 c->u->u_col_offset = handler->col_offset;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002344 except = compiler_new_block(c);
2345 if (except == NULL)
2346 return 0;
2347 if (handler->v.ExceptHandler.type) {
2348 ADDOP(c, DUP_TOP);
2349 VISIT(c, expr, handler->v.ExceptHandler.type);
2350 ADDOP_I(c, COMPARE_OP, PyCmp_EXC_MATCH);
2351 ADDOP_JABS(c, POP_JUMP_IF_FALSE, except);
2352 }
2353 ADDOP(c, POP_TOP);
2354 if (handler->v.ExceptHandler.name) {
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002355 basicblock *cleanup_end, *cleanup_body;
Guido van Rossumb940e112007-01-10 16:19:56 +00002356
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002357 cleanup_end = compiler_new_block(c);
2358 cleanup_body = compiler_new_block(c);
Benjamin Peterson0a5dad92011-05-27 14:17:04 -05002359 if (!(cleanup_end || cleanup_body))
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002360 return 0;
Guido van Rossumb940e112007-01-10 16:19:56 +00002361
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002362 compiler_nameop(c, handler->v.ExceptHandler.name, Store);
2363 ADDOP(c, POP_TOP);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002364
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002365 /*
2366 try:
Ezio Melotti1b6424f2013-04-19 07:10:09 +03002367 # body
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002368 except type as name:
Ezio Melotti1b6424f2013-04-19 07:10:09 +03002369 try:
2370 # body
2371 finally:
2372 name = None
2373 del name
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002374 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002375
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002376 /* second try: */
2377 ADDOP_JREL(c, SETUP_FINALLY, cleanup_end);
2378 compiler_use_next_block(c, cleanup_body);
2379 if (!compiler_push_fblock(c, FINALLY_TRY, cleanup_body))
2380 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002381
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002382 /* second # body */
2383 VISIT_SEQ(c, stmt, handler->v.ExceptHandler.body);
2384 ADDOP(c, POP_BLOCK);
2385 ADDOP(c, POP_EXCEPT);
2386 compiler_pop_fblock(c, FINALLY_TRY, cleanup_body);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002387
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002388 /* finally: */
2389 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2390 compiler_use_next_block(c, cleanup_end);
2391 if (!compiler_push_fblock(c, FINALLY_END, cleanup_end))
2392 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002393
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002394 /* name = None */
2395 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2396 compiler_nameop(c, handler->v.ExceptHandler.name, Store);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002397
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002398 /* del name */
2399 compiler_nameop(c, handler->v.ExceptHandler.name, Del);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002400
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002401 ADDOP(c, END_FINALLY);
2402 compiler_pop_fblock(c, FINALLY_END, cleanup_end);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002403 }
2404 else {
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002405 basicblock *cleanup_body;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002406
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002407 cleanup_body = compiler_new_block(c);
Benjamin Peterson0a5dad92011-05-27 14:17:04 -05002408 if (!cleanup_body)
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002409 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002410
Guido van Rossumb940e112007-01-10 16:19:56 +00002411 ADDOP(c, POP_TOP);
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002412 ADDOP(c, POP_TOP);
2413 compiler_use_next_block(c, cleanup_body);
2414 if (!compiler_push_fblock(c, FINALLY_TRY, cleanup_body))
2415 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002416 VISIT_SEQ(c, stmt, handler->v.ExceptHandler.body);
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002417 ADDOP(c, POP_EXCEPT);
2418 compiler_pop_fblock(c, FINALLY_TRY, cleanup_body);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002419 }
2420 ADDOP_JREL(c, JUMP_FORWARD, end);
2421 compiler_use_next_block(c, except);
2422 }
2423 ADDOP(c, END_FINALLY);
2424 compiler_use_next_block(c, orelse);
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002425 VISIT_SEQ(c, stmt, s->v.Try.orelse);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002426 compiler_use_next_block(c, end);
2427 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002428}
2429
2430static int
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002431compiler_try(struct compiler *c, stmt_ty s) {
2432 if (s->v.Try.finalbody && asdl_seq_LEN(s->v.Try.finalbody))
2433 return compiler_try_finally(c, s);
2434 else
2435 return compiler_try_except(c, s);
2436}
2437
2438
2439static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002440compiler_import_as(struct compiler *c, identifier name, identifier asname)
2441{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002442 /* The IMPORT_NAME opcode was already generated. This function
2443 merely needs to bind the result to a name.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002444
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002445 If there is a dot in name, we need to split it and emit a
2446 LOAD_ATTR for each name.
2447 */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002448 Py_ssize_t dot = PyUnicode_FindChar(name, '.', 0,
2449 PyUnicode_GET_LENGTH(name), 1);
2450 if (dot == -2)
2451 return -1;
2452 if (dot != -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002453 /* Consume the base module name to get the first attribute */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002454 Py_ssize_t pos = dot + 1;
2455 while (dot != -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002456 PyObject *attr;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002457 dot = PyUnicode_FindChar(name, '.', pos,
2458 PyUnicode_GET_LENGTH(name), 1);
2459 if (dot == -2)
2460 return -1;
2461 attr = PyUnicode_Substring(name, pos,
2462 (dot != -1) ? dot :
2463 PyUnicode_GET_LENGTH(name));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002464 if (!attr)
2465 return -1;
2466 ADDOP_O(c, LOAD_ATTR, attr, names);
2467 Py_DECREF(attr);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002468 pos = dot + 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002469 }
2470 }
2471 return compiler_nameop(c, asname, Store);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002472}
2473
2474static int
2475compiler_import(struct compiler *c, stmt_ty s)
2476{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002477 /* The Import node stores a module name like a.b.c as a single
2478 string. This is convenient for all cases except
2479 import a.b.c as d
2480 where we need to parse that string to extract the individual
2481 module names.
2482 XXX Perhaps change the representation to make this case simpler?
2483 */
Victor Stinnerad9a0662013-11-19 22:23:20 +01002484 Py_ssize_t i, n = asdl_seq_LEN(s->v.Import.names);
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002485
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002486 for (i = 0; i < n; i++) {
2487 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.Import.names, i);
2488 int r;
2489 PyObject *level;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002490
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002491 level = PyLong_FromLong(0);
2492 if (level == NULL)
2493 return 0;
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002494
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002495 ADDOP_O(c, LOAD_CONST, level, consts);
2496 Py_DECREF(level);
2497 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2498 ADDOP_NAME(c, IMPORT_NAME, alias->name, names);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002499
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002500 if (alias->asname) {
2501 r = compiler_import_as(c, alias->name, alias->asname);
2502 if (!r)
2503 return r;
2504 }
2505 else {
2506 identifier tmp = alias->name;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002507 Py_ssize_t dot = PyUnicode_FindChar(
2508 alias->name, '.', 0, PyUnicode_GET_LENGTH(alias->name), 1);
Victor Stinner6b64a682013-07-11 22:50:45 +02002509 if (dot != -1) {
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002510 tmp = PyUnicode_Substring(alias->name, 0, dot);
Victor Stinner6b64a682013-07-11 22:50:45 +02002511 if (tmp == NULL)
2512 return 0;
2513 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002514 r = compiler_nameop(c, tmp, Store);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002515 if (dot != -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002516 Py_DECREF(tmp);
2517 }
2518 if (!r)
2519 return r;
2520 }
2521 }
2522 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002523}
2524
2525static int
2526compiler_from_import(struct compiler *c, stmt_ty s)
2527{
Victor Stinnerad9a0662013-11-19 22:23:20 +01002528 Py_ssize_t i, n = asdl_seq_LEN(s->v.ImportFrom.names);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002529
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002530 PyObject *names = PyTuple_New(n);
2531 PyObject *level;
2532 static PyObject *empty_string;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002533
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002534 if (!empty_string) {
2535 empty_string = PyUnicode_FromString("");
2536 if (!empty_string)
2537 return 0;
2538 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002539
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002540 if (!names)
2541 return 0;
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002542
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002543 level = PyLong_FromLong(s->v.ImportFrom.level);
2544 if (!level) {
2545 Py_DECREF(names);
2546 return 0;
2547 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002548
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002549 /* build up the names */
2550 for (i = 0; i < n; i++) {
2551 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);
2552 Py_INCREF(alias->name);
2553 PyTuple_SET_ITEM(names, i, alias->name);
2554 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002555
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002556 if (s->lineno > c->c_future->ff_lineno && s->v.ImportFrom.module &&
2557 !PyUnicode_CompareWithASCIIString(s->v.ImportFrom.module, "__future__")) {
2558 Py_DECREF(level);
2559 Py_DECREF(names);
2560 return compiler_error(c, "from __future__ imports must occur "
2561 "at the beginning of the file");
2562 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002563
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002564 ADDOP_O(c, LOAD_CONST, level, consts);
2565 Py_DECREF(level);
2566 ADDOP_O(c, LOAD_CONST, names, consts);
2567 Py_DECREF(names);
2568 if (s->v.ImportFrom.module) {
2569 ADDOP_NAME(c, IMPORT_NAME, s->v.ImportFrom.module, names);
2570 }
2571 else {
2572 ADDOP_NAME(c, IMPORT_NAME, empty_string, names);
2573 }
2574 for (i = 0; i < n; i++) {
2575 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);
2576 identifier store_name;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002577
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002578 if (i == 0 && PyUnicode_READ_CHAR(alias->name, 0) == '*') {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002579 assert(n == 1);
2580 ADDOP(c, IMPORT_STAR);
2581 return 1;
2582 }
2583
2584 ADDOP_NAME(c, IMPORT_FROM, alias->name, names);
2585 store_name = alias->name;
2586 if (alias->asname)
2587 store_name = alias->asname;
2588
2589 if (!compiler_nameop(c, store_name, Store)) {
2590 Py_DECREF(names);
2591 return 0;
2592 }
2593 }
2594 /* remove imported module */
2595 ADDOP(c, POP_TOP);
2596 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002597}
2598
2599static int
2600compiler_assert(struct compiler *c, stmt_ty s)
2601{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002602 static PyObject *assertion_error = NULL;
2603 basicblock *end;
Victor Stinner14e461d2013-08-26 22:28:21 +02002604 PyObject* msg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002605
Georg Brandl8334fd92010-12-04 10:26:46 +00002606 if (c->c_optimize)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002607 return 1;
2608 if (assertion_error == NULL) {
2609 assertion_error = PyUnicode_InternFromString("AssertionError");
2610 if (assertion_error == NULL)
2611 return 0;
2612 }
2613 if (s->v.Assert.test->kind == Tuple_kind &&
2614 asdl_seq_LEN(s->v.Assert.test->v.Tuple.elts) > 0) {
Victor Stinner14e461d2013-08-26 22:28:21 +02002615 msg = PyUnicode_FromString("assertion is always true, "
2616 "perhaps remove parentheses?");
2617 if (msg == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002618 return 0;
Victor Stinner14e461d2013-08-26 22:28:21 +02002619 if (PyErr_WarnExplicitObject(PyExc_SyntaxWarning, msg,
2620 c->c_filename, c->u->u_lineno,
2621 NULL, NULL) == -1) {
2622 Py_DECREF(msg);
2623 return 0;
2624 }
2625 Py_DECREF(msg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002626 }
2627 VISIT(c, expr, s->v.Assert.test);
2628 end = compiler_new_block(c);
2629 if (end == NULL)
2630 return 0;
2631 ADDOP_JABS(c, POP_JUMP_IF_TRUE, end);
2632 ADDOP_O(c, LOAD_GLOBAL, assertion_error, names);
2633 if (s->v.Assert.msg) {
2634 VISIT(c, expr, s->v.Assert.msg);
2635 ADDOP_I(c, CALL_FUNCTION, 1);
2636 }
2637 ADDOP_I(c, RAISE_VARARGS, 1);
2638 compiler_use_next_block(c, end);
2639 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002640}
2641
2642static int
2643compiler_visit_stmt(struct compiler *c, stmt_ty s)
2644{
Victor Stinnerad9a0662013-11-19 22:23:20 +01002645 Py_ssize_t i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002646
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002647 /* Always assign a lineno to the next instruction for a stmt. */
2648 c->u->u_lineno = s->lineno;
Benjamin Petersond4efd9e2010-09-20 23:02:10 +00002649 c->u->u_col_offset = s->col_offset;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002650 c->u->u_lineno_set = 0;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002651
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002652 switch (s->kind) {
2653 case FunctionDef_kind:
Yury Selivanov75445082015-05-11 22:57:16 -04002654 return compiler_function(c, s, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002655 case ClassDef_kind:
2656 return compiler_class(c, s);
2657 case Return_kind:
2658 if (c->u->u_ste->ste_type != FunctionBlock)
2659 return compiler_error(c, "'return' outside function");
2660 if (s->v.Return.value) {
2661 VISIT(c, expr, s->v.Return.value);
2662 }
2663 else
2664 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2665 ADDOP(c, RETURN_VALUE);
2666 break;
2667 case Delete_kind:
2668 VISIT_SEQ(c, expr, s->v.Delete.targets)
2669 break;
2670 case Assign_kind:
2671 n = asdl_seq_LEN(s->v.Assign.targets);
2672 VISIT(c, expr, s->v.Assign.value);
2673 for (i = 0; i < n; i++) {
2674 if (i < n - 1)
2675 ADDOP(c, DUP_TOP);
2676 VISIT(c, expr,
2677 (expr_ty)asdl_seq_GET(s->v.Assign.targets, i));
2678 }
2679 break;
2680 case AugAssign_kind:
2681 return compiler_augassign(c, s);
2682 case For_kind:
2683 return compiler_for(c, s);
2684 case While_kind:
2685 return compiler_while(c, s);
2686 case If_kind:
2687 return compiler_if(c, s);
2688 case Raise_kind:
2689 n = 0;
2690 if (s->v.Raise.exc) {
2691 VISIT(c, expr, s->v.Raise.exc);
2692 n++;
Victor Stinnerad9a0662013-11-19 22:23:20 +01002693 if (s->v.Raise.cause) {
2694 VISIT(c, expr, s->v.Raise.cause);
2695 n++;
2696 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002697 }
Victor Stinnerad9a0662013-11-19 22:23:20 +01002698 ADDOP_I(c, RAISE_VARARGS, (int)n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002699 break;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002700 case Try_kind:
2701 return compiler_try(c, s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002702 case Assert_kind:
2703 return compiler_assert(c, s);
2704 case Import_kind:
2705 return compiler_import(c, s);
2706 case ImportFrom_kind:
2707 return compiler_from_import(c, s);
2708 case Global_kind:
2709 case Nonlocal_kind:
2710 break;
2711 case Expr_kind:
2712 if (c->c_interactive && c->c_nestlevel <= 1) {
2713 VISIT(c, expr, s->v.Expr.value);
2714 ADDOP(c, PRINT_EXPR);
2715 }
2716 else if (s->v.Expr.value->kind != Str_kind &&
2717 s->v.Expr.value->kind != Num_kind) {
2718 VISIT(c, expr, s->v.Expr.value);
2719 ADDOP(c, POP_TOP);
2720 }
2721 break;
2722 case Pass_kind:
2723 break;
2724 case Break_kind:
2725 if (!compiler_in_loop(c))
2726 return compiler_error(c, "'break' outside loop");
2727 ADDOP(c, BREAK_LOOP);
2728 break;
2729 case Continue_kind:
2730 return compiler_continue(c);
2731 case With_kind:
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05002732 return compiler_with(c, s, 0);
Yury Selivanov75445082015-05-11 22:57:16 -04002733 case AsyncFunctionDef_kind:
2734 return compiler_function(c, s, 1);
2735 case AsyncWith_kind:
2736 return compiler_async_with(c, s, 0);
2737 case AsyncFor_kind:
2738 return compiler_async_for(c, s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002739 }
Yury Selivanov75445082015-05-11 22:57:16 -04002740
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002741 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002742}
2743
2744static int
2745unaryop(unaryop_ty op)
2746{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002747 switch (op) {
2748 case Invert:
2749 return UNARY_INVERT;
2750 case Not:
2751 return UNARY_NOT;
2752 case UAdd:
2753 return UNARY_POSITIVE;
2754 case USub:
2755 return UNARY_NEGATIVE;
2756 default:
2757 PyErr_Format(PyExc_SystemError,
2758 "unary op %d should not be possible", op);
2759 return 0;
2760 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002761}
2762
2763static int
2764binop(struct compiler *c, operator_ty op)
2765{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002766 switch (op) {
2767 case Add:
2768 return BINARY_ADD;
2769 case Sub:
2770 return BINARY_SUBTRACT;
2771 case Mult:
2772 return BINARY_MULTIPLY;
Benjamin Petersond51374e2014-04-09 23:55:56 -04002773 case MatMult:
2774 return BINARY_MATRIX_MULTIPLY;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002775 case Div:
2776 return BINARY_TRUE_DIVIDE;
2777 case Mod:
2778 return BINARY_MODULO;
2779 case Pow:
2780 return BINARY_POWER;
2781 case LShift:
2782 return BINARY_LSHIFT;
2783 case RShift:
2784 return BINARY_RSHIFT;
2785 case BitOr:
2786 return BINARY_OR;
2787 case BitXor:
2788 return BINARY_XOR;
2789 case BitAnd:
2790 return BINARY_AND;
2791 case FloorDiv:
2792 return BINARY_FLOOR_DIVIDE;
2793 default:
2794 PyErr_Format(PyExc_SystemError,
2795 "binary op %d should not be possible", op);
2796 return 0;
2797 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002798}
2799
2800static int
2801cmpop(cmpop_ty op)
2802{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002803 switch (op) {
2804 case Eq:
2805 return PyCmp_EQ;
2806 case NotEq:
2807 return PyCmp_NE;
2808 case Lt:
2809 return PyCmp_LT;
2810 case LtE:
2811 return PyCmp_LE;
2812 case Gt:
2813 return PyCmp_GT;
2814 case GtE:
2815 return PyCmp_GE;
2816 case Is:
2817 return PyCmp_IS;
2818 case IsNot:
2819 return PyCmp_IS_NOT;
2820 case In:
2821 return PyCmp_IN;
2822 case NotIn:
2823 return PyCmp_NOT_IN;
2824 default:
2825 return PyCmp_BAD;
2826 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002827}
2828
2829static int
2830inplace_binop(struct compiler *c, operator_ty op)
2831{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002832 switch (op) {
2833 case Add:
2834 return INPLACE_ADD;
2835 case Sub:
2836 return INPLACE_SUBTRACT;
2837 case Mult:
2838 return INPLACE_MULTIPLY;
Benjamin Petersond51374e2014-04-09 23:55:56 -04002839 case MatMult:
2840 return INPLACE_MATRIX_MULTIPLY;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002841 case Div:
2842 return INPLACE_TRUE_DIVIDE;
2843 case Mod:
2844 return INPLACE_MODULO;
2845 case Pow:
2846 return INPLACE_POWER;
2847 case LShift:
2848 return INPLACE_LSHIFT;
2849 case RShift:
2850 return INPLACE_RSHIFT;
2851 case BitOr:
2852 return INPLACE_OR;
2853 case BitXor:
2854 return INPLACE_XOR;
2855 case BitAnd:
2856 return INPLACE_AND;
2857 case FloorDiv:
2858 return INPLACE_FLOOR_DIVIDE;
2859 default:
2860 PyErr_Format(PyExc_SystemError,
2861 "inplace binary op %d should not be possible", op);
2862 return 0;
2863 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002864}
2865
2866static int
2867compiler_nameop(struct compiler *c, identifier name, expr_context_ty ctx)
2868{
Victor Stinnerad9a0662013-11-19 22:23:20 +01002869 int op, scope;
2870 Py_ssize_t arg;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002871 enum { OP_FAST, OP_GLOBAL, OP_DEREF, OP_NAME } optype;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002872
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002873 PyObject *dict = c->u->u_names;
2874 PyObject *mangled;
2875 /* XXX AugStore isn't used anywhere! */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002876
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002877 mangled = _Py_Mangle(c->u->u_private, name);
2878 if (!mangled)
2879 return 0;
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002880
Benjamin Peterson70b224d2012-12-06 17:49:58 -05002881 assert(PyUnicode_CompareWithASCIIString(name, "None") &&
2882 PyUnicode_CompareWithASCIIString(name, "True") &&
2883 PyUnicode_CompareWithASCIIString(name, "False"));
2884
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002885 op = 0;
2886 optype = OP_NAME;
2887 scope = PyST_GetScope(c->u->u_ste, mangled);
2888 switch (scope) {
2889 case FREE:
2890 dict = c->u->u_freevars;
2891 optype = OP_DEREF;
2892 break;
2893 case CELL:
2894 dict = c->u->u_cellvars;
2895 optype = OP_DEREF;
2896 break;
2897 case LOCAL:
2898 if (c->u->u_ste->ste_type == FunctionBlock)
2899 optype = OP_FAST;
2900 break;
2901 case GLOBAL_IMPLICIT:
Benjamin Peterson1dfd2472015-04-27 21:44:22 -04002902 if (c->u->u_ste->ste_type == FunctionBlock)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002903 optype = OP_GLOBAL;
2904 break;
2905 case GLOBAL_EXPLICIT:
2906 optype = OP_GLOBAL;
2907 break;
2908 default:
2909 /* scope can be 0 */
2910 break;
2911 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002912
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002913 /* XXX Leave assert here, but handle __doc__ and the like better */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002914 assert(scope || PyUnicode_READ_CHAR(name, 0) == '_');
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002915
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002916 switch (optype) {
2917 case OP_DEREF:
2918 switch (ctx) {
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04002919 case Load:
2920 op = (c->u->u_ste->ste_type == ClassBlock) ? LOAD_CLASSDEREF : LOAD_DEREF;
2921 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002922 case Store: op = STORE_DEREF; break;
2923 case AugLoad:
2924 case AugStore:
2925 break;
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00002926 case Del: op = DELETE_DEREF; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002927 case Param:
2928 default:
2929 PyErr_SetString(PyExc_SystemError,
2930 "param invalid for deref variable");
2931 return 0;
2932 }
2933 break;
2934 case OP_FAST:
2935 switch (ctx) {
2936 case Load: op = LOAD_FAST; break;
2937 case Store: op = STORE_FAST; break;
2938 case Del: op = DELETE_FAST; break;
2939 case AugLoad:
2940 case AugStore:
2941 break;
2942 case Param:
2943 default:
2944 PyErr_SetString(PyExc_SystemError,
2945 "param invalid for local variable");
2946 return 0;
2947 }
2948 ADDOP_O(c, op, mangled, varnames);
2949 Py_DECREF(mangled);
2950 return 1;
2951 case OP_GLOBAL:
2952 switch (ctx) {
2953 case Load: op = LOAD_GLOBAL; break;
2954 case Store: op = STORE_GLOBAL; break;
2955 case Del: op = DELETE_GLOBAL; break;
2956 case AugLoad:
2957 case AugStore:
2958 break;
2959 case Param:
2960 default:
2961 PyErr_SetString(PyExc_SystemError,
2962 "param invalid for global variable");
2963 return 0;
2964 }
2965 break;
2966 case OP_NAME:
2967 switch (ctx) {
Benjamin Peterson20f9c3c2010-07-20 22:39:34 +00002968 case Load: op = LOAD_NAME; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002969 case Store: op = STORE_NAME; break;
2970 case Del: op = DELETE_NAME; break;
2971 case AugLoad:
2972 case AugStore:
2973 break;
2974 case Param:
2975 default:
2976 PyErr_SetString(PyExc_SystemError,
2977 "param invalid for name variable");
2978 return 0;
2979 }
2980 break;
2981 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002982
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002983 assert(op);
2984 arg = compiler_add_o(c, dict, mangled);
2985 Py_DECREF(mangled);
2986 if (arg < 0)
2987 return 0;
2988 return compiler_addop_i(c, op, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002989}
2990
2991static int
2992compiler_boolop(struct compiler *c, expr_ty e)
2993{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002994 basicblock *end;
Victor Stinnerad9a0662013-11-19 22:23:20 +01002995 int jumpi;
2996 Py_ssize_t i, n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002997 asdl_seq *s;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002998
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002999 assert(e->kind == BoolOp_kind);
3000 if (e->v.BoolOp.op == And)
3001 jumpi = JUMP_IF_FALSE_OR_POP;
3002 else
3003 jumpi = JUMP_IF_TRUE_OR_POP;
3004 end = compiler_new_block(c);
3005 if (end == NULL)
3006 return 0;
3007 s = e->v.BoolOp.values;
3008 n = asdl_seq_LEN(s) - 1;
3009 assert(n >= 0);
3010 for (i = 0; i < n; ++i) {
3011 VISIT(c, expr, (expr_ty)asdl_seq_GET(s, i));
3012 ADDOP_JABS(c, jumpi, end);
3013 }
3014 VISIT(c, expr, (expr_ty)asdl_seq_GET(s, n));
3015 compiler_use_next_block(c, end);
3016 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003017}
3018
3019static int
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003020starunpack_helper(struct compiler *c, asdl_seq *elts,
3021 int single_op, int inner_op, int outer_op)
3022{
3023 Py_ssize_t n = asdl_seq_LEN(elts);
3024 Py_ssize_t i, nsubitems = 0, nseen = 0;
3025 for (i = 0; i < n; i++) {
3026 expr_ty elt = asdl_seq_GET(elts, i);
3027 if (elt->kind == Starred_kind) {
3028 if (nseen) {
3029 ADDOP_I(c, inner_op, nseen);
3030 nseen = 0;
3031 nsubitems++;
3032 }
3033 VISIT(c, expr, elt->v.Starred.value);
3034 nsubitems++;
3035 }
3036 else {
3037 VISIT(c, expr, elt);
3038 nseen++;
3039 }
3040 }
3041 if (nsubitems) {
3042 if (nseen) {
3043 ADDOP_I(c, inner_op, nseen);
3044 nsubitems++;
3045 }
3046 ADDOP_I(c, outer_op, nsubitems);
3047 }
3048 else
3049 ADDOP_I(c, single_op, nseen);
3050 return 1;
3051}
3052
3053static int
3054assignment_helper(struct compiler *c, asdl_seq *elts)
3055{
3056 Py_ssize_t n = asdl_seq_LEN(elts);
3057 Py_ssize_t i;
3058 int seen_star = 0;
3059 for (i = 0; i < n; i++) {
3060 expr_ty elt = asdl_seq_GET(elts, i);
3061 if (elt->kind == Starred_kind && !seen_star) {
3062 if ((i >= (1 << 8)) ||
3063 (n-i-1 >= (INT_MAX >> 8)))
3064 return compiler_error(c,
3065 "too many expressions in "
3066 "star-unpacking assignment");
3067 ADDOP_I(c, UNPACK_EX, (i + ((n-i-1) << 8)));
3068 seen_star = 1;
3069 asdl_seq_SET(elts, i, elt->v.Starred.value);
3070 }
3071 else if (elt->kind == Starred_kind) {
3072 return compiler_error(c,
3073 "two starred expressions in assignment");
3074 }
3075 }
3076 if (!seen_star) {
3077 ADDOP_I(c, UNPACK_SEQUENCE, n);
3078 }
3079 VISIT_SEQ(c, expr, elts);
3080 return 1;
3081}
3082
3083static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003084compiler_list(struct compiler *c, expr_ty e)
3085{
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003086 asdl_seq *elts = e->v.List.elts;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003087 if (e->v.List.ctx == Store) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003088 return assignment_helper(c, elts);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003089 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003090 else if (e->v.List.ctx == Load) {
3091 return starunpack_helper(c, elts,
3092 BUILD_LIST, BUILD_TUPLE, BUILD_LIST_UNPACK);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003093 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003094 else
3095 VISIT_SEQ(c, expr, elts);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003096 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003097}
3098
3099static int
3100compiler_tuple(struct compiler *c, expr_ty e)
3101{
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003102 asdl_seq *elts = e->v.Tuple.elts;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003103 if (e->v.Tuple.ctx == Store) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003104 return assignment_helper(c, elts);
3105 }
3106 else if (e->v.Tuple.ctx == Load) {
3107 return starunpack_helper(c, elts,
3108 BUILD_TUPLE, BUILD_TUPLE, BUILD_TUPLE_UNPACK);
3109 }
3110 else
3111 VISIT_SEQ(c, expr, elts);
3112 return 1;
3113}
3114
3115static int
3116compiler_set(struct compiler *c, expr_ty e)
3117{
3118 return starunpack_helper(c, e->v.Set.elts, BUILD_SET,
3119 BUILD_SET, BUILD_SET_UNPACK);
3120}
3121
3122static int
3123compiler_dict(struct compiler *c, expr_ty e)
3124{
3125 Py_ssize_t i, n, containers, elements;
3126 int is_unpacking = 0;
3127 n = asdl_seq_LEN(e->v.Dict.values);
3128 containers = 0;
3129 elements = 0;
3130 for (i = 0; i < n; i++) {
3131 is_unpacking = (expr_ty)asdl_seq_GET(e->v.Dict.keys, i) == NULL;
3132 if (elements == 0xFFFF || (elements && is_unpacking)) {
3133 ADDOP_I(c, BUILD_MAP, elements);
3134 containers++;
3135 elements = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003136 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003137 if (is_unpacking) {
3138 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Dict.values, i));
3139 containers++;
3140 }
3141 else {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003142 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Dict.keys, i));
Benjamin Petersonee853392015-05-28 14:30:26 -05003143 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Dict.values, i));
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003144 elements++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003145 }
3146 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003147 if (elements || containers == 0) {
3148 ADDOP_I(c, BUILD_MAP, elements);
3149 containers++;
3150 }
3151 /* If there is more than one dict, they need to be merged into a new
3152 * dict. If there is one dict and it's an unpacking, then it needs
3153 * to be copied into a new dict." */
3154 while (containers > 1 || is_unpacking) {
3155 int oparg = containers < 255 ? containers : 255;
3156 ADDOP_I(c, BUILD_MAP_UNPACK, oparg);
3157 containers -= (oparg - 1);
3158 is_unpacking = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003159 }
3160 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003161}
3162
3163static int
3164compiler_compare(struct compiler *c, expr_ty e)
3165{
Victor Stinnerad9a0662013-11-19 22:23:20 +01003166 Py_ssize_t i, n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003167 basicblock *cleanup = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003168
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003169 /* XXX the logic can be cleaned up for 1 or multiple comparisons */
3170 VISIT(c, expr, e->v.Compare.left);
3171 n = asdl_seq_LEN(e->v.Compare.ops);
3172 assert(n > 0);
3173 if (n > 1) {
3174 cleanup = compiler_new_block(c);
3175 if (cleanup == NULL)
3176 return 0;
3177 VISIT(c, expr,
3178 (expr_ty)asdl_seq_GET(e->v.Compare.comparators, 0));
3179 }
3180 for (i = 1; i < n; i++) {
3181 ADDOP(c, DUP_TOP);
3182 ADDOP(c, ROT_THREE);
3183 ADDOP_I(c, COMPARE_OP,
3184 cmpop((cmpop_ty)(asdl_seq_GET(
3185 e->v.Compare.ops, i - 1))));
3186 ADDOP_JABS(c, JUMP_IF_FALSE_OR_POP, cleanup);
3187 NEXT_BLOCK(c);
3188 if (i < (n - 1))
3189 VISIT(c, expr,
3190 (expr_ty)asdl_seq_GET(e->v.Compare.comparators, i));
3191 }
3192 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, n - 1));
3193 ADDOP_I(c, COMPARE_OP,
3194 cmpop((cmpop_ty)(asdl_seq_GET(e->v.Compare.ops, n - 1))));
3195 if (n > 1) {
3196 basicblock *end = compiler_new_block(c);
3197 if (end == NULL)
3198 return 0;
3199 ADDOP_JREL(c, JUMP_FORWARD, end);
3200 compiler_use_next_block(c, cleanup);
3201 ADDOP(c, ROT_TWO);
3202 ADDOP(c, POP_TOP);
3203 compiler_use_next_block(c, end);
3204 }
3205 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003206}
3207
3208static int
3209compiler_call(struct compiler *c, expr_ty e)
3210{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003211 VISIT(c, expr, e->v.Call.func);
3212 return compiler_call_helper(c, 0,
3213 e->v.Call.args,
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003214 e->v.Call.keywords);
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003215}
3216
Eric V. Smith235a6f02015-09-19 14:51:32 -04003217static int
3218compiler_joined_str(struct compiler *c, expr_ty e)
3219{
3220 /* Concatenate parts of a string using ''.join(parts). There are
3221 probably better ways of doing this.
3222
3223 This is used for constructs like "'x=' f'{42}'", which have to
3224 be evaluated at compile time. */
3225
3226 static PyObject *empty_string;
3227 static PyObject *join_string;
3228
3229 if (!empty_string) {
3230 empty_string = PyUnicode_FromString("");
3231 if (!empty_string)
3232 return 0;
3233 }
3234 if (!join_string) {
3235 join_string = PyUnicode_FromString("join");
3236 if (!join_string)
3237 return 0;
3238 }
3239
3240 ADDOP_O(c, LOAD_CONST, empty_string, consts);
3241 ADDOP_NAME(c, LOAD_ATTR, join_string, names);
3242 VISIT_SEQ(c, expr, e->v.JoinedStr.values);
3243 ADDOP_I(c, BUILD_LIST, asdl_seq_LEN(e->v.JoinedStr.values));
3244 ADDOP_I(c, CALL_FUNCTION, 1);
3245 return 1;
3246}
3247
Eric V. Smitha78c7952015-11-03 12:45:05 -05003248/* Used to implement f-strings. Format a single value. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04003249static int
3250compiler_formatted_value(struct compiler *c, expr_ty e)
3251{
Eric V. Smitha78c7952015-11-03 12:45:05 -05003252 /* Our oparg encodes 2 pieces of information: the conversion
3253 character, and whether or not a format_spec was provided.
Eric V. Smith235a6f02015-09-19 14:51:32 -04003254
Eric V. Smitha78c7952015-11-03 12:45:05 -05003255 Convert the conversion char to 2 bits:
3256 None: 000 0x0 FVC_NONE
3257 !s : 001 0x1 FVC_STR
3258 !r : 010 0x2 FVC_REPR
3259 !a : 011 0x3 FVC_ASCII
Eric V. Smith235a6f02015-09-19 14:51:32 -04003260
Eric V. Smitha78c7952015-11-03 12:45:05 -05003261 next bit is whether or not we have a format spec:
3262 yes : 100 0x4
3263 no : 000 0x0
3264 */
Eric V. Smith235a6f02015-09-19 14:51:32 -04003265
Eric V. Smitha78c7952015-11-03 12:45:05 -05003266 int oparg;
Eric V. Smith235a6f02015-09-19 14:51:32 -04003267
Eric V. Smitha78c7952015-11-03 12:45:05 -05003268 /* Evaluate the expression to be formatted. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04003269 VISIT(c, expr, e->v.FormattedValue.value);
3270
Eric V. Smitha78c7952015-11-03 12:45:05 -05003271 switch (e->v.FormattedValue.conversion) {
3272 case 's': oparg = FVC_STR; break;
3273 case 'r': oparg = FVC_REPR; break;
3274 case 'a': oparg = FVC_ASCII; break;
3275 case -1: oparg = FVC_NONE; break;
3276 default:
3277 PyErr_SetString(PyExc_SystemError,
3278 "Unrecognized conversion character");
3279 return 0;
Eric V. Smith235a6f02015-09-19 14:51:32 -04003280 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04003281 if (e->v.FormattedValue.format_spec) {
Eric V. Smitha78c7952015-11-03 12:45:05 -05003282 /* Evaluate the format spec, and update our opcode arg. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04003283 VISIT(c, expr, e->v.FormattedValue.format_spec);
Eric V. Smitha78c7952015-11-03 12:45:05 -05003284 oparg |= FVS_HAVE_SPEC;
Eric V. Smith235a6f02015-09-19 14:51:32 -04003285 }
3286
Eric V. Smitha78c7952015-11-03 12:45:05 -05003287 /* And push our opcode and oparg */
3288 ADDOP_I(c, FORMAT_VALUE, oparg);
Eric V. Smith235a6f02015-09-19 14:51:32 -04003289 return 1;
3290}
3291
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003292/* shared code between compiler_call and compiler_class */
3293static int
3294compiler_call_helper(struct compiler *c,
Victor Stinnerad9a0662013-11-19 22:23:20 +01003295 Py_ssize_t n, /* Args already pushed */
3296 asdl_seq *args,
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003297 asdl_seq *keywords)
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003298{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003299 int code = 0;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003300 Py_ssize_t nelts, i, nseen, nkw;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003301
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003302 /* the number of tuples and dictionaries on the stack */
3303 Py_ssize_t nsubargs = 0, nsubkwargs = 0;
3304
3305 nkw = 0;
3306 nseen = 0; /* the number of positional arguments on the stack */
3307 nelts = asdl_seq_LEN(args);
3308 for (i = 0; i < nelts; i++) {
3309 expr_ty elt = asdl_seq_GET(args, i);
3310 if (elt->kind == Starred_kind) {
3311 /* A star-arg. If we've seen positional arguments,
3312 pack the positional arguments into a
3313 tuple. */
3314 if (nseen) {
3315 ADDOP_I(c, BUILD_TUPLE, nseen);
3316 nseen = 0;
3317 nsubargs++;
3318 }
3319 VISIT(c, expr, elt->v.Starred.value);
3320 nsubargs++;
3321 }
3322 else if (nsubargs) {
3323 /* We've seen star-args already, so we
3324 count towards items-to-pack-into-tuple. */
3325 VISIT(c, expr, elt);
3326 nseen++;
3327 }
3328 else {
3329 /* Positional arguments before star-arguments
3330 are left on the stack. */
3331 VISIT(c, expr, elt);
3332 n++;
3333 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003334 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003335 if (nseen) {
3336 /* Pack up any trailing positional arguments. */
3337 ADDOP_I(c, BUILD_TUPLE, nseen);
3338 nsubargs++;
3339 }
3340 if (nsubargs) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003341 code |= 1;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003342 if (nsubargs > 1) {
3343 /* If we ended up with more than one stararg, we need
3344 to concatenate them into a single sequence. */
3345 ADDOP_I(c, BUILD_LIST_UNPACK, nsubargs);
3346 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003347 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003348
3349 /* Same dance again for keyword arguments */
3350 nseen = 0; /* the number of keyword arguments on the stack following */
3351 nelts = asdl_seq_LEN(keywords);
3352 for (i = 0; i < nelts; i++) {
3353 keyword_ty kw = asdl_seq_GET(keywords, i);
3354 if (kw->arg == NULL) {
3355 /* A keyword argument unpacking. */
3356 if (nseen) {
3357 ADDOP_I(c, BUILD_MAP, nseen);
3358 nseen = 0;
3359 nsubkwargs++;
3360 }
3361 VISIT(c, expr, kw->value);
3362 nsubkwargs++;
3363 }
3364 else if (nsubkwargs) {
3365 /* A keyword argument and we already have a dict. */
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003366 ADDOP_O(c, LOAD_CONST, kw->arg, consts);
Benjamin Petersonee853392015-05-28 14:30:26 -05003367 VISIT(c, expr, kw->value);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003368 nseen++;
3369 }
3370 else {
3371 /* keyword argument */
3372 VISIT(c, keyword, kw)
3373 nkw++;
3374 }
3375 }
3376 if (nseen) {
3377 /* Pack up any trailing keyword arguments. */
3378 ADDOP_I(c, BUILD_MAP, nseen);
3379 nsubkwargs++;
3380 }
3381 if (nsubkwargs) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003382 code |= 2;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003383 if (nsubkwargs > 1) {
3384 /* Pack it all up */
3385 int function_pos = n + (code & 1) + nkw + 1;
3386 ADDOP_I(c, BUILD_MAP_UNPACK_WITH_CALL, nsubkwargs | (function_pos << 8));
3387 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003388 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003389 assert(n < 1<<8);
3390 assert(nkw < 1<<24);
3391 n |= nkw << 8;
3392
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003393 switch (code) {
3394 case 0:
3395 ADDOP_I(c, CALL_FUNCTION, n);
3396 break;
3397 case 1:
3398 ADDOP_I(c, CALL_FUNCTION_VAR, n);
3399 break;
3400 case 2:
3401 ADDOP_I(c, CALL_FUNCTION_KW, n);
3402 break;
3403 case 3:
3404 ADDOP_I(c, CALL_FUNCTION_VAR_KW, n);
3405 break;
3406 }
3407 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003408}
3409
Nick Coghlan650f0d02007-04-15 12:05:43 +00003410
3411/* List and set comprehensions and generator expressions work by creating a
3412 nested function to perform the actual iteration. This means that the
3413 iteration variables don't leak into the current scope.
3414 The defined function is called immediately following its definition, with the
3415 result of that call being the result of the expression.
3416 The LC/SC version returns the populated container, while the GE version is
3417 flagged in symtable.c as a generator, so it returns the generator object
3418 when the function is called.
3419 This code *knows* that the loop cannot contain break, continue, or return,
3420 so it cheats and skips the SETUP_LOOP/POP_BLOCK steps used in normal loops.
3421
3422 Possible cleanups:
3423 - iterate over the generator sequence instead of using recursion
3424*/
3425
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003426static int
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003427compiler_comprehension_generator(struct compiler *c,
3428 asdl_seq *generators, int gen_index,
3429 expr_ty elt, expr_ty val, int type)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003430{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003431 /* generate code for the iterator, then each of the ifs,
3432 and then write to the element */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003433
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003434 comprehension_ty gen;
3435 basicblock *start, *anchor, *skip, *if_cleanup;
Victor Stinnerad9a0662013-11-19 22:23:20 +01003436 Py_ssize_t i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003437
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003438 start = compiler_new_block(c);
3439 skip = compiler_new_block(c);
3440 if_cleanup = compiler_new_block(c);
3441 anchor = compiler_new_block(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003442
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003443 if (start == NULL || skip == NULL || if_cleanup == NULL ||
3444 anchor == NULL)
3445 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003446
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003447 gen = (comprehension_ty)asdl_seq_GET(generators, gen_index);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003448
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003449 if (gen_index == 0) {
3450 /* Receive outermost iter as an implicit argument */
3451 c->u->u_argcount = 1;
3452 ADDOP_I(c, LOAD_FAST, 0);
3453 }
3454 else {
3455 /* Sub-iter - calculate on the fly */
3456 VISIT(c, expr, gen->iter);
3457 ADDOP(c, GET_ITER);
3458 }
3459 compiler_use_next_block(c, start);
3460 ADDOP_JREL(c, FOR_ITER, anchor);
3461 NEXT_BLOCK(c);
3462 VISIT(c, expr, gen->target);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003463
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003464 /* XXX this needs to be cleaned up...a lot! */
3465 n = asdl_seq_LEN(gen->ifs);
3466 for (i = 0; i < n; i++) {
3467 expr_ty e = (expr_ty)asdl_seq_GET(gen->ifs, i);
3468 VISIT(c, expr, e);
3469 ADDOP_JABS(c, POP_JUMP_IF_FALSE, if_cleanup);
3470 NEXT_BLOCK(c);
3471 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003472
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003473 if (++gen_index < asdl_seq_LEN(generators))
3474 if (!compiler_comprehension_generator(c,
3475 generators, gen_index,
3476 elt, val, type))
3477 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003478
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003479 /* only append after the last for generator */
3480 if (gen_index >= asdl_seq_LEN(generators)) {
3481 /* comprehension specific code */
3482 switch (type) {
3483 case COMP_GENEXP:
3484 VISIT(c, expr, elt);
3485 ADDOP(c, YIELD_VALUE);
3486 ADDOP(c, POP_TOP);
3487 break;
3488 case COMP_LISTCOMP:
3489 VISIT(c, expr, elt);
3490 ADDOP_I(c, LIST_APPEND, gen_index + 1);
3491 break;
3492 case COMP_SETCOMP:
3493 VISIT(c, expr, elt);
3494 ADDOP_I(c, SET_ADD, gen_index + 1);
3495 break;
3496 case COMP_DICTCOMP:
3497 /* With 'd[k] = v', v is evaluated before k, so we do
3498 the same. */
3499 VISIT(c, expr, val);
3500 VISIT(c, expr, elt);
3501 ADDOP_I(c, MAP_ADD, gen_index + 1);
3502 break;
3503 default:
3504 return 0;
3505 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003506
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003507 compiler_use_next_block(c, skip);
3508 }
3509 compiler_use_next_block(c, if_cleanup);
3510 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
3511 compiler_use_next_block(c, anchor);
3512
3513 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003514}
3515
3516static int
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003517compiler_comprehension(struct compiler *c, expr_ty e, int type,
3518 identifier name, asdl_seq *generators, expr_ty elt,
3519 expr_ty val)
Nick Coghlan650f0d02007-04-15 12:05:43 +00003520{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003521 PyCodeObject *co = NULL;
3522 expr_ty outermost_iter;
Antoine Pitrou86a36b52011-11-25 18:56:07 +01003523 PyObject *qualname = NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00003524
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003525 outermost_iter = ((comprehension_ty)
3526 asdl_seq_GET(generators, 0))->iter;
Nick Coghlan650f0d02007-04-15 12:05:43 +00003527
Antoine Pitrou86a36b52011-11-25 18:56:07 +01003528 if (!compiler_enter_scope(c, name, COMPILER_SCOPE_COMPREHENSION,
3529 (void *)e, e->lineno))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003530 goto error;
Nick Coghlan650f0d02007-04-15 12:05:43 +00003531
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003532 if (type != COMP_GENEXP) {
3533 int op;
3534 switch (type) {
3535 case COMP_LISTCOMP:
3536 op = BUILD_LIST;
3537 break;
3538 case COMP_SETCOMP:
3539 op = BUILD_SET;
3540 break;
3541 case COMP_DICTCOMP:
3542 op = BUILD_MAP;
3543 break;
3544 default:
3545 PyErr_Format(PyExc_SystemError,
3546 "unknown comprehension type %d", type);
3547 goto error_in_scope;
3548 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00003549
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003550 ADDOP_I(c, op, 0);
3551 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00003552
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003553 if (!compiler_comprehension_generator(c, generators, 0, elt,
3554 val, type))
3555 goto error_in_scope;
Nick Coghlan650f0d02007-04-15 12:05:43 +00003556
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003557 if (type != COMP_GENEXP) {
3558 ADDOP(c, RETURN_VALUE);
3559 }
3560
3561 co = assemble(c, 1);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04003562 qualname = c->u->u_qualname;
3563 Py_INCREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003564 compiler_exit_scope(c);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04003565 if (co == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003566 goto error;
3567
Antoine Pitrou86a36b52011-11-25 18:56:07 +01003568 if (!compiler_make_closure(c, co, 0, qualname))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003569 goto error;
Antoine Pitrou86a36b52011-11-25 18:56:07 +01003570 Py_DECREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003571 Py_DECREF(co);
3572
3573 VISIT(c, expr, outermost_iter);
3574 ADDOP(c, GET_ITER);
3575 ADDOP_I(c, CALL_FUNCTION, 1);
3576 return 1;
Nick Coghlan650f0d02007-04-15 12:05:43 +00003577error_in_scope:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003578 compiler_exit_scope(c);
Nick Coghlan650f0d02007-04-15 12:05:43 +00003579error:
Antoine Pitrou86a36b52011-11-25 18:56:07 +01003580 Py_XDECREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003581 Py_XDECREF(co);
3582 return 0;
Nick Coghlan650f0d02007-04-15 12:05:43 +00003583}
3584
3585static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003586compiler_genexp(struct compiler *c, expr_ty e)
3587{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003588 static identifier name;
3589 if (!name) {
3590 name = PyUnicode_FromString("<genexpr>");
3591 if (!name)
3592 return 0;
3593 }
3594 assert(e->kind == GeneratorExp_kind);
3595 return compiler_comprehension(c, e, COMP_GENEXP, name,
3596 e->v.GeneratorExp.generators,
3597 e->v.GeneratorExp.elt, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003598}
3599
3600static int
Nick Coghlan650f0d02007-04-15 12:05:43 +00003601compiler_listcomp(struct compiler *c, expr_ty e)
3602{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003603 static identifier name;
3604 if (!name) {
3605 name = PyUnicode_FromString("<listcomp>");
3606 if (!name)
3607 return 0;
3608 }
3609 assert(e->kind == ListComp_kind);
3610 return compiler_comprehension(c, e, COMP_LISTCOMP, name,
3611 e->v.ListComp.generators,
3612 e->v.ListComp.elt, NULL);
Nick Coghlan650f0d02007-04-15 12:05:43 +00003613}
3614
3615static int
3616compiler_setcomp(struct compiler *c, expr_ty e)
3617{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003618 static identifier name;
3619 if (!name) {
3620 name = PyUnicode_FromString("<setcomp>");
3621 if (!name)
3622 return 0;
3623 }
3624 assert(e->kind == SetComp_kind);
3625 return compiler_comprehension(c, e, COMP_SETCOMP, name,
3626 e->v.SetComp.generators,
3627 e->v.SetComp.elt, NULL);
Guido van Rossum992d4a32007-07-11 13:09:30 +00003628}
3629
3630
3631static int
3632compiler_dictcomp(struct compiler *c, expr_ty e)
3633{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003634 static identifier name;
3635 if (!name) {
3636 name = PyUnicode_FromString("<dictcomp>");
3637 if (!name)
3638 return 0;
3639 }
3640 assert(e->kind == DictComp_kind);
3641 return compiler_comprehension(c, e, COMP_DICTCOMP, name,
3642 e->v.DictComp.generators,
3643 e->v.DictComp.key, e->v.DictComp.value);
Nick Coghlan650f0d02007-04-15 12:05:43 +00003644}
3645
3646
3647static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003648compiler_visit_keyword(struct compiler *c, keyword_ty k)
3649{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003650 ADDOP_O(c, LOAD_CONST, k->arg, consts);
3651 VISIT(c, expr, k->value);
3652 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003653}
3654
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003655/* Test whether expression is constant. For constants, report
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003656 whether they are true or false.
3657
3658 Return values: 1 for true, 0 for false, -1 for non-constant.
3659 */
3660
3661static int
Georg Brandl8334fd92010-12-04 10:26:46 +00003662expr_constant(struct compiler *c, expr_ty e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003663{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003664 char *id;
3665 switch (e->kind) {
3666 case Ellipsis_kind:
3667 return 1;
3668 case Num_kind:
3669 return PyObject_IsTrue(e->v.Num.n);
3670 case Str_kind:
3671 return PyObject_IsTrue(e->v.Str.s);
3672 case Name_kind:
3673 /* optimize away names that can't be reassigned */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003674 id = PyUnicode_AsUTF8(e->v.Name.id);
Benjamin Peterson442f2092012-12-06 17:41:04 -05003675 if (id && strcmp(id, "__debug__") == 0)
3676 return !c->c_optimize;
3677 return -1;
3678 case NameConstant_kind: {
3679 PyObject *o = e->v.NameConstant.value;
3680 if (o == Py_None)
3681 return 0;
3682 else if (o == Py_True)
3683 return 1;
3684 else if (o == Py_False)
3685 return 0;
3686 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003687 default:
3688 return -1;
3689 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003690}
3691
Yury Selivanov75445082015-05-11 22:57:16 -04003692
3693/*
3694 Implements the async with statement.
3695
3696 The semantics outlined in that PEP are as follows:
3697
3698 async with EXPR as VAR:
3699 BLOCK
3700
3701 It is implemented roughly as:
3702
3703 context = EXPR
3704 exit = context.__aexit__ # not calling it
3705 value = await context.__aenter__()
3706 try:
3707 VAR = value # if VAR present in the syntax
3708 BLOCK
3709 finally:
3710 if an exception was raised:
Serhiy Storchakaec466a12015-06-11 00:09:32 +03003711 exc = copy of (exception, instance, traceback)
Yury Selivanov75445082015-05-11 22:57:16 -04003712 else:
Serhiy Storchakaec466a12015-06-11 00:09:32 +03003713 exc = (None, None, None)
Yury Selivanov75445082015-05-11 22:57:16 -04003714 if not (await exit(*exc)):
3715 raise
3716 */
3717static int
3718compiler_async_with(struct compiler *c, stmt_ty s, int pos)
3719{
3720 basicblock *block, *finally;
3721 withitem_ty item = asdl_seq_GET(s->v.AsyncWith.items, pos);
3722
3723 assert(s->kind == AsyncWith_kind);
3724
3725 block = compiler_new_block(c);
3726 finally = compiler_new_block(c);
3727 if (!block || !finally)
3728 return 0;
3729
3730 /* Evaluate EXPR */
3731 VISIT(c, expr, item->context_expr);
3732
3733 ADDOP(c, BEFORE_ASYNC_WITH);
3734 ADDOP(c, GET_AWAITABLE);
3735 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3736 ADDOP(c, YIELD_FROM);
3737
3738 ADDOP_JREL(c, SETUP_ASYNC_WITH, finally);
3739
3740 /* SETUP_ASYNC_WITH pushes a finally block. */
3741 compiler_use_next_block(c, block);
3742 if (!compiler_push_fblock(c, FINALLY_TRY, block)) {
3743 return 0;
3744 }
3745
3746 if (item->optional_vars) {
3747 VISIT(c, expr, item->optional_vars);
3748 }
3749 else {
3750 /* Discard result from context.__aenter__() */
3751 ADDOP(c, POP_TOP);
3752 }
3753
3754 pos++;
3755 if (pos == asdl_seq_LEN(s->v.AsyncWith.items))
3756 /* BLOCK code */
3757 VISIT_SEQ(c, stmt, s->v.AsyncWith.body)
3758 else if (!compiler_async_with(c, s, pos))
3759 return 0;
3760
3761 /* End of try block; start the finally block */
3762 ADDOP(c, POP_BLOCK);
3763 compiler_pop_fblock(c, FINALLY_TRY, block);
3764
3765 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3766 compiler_use_next_block(c, finally);
3767 if (!compiler_push_fblock(c, FINALLY_END, finally))
3768 return 0;
3769
3770 /* Finally block starts; context.__exit__ is on the stack under
3771 the exception or return information. Just issue our magic
3772 opcode. */
3773 ADDOP(c, WITH_CLEANUP_START);
3774
3775 ADDOP(c, GET_AWAITABLE);
3776 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3777 ADDOP(c, YIELD_FROM);
3778
3779 ADDOP(c, WITH_CLEANUP_FINISH);
3780
3781 /* Finally block ends. */
3782 ADDOP(c, END_FINALLY);
3783 compiler_pop_fblock(c, FINALLY_END, finally);
3784 return 1;
3785}
3786
3787
Guido van Rossumc2e20742006-02-27 22:32:47 +00003788/*
3789 Implements the with statement from PEP 343.
3790
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003791 The semantics outlined in that PEP are as follows:
Guido van Rossumc2e20742006-02-27 22:32:47 +00003792
3793 with EXPR as VAR:
3794 BLOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003795
Guido van Rossumc2e20742006-02-27 22:32:47 +00003796 It is implemented roughly as:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003797
Thomas Wouters477c8d52006-05-27 19:21:47 +00003798 context = EXPR
Guido van Rossumc2e20742006-02-27 22:32:47 +00003799 exit = context.__exit__ # not calling it
3800 value = context.__enter__()
3801 try:
3802 VAR = value # if VAR present in the syntax
3803 BLOCK
3804 finally:
3805 if an exception was raised:
Serhiy Storchakad741a882015-06-11 00:06:39 +03003806 exc = copy of (exception, instance, traceback)
Guido van Rossumc2e20742006-02-27 22:32:47 +00003807 else:
Serhiy Storchakad741a882015-06-11 00:06:39 +03003808 exc = (None, None, None)
Guido van Rossumc2e20742006-02-27 22:32:47 +00003809 exit(*exc)
3810 */
3811static int
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003812compiler_with(struct compiler *c, stmt_ty s, int pos)
Guido van Rossumc2e20742006-02-27 22:32:47 +00003813{
Guido van Rossumc2e20742006-02-27 22:32:47 +00003814 basicblock *block, *finally;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003815 withitem_ty item = asdl_seq_GET(s->v.With.items, pos);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003816
3817 assert(s->kind == With_kind);
3818
Guido van Rossumc2e20742006-02-27 22:32:47 +00003819 block = compiler_new_block(c);
3820 finally = compiler_new_block(c);
3821 if (!block || !finally)
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00003822 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003823
Thomas Wouters477c8d52006-05-27 19:21:47 +00003824 /* Evaluate EXPR */
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003825 VISIT(c, expr, item->context_expr);
Benjamin Peterson876b2f22009-06-28 03:18:59 +00003826 ADDOP_JREL(c, SETUP_WITH, finally);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003827
Benjamin Peterson876b2f22009-06-28 03:18:59 +00003828 /* SETUP_WITH pushes a finally block. */
Guido van Rossumc2e20742006-02-27 22:32:47 +00003829 compiler_use_next_block(c, block);
3830 if (!compiler_push_fblock(c, FINALLY_TRY, block)) {
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00003831 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003832 }
3833
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003834 if (item->optional_vars) {
3835 VISIT(c, expr, item->optional_vars);
Benjamin Peterson876b2f22009-06-28 03:18:59 +00003836 }
3837 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003838 /* Discard result from context.__enter__() */
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00003839 ADDOP(c, POP_TOP);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003840 }
3841
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003842 pos++;
3843 if (pos == asdl_seq_LEN(s->v.With.items))
3844 /* BLOCK code */
3845 VISIT_SEQ(c, stmt, s->v.With.body)
3846 else if (!compiler_with(c, s, pos))
3847 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003848
3849 /* End of try block; start the finally block */
3850 ADDOP(c, POP_BLOCK);
3851 compiler_pop_fblock(c, FINALLY_TRY, block);
3852
3853 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3854 compiler_use_next_block(c, finally);
3855 if (!compiler_push_fblock(c, FINALLY_END, finally))
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00003856 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003857
Christian Heimesdd15f6c2008-03-16 00:07:10 +00003858 /* Finally block starts; context.__exit__ is on the stack under
3859 the exception or return information. Just issue our magic
3860 opcode. */
Yury Selivanov75445082015-05-11 22:57:16 -04003861 ADDOP(c, WITH_CLEANUP_START);
3862 ADDOP(c, WITH_CLEANUP_FINISH);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003863
3864 /* Finally block ends. */
3865 ADDOP(c, END_FINALLY);
3866 compiler_pop_fblock(c, FINALLY_END, finally);
3867 return 1;
3868}
3869
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003870static int
3871compiler_visit_expr(struct compiler *c, expr_ty e)
3872{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003873 /* If expr e has a different line number than the last expr/stmt,
3874 set a new line number for the next instruction.
3875 */
3876 if (e->lineno > c->u->u_lineno) {
3877 c->u->u_lineno = e->lineno;
3878 c->u->u_lineno_set = 0;
3879 }
Benjamin Petersond4efd9e2010-09-20 23:02:10 +00003880 /* Updating the column offset is always harmless. */
3881 c->u->u_col_offset = e->col_offset;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003882 switch (e->kind) {
3883 case BoolOp_kind:
3884 return compiler_boolop(c, e);
3885 case BinOp_kind:
3886 VISIT(c, expr, e->v.BinOp.left);
3887 VISIT(c, expr, e->v.BinOp.right);
3888 ADDOP(c, binop(c, e->v.BinOp.op));
3889 break;
3890 case UnaryOp_kind:
3891 VISIT(c, expr, e->v.UnaryOp.operand);
3892 ADDOP(c, unaryop(e->v.UnaryOp.op));
3893 break;
3894 case Lambda_kind:
3895 return compiler_lambda(c, e);
3896 case IfExp_kind:
3897 return compiler_ifexp(c, e);
3898 case Dict_kind:
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003899 return compiler_dict(c, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003900 case Set_kind:
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003901 return compiler_set(c, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003902 case GeneratorExp_kind:
3903 return compiler_genexp(c, e);
3904 case ListComp_kind:
3905 return compiler_listcomp(c, e);
3906 case SetComp_kind:
3907 return compiler_setcomp(c, e);
3908 case DictComp_kind:
3909 return compiler_dictcomp(c, e);
3910 case Yield_kind:
3911 if (c->u->u_ste->ste_type != FunctionBlock)
3912 return compiler_error(c, "'yield' outside function");
Yury Selivanov75445082015-05-11 22:57:16 -04003913 if (c->u->u_scope_type == COMPILER_SCOPE_ASYNC_FUNCTION)
3914 return compiler_error(c, "'yield' inside async function");
Mark Dickinsonded35ae2012-11-25 14:36:26 +00003915 if (e->v.Yield.value) {
3916 VISIT(c, expr, e->v.Yield.value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003917 }
3918 else {
3919 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3920 }
Mark Dickinsonded35ae2012-11-25 14:36:26 +00003921 ADDOP(c, YIELD_VALUE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003922 break;
Mark Dickinsonded35ae2012-11-25 14:36:26 +00003923 case YieldFrom_kind:
3924 if (c->u->u_ste->ste_type != FunctionBlock)
3925 return compiler_error(c, "'yield' outside function");
Yury Selivanov75445082015-05-11 22:57:16 -04003926
3927 if (c->u->u_scope_type == COMPILER_SCOPE_ASYNC_FUNCTION)
3928 return compiler_error(c, "'yield from' inside async function");
3929
Mark Dickinsonded35ae2012-11-25 14:36:26 +00003930 VISIT(c, expr, e->v.YieldFrom.value);
Yury Selivanov5376ba92015-06-22 12:19:30 -04003931 ADDOP(c, GET_YIELD_FROM_ITER);
Mark Dickinsonded35ae2012-11-25 14:36:26 +00003932 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3933 ADDOP(c, YIELD_FROM);
3934 break;
Yury Selivanov75445082015-05-11 22:57:16 -04003935 case Await_kind:
3936 if (c->u->u_ste->ste_type != FunctionBlock)
3937 return compiler_error(c, "'await' outside function");
3938
Yury Selivanov9dec0352015-06-30 12:49:04 -04003939 if (c->u->u_scope_type == COMPILER_SCOPE_COMPREHENSION)
3940 return compiler_error(
3941 c, "'await' expressions in comprehensions are not supported");
3942
Yury Selivanov75445082015-05-11 22:57:16 -04003943 if (c->u->u_scope_type != COMPILER_SCOPE_ASYNC_FUNCTION)
3944 return compiler_error(c, "'await' outside async function");
3945
3946 VISIT(c, expr, e->v.Await.value);
3947 ADDOP(c, GET_AWAITABLE);
3948 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3949 ADDOP(c, YIELD_FROM);
3950 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003951 case Compare_kind:
3952 return compiler_compare(c, e);
3953 case Call_kind:
3954 return compiler_call(c, e);
3955 case Num_kind:
3956 ADDOP_O(c, LOAD_CONST, e->v.Num.n, consts);
3957 break;
3958 case Str_kind:
3959 ADDOP_O(c, LOAD_CONST, e->v.Str.s, consts);
3960 break;
Eric V. Smith235a6f02015-09-19 14:51:32 -04003961 case JoinedStr_kind:
3962 return compiler_joined_str(c, e);
3963 case FormattedValue_kind:
3964 return compiler_formatted_value(c, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003965 case Bytes_kind:
3966 ADDOP_O(c, LOAD_CONST, e->v.Bytes.s, consts);
3967 break;
3968 case Ellipsis_kind:
3969 ADDOP_O(c, LOAD_CONST, Py_Ellipsis, consts);
3970 break;
Benjamin Peterson442f2092012-12-06 17:41:04 -05003971 case NameConstant_kind:
3972 ADDOP_O(c, LOAD_CONST, e->v.NameConstant.value, consts);
3973 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003974 /* The following exprs can be assignment targets. */
3975 case Attribute_kind:
3976 if (e->v.Attribute.ctx != AugStore)
3977 VISIT(c, expr, e->v.Attribute.value);
3978 switch (e->v.Attribute.ctx) {
3979 case AugLoad:
3980 ADDOP(c, DUP_TOP);
3981 /* Fall through to load */
3982 case Load:
3983 ADDOP_NAME(c, LOAD_ATTR, e->v.Attribute.attr, names);
3984 break;
3985 case AugStore:
3986 ADDOP(c, ROT_TWO);
3987 /* Fall through to save */
3988 case Store:
3989 ADDOP_NAME(c, STORE_ATTR, e->v.Attribute.attr, names);
3990 break;
3991 case Del:
3992 ADDOP_NAME(c, DELETE_ATTR, e->v.Attribute.attr, names);
3993 break;
3994 case Param:
3995 default:
3996 PyErr_SetString(PyExc_SystemError,
3997 "param invalid in attribute expression");
3998 return 0;
3999 }
4000 break;
4001 case Subscript_kind:
4002 switch (e->v.Subscript.ctx) {
4003 case AugLoad:
4004 VISIT(c, expr, e->v.Subscript.value);
4005 VISIT_SLICE(c, e->v.Subscript.slice, AugLoad);
4006 break;
4007 case Load:
4008 VISIT(c, expr, e->v.Subscript.value);
4009 VISIT_SLICE(c, e->v.Subscript.slice, Load);
4010 break;
4011 case AugStore:
4012 VISIT_SLICE(c, e->v.Subscript.slice, AugStore);
4013 break;
4014 case Store:
4015 VISIT(c, expr, e->v.Subscript.value);
4016 VISIT_SLICE(c, e->v.Subscript.slice, Store);
4017 break;
4018 case Del:
4019 VISIT(c, expr, e->v.Subscript.value);
4020 VISIT_SLICE(c, e->v.Subscript.slice, Del);
4021 break;
4022 case Param:
4023 default:
4024 PyErr_SetString(PyExc_SystemError,
4025 "param invalid in subscript expression");
4026 return 0;
4027 }
4028 break;
4029 case Starred_kind:
4030 switch (e->v.Starred.ctx) {
4031 case Store:
4032 /* In all legitimate cases, the Starred node was already replaced
4033 * by compiler_list/compiler_tuple. XXX: is that okay? */
4034 return compiler_error(c,
4035 "starred assignment target must be in a list or tuple");
4036 default:
4037 return compiler_error(c,
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004038 "can't use starred expression here");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004039 }
4040 break;
4041 case Name_kind:
4042 return compiler_nameop(c, e->v.Name.id, e->v.Name.ctx);
4043 /* child nodes of List and Tuple will have expr_context set */
4044 case List_kind:
4045 return compiler_list(c, e);
4046 case Tuple_kind:
4047 return compiler_tuple(c, e);
4048 }
4049 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004050}
4051
4052static int
4053compiler_augassign(struct compiler *c, stmt_ty s)
4054{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004055 expr_ty e = s->v.AugAssign.target;
4056 expr_ty auge;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004057
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004058 assert(s->kind == AugAssign_kind);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004059
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004060 switch (e->kind) {
4061 case Attribute_kind:
4062 auge = Attribute(e->v.Attribute.value, e->v.Attribute.attr,
4063 AugLoad, e->lineno, e->col_offset, c->c_arena);
4064 if (auge == NULL)
4065 return 0;
4066 VISIT(c, expr, auge);
4067 VISIT(c, expr, s->v.AugAssign.value);
4068 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
4069 auge->v.Attribute.ctx = AugStore;
4070 VISIT(c, expr, auge);
4071 break;
4072 case Subscript_kind:
4073 auge = Subscript(e->v.Subscript.value, e->v.Subscript.slice,
4074 AugLoad, e->lineno, e->col_offset, c->c_arena);
4075 if (auge == NULL)
4076 return 0;
4077 VISIT(c, expr, auge);
4078 VISIT(c, expr, s->v.AugAssign.value);
4079 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
4080 auge->v.Subscript.ctx = AugStore;
4081 VISIT(c, expr, auge);
4082 break;
4083 case Name_kind:
4084 if (!compiler_nameop(c, e->v.Name.id, Load))
4085 return 0;
4086 VISIT(c, expr, s->v.AugAssign.value);
4087 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
4088 return compiler_nameop(c, e->v.Name.id, Store);
4089 default:
4090 PyErr_Format(PyExc_SystemError,
4091 "invalid node type (%d) for augmented assignment",
4092 e->kind);
4093 return 0;
4094 }
4095 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004096}
4097
4098static int
4099compiler_push_fblock(struct compiler *c, enum fblocktype t, basicblock *b)
4100{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004101 struct fblockinfo *f;
4102 if (c->u->u_nfblocks >= CO_MAXBLOCKS) {
4103 PyErr_SetString(PyExc_SystemError,
4104 "too many statically nested blocks");
4105 return 0;
4106 }
4107 f = &c->u->u_fblock[c->u->u_nfblocks++];
4108 f->fb_type = t;
4109 f->fb_block = b;
4110 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004111}
4112
4113static void
4114compiler_pop_fblock(struct compiler *c, enum fblocktype t, basicblock *b)
4115{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004116 struct compiler_unit *u = c->u;
4117 assert(u->u_nfblocks > 0);
4118 u->u_nfblocks--;
4119 assert(u->u_fblock[u->u_nfblocks].fb_type == t);
4120 assert(u->u_fblock[u->u_nfblocks].fb_block == b);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004121}
4122
Thomas Wouters89f507f2006-12-13 04:49:30 +00004123static int
4124compiler_in_loop(struct compiler *c) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004125 int i;
4126 struct compiler_unit *u = c->u;
4127 for (i = 0; i < u->u_nfblocks; ++i) {
4128 if (u->u_fblock[i].fb_type == LOOP)
4129 return 1;
4130 }
4131 return 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00004132}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004133/* Raises a SyntaxError and returns 0.
4134 If something goes wrong, a different exception may be raised.
4135*/
4136
4137static int
4138compiler_error(struct compiler *c, const char *errstr)
4139{
Benjamin Peterson43b06862011-05-27 09:08:01 -05004140 PyObject *loc;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004141 PyObject *u = NULL, *v = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004142
Victor Stinner14e461d2013-08-26 22:28:21 +02004143 loc = PyErr_ProgramTextObject(c->c_filename, c->u->u_lineno);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004144 if (!loc) {
4145 Py_INCREF(Py_None);
4146 loc = Py_None;
4147 }
Victor Stinner14e461d2013-08-26 22:28:21 +02004148 u = Py_BuildValue("(OiiO)", c->c_filename, c->u->u_lineno,
Benjamin Petersond4efd9e2010-09-20 23:02:10 +00004149 c->u->u_col_offset, loc);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004150 if (!u)
4151 goto exit;
4152 v = Py_BuildValue("(zO)", errstr, u);
4153 if (!v)
4154 goto exit;
4155 PyErr_SetObject(PyExc_SyntaxError, v);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004156 exit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004157 Py_DECREF(loc);
4158 Py_XDECREF(u);
4159 Py_XDECREF(v);
4160 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004161}
4162
4163static int
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004164compiler_handle_subscr(struct compiler *c, const char *kind,
4165 expr_context_ty ctx)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004166{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004167 int op = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004168
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004169 /* XXX this code is duplicated */
4170 switch (ctx) {
4171 case AugLoad: /* fall through to Load */
4172 case Load: op = BINARY_SUBSCR; break;
4173 case AugStore:/* fall through to Store */
4174 case Store: op = STORE_SUBSCR; break;
4175 case Del: op = DELETE_SUBSCR; break;
4176 case Param:
4177 PyErr_Format(PyExc_SystemError,
4178 "invalid %s kind %d in subscript\n",
4179 kind, ctx);
4180 return 0;
4181 }
4182 if (ctx == AugLoad) {
Antoine Pitrou74a69fa2010-09-04 18:43:52 +00004183 ADDOP(c, DUP_TOP_TWO);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004184 }
4185 else if (ctx == AugStore) {
4186 ADDOP(c, ROT_THREE);
4187 }
4188 ADDOP(c, op);
4189 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004190}
4191
4192static int
4193compiler_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)
4194{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004195 int n = 2;
4196 assert(s->kind == Slice_kind);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004197
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004198 /* only handles the cases where BUILD_SLICE is emitted */
4199 if (s->v.Slice.lower) {
4200 VISIT(c, expr, s->v.Slice.lower);
4201 }
4202 else {
4203 ADDOP_O(c, LOAD_CONST, Py_None, consts);
4204 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004205
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004206 if (s->v.Slice.upper) {
4207 VISIT(c, expr, s->v.Slice.upper);
4208 }
4209 else {
4210 ADDOP_O(c, LOAD_CONST, Py_None, consts);
4211 }
4212
4213 if (s->v.Slice.step) {
4214 n++;
4215 VISIT(c, expr, s->v.Slice.step);
4216 }
4217 ADDOP_I(c, BUILD_SLICE, n);
4218 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004219}
4220
4221static int
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004222compiler_visit_nested_slice(struct compiler *c, slice_ty s,
4223 expr_context_ty ctx)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004224{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004225 switch (s->kind) {
4226 case Slice_kind:
4227 return compiler_slice(c, s, ctx);
4228 case Index_kind:
4229 VISIT(c, expr, s->v.Index.value);
4230 break;
4231 case ExtSlice_kind:
4232 default:
4233 PyErr_SetString(PyExc_SystemError,
4234 "extended slice invalid in nested slice");
4235 return 0;
4236 }
4237 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004238}
4239
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004240static int
4241compiler_visit_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)
4242{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004243 char * kindname = NULL;
4244 switch (s->kind) {
4245 case Index_kind:
4246 kindname = "index";
4247 if (ctx != AugStore) {
4248 VISIT(c, expr, s->v.Index.value);
4249 }
4250 break;
4251 case Slice_kind:
4252 kindname = "slice";
4253 if (ctx != AugStore) {
4254 if (!compiler_slice(c, s, ctx))
4255 return 0;
4256 }
4257 break;
4258 case ExtSlice_kind:
4259 kindname = "extended slice";
4260 if (ctx != AugStore) {
Victor Stinnerad9a0662013-11-19 22:23:20 +01004261 Py_ssize_t i, n = asdl_seq_LEN(s->v.ExtSlice.dims);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004262 for (i = 0; i < n; i++) {
4263 slice_ty sub = (slice_ty)asdl_seq_GET(
4264 s->v.ExtSlice.dims, i);
4265 if (!compiler_visit_nested_slice(c, sub, ctx))
4266 return 0;
4267 }
4268 ADDOP_I(c, BUILD_TUPLE, n);
4269 }
4270 break;
4271 default:
4272 PyErr_Format(PyExc_SystemError,
4273 "invalid subscript kind %d", s->kind);
4274 return 0;
4275 }
4276 return compiler_handle_subscr(c, kindname, ctx);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004277}
4278
Thomas Wouters89f507f2006-12-13 04:49:30 +00004279/* End of the compiler section, beginning of the assembler section */
4280
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004281/* do depth-first search of basic block graph, starting with block.
4282 post records the block indices in post-order.
4283
4284 XXX must handle implicit jumps from one block to next
4285*/
4286
Thomas Wouters89f507f2006-12-13 04:49:30 +00004287struct assembler {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004288 PyObject *a_bytecode; /* string containing bytecode */
4289 int a_offset; /* offset into bytecode */
4290 int a_nblocks; /* number of reachable blocks */
4291 basicblock **a_postorder; /* list of blocks in dfs postorder */
4292 PyObject *a_lnotab; /* string containing lnotab */
4293 int a_lnotab_off; /* offset into lnotab */
4294 int a_lineno; /* last lineno of emitted instruction */
4295 int a_lineno_off; /* bytecode offset of last lineno */
Thomas Wouters89f507f2006-12-13 04:49:30 +00004296};
4297
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004298static void
4299dfs(struct compiler *c, basicblock *b, struct assembler *a)
4300{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004301 int i;
4302 struct instr *instr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004303
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004304 if (b->b_seen)
4305 return;
4306 b->b_seen = 1;
4307 if (b->b_next != NULL)
4308 dfs(c, b->b_next, a);
4309 for (i = 0; i < b->b_iused; i++) {
4310 instr = &b->b_instr[i];
4311 if (instr->i_jrel || instr->i_jabs)
4312 dfs(c, instr->i_target, a);
4313 }
4314 a->a_postorder[a->a_nblocks++] = b;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004315}
4316
Neal Norwitz2744c6c2005-11-13 01:08:38 +00004317static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004318stackdepth_walk(struct compiler *c, basicblock *b, int depth, int maxdepth)
4319{
Larry Hastings3a907972013-11-23 14:49:22 -08004320 int i, target_depth, effect;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004321 struct instr *instr;
4322 if (b->b_seen || b->b_startdepth >= depth)
4323 return maxdepth;
4324 b->b_seen = 1;
4325 b->b_startdepth = depth;
4326 for (i = 0; i < b->b_iused; i++) {
4327 instr = &b->b_instr[i];
Larry Hastings3a907972013-11-23 14:49:22 -08004328 effect = PyCompile_OpcodeStackEffect(instr->i_opcode, instr->i_oparg);
4329 if (effect == PY_INVALID_STACK_EFFECT) {
4330 fprintf(stderr, "opcode = %d\n", instr->i_opcode);
4331 Py_FatalError("PyCompile_OpcodeStackEffect()");
4332 }
4333 depth += effect;
4334
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004335 if (depth > maxdepth)
4336 maxdepth = depth;
4337 assert(depth >= 0); /* invalid code or bug in stackdepth() */
4338 if (instr->i_jrel || instr->i_jabs) {
4339 target_depth = depth;
4340 if (instr->i_opcode == FOR_ITER) {
4341 target_depth = depth-2;
Antoine Pitrou99614052014-05-23 11:46:03 +02004342 }
4343 else if (instr->i_opcode == SETUP_FINALLY ||
4344 instr->i_opcode == SETUP_EXCEPT) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004345 target_depth = depth+3;
4346 if (target_depth > maxdepth)
4347 maxdepth = target_depth;
4348 }
Antoine Pitrou99614052014-05-23 11:46:03 +02004349 else if (instr->i_opcode == JUMP_IF_TRUE_OR_POP ||
4350 instr->i_opcode == JUMP_IF_FALSE_OR_POP)
4351 depth = depth - 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004352 maxdepth = stackdepth_walk(c, instr->i_target,
4353 target_depth, maxdepth);
4354 if (instr->i_opcode == JUMP_ABSOLUTE ||
4355 instr->i_opcode == JUMP_FORWARD) {
4356 goto out; /* remaining code is dead */
4357 }
4358 }
4359 }
4360 if (b->b_next)
4361 maxdepth = stackdepth_walk(c, b->b_next, depth, maxdepth);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004362out:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004363 b->b_seen = 0;
4364 return maxdepth;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004365}
4366
4367/* Find the flow path that needs the largest stack. We assume that
4368 * cycles in the flow graph have no net effect on the stack depth.
4369 */
4370static int
4371stackdepth(struct compiler *c)
4372{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004373 basicblock *b, *entryblock;
4374 entryblock = NULL;
4375 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
4376 b->b_seen = 0;
4377 b->b_startdepth = INT_MIN;
4378 entryblock = b;
4379 }
4380 if (!entryblock)
4381 return 0;
4382 return stackdepth_walk(c, entryblock, 0, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004383}
4384
4385static int
4386assemble_init(struct assembler *a, int nblocks, int firstlineno)
4387{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004388 memset(a, 0, sizeof(struct assembler));
4389 a->a_lineno = firstlineno;
4390 a->a_bytecode = PyBytes_FromStringAndSize(NULL, DEFAULT_CODE_SIZE);
4391 if (!a->a_bytecode)
4392 return 0;
4393 a->a_lnotab = PyBytes_FromStringAndSize(NULL, DEFAULT_LNOTAB_SIZE);
4394 if (!a->a_lnotab)
4395 return 0;
Christian Heimes724b8282013-12-04 08:42:46 +01004396 if ((size_t)nblocks > PY_SIZE_MAX / sizeof(basicblock *)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004397 PyErr_NoMemory();
4398 return 0;
4399 }
4400 a->a_postorder = (basicblock **)PyObject_Malloc(
4401 sizeof(basicblock *) * nblocks);
4402 if (!a->a_postorder) {
4403 PyErr_NoMemory();
4404 return 0;
4405 }
4406 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004407}
4408
4409static void
4410assemble_free(struct assembler *a)
4411{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004412 Py_XDECREF(a->a_bytecode);
4413 Py_XDECREF(a->a_lnotab);
4414 if (a->a_postorder)
4415 PyObject_Free(a->a_postorder);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004416}
4417
4418/* Return the size of a basic block in bytes. */
4419
4420static int
4421instrsize(struct instr *instr)
4422{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004423 if (!instr->i_hasarg)
4424 return 1; /* 1 byte for the opcode*/
4425 if (instr->i_oparg > 0xffff)
4426 return 6; /* 1 (opcode) + 1 (EXTENDED_ARG opcode) + 2 (oparg) + 2(oparg extended) */
4427 return 3; /* 1 (opcode) + 2 (oparg) */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004428}
4429
4430static int
4431blocksize(basicblock *b)
4432{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004433 int i;
4434 int size = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004435
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004436 for (i = 0; i < b->b_iused; i++)
4437 size += instrsize(&b->b_instr[i]);
4438 return size;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004439}
4440
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00004441/* Appends a pair to the end of the line number table, a_lnotab, representing
4442 the instruction's bytecode offset and line number. See
4443 Objects/lnotab_notes.txt for the description of the line number table. */
Tim Peters2a7f3842001-06-09 09:26:21 +00004444
Guido van Rossumf68d8e52001-04-14 17:55:09 +00004445static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004446assemble_lnotab(struct assembler *a, struct instr *i)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004447{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004448 int d_bytecode, d_lineno;
Victor Stinnerad9a0662013-11-19 22:23:20 +01004449 Py_ssize_t len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004450 unsigned char *lnotab;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004451
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004452 d_bytecode = a->a_offset - a->a_lineno_off;
4453 d_lineno = i->i_lineno - a->a_lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004454
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004455 assert(d_bytecode >= 0);
4456 assert(d_lineno >= 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004457
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004458 if(d_bytecode == 0 && d_lineno == 0)
4459 return 1;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004460
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004461 if (d_bytecode > 255) {
4462 int j, nbytes, ncodes = d_bytecode / 255;
4463 nbytes = a->a_lnotab_off + 2 * ncodes;
4464 len = PyBytes_GET_SIZE(a->a_lnotab);
4465 if (nbytes >= len) {
4466 if ((len <= INT_MAX / 2) && (len * 2 < nbytes))
4467 len = nbytes;
4468 else if (len <= INT_MAX / 2)
4469 len *= 2;
4470 else {
4471 PyErr_NoMemory();
4472 return 0;
4473 }
4474 if (_PyBytes_Resize(&a->a_lnotab, len) < 0)
4475 return 0;
4476 }
4477 lnotab = (unsigned char *)
4478 PyBytes_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
4479 for (j = 0; j < ncodes; j++) {
4480 *lnotab++ = 255;
4481 *lnotab++ = 0;
4482 }
4483 d_bytecode -= ncodes * 255;
4484 a->a_lnotab_off += ncodes * 2;
4485 }
4486 assert(d_bytecode <= 255);
4487 if (d_lineno > 255) {
4488 int j, nbytes, ncodes = d_lineno / 255;
4489 nbytes = a->a_lnotab_off + 2 * ncodes;
4490 len = PyBytes_GET_SIZE(a->a_lnotab);
4491 if (nbytes >= len) {
4492 if ((len <= INT_MAX / 2) && len * 2 < nbytes)
4493 len = nbytes;
4494 else if (len <= INT_MAX / 2)
4495 len *= 2;
4496 else {
4497 PyErr_NoMemory();
4498 return 0;
4499 }
4500 if (_PyBytes_Resize(&a->a_lnotab, len) < 0)
4501 return 0;
4502 }
4503 lnotab = (unsigned char *)
4504 PyBytes_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
4505 *lnotab++ = d_bytecode;
4506 *lnotab++ = 255;
4507 d_bytecode = 0;
4508 for (j = 1; j < ncodes; j++) {
4509 *lnotab++ = 0;
4510 *lnotab++ = 255;
4511 }
4512 d_lineno -= ncodes * 255;
4513 a->a_lnotab_off += ncodes * 2;
4514 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004515
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004516 len = PyBytes_GET_SIZE(a->a_lnotab);
4517 if (a->a_lnotab_off + 2 >= len) {
4518 if (_PyBytes_Resize(&a->a_lnotab, len * 2) < 0)
4519 return 0;
4520 }
4521 lnotab = (unsigned char *)
4522 PyBytes_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
Tim Peters51e26512001-09-07 08:45:55 +00004523
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004524 a->a_lnotab_off += 2;
4525 if (d_bytecode) {
4526 *lnotab++ = d_bytecode;
Victor Stinner4f2dab52011-05-27 16:46:51 +02004527 *lnotab++ = d_lineno;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004528 }
4529 else { /* First line of a block; def stmt, etc. */
4530 *lnotab++ = 0;
Victor Stinner4f2dab52011-05-27 16:46:51 +02004531 *lnotab++ = d_lineno;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004532 }
4533 a->a_lineno = i->i_lineno;
4534 a->a_lineno_off = a->a_offset;
4535 return 1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004536}
4537
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004538/* assemble_emit()
4539 Extend the bytecode with a new instruction.
4540 Update lnotab if necessary.
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004541*/
4542
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004543static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004544assemble_emit(struct assembler *a, struct instr *i)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004545{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004546 int size, arg = 0, ext = 0;
4547 Py_ssize_t len = PyBytes_GET_SIZE(a->a_bytecode);
4548 char *code;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004549
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004550 size = instrsize(i);
4551 if (i->i_hasarg) {
4552 arg = i->i_oparg;
4553 ext = arg >> 16;
4554 }
4555 if (i->i_lineno && !assemble_lnotab(a, i))
4556 return 0;
4557 if (a->a_offset + size >= len) {
4558 if (len > PY_SSIZE_T_MAX / 2)
4559 return 0;
4560 if (_PyBytes_Resize(&a->a_bytecode, len * 2) < 0)
4561 return 0;
4562 }
4563 code = PyBytes_AS_STRING(a->a_bytecode) + a->a_offset;
4564 a->a_offset += size;
4565 if (size == 6) {
4566 assert(i->i_hasarg);
4567 *code++ = (char)EXTENDED_ARG;
4568 *code++ = ext & 0xff;
4569 *code++ = ext >> 8;
4570 arg &= 0xffff;
4571 }
4572 *code++ = i->i_opcode;
4573 if (i->i_hasarg) {
4574 assert(size == 3 || size == 6);
4575 *code++ = arg & 0xff;
Victor Stinner4f2dab52011-05-27 16:46:51 +02004576 *code++ = arg >> 8;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004577 }
4578 return 1;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004579}
4580
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004581static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004582assemble_jump_offsets(struct assembler *a, struct compiler *c)
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004583{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004584 basicblock *b;
4585 int bsize, totsize, extended_arg_count = 0, last_extended_arg_count;
4586 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004587
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004588 /* Compute the size of each block and fixup jump args.
4589 Replace block pointer with position in bytecode. */
4590 do {
4591 totsize = 0;
4592 for (i = a->a_nblocks - 1; i >= 0; i--) {
4593 b = a->a_postorder[i];
4594 bsize = blocksize(b);
4595 b->b_offset = totsize;
4596 totsize += bsize;
4597 }
4598 last_extended_arg_count = extended_arg_count;
4599 extended_arg_count = 0;
4600 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
4601 bsize = b->b_offset;
4602 for (i = 0; i < b->b_iused; i++) {
4603 struct instr *instr = &b->b_instr[i];
4604 /* Relative jumps are computed relative to
4605 the instruction pointer after fetching
4606 the jump instruction.
4607 */
4608 bsize += instrsize(instr);
4609 if (instr->i_jabs)
4610 instr->i_oparg = instr->i_target->b_offset;
4611 else if (instr->i_jrel) {
4612 int delta = instr->i_target->b_offset - bsize;
4613 instr->i_oparg = delta;
4614 }
4615 else
4616 continue;
4617 if (instr->i_oparg > 0xffff)
4618 extended_arg_count++;
4619 }
4620 }
Neal Norwitzf1d50682005-10-23 23:00:41 +00004621
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004622 /* XXX: This is an awful hack that could hurt performance, but
4623 on the bright side it should work until we come up
4624 with a better solution.
Neal Norwitzf1d50682005-10-23 23:00:41 +00004625
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004626 The issue is that in the first loop blocksize() is called
4627 which calls instrsize() which requires i_oparg be set
4628 appropriately. There is a bootstrap problem because
4629 i_oparg is calculated in the second loop above.
Neal Norwitzf1d50682005-10-23 23:00:41 +00004630
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004631 So we loop until we stop seeing new EXTENDED_ARGs.
4632 The only EXTENDED_ARGs that could be popping up are
4633 ones in jump instructions. So this should converge
4634 fairly quickly.
4635 */
4636 } while (last_extended_arg_count != extended_arg_count);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004637}
4638
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004639static PyObject *
Victor Stinnerad9a0662013-11-19 22:23:20 +01004640dict_keys_inorder(PyObject *dict, Py_ssize_t offset)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004641{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004642 PyObject *tuple, *k, *v;
4643 Py_ssize_t i, pos = 0, size = PyDict_Size(dict);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004644
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004645 tuple = PyTuple_New(size);
4646 if (tuple == NULL)
4647 return NULL;
4648 while (PyDict_Next(dict, &pos, &k, &v)) {
4649 i = PyLong_AS_LONG(v);
4650 /* The keys of the dictionary are tuples. (see compiler_add_o)
4651 The object we want is always first, though. */
4652 k = PyTuple_GET_ITEM(k, 0);
4653 Py_INCREF(k);
4654 assert((i - offset) < size);
4655 assert((i - offset) >= 0);
4656 PyTuple_SET_ITEM(tuple, i - offset, k);
4657 }
4658 return tuple;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004659}
4660
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004661static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004662compute_code_flags(struct compiler *c)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004663{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004664 PySTEntryObject *ste = c->u->u_ste;
Victor Stinnerad9a0662013-11-19 22:23:20 +01004665 int flags = 0;
4666 Py_ssize_t n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004667 if (ste->ste_type == FunctionBlock) {
Benjamin Peterson1dfd2472015-04-27 21:44:22 -04004668 flags |= CO_NEWLOCALS | CO_OPTIMIZED;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004669 if (ste->ste_nested)
4670 flags |= CO_NESTED;
4671 if (ste->ste_generator)
4672 flags |= CO_GENERATOR;
4673 if (ste->ste_varargs)
4674 flags |= CO_VARARGS;
4675 if (ste->ste_varkeywords)
4676 flags |= CO_VARKEYWORDS;
4677 }
Thomas Wouters5e9f1fa2006-02-28 20:02:27 +00004678
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004679 /* (Only) inherit compilerflags in PyCF_MASK */
4680 flags |= (c->c_flags->cf_flags & PyCF_MASK);
Thomas Wouters5e9f1fa2006-02-28 20:02:27 +00004681
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004682 n = PyDict_Size(c->u->u_freevars);
4683 if (n < 0)
4684 return -1;
4685 if (n == 0) {
4686 n = PyDict_Size(c->u->u_cellvars);
4687 if (n < 0)
Victor Stinnerad9a0662013-11-19 22:23:20 +01004688 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004689 if (n == 0) {
Victor Stinnerad9a0662013-11-19 22:23:20 +01004690 flags |= CO_NOFREE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004691 }
4692 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004693
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004694 return flags;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004695}
4696
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004697static PyCodeObject *
4698makecode(struct compiler *c, struct assembler *a)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004699{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004700 PyObject *tmp;
4701 PyCodeObject *co = NULL;
4702 PyObject *consts = NULL;
4703 PyObject *names = NULL;
4704 PyObject *varnames = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004705 PyObject *name = NULL;
4706 PyObject *freevars = NULL;
4707 PyObject *cellvars = NULL;
4708 PyObject *bytecode = NULL;
Victor Stinnerad9a0662013-11-19 22:23:20 +01004709 Py_ssize_t nlocals;
4710 int nlocals_int;
4711 int flags;
Victor Stinnerf8e32212013-11-19 23:56:34 +01004712 int argcount, kwonlyargcount;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004713
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004714 tmp = dict_keys_inorder(c->u->u_consts, 0);
4715 if (!tmp)
4716 goto error;
4717 consts = PySequence_List(tmp); /* optimize_code requires a list */
4718 Py_DECREF(tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004719
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004720 names = dict_keys_inorder(c->u->u_names, 0);
4721 varnames = dict_keys_inorder(c->u->u_varnames, 0);
4722 if (!consts || !names || !varnames)
4723 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004724
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004725 cellvars = dict_keys_inorder(c->u->u_cellvars, 0);
4726 if (!cellvars)
4727 goto error;
4728 freevars = dict_keys_inorder(c->u->u_freevars, PyTuple_Size(cellvars));
4729 if (!freevars)
4730 goto error;
Victor Stinnerad9a0662013-11-19 22:23:20 +01004731
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004732 nlocals = PyDict_Size(c->u->u_varnames);
Victor Stinnerad9a0662013-11-19 22:23:20 +01004733 assert(nlocals < INT_MAX);
4734 nlocals_int = Py_SAFE_DOWNCAST(nlocals, Py_ssize_t, int);
4735
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004736 flags = compute_code_flags(c);
4737 if (flags < 0)
4738 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004739
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004740 bytecode = PyCode_Optimize(a->a_bytecode, consts, names, a->a_lnotab);
4741 if (!bytecode)
4742 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004743
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004744 tmp = PyList_AsTuple(consts); /* PyCode_New requires a tuple */
4745 if (!tmp)
4746 goto error;
4747 Py_DECREF(consts);
4748 consts = tmp;
4749
Victor Stinnerf8e32212013-11-19 23:56:34 +01004750 argcount = Py_SAFE_DOWNCAST(c->u->u_argcount, Py_ssize_t, int);
4751 kwonlyargcount = Py_SAFE_DOWNCAST(c->u->u_kwonlyargcount, Py_ssize_t, int);
4752 co = PyCode_New(argcount, kwonlyargcount,
Victor Stinnerad9a0662013-11-19 22:23:20 +01004753 nlocals_int, stackdepth(c), flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004754 bytecode, consts, names, varnames,
4755 freevars, cellvars,
Victor Stinner14e461d2013-08-26 22:28:21 +02004756 c->c_filename, c->u->u_name,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004757 c->u->u_firstlineno,
4758 a->a_lnotab);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004759 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004760 Py_XDECREF(consts);
4761 Py_XDECREF(names);
4762 Py_XDECREF(varnames);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004763 Py_XDECREF(name);
4764 Py_XDECREF(freevars);
4765 Py_XDECREF(cellvars);
4766 Py_XDECREF(bytecode);
4767 return co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004768}
4769
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004770
4771/* For debugging purposes only */
4772#if 0
4773static void
4774dump_instr(const struct instr *i)
4775{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004776 const char *jrel = i->i_jrel ? "jrel " : "";
4777 const char *jabs = i->i_jabs ? "jabs " : "";
4778 char arg[128];
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004779
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004780 *arg = '\0';
4781 if (i->i_hasarg)
4782 sprintf(arg, "arg: %d ", i->i_oparg);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004783
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004784 fprintf(stderr, "line: %d, opcode: %d %s%s%s\n",
4785 i->i_lineno, i->i_opcode, arg, jabs, jrel);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004786}
4787
4788static void
4789dump_basicblock(const basicblock *b)
4790{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004791 const char *seen = b->b_seen ? "seen " : "";
4792 const char *b_return = b->b_return ? "return " : "";
4793 fprintf(stderr, "used: %d, depth: %d, offset: %d %s%s\n",
4794 b->b_iused, b->b_startdepth, b->b_offset, seen, b_return);
4795 if (b->b_instr) {
4796 int i;
4797 for (i = 0; i < b->b_iused; i++) {
4798 fprintf(stderr, " [%02d] ", i);
4799 dump_instr(b->b_instr + i);
4800 }
4801 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004802}
4803#endif
4804
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004805static PyCodeObject *
4806assemble(struct compiler *c, int addNone)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004807{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004808 basicblock *b, *entryblock;
4809 struct assembler a;
4810 int i, j, nblocks;
4811 PyCodeObject *co = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004812
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004813 /* Make sure every block that falls off the end returns None.
4814 XXX NEXT_BLOCK() isn't quite right, because if the last
4815 block ends with a jump or return b_next shouldn't set.
4816 */
4817 if (!c->u->u_curblock->b_return) {
4818 NEXT_BLOCK(c);
4819 if (addNone)
4820 ADDOP_O(c, LOAD_CONST, Py_None, consts);
4821 ADDOP(c, RETURN_VALUE);
4822 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004823
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004824 nblocks = 0;
4825 entryblock = NULL;
4826 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
4827 nblocks++;
4828 entryblock = b;
4829 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004830
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004831 /* Set firstlineno if it wasn't explicitly set. */
4832 if (!c->u->u_firstlineno) {
4833 if (entryblock && entryblock->b_instr)
4834 c->u->u_firstlineno = entryblock->b_instr->i_lineno;
4835 else
4836 c->u->u_firstlineno = 1;
4837 }
4838 if (!assemble_init(&a, nblocks, c->u->u_firstlineno))
4839 goto error;
4840 dfs(c, entryblock, &a);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004841
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004842 /* Can't modify the bytecode after computing jump offsets. */
4843 assemble_jump_offsets(&a, c);
Tim Petersb6c3cea2001-06-26 03:36:28 +00004844
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004845 /* Emit code in reverse postorder from dfs. */
4846 for (i = a.a_nblocks - 1; i >= 0; i--) {
4847 b = a.a_postorder[i];
4848 for (j = 0; j < b->b_iused; j++)
4849 if (!assemble_emit(&a, &b->b_instr[j]))
4850 goto error;
4851 }
Tim Petersb6c3cea2001-06-26 03:36:28 +00004852
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004853 if (_PyBytes_Resize(&a.a_lnotab, a.a_lnotab_off) < 0)
4854 goto error;
4855 if (_PyBytes_Resize(&a.a_bytecode, a.a_offset) < 0)
4856 goto error;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004857
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004858 co = makecode(c, &a);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004859 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004860 assemble_free(&a);
4861 return co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004862}
Georg Brandl8334fd92010-12-04 10:26:46 +00004863
4864#undef PyAST_Compile
4865PyAPI_FUNC(PyCodeObject *)
4866PyAST_Compile(mod_ty mod, const char *filename, PyCompilerFlags *flags,
4867 PyArena *arena)
4868{
4869 return PyAST_CompileEx(mod, filename, flags, -1, arena);
4870}