blob: f362ac6bdab460d74789d5ceaeea4eff932bb91c [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);
Serhiy Storchaka5a57ade2015-12-24 10:35:59 +02001803 Py_SETREF(c->u->u_private, s->v.ClassDef.name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001804 /* load (global) __name__ ... */
1805 str = PyUnicode_InternFromString("__name__");
1806 if (!str || !compiler_nameop(c, str, Load)) {
1807 Py_XDECREF(str);
1808 compiler_exit_scope(c);
1809 return 0;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001810 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001811 Py_DECREF(str);
1812 /* ... and store it as __module__ */
1813 str = PyUnicode_InternFromString("__module__");
1814 if (!str || !compiler_nameop(c, str, Store)) {
1815 Py_XDECREF(str);
1816 compiler_exit_scope(c);
1817 return 0;
1818 }
1819 Py_DECREF(str);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04001820 assert(c->u->u_qualname);
1821 ADDOP_O(c, LOAD_CONST, c->u->u_qualname, consts);
Antoine Pitrou86a36b52011-11-25 18:56:07 +01001822 str = PyUnicode_InternFromString("__qualname__");
1823 if (!str || !compiler_nameop(c, str, Store)) {
1824 Py_XDECREF(str);
1825 compiler_exit_scope(c);
1826 return 0;
1827 }
1828 Py_DECREF(str);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001829 /* compile the body proper */
1830 if (!compiler_body(c, s->v.ClassDef.body)) {
1831 compiler_exit_scope(c);
1832 return 0;
1833 }
Benjamin Peterson312595c2013-05-15 15:26:42 -05001834 if (c->u->u_ste->ste_needs_class_closure) {
1835 /* return the (empty) __class__ cell */
1836 str = PyUnicode_InternFromString("__class__");
1837 if (str == NULL) {
1838 compiler_exit_scope(c);
1839 return 0;
1840 }
1841 i = compiler_lookup_arg(c->u->u_cellvars, str);
1842 Py_DECREF(str);
Victor Stinner98e818b2013-11-05 18:07:34 +01001843 if (i < 0) {
1844 compiler_exit_scope(c);
1845 return 0;
1846 }
Benjamin Peterson312595c2013-05-15 15:26:42 -05001847 assert(i == 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001848 /* Return the cell where to store __class__ */
1849 ADDOP_I(c, LOAD_CLOSURE, i);
1850 }
Benjamin Peterson312595c2013-05-15 15:26:42 -05001851 else {
1852 assert(PyDict_Size(c->u->u_cellvars) == 0);
1853 /* This happens when nobody references the cell. Return None. */
1854 ADDOP_O(c, LOAD_CONST, Py_None, consts);
1855 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001856 ADDOP_IN_SCOPE(c, RETURN_VALUE);
1857 /* create the code object */
1858 co = assemble(c, 1);
1859 }
1860 /* leave the new scope */
1861 compiler_exit_scope(c);
1862 if (co == NULL)
1863 return 0;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001864
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001865 /* 2. load the 'build_class' function */
1866 ADDOP(c, LOAD_BUILD_CLASS);
1867
1868 /* 3. load a function (or closure) made from the code object */
Antoine Pitrou86a36b52011-11-25 18:56:07 +01001869 compiler_make_closure(c, co, 0, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001870 Py_DECREF(co);
1871
1872 /* 4. load class name */
1873 ADDOP_O(c, LOAD_CONST, s->v.ClassDef.name, consts);
1874
1875 /* 5. generate the rest of the code for the call */
1876 if (!compiler_call_helper(c, 2,
1877 s->v.ClassDef.bases,
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001878 s->v.ClassDef.keywords))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001879 return 0;
1880
1881 /* 6. apply decorators */
1882 for (i = 0; i < asdl_seq_LEN(decos); i++) {
1883 ADDOP_I(c, CALL_FUNCTION, 1);
1884 }
1885
1886 /* 7. store into <name> */
1887 if (!compiler_nameop(c, s->v.ClassDef.name, Store))
1888 return 0;
1889 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001890}
1891
1892static int
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001893compiler_ifexp(struct compiler *c, expr_ty e)
1894{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001895 basicblock *end, *next;
1896
1897 assert(e->kind == IfExp_kind);
1898 end = compiler_new_block(c);
1899 if (end == NULL)
1900 return 0;
1901 next = compiler_new_block(c);
1902 if (next == NULL)
1903 return 0;
1904 VISIT(c, expr, e->v.IfExp.test);
1905 ADDOP_JABS(c, POP_JUMP_IF_FALSE, next);
1906 VISIT(c, expr, e->v.IfExp.body);
1907 ADDOP_JREL(c, JUMP_FORWARD, end);
1908 compiler_use_next_block(c, next);
1909 VISIT(c, expr, e->v.IfExp.orelse);
1910 compiler_use_next_block(c, end);
1911 return 1;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001912}
1913
1914static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001915compiler_lambda(struct compiler *c, expr_ty e)
1916{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001917 PyCodeObject *co;
Antoine Pitrou86a36b52011-11-25 18:56:07 +01001918 PyObject *qualname;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001919 static identifier name;
Victor Stinnerad9a0662013-11-19 22:23:20 +01001920 int kw_default_count = 0;
1921 Py_ssize_t arglength;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001922 arguments_ty args = e->v.Lambda.args;
1923 assert(e->kind == Lambda_kind);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001924
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001925 if (!name) {
1926 name = PyUnicode_InternFromString("<lambda>");
1927 if (!name)
1928 return 0;
1929 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001930
Benjamin Peterson419d9a82013-02-10 09:48:22 -05001931 if (args->defaults)
1932 VISIT_SEQ(c, expr, args->defaults);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001933 if (args->kwonlyargs) {
1934 int res = compiler_visit_kwonlydefaults(c, args->kwonlyargs,
1935 args->kw_defaults);
1936 if (res < 0) return 0;
1937 kw_default_count = res;
1938 }
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04001939 if (!compiler_enter_scope(c, name, COMPILER_SCOPE_LAMBDA,
Antoine Pitrou86a36b52011-11-25 18:56:07 +01001940 (void *)e, e->lineno))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001941 return 0;
Neal Norwitz4737b232005-11-19 23:58:29 +00001942
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001943 /* Make None the first constant, so the lambda can't have a
1944 docstring. */
1945 if (compiler_add_o(c, c->u->u_consts, Py_None) < 0)
1946 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001947
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001948 c->u->u_argcount = asdl_seq_LEN(args->args);
1949 c->u->u_kwonlyargcount = asdl_seq_LEN(args->kwonlyargs);
1950 VISIT_IN_SCOPE(c, expr, e->v.Lambda.body);
1951 if (c->u->u_ste->ste_generator) {
Serhiy Storchakac775ad62015-03-11 18:20:35 +02001952 co = assemble(c, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001953 }
1954 else {
1955 ADDOP_IN_SCOPE(c, RETURN_VALUE);
Serhiy Storchakac775ad62015-03-11 18:20:35 +02001956 co = assemble(c, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001957 }
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04001958 qualname = c->u->u_qualname;
1959 Py_INCREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001960 compiler_exit_scope(c);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04001961 if (co == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001962 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001963
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001964 arglength = asdl_seq_LEN(args->defaults);
1965 arglength |= kw_default_count << 8;
Antoine Pitrou86a36b52011-11-25 18:56:07 +01001966 compiler_make_closure(c, co, arglength, qualname);
1967 Py_DECREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001968 Py_DECREF(co);
1969
1970 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001971}
1972
1973static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001974compiler_if(struct compiler *c, stmt_ty s)
1975{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001976 basicblock *end, *next;
1977 int constant;
1978 assert(s->kind == If_kind);
1979 end = compiler_new_block(c);
1980 if (end == NULL)
1981 return 0;
1982
Georg Brandl8334fd92010-12-04 10:26:46 +00001983 constant = expr_constant(c, s->v.If.test);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001984 /* constant = 0: "if 0"
1985 * constant = 1: "if 1", "if 2", ...
1986 * constant = -1: rest */
1987 if (constant == 0) {
1988 if (s->v.If.orelse)
1989 VISIT_SEQ(c, stmt, s->v.If.orelse);
1990 } else if (constant == 1) {
1991 VISIT_SEQ(c, stmt, s->v.If.body);
1992 } else {
Antoine Pitroue7811fc2014-09-18 03:06:50 +02001993 if (asdl_seq_LEN(s->v.If.orelse)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001994 next = compiler_new_block(c);
1995 if (next == NULL)
1996 return 0;
1997 }
1998 else
1999 next = end;
2000 VISIT(c, expr, s->v.If.test);
2001 ADDOP_JABS(c, POP_JUMP_IF_FALSE, next);
2002 VISIT_SEQ(c, stmt, s->v.If.body);
Antoine Pitroue7811fc2014-09-18 03:06:50 +02002003 if (asdl_seq_LEN(s->v.If.orelse)) {
2004 ADDOP_JREL(c, JUMP_FORWARD, end);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002005 compiler_use_next_block(c, next);
2006 VISIT_SEQ(c, stmt, s->v.If.orelse);
2007 }
2008 }
2009 compiler_use_next_block(c, end);
2010 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002011}
2012
2013static int
2014compiler_for(struct compiler *c, stmt_ty s)
2015{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002016 basicblock *start, *cleanup, *end;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002017
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002018 start = compiler_new_block(c);
2019 cleanup = compiler_new_block(c);
2020 end = compiler_new_block(c);
2021 if (start == NULL || end == NULL || cleanup == NULL)
2022 return 0;
2023 ADDOP_JREL(c, SETUP_LOOP, end);
2024 if (!compiler_push_fblock(c, LOOP, start))
2025 return 0;
2026 VISIT(c, expr, s->v.For.iter);
2027 ADDOP(c, GET_ITER);
2028 compiler_use_next_block(c, start);
2029 ADDOP_JREL(c, FOR_ITER, cleanup);
2030 VISIT(c, expr, s->v.For.target);
2031 VISIT_SEQ(c, stmt, s->v.For.body);
2032 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
2033 compiler_use_next_block(c, cleanup);
2034 ADDOP(c, POP_BLOCK);
2035 compiler_pop_fblock(c, LOOP, start);
2036 VISIT_SEQ(c, stmt, s->v.For.orelse);
2037 compiler_use_next_block(c, end);
2038 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002039}
2040
Yury Selivanov75445082015-05-11 22:57:16 -04002041
2042static int
2043compiler_async_for(struct compiler *c, stmt_ty s)
2044{
2045 static PyObject *stopiter_error = NULL;
2046 basicblock *try, *except, *end, *after_try, *try_cleanup,
2047 *after_loop, *after_loop_else;
2048
2049 if (stopiter_error == NULL) {
2050 stopiter_error = PyUnicode_InternFromString("StopAsyncIteration");
2051 if (stopiter_error == NULL)
2052 return 0;
2053 }
2054
2055 try = compiler_new_block(c);
2056 except = compiler_new_block(c);
2057 end = compiler_new_block(c);
2058 after_try = compiler_new_block(c);
2059 try_cleanup = compiler_new_block(c);
2060 after_loop = compiler_new_block(c);
2061 after_loop_else = compiler_new_block(c);
2062
2063 if (try == NULL || except == NULL || end == NULL
2064 || after_try == NULL || try_cleanup == NULL)
2065 return 0;
2066
2067 ADDOP_JREL(c, SETUP_LOOP, after_loop);
2068 if (!compiler_push_fblock(c, LOOP, try))
2069 return 0;
2070
2071 VISIT(c, expr, s->v.AsyncFor.iter);
2072 ADDOP(c, GET_AITER);
2073 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2074 ADDOP(c, YIELD_FROM);
2075
2076 compiler_use_next_block(c, try);
2077
2078
2079 ADDOP_JREL(c, SETUP_EXCEPT, except);
2080 if (!compiler_push_fblock(c, EXCEPT, try))
2081 return 0;
2082
2083 ADDOP(c, GET_ANEXT);
2084 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2085 ADDOP(c, YIELD_FROM);
2086 VISIT(c, expr, s->v.AsyncFor.target);
2087 ADDOP(c, POP_BLOCK);
2088 compiler_pop_fblock(c, EXCEPT, try);
2089 ADDOP_JREL(c, JUMP_FORWARD, after_try);
2090
2091
2092 compiler_use_next_block(c, except);
2093 ADDOP(c, DUP_TOP);
2094 ADDOP_O(c, LOAD_GLOBAL, stopiter_error, names);
2095 ADDOP_I(c, COMPARE_OP, PyCmp_EXC_MATCH);
2096 ADDOP_JABS(c, POP_JUMP_IF_FALSE, try_cleanup);
2097
2098 ADDOP(c, POP_TOP);
2099 ADDOP(c, POP_TOP);
2100 ADDOP(c, POP_TOP);
2101 ADDOP(c, POP_EXCEPT); /* for SETUP_EXCEPT */
2102 ADDOP(c, POP_BLOCK); /* for SETUP_LOOP */
2103 ADDOP_JABS(c, JUMP_ABSOLUTE, after_loop_else);
2104
2105
2106 compiler_use_next_block(c, try_cleanup);
2107 ADDOP(c, END_FINALLY);
2108
2109 compiler_use_next_block(c, after_try);
2110 VISIT_SEQ(c, stmt, s->v.AsyncFor.body);
2111 ADDOP_JABS(c, JUMP_ABSOLUTE, try);
2112
2113 ADDOP(c, POP_BLOCK); /* for SETUP_LOOP */
2114 compiler_pop_fblock(c, LOOP, try);
2115
2116 compiler_use_next_block(c, after_loop);
2117 ADDOP_JABS(c, JUMP_ABSOLUTE, end);
2118
2119 compiler_use_next_block(c, after_loop_else);
2120 VISIT_SEQ(c, stmt, s->v.For.orelse);
2121
2122 compiler_use_next_block(c, end);
2123
2124 return 1;
2125}
2126
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002127static int
2128compiler_while(struct compiler *c, stmt_ty s)
2129{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002130 basicblock *loop, *orelse, *end, *anchor = NULL;
Georg Brandl8334fd92010-12-04 10:26:46 +00002131 int constant = expr_constant(c, s->v.While.test);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002132
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002133 if (constant == 0) {
2134 if (s->v.While.orelse)
2135 VISIT_SEQ(c, stmt, s->v.While.orelse);
2136 return 1;
2137 }
2138 loop = compiler_new_block(c);
2139 end = compiler_new_block(c);
2140 if (constant == -1) {
2141 anchor = compiler_new_block(c);
2142 if (anchor == NULL)
2143 return 0;
2144 }
2145 if (loop == NULL || end == NULL)
2146 return 0;
2147 if (s->v.While.orelse) {
2148 orelse = compiler_new_block(c);
2149 if (orelse == NULL)
2150 return 0;
2151 }
2152 else
2153 orelse = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002154
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002155 ADDOP_JREL(c, SETUP_LOOP, end);
2156 compiler_use_next_block(c, loop);
2157 if (!compiler_push_fblock(c, LOOP, loop))
2158 return 0;
2159 if (constant == -1) {
2160 VISIT(c, expr, s->v.While.test);
2161 ADDOP_JABS(c, POP_JUMP_IF_FALSE, anchor);
2162 }
2163 VISIT_SEQ(c, stmt, s->v.While.body);
2164 ADDOP_JABS(c, JUMP_ABSOLUTE, loop);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002165
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002166 /* XXX should the two POP instructions be in a separate block
2167 if there is no else clause ?
2168 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002169
Benjamin Peterson3cda0ed2014-12-13 16:06:19 -05002170 if (constant == -1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002171 compiler_use_next_block(c, anchor);
Benjamin Peterson3cda0ed2014-12-13 16:06:19 -05002172 ADDOP(c, POP_BLOCK);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002173 compiler_pop_fblock(c, LOOP, loop);
2174 if (orelse != NULL) /* what if orelse is just pass? */
2175 VISIT_SEQ(c, stmt, s->v.While.orelse);
2176 compiler_use_next_block(c, end);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002177
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002178 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002179}
2180
2181static int
2182compiler_continue(struct compiler *c)
2183{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002184 static const char LOOP_ERROR_MSG[] = "'continue' not properly in loop";
2185 static const char IN_FINALLY_ERROR_MSG[] =
2186 "'continue' not supported inside 'finally' clause";
2187 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002188
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002189 if (!c->u->u_nfblocks)
2190 return compiler_error(c, LOOP_ERROR_MSG);
2191 i = c->u->u_nfblocks - 1;
2192 switch (c->u->u_fblock[i].fb_type) {
2193 case LOOP:
2194 ADDOP_JABS(c, JUMP_ABSOLUTE, c->u->u_fblock[i].fb_block);
2195 break;
2196 case EXCEPT:
2197 case FINALLY_TRY:
2198 while (--i >= 0 && c->u->u_fblock[i].fb_type != LOOP) {
2199 /* Prevent continue anywhere under a finally
2200 even if hidden in a sub-try or except. */
2201 if (c->u->u_fblock[i].fb_type == FINALLY_END)
2202 return compiler_error(c, IN_FINALLY_ERROR_MSG);
2203 }
2204 if (i == -1)
2205 return compiler_error(c, LOOP_ERROR_MSG);
2206 ADDOP_JABS(c, CONTINUE_LOOP, c->u->u_fblock[i].fb_block);
2207 break;
2208 case FINALLY_END:
2209 return compiler_error(c, IN_FINALLY_ERROR_MSG);
2210 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002211
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002212 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002213}
2214
2215/* Code generated for "try: <body> finally: <finalbody>" is as follows:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002216
2217 SETUP_FINALLY L
2218 <code for body>
2219 POP_BLOCK
2220 LOAD_CONST <None>
2221 L: <code for finalbody>
2222 END_FINALLY
2223
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002224 The special instructions use the block stack. Each block
2225 stack entry contains the instruction that created it (here
2226 SETUP_FINALLY), the level of the value stack at the time the
2227 block stack entry was created, and a label (here L).
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002228
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002229 SETUP_FINALLY:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002230 Pushes the current value stack level and the label
2231 onto the block stack.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002232 POP_BLOCK:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002233 Pops en entry from the block stack, and pops the value
2234 stack until its level is the same as indicated on the
2235 block stack. (The label is ignored.)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002236 END_FINALLY:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002237 Pops a variable number of entries from the *value* stack
2238 and re-raises the exception they specify. The number of
2239 entries popped depends on the (pseudo) exception type.
2240
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002241 The block stack is unwound when an exception is raised:
2242 when a SETUP_FINALLY entry is found, the exception is pushed
2243 onto the value stack (and the exception condition is cleared),
2244 and the interpreter jumps to the label gotten from the block
2245 stack.
2246*/
2247
2248static int
2249compiler_try_finally(struct compiler *c, stmt_ty s)
2250{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002251 basicblock *body, *end;
2252 body = compiler_new_block(c);
2253 end = compiler_new_block(c);
2254 if (body == NULL || end == NULL)
2255 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002256
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002257 ADDOP_JREL(c, SETUP_FINALLY, end);
2258 compiler_use_next_block(c, body);
2259 if (!compiler_push_fblock(c, FINALLY_TRY, body))
2260 return 0;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002261 if (s->v.Try.handlers && asdl_seq_LEN(s->v.Try.handlers)) {
2262 if (!compiler_try_except(c, s))
2263 return 0;
2264 }
2265 else {
2266 VISIT_SEQ(c, stmt, s->v.Try.body);
2267 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002268 ADDOP(c, POP_BLOCK);
2269 compiler_pop_fblock(c, FINALLY_TRY, body);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002270
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002271 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2272 compiler_use_next_block(c, end);
2273 if (!compiler_push_fblock(c, FINALLY_END, end))
2274 return 0;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002275 VISIT_SEQ(c, stmt, s->v.Try.finalbody);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002276 ADDOP(c, END_FINALLY);
2277 compiler_pop_fblock(c, FINALLY_END, end);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002278
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002279 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002280}
2281
2282/*
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00002283 Code generated for "try: S except E1 as V1: S1 except E2 as V2: S2 ...":
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002284 (The contents of the value stack is shown in [], with the top
2285 at the right; 'tb' is trace-back info, 'val' the exception's
2286 associated value, and 'exc' the exception.)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002287
2288 Value stack Label Instruction Argument
2289 [] SETUP_EXCEPT L1
2290 [] <code for S>
2291 [] POP_BLOCK
2292 [] JUMP_FORWARD L0
2293
2294 [tb, val, exc] L1: DUP )
2295 [tb, val, exc, exc] <evaluate E1> )
2296 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2297 [tb, val, exc, 1-or-0] POP_JUMP_IF_FALSE L2 )
2298 [tb, val, exc] POP
2299 [tb, val] <assign to V1> (or POP if no V1)
2300 [tb] POP
2301 [] <code for S1>
2302 JUMP_FORWARD L0
2303
2304 [tb, val, exc] L2: DUP
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002305 .............................etc.......................
2306
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002307 [tb, val, exc] Ln+1: END_FINALLY # re-raise exception
2308
2309 [] L0: <next statement>
2310
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002311 Of course, parts are not generated if Vi or Ei is not present.
2312*/
2313static int
2314compiler_try_except(struct compiler *c, stmt_ty s)
2315{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002316 basicblock *body, *orelse, *except, *end;
Victor Stinnerad9a0662013-11-19 22:23:20 +01002317 Py_ssize_t i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002318
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002319 body = compiler_new_block(c);
2320 except = compiler_new_block(c);
2321 orelse = compiler_new_block(c);
2322 end = compiler_new_block(c);
2323 if (body == NULL || except == NULL || orelse == NULL || end == NULL)
2324 return 0;
2325 ADDOP_JREL(c, SETUP_EXCEPT, except);
2326 compiler_use_next_block(c, body);
2327 if (!compiler_push_fblock(c, EXCEPT, body))
2328 return 0;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002329 VISIT_SEQ(c, stmt, s->v.Try.body);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002330 ADDOP(c, POP_BLOCK);
2331 compiler_pop_fblock(c, EXCEPT, body);
2332 ADDOP_JREL(c, JUMP_FORWARD, orelse);
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002333 n = asdl_seq_LEN(s->v.Try.handlers);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002334 compiler_use_next_block(c, except);
2335 for (i = 0; i < n; i++) {
2336 excepthandler_ty handler = (excepthandler_ty)asdl_seq_GET(
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002337 s->v.Try.handlers, i);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002338 if (!handler->v.ExceptHandler.type && i < n-1)
2339 return compiler_error(c, "default 'except:' must be last");
2340 c->u->u_lineno_set = 0;
2341 c->u->u_lineno = handler->lineno;
Benjamin Petersond4efd9e2010-09-20 23:02:10 +00002342 c->u->u_col_offset = handler->col_offset;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002343 except = compiler_new_block(c);
2344 if (except == NULL)
2345 return 0;
2346 if (handler->v.ExceptHandler.type) {
2347 ADDOP(c, DUP_TOP);
2348 VISIT(c, expr, handler->v.ExceptHandler.type);
2349 ADDOP_I(c, COMPARE_OP, PyCmp_EXC_MATCH);
2350 ADDOP_JABS(c, POP_JUMP_IF_FALSE, except);
2351 }
2352 ADDOP(c, POP_TOP);
2353 if (handler->v.ExceptHandler.name) {
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002354 basicblock *cleanup_end, *cleanup_body;
Guido van Rossumb940e112007-01-10 16:19:56 +00002355
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002356 cleanup_end = compiler_new_block(c);
2357 cleanup_body = compiler_new_block(c);
Benjamin Peterson0a5dad92011-05-27 14:17:04 -05002358 if (!(cleanup_end || cleanup_body))
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002359 return 0;
Guido van Rossumb940e112007-01-10 16:19:56 +00002360
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002361 compiler_nameop(c, handler->v.ExceptHandler.name, Store);
2362 ADDOP(c, POP_TOP);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002363
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002364 /*
2365 try:
Ezio Melotti1b6424f2013-04-19 07:10:09 +03002366 # body
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002367 except type as name:
Ezio Melotti1b6424f2013-04-19 07:10:09 +03002368 try:
2369 # body
2370 finally:
2371 name = None
2372 del name
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002373 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002374
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002375 /* second try: */
2376 ADDOP_JREL(c, SETUP_FINALLY, cleanup_end);
2377 compiler_use_next_block(c, cleanup_body);
2378 if (!compiler_push_fblock(c, FINALLY_TRY, cleanup_body))
2379 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002380
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002381 /* second # body */
2382 VISIT_SEQ(c, stmt, handler->v.ExceptHandler.body);
2383 ADDOP(c, POP_BLOCK);
2384 ADDOP(c, POP_EXCEPT);
2385 compiler_pop_fblock(c, FINALLY_TRY, cleanup_body);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002386
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002387 /* finally: */
2388 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2389 compiler_use_next_block(c, cleanup_end);
2390 if (!compiler_push_fblock(c, FINALLY_END, cleanup_end))
2391 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002392
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002393 /* name = None */
2394 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2395 compiler_nameop(c, handler->v.ExceptHandler.name, Store);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002396
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002397 /* del name */
2398 compiler_nameop(c, handler->v.ExceptHandler.name, Del);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002399
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002400 ADDOP(c, END_FINALLY);
2401 compiler_pop_fblock(c, FINALLY_END, cleanup_end);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002402 }
2403 else {
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002404 basicblock *cleanup_body;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002405
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002406 cleanup_body = compiler_new_block(c);
Benjamin Peterson0a5dad92011-05-27 14:17:04 -05002407 if (!cleanup_body)
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002408 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002409
Guido van Rossumb940e112007-01-10 16:19:56 +00002410 ADDOP(c, POP_TOP);
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002411 ADDOP(c, POP_TOP);
2412 compiler_use_next_block(c, cleanup_body);
2413 if (!compiler_push_fblock(c, FINALLY_TRY, cleanup_body))
2414 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002415 VISIT_SEQ(c, stmt, handler->v.ExceptHandler.body);
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002416 ADDOP(c, POP_EXCEPT);
2417 compiler_pop_fblock(c, FINALLY_TRY, cleanup_body);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002418 }
2419 ADDOP_JREL(c, JUMP_FORWARD, end);
2420 compiler_use_next_block(c, except);
2421 }
2422 ADDOP(c, END_FINALLY);
2423 compiler_use_next_block(c, orelse);
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002424 VISIT_SEQ(c, stmt, s->v.Try.orelse);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002425 compiler_use_next_block(c, end);
2426 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002427}
2428
2429static int
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002430compiler_try(struct compiler *c, stmt_ty s) {
2431 if (s->v.Try.finalbody && asdl_seq_LEN(s->v.Try.finalbody))
2432 return compiler_try_finally(c, s);
2433 else
2434 return compiler_try_except(c, s);
2435}
2436
2437
2438static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002439compiler_import_as(struct compiler *c, identifier name, identifier asname)
2440{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002441 /* The IMPORT_NAME opcode was already generated. This function
2442 merely needs to bind the result to a name.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002443
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002444 If there is a dot in name, we need to split it and emit a
2445 LOAD_ATTR for each name.
2446 */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002447 Py_ssize_t dot = PyUnicode_FindChar(name, '.', 0,
2448 PyUnicode_GET_LENGTH(name), 1);
2449 if (dot == -2)
2450 return -1;
2451 if (dot != -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002452 /* Consume the base module name to get the first attribute */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002453 Py_ssize_t pos = dot + 1;
2454 while (dot != -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002455 PyObject *attr;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002456 dot = PyUnicode_FindChar(name, '.', pos,
2457 PyUnicode_GET_LENGTH(name), 1);
2458 if (dot == -2)
2459 return -1;
2460 attr = PyUnicode_Substring(name, pos,
2461 (dot != -1) ? dot :
2462 PyUnicode_GET_LENGTH(name));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002463 if (!attr)
2464 return -1;
2465 ADDOP_O(c, LOAD_ATTR, attr, names);
2466 Py_DECREF(attr);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002467 pos = dot + 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002468 }
2469 }
2470 return compiler_nameop(c, asname, Store);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002471}
2472
2473static int
2474compiler_import(struct compiler *c, stmt_ty s)
2475{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002476 /* The Import node stores a module name like a.b.c as a single
2477 string. This is convenient for all cases except
2478 import a.b.c as d
2479 where we need to parse that string to extract the individual
2480 module names.
2481 XXX Perhaps change the representation to make this case simpler?
2482 */
Victor Stinnerad9a0662013-11-19 22:23:20 +01002483 Py_ssize_t i, n = asdl_seq_LEN(s->v.Import.names);
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002484
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002485 for (i = 0; i < n; i++) {
2486 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.Import.names, i);
2487 int r;
2488 PyObject *level;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002489
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002490 level = PyLong_FromLong(0);
2491 if (level == NULL)
2492 return 0;
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002493
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002494 ADDOP_O(c, LOAD_CONST, level, consts);
2495 Py_DECREF(level);
2496 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2497 ADDOP_NAME(c, IMPORT_NAME, alias->name, names);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002498
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002499 if (alias->asname) {
2500 r = compiler_import_as(c, alias->name, alias->asname);
2501 if (!r)
2502 return r;
2503 }
2504 else {
2505 identifier tmp = alias->name;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002506 Py_ssize_t dot = PyUnicode_FindChar(
2507 alias->name, '.', 0, PyUnicode_GET_LENGTH(alias->name), 1);
Victor Stinner6b64a682013-07-11 22:50:45 +02002508 if (dot != -1) {
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002509 tmp = PyUnicode_Substring(alias->name, 0, dot);
Victor Stinner6b64a682013-07-11 22:50:45 +02002510 if (tmp == NULL)
2511 return 0;
2512 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002513 r = compiler_nameop(c, tmp, Store);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002514 if (dot != -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002515 Py_DECREF(tmp);
2516 }
2517 if (!r)
2518 return r;
2519 }
2520 }
2521 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002522}
2523
2524static int
2525compiler_from_import(struct compiler *c, stmt_ty s)
2526{
Victor Stinnerad9a0662013-11-19 22:23:20 +01002527 Py_ssize_t i, n = asdl_seq_LEN(s->v.ImportFrom.names);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002528
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002529 PyObject *names = PyTuple_New(n);
2530 PyObject *level;
2531 static PyObject *empty_string;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002532
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002533 if (!empty_string) {
2534 empty_string = PyUnicode_FromString("");
2535 if (!empty_string)
2536 return 0;
2537 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002538
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002539 if (!names)
2540 return 0;
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002541
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002542 level = PyLong_FromLong(s->v.ImportFrom.level);
2543 if (!level) {
2544 Py_DECREF(names);
2545 return 0;
2546 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002547
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002548 /* build up the names */
2549 for (i = 0; i < n; i++) {
2550 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);
2551 Py_INCREF(alias->name);
2552 PyTuple_SET_ITEM(names, i, alias->name);
2553 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002554
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002555 if (s->lineno > c->c_future->ff_lineno && s->v.ImportFrom.module &&
2556 !PyUnicode_CompareWithASCIIString(s->v.ImportFrom.module, "__future__")) {
2557 Py_DECREF(level);
2558 Py_DECREF(names);
2559 return compiler_error(c, "from __future__ imports must occur "
2560 "at the beginning of the file");
2561 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002562
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002563 ADDOP_O(c, LOAD_CONST, level, consts);
2564 Py_DECREF(level);
2565 ADDOP_O(c, LOAD_CONST, names, consts);
2566 Py_DECREF(names);
2567 if (s->v.ImportFrom.module) {
2568 ADDOP_NAME(c, IMPORT_NAME, s->v.ImportFrom.module, names);
2569 }
2570 else {
2571 ADDOP_NAME(c, IMPORT_NAME, empty_string, names);
2572 }
2573 for (i = 0; i < n; i++) {
2574 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);
2575 identifier store_name;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002576
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002577 if (i == 0 && PyUnicode_READ_CHAR(alias->name, 0) == '*') {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002578 assert(n == 1);
2579 ADDOP(c, IMPORT_STAR);
2580 return 1;
2581 }
2582
2583 ADDOP_NAME(c, IMPORT_FROM, alias->name, names);
2584 store_name = alias->name;
2585 if (alias->asname)
2586 store_name = alias->asname;
2587
2588 if (!compiler_nameop(c, store_name, Store)) {
2589 Py_DECREF(names);
2590 return 0;
2591 }
2592 }
2593 /* remove imported module */
2594 ADDOP(c, POP_TOP);
2595 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002596}
2597
2598static int
2599compiler_assert(struct compiler *c, stmt_ty s)
2600{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002601 static PyObject *assertion_error = NULL;
2602 basicblock *end;
Victor Stinner14e461d2013-08-26 22:28:21 +02002603 PyObject* msg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002604
Georg Brandl8334fd92010-12-04 10:26:46 +00002605 if (c->c_optimize)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002606 return 1;
2607 if (assertion_error == NULL) {
2608 assertion_error = PyUnicode_InternFromString("AssertionError");
2609 if (assertion_error == NULL)
2610 return 0;
2611 }
2612 if (s->v.Assert.test->kind == Tuple_kind &&
2613 asdl_seq_LEN(s->v.Assert.test->v.Tuple.elts) > 0) {
Victor Stinner14e461d2013-08-26 22:28:21 +02002614 msg = PyUnicode_FromString("assertion is always true, "
2615 "perhaps remove parentheses?");
2616 if (msg == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002617 return 0;
Victor Stinner14e461d2013-08-26 22:28:21 +02002618 if (PyErr_WarnExplicitObject(PyExc_SyntaxWarning, msg,
2619 c->c_filename, c->u->u_lineno,
2620 NULL, NULL) == -1) {
2621 Py_DECREF(msg);
2622 return 0;
2623 }
2624 Py_DECREF(msg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002625 }
2626 VISIT(c, expr, s->v.Assert.test);
2627 end = compiler_new_block(c);
2628 if (end == NULL)
2629 return 0;
2630 ADDOP_JABS(c, POP_JUMP_IF_TRUE, end);
2631 ADDOP_O(c, LOAD_GLOBAL, assertion_error, names);
2632 if (s->v.Assert.msg) {
2633 VISIT(c, expr, s->v.Assert.msg);
2634 ADDOP_I(c, CALL_FUNCTION, 1);
2635 }
2636 ADDOP_I(c, RAISE_VARARGS, 1);
2637 compiler_use_next_block(c, end);
2638 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002639}
2640
2641static int
2642compiler_visit_stmt(struct compiler *c, stmt_ty s)
2643{
Victor Stinnerad9a0662013-11-19 22:23:20 +01002644 Py_ssize_t i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002645
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002646 /* Always assign a lineno to the next instruction for a stmt. */
2647 c->u->u_lineno = s->lineno;
Benjamin Petersond4efd9e2010-09-20 23:02:10 +00002648 c->u->u_col_offset = s->col_offset;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002649 c->u->u_lineno_set = 0;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002650
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002651 switch (s->kind) {
2652 case FunctionDef_kind:
Yury Selivanov75445082015-05-11 22:57:16 -04002653 return compiler_function(c, s, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002654 case ClassDef_kind:
2655 return compiler_class(c, s);
2656 case Return_kind:
2657 if (c->u->u_ste->ste_type != FunctionBlock)
2658 return compiler_error(c, "'return' outside function");
2659 if (s->v.Return.value) {
2660 VISIT(c, expr, s->v.Return.value);
2661 }
2662 else
2663 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2664 ADDOP(c, RETURN_VALUE);
2665 break;
2666 case Delete_kind:
2667 VISIT_SEQ(c, expr, s->v.Delete.targets)
2668 break;
2669 case Assign_kind:
2670 n = asdl_seq_LEN(s->v.Assign.targets);
2671 VISIT(c, expr, s->v.Assign.value);
2672 for (i = 0; i < n; i++) {
2673 if (i < n - 1)
2674 ADDOP(c, DUP_TOP);
2675 VISIT(c, expr,
2676 (expr_ty)asdl_seq_GET(s->v.Assign.targets, i));
2677 }
2678 break;
2679 case AugAssign_kind:
2680 return compiler_augassign(c, s);
2681 case For_kind:
2682 return compiler_for(c, s);
2683 case While_kind:
2684 return compiler_while(c, s);
2685 case If_kind:
2686 return compiler_if(c, s);
2687 case Raise_kind:
2688 n = 0;
2689 if (s->v.Raise.exc) {
2690 VISIT(c, expr, s->v.Raise.exc);
2691 n++;
Victor Stinnerad9a0662013-11-19 22:23:20 +01002692 if (s->v.Raise.cause) {
2693 VISIT(c, expr, s->v.Raise.cause);
2694 n++;
2695 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002696 }
Victor Stinnerad9a0662013-11-19 22:23:20 +01002697 ADDOP_I(c, RAISE_VARARGS, (int)n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002698 break;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002699 case Try_kind:
2700 return compiler_try(c, s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002701 case Assert_kind:
2702 return compiler_assert(c, s);
2703 case Import_kind:
2704 return compiler_import(c, s);
2705 case ImportFrom_kind:
2706 return compiler_from_import(c, s);
2707 case Global_kind:
2708 case Nonlocal_kind:
2709 break;
2710 case Expr_kind:
2711 if (c->c_interactive && c->c_nestlevel <= 1) {
2712 VISIT(c, expr, s->v.Expr.value);
2713 ADDOP(c, PRINT_EXPR);
2714 }
2715 else if (s->v.Expr.value->kind != Str_kind &&
2716 s->v.Expr.value->kind != Num_kind) {
2717 VISIT(c, expr, s->v.Expr.value);
2718 ADDOP(c, POP_TOP);
2719 }
2720 break;
2721 case Pass_kind:
2722 break;
2723 case Break_kind:
2724 if (!compiler_in_loop(c))
2725 return compiler_error(c, "'break' outside loop");
2726 ADDOP(c, BREAK_LOOP);
2727 break;
2728 case Continue_kind:
2729 return compiler_continue(c);
2730 case With_kind:
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05002731 return compiler_with(c, s, 0);
Yury Selivanov75445082015-05-11 22:57:16 -04002732 case AsyncFunctionDef_kind:
2733 return compiler_function(c, s, 1);
2734 case AsyncWith_kind:
2735 return compiler_async_with(c, s, 0);
2736 case AsyncFor_kind:
2737 return compiler_async_for(c, s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002738 }
Yury Selivanov75445082015-05-11 22:57:16 -04002739
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002740 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002741}
2742
2743static int
2744unaryop(unaryop_ty op)
2745{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002746 switch (op) {
2747 case Invert:
2748 return UNARY_INVERT;
2749 case Not:
2750 return UNARY_NOT;
2751 case UAdd:
2752 return UNARY_POSITIVE;
2753 case USub:
2754 return UNARY_NEGATIVE;
2755 default:
2756 PyErr_Format(PyExc_SystemError,
2757 "unary op %d should not be possible", op);
2758 return 0;
2759 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002760}
2761
2762static int
2763binop(struct compiler *c, operator_ty op)
2764{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002765 switch (op) {
2766 case Add:
2767 return BINARY_ADD;
2768 case Sub:
2769 return BINARY_SUBTRACT;
2770 case Mult:
2771 return BINARY_MULTIPLY;
Benjamin Petersond51374e2014-04-09 23:55:56 -04002772 case MatMult:
2773 return BINARY_MATRIX_MULTIPLY;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002774 case Div:
2775 return BINARY_TRUE_DIVIDE;
2776 case Mod:
2777 return BINARY_MODULO;
2778 case Pow:
2779 return BINARY_POWER;
2780 case LShift:
2781 return BINARY_LSHIFT;
2782 case RShift:
2783 return BINARY_RSHIFT;
2784 case BitOr:
2785 return BINARY_OR;
2786 case BitXor:
2787 return BINARY_XOR;
2788 case BitAnd:
2789 return BINARY_AND;
2790 case FloorDiv:
2791 return BINARY_FLOOR_DIVIDE;
2792 default:
2793 PyErr_Format(PyExc_SystemError,
2794 "binary op %d should not be possible", op);
2795 return 0;
2796 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002797}
2798
2799static int
2800cmpop(cmpop_ty op)
2801{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002802 switch (op) {
2803 case Eq:
2804 return PyCmp_EQ;
2805 case NotEq:
2806 return PyCmp_NE;
2807 case Lt:
2808 return PyCmp_LT;
2809 case LtE:
2810 return PyCmp_LE;
2811 case Gt:
2812 return PyCmp_GT;
2813 case GtE:
2814 return PyCmp_GE;
2815 case Is:
2816 return PyCmp_IS;
2817 case IsNot:
2818 return PyCmp_IS_NOT;
2819 case In:
2820 return PyCmp_IN;
2821 case NotIn:
2822 return PyCmp_NOT_IN;
2823 default:
2824 return PyCmp_BAD;
2825 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002826}
2827
2828static int
2829inplace_binop(struct compiler *c, operator_ty op)
2830{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002831 switch (op) {
2832 case Add:
2833 return INPLACE_ADD;
2834 case Sub:
2835 return INPLACE_SUBTRACT;
2836 case Mult:
2837 return INPLACE_MULTIPLY;
Benjamin Petersond51374e2014-04-09 23:55:56 -04002838 case MatMult:
2839 return INPLACE_MATRIX_MULTIPLY;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002840 case Div:
2841 return INPLACE_TRUE_DIVIDE;
2842 case Mod:
2843 return INPLACE_MODULO;
2844 case Pow:
2845 return INPLACE_POWER;
2846 case LShift:
2847 return INPLACE_LSHIFT;
2848 case RShift:
2849 return INPLACE_RSHIFT;
2850 case BitOr:
2851 return INPLACE_OR;
2852 case BitXor:
2853 return INPLACE_XOR;
2854 case BitAnd:
2855 return INPLACE_AND;
2856 case FloorDiv:
2857 return INPLACE_FLOOR_DIVIDE;
2858 default:
2859 PyErr_Format(PyExc_SystemError,
2860 "inplace binary op %d should not be possible", op);
2861 return 0;
2862 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002863}
2864
2865static int
2866compiler_nameop(struct compiler *c, identifier name, expr_context_ty ctx)
2867{
Victor Stinnerad9a0662013-11-19 22:23:20 +01002868 int op, scope;
2869 Py_ssize_t arg;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002870 enum { OP_FAST, OP_GLOBAL, OP_DEREF, OP_NAME } optype;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002871
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002872 PyObject *dict = c->u->u_names;
2873 PyObject *mangled;
2874 /* XXX AugStore isn't used anywhere! */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002875
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002876 mangled = _Py_Mangle(c->u->u_private, name);
2877 if (!mangled)
2878 return 0;
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002879
Benjamin Peterson70b224d2012-12-06 17:49:58 -05002880 assert(PyUnicode_CompareWithASCIIString(name, "None") &&
2881 PyUnicode_CompareWithASCIIString(name, "True") &&
2882 PyUnicode_CompareWithASCIIString(name, "False"));
2883
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002884 op = 0;
2885 optype = OP_NAME;
2886 scope = PyST_GetScope(c->u->u_ste, mangled);
2887 switch (scope) {
2888 case FREE:
2889 dict = c->u->u_freevars;
2890 optype = OP_DEREF;
2891 break;
2892 case CELL:
2893 dict = c->u->u_cellvars;
2894 optype = OP_DEREF;
2895 break;
2896 case LOCAL:
2897 if (c->u->u_ste->ste_type == FunctionBlock)
2898 optype = OP_FAST;
2899 break;
2900 case GLOBAL_IMPLICIT:
Benjamin Peterson1dfd2472015-04-27 21:44:22 -04002901 if (c->u->u_ste->ste_type == FunctionBlock)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002902 optype = OP_GLOBAL;
2903 break;
2904 case GLOBAL_EXPLICIT:
2905 optype = OP_GLOBAL;
2906 break;
2907 default:
2908 /* scope can be 0 */
2909 break;
2910 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002911
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002912 /* XXX Leave assert here, but handle __doc__ and the like better */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002913 assert(scope || PyUnicode_READ_CHAR(name, 0) == '_');
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002914
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002915 switch (optype) {
2916 case OP_DEREF:
2917 switch (ctx) {
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04002918 case Load:
2919 op = (c->u->u_ste->ste_type == ClassBlock) ? LOAD_CLASSDEREF : LOAD_DEREF;
2920 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002921 case Store: op = STORE_DEREF; break;
2922 case AugLoad:
2923 case AugStore:
2924 break;
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00002925 case Del: op = DELETE_DEREF; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002926 case Param:
2927 default:
2928 PyErr_SetString(PyExc_SystemError,
2929 "param invalid for deref variable");
2930 return 0;
2931 }
2932 break;
2933 case OP_FAST:
2934 switch (ctx) {
2935 case Load: op = LOAD_FAST; break;
2936 case Store: op = STORE_FAST; break;
2937 case Del: op = DELETE_FAST; break;
2938 case AugLoad:
2939 case AugStore:
2940 break;
2941 case Param:
2942 default:
2943 PyErr_SetString(PyExc_SystemError,
2944 "param invalid for local variable");
2945 return 0;
2946 }
2947 ADDOP_O(c, op, mangled, varnames);
2948 Py_DECREF(mangled);
2949 return 1;
2950 case OP_GLOBAL:
2951 switch (ctx) {
2952 case Load: op = LOAD_GLOBAL; break;
2953 case Store: op = STORE_GLOBAL; break;
2954 case Del: op = DELETE_GLOBAL; break;
2955 case AugLoad:
2956 case AugStore:
2957 break;
2958 case Param:
2959 default:
2960 PyErr_SetString(PyExc_SystemError,
2961 "param invalid for global variable");
2962 return 0;
2963 }
2964 break;
2965 case OP_NAME:
2966 switch (ctx) {
Benjamin Peterson20f9c3c2010-07-20 22:39:34 +00002967 case Load: op = LOAD_NAME; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002968 case Store: op = STORE_NAME; break;
2969 case Del: op = DELETE_NAME; break;
2970 case AugLoad:
2971 case AugStore:
2972 break;
2973 case Param:
2974 default:
2975 PyErr_SetString(PyExc_SystemError,
2976 "param invalid for name variable");
2977 return 0;
2978 }
2979 break;
2980 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002981
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002982 assert(op);
2983 arg = compiler_add_o(c, dict, mangled);
2984 Py_DECREF(mangled);
2985 if (arg < 0)
2986 return 0;
2987 return compiler_addop_i(c, op, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002988}
2989
2990static int
2991compiler_boolop(struct compiler *c, expr_ty e)
2992{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002993 basicblock *end;
Victor Stinnerad9a0662013-11-19 22:23:20 +01002994 int jumpi;
2995 Py_ssize_t i, n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002996 asdl_seq *s;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002997
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002998 assert(e->kind == BoolOp_kind);
2999 if (e->v.BoolOp.op == And)
3000 jumpi = JUMP_IF_FALSE_OR_POP;
3001 else
3002 jumpi = JUMP_IF_TRUE_OR_POP;
3003 end = compiler_new_block(c);
3004 if (end == NULL)
3005 return 0;
3006 s = e->v.BoolOp.values;
3007 n = asdl_seq_LEN(s) - 1;
3008 assert(n >= 0);
3009 for (i = 0; i < n; ++i) {
3010 VISIT(c, expr, (expr_ty)asdl_seq_GET(s, i));
3011 ADDOP_JABS(c, jumpi, end);
3012 }
3013 VISIT(c, expr, (expr_ty)asdl_seq_GET(s, n));
3014 compiler_use_next_block(c, end);
3015 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003016}
3017
3018static int
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003019starunpack_helper(struct compiler *c, asdl_seq *elts,
3020 int single_op, int inner_op, int outer_op)
3021{
3022 Py_ssize_t n = asdl_seq_LEN(elts);
3023 Py_ssize_t i, nsubitems = 0, nseen = 0;
3024 for (i = 0; i < n; i++) {
3025 expr_ty elt = asdl_seq_GET(elts, i);
3026 if (elt->kind == Starred_kind) {
3027 if (nseen) {
3028 ADDOP_I(c, inner_op, nseen);
3029 nseen = 0;
3030 nsubitems++;
3031 }
3032 VISIT(c, expr, elt->v.Starred.value);
3033 nsubitems++;
3034 }
3035 else {
3036 VISIT(c, expr, elt);
3037 nseen++;
3038 }
3039 }
3040 if (nsubitems) {
3041 if (nseen) {
3042 ADDOP_I(c, inner_op, nseen);
3043 nsubitems++;
3044 }
3045 ADDOP_I(c, outer_op, nsubitems);
3046 }
3047 else
3048 ADDOP_I(c, single_op, nseen);
3049 return 1;
3050}
3051
3052static int
3053assignment_helper(struct compiler *c, asdl_seq *elts)
3054{
3055 Py_ssize_t n = asdl_seq_LEN(elts);
3056 Py_ssize_t i;
3057 int seen_star = 0;
3058 for (i = 0; i < n; i++) {
3059 expr_ty elt = asdl_seq_GET(elts, i);
3060 if (elt->kind == Starred_kind && !seen_star) {
3061 if ((i >= (1 << 8)) ||
3062 (n-i-1 >= (INT_MAX >> 8)))
3063 return compiler_error(c,
3064 "too many expressions in "
3065 "star-unpacking assignment");
3066 ADDOP_I(c, UNPACK_EX, (i + ((n-i-1) << 8)));
3067 seen_star = 1;
3068 asdl_seq_SET(elts, i, elt->v.Starred.value);
3069 }
3070 else if (elt->kind == Starred_kind) {
3071 return compiler_error(c,
3072 "two starred expressions in assignment");
3073 }
3074 }
3075 if (!seen_star) {
3076 ADDOP_I(c, UNPACK_SEQUENCE, n);
3077 }
3078 VISIT_SEQ(c, expr, elts);
3079 return 1;
3080}
3081
3082static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003083compiler_list(struct compiler *c, expr_ty e)
3084{
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003085 asdl_seq *elts = e->v.List.elts;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003086 if (e->v.List.ctx == Store) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003087 return assignment_helper(c, elts);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003088 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003089 else if (e->v.List.ctx == Load) {
3090 return starunpack_helper(c, elts,
3091 BUILD_LIST, BUILD_TUPLE, BUILD_LIST_UNPACK);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003092 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003093 else
3094 VISIT_SEQ(c, expr, elts);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003095 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003096}
3097
3098static int
3099compiler_tuple(struct compiler *c, expr_ty e)
3100{
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003101 asdl_seq *elts = e->v.Tuple.elts;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003102 if (e->v.Tuple.ctx == Store) {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003103 return assignment_helper(c, elts);
3104 }
3105 else if (e->v.Tuple.ctx == Load) {
3106 return starunpack_helper(c, elts,
3107 BUILD_TUPLE, BUILD_TUPLE, BUILD_TUPLE_UNPACK);
3108 }
3109 else
3110 VISIT_SEQ(c, expr, elts);
3111 return 1;
3112}
3113
3114static int
3115compiler_set(struct compiler *c, expr_ty e)
3116{
3117 return starunpack_helper(c, e->v.Set.elts, BUILD_SET,
3118 BUILD_SET, BUILD_SET_UNPACK);
3119}
3120
3121static int
3122compiler_dict(struct compiler *c, expr_ty e)
3123{
3124 Py_ssize_t i, n, containers, elements;
3125 int is_unpacking = 0;
3126 n = asdl_seq_LEN(e->v.Dict.values);
3127 containers = 0;
3128 elements = 0;
3129 for (i = 0; i < n; i++) {
3130 is_unpacking = (expr_ty)asdl_seq_GET(e->v.Dict.keys, i) == NULL;
3131 if (elements == 0xFFFF || (elements && is_unpacking)) {
3132 ADDOP_I(c, BUILD_MAP, elements);
3133 containers++;
3134 elements = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003135 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003136 if (is_unpacking) {
3137 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Dict.values, i));
3138 containers++;
3139 }
3140 else {
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003141 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Dict.keys, i));
Benjamin Petersonee853392015-05-28 14:30:26 -05003142 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Dict.values, i));
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003143 elements++;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003144 }
3145 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003146 if (elements || containers == 0) {
3147 ADDOP_I(c, BUILD_MAP, elements);
3148 containers++;
3149 }
3150 /* If there is more than one dict, they need to be merged into a new
3151 * dict. If there is one dict and it's an unpacking, then it needs
3152 * to be copied into a new dict." */
3153 while (containers > 1 || is_unpacking) {
3154 int oparg = containers < 255 ? containers : 255;
3155 ADDOP_I(c, BUILD_MAP_UNPACK, oparg);
3156 containers -= (oparg - 1);
3157 is_unpacking = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003158 }
3159 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003160}
3161
3162static int
3163compiler_compare(struct compiler *c, expr_ty e)
3164{
Victor Stinnerad9a0662013-11-19 22:23:20 +01003165 Py_ssize_t i, n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003166 basicblock *cleanup = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003167
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003168 /* XXX the logic can be cleaned up for 1 or multiple comparisons */
3169 VISIT(c, expr, e->v.Compare.left);
3170 n = asdl_seq_LEN(e->v.Compare.ops);
3171 assert(n > 0);
3172 if (n > 1) {
3173 cleanup = compiler_new_block(c);
3174 if (cleanup == NULL)
3175 return 0;
3176 VISIT(c, expr,
3177 (expr_ty)asdl_seq_GET(e->v.Compare.comparators, 0));
3178 }
3179 for (i = 1; i < n; i++) {
3180 ADDOP(c, DUP_TOP);
3181 ADDOP(c, ROT_THREE);
3182 ADDOP_I(c, COMPARE_OP,
3183 cmpop((cmpop_ty)(asdl_seq_GET(
3184 e->v.Compare.ops, i - 1))));
3185 ADDOP_JABS(c, JUMP_IF_FALSE_OR_POP, cleanup);
3186 NEXT_BLOCK(c);
3187 if (i < (n - 1))
3188 VISIT(c, expr,
3189 (expr_ty)asdl_seq_GET(e->v.Compare.comparators, i));
3190 }
3191 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, n - 1));
3192 ADDOP_I(c, COMPARE_OP,
3193 cmpop((cmpop_ty)(asdl_seq_GET(e->v.Compare.ops, n - 1))));
3194 if (n > 1) {
3195 basicblock *end = compiler_new_block(c);
3196 if (end == NULL)
3197 return 0;
3198 ADDOP_JREL(c, JUMP_FORWARD, end);
3199 compiler_use_next_block(c, cleanup);
3200 ADDOP(c, ROT_TWO);
3201 ADDOP(c, POP_TOP);
3202 compiler_use_next_block(c, end);
3203 }
3204 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003205}
3206
3207static int
3208compiler_call(struct compiler *c, expr_ty e)
3209{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003210 VISIT(c, expr, e->v.Call.func);
3211 return compiler_call_helper(c, 0,
3212 e->v.Call.args,
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003213 e->v.Call.keywords);
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003214}
3215
Eric V. Smith235a6f02015-09-19 14:51:32 -04003216static int
3217compiler_joined_str(struct compiler *c, expr_ty e)
3218{
3219 /* Concatenate parts of a string using ''.join(parts). There are
3220 probably better ways of doing this.
3221
3222 This is used for constructs like "'x=' f'{42}'", which have to
3223 be evaluated at compile time. */
3224
3225 static PyObject *empty_string;
3226 static PyObject *join_string;
3227
3228 if (!empty_string) {
3229 empty_string = PyUnicode_FromString("");
3230 if (!empty_string)
3231 return 0;
3232 }
3233 if (!join_string) {
3234 join_string = PyUnicode_FromString("join");
3235 if (!join_string)
3236 return 0;
3237 }
3238
3239 ADDOP_O(c, LOAD_CONST, empty_string, consts);
3240 ADDOP_NAME(c, LOAD_ATTR, join_string, names);
3241 VISIT_SEQ(c, expr, e->v.JoinedStr.values);
3242 ADDOP_I(c, BUILD_LIST, asdl_seq_LEN(e->v.JoinedStr.values));
3243 ADDOP_I(c, CALL_FUNCTION, 1);
3244 return 1;
3245}
3246
Eric V. Smitha78c7952015-11-03 12:45:05 -05003247/* Used to implement f-strings. Format a single value. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04003248static int
3249compiler_formatted_value(struct compiler *c, expr_ty e)
3250{
Eric V. Smitha78c7952015-11-03 12:45:05 -05003251 /* Our oparg encodes 2 pieces of information: the conversion
3252 character, and whether or not a format_spec was provided.
Eric V. Smith235a6f02015-09-19 14:51:32 -04003253
Eric V. Smitha78c7952015-11-03 12:45:05 -05003254 Convert the conversion char to 2 bits:
3255 None: 000 0x0 FVC_NONE
3256 !s : 001 0x1 FVC_STR
3257 !r : 010 0x2 FVC_REPR
3258 !a : 011 0x3 FVC_ASCII
Eric V. Smith235a6f02015-09-19 14:51:32 -04003259
Eric V. Smitha78c7952015-11-03 12:45:05 -05003260 next bit is whether or not we have a format spec:
3261 yes : 100 0x4
3262 no : 000 0x0
3263 */
Eric V. Smith235a6f02015-09-19 14:51:32 -04003264
Eric V. Smitha78c7952015-11-03 12:45:05 -05003265 int oparg;
Eric V. Smith235a6f02015-09-19 14:51:32 -04003266
Eric V. Smitha78c7952015-11-03 12:45:05 -05003267 /* Evaluate the expression to be formatted. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04003268 VISIT(c, expr, e->v.FormattedValue.value);
3269
Eric V. Smitha78c7952015-11-03 12:45:05 -05003270 switch (e->v.FormattedValue.conversion) {
3271 case 's': oparg = FVC_STR; break;
3272 case 'r': oparg = FVC_REPR; break;
3273 case 'a': oparg = FVC_ASCII; break;
3274 case -1: oparg = FVC_NONE; break;
3275 default:
3276 PyErr_SetString(PyExc_SystemError,
3277 "Unrecognized conversion character");
3278 return 0;
Eric V. Smith235a6f02015-09-19 14:51:32 -04003279 }
Eric V. Smith235a6f02015-09-19 14:51:32 -04003280 if (e->v.FormattedValue.format_spec) {
Eric V. Smitha78c7952015-11-03 12:45:05 -05003281 /* Evaluate the format spec, and update our opcode arg. */
Eric V. Smith235a6f02015-09-19 14:51:32 -04003282 VISIT(c, expr, e->v.FormattedValue.format_spec);
Eric V. Smitha78c7952015-11-03 12:45:05 -05003283 oparg |= FVS_HAVE_SPEC;
Eric V. Smith235a6f02015-09-19 14:51:32 -04003284 }
3285
Eric V. Smitha78c7952015-11-03 12:45:05 -05003286 /* And push our opcode and oparg */
3287 ADDOP_I(c, FORMAT_VALUE, oparg);
Eric V. Smith235a6f02015-09-19 14:51:32 -04003288 return 1;
3289}
3290
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003291/* shared code between compiler_call and compiler_class */
3292static int
3293compiler_call_helper(struct compiler *c,
Victor Stinnerad9a0662013-11-19 22:23:20 +01003294 Py_ssize_t n, /* Args already pushed */
3295 asdl_seq *args,
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003296 asdl_seq *keywords)
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003297{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003298 int code = 0;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003299 Py_ssize_t nelts, i, nseen, nkw;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003300
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003301 /* the number of tuples and dictionaries on the stack */
3302 Py_ssize_t nsubargs = 0, nsubkwargs = 0;
3303
3304 nkw = 0;
3305 nseen = 0; /* the number of positional arguments on the stack */
3306 nelts = asdl_seq_LEN(args);
3307 for (i = 0; i < nelts; i++) {
3308 expr_ty elt = asdl_seq_GET(args, i);
3309 if (elt->kind == Starred_kind) {
3310 /* A star-arg. If we've seen positional arguments,
3311 pack the positional arguments into a
3312 tuple. */
3313 if (nseen) {
3314 ADDOP_I(c, BUILD_TUPLE, nseen);
3315 nseen = 0;
3316 nsubargs++;
3317 }
3318 VISIT(c, expr, elt->v.Starred.value);
3319 nsubargs++;
3320 }
3321 else if (nsubargs) {
3322 /* We've seen star-args already, so we
3323 count towards items-to-pack-into-tuple. */
3324 VISIT(c, expr, elt);
3325 nseen++;
3326 }
3327 else {
3328 /* Positional arguments before star-arguments
3329 are left on the stack. */
3330 VISIT(c, expr, elt);
3331 n++;
3332 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003333 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003334 if (nseen) {
3335 /* Pack up any trailing positional arguments. */
3336 ADDOP_I(c, BUILD_TUPLE, nseen);
3337 nsubargs++;
3338 }
3339 if (nsubargs) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003340 code |= 1;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003341 if (nsubargs > 1) {
3342 /* If we ended up with more than one stararg, we need
3343 to concatenate them into a single sequence. */
3344 ADDOP_I(c, BUILD_LIST_UNPACK, nsubargs);
3345 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003346 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003347
3348 /* Same dance again for keyword arguments */
3349 nseen = 0; /* the number of keyword arguments on the stack following */
3350 nelts = asdl_seq_LEN(keywords);
3351 for (i = 0; i < nelts; i++) {
3352 keyword_ty kw = asdl_seq_GET(keywords, i);
3353 if (kw->arg == NULL) {
3354 /* A keyword argument unpacking. */
3355 if (nseen) {
3356 ADDOP_I(c, BUILD_MAP, nseen);
3357 nseen = 0;
3358 nsubkwargs++;
3359 }
3360 VISIT(c, expr, kw->value);
3361 nsubkwargs++;
3362 }
3363 else if (nsubkwargs) {
3364 /* A keyword argument and we already have a dict. */
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003365 ADDOP_O(c, LOAD_CONST, kw->arg, consts);
Benjamin Petersonee853392015-05-28 14:30:26 -05003366 VISIT(c, expr, kw->value);
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003367 nseen++;
3368 }
3369 else {
3370 /* keyword argument */
3371 VISIT(c, keyword, kw)
3372 nkw++;
3373 }
3374 }
3375 if (nseen) {
3376 /* Pack up any trailing keyword arguments. */
3377 ADDOP_I(c, BUILD_MAP, nseen);
3378 nsubkwargs++;
3379 }
3380 if (nsubkwargs) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003381 code |= 2;
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003382 if (nsubkwargs > 1) {
3383 /* Pack it all up */
3384 int function_pos = n + (code & 1) + nkw + 1;
3385 ADDOP_I(c, BUILD_MAP_UNPACK_WITH_CALL, nsubkwargs | (function_pos << 8));
3386 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003387 }
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003388 assert(n < 1<<8);
3389 assert(nkw < 1<<24);
3390 n |= nkw << 8;
3391
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003392 switch (code) {
3393 case 0:
3394 ADDOP_I(c, CALL_FUNCTION, n);
3395 break;
3396 case 1:
3397 ADDOP_I(c, CALL_FUNCTION_VAR, n);
3398 break;
3399 case 2:
3400 ADDOP_I(c, CALL_FUNCTION_KW, n);
3401 break;
3402 case 3:
3403 ADDOP_I(c, CALL_FUNCTION_VAR_KW, n);
3404 break;
3405 }
3406 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003407}
3408
Nick Coghlan650f0d02007-04-15 12:05:43 +00003409
3410/* List and set comprehensions and generator expressions work by creating a
3411 nested function to perform the actual iteration. This means that the
3412 iteration variables don't leak into the current scope.
3413 The defined function is called immediately following its definition, with the
3414 result of that call being the result of the expression.
3415 The LC/SC version returns the populated container, while the GE version is
3416 flagged in symtable.c as a generator, so it returns the generator object
3417 when the function is called.
3418 This code *knows* that the loop cannot contain break, continue, or return,
3419 so it cheats and skips the SETUP_LOOP/POP_BLOCK steps used in normal loops.
3420
3421 Possible cleanups:
3422 - iterate over the generator sequence instead of using recursion
3423*/
3424
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003425static int
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003426compiler_comprehension_generator(struct compiler *c,
3427 asdl_seq *generators, int gen_index,
3428 expr_ty elt, expr_ty val, int type)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003429{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003430 /* generate code for the iterator, then each of the ifs,
3431 and then write to the element */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003432
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003433 comprehension_ty gen;
3434 basicblock *start, *anchor, *skip, *if_cleanup;
Victor Stinnerad9a0662013-11-19 22:23:20 +01003435 Py_ssize_t i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003436
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003437 start = compiler_new_block(c);
3438 skip = compiler_new_block(c);
3439 if_cleanup = compiler_new_block(c);
3440 anchor = compiler_new_block(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003441
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003442 if (start == NULL || skip == NULL || if_cleanup == NULL ||
3443 anchor == NULL)
3444 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003445
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003446 gen = (comprehension_ty)asdl_seq_GET(generators, gen_index);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003447
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003448 if (gen_index == 0) {
3449 /* Receive outermost iter as an implicit argument */
3450 c->u->u_argcount = 1;
3451 ADDOP_I(c, LOAD_FAST, 0);
3452 }
3453 else {
3454 /* Sub-iter - calculate on the fly */
3455 VISIT(c, expr, gen->iter);
3456 ADDOP(c, GET_ITER);
3457 }
3458 compiler_use_next_block(c, start);
3459 ADDOP_JREL(c, FOR_ITER, anchor);
3460 NEXT_BLOCK(c);
3461 VISIT(c, expr, gen->target);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003462
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003463 /* XXX this needs to be cleaned up...a lot! */
3464 n = asdl_seq_LEN(gen->ifs);
3465 for (i = 0; i < n; i++) {
3466 expr_ty e = (expr_ty)asdl_seq_GET(gen->ifs, i);
3467 VISIT(c, expr, e);
3468 ADDOP_JABS(c, POP_JUMP_IF_FALSE, if_cleanup);
3469 NEXT_BLOCK(c);
3470 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003471
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003472 if (++gen_index < asdl_seq_LEN(generators))
3473 if (!compiler_comprehension_generator(c,
3474 generators, gen_index,
3475 elt, val, type))
3476 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003477
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003478 /* only append after the last for generator */
3479 if (gen_index >= asdl_seq_LEN(generators)) {
3480 /* comprehension specific code */
3481 switch (type) {
3482 case COMP_GENEXP:
3483 VISIT(c, expr, elt);
3484 ADDOP(c, YIELD_VALUE);
3485 ADDOP(c, POP_TOP);
3486 break;
3487 case COMP_LISTCOMP:
3488 VISIT(c, expr, elt);
3489 ADDOP_I(c, LIST_APPEND, gen_index + 1);
3490 break;
3491 case COMP_SETCOMP:
3492 VISIT(c, expr, elt);
3493 ADDOP_I(c, SET_ADD, gen_index + 1);
3494 break;
3495 case COMP_DICTCOMP:
3496 /* With 'd[k] = v', v is evaluated before k, so we do
3497 the same. */
3498 VISIT(c, expr, val);
3499 VISIT(c, expr, elt);
3500 ADDOP_I(c, MAP_ADD, gen_index + 1);
3501 break;
3502 default:
3503 return 0;
3504 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003505
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003506 compiler_use_next_block(c, skip);
3507 }
3508 compiler_use_next_block(c, if_cleanup);
3509 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
3510 compiler_use_next_block(c, anchor);
3511
3512 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003513}
3514
3515static int
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003516compiler_comprehension(struct compiler *c, expr_ty e, int type,
3517 identifier name, asdl_seq *generators, expr_ty elt,
3518 expr_ty val)
Nick Coghlan650f0d02007-04-15 12:05:43 +00003519{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003520 PyCodeObject *co = NULL;
3521 expr_ty outermost_iter;
Antoine Pitrou86a36b52011-11-25 18:56:07 +01003522 PyObject *qualname = NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00003523
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003524 outermost_iter = ((comprehension_ty)
3525 asdl_seq_GET(generators, 0))->iter;
Nick Coghlan650f0d02007-04-15 12:05:43 +00003526
Antoine Pitrou86a36b52011-11-25 18:56:07 +01003527 if (!compiler_enter_scope(c, name, COMPILER_SCOPE_COMPREHENSION,
3528 (void *)e, e->lineno))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003529 goto error;
Nick Coghlan650f0d02007-04-15 12:05:43 +00003530
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003531 if (type != COMP_GENEXP) {
3532 int op;
3533 switch (type) {
3534 case COMP_LISTCOMP:
3535 op = BUILD_LIST;
3536 break;
3537 case COMP_SETCOMP:
3538 op = BUILD_SET;
3539 break;
3540 case COMP_DICTCOMP:
3541 op = BUILD_MAP;
3542 break;
3543 default:
3544 PyErr_Format(PyExc_SystemError,
3545 "unknown comprehension type %d", type);
3546 goto error_in_scope;
3547 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00003548
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003549 ADDOP_I(c, op, 0);
3550 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00003551
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003552 if (!compiler_comprehension_generator(c, generators, 0, elt,
3553 val, type))
3554 goto error_in_scope;
Nick Coghlan650f0d02007-04-15 12:05:43 +00003555
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003556 if (type != COMP_GENEXP) {
3557 ADDOP(c, RETURN_VALUE);
3558 }
3559
3560 co = assemble(c, 1);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04003561 qualname = c->u->u_qualname;
3562 Py_INCREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003563 compiler_exit_scope(c);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04003564 if (co == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003565 goto error;
3566
Antoine Pitrou86a36b52011-11-25 18:56:07 +01003567 if (!compiler_make_closure(c, co, 0, qualname))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003568 goto error;
Antoine Pitrou86a36b52011-11-25 18:56:07 +01003569 Py_DECREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003570 Py_DECREF(co);
3571
3572 VISIT(c, expr, outermost_iter);
3573 ADDOP(c, GET_ITER);
3574 ADDOP_I(c, CALL_FUNCTION, 1);
3575 return 1;
Nick Coghlan650f0d02007-04-15 12:05:43 +00003576error_in_scope:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003577 compiler_exit_scope(c);
Nick Coghlan650f0d02007-04-15 12:05:43 +00003578error:
Antoine Pitrou86a36b52011-11-25 18:56:07 +01003579 Py_XDECREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003580 Py_XDECREF(co);
3581 return 0;
Nick Coghlan650f0d02007-04-15 12:05:43 +00003582}
3583
3584static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003585compiler_genexp(struct compiler *c, expr_ty e)
3586{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003587 static identifier name;
3588 if (!name) {
3589 name = PyUnicode_FromString("<genexpr>");
3590 if (!name)
3591 return 0;
3592 }
3593 assert(e->kind == GeneratorExp_kind);
3594 return compiler_comprehension(c, e, COMP_GENEXP, name,
3595 e->v.GeneratorExp.generators,
3596 e->v.GeneratorExp.elt, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003597}
3598
3599static int
Nick Coghlan650f0d02007-04-15 12:05:43 +00003600compiler_listcomp(struct compiler *c, expr_ty e)
3601{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003602 static identifier name;
3603 if (!name) {
3604 name = PyUnicode_FromString("<listcomp>");
3605 if (!name)
3606 return 0;
3607 }
3608 assert(e->kind == ListComp_kind);
3609 return compiler_comprehension(c, e, COMP_LISTCOMP, name,
3610 e->v.ListComp.generators,
3611 e->v.ListComp.elt, NULL);
Nick Coghlan650f0d02007-04-15 12:05:43 +00003612}
3613
3614static int
3615compiler_setcomp(struct compiler *c, expr_ty e)
3616{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003617 static identifier name;
3618 if (!name) {
3619 name = PyUnicode_FromString("<setcomp>");
3620 if (!name)
3621 return 0;
3622 }
3623 assert(e->kind == SetComp_kind);
3624 return compiler_comprehension(c, e, COMP_SETCOMP, name,
3625 e->v.SetComp.generators,
3626 e->v.SetComp.elt, NULL);
Guido van Rossum992d4a32007-07-11 13:09:30 +00003627}
3628
3629
3630static int
3631compiler_dictcomp(struct compiler *c, expr_ty e)
3632{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003633 static identifier name;
3634 if (!name) {
3635 name = PyUnicode_FromString("<dictcomp>");
3636 if (!name)
3637 return 0;
3638 }
3639 assert(e->kind == DictComp_kind);
3640 return compiler_comprehension(c, e, COMP_DICTCOMP, name,
3641 e->v.DictComp.generators,
3642 e->v.DictComp.key, e->v.DictComp.value);
Nick Coghlan650f0d02007-04-15 12:05:43 +00003643}
3644
3645
3646static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003647compiler_visit_keyword(struct compiler *c, keyword_ty k)
3648{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003649 ADDOP_O(c, LOAD_CONST, k->arg, consts);
3650 VISIT(c, expr, k->value);
3651 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003652}
3653
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003654/* Test whether expression is constant. For constants, report
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003655 whether they are true or false.
3656
3657 Return values: 1 for true, 0 for false, -1 for non-constant.
3658 */
3659
3660static int
Georg Brandl8334fd92010-12-04 10:26:46 +00003661expr_constant(struct compiler *c, expr_ty e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003662{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003663 char *id;
3664 switch (e->kind) {
3665 case Ellipsis_kind:
3666 return 1;
3667 case Num_kind:
3668 return PyObject_IsTrue(e->v.Num.n);
3669 case Str_kind:
3670 return PyObject_IsTrue(e->v.Str.s);
3671 case Name_kind:
3672 /* optimize away names that can't be reassigned */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003673 id = PyUnicode_AsUTF8(e->v.Name.id);
Benjamin Peterson442f2092012-12-06 17:41:04 -05003674 if (id && strcmp(id, "__debug__") == 0)
3675 return !c->c_optimize;
3676 return -1;
3677 case NameConstant_kind: {
3678 PyObject *o = e->v.NameConstant.value;
3679 if (o == Py_None)
3680 return 0;
3681 else if (o == Py_True)
3682 return 1;
3683 else if (o == Py_False)
3684 return 0;
3685 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003686 default:
3687 return -1;
3688 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003689}
3690
Yury Selivanov75445082015-05-11 22:57:16 -04003691
3692/*
3693 Implements the async with statement.
3694
3695 The semantics outlined in that PEP are as follows:
3696
3697 async with EXPR as VAR:
3698 BLOCK
3699
3700 It is implemented roughly as:
3701
3702 context = EXPR
3703 exit = context.__aexit__ # not calling it
3704 value = await context.__aenter__()
3705 try:
3706 VAR = value # if VAR present in the syntax
3707 BLOCK
3708 finally:
3709 if an exception was raised:
Serhiy Storchakaec466a12015-06-11 00:09:32 +03003710 exc = copy of (exception, instance, traceback)
Yury Selivanov75445082015-05-11 22:57:16 -04003711 else:
Serhiy Storchakaec466a12015-06-11 00:09:32 +03003712 exc = (None, None, None)
Yury Selivanov75445082015-05-11 22:57:16 -04003713 if not (await exit(*exc)):
3714 raise
3715 */
3716static int
3717compiler_async_with(struct compiler *c, stmt_ty s, int pos)
3718{
3719 basicblock *block, *finally;
3720 withitem_ty item = asdl_seq_GET(s->v.AsyncWith.items, pos);
3721
3722 assert(s->kind == AsyncWith_kind);
3723
3724 block = compiler_new_block(c);
3725 finally = compiler_new_block(c);
3726 if (!block || !finally)
3727 return 0;
3728
3729 /* Evaluate EXPR */
3730 VISIT(c, expr, item->context_expr);
3731
3732 ADDOP(c, BEFORE_ASYNC_WITH);
3733 ADDOP(c, GET_AWAITABLE);
3734 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3735 ADDOP(c, YIELD_FROM);
3736
3737 ADDOP_JREL(c, SETUP_ASYNC_WITH, finally);
3738
3739 /* SETUP_ASYNC_WITH pushes a finally block. */
3740 compiler_use_next_block(c, block);
3741 if (!compiler_push_fblock(c, FINALLY_TRY, block)) {
3742 return 0;
3743 }
3744
3745 if (item->optional_vars) {
3746 VISIT(c, expr, item->optional_vars);
3747 }
3748 else {
3749 /* Discard result from context.__aenter__() */
3750 ADDOP(c, POP_TOP);
3751 }
3752
3753 pos++;
3754 if (pos == asdl_seq_LEN(s->v.AsyncWith.items))
3755 /* BLOCK code */
3756 VISIT_SEQ(c, stmt, s->v.AsyncWith.body)
3757 else if (!compiler_async_with(c, s, pos))
3758 return 0;
3759
3760 /* End of try block; start the finally block */
3761 ADDOP(c, POP_BLOCK);
3762 compiler_pop_fblock(c, FINALLY_TRY, block);
3763
3764 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3765 compiler_use_next_block(c, finally);
3766 if (!compiler_push_fblock(c, FINALLY_END, finally))
3767 return 0;
3768
3769 /* Finally block starts; context.__exit__ is on the stack under
3770 the exception or return information. Just issue our magic
3771 opcode. */
3772 ADDOP(c, WITH_CLEANUP_START);
3773
3774 ADDOP(c, GET_AWAITABLE);
3775 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3776 ADDOP(c, YIELD_FROM);
3777
3778 ADDOP(c, WITH_CLEANUP_FINISH);
3779
3780 /* Finally block ends. */
3781 ADDOP(c, END_FINALLY);
3782 compiler_pop_fblock(c, FINALLY_END, finally);
3783 return 1;
3784}
3785
3786
Guido van Rossumc2e20742006-02-27 22:32:47 +00003787/*
3788 Implements the with statement from PEP 343.
3789
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003790 The semantics outlined in that PEP are as follows:
Guido van Rossumc2e20742006-02-27 22:32:47 +00003791
3792 with EXPR as VAR:
3793 BLOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003794
Guido van Rossumc2e20742006-02-27 22:32:47 +00003795 It is implemented roughly as:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003796
Thomas Wouters477c8d52006-05-27 19:21:47 +00003797 context = EXPR
Guido van Rossumc2e20742006-02-27 22:32:47 +00003798 exit = context.__exit__ # not calling it
3799 value = context.__enter__()
3800 try:
3801 VAR = value # if VAR present in the syntax
3802 BLOCK
3803 finally:
3804 if an exception was raised:
Serhiy Storchakad741a882015-06-11 00:06:39 +03003805 exc = copy of (exception, instance, traceback)
Guido van Rossumc2e20742006-02-27 22:32:47 +00003806 else:
Serhiy Storchakad741a882015-06-11 00:06:39 +03003807 exc = (None, None, None)
Guido van Rossumc2e20742006-02-27 22:32:47 +00003808 exit(*exc)
3809 */
3810static int
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003811compiler_with(struct compiler *c, stmt_ty s, int pos)
Guido van Rossumc2e20742006-02-27 22:32:47 +00003812{
Guido van Rossumc2e20742006-02-27 22:32:47 +00003813 basicblock *block, *finally;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003814 withitem_ty item = asdl_seq_GET(s->v.With.items, pos);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003815
3816 assert(s->kind == With_kind);
3817
Guido van Rossumc2e20742006-02-27 22:32:47 +00003818 block = compiler_new_block(c);
3819 finally = compiler_new_block(c);
3820 if (!block || !finally)
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00003821 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003822
Thomas Wouters477c8d52006-05-27 19:21:47 +00003823 /* Evaluate EXPR */
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003824 VISIT(c, expr, item->context_expr);
Benjamin Peterson876b2f22009-06-28 03:18:59 +00003825 ADDOP_JREL(c, SETUP_WITH, finally);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003826
Benjamin Peterson876b2f22009-06-28 03:18:59 +00003827 /* SETUP_WITH pushes a finally block. */
Guido van Rossumc2e20742006-02-27 22:32:47 +00003828 compiler_use_next_block(c, block);
3829 if (!compiler_push_fblock(c, FINALLY_TRY, block)) {
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00003830 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003831 }
3832
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003833 if (item->optional_vars) {
3834 VISIT(c, expr, item->optional_vars);
Benjamin Peterson876b2f22009-06-28 03:18:59 +00003835 }
3836 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003837 /* Discard result from context.__enter__() */
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00003838 ADDOP(c, POP_TOP);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003839 }
3840
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003841 pos++;
3842 if (pos == asdl_seq_LEN(s->v.With.items))
3843 /* BLOCK code */
3844 VISIT_SEQ(c, stmt, s->v.With.body)
3845 else if (!compiler_with(c, s, pos))
3846 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003847
3848 /* End of try block; start the finally block */
3849 ADDOP(c, POP_BLOCK);
3850 compiler_pop_fblock(c, FINALLY_TRY, block);
3851
3852 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3853 compiler_use_next_block(c, finally);
3854 if (!compiler_push_fblock(c, FINALLY_END, finally))
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00003855 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003856
Christian Heimesdd15f6c2008-03-16 00:07:10 +00003857 /* Finally block starts; context.__exit__ is on the stack under
3858 the exception or return information. Just issue our magic
3859 opcode. */
Yury Selivanov75445082015-05-11 22:57:16 -04003860 ADDOP(c, WITH_CLEANUP_START);
3861 ADDOP(c, WITH_CLEANUP_FINISH);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003862
3863 /* Finally block ends. */
3864 ADDOP(c, END_FINALLY);
3865 compiler_pop_fblock(c, FINALLY_END, finally);
3866 return 1;
3867}
3868
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003869static int
3870compiler_visit_expr(struct compiler *c, expr_ty e)
3871{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003872 /* If expr e has a different line number than the last expr/stmt,
3873 set a new line number for the next instruction.
3874 */
3875 if (e->lineno > c->u->u_lineno) {
3876 c->u->u_lineno = e->lineno;
3877 c->u->u_lineno_set = 0;
3878 }
Benjamin Petersond4efd9e2010-09-20 23:02:10 +00003879 /* Updating the column offset is always harmless. */
3880 c->u->u_col_offset = e->col_offset;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003881 switch (e->kind) {
3882 case BoolOp_kind:
3883 return compiler_boolop(c, e);
3884 case BinOp_kind:
3885 VISIT(c, expr, e->v.BinOp.left);
3886 VISIT(c, expr, e->v.BinOp.right);
3887 ADDOP(c, binop(c, e->v.BinOp.op));
3888 break;
3889 case UnaryOp_kind:
3890 VISIT(c, expr, e->v.UnaryOp.operand);
3891 ADDOP(c, unaryop(e->v.UnaryOp.op));
3892 break;
3893 case Lambda_kind:
3894 return compiler_lambda(c, e);
3895 case IfExp_kind:
3896 return compiler_ifexp(c, e);
3897 case Dict_kind:
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003898 return compiler_dict(c, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003899 case Set_kind:
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04003900 return compiler_set(c, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003901 case GeneratorExp_kind:
3902 return compiler_genexp(c, e);
3903 case ListComp_kind:
3904 return compiler_listcomp(c, e);
3905 case SetComp_kind:
3906 return compiler_setcomp(c, e);
3907 case DictComp_kind:
3908 return compiler_dictcomp(c, e);
3909 case Yield_kind:
3910 if (c->u->u_ste->ste_type != FunctionBlock)
3911 return compiler_error(c, "'yield' outside function");
Yury Selivanov75445082015-05-11 22:57:16 -04003912 if (c->u->u_scope_type == COMPILER_SCOPE_ASYNC_FUNCTION)
3913 return compiler_error(c, "'yield' inside async function");
Mark Dickinsonded35ae2012-11-25 14:36:26 +00003914 if (e->v.Yield.value) {
3915 VISIT(c, expr, e->v.Yield.value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003916 }
3917 else {
3918 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3919 }
Mark Dickinsonded35ae2012-11-25 14:36:26 +00003920 ADDOP(c, YIELD_VALUE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003921 break;
Mark Dickinsonded35ae2012-11-25 14:36:26 +00003922 case YieldFrom_kind:
3923 if (c->u->u_ste->ste_type != FunctionBlock)
3924 return compiler_error(c, "'yield' outside function");
Yury Selivanov75445082015-05-11 22:57:16 -04003925
3926 if (c->u->u_scope_type == COMPILER_SCOPE_ASYNC_FUNCTION)
3927 return compiler_error(c, "'yield from' inside async function");
3928
Mark Dickinsonded35ae2012-11-25 14:36:26 +00003929 VISIT(c, expr, e->v.YieldFrom.value);
Yury Selivanov5376ba92015-06-22 12:19:30 -04003930 ADDOP(c, GET_YIELD_FROM_ITER);
Mark Dickinsonded35ae2012-11-25 14:36:26 +00003931 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3932 ADDOP(c, YIELD_FROM);
3933 break;
Yury Selivanov75445082015-05-11 22:57:16 -04003934 case Await_kind:
3935 if (c->u->u_ste->ste_type != FunctionBlock)
3936 return compiler_error(c, "'await' outside function");
3937
Yury Selivanov9dec0352015-06-30 12:49:04 -04003938 if (c->u->u_scope_type == COMPILER_SCOPE_COMPREHENSION)
3939 return compiler_error(
3940 c, "'await' expressions in comprehensions are not supported");
3941
Yury Selivanov75445082015-05-11 22:57:16 -04003942 if (c->u->u_scope_type != COMPILER_SCOPE_ASYNC_FUNCTION)
3943 return compiler_error(c, "'await' outside async function");
3944
3945 VISIT(c, expr, e->v.Await.value);
3946 ADDOP(c, GET_AWAITABLE);
3947 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3948 ADDOP(c, YIELD_FROM);
3949 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003950 case Compare_kind:
3951 return compiler_compare(c, e);
3952 case Call_kind:
3953 return compiler_call(c, e);
3954 case Num_kind:
3955 ADDOP_O(c, LOAD_CONST, e->v.Num.n, consts);
3956 break;
3957 case Str_kind:
3958 ADDOP_O(c, LOAD_CONST, e->v.Str.s, consts);
3959 break;
Eric V. Smith235a6f02015-09-19 14:51:32 -04003960 case JoinedStr_kind:
3961 return compiler_joined_str(c, e);
3962 case FormattedValue_kind:
3963 return compiler_formatted_value(c, e);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003964 case Bytes_kind:
3965 ADDOP_O(c, LOAD_CONST, e->v.Bytes.s, consts);
3966 break;
3967 case Ellipsis_kind:
3968 ADDOP_O(c, LOAD_CONST, Py_Ellipsis, consts);
3969 break;
Benjamin Peterson442f2092012-12-06 17:41:04 -05003970 case NameConstant_kind:
3971 ADDOP_O(c, LOAD_CONST, e->v.NameConstant.value, consts);
3972 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003973 /* The following exprs can be assignment targets. */
3974 case Attribute_kind:
3975 if (e->v.Attribute.ctx != AugStore)
3976 VISIT(c, expr, e->v.Attribute.value);
3977 switch (e->v.Attribute.ctx) {
3978 case AugLoad:
3979 ADDOP(c, DUP_TOP);
3980 /* Fall through to load */
3981 case Load:
3982 ADDOP_NAME(c, LOAD_ATTR, e->v.Attribute.attr, names);
3983 break;
3984 case AugStore:
3985 ADDOP(c, ROT_TWO);
3986 /* Fall through to save */
3987 case Store:
3988 ADDOP_NAME(c, STORE_ATTR, e->v.Attribute.attr, names);
3989 break;
3990 case Del:
3991 ADDOP_NAME(c, DELETE_ATTR, e->v.Attribute.attr, names);
3992 break;
3993 case Param:
3994 default:
3995 PyErr_SetString(PyExc_SystemError,
3996 "param invalid in attribute expression");
3997 return 0;
3998 }
3999 break;
4000 case Subscript_kind:
4001 switch (e->v.Subscript.ctx) {
4002 case AugLoad:
4003 VISIT(c, expr, e->v.Subscript.value);
4004 VISIT_SLICE(c, e->v.Subscript.slice, AugLoad);
4005 break;
4006 case Load:
4007 VISIT(c, expr, e->v.Subscript.value);
4008 VISIT_SLICE(c, e->v.Subscript.slice, Load);
4009 break;
4010 case AugStore:
4011 VISIT_SLICE(c, e->v.Subscript.slice, AugStore);
4012 break;
4013 case Store:
4014 VISIT(c, expr, e->v.Subscript.value);
4015 VISIT_SLICE(c, e->v.Subscript.slice, Store);
4016 break;
4017 case Del:
4018 VISIT(c, expr, e->v.Subscript.value);
4019 VISIT_SLICE(c, e->v.Subscript.slice, Del);
4020 break;
4021 case Param:
4022 default:
4023 PyErr_SetString(PyExc_SystemError,
4024 "param invalid in subscript expression");
4025 return 0;
4026 }
4027 break;
4028 case Starred_kind:
4029 switch (e->v.Starred.ctx) {
4030 case Store:
4031 /* In all legitimate cases, the Starred node was already replaced
4032 * by compiler_list/compiler_tuple. XXX: is that okay? */
4033 return compiler_error(c,
4034 "starred assignment target must be in a list or tuple");
4035 default:
4036 return compiler_error(c,
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04004037 "can't use starred expression here");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004038 }
4039 break;
4040 case Name_kind:
4041 return compiler_nameop(c, e->v.Name.id, e->v.Name.ctx);
4042 /* child nodes of List and Tuple will have expr_context set */
4043 case List_kind:
4044 return compiler_list(c, e);
4045 case Tuple_kind:
4046 return compiler_tuple(c, e);
4047 }
4048 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004049}
4050
4051static int
4052compiler_augassign(struct compiler *c, stmt_ty s)
4053{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004054 expr_ty e = s->v.AugAssign.target;
4055 expr_ty auge;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004056
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004057 assert(s->kind == AugAssign_kind);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004058
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004059 switch (e->kind) {
4060 case Attribute_kind:
4061 auge = Attribute(e->v.Attribute.value, e->v.Attribute.attr,
4062 AugLoad, e->lineno, e->col_offset, c->c_arena);
4063 if (auge == NULL)
4064 return 0;
4065 VISIT(c, expr, auge);
4066 VISIT(c, expr, s->v.AugAssign.value);
4067 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
4068 auge->v.Attribute.ctx = AugStore;
4069 VISIT(c, expr, auge);
4070 break;
4071 case Subscript_kind:
4072 auge = Subscript(e->v.Subscript.value, e->v.Subscript.slice,
4073 AugLoad, e->lineno, e->col_offset, c->c_arena);
4074 if (auge == NULL)
4075 return 0;
4076 VISIT(c, expr, auge);
4077 VISIT(c, expr, s->v.AugAssign.value);
4078 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
4079 auge->v.Subscript.ctx = AugStore;
4080 VISIT(c, expr, auge);
4081 break;
4082 case Name_kind:
4083 if (!compiler_nameop(c, e->v.Name.id, Load))
4084 return 0;
4085 VISIT(c, expr, s->v.AugAssign.value);
4086 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
4087 return compiler_nameop(c, e->v.Name.id, Store);
4088 default:
4089 PyErr_Format(PyExc_SystemError,
4090 "invalid node type (%d) for augmented assignment",
4091 e->kind);
4092 return 0;
4093 }
4094 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004095}
4096
4097static int
4098compiler_push_fblock(struct compiler *c, enum fblocktype t, basicblock *b)
4099{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004100 struct fblockinfo *f;
4101 if (c->u->u_nfblocks >= CO_MAXBLOCKS) {
4102 PyErr_SetString(PyExc_SystemError,
4103 "too many statically nested blocks");
4104 return 0;
4105 }
4106 f = &c->u->u_fblock[c->u->u_nfblocks++];
4107 f->fb_type = t;
4108 f->fb_block = b;
4109 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004110}
4111
4112static void
4113compiler_pop_fblock(struct compiler *c, enum fblocktype t, basicblock *b)
4114{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004115 struct compiler_unit *u = c->u;
4116 assert(u->u_nfblocks > 0);
4117 u->u_nfblocks--;
4118 assert(u->u_fblock[u->u_nfblocks].fb_type == t);
4119 assert(u->u_fblock[u->u_nfblocks].fb_block == b);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004120}
4121
Thomas Wouters89f507f2006-12-13 04:49:30 +00004122static int
4123compiler_in_loop(struct compiler *c) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004124 int i;
4125 struct compiler_unit *u = c->u;
4126 for (i = 0; i < u->u_nfblocks; ++i) {
4127 if (u->u_fblock[i].fb_type == LOOP)
4128 return 1;
4129 }
4130 return 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00004131}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004132/* Raises a SyntaxError and returns 0.
4133 If something goes wrong, a different exception may be raised.
4134*/
4135
4136static int
4137compiler_error(struct compiler *c, const char *errstr)
4138{
Benjamin Peterson43b06862011-05-27 09:08:01 -05004139 PyObject *loc;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004140 PyObject *u = NULL, *v = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004141
Victor Stinner14e461d2013-08-26 22:28:21 +02004142 loc = PyErr_ProgramTextObject(c->c_filename, c->u->u_lineno);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004143 if (!loc) {
4144 Py_INCREF(Py_None);
4145 loc = Py_None;
4146 }
Victor Stinner14e461d2013-08-26 22:28:21 +02004147 u = Py_BuildValue("(OiiO)", c->c_filename, c->u->u_lineno,
Benjamin Petersond4efd9e2010-09-20 23:02:10 +00004148 c->u->u_col_offset, loc);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004149 if (!u)
4150 goto exit;
4151 v = Py_BuildValue("(zO)", errstr, u);
4152 if (!v)
4153 goto exit;
4154 PyErr_SetObject(PyExc_SyntaxError, v);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004155 exit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004156 Py_DECREF(loc);
4157 Py_XDECREF(u);
4158 Py_XDECREF(v);
4159 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004160}
4161
4162static int
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004163compiler_handle_subscr(struct compiler *c, const char *kind,
4164 expr_context_ty ctx)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004165{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004166 int op = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004167
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004168 /* XXX this code is duplicated */
4169 switch (ctx) {
4170 case AugLoad: /* fall through to Load */
4171 case Load: op = BINARY_SUBSCR; break;
4172 case AugStore:/* fall through to Store */
4173 case Store: op = STORE_SUBSCR; break;
4174 case Del: op = DELETE_SUBSCR; break;
4175 case Param:
4176 PyErr_Format(PyExc_SystemError,
4177 "invalid %s kind %d in subscript\n",
4178 kind, ctx);
4179 return 0;
4180 }
4181 if (ctx == AugLoad) {
Antoine Pitrou74a69fa2010-09-04 18:43:52 +00004182 ADDOP(c, DUP_TOP_TWO);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004183 }
4184 else if (ctx == AugStore) {
4185 ADDOP(c, ROT_THREE);
4186 }
4187 ADDOP(c, op);
4188 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004189}
4190
4191static int
4192compiler_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)
4193{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004194 int n = 2;
4195 assert(s->kind == Slice_kind);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004196
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004197 /* only handles the cases where BUILD_SLICE is emitted */
4198 if (s->v.Slice.lower) {
4199 VISIT(c, expr, s->v.Slice.lower);
4200 }
4201 else {
4202 ADDOP_O(c, LOAD_CONST, Py_None, consts);
4203 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004204
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004205 if (s->v.Slice.upper) {
4206 VISIT(c, expr, s->v.Slice.upper);
4207 }
4208 else {
4209 ADDOP_O(c, LOAD_CONST, Py_None, consts);
4210 }
4211
4212 if (s->v.Slice.step) {
4213 n++;
4214 VISIT(c, expr, s->v.Slice.step);
4215 }
4216 ADDOP_I(c, BUILD_SLICE, n);
4217 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004218}
4219
4220static int
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004221compiler_visit_nested_slice(struct compiler *c, slice_ty s,
4222 expr_context_ty ctx)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004223{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004224 switch (s->kind) {
4225 case Slice_kind:
4226 return compiler_slice(c, s, ctx);
4227 case Index_kind:
4228 VISIT(c, expr, s->v.Index.value);
4229 break;
4230 case ExtSlice_kind:
4231 default:
4232 PyErr_SetString(PyExc_SystemError,
4233 "extended slice invalid in nested slice");
4234 return 0;
4235 }
4236 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004237}
4238
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004239static int
4240compiler_visit_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)
4241{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004242 char * kindname = NULL;
4243 switch (s->kind) {
4244 case Index_kind:
4245 kindname = "index";
4246 if (ctx != AugStore) {
4247 VISIT(c, expr, s->v.Index.value);
4248 }
4249 break;
4250 case Slice_kind:
4251 kindname = "slice";
4252 if (ctx != AugStore) {
4253 if (!compiler_slice(c, s, ctx))
4254 return 0;
4255 }
4256 break;
4257 case ExtSlice_kind:
4258 kindname = "extended slice";
4259 if (ctx != AugStore) {
Victor Stinnerad9a0662013-11-19 22:23:20 +01004260 Py_ssize_t i, n = asdl_seq_LEN(s->v.ExtSlice.dims);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004261 for (i = 0; i < n; i++) {
4262 slice_ty sub = (slice_ty)asdl_seq_GET(
4263 s->v.ExtSlice.dims, i);
4264 if (!compiler_visit_nested_slice(c, sub, ctx))
4265 return 0;
4266 }
4267 ADDOP_I(c, BUILD_TUPLE, n);
4268 }
4269 break;
4270 default:
4271 PyErr_Format(PyExc_SystemError,
4272 "invalid subscript kind %d", s->kind);
4273 return 0;
4274 }
4275 return compiler_handle_subscr(c, kindname, ctx);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004276}
4277
Thomas Wouters89f507f2006-12-13 04:49:30 +00004278/* End of the compiler section, beginning of the assembler section */
4279
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004280/* do depth-first search of basic block graph, starting with block.
4281 post records the block indices in post-order.
4282
4283 XXX must handle implicit jumps from one block to next
4284*/
4285
Thomas Wouters89f507f2006-12-13 04:49:30 +00004286struct assembler {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004287 PyObject *a_bytecode; /* string containing bytecode */
4288 int a_offset; /* offset into bytecode */
4289 int a_nblocks; /* number of reachable blocks */
4290 basicblock **a_postorder; /* list of blocks in dfs postorder */
4291 PyObject *a_lnotab; /* string containing lnotab */
4292 int a_lnotab_off; /* offset into lnotab */
4293 int a_lineno; /* last lineno of emitted instruction */
4294 int a_lineno_off; /* bytecode offset of last lineno */
Thomas Wouters89f507f2006-12-13 04:49:30 +00004295};
4296
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004297static void
4298dfs(struct compiler *c, basicblock *b, struct assembler *a)
4299{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004300 int i;
4301 struct instr *instr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004302
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004303 if (b->b_seen)
4304 return;
4305 b->b_seen = 1;
4306 if (b->b_next != NULL)
4307 dfs(c, b->b_next, a);
4308 for (i = 0; i < b->b_iused; i++) {
4309 instr = &b->b_instr[i];
4310 if (instr->i_jrel || instr->i_jabs)
4311 dfs(c, instr->i_target, a);
4312 }
4313 a->a_postorder[a->a_nblocks++] = b;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004314}
4315
Neal Norwitz2744c6c2005-11-13 01:08:38 +00004316static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004317stackdepth_walk(struct compiler *c, basicblock *b, int depth, int maxdepth)
4318{
Larry Hastings3a907972013-11-23 14:49:22 -08004319 int i, target_depth, effect;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004320 struct instr *instr;
4321 if (b->b_seen || b->b_startdepth >= depth)
4322 return maxdepth;
4323 b->b_seen = 1;
4324 b->b_startdepth = depth;
4325 for (i = 0; i < b->b_iused; i++) {
4326 instr = &b->b_instr[i];
Larry Hastings3a907972013-11-23 14:49:22 -08004327 effect = PyCompile_OpcodeStackEffect(instr->i_opcode, instr->i_oparg);
4328 if (effect == PY_INVALID_STACK_EFFECT) {
4329 fprintf(stderr, "opcode = %d\n", instr->i_opcode);
4330 Py_FatalError("PyCompile_OpcodeStackEffect()");
4331 }
4332 depth += effect;
4333
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004334 if (depth > maxdepth)
4335 maxdepth = depth;
4336 assert(depth >= 0); /* invalid code or bug in stackdepth() */
4337 if (instr->i_jrel || instr->i_jabs) {
4338 target_depth = depth;
4339 if (instr->i_opcode == FOR_ITER) {
4340 target_depth = depth-2;
Antoine Pitrou99614052014-05-23 11:46:03 +02004341 }
4342 else if (instr->i_opcode == SETUP_FINALLY ||
4343 instr->i_opcode == SETUP_EXCEPT) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004344 target_depth = depth+3;
4345 if (target_depth > maxdepth)
4346 maxdepth = target_depth;
4347 }
Antoine Pitrou99614052014-05-23 11:46:03 +02004348 else if (instr->i_opcode == JUMP_IF_TRUE_OR_POP ||
4349 instr->i_opcode == JUMP_IF_FALSE_OR_POP)
4350 depth = depth - 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004351 maxdepth = stackdepth_walk(c, instr->i_target,
4352 target_depth, maxdepth);
4353 if (instr->i_opcode == JUMP_ABSOLUTE ||
4354 instr->i_opcode == JUMP_FORWARD) {
4355 goto out; /* remaining code is dead */
4356 }
4357 }
4358 }
4359 if (b->b_next)
4360 maxdepth = stackdepth_walk(c, b->b_next, depth, maxdepth);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004361out:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004362 b->b_seen = 0;
4363 return maxdepth;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004364}
4365
4366/* Find the flow path that needs the largest stack. We assume that
4367 * cycles in the flow graph have no net effect on the stack depth.
4368 */
4369static int
4370stackdepth(struct compiler *c)
4371{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004372 basicblock *b, *entryblock;
4373 entryblock = NULL;
4374 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
4375 b->b_seen = 0;
4376 b->b_startdepth = INT_MIN;
4377 entryblock = b;
4378 }
4379 if (!entryblock)
4380 return 0;
4381 return stackdepth_walk(c, entryblock, 0, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004382}
4383
4384static int
4385assemble_init(struct assembler *a, int nblocks, int firstlineno)
4386{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004387 memset(a, 0, sizeof(struct assembler));
4388 a->a_lineno = firstlineno;
4389 a->a_bytecode = PyBytes_FromStringAndSize(NULL, DEFAULT_CODE_SIZE);
4390 if (!a->a_bytecode)
4391 return 0;
4392 a->a_lnotab = PyBytes_FromStringAndSize(NULL, DEFAULT_LNOTAB_SIZE);
4393 if (!a->a_lnotab)
4394 return 0;
Christian Heimes724b8282013-12-04 08:42:46 +01004395 if ((size_t)nblocks > PY_SIZE_MAX / sizeof(basicblock *)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004396 PyErr_NoMemory();
4397 return 0;
4398 }
4399 a->a_postorder = (basicblock **)PyObject_Malloc(
4400 sizeof(basicblock *) * nblocks);
4401 if (!a->a_postorder) {
4402 PyErr_NoMemory();
4403 return 0;
4404 }
4405 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004406}
4407
4408static void
4409assemble_free(struct assembler *a)
4410{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004411 Py_XDECREF(a->a_bytecode);
4412 Py_XDECREF(a->a_lnotab);
4413 if (a->a_postorder)
4414 PyObject_Free(a->a_postorder);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004415}
4416
4417/* Return the size of a basic block in bytes. */
4418
4419static int
4420instrsize(struct instr *instr)
4421{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004422 if (!instr->i_hasarg)
4423 return 1; /* 1 byte for the opcode*/
4424 if (instr->i_oparg > 0xffff)
4425 return 6; /* 1 (opcode) + 1 (EXTENDED_ARG opcode) + 2 (oparg) + 2(oparg extended) */
4426 return 3; /* 1 (opcode) + 2 (oparg) */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004427}
4428
4429static int
4430blocksize(basicblock *b)
4431{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004432 int i;
4433 int size = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004434
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004435 for (i = 0; i < b->b_iused; i++)
4436 size += instrsize(&b->b_instr[i]);
4437 return size;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004438}
4439
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00004440/* Appends a pair to the end of the line number table, a_lnotab, representing
4441 the instruction's bytecode offset and line number. See
4442 Objects/lnotab_notes.txt for the description of the line number table. */
Tim Peters2a7f3842001-06-09 09:26:21 +00004443
Guido van Rossumf68d8e52001-04-14 17:55:09 +00004444static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004445assemble_lnotab(struct assembler *a, struct instr *i)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004446{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004447 int d_bytecode, d_lineno;
Victor Stinnerad9a0662013-11-19 22:23:20 +01004448 Py_ssize_t len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004449 unsigned char *lnotab;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004450
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004451 d_bytecode = a->a_offset - a->a_lineno_off;
4452 d_lineno = i->i_lineno - a->a_lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004453
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004454 assert(d_bytecode >= 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004455
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004456 if(d_bytecode == 0 && d_lineno == 0)
4457 return 1;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004458
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004459 if (d_bytecode > 255) {
4460 int j, nbytes, ncodes = d_bytecode / 255;
4461 nbytes = a->a_lnotab_off + 2 * ncodes;
4462 len = PyBytes_GET_SIZE(a->a_lnotab);
4463 if (nbytes >= len) {
4464 if ((len <= INT_MAX / 2) && (len * 2 < nbytes))
4465 len = nbytes;
4466 else if (len <= INT_MAX / 2)
4467 len *= 2;
4468 else {
4469 PyErr_NoMemory();
4470 return 0;
4471 }
4472 if (_PyBytes_Resize(&a->a_lnotab, len) < 0)
4473 return 0;
4474 }
4475 lnotab = (unsigned char *)
4476 PyBytes_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
4477 for (j = 0; j < ncodes; j++) {
4478 *lnotab++ = 255;
4479 *lnotab++ = 0;
4480 }
4481 d_bytecode -= ncodes * 255;
4482 a->a_lnotab_off += ncodes * 2;
4483 }
Victor Stinnerf3914eb2016-01-20 12:16:21 +01004484 assert(0 <= d_bytecode && d_bytecode <= 255);
4485
4486 if (d_lineno < -128 || 127 < d_lineno) {
4487 int j, nbytes, ncodes, k;
4488 if (d_lineno < 0) {
4489 k = -128;
4490 /* use division on positive numbers */
4491 ncodes = (-d_lineno) / 128;
4492 }
4493 else {
4494 k = 127;
4495 ncodes = d_lineno / 127;
4496 }
4497 d_lineno -= ncodes * k;
4498 assert(ncodes >= 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004499 nbytes = a->a_lnotab_off + 2 * ncodes;
4500 len = PyBytes_GET_SIZE(a->a_lnotab);
4501 if (nbytes >= len) {
4502 if ((len <= INT_MAX / 2) && len * 2 < nbytes)
4503 len = nbytes;
4504 else if (len <= INT_MAX / 2)
4505 len *= 2;
4506 else {
4507 PyErr_NoMemory();
4508 return 0;
4509 }
4510 if (_PyBytes_Resize(&a->a_lnotab, len) < 0)
4511 return 0;
4512 }
4513 lnotab = (unsigned char *)
4514 PyBytes_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
4515 *lnotab++ = d_bytecode;
Victor Stinnerf3914eb2016-01-20 12:16:21 +01004516 *lnotab++ = k;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004517 d_bytecode = 0;
4518 for (j = 1; j < ncodes; j++) {
4519 *lnotab++ = 0;
Victor Stinnerf3914eb2016-01-20 12:16:21 +01004520 *lnotab++ = k;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004521 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004522 a->a_lnotab_off += ncodes * 2;
4523 }
Victor Stinnerf3914eb2016-01-20 12:16:21 +01004524 assert(-128 <= d_lineno && d_lineno <= 127);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004525
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004526 len = PyBytes_GET_SIZE(a->a_lnotab);
4527 if (a->a_lnotab_off + 2 >= len) {
4528 if (_PyBytes_Resize(&a->a_lnotab, len * 2) < 0)
4529 return 0;
4530 }
4531 lnotab = (unsigned char *)
4532 PyBytes_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
Tim Peters51e26512001-09-07 08:45:55 +00004533
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004534 a->a_lnotab_off += 2;
4535 if (d_bytecode) {
4536 *lnotab++ = d_bytecode;
Victor Stinner4f2dab52011-05-27 16:46:51 +02004537 *lnotab++ = d_lineno;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004538 }
4539 else { /* First line of a block; def stmt, etc. */
4540 *lnotab++ = 0;
Victor Stinner4f2dab52011-05-27 16:46:51 +02004541 *lnotab++ = d_lineno;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004542 }
4543 a->a_lineno = i->i_lineno;
4544 a->a_lineno_off = a->a_offset;
4545 return 1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004546}
4547
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004548/* assemble_emit()
4549 Extend the bytecode with a new instruction.
4550 Update lnotab if necessary.
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004551*/
4552
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004553static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004554assemble_emit(struct assembler *a, struct instr *i)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004555{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004556 int size, arg = 0, ext = 0;
4557 Py_ssize_t len = PyBytes_GET_SIZE(a->a_bytecode);
4558 char *code;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004559
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004560 size = instrsize(i);
4561 if (i->i_hasarg) {
4562 arg = i->i_oparg;
4563 ext = arg >> 16;
4564 }
4565 if (i->i_lineno && !assemble_lnotab(a, i))
4566 return 0;
4567 if (a->a_offset + size >= len) {
4568 if (len > PY_SSIZE_T_MAX / 2)
4569 return 0;
4570 if (_PyBytes_Resize(&a->a_bytecode, len * 2) < 0)
4571 return 0;
4572 }
4573 code = PyBytes_AS_STRING(a->a_bytecode) + a->a_offset;
4574 a->a_offset += size;
4575 if (size == 6) {
4576 assert(i->i_hasarg);
4577 *code++ = (char)EXTENDED_ARG;
4578 *code++ = ext & 0xff;
4579 *code++ = ext >> 8;
4580 arg &= 0xffff;
4581 }
4582 *code++ = i->i_opcode;
4583 if (i->i_hasarg) {
4584 assert(size == 3 || size == 6);
4585 *code++ = arg & 0xff;
Victor Stinner4f2dab52011-05-27 16:46:51 +02004586 *code++ = arg >> 8;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004587 }
4588 return 1;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004589}
4590
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004591static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004592assemble_jump_offsets(struct assembler *a, struct compiler *c)
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004593{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004594 basicblock *b;
4595 int bsize, totsize, extended_arg_count = 0, last_extended_arg_count;
4596 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004597
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004598 /* Compute the size of each block and fixup jump args.
4599 Replace block pointer with position in bytecode. */
4600 do {
4601 totsize = 0;
4602 for (i = a->a_nblocks - 1; i >= 0; i--) {
4603 b = a->a_postorder[i];
4604 bsize = blocksize(b);
4605 b->b_offset = totsize;
4606 totsize += bsize;
4607 }
4608 last_extended_arg_count = extended_arg_count;
4609 extended_arg_count = 0;
4610 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
4611 bsize = b->b_offset;
4612 for (i = 0; i < b->b_iused; i++) {
4613 struct instr *instr = &b->b_instr[i];
4614 /* Relative jumps are computed relative to
4615 the instruction pointer after fetching
4616 the jump instruction.
4617 */
4618 bsize += instrsize(instr);
4619 if (instr->i_jabs)
4620 instr->i_oparg = instr->i_target->b_offset;
4621 else if (instr->i_jrel) {
4622 int delta = instr->i_target->b_offset - bsize;
4623 instr->i_oparg = delta;
4624 }
4625 else
4626 continue;
4627 if (instr->i_oparg > 0xffff)
4628 extended_arg_count++;
4629 }
4630 }
Neal Norwitzf1d50682005-10-23 23:00:41 +00004631
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004632 /* XXX: This is an awful hack that could hurt performance, but
4633 on the bright side it should work until we come up
4634 with a better solution.
Neal Norwitzf1d50682005-10-23 23:00:41 +00004635
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004636 The issue is that in the first loop blocksize() is called
4637 which calls instrsize() which requires i_oparg be set
4638 appropriately. There is a bootstrap problem because
4639 i_oparg is calculated in the second loop above.
Neal Norwitzf1d50682005-10-23 23:00:41 +00004640
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004641 So we loop until we stop seeing new EXTENDED_ARGs.
4642 The only EXTENDED_ARGs that could be popping up are
4643 ones in jump instructions. So this should converge
4644 fairly quickly.
4645 */
4646 } while (last_extended_arg_count != extended_arg_count);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004647}
4648
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004649static PyObject *
Victor Stinnerad9a0662013-11-19 22:23:20 +01004650dict_keys_inorder(PyObject *dict, Py_ssize_t offset)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004651{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004652 PyObject *tuple, *k, *v;
4653 Py_ssize_t i, pos = 0, size = PyDict_Size(dict);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004654
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004655 tuple = PyTuple_New(size);
4656 if (tuple == NULL)
4657 return NULL;
4658 while (PyDict_Next(dict, &pos, &k, &v)) {
4659 i = PyLong_AS_LONG(v);
4660 /* The keys of the dictionary are tuples. (see compiler_add_o)
4661 The object we want is always first, though. */
4662 k = PyTuple_GET_ITEM(k, 0);
4663 Py_INCREF(k);
4664 assert((i - offset) < size);
4665 assert((i - offset) >= 0);
4666 PyTuple_SET_ITEM(tuple, i - offset, k);
4667 }
4668 return tuple;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004669}
4670
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004671static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004672compute_code_flags(struct compiler *c)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004673{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004674 PySTEntryObject *ste = c->u->u_ste;
Victor Stinnerad9a0662013-11-19 22:23:20 +01004675 int flags = 0;
4676 Py_ssize_t n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004677 if (ste->ste_type == FunctionBlock) {
Benjamin Peterson1dfd2472015-04-27 21:44:22 -04004678 flags |= CO_NEWLOCALS | CO_OPTIMIZED;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004679 if (ste->ste_nested)
4680 flags |= CO_NESTED;
4681 if (ste->ste_generator)
4682 flags |= CO_GENERATOR;
4683 if (ste->ste_varargs)
4684 flags |= CO_VARARGS;
4685 if (ste->ste_varkeywords)
4686 flags |= CO_VARKEYWORDS;
4687 }
Thomas Wouters5e9f1fa2006-02-28 20:02:27 +00004688
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004689 /* (Only) inherit compilerflags in PyCF_MASK */
4690 flags |= (c->c_flags->cf_flags & PyCF_MASK);
Thomas Wouters5e9f1fa2006-02-28 20:02:27 +00004691
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004692 n = PyDict_Size(c->u->u_freevars);
4693 if (n < 0)
4694 return -1;
4695 if (n == 0) {
4696 n = PyDict_Size(c->u->u_cellvars);
4697 if (n < 0)
Victor Stinnerad9a0662013-11-19 22:23:20 +01004698 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004699 if (n == 0) {
Victor Stinnerad9a0662013-11-19 22:23:20 +01004700 flags |= CO_NOFREE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004701 }
4702 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004703
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004704 return flags;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004705}
4706
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004707static PyCodeObject *
4708makecode(struct compiler *c, struct assembler *a)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004709{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004710 PyObject *tmp;
4711 PyCodeObject *co = NULL;
4712 PyObject *consts = NULL;
4713 PyObject *names = NULL;
4714 PyObject *varnames = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004715 PyObject *name = NULL;
4716 PyObject *freevars = NULL;
4717 PyObject *cellvars = NULL;
4718 PyObject *bytecode = NULL;
Victor Stinnerad9a0662013-11-19 22:23:20 +01004719 Py_ssize_t nlocals;
4720 int nlocals_int;
4721 int flags;
Victor Stinnerf8e32212013-11-19 23:56:34 +01004722 int argcount, kwonlyargcount;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004723
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004724 tmp = dict_keys_inorder(c->u->u_consts, 0);
4725 if (!tmp)
4726 goto error;
4727 consts = PySequence_List(tmp); /* optimize_code requires a list */
4728 Py_DECREF(tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004729
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004730 names = dict_keys_inorder(c->u->u_names, 0);
4731 varnames = dict_keys_inorder(c->u->u_varnames, 0);
4732 if (!consts || !names || !varnames)
4733 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004734
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004735 cellvars = dict_keys_inorder(c->u->u_cellvars, 0);
4736 if (!cellvars)
4737 goto error;
4738 freevars = dict_keys_inorder(c->u->u_freevars, PyTuple_Size(cellvars));
4739 if (!freevars)
4740 goto error;
Victor Stinnerad9a0662013-11-19 22:23:20 +01004741
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004742 nlocals = PyDict_Size(c->u->u_varnames);
Victor Stinnerad9a0662013-11-19 22:23:20 +01004743 assert(nlocals < INT_MAX);
4744 nlocals_int = Py_SAFE_DOWNCAST(nlocals, Py_ssize_t, int);
4745
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004746 flags = compute_code_flags(c);
4747 if (flags < 0)
4748 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004749
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004750 bytecode = PyCode_Optimize(a->a_bytecode, consts, names, a->a_lnotab);
4751 if (!bytecode)
4752 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004753
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004754 tmp = PyList_AsTuple(consts); /* PyCode_New requires a tuple */
4755 if (!tmp)
4756 goto error;
4757 Py_DECREF(consts);
4758 consts = tmp;
4759
Victor Stinnerf8e32212013-11-19 23:56:34 +01004760 argcount = Py_SAFE_DOWNCAST(c->u->u_argcount, Py_ssize_t, int);
4761 kwonlyargcount = Py_SAFE_DOWNCAST(c->u->u_kwonlyargcount, Py_ssize_t, int);
4762 co = PyCode_New(argcount, kwonlyargcount,
Victor Stinnerad9a0662013-11-19 22:23:20 +01004763 nlocals_int, stackdepth(c), flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004764 bytecode, consts, names, varnames,
4765 freevars, cellvars,
Victor Stinner14e461d2013-08-26 22:28:21 +02004766 c->c_filename, c->u->u_name,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004767 c->u->u_firstlineno,
4768 a->a_lnotab);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004769 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004770 Py_XDECREF(consts);
4771 Py_XDECREF(names);
4772 Py_XDECREF(varnames);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004773 Py_XDECREF(name);
4774 Py_XDECREF(freevars);
4775 Py_XDECREF(cellvars);
4776 Py_XDECREF(bytecode);
4777 return co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004778}
4779
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004780
4781/* For debugging purposes only */
4782#if 0
4783static void
4784dump_instr(const struct instr *i)
4785{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004786 const char *jrel = i->i_jrel ? "jrel " : "";
4787 const char *jabs = i->i_jabs ? "jabs " : "";
4788 char arg[128];
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004789
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004790 *arg = '\0';
4791 if (i->i_hasarg)
4792 sprintf(arg, "arg: %d ", i->i_oparg);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004793
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004794 fprintf(stderr, "line: %d, opcode: %d %s%s%s\n",
4795 i->i_lineno, i->i_opcode, arg, jabs, jrel);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004796}
4797
4798static void
4799dump_basicblock(const basicblock *b)
4800{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004801 const char *seen = b->b_seen ? "seen " : "";
4802 const char *b_return = b->b_return ? "return " : "";
4803 fprintf(stderr, "used: %d, depth: %d, offset: %d %s%s\n",
4804 b->b_iused, b->b_startdepth, b->b_offset, seen, b_return);
4805 if (b->b_instr) {
4806 int i;
4807 for (i = 0; i < b->b_iused; i++) {
4808 fprintf(stderr, " [%02d] ", i);
4809 dump_instr(b->b_instr + i);
4810 }
4811 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004812}
4813#endif
4814
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004815static PyCodeObject *
4816assemble(struct compiler *c, int addNone)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004817{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004818 basicblock *b, *entryblock;
4819 struct assembler a;
4820 int i, j, nblocks;
4821 PyCodeObject *co = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004822
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004823 /* Make sure every block that falls off the end returns None.
4824 XXX NEXT_BLOCK() isn't quite right, because if the last
4825 block ends with a jump or return b_next shouldn't set.
4826 */
4827 if (!c->u->u_curblock->b_return) {
4828 NEXT_BLOCK(c);
4829 if (addNone)
4830 ADDOP_O(c, LOAD_CONST, Py_None, consts);
4831 ADDOP(c, RETURN_VALUE);
4832 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004833
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004834 nblocks = 0;
4835 entryblock = NULL;
4836 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
4837 nblocks++;
4838 entryblock = b;
4839 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004840
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004841 /* Set firstlineno if it wasn't explicitly set. */
4842 if (!c->u->u_firstlineno) {
4843 if (entryblock && entryblock->b_instr)
4844 c->u->u_firstlineno = entryblock->b_instr->i_lineno;
4845 else
4846 c->u->u_firstlineno = 1;
4847 }
4848 if (!assemble_init(&a, nblocks, c->u->u_firstlineno))
4849 goto error;
4850 dfs(c, entryblock, &a);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004851
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004852 /* Can't modify the bytecode after computing jump offsets. */
4853 assemble_jump_offsets(&a, c);
Tim Petersb6c3cea2001-06-26 03:36:28 +00004854
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004855 /* Emit code in reverse postorder from dfs. */
4856 for (i = a.a_nblocks - 1; i >= 0; i--) {
4857 b = a.a_postorder[i];
4858 for (j = 0; j < b->b_iused; j++)
4859 if (!assemble_emit(&a, &b->b_instr[j]))
4860 goto error;
4861 }
Tim Petersb6c3cea2001-06-26 03:36:28 +00004862
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004863 if (_PyBytes_Resize(&a.a_lnotab, a.a_lnotab_off) < 0)
4864 goto error;
4865 if (_PyBytes_Resize(&a.a_bytecode, a.a_offset) < 0)
4866 goto error;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004867
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004868 co = makecode(c, &a);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004869 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004870 assemble_free(&a);
4871 return co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004872}
Georg Brandl8334fd92010-12-04 10:26:46 +00004873
4874#undef PyAST_Compile
4875PyAPI_FUNC(PyCodeObject *)
4876PyAST_Compile(mod_ty mod, const char *filename, PyCompilerFlags *flags,
4877 PyArena *arena)
4878{
4879 return PyAST_CompileEx(mod, filename, flags, -1, arena);
4880}