blob: a7ddc5a11ac220e0072835eeb78ff3b9249dba3a [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
Guido van Rossum8e793d91997-03-03 19:13:14 +000033int Py_OptimizeFlag = 0;
34
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000035#define DEFAULT_BLOCK_SIZE 16
36#define DEFAULT_BLOCKS 8
37#define DEFAULT_CODE_SIZE 128
38#define DEFAULT_LNOTAB_SIZE 16
Jeremy Hylton29906ee2001-02-27 04:23:34 +000039
Nick Coghlan650f0d02007-04-15 12:05:43 +000040#define COMP_GENEXP 0
41#define COMP_LISTCOMP 1
42#define COMP_SETCOMP 2
Guido van Rossum992d4a32007-07-11 13:09:30 +000043#define COMP_DICTCOMP 3
Nick Coghlan650f0d02007-04-15 12:05:43 +000044
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000045struct instr {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000046 unsigned i_jabs : 1;
47 unsigned i_jrel : 1;
48 unsigned i_hasarg : 1;
49 unsigned char i_opcode;
50 int i_oparg;
51 struct basicblock_ *i_target; /* target block (if jump instruction) */
52 int i_lineno;
Guido van Rossum3f5da241990-12-20 15:06:42 +000053};
54
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000055typedef struct basicblock_ {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000056 /* Each basicblock in a compilation unit is linked via b_list in the
57 reverse order that the block are allocated. b_list points to the next
58 block, not to be confused with b_next, which is next by control flow. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000059 struct basicblock_ *b_list;
60 /* number of instructions used */
61 int b_iused;
62 /* length of instruction array (b_instr) */
63 int b_ialloc;
64 /* pointer to an array of instructions, initially NULL */
65 struct instr *b_instr;
66 /* If b_next is non-NULL, it is a pointer to the next
67 block reached by normal control flow. */
68 struct basicblock_ *b_next;
69 /* b_seen is used to perform a DFS of basicblocks. */
70 unsigned b_seen : 1;
71 /* b_return is true if a RETURN_VALUE opcode is inserted. */
72 unsigned b_return : 1;
73 /* depth of stack upon entry of block, computed by stackdepth() */
74 int b_startdepth;
75 /* instruction offset for block, computed by assemble_jump_offsets() */
76 int b_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000077} basicblock;
78
79/* fblockinfo tracks the current frame block.
80
Jeremy Hyltone9357b22006-03-01 15:47:05 +000081A frame block is used to handle loops, try/except, and try/finally.
82It's called a frame block to distinguish it from a basic block in the
83compiler IR.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000084*/
85
86enum fblocktype { LOOP, EXCEPT, FINALLY_TRY, FINALLY_END };
87
88struct fblockinfo {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000089 enum fblocktype fb_type;
90 basicblock *fb_block;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000091};
92
Antoine Pitrou86a36b52011-11-25 18:56:07 +010093enum {
94 COMPILER_SCOPE_MODULE,
95 COMPILER_SCOPE_CLASS,
96 COMPILER_SCOPE_FUNCTION,
Benjamin Peterson6b4f7802013-10-20 17:50:28 -040097 COMPILER_SCOPE_LAMBDA,
Antoine Pitrou86a36b52011-11-25 18:56:07 +010098 COMPILER_SCOPE_COMPREHENSION,
99};
100
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000101/* The following items change on entry and exit of code blocks.
102 They must be saved and restored when returning to a block.
103*/
104struct compiler_unit {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000105 PySTEntryObject *u_ste;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000106
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000107 PyObject *u_name;
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400108 PyObject *u_qualname; /* dot-separated qualified name (lazy) */
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100109 int u_scope_type;
110
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000111 /* The following fields are dicts that map objects to
112 the index of them in co_XXX. The index is used as
113 the argument for opcodes that refer to those collections.
114 */
115 PyObject *u_consts; /* all constants */
116 PyObject *u_names; /* all names */
117 PyObject *u_varnames; /* local variables */
118 PyObject *u_cellvars; /* cell variables */
119 PyObject *u_freevars; /* free variables */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000120
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000121 PyObject *u_private; /* for private name mangling */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000122
Victor Stinnerf8e32212013-11-19 23:56:34 +0100123 Py_ssize_t u_argcount; /* number of arguments for block */
124 Py_ssize_t u_kwonlyargcount; /* number of keyword only arguments for block */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000125 /* Pointer to the most recently allocated block. By following b_list
126 members, you can reach all early allocated blocks. */
127 basicblock *u_blocks;
128 basicblock *u_curblock; /* pointer to current block */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000129
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000130 int u_nfblocks;
131 struct fblockinfo u_fblock[CO_MAXBLOCKS];
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000132
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000133 int u_firstlineno; /* the first lineno of the block */
134 int u_lineno; /* the lineno for the current stmt */
Benjamin Petersond4efd9e2010-09-20 23:02:10 +0000135 int u_col_offset; /* the offset of the current stmt */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000136 int u_lineno_set; /* boolean to indicate whether instr
137 has been generated with current lineno */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000138};
139
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000140/* This struct captures the global state of a compilation.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000141
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000142The u pointer points to the current compilation unit, while units
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000143for enclosing blocks are stored in c_stack. The u and c_stack are
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000144managed by compiler_enter_scope() and compiler_exit_scope().
Nick Coghlanaab9c2b2012-11-04 23:14:34 +1000145
146Note that we don't track recursion levels during compilation - the
147task of detecting and rejecting excessive levels of nesting is
148handled by the symbol analysis pass.
149
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000150*/
151
152struct compiler {
Victor Stinner14e461d2013-08-26 22:28:21 +0200153 PyObject *c_filename;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000154 struct symtable *c_st;
155 PyFutureFeatures *c_future; /* pointer to module's __future__ */
156 PyCompilerFlags *c_flags;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000157
Georg Brandl8334fd92010-12-04 10:26:46 +0000158 int c_optimize; /* optimization level */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000159 int c_interactive; /* true if in interactive mode */
160 int c_nestlevel;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000161
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000162 struct compiler_unit *u; /* compiler state for current block */
163 PyObject *c_stack; /* Python list holding compiler_unit ptrs */
164 PyArena *c_arena; /* pointer to memory allocation arena */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000165};
166
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100167static int compiler_enter_scope(struct compiler *, identifier, int, void *, int);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000168static void compiler_free(struct compiler *);
169static basicblock *compiler_new_block(struct compiler *);
170static int compiler_next_instr(struct compiler *, basicblock *);
171static int compiler_addop(struct compiler *, int);
172static int compiler_addop_o(struct compiler *, int, PyObject *, PyObject *);
Victor Stinnerf8e32212013-11-19 23:56:34 +0100173static int compiler_addop_i(struct compiler *, int, Py_ssize_t);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000174static int compiler_addop_j(struct compiler *, int, basicblock *, int);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000175static basicblock *compiler_use_new_block(struct compiler *);
176static int compiler_error(struct compiler *, const char *);
177static int compiler_nameop(struct compiler *, identifier, expr_context_ty);
178
179static PyCodeObject *compiler_mod(struct compiler *, mod_ty);
180static int compiler_visit_stmt(struct compiler *, stmt_ty);
181static int compiler_visit_keyword(struct compiler *, keyword_ty);
182static int compiler_visit_expr(struct compiler *, expr_ty);
183static int compiler_augassign(struct compiler *, stmt_ty);
184static int compiler_visit_slice(struct compiler *, slice_ty,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000185 expr_context_ty);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000186
187static int compiler_push_fblock(struct compiler *, enum fblocktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000188 basicblock *);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000189static void compiler_pop_fblock(struct compiler *, enum fblocktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000190 basicblock *);
Thomas Wouters89f507f2006-12-13 04:49:30 +0000191/* Returns true if there is a loop on the fblock stack. */
192static int compiler_in_loop(struct compiler *);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000193
194static int inplace_binop(struct compiler *, operator_ty);
Georg Brandl8334fd92010-12-04 10:26:46 +0000195static int expr_constant(struct compiler *, expr_ty);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000196
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -0500197static int compiler_with(struct compiler *, stmt_ty, int);
Victor Stinnerad9a0662013-11-19 22:23:20 +0100198static int compiler_call_helper(struct compiler *c, Py_ssize_t n,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000199 asdl_seq *args,
200 asdl_seq *keywords,
201 expr_ty starargs,
202 expr_ty kwargs);
Benjamin Peterson43af12b2011-05-29 11:43:10 -0500203static int compiler_try_except(struct compiler *, stmt_ty);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400204static int compiler_set_qualname(struct compiler *);
Guido van Rossumc2e20742006-02-27 22:32:47 +0000205
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000206static PyCodeObject *assemble(struct compiler *, int addNone);
207static PyObject *__doc__;
208
Benjamin Petersonb173f782009-05-05 22:31:58 +0000209#define COMPILER_CAPSULE_NAME_COMPILER_UNIT "compile.c compiler unit"
210
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000211PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000212_Py_Mangle(PyObject *privateobj, PyObject *ident)
Michael W. Hudson60934622004-08-12 17:56:29 +0000213{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000214 /* Name mangling: __private becomes _classname__private.
215 This is independent from how the name is used. */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200216 PyObject *result;
217 size_t nlen, plen, ipriv;
218 Py_UCS4 maxchar;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000219 if (privateobj == NULL || !PyUnicode_Check(privateobj) ||
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200220 PyUnicode_READ_CHAR(ident, 0) != '_' ||
221 PyUnicode_READ_CHAR(ident, 1) != '_') {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000222 Py_INCREF(ident);
223 return ident;
224 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200225 nlen = PyUnicode_GET_LENGTH(ident);
226 plen = PyUnicode_GET_LENGTH(privateobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000227 /* Don't mangle __id__ or names with dots.
Guido van Rossumd8faa362007-04-27 19:54:29 +0000228
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000229 The only time a name with a dot can occur is when
230 we are compiling an import statement that has a
231 package name.
Guido van Rossumd8faa362007-04-27 19:54:29 +0000232
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000233 TODO(jhylton): Decide whether we want to support
234 mangling of the module name, e.g. __M.X.
235 */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200236 if ((PyUnicode_READ_CHAR(ident, nlen-1) == '_' &&
237 PyUnicode_READ_CHAR(ident, nlen-2) == '_') ||
238 PyUnicode_FindChar(ident, '.', 0, nlen, 1) != -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000239 Py_INCREF(ident);
240 return ident; /* Don't mangle __whatever__ */
241 }
242 /* Strip leading underscores from class name */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200243 ipriv = 0;
244 while (PyUnicode_READ_CHAR(privateobj, ipriv) == '_')
245 ipriv++;
246 if (ipriv == plen) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000247 Py_INCREF(ident);
248 return ident; /* Don't mangle if class is just underscores */
249 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200250 plen -= ipriv;
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000251
Antoine Pitrou55bff892013-04-06 21:21:04 +0200252 if (plen + nlen >= PY_SSIZE_T_MAX - 1) {
253 PyErr_SetString(PyExc_OverflowError,
254 "private identifier too large to be mangled");
255 return NULL;
256 }
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000257
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200258 maxchar = PyUnicode_MAX_CHAR_VALUE(ident);
259 if (PyUnicode_MAX_CHAR_VALUE(privateobj) > maxchar)
260 maxchar = PyUnicode_MAX_CHAR_VALUE(privateobj);
261
262 result = PyUnicode_New(1 + nlen + plen, maxchar);
263 if (!result)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000264 return 0;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200265 /* ident = "_" + priv[ipriv:] + ident # i.e. 1+plen+nlen bytes */
266 PyUnicode_WRITE(PyUnicode_KIND(result), PyUnicode_DATA(result), 0, '_');
Victor Stinner6c7a52a2011-09-28 21:39:17 +0200267 if (PyUnicode_CopyCharacters(result, 1, privateobj, ipriv, plen) < 0) {
268 Py_DECREF(result);
269 return NULL;
270 }
271 if (PyUnicode_CopyCharacters(result, plen+1, ident, 0, nlen) < 0) {
272 Py_DECREF(result);
273 return NULL;
274 }
Victor Stinner8f825062012-04-27 13:55:39 +0200275 assert(_PyUnicode_CheckConsistency(result, 1));
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200276 return result;
Michael W. Hudson60934622004-08-12 17:56:29 +0000277}
278
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000279static int
280compiler_init(struct compiler *c)
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000281{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000282 memset(c, 0, sizeof(struct compiler));
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000283
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000284 c->c_stack = PyList_New(0);
285 if (!c->c_stack)
286 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000287
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000288 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000289}
290
291PyCodeObject *
Victor Stinner14e461d2013-08-26 22:28:21 +0200292PyAST_CompileObject(mod_ty mod, PyObject *filename, PyCompilerFlags *flags,
293 int optimize, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000294{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000295 struct compiler c;
296 PyCodeObject *co = NULL;
297 PyCompilerFlags local_flags;
298 int merged;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000299
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000300 if (!__doc__) {
301 __doc__ = PyUnicode_InternFromString("__doc__");
302 if (!__doc__)
303 return NULL;
304 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000305
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000306 if (!compiler_init(&c))
307 return NULL;
Victor Stinner14e461d2013-08-26 22:28:21 +0200308 Py_INCREF(filename);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000309 c.c_filename = filename;
310 c.c_arena = arena;
Victor Stinner14e461d2013-08-26 22:28:21 +0200311 c.c_future = PyFuture_FromASTObject(mod, filename);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000312 if (c.c_future == NULL)
313 goto finally;
314 if (!flags) {
315 local_flags.cf_flags = 0;
316 flags = &local_flags;
317 }
318 merged = c.c_future->ff_features | flags->cf_flags;
319 c.c_future->ff_features = merged;
320 flags->cf_flags = merged;
321 c.c_flags = flags;
Georg Brandl8334fd92010-12-04 10:26:46 +0000322 c.c_optimize = (optimize == -1) ? Py_OptimizeFlag : optimize;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000323 c.c_nestlevel = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000324
Victor Stinner14e461d2013-08-26 22:28:21 +0200325 c.c_st = PySymtable_BuildObject(mod, filename, c.c_future);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000326 if (c.c_st == NULL) {
327 if (!PyErr_Occurred())
328 PyErr_SetString(PyExc_SystemError, "no symtable");
329 goto finally;
330 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000331
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000332 co = compiler_mod(&c, mod);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000333
Thomas Wouters1175c432006-02-27 22:49:54 +0000334 finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000335 compiler_free(&c);
336 assert(co || PyErr_Occurred());
337 return co;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000338}
339
340PyCodeObject *
Victor Stinner14e461d2013-08-26 22:28:21 +0200341PyAST_CompileEx(mod_ty mod, const char *filename_str, PyCompilerFlags *flags,
342 int optimize, PyArena *arena)
343{
344 PyObject *filename;
345 PyCodeObject *co;
346 filename = PyUnicode_DecodeFSDefault(filename_str);
347 if (filename == NULL)
348 return NULL;
349 co = PyAST_CompileObject(mod, filename, flags, optimize, arena);
350 Py_DECREF(filename);
351 return co;
352
353}
354
355PyCodeObject *
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000356PyNode_Compile(struct _node *n, const char *filename)
357{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000358 PyCodeObject *co = NULL;
359 mod_ty mod;
360 PyArena *arena = PyArena_New();
361 if (!arena)
362 return NULL;
363 mod = PyAST_FromNode(n, NULL, filename, arena);
364 if (mod)
365 co = PyAST_Compile(mod, filename, NULL, arena);
366 PyArena_Free(arena);
367 return co;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000368}
369
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000370static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000371compiler_free(struct compiler *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000372{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000373 if (c->c_st)
374 PySymtable_Free(c->c_st);
375 if (c->c_future)
376 PyObject_Free(c->c_future);
Victor Stinner14e461d2013-08-26 22:28:21 +0200377 Py_XDECREF(c->c_filename);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000378 Py_DECREF(c->c_stack);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000379}
380
Guido van Rossum79f25d91997-04-29 20:08:16 +0000381static PyObject *
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000382list2dict(PyObject *list)
Guido van Rossum2dff9911992-09-03 20:50:59 +0000383{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000384 Py_ssize_t i, n;
385 PyObject *v, *k;
386 PyObject *dict = PyDict_New();
387 if (!dict) return NULL;
Guido van Rossumd076c731998-10-07 19:42:25 +0000388
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000389 n = PyList_Size(list);
390 for (i = 0; i < n; i++) {
Victor Stinnerad9a0662013-11-19 22:23:20 +0100391 v = PyLong_FromSsize_t(i);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000392 if (!v) {
393 Py_DECREF(dict);
394 return NULL;
395 }
396 k = PyList_GET_ITEM(list, i);
397 k = PyTuple_Pack(2, k, k->ob_type);
398 if (k == NULL || PyDict_SetItem(dict, k, v) < 0) {
399 Py_XDECREF(k);
400 Py_DECREF(v);
401 Py_DECREF(dict);
402 return NULL;
403 }
404 Py_DECREF(k);
405 Py_DECREF(v);
406 }
407 return dict;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000408}
409
410/* Return new dict containing names from src that match scope(s).
411
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000412src is a symbol table dictionary. If the scope of a name matches
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000413either scope_type or flag is set, insert it into the new dict. The
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000414values are integers, starting at offset and increasing by one for
415each key.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000416*/
417
418static PyObject *
Victor Stinnerad9a0662013-11-19 22:23:20 +0100419dictbytype(PyObject *src, int scope_type, int flag, Py_ssize_t offset)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000420{
Benjamin Peterson51ab2832012-07-18 15:12:47 -0700421 Py_ssize_t i = offset, scope, num_keys, key_i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000422 PyObject *k, *v, *dest = PyDict_New();
Meador Inge2ca63152012-07-18 14:20:11 -0500423 PyObject *sorted_keys;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000424
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000425 assert(offset >= 0);
426 if (dest == NULL)
427 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000428
Meador Inge2ca63152012-07-18 14:20:11 -0500429 /* Sort the keys so that we have a deterministic order on the indexes
430 saved in the returned dictionary. These indexes are used as indexes
431 into the free and cell var storage. Therefore if they aren't
432 deterministic, then the generated bytecode is not deterministic.
433 */
434 sorted_keys = PyDict_Keys(src);
435 if (sorted_keys == NULL)
436 return NULL;
437 if (PyList_Sort(sorted_keys) != 0) {
438 Py_DECREF(sorted_keys);
439 return NULL;
440 }
Meador Ingef69e24e2012-07-18 16:41:03 -0500441 num_keys = PyList_GET_SIZE(sorted_keys);
Meador Inge2ca63152012-07-18 14:20:11 -0500442
443 for (key_i = 0; key_i < num_keys; key_i++) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000444 /* XXX this should probably be a macro in symtable.h */
445 long vi;
Meador Inge2ca63152012-07-18 14:20:11 -0500446 k = PyList_GET_ITEM(sorted_keys, key_i);
447 v = PyDict_GetItem(src, k);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000448 assert(PyLong_Check(v));
449 vi = PyLong_AS_LONG(v);
450 scope = (vi >> SCOPE_OFFSET) & SCOPE_MASK;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000451
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000452 if (scope == scope_type || vi & flag) {
Victor Stinnerad9a0662013-11-19 22:23:20 +0100453 PyObject *tuple, *item = PyLong_FromSsize_t(i);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000454 if (item == NULL) {
Meador Inge2ca63152012-07-18 14:20:11 -0500455 Py_DECREF(sorted_keys);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000456 Py_DECREF(dest);
457 return NULL;
458 }
459 i++;
460 tuple = PyTuple_Pack(2, k, k->ob_type);
461 if (!tuple || PyDict_SetItem(dest, tuple, item) < 0) {
Meador Inge2ca63152012-07-18 14:20:11 -0500462 Py_DECREF(sorted_keys);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000463 Py_DECREF(item);
464 Py_DECREF(dest);
465 Py_XDECREF(tuple);
466 return NULL;
467 }
468 Py_DECREF(item);
469 Py_DECREF(tuple);
470 }
471 }
Meador Inge2ca63152012-07-18 14:20:11 -0500472 Py_DECREF(sorted_keys);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000473 return dest;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000474}
475
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000476static void
477compiler_unit_check(struct compiler_unit *u)
478{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000479 basicblock *block;
480 for (block = u->u_blocks; block != NULL; block = block->b_list) {
481 assert((void *)block != (void *)0xcbcbcbcb);
482 assert((void *)block != (void *)0xfbfbfbfb);
483 assert((void *)block != (void *)0xdbdbdbdb);
484 if (block->b_instr != NULL) {
485 assert(block->b_ialloc > 0);
486 assert(block->b_iused > 0);
487 assert(block->b_ialloc >= block->b_iused);
488 }
489 else {
490 assert (block->b_iused == 0);
491 assert (block->b_ialloc == 0);
492 }
493 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000494}
495
496static void
497compiler_unit_free(struct compiler_unit *u)
498{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000499 basicblock *b, *next;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000500
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000501 compiler_unit_check(u);
502 b = u->u_blocks;
503 while (b != NULL) {
504 if (b->b_instr)
505 PyObject_Free((void *)b->b_instr);
506 next = b->b_list;
507 PyObject_Free((void *)b);
508 b = next;
509 }
510 Py_CLEAR(u->u_ste);
511 Py_CLEAR(u->u_name);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400512 Py_CLEAR(u->u_qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000513 Py_CLEAR(u->u_consts);
514 Py_CLEAR(u->u_names);
515 Py_CLEAR(u->u_varnames);
516 Py_CLEAR(u->u_freevars);
517 Py_CLEAR(u->u_cellvars);
518 Py_CLEAR(u->u_private);
519 PyObject_Free(u);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000520}
521
522static int
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100523compiler_enter_scope(struct compiler *c, identifier name,
524 int scope_type, void *key, int lineno)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000525{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000526 struct compiler_unit *u;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000527
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000528 u = (struct compiler_unit *)PyObject_Malloc(sizeof(
529 struct compiler_unit));
530 if (!u) {
531 PyErr_NoMemory();
532 return 0;
533 }
534 memset(u, 0, sizeof(struct compiler_unit));
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100535 u->u_scope_type = scope_type;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000536 u->u_argcount = 0;
537 u->u_kwonlyargcount = 0;
538 u->u_ste = PySymtable_Lookup(c->c_st, key);
539 if (!u->u_ste) {
540 compiler_unit_free(u);
541 return 0;
542 }
543 Py_INCREF(name);
544 u->u_name = name;
545 u->u_varnames = list2dict(u->u_ste->ste_varnames);
546 u->u_cellvars = dictbytype(u->u_ste->ste_symbols, CELL, 0, 0);
547 if (!u->u_varnames || !u->u_cellvars) {
548 compiler_unit_free(u);
549 return 0;
550 }
Benjamin Peterson312595c2013-05-15 15:26:42 -0500551 if (u->u_ste->ste_needs_class_closure) {
552 /* Cook up a implicit __class__ cell. */
553 _Py_IDENTIFIER(__class__);
554 PyObject *tuple, *name, *zero;
555 int res;
556 assert(u->u_scope_type == COMPILER_SCOPE_CLASS);
557 assert(PyDict_Size(u->u_cellvars) == 0);
558 name = _PyUnicode_FromId(&PyId___class__);
559 if (!name) {
560 compiler_unit_free(u);
561 return 0;
562 }
563 tuple = PyTuple_Pack(2, name, Py_TYPE(name));
564 if (!tuple) {
565 compiler_unit_free(u);
566 return 0;
567 }
568 zero = PyLong_FromLong(0);
569 if (!zero) {
570 Py_DECREF(tuple);
571 compiler_unit_free(u);
572 return 0;
573 }
574 res = PyDict_SetItem(u->u_cellvars, tuple, zero);
575 Py_DECREF(tuple);
576 Py_DECREF(zero);
577 if (res < 0) {
578 compiler_unit_free(u);
579 return 0;
580 }
581 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000582
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000583 u->u_freevars = dictbytype(u->u_ste->ste_symbols, FREE, DEF_FREE_CLASS,
584 PyDict_Size(u->u_cellvars));
585 if (!u->u_freevars) {
586 compiler_unit_free(u);
587 return 0;
588 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000589
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000590 u->u_blocks = NULL;
591 u->u_nfblocks = 0;
592 u->u_firstlineno = lineno;
593 u->u_lineno = 0;
Benjamin Petersond4efd9e2010-09-20 23:02:10 +0000594 u->u_col_offset = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000595 u->u_lineno_set = 0;
596 u->u_consts = PyDict_New();
597 if (!u->u_consts) {
598 compiler_unit_free(u);
599 return 0;
600 }
601 u->u_names = PyDict_New();
602 if (!u->u_names) {
603 compiler_unit_free(u);
604 return 0;
605 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000606
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000607 u->u_private = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000608
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000609 /* Push the old compiler_unit on the stack. */
610 if (c->u) {
611 PyObject *capsule = PyCapsule_New(c->u, COMPILER_CAPSULE_NAME_COMPILER_UNIT, NULL);
612 if (!capsule || PyList_Append(c->c_stack, capsule) < 0) {
613 Py_XDECREF(capsule);
614 compiler_unit_free(u);
615 return 0;
616 }
617 Py_DECREF(capsule);
618 u->u_private = c->u->u_private;
619 Py_XINCREF(u->u_private);
620 }
621 c->u = u;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000622
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000623 c->c_nestlevel++;
624 if (compiler_use_new_block(c) == NULL)
625 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000626
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400627 if (u->u_scope_type != COMPILER_SCOPE_MODULE) {
628 if (!compiler_set_qualname(c))
629 return 0;
630 }
631
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000632 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000633}
634
Neil Schemenauerc396d9e2005-10-25 06:30:14 +0000635static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000636compiler_exit_scope(struct compiler *c)
637{
Victor Stinnerad9a0662013-11-19 22:23:20 +0100638 Py_ssize_t n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000639 PyObject *capsule;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000640
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000641 c->c_nestlevel--;
642 compiler_unit_free(c->u);
643 /* Restore c->u to the parent unit. */
644 n = PyList_GET_SIZE(c->c_stack) - 1;
645 if (n >= 0) {
646 capsule = PyList_GET_ITEM(c->c_stack, n);
647 c->u = (struct compiler_unit *)PyCapsule_GetPointer(capsule, COMPILER_CAPSULE_NAME_COMPILER_UNIT);
648 assert(c->u);
649 /* we are deleting from a list so this really shouldn't fail */
650 if (PySequence_DelItem(c->c_stack, n) < 0)
651 Py_FatalError("compiler_exit_scope()");
652 compiler_unit_check(c->u);
653 }
654 else
655 c->u = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000656
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000657}
658
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400659static int
660compiler_set_qualname(struct compiler *c)
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100661{
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100662 _Py_static_string(dot, ".");
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400663 _Py_static_string(dot_locals, ".<locals>");
664 Py_ssize_t stack_size;
665 struct compiler_unit *u = c->u;
666 PyObject *name, *base, *dot_str, *dot_locals_str;
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100667
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400668 base = NULL;
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100669 stack_size = PyList_GET_SIZE(c->c_stack);
Benjamin Petersona8a38b82013-10-19 16:14:39 -0400670 assert(stack_size >= 1);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400671 if (stack_size > 1) {
672 int scope, force_global = 0;
673 struct compiler_unit *parent;
674 PyObject *mangled, *capsule;
675
Benjamin Peterson3d9e4812013-10-19 16:01:13 -0400676 capsule = PyList_GET_ITEM(c->c_stack, stack_size - 1);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400677 parent = (struct compiler_unit *)PyCapsule_GetPointer(capsule, COMPILER_CAPSULE_NAME_COMPILER_UNIT);
678 assert(parent);
679
680 if (u->u_scope_type == COMPILER_SCOPE_FUNCTION || u->u_scope_type == COMPILER_SCOPE_CLASS) {
681 assert(u->u_name);
682 mangled = _Py_Mangle(parent->u_private, u->u_name);
683 if (!mangled)
684 return 0;
685 scope = PyST_GetScope(parent->u_ste, mangled);
686 Py_DECREF(mangled);
687 assert(scope != GLOBAL_IMPLICIT);
688 if (scope == GLOBAL_EXPLICIT)
689 force_global = 1;
690 }
691
692 if (!force_global) {
693 if (parent->u_scope_type == COMPILER_SCOPE_FUNCTION
694 || parent->u_scope_type == COMPILER_SCOPE_LAMBDA) {
695 dot_locals_str = _PyUnicode_FromId(&dot_locals);
696 if (dot_locals_str == NULL)
697 return 0;
698 base = PyUnicode_Concat(parent->u_qualname, dot_locals_str);
699 if (base == NULL)
700 return 0;
701 }
702 else {
703 Py_INCREF(parent->u_qualname);
704 base = parent->u_qualname;
Benjamin Peterson3d9e4812013-10-19 16:01:13 -0400705 }
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100706 }
707 }
Benjamin Peterson3d9e4812013-10-19 16:01:13 -0400708
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400709 if (base != NULL) {
710 dot_str = _PyUnicode_FromId(&dot);
711 if (dot_str == NULL) {
712 Py_DECREF(base);
713 return 0;
714 }
715 name = PyUnicode_Concat(base, dot_str);
716 Py_DECREF(base);
717 if (name == NULL)
718 return 0;
719 PyUnicode_Append(&name, u->u_name);
720 if (name == NULL)
721 return 0;
722 }
723 else {
724 Py_INCREF(u->u_name);
725 name = u->u_name;
726 }
727 u->u_qualname = name;
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100728
Benjamin Peterson6b4f7802013-10-20 17:50:28 -0400729 return 1;
Antoine Pitrou86a36b52011-11-25 18:56:07 +0100730}
731
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000732/* Allocate a new block and return a pointer to it.
733 Returns NULL on error.
734*/
735
736static basicblock *
737compiler_new_block(struct compiler *c)
738{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000739 basicblock *b;
740 struct compiler_unit *u;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000741
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000742 u = c->u;
743 b = (basicblock *)PyObject_Malloc(sizeof(basicblock));
744 if (b == NULL) {
745 PyErr_NoMemory();
746 return NULL;
747 }
748 memset((void *)b, 0, sizeof(basicblock));
749 /* Extend the singly linked list of blocks with new block. */
750 b->b_list = u->u_blocks;
751 u->u_blocks = b;
752 return b;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000753}
754
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000755static basicblock *
756compiler_use_new_block(struct compiler *c)
757{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000758 basicblock *block = compiler_new_block(c);
759 if (block == NULL)
760 return NULL;
761 c->u->u_curblock = block;
762 return block;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000763}
764
765static basicblock *
766compiler_next_block(struct compiler *c)
767{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000768 basicblock *block = compiler_new_block(c);
769 if (block == NULL)
770 return NULL;
771 c->u->u_curblock->b_next = block;
772 c->u->u_curblock = block;
773 return block;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000774}
775
776static basicblock *
777compiler_use_next_block(struct compiler *c, basicblock *block)
778{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000779 assert(block != NULL);
780 c->u->u_curblock->b_next = block;
781 c->u->u_curblock = block;
782 return block;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000783}
784
785/* Returns the offset of the next instruction in the current block's
786 b_instr array. Resizes the b_instr as necessary.
787 Returns -1 on failure.
Thomas Wouters89f507f2006-12-13 04:49:30 +0000788*/
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000789
790static int
791compiler_next_instr(struct compiler *c, basicblock *b)
792{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000793 assert(b != NULL);
794 if (b->b_instr == NULL) {
795 b->b_instr = (struct instr *)PyObject_Malloc(
796 sizeof(struct instr) * DEFAULT_BLOCK_SIZE);
797 if (b->b_instr == NULL) {
798 PyErr_NoMemory();
799 return -1;
800 }
801 b->b_ialloc = DEFAULT_BLOCK_SIZE;
802 memset((char *)b->b_instr, 0,
803 sizeof(struct instr) * DEFAULT_BLOCK_SIZE);
804 }
805 else if (b->b_iused == b->b_ialloc) {
806 struct instr *tmp;
807 size_t oldsize, newsize;
808 oldsize = b->b_ialloc * sizeof(struct instr);
809 newsize = oldsize << 1;
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000810
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000811 if (oldsize > (PY_SIZE_MAX >> 1)) {
812 PyErr_NoMemory();
813 return -1;
814 }
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000815
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000816 if (newsize == 0) {
817 PyErr_NoMemory();
818 return -1;
819 }
820 b->b_ialloc <<= 1;
821 tmp = (struct instr *)PyObject_Realloc(
822 (void *)b->b_instr, newsize);
823 if (tmp == NULL) {
824 PyErr_NoMemory();
825 return -1;
826 }
827 b->b_instr = tmp;
828 memset((char *)b->b_instr + oldsize, 0, newsize - oldsize);
829 }
830 return b->b_iused++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000831}
832
Christian Heimes2202f872008-02-06 14:31:34 +0000833/* Set the i_lineno member of the instruction at offset off if the
834 line number for the current expression/statement has not
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000835 already been set. If it has been set, the call has no effect.
836
Christian Heimes2202f872008-02-06 14:31:34 +0000837 The line number is reset in the following cases:
838 - when entering a new scope
839 - on each statement
840 - on each expression that start a new line
841 - before the "except" clause
842 - before the "for" and "while" expressions
Thomas Wouters89f507f2006-12-13 04:49:30 +0000843*/
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000844
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000845static void
846compiler_set_lineno(struct compiler *c, int off)
847{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000848 basicblock *b;
849 if (c->u->u_lineno_set)
850 return;
851 c->u->u_lineno_set = 1;
852 b = c->u->u_curblock;
853 b->b_instr[off].i_lineno = c->u->u_lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000854}
855
Larry Hastings3a907972013-11-23 14:49:22 -0800856int
857PyCompile_OpcodeStackEffect(int opcode, int oparg)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000858{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000859 switch (opcode) {
860 case POP_TOP:
861 return -1;
862 case ROT_TWO:
863 case ROT_THREE:
864 return 0;
865 case DUP_TOP:
866 return 1;
Antoine Pitrou74a69fa2010-09-04 18:43:52 +0000867 case DUP_TOP_TWO:
868 return 2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000869
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000870 case UNARY_POSITIVE:
871 case UNARY_NEGATIVE:
872 case UNARY_NOT:
873 case UNARY_INVERT:
874 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000875
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000876 case SET_ADD:
877 case LIST_APPEND:
878 return -1;
879 case MAP_ADD:
880 return -2;
Neal Norwitz10be2ea2006-03-03 20:29:11 +0000881
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000882 case BINARY_POWER:
883 case BINARY_MULTIPLY:
884 case BINARY_MODULO:
885 case BINARY_ADD:
886 case BINARY_SUBTRACT:
887 case BINARY_SUBSCR:
888 case BINARY_FLOOR_DIVIDE:
889 case BINARY_TRUE_DIVIDE:
890 return -1;
891 case INPLACE_FLOOR_DIVIDE:
892 case INPLACE_TRUE_DIVIDE:
893 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000894
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000895 case INPLACE_ADD:
896 case INPLACE_SUBTRACT:
897 case INPLACE_MULTIPLY:
898 case INPLACE_MODULO:
899 return -1;
900 case STORE_SUBSCR:
901 return -3;
902 case STORE_MAP:
903 return -2;
904 case DELETE_SUBSCR:
905 return -2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000906
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000907 case BINARY_LSHIFT:
908 case BINARY_RSHIFT:
909 case BINARY_AND:
910 case BINARY_XOR:
911 case BINARY_OR:
912 return -1;
913 case INPLACE_POWER:
914 return -1;
915 case GET_ITER:
916 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000917
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000918 case PRINT_EXPR:
919 return -1;
920 case LOAD_BUILD_CLASS:
921 return 1;
922 case INPLACE_LSHIFT:
923 case INPLACE_RSHIFT:
924 case INPLACE_AND:
925 case INPLACE_XOR:
926 case INPLACE_OR:
927 return -1;
928 case BREAK_LOOP:
929 return 0;
930 case SETUP_WITH:
931 return 7;
932 case WITH_CLEANUP:
933 return -1; /* XXX Sometimes more */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000934 case RETURN_VALUE:
935 return -1;
936 case IMPORT_STAR:
937 return -1;
938 case YIELD_VALUE:
939 return 0;
Benjamin Peterson2afe6ae2012-03-15 15:37:39 -0500940 case YIELD_FROM:
941 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000942 case POP_BLOCK:
943 return 0;
944 case POP_EXCEPT:
945 return 0; /* -3 except if bad bytecode */
946 case END_FINALLY:
947 return -1; /* or -2 or -3 if exception occurred */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000948
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000949 case STORE_NAME:
950 return -1;
951 case DELETE_NAME:
952 return 0;
953 case UNPACK_SEQUENCE:
954 return oparg-1;
955 case UNPACK_EX:
956 return (oparg&0xFF) + (oparg>>8);
957 case FOR_ITER:
958 return 1; /* or -1, at end of iterator */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000959
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000960 case STORE_ATTR:
961 return -2;
962 case DELETE_ATTR:
963 return -1;
964 case STORE_GLOBAL:
965 return -1;
966 case DELETE_GLOBAL:
967 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000968 case LOAD_CONST:
969 return 1;
970 case LOAD_NAME:
971 return 1;
972 case BUILD_TUPLE:
973 case BUILD_LIST:
974 case BUILD_SET:
975 return 1-oparg;
976 case BUILD_MAP:
977 return 1;
978 case LOAD_ATTR:
979 return 0;
980 case COMPARE_OP:
981 return -1;
982 case IMPORT_NAME:
983 return -1;
984 case IMPORT_FROM:
985 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000986
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000987 case JUMP_FORWARD:
988 case JUMP_IF_TRUE_OR_POP: /* -1 if jump not taken */
989 case JUMP_IF_FALSE_OR_POP: /* "" */
990 case JUMP_ABSOLUTE:
991 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000992
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000993 case POP_JUMP_IF_FALSE:
994 case POP_JUMP_IF_TRUE:
995 return -1;
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +0000996
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000997 case LOAD_GLOBAL:
998 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000999
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001000 case CONTINUE_LOOP:
1001 return 0;
1002 case SETUP_LOOP:
1003 return 0;
1004 case SETUP_EXCEPT:
1005 case SETUP_FINALLY:
1006 return 6; /* can push 3 values for the new exception
1007 + 3 others for the previous exception state */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001008
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001009 case LOAD_FAST:
1010 return 1;
1011 case STORE_FAST:
1012 return -1;
1013 case DELETE_FAST:
1014 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001015
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001016 case RAISE_VARARGS:
1017 return -oparg;
Neal Norwitzc1505362006-12-28 06:47:50 +00001018#define NARGS(o) (((o) % 256) + 2*(((o) / 256) % 256))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001019 case CALL_FUNCTION:
1020 return -NARGS(oparg);
1021 case CALL_FUNCTION_VAR:
1022 case CALL_FUNCTION_KW:
1023 return -NARGS(oparg)-1;
1024 case CALL_FUNCTION_VAR_KW:
1025 return -NARGS(oparg)-2;
1026 case MAKE_FUNCTION:
Antoine Pitrou86a36b52011-11-25 18:56:07 +01001027 return -1 -NARGS(oparg) - ((oparg >> 16) & 0xffff);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001028 case MAKE_CLOSURE:
Antoine Pitrou86a36b52011-11-25 18:56:07 +01001029 return -2 - NARGS(oparg) - ((oparg >> 16) & 0xffff);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001030#undef NARGS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001031 case BUILD_SLICE:
1032 if (oparg == 3)
1033 return -2;
1034 else
1035 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001036
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001037 case LOAD_CLOSURE:
1038 return 1;
1039 case LOAD_DEREF:
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04001040 case LOAD_CLASSDEREF:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001041 return 1;
1042 case STORE_DEREF:
1043 return -1;
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00001044 case DELETE_DEREF:
1045 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001046 default:
Larry Hastings3a907972013-11-23 14:49:22 -08001047 return PY_INVALID_STACK_EFFECT;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001048 }
Larry Hastings3a907972013-11-23 14:49:22 -08001049 return PY_INVALID_STACK_EFFECT; /* not reachable */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001050}
1051
1052/* Add an opcode with no argument.
1053 Returns 0 on failure, 1 on success.
1054*/
1055
1056static int
1057compiler_addop(struct compiler *c, int opcode)
1058{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001059 basicblock *b;
1060 struct instr *i;
1061 int off;
1062 off = compiler_next_instr(c, c->u->u_curblock);
1063 if (off < 0)
1064 return 0;
1065 b = c->u->u_curblock;
1066 i = &b->b_instr[off];
1067 i->i_opcode = opcode;
1068 i->i_hasarg = 0;
1069 if (opcode == RETURN_VALUE)
1070 b->b_return = 1;
1071 compiler_set_lineno(c, off);
1072 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001073}
1074
Victor Stinnerf8e32212013-11-19 23:56:34 +01001075static Py_ssize_t
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001076compiler_add_o(struct compiler *c, PyObject *dict, PyObject *o)
1077{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001078 PyObject *t, *v;
1079 Py_ssize_t arg;
1080 double d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001081
Serhiy Storchaka95949422013-08-27 19:40:23 +03001082 /* necessary to make sure types aren't coerced (e.g., float and complex) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001083 /* _and_ to distinguish 0.0 from -0.0 e.g. on IEEE platforms */
1084 if (PyFloat_Check(o)) {
1085 d = PyFloat_AS_DOUBLE(o);
1086 /* all we need is to make the tuple different in either the 0.0
1087 * or -0.0 case from all others, just to avoid the "coercion".
1088 */
1089 if (d == 0.0 && copysign(1.0, d) < 0.0)
1090 t = PyTuple_Pack(3, o, o->ob_type, Py_None);
1091 else
1092 t = PyTuple_Pack(2, o, o->ob_type);
1093 }
1094 else if (PyComplex_Check(o)) {
1095 Py_complex z;
1096 int real_negzero, imag_negzero;
1097 /* For the complex case we must make complex(x, 0.)
1098 different from complex(x, -0.) and complex(0., y)
1099 different from complex(-0., y), for any x and y.
1100 All four complex zeros must be distinguished.*/
1101 z = PyComplex_AsCComplex(o);
1102 real_negzero = z.real == 0.0 && copysign(1.0, z.real) < 0.0;
1103 imag_negzero = z.imag == 0.0 && copysign(1.0, z.imag) < 0.0;
1104 if (real_negzero && imag_negzero) {
1105 t = PyTuple_Pack(5, o, o->ob_type,
1106 Py_None, Py_None, Py_None);
Christian Heimes400adb02008-02-01 08:12:03 +00001107 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001108 else if (imag_negzero) {
1109 t = PyTuple_Pack(4, o, o->ob_type, Py_None, Py_None);
Guido van Rossum04110fb2007-08-24 16:32:05 +00001110 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001111 else if (real_negzero) {
1112 t = PyTuple_Pack(3, o, o->ob_type, Py_None);
1113 }
1114 else {
1115 t = PyTuple_Pack(2, o, o->ob_type);
1116 }
1117 }
1118 else {
1119 t = PyTuple_Pack(2, o, o->ob_type);
1120 }
1121 if (t == NULL)
1122 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001123
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001124 v = PyDict_GetItem(dict, t);
1125 if (!v) {
1126 if (PyErr_Occurred())
1127 return -1;
1128 arg = PyDict_Size(dict);
Victor Stinnerad9a0662013-11-19 22:23:20 +01001129 v = PyLong_FromSsize_t(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001130 if (!v) {
1131 Py_DECREF(t);
1132 return -1;
1133 }
1134 if (PyDict_SetItem(dict, t, v) < 0) {
1135 Py_DECREF(t);
1136 Py_DECREF(v);
1137 return -1;
1138 }
1139 Py_DECREF(v);
1140 }
1141 else
1142 arg = PyLong_AsLong(v);
1143 Py_DECREF(t);
1144 return arg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001145}
1146
1147static int
1148compiler_addop_o(struct compiler *c, int opcode, PyObject *dict,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001149 PyObject *o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001150{
Victor Stinnerad9a0662013-11-19 22:23:20 +01001151 Py_ssize_t arg = compiler_add_o(c, dict, o);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001152 if (arg < 0)
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00001153 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001154 return compiler_addop_i(c, opcode, arg);
1155}
1156
1157static int
1158compiler_addop_name(struct compiler *c, int opcode, PyObject *dict,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001159 PyObject *o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001160{
Victor Stinnerad9a0662013-11-19 22:23:20 +01001161 Py_ssize_t arg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001162 PyObject *mangled = _Py_Mangle(c->u->u_private, o);
1163 if (!mangled)
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00001164 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001165 arg = compiler_add_o(c, dict, mangled);
1166 Py_DECREF(mangled);
1167 if (arg < 0)
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00001168 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001169 return compiler_addop_i(c, opcode, arg);
1170}
1171
1172/* Add an opcode with an integer argument.
1173 Returns 0 on failure, 1 on success.
1174*/
1175
1176static int
Victor Stinnerf8e32212013-11-19 23:56:34 +01001177compiler_addop_i(struct compiler *c, int opcode, Py_ssize_t oparg)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001178{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001179 struct instr *i;
1180 int off;
Victor Stinnerad9a0662013-11-19 22:23:20 +01001181
1182 /* Integer arguments are limit to 16-bit. There is an extension for 32-bit
1183 integer arguments. */
Victor Stinnerf8e32212013-11-19 23:56:34 +01001184 assert((-2147483647-1) <= oparg);
1185 assert(oparg <= 2147483647);
Victor Stinnerad9a0662013-11-19 22:23:20 +01001186
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001187 off = compiler_next_instr(c, c->u->u_curblock);
1188 if (off < 0)
1189 return 0;
1190 i = &c->u->u_curblock->b_instr[off];
Victor Stinnerf8e32212013-11-19 23:56:34 +01001191 i->i_opcode = opcode;
1192 i->i_oparg = Py_SAFE_DOWNCAST(oparg, Py_ssize_t, int);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001193 i->i_hasarg = 1;
1194 compiler_set_lineno(c, off);
1195 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001196}
1197
1198static int
1199compiler_addop_j(struct compiler *c, int opcode, basicblock *b, int absolute)
1200{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001201 struct instr *i;
1202 int off;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001203
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001204 assert(b != NULL);
1205 off = compiler_next_instr(c, c->u->u_curblock);
1206 if (off < 0)
1207 return 0;
1208 i = &c->u->u_curblock->b_instr[off];
1209 i->i_opcode = opcode;
1210 i->i_target = b;
1211 i->i_hasarg = 1;
1212 if (absolute)
1213 i->i_jabs = 1;
1214 else
1215 i->i_jrel = 1;
1216 compiler_set_lineno(c, off);
1217 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001218}
1219
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001220/* The distinction between NEW_BLOCK and NEXT_BLOCK is subtle. (I'd
1221 like to find better names.) NEW_BLOCK() creates a new block and sets
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001222 it as the current block. NEXT_BLOCK() also creates an implicit jump
1223 from the current block to the new block.
1224*/
1225
Thomas Wouters89f507f2006-12-13 04:49:30 +00001226/* The returns inside these macros make it impossible to decref objects
1227 created in the local function. Local objects should use the arena.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001228*/
1229
1230
1231#define NEW_BLOCK(C) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001232 if (compiler_use_new_block((C)) == NULL) \
1233 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001234}
1235
1236#define NEXT_BLOCK(C) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001237 if (compiler_next_block((C)) == NULL) \
1238 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001239}
1240
1241#define ADDOP(C, OP) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001242 if (!compiler_addop((C), (OP))) \
1243 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001244}
1245
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001246#define ADDOP_IN_SCOPE(C, OP) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001247 if (!compiler_addop((C), (OP))) { \
1248 compiler_exit_scope(c); \
1249 return 0; \
1250 } \
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001251}
1252
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001253#define ADDOP_O(C, OP, O, TYPE) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001254 if (!compiler_addop_o((C), (OP), (C)->u->u_ ## TYPE, (O))) \
1255 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001256}
1257
1258#define ADDOP_NAME(C, OP, O, TYPE) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001259 if (!compiler_addop_name((C), (OP), (C)->u->u_ ## TYPE, (O))) \
1260 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001261}
1262
1263#define ADDOP_I(C, OP, O) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001264 if (!compiler_addop_i((C), (OP), (O))) \
1265 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001266}
1267
1268#define ADDOP_JABS(C, OP, O) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001269 if (!compiler_addop_j((C), (OP), (O), 1)) \
1270 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001271}
1272
1273#define ADDOP_JREL(C, OP, O) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001274 if (!compiler_addop_j((C), (OP), (O), 0)) \
1275 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001276}
1277
1278/* VISIT and VISIT_SEQ takes an ASDL type as their second argument. They use
1279 the ASDL name to synthesize the name of the C type and the visit function.
1280*/
1281
1282#define VISIT(C, TYPE, V) {\
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001283 if (!compiler_visit_ ## TYPE((C), (V))) \
1284 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001285}
1286
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001287#define VISIT_IN_SCOPE(C, TYPE, V) {\
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001288 if (!compiler_visit_ ## TYPE((C), (V))) { \
1289 compiler_exit_scope(c); \
1290 return 0; \
1291 } \
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001292}
1293
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001294#define VISIT_SLICE(C, V, CTX) {\
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001295 if (!compiler_visit_slice((C), (V), (CTX))) \
1296 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001297}
1298
1299#define VISIT_SEQ(C, TYPE, SEQ) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001300 int _i; \
1301 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
1302 for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \
1303 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \
1304 if (!compiler_visit_ ## TYPE((C), elt)) \
1305 return 0; \
1306 } \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001307}
1308
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001309#define VISIT_SEQ_IN_SCOPE(C, TYPE, SEQ) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001310 int _i; \
1311 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
1312 for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \
1313 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \
1314 if (!compiler_visit_ ## TYPE((C), elt)) { \
1315 compiler_exit_scope(c); \
1316 return 0; \
1317 } \
1318 } \
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001319}
1320
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001321static int
1322compiler_isdocstring(stmt_ty s)
1323{
1324 if (s->kind != Expr_kind)
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00001325 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001326 return s->v.Expr.value->kind == Str_kind;
1327}
1328
1329/* Compile a sequence of statements, checking for a docstring. */
1330
1331static int
1332compiler_body(struct compiler *c, asdl_seq *stmts)
1333{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001334 int i = 0;
1335 stmt_ty st;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001336
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001337 if (!asdl_seq_LEN(stmts))
1338 return 1;
1339 st = (stmt_ty)asdl_seq_GET(stmts, 0);
Georg Brandl8334fd92010-12-04 10:26:46 +00001340 if (compiler_isdocstring(st) && c->c_optimize < 2) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001341 /* don't generate docstrings if -OO */
1342 i = 1;
1343 VISIT(c, expr, st->v.Expr.value);
1344 if (!compiler_nameop(c, __doc__, Store))
1345 return 0;
1346 }
1347 for (; i < asdl_seq_LEN(stmts); i++)
1348 VISIT(c, stmt, (stmt_ty)asdl_seq_GET(stmts, i));
1349 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001350}
1351
1352static PyCodeObject *
1353compiler_mod(struct compiler *c, mod_ty mod)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001354{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001355 PyCodeObject *co;
1356 int addNone = 1;
1357 static PyObject *module;
1358 if (!module) {
1359 module = PyUnicode_InternFromString("<module>");
1360 if (!module)
1361 return NULL;
1362 }
1363 /* Use 0 for firstlineno initially, will fixup in assemble(). */
Antoine Pitrou86a36b52011-11-25 18:56:07 +01001364 if (!compiler_enter_scope(c, module, COMPILER_SCOPE_MODULE, mod, 0))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001365 return NULL;
1366 switch (mod->kind) {
1367 case Module_kind:
1368 if (!compiler_body(c, mod->v.Module.body)) {
1369 compiler_exit_scope(c);
1370 return 0;
1371 }
1372 break;
1373 case Interactive_kind:
1374 c->c_interactive = 1;
1375 VISIT_SEQ_IN_SCOPE(c, stmt,
1376 mod->v.Interactive.body);
1377 break;
1378 case Expression_kind:
1379 VISIT_IN_SCOPE(c, expr, mod->v.Expression.body);
1380 addNone = 0;
1381 break;
1382 case Suite_kind:
1383 PyErr_SetString(PyExc_SystemError,
1384 "suite should not be possible");
1385 return 0;
1386 default:
1387 PyErr_Format(PyExc_SystemError,
1388 "module kind %d should not be possible",
1389 mod->kind);
1390 return 0;
1391 }
1392 co = assemble(c, addNone);
1393 compiler_exit_scope(c);
1394 return co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001395}
1396
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001397/* The test for LOCAL must come before the test for FREE in order to
1398 handle classes where name is both local and free. The local var is
1399 a method and the free var is a free var referenced within a method.
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001400*/
1401
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001402static int
1403get_ref_type(struct compiler *c, PyObject *name)
1404{
Victor Stinner0b1bc562013-05-16 22:17:17 +02001405 int scope;
Benjamin Peterson312595c2013-05-15 15:26:42 -05001406 if (c->u->u_scope_type == COMPILER_SCOPE_CLASS &&
1407 !PyUnicode_CompareWithASCIIString(name, "__class__"))
1408 return CELL;
Victor Stinner0b1bc562013-05-16 22:17:17 +02001409 scope = PyST_GetScope(c->u->u_ste, name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001410 if (scope == 0) {
1411 char buf[350];
1412 PyOS_snprintf(buf, sizeof(buf),
Victor Stinner14e461d2013-08-26 22:28:21 +02001413 "unknown scope for %.100s in %.100s(%s)\n"
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001414 "symbols: %s\nlocals: %s\nglobals: %s",
1415 PyBytes_AS_STRING(name),
1416 PyBytes_AS_STRING(c->u->u_name),
1417 PyObject_REPR(c->u->u_ste->ste_id),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001418 PyObject_REPR(c->u->u_ste->ste_symbols),
1419 PyObject_REPR(c->u->u_varnames),
1420 PyObject_REPR(c->u->u_names)
1421 );
1422 Py_FatalError(buf);
1423 }
Tim Peters2a7f3842001-06-09 09:26:21 +00001424
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001425 return scope;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001426}
1427
1428static int
1429compiler_lookup_arg(PyObject *dict, PyObject *name)
1430{
1431 PyObject *k, *v;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001432 k = PyTuple_Pack(2, name, name->ob_type);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001433 if (k == NULL)
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00001434 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001435 v = PyDict_GetItem(dict, k);
Neal Norwitz3715c3e2005-11-24 22:09:18 +00001436 Py_DECREF(k);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001437 if (v == NULL)
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00001438 return -1;
Christian Heimes217cfd12007-12-02 14:31:20 +00001439 return PyLong_AS_LONG(v);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001440}
1441
1442static int
Victor Stinnerad9a0662013-11-19 22:23:20 +01001443compiler_make_closure(struct compiler *c, PyCodeObject *co, Py_ssize_t args, PyObject *qualname)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001444{
Victor Stinnerad9a0662013-11-19 22:23:20 +01001445 Py_ssize_t i, free = PyCode_GetNumFree(co);
Antoine Pitrou86a36b52011-11-25 18:56:07 +01001446 if (qualname == NULL)
1447 qualname = co->co_name;
1448
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001449 if (free == 0) {
1450 ADDOP_O(c, LOAD_CONST, (PyObject*)co, consts);
Antoine Pitrou86a36b52011-11-25 18:56:07 +01001451 ADDOP_O(c, LOAD_CONST, qualname, consts);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001452 ADDOP_I(c, MAKE_FUNCTION, args);
1453 return 1;
1454 }
1455 for (i = 0; i < free; ++i) {
1456 /* Bypass com_addop_varname because it will generate
1457 LOAD_DEREF but LOAD_CLOSURE is needed.
1458 */
1459 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
1460 int arg, reftype;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001461
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001462 /* Special case: If a class contains a method with a
1463 free variable that has the same name as a method,
1464 the name will be considered free *and* local in the
1465 class. It should be handled by the closure, as
1466 well as by the normal name loookup logic.
1467 */
1468 reftype = get_ref_type(c, name);
1469 if (reftype == CELL)
1470 arg = compiler_lookup_arg(c->u->u_cellvars, name);
1471 else /* (reftype == FREE) */
1472 arg = compiler_lookup_arg(c->u->u_freevars, name);
1473 if (arg == -1) {
1474 fprintf(stderr,
1475 "lookup %s in %s %d %d\n"
1476 "freevars of %s: %s\n",
1477 PyObject_REPR(name),
1478 PyBytes_AS_STRING(c->u->u_name),
1479 reftype, arg,
1480 _PyUnicode_AsString(co->co_name),
1481 PyObject_REPR(co->co_freevars));
1482 Py_FatalError("compiler_make_closure()");
1483 }
1484 ADDOP_I(c, LOAD_CLOSURE, arg);
1485 }
1486 ADDOP_I(c, BUILD_TUPLE, free);
1487 ADDOP_O(c, LOAD_CONST, (PyObject*)co, consts);
Antoine Pitrou86a36b52011-11-25 18:56:07 +01001488 ADDOP_O(c, LOAD_CONST, qualname, consts);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001489 ADDOP_I(c, MAKE_CLOSURE, args);
1490 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001491}
1492
1493static int
1494compiler_decorators(struct compiler *c, asdl_seq* decos)
1495{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001496 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001497
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001498 if (!decos)
1499 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001500
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001501 for (i = 0; i < asdl_seq_LEN(decos); i++) {
1502 VISIT(c, expr, (expr_ty)asdl_seq_GET(decos, i));
1503 }
1504 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001505}
1506
1507static int
Guido van Rossum4f72a782006-10-27 23:31:49 +00001508compiler_visit_kwonlydefaults(struct compiler *c, asdl_seq *kwonlyargs,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001509 asdl_seq *kw_defaults)
Guido van Rossum4f72a782006-10-27 23:31:49 +00001510{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001511 int i, default_count = 0;
1512 for (i = 0; i < asdl_seq_LEN(kwonlyargs); i++) {
1513 arg_ty arg = asdl_seq_GET(kwonlyargs, i);
1514 expr_ty default_ = asdl_seq_GET(kw_defaults, i);
1515 if (default_) {
Benjamin Peterson32c59b62012-04-17 19:53:21 -04001516 PyObject *mangled = _Py_Mangle(c->u->u_private, arg->arg);
1517 if (!mangled)
1518 return -1;
1519 ADDOP_O(c, LOAD_CONST, mangled, consts);
1520 Py_DECREF(mangled);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001521 if (!compiler_visit_expr(c, default_)) {
1522 return -1;
1523 }
1524 default_count++;
1525 }
1526 }
1527 return default_count;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001528}
1529
1530static int
Neal Norwitzc1505362006-12-28 06:47:50 +00001531compiler_visit_argannotation(struct compiler *c, identifier id,
1532 expr_ty annotation, PyObject *names)
1533{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001534 if (annotation) {
1535 VISIT(c, expr, annotation);
1536 if (PyList_Append(names, id))
1537 return -1;
1538 }
1539 return 0;
Neal Norwitzc1505362006-12-28 06:47:50 +00001540}
1541
1542static int
1543compiler_visit_argannotations(struct compiler *c, asdl_seq* args,
1544 PyObject *names)
1545{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001546 int i, error;
1547 for (i = 0; i < asdl_seq_LEN(args); i++) {
1548 arg_ty arg = (arg_ty)asdl_seq_GET(args, i);
1549 error = compiler_visit_argannotation(
1550 c,
1551 arg->arg,
1552 arg->annotation,
1553 names);
1554 if (error)
1555 return error;
1556 }
1557 return 0;
Neal Norwitzc1505362006-12-28 06:47:50 +00001558}
1559
1560static int
1561compiler_visit_annotations(struct compiler *c, arguments_ty args,
1562 expr_ty returns)
1563{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001564 /* Push arg annotations and a list of the argument names. Return the #
1565 of items pushed. The expressions are evaluated out-of-order wrt the
1566 source code.
Neal Norwitzc1505362006-12-28 06:47:50 +00001567
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001568 More than 2^16-1 annotations is a SyntaxError. Returns -1 on error.
1569 */
1570 static identifier return_str;
1571 PyObject *names;
Victor Stinnerad9a0662013-11-19 22:23:20 +01001572 Py_ssize_t len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001573 names = PyList_New(0);
1574 if (!names)
1575 return -1;
Neal Norwitzc1505362006-12-28 06:47:50 +00001576
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001577 if (compiler_visit_argannotations(c, args->args, names))
1578 goto error;
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001579 if (args->vararg && args->vararg->annotation &&
1580 compiler_visit_argannotation(c, args->vararg->arg,
1581 args->vararg->annotation, names))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001582 goto error;
1583 if (compiler_visit_argannotations(c, args->kwonlyargs, names))
1584 goto error;
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001585 if (args->kwarg && args->kwarg->annotation &&
1586 compiler_visit_argannotation(c, args->kwarg->arg,
1587 args->kwarg->annotation, names))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001588 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +00001589
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001590 if (!return_str) {
1591 return_str = PyUnicode_InternFromString("return");
1592 if (!return_str)
1593 goto error;
1594 }
1595 if (compiler_visit_argannotation(c, return_str, returns, names)) {
1596 goto error;
1597 }
1598
1599 len = PyList_GET_SIZE(names);
1600 if (len > 65534) {
1601 /* len must fit in 16 bits, and len is incremented below */
1602 PyErr_SetString(PyExc_SyntaxError,
1603 "too many annotations");
1604 goto error;
1605 }
1606 if (len) {
1607 /* convert names to a tuple and place on stack */
1608 PyObject *elt;
Victor Stinnerad9a0662013-11-19 22:23:20 +01001609 Py_ssize_t i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001610 PyObject *s = PyTuple_New(len);
1611 if (!s)
1612 goto error;
1613 for (i = 0; i < len; i++) {
1614 elt = PyList_GET_ITEM(names, i);
1615 Py_INCREF(elt);
1616 PyTuple_SET_ITEM(s, i, elt);
1617 }
1618 ADDOP_O(c, LOAD_CONST, s, consts);
1619 Py_DECREF(s);
1620 len++; /* include the just-pushed tuple */
1621 }
1622 Py_DECREF(names);
Victor Stinnerad9a0662013-11-19 22:23:20 +01001623
1624 /* We just checked that len <= 65535, see above */
1625 return Py_SAFE_DOWNCAST(len, Py_ssize_t, int);
Neal Norwitzc1505362006-12-28 06:47:50 +00001626
1627error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001628 Py_DECREF(names);
1629 return -1;
Neal Norwitzc1505362006-12-28 06:47:50 +00001630}
1631
1632static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001633compiler_function(struct compiler *c, stmt_ty s)
1634{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001635 PyCodeObject *co;
Antoine Pitrou86a36b52011-11-25 18:56:07 +01001636 PyObject *qualname, *first_const = Py_None;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001637 arguments_ty args = s->v.FunctionDef.args;
1638 expr_ty returns = s->v.FunctionDef.returns;
1639 asdl_seq* decos = s->v.FunctionDef.decorator_list;
1640 stmt_ty st;
Victor Stinnerad9a0662013-11-19 22:23:20 +01001641 Py_ssize_t i, n, arglength;
1642 int docstring, kw_default_count = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001643 int num_annotations;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001644
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001645 assert(s->kind == FunctionDef_kind);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001646
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001647 if (!compiler_decorators(c, decos))
1648 return 0;
Benjamin Peterson1ef876c2013-02-10 09:29:59 -05001649 if (args->defaults)
1650 VISIT_SEQ(c, expr, args->defaults);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001651 if (args->kwonlyargs) {
1652 int res = compiler_visit_kwonlydefaults(c, args->kwonlyargs,
1653 args->kw_defaults);
1654 if (res < 0)
1655 return 0;
1656 kw_default_count = res;
1657 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001658 num_annotations = compiler_visit_annotations(c, args, returns);
1659 if (num_annotations < 0)
1660 return 0;
1661 assert((num_annotations & 0xFFFF) == num_annotations);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001662
Antoine Pitrou86a36b52011-11-25 18:56:07 +01001663 if (!compiler_enter_scope(c, s->v.FunctionDef.name,
1664 COMPILER_SCOPE_FUNCTION, (void *)s,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001665 s->lineno))
1666 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001667
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001668 st = (stmt_ty)asdl_seq_GET(s->v.FunctionDef.body, 0);
1669 docstring = compiler_isdocstring(st);
Georg Brandl8334fd92010-12-04 10:26:46 +00001670 if (docstring && c->c_optimize < 2)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001671 first_const = st->v.Expr.value->v.Str.s;
1672 if (compiler_add_o(c, c->u->u_consts, first_const) < 0) {
1673 compiler_exit_scope(c);
1674 return 0;
1675 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001676
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001677 c->u->u_argcount = asdl_seq_LEN(args->args);
1678 c->u->u_kwonlyargcount = asdl_seq_LEN(args->kwonlyargs);
1679 n = asdl_seq_LEN(s->v.FunctionDef.body);
1680 /* if there was a docstring, we need to skip the first statement */
1681 for (i = docstring; i < n; i++) {
1682 st = (stmt_ty)asdl_seq_GET(s->v.FunctionDef.body, i);
1683 VISIT_IN_SCOPE(c, stmt, st);
1684 }
1685 co = assemble(c, 1);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04001686 qualname = c->u->u_qualname;
1687 Py_INCREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001688 compiler_exit_scope(c);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04001689 if (co == NULL) {
Antoine Pitrou86a36b52011-11-25 18:56:07 +01001690 Py_XDECREF(qualname);
1691 Py_XDECREF(co);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001692 return 0;
Antoine Pitrou86a36b52011-11-25 18:56:07 +01001693 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001694
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001695 arglength = asdl_seq_LEN(args->defaults);
1696 arglength |= kw_default_count << 8;
1697 arglength |= num_annotations << 16;
Antoine Pitrou86a36b52011-11-25 18:56:07 +01001698 compiler_make_closure(c, co, arglength, qualname);
1699 Py_DECREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001700 Py_DECREF(co);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001701
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001702 /* decorators */
1703 for (i = 0; i < asdl_seq_LEN(decos); i++) {
1704 ADDOP_I(c, CALL_FUNCTION, 1);
1705 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001706
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001707 return compiler_nameop(c, s->v.FunctionDef.name, Store);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001708}
1709
1710static int
1711compiler_class(struct compiler *c, stmt_ty s)
1712{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001713 PyCodeObject *co;
1714 PyObject *str;
1715 int i;
1716 asdl_seq* decos = s->v.ClassDef.decorator_list;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001717
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001718 if (!compiler_decorators(c, decos))
1719 return 0;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001720
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001721 /* ultimately generate code for:
1722 <name> = __build_class__(<func>, <name>, *<bases>, **<keywords>)
1723 where:
1724 <func> is a function/closure created from the class body;
1725 it has a single argument (__locals__) where the dict
1726 (or MutableSequence) representing the locals is passed
1727 <name> is the class name
1728 <bases> is the positional arguments and *varargs argument
1729 <keywords> is the keyword arguments and **kwds argument
1730 This borrows from compiler_call.
1731 */
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001732
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001733 /* 1. compile the class body into a code object */
Antoine Pitrou86a36b52011-11-25 18:56:07 +01001734 if (!compiler_enter_scope(c, s->v.ClassDef.name,
1735 COMPILER_SCOPE_CLASS, (void *)s, s->lineno))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001736 return 0;
1737 /* this block represents what we do in the new scope */
1738 {
1739 /* use the class name for name mangling */
1740 Py_INCREF(s->v.ClassDef.name);
1741 Py_XDECREF(c->u->u_private);
1742 c->u->u_private = s->v.ClassDef.name;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001743 /* load (global) __name__ ... */
1744 str = PyUnicode_InternFromString("__name__");
1745 if (!str || !compiler_nameop(c, str, Load)) {
1746 Py_XDECREF(str);
1747 compiler_exit_scope(c);
1748 return 0;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001749 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001750 Py_DECREF(str);
1751 /* ... and store it as __module__ */
1752 str = PyUnicode_InternFromString("__module__");
1753 if (!str || !compiler_nameop(c, str, Store)) {
1754 Py_XDECREF(str);
1755 compiler_exit_scope(c);
1756 return 0;
1757 }
1758 Py_DECREF(str);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04001759 assert(c->u->u_qualname);
1760 ADDOP_O(c, LOAD_CONST, c->u->u_qualname, consts);
Antoine Pitrou86a36b52011-11-25 18:56:07 +01001761 str = PyUnicode_InternFromString("__qualname__");
1762 if (!str || !compiler_nameop(c, str, Store)) {
1763 Py_XDECREF(str);
1764 compiler_exit_scope(c);
1765 return 0;
1766 }
1767 Py_DECREF(str);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001768 /* compile the body proper */
1769 if (!compiler_body(c, s->v.ClassDef.body)) {
1770 compiler_exit_scope(c);
1771 return 0;
1772 }
Benjamin Peterson312595c2013-05-15 15:26:42 -05001773 if (c->u->u_ste->ste_needs_class_closure) {
1774 /* return the (empty) __class__ cell */
1775 str = PyUnicode_InternFromString("__class__");
1776 if (str == NULL) {
1777 compiler_exit_scope(c);
1778 return 0;
1779 }
1780 i = compiler_lookup_arg(c->u->u_cellvars, str);
1781 Py_DECREF(str);
Victor Stinner98e818b2013-11-05 18:07:34 +01001782 if (i < 0) {
1783 compiler_exit_scope(c);
1784 return 0;
1785 }
Benjamin Peterson312595c2013-05-15 15:26:42 -05001786 assert(i == 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001787 /* Return the cell where to store __class__ */
1788 ADDOP_I(c, LOAD_CLOSURE, i);
1789 }
Benjamin Peterson312595c2013-05-15 15:26:42 -05001790 else {
1791 assert(PyDict_Size(c->u->u_cellvars) == 0);
1792 /* This happens when nobody references the cell. Return None. */
1793 ADDOP_O(c, LOAD_CONST, Py_None, consts);
1794 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001795 ADDOP_IN_SCOPE(c, RETURN_VALUE);
1796 /* create the code object */
1797 co = assemble(c, 1);
1798 }
1799 /* leave the new scope */
1800 compiler_exit_scope(c);
1801 if (co == NULL)
1802 return 0;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001803
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001804 /* 2. load the 'build_class' function */
1805 ADDOP(c, LOAD_BUILD_CLASS);
1806
1807 /* 3. load a function (or closure) made from the code object */
Antoine Pitrou86a36b52011-11-25 18:56:07 +01001808 compiler_make_closure(c, co, 0, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001809 Py_DECREF(co);
1810
1811 /* 4. load class name */
1812 ADDOP_O(c, LOAD_CONST, s->v.ClassDef.name, consts);
1813
1814 /* 5. generate the rest of the code for the call */
1815 if (!compiler_call_helper(c, 2,
1816 s->v.ClassDef.bases,
1817 s->v.ClassDef.keywords,
1818 s->v.ClassDef.starargs,
1819 s->v.ClassDef.kwargs))
1820 return 0;
1821
1822 /* 6. apply decorators */
1823 for (i = 0; i < asdl_seq_LEN(decos); i++) {
1824 ADDOP_I(c, CALL_FUNCTION, 1);
1825 }
1826
1827 /* 7. store into <name> */
1828 if (!compiler_nameop(c, s->v.ClassDef.name, Store))
1829 return 0;
1830 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001831}
1832
1833static int
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001834compiler_ifexp(struct compiler *c, expr_ty e)
1835{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001836 basicblock *end, *next;
1837
1838 assert(e->kind == IfExp_kind);
1839 end = compiler_new_block(c);
1840 if (end == NULL)
1841 return 0;
1842 next = compiler_new_block(c);
1843 if (next == NULL)
1844 return 0;
1845 VISIT(c, expr, e->v.IfExp.test);
1846 ADDOP_JABS(c, POP_JUMP_IF_FALSE, next);
1847 VISIT(c, expr, e->v.IfExp.body);
1848 ADDOP_JREL(c, JUMP_FORWARD, end);
1849 compiler_use_next_block(c, next);
1850 VISIT(c, expr, e->v.IfExp.orelse);
1851 compiler_use_next_block(c, end);
1852 return 1;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001853}
1854
1855static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001856compiler_lambda(struct compiler *c, expr_ty e)
1857{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001858 PyCodeObject *co;
Antoine Pitrou86a36b52011-11-25 18:56:07 +01001859 PyObject *qualname;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001860 static identifier name;
Victor Stinnerad9a0662013-11-19 22:23:20 +01001861 int kw_default_count = 0;
1862 Py_ssize_t arglength;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001863 arguments_ty args = e->v.Lambda.args;
1864 assert(e->kind == Lambda_kind);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001865
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001866 if (!name) {
1867 name = PyUnicode_InternFromString("<lambda>");
1868 if (!name)
1869 return 0;
1870 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001871
Benjamin Peterson419d9a82013-02-10 09:48:22 -05001872 if (args->defaults)
1873 VISIT_SEQ(c, expr, args->defaults);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001874 if (args->kwonlyargs) {
1875 int res = compiler_visit_kwonlydefaults(c, args->kwonlyargs,
1876 args->kw_defaults);
1877 if (res < 0) return 0;
1878 kw_default_count = res;
1879 }
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04001880 if (!compiler_enter_scope(c, name, COMPILER_SCOPE_LAMBDA,
Antoine Pitrou86a36b52011-11-25 18:56:07 +01001881 (void *)e, e->lineno))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001882 return 0;
Neal Norwitz4737b232005-11-19 23:58:29 +00001883
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001884 /* Make None the first constant, so the lambda can't have a
1885 docstring. */
1886 if (compiler_add_o(c, c->u->u_consts, Py_None) < 0)
1887 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001888
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001889 c->u->u_argcount = asdl_seq_LEN(args->args);
1890 c->u->u_kwonlyargcount = asdl_seq_LEN(args->kwonlyargs);
1891 VISIT_IN_SCOPE(c, expr, e->v.Lambda.body);
1892 if (c->u->u_ste->ste_generator) {
1893 ADDOP_IN_SCOPE(c, POP_TOP);
1894 }
1895 else {
1896 ADDOP_IN_SCOPE(c, RETURN_VALUE);
1897 }
1898 co = assemble(c, 1);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04001899 qualname = c->u->u_qualname;
1900 Py_INCREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001901 compiler_exit_scope(c);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04001902 if (co == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001903 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001904
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001905 arglength = asdl_seq_LEN(args->defaults);
1906 arglength |= kw_default_count << 8;
Antoine Pitrou86a36b52011-11-25 18:56:07 +01001907 compiler_make_closure(c, co, arglength, qualname);
1908 Py_DECREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001909 Py_DECREF(co);
1910
1911 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001912}
1913
1914static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001915compiler_if(struct compiler *c, stmt_ty s)
1916{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001917 basicblock *end, *next;
1918 int constant;
1919 assert(s->kind == If_kind);
1920 end = compiler_new_block(c);
1921 if (end == NULL)
1922 return 0;
1923
Georg Brandl8334fd92010-12-04 10:26:46 +00001924 constant = expr_constant(c, s->v.If.test);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001925 /* constant = 0: "if 0"
1926 * constant = 1: "if 1", "if 2", ...
1927 * constant = -1: rest */
1928 if (constant == 0) {
1929 if (s->v.If.orelse)
1930 VISIT_SEQ(c, stmt, s->v.If.orelse);
1931 } else if (constant == 1) {
1932 VISIT_SEQ(c, stmt, s->v.If.body);
1933 } else {
1934 if (s->v.If.orelse) {
1935 next = compiler_new_block(c);
1936 if (next == NULL)
1937 return 0;
1938 }
1939 else
1940 next = end;
1941 VISIT(c, expr, s->v.If.test);
1942 ADDOP_JABS(c, POP_JUMP_IF_FALSE, next);
1943 VISIT_SEQ(c, stmt, s->v.If.body);
1944 ADDOP_JREL(c, JUMP_FORWARD, end);
1945 if (s->v.If.orelse) {
1946 compiler_use_next_block(c, next);
1947 VISIT_SEQ(c, stmt, s->v.If.orelse);
1948 }
1949 }
1950 compiler_use_next_block(c, end);
1951 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001952}
1953
1954static int
1955compiler_for(struct compiler *c, stmt_ty s)
1956{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001957 basicblock *start, *cleanup, *end;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001958
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001959 start = compiler_new_block(c);
1960 cleanup = compiler_new_block(c);
1961 end = compiler_new_block(c);
1962 if (start == NULL || end == NULL || cleanup == NULL)
1963 return 0;
1964 ADDOP_JREL(c, SETUP_LOOP, end);
1965 if (!compiler_push_fblock(c, LOOP, start))
1966 return 0;
1967 VISIT(c, expr, s->v.For.iter);
1968 ADDOP(c, GET_ITER);
1969 compiler_use_next_block(c, start);
1970 ADDOP_JREL(c, FOR_ITER, cleanup);
1971 VISIT(c, expr, s->v.For.target);
1972 VISIT_SEQ(c, stmt, s->v.For.body);
1973 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
1974 compiler_use_next_block(c, cleanup);
1975 ADDOP(c, POP_BLOCK);
1976 compiler_pop_fblock(c, LOOP, start);
1977 VISIT_SEQ(c, stmt, s->v.For.orelse);
1978 compiler_use_next_block(c, end);
1979 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001980}
1981
1982static int
1983compiler_while(struct compiler *c, stmt_ty s)
1984{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001985 basicblock *loop, *orelse, *end, *anchor = NULL;
Georg Brandl8334fd92010-12-04 10:26:46 +00001986 int constant = expr_constant(c, s->v.While.test);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001987
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001988 if (constant == 0) {
1989 if (s->v.While.orelse)
1990 VISIT_SEQ(c, stmt, s->v.While.orelse);
1991 return 1;
1992 }
1993 loop = compiler_new_block(c);
1994 end = compiler_new_block(c);
1995 if (constant == -1) {
1996 anchor = compiler_new_block(c);
1997 if (anchor == NULL)
1998 return 0;
1999 }
2000 if (loop == NULL || end == NULL)
2001 return 0;
2002 if (s->v.While.orelse) {
2003 orelse = compiler_new_block(c);
2004 if (orelse == NULL)
2005 return 0;
2006 }
2007 else
2008 orelse = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002009
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002010 ADDOP_JREL(c, SETUP_LOOP, end);
2011 compiler_use_next_block(c, loop);
2012 if (!compiler_push_fblock(c, LOOP, loop))
2013 return 0;
2014 if (constant == -1) {
2015 VISIT(c, expr, s->v.While.test);
2016 ADDOP_JABS(c, POP_JUMP_IF_FALSE, anchor);
2017 }
2018 VISIT_SEQ(c, stmt, s->v.While.body);
2019 ADDOP_JABS(c, JUMP_ABSOLUTE, loop);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002020
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002021 /* XXX should the two POP instructions be in a separate block
2022 if there is no else clause ?
2023 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002024
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002025 if (constant == -1) {
2026 compiler_use_next_block(c, anchor);
2027 ADDOP(c, POP_BLOCK);
2028 }
2029 compiler_pop_fblock(c, LOOP, loop);
2030 if (orelse != NULL) /* what if orelse is just pass? */
2031 VISIT_SEQ(c, stmt, s->v.While.orelse);
2032 compiler_use_next_block(c, end);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002033
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002034 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002035}
2036
2037static int
2038compiler_continue(struct compiler *c)
2039{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002040 static const char LOOP_ERROR_MSG[] = "'continue' not properly in loop";
2041 static const char IN_FINALLY_ERROR_MSG[] =
2042 "'continue' not supported inside 'finally' clause";
2043 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002044
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002045 if (!c->u->u_nfblocks)
2046 return compiler_error(c, LOOP_ERROR_MSG);
2047 i = c->u->u_nfblocks - 1;
2048 switch (c->u->u_fblock[i].fb_type) {
2049 case LOOP:
2050 ADDOP_JABS(c, JUMP_ABSOLUTE, c->u->u_fblock[i].fb_block);
2051 break;
2052 case EXCEPT:
2053 case FINALLY_TRY:
2054 while (--i >= 0 && c->u->u_fblock[i].fb_type != LOOP) {
2055 /* Prevent continue anywhere under a finally
2056 even if hidden in a sub-try or except. */
2057 if (c->u->u_fblock[i].fb_type == FINALLY_END)
2058 return compiler_error(c, IN_FINALLY_ERROR_MSG);
2059 }
2060 if (i == -1)
2061 return compiler_error(c, LOOP_ERROR_MSG);
2062 ADDOP_JABS(c, CONTINUE_LOOP, c->u->u_fblock[i].fb_block);
2063 break;
2064 case FINALLY_END:
2065 return compiler_error(c, IN_FINALLY_ERROR_MSG);
2066 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002067
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002068 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002069}
2070
2071/* Code generated for "try: <body> finally: <finalbody>" is as follows:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002072
2073 SETUP_FINALLY L
2074 <code for body>
2075 POP_BLOCK
2076 LOAD_CONST <None>
2077 L: <code for finalbody>
2078 END_FINALLY
2079
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002080 The special instructions use the block stack. Each block
2081 stack entry contains the instruction that created it (here
2082 SETUP_FINALLY), the level of the value stack at the time the
2083 block stack entry was created, and a label (here L).
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002084
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002085 SETUP_FINALLY:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002086 Pushes the current value stack level and the label
2087 onto the block stack.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002088 POP_BLOCK:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002089 Pops en entry from the block stack, and pops the value
2090 stack until its level is the same as indicated on the
2091 block stack. (The label is ignored.)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002092 END_FINALLY:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002093 Pops a variable number of entries from the *value* stack
2094 and re-raises the exception they specify. The number of
2095 entries popped depends on the (pseudo) exception type.
2096
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002097 The block stack is unwound when an exception is raised:
2098 when a SETUP_FINALLY entry is found, the exception is pushed
2099 onto the value stack (and the exception condition is cleared),
2100 and the interpreter jumps to the label gotten from the block
2101 stack.
2102*/
2103
2104static int
2105compiler_try_finally(struct compiler *c, stmt_ty s)
2106{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002107 basicblock *body, *end;
2108 body = compiler_new_block(c);
2109 end = compiler_new_block(c);
2110 if (body == NULL || end == NULL)
2111 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002112
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002113 ADDOP_JREL(c, SETUP_FINALLY, end);
2114 compiler_use_next_block(c, body);
2115 if (!compiler_push_fblock(c, FINALLY_TRY, body))
2116 return 0;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002117 if (s->v.Try.handlers && asdl_seq_LEN(s->v.Try.handlers)) {
2118 if (!compiler_try_except(c, s))
2119 return 0;
2120 }
2121 else {
2122 VISIT_SEQ(c, stmt, s->v.Try.body);
2123 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002124 ADDOP(c, POP_BLOCK);
2125 compiler_pop_fblock(c, FINALLY_TRY, body);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002126
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002127 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2128 compiler_use_next_block(c, end);
2129 if (!compiler_push_fblock(c, FINALLY_END, end))
2130 return 0;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002131 VISIT_SEQ(c, stmt, s->v.Try.finalbody);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002132 ADDOP(c, END_FINALLY);
2133 compiler_pop_fblock(c, FINALLY_END, end);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002134
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002135 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002136}
2137
2138/*
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00002139 Code generated for "try: S except E1 as V1: S1 except E2 as V2: S2 ...":
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002140 (The contents of the value stack is shown in [], with the top
2141 at the right; 'tb' is trace-back info, 'val' the exception's
2142 associated value, and 'exc' the exception.)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002143
2144 Value stack Label Instruction Argument
2145 [] SETUP_EXCEPT L1
2146 [] <code for S>
2147 [] POP_BLOCK
2148 [] JUMP_FORWARD L0
2149
2150 [tb, val, exc] L1: DUP )
2151 [tb, val, exc, exc] <evaluate E1> )
2152 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2153 [tb, val, exc, 1-or-0] POP_JUMP_IF_FALSE L2 )
2154 [tb, val, exc] POP
2155 [tb, val] <assign to V1> (or POP if no V1)
2156 [tb] POP
2157 [] <code for S1>
2158 JUMP_FORWARD L0
2159
2160 [tb, val, exc] L2: DUP
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002161 .............................etc.......................
2162
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002163 [tb, val, exc] Ln+1: END_FINALLY # re-raise exception
2164
2165 [] L0: <next statement>
2166
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002167 Of course, parts are not generated if Vi or Ei is not present.
2168*/
2169static int
2170compiler_try_except(struct compiler *c, stmt_ty s)
2171{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002172 basicblock *body, *orelse, *except, *end;
Victor Stinnerad9a0662013-11-19 22:23:20 +01002173 Py_ssize_t i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002174
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002175 body = compiler_new_block(c);
2176 except = compiler_new_block(c);
2177 orelse = compiler_new_block(c);
2178 end = compiler_new_block(c);
2179 if (body == NULL || except == NULL || orelse == NULL || end == NULL)
2180 return 0;
2181 ADDOP_JREL(c, SETUP_EXCEPT, except);
2182 compiler_use_next_block(c, body);
2183 if (!compiler_push_fblock(c, EXCEPT, body))
2184 return 0;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002185 VISIT_SEQ(c, stmt, s->v.Try.body);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002186 ADDOP(c, POP_BLOCK);
2187 compiler_pop_fblock(c, EXCEPT, body);
2188 ADDOP_JREL(c, JUMP_FORWARD, orelse);
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002189 n = asdl_seq_LEN(s->v.Try.handlers);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002190 compiler_use_next_block(c, except);
2191 for (i = 0; i < n; i++) {
2192 excepthandler_ty handler = (excepthandler_ty)asdl_seq_GET(
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002193 s->v.Try.handlers, i);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002194 if (!handler->v.ExceptHandler.type && i < n-1)
2195 return compiler_error(c, "default 'except:' must be last");
2196 c->u->u_lineno_set = 0;
2197 c->u->u_lineno = handler->lineno;
Benjamin Petersond4efd9e2010-09-20 23:02:10 +00002198 c->u->u_col_offset = handler->col_offset;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002199 except = compiler_new_block(c);
2200 if (except == NULL)
2201 return 0;
2202 if (handler->v.ExceptHandler.type) {
2203 ADDOP(c, DUP_TOP);
2204 VISIT(c, expr, handler->v.ExceptHandler.type);
2205 ADDOP_I(c, COMPARE_OP, PyCmp_EXC_MATCH);
2206 ADDOP_JABS(c, POP_JUMP_IF_FALSE, except);
2207 }
2208 ADDOP(c, POP_TOP);
2209 if (handler->v.ExceptHandler.name) {
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002210 basicblock *cleanup_end, *cleanup_body;
Guido van Rossumb940e112007-01-10 16:19:56 +00002211
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002212 cleanup_end = compiler_new_block(c);
2213 cleanup_body = compiler_new_block(c);
Benjamin Peterson0a5dad92011-05-27 14:17:04 -05002214 if (!(cleanup_end || cleanup_body))
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002215 return 0;
Guido van Rossumb940e112007-01-10 16:19:56 +00002216
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002217 compiler_nameop(c, handler->v.ExceptHandler.name, Store);
2218 ADDOP(c, POP_TOP);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002219
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002220 /*
2221 try:
Ezio Melotti1b6424f2013-04-19 07:10:09 +03002222 # body
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002223 except type as name:
Ezio Melotti1b6424f2013-04-19 07:10:09 +03002224 try:
2225 # body
2226 finally:
2227 name = None
2228 del name
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002229 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002230
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002231 /* second try: */
2232 ADDOP_JREL(c, SETUP_FINALLY, cleanup_end);
2233 compiler_use_next_block(c, cleanup_body);
2234 if (!compiler_push_fblock(c, FINALLY_TRY, cleanup_body))
2235 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002236
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002237 /* second # body */
2238 VISIT_SEQ(c, stmt, handler->v.ExceptHandler.body);
2239 ADDOP(c, POP_BLOCK);
2240 ADDOP(c, POP_EXCEPT);
2241 compiler_pop_fblock(c, FINALLY_TRY, cleanup_body);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002242
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002243 /* finally: */
2244 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2245 compiler_use_next_block(c, cleanup_end);
2246 if (!compiler_push_fblock(c, FINALLY_END, cleanup_end))
2247 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002248
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002249 /* name = None */
2250 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2251 compiler_nameop(c, handler->v.ExceptHandler.name, Store);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002252
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002253 /* del name */
2254 compiler_nameop(c, handler->v.ExceptHandler.name, Del);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002255
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002256 ADDOP(c, END_FINALLY);
2257 compiler_pop_fblock(c, FINALLY_END, cleanup_end);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002258 }
2259 else {
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002260 basicblock *cleanup_body;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002261
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002262 cleanup_body = compiler_new_block(c);
Benjamin Peterson0a5dad92011-05-27 14:17:04 -05002263 if (!cleanup_body)
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002264 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002265
Guido van Rossumb940e112007-01-10 16:19:56 +00002266 ADDOP(c, POP_TOP);
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002267 ADDOP(c, POP_TOP);
2268 compiler_use_next_block(c, cleanup_body);
2269 if (!compiler_push_fblock(c, FINALLY_TRY, cleanup_body))
2270 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002271 VISIT_SEQ(c, stmt, handler->v.ExceptHandler.body);
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002272 ADDOP(c, POP_EXCEPT);
2273 compiler_pop_fblock(c, FINALLY_TRY, cleanup_body);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002274 }
2275 ADDOP_JREL(c, JUMP_FORWARD, end);
2276 compiler_use_next_block(c, except);
2277 }
2278 ADDOP(c, END_FINALLY);
2279 compiler_use_next_block(c, orelse);
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002280 VISIT_SEQ(c, stmt, s->v.Try.orelse);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002281 compiler_use_next_block(c, end);
2282 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002283}
2284
2285static int
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002286compiler_try(struct compiler *c, stmt_ty s) {
2287 if (s->v.Try.finalbody && asdl_seq_LEN(s->v.Try.finalbody))
2288 return compiler_try_finally(c, s);
2289 else
2290 return compiler_try_except(c, s);
2291}
2292
2293
2294static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002295compiler_import_as(struct compiler *c, identifier name, identifier asname)
2296{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002297 /* The IMPORT_NAME opcode was already generated. This function
2298 merely needs to bind the result to a name.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002299
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002300 If there is a dot in name, we need to split it and emit a
2301 LOAD_ATTR for each name.
2302 */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002303 Py_ssize_t dot = PyUnicode_FindChar(name, '.', 0,
2304 PyUnicode_GET_LENGTH(name), 1);
2305 if (dot == -2)
2306 return -1;
2307 if (dot != -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002308 /* Consume the base module name to get the first attribute */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002309 Py_ssize_t pos = dot + 1;
2310 while (dot != -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002311 PyObject *attr;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002312 dot = PyUnicode_FindChar(name, '.', pos,
2313 PyUnicode_GET_LENGTH(name), 1);
2314 if (dot == -2)
2315 return -1;
2316 attr = PyUnicode_Substring(name, pos,
2317 (dot != -1) ? dot :
2318 PyUnicode_GET_LENGTH(name));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002319 if (!attr)
2320 return -1;
2321 ADDOP_O(c, LOAD_ATTR, attr, names);
2322 Py_DECREF(attr);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002323 pos = dot + 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002324 }
2325 }
2326 return compiler_nameop(c, asname, Store);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002327}
2328
2329static int
2330compiler_import(struct compiler *c, stmt_ty s)
2331{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002332 /* The Import node stores a module name like a.b.c as a single
2333 string. This is convenient for all cases except
2334 import a.b.c as d
2335 where we need to parse that string to extract the individual
2336 module names.
2337 XXX Perhaps change the representation to make this case simpler?
2338 */
Victor Stinnerad9a0662013-11-19 22:23:20 +01002339 Py_ssize_t i, n = asdl_seq_LEN(s->v.Import.names);
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002340
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002341 for (i = 0; i < n; i++) {
2342 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.Import.names, i);
2343 int r;
2344 PyObject *level;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002345
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002346 level = PyLong_FromLong(0);
2347 if (level == NULL)
2348 return 0;
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002349
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002350 ADDOP_O(c, LOAD_CONST, level, consts);
2351 Py_DECREF(level);
2352 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2353 ADDOP_NAME(c, IMPORT_NAME, alias->name, names);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002354
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002355 if (alias->asname) {
2356 r = compiler_import_as(c, alias->name, alias->asname);
2357 if (!r)
2358 return r;
2359 }
2360 else {
2361 identifier tmp = alias->name;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002362 Py_ssize_t dot = PyUnicode_FindChar(
2363 alias->name, '.', 0, PyUnicode_GET_LENGTH(alias->name), 1);
Victor Stinner6b64a682013-07-11 22:50:45 +02002364 if (dot != -1) {
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002365 tmp = PyUnicode_Substring(alias->name, 0, dot);
Victor Stinner6b64a682013-07-11 22:50:45 +02002366 if (tmp == NULL)
2367 return 0;
2368 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002369 r = compiler_nameop(c, tmp, Store);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002370 if (dot != -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002371 Py_DECREF(tmp);
2372 }
2373 if (!r)
2374 return r;
2375 }
2376 }
2377 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002378}
2379
2380static int
2381compiler_from_import(struct compiler *c, stmt_ty s)
2382{
Victor Stinnerad9a0662013-11-19 22:23:20 +01002383 Py_ssize_t i, n = asdl_seq_LEN(s->v.ImportFrom.names);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002384
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002385 PyObject *names = PyTuple_New(n);
2386 PyObject *level;
2387 static PyObject *empty_string;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002388
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002389 if (!empty_string) {
2390 empty_string = PyUnicode_FromString("");
2391 if (!empty_string)
2392 return 0;
2393 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002394
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002395 if (!names)
2396 return 0;
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002397
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002398 level = PyLong_FromLong(s->v.ImportFrom.level);
2399 if (!level) {
2400 Py_DECREF(names);
2401 return 0;
2402 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002403
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002404 /* build up the names */
2405 for (i = 0; i < n; i++) {
2406 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);
2407 Py_INCREF(alias->name);
2408 PyTuple_SET_ITEM(names, i, alias->name);
2409 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002410
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002411 if (s->lineno > c->c_future->ff_lineno && s->v.ImportFrom.module &&
2412 !PyUnicode_CompareWithASCIIString(s->v.ImportFrom.module, "__future__")) {
2413 Py_DECREF(level);
2414 Py_DECREF(names);
2415 return compiler_error(c, "from __future__ imports must occur "
2416 "at the beginning of the file");
2417 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002418
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002419 ADDOP_O(c, LOAD_CONST, level, consts);
2420 Py_DECREF(level);
2421 ADDOP_O(c, LOAD_CONST, names, consts);
2422 Py_DECREF(names);
2423 if (s->v.ImportFrom.module) {
2424 ADDOP_NAME(c, IMPORT_NAME, s->v.ImportFrom.module, names);
2425 }
2426 else {
2427 ADDOP_NAME(c, IMPORT_NAME, empty_string, names);
2428 }
2429 for (i = 0; i < n; i++) {
2430 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);
2431 identifier store_name;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002432
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002433 if (i == 0 && PyUnicode_READ_CHAR(alias->name, 0) == '*') {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002434 assert(n == 1);
2435 ADDOP(c, IMPORT_STAR);
2436 return 1;
2437 }
2438
2439 ADDOP_NAME(c, IMPORT_FROM, alias->name, names);
2440 store_name = alias->name;
2441 if (alias->asname)
2442 store_name = alias->asname;
2443
2444 if (!compiler_nameop(c, store_name, Store)) {
2445 Py_DECREF(names);
2446 return 0;
2447 }
2448 }
2449 /* remove imported module */
2450 ADDOP(c, POP_TOP);
2451 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002452}
2453
2454static int
2455compiler_assert(struct compiler *c, stmt_ty s)
2456{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002457 static PyObject *assertion_error = NULL;
2458 basicblock *end;
Victor Stinner14e461d2013-08-26 22:28:21 +02002459 PyObject* msg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002460
Georg Brandl8334fd92010-12-04 10:26:46 +00002461 if (c->c_optimize)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002462 return 1;
2463 if (assertion_error == NULL) {
2464 assertion_error = PyUnicode_InternFromString("AssertionError");
2465 if (assertion_error == NULL)
2466 return 0;
2467 }
2468 if (s->v.Assert.test->kind == Tuple_kind &&
2469 asdl_seq_LEN(s->v.Assert.test->v.Tuple.elts) > 0) {
Victor Stinner14e461d2013-08-26 22:28:21 +02002470 msg = PyUnicode_FromString("assertion is always true, "
2471 "perhaps remove parentheses?");
2472 if (msg == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002473 return 0;
Victor Stinner14e461d2013-08-26 22:28:21 +02002474 if (PyErr_WarnExplicitObject(PyExc_SyntaxWarning, msg,
2475 c->c_filename, c->u->u_lineno,
2476 NULL, NULL) == -1) {
2477 Py_DECREF(msg);
2478 return 0;
2479 }
2480 Py_DECREF(msg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002481 }
2482 VISIT(c, expr, s->v.Assert.test);
2483 end = compiler_new_block(c);
2484 if (end == NULL)
2485 return 0;
2486 ADDOP_JABS(c, POP_JUMP_IF_TRUE, end);
2487 ADDOP_O(c, LOAD_GLOBAL, assertion_error, names);
2488 if (s->v.Assert.msg) {
2489 VISIT(c, expr, s->v.Assert.msg);
2490 ADDOP_I(c, CALL_FUNCTION, 1);
2491 }
2492 ADDOP_I(c, RAISE_VARARGS, 1);
2493 compiler_use_next_block(c, end);
2494 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002495}
2496
2497static int
2498compiler_visit_stmt(struct compiler *c, stmt_ty s)
2499{
Victor Stinnerad9a0662013-11-19 22:23:20 +01002500 Py_ssize_t i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002501
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002502 /* Always assign a lineno to the next instruction for a stmt. */
2503 c->u->u_lineno = s->lineno;
Benjamin Petersond4efd9e2010-09-20 23:02:10 +00002504 c->u->u_col_offset = s->col_offset;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002505 c->u->u_lineno_set = 0;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002506
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002507 switch (s->kind) {
2508 case FunctionDef_kind:
2509 return compiler_function(c, s);
2510 case ClassDef_kind:
2511 return compiler_class(c, s);
2512 case Return_kind:
2513 if (c->u->u_ste->ste_type != FunctionBlock)
2514 return compiler_error(c, "'return' outside function");
2515 if (s->v.Return.value) {
2516 VISIT(c, expr, s->v.Return.value);
2517 }
2518 else
2519 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2520 ADDOP(c, RETURN_VALUE);
2521 break;
2522 case Delete_kind:
2523 VISIT_SEQ(c, expr, s->v.Delete.targets)
2524 break;
2525 case Assign_kind:
2526 n = asdl_seq_LEN(s->v.Assign.targets);
2527 VISIT(c, expr, s->v.Assign.value);
2528 for (i = 0; i < n; i++) {
2529 if (i < n - 1)
2530 ADDOP(c, DUP_TOP);
2531 VISIT(c, expr,
2532 (expr_ty)asdl_seq_GET(s->v.Assign.targets, i));
2533 }
2534 break;
2535 case AugAssign_kind:
2536 return compiler_augassign(c, s);
2537 case For_kind:
2538 return compiler_for(c, s);
2539 case While_kind:
2540 return compiler_while(c, s);
2541 case If_kind:
2542 return compiler_if(c, s);
2543 case Raise_kind:
2544 n = 0;
2545 if (s->v.Raise.exc) {
2546 VISIT(c, expr, s->v.Raise.exc);
2547 n++;
Victor Stinnerad9a0662013-11-19 22:23:20 +01002548 if (s->v.Raise.cause) {
2549 VISIT(c, expr, s->v.Raise.cause);
2550 n++;
2551 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002552 }
Victor Stinnerad9a0662013-11-19 22:23:20 +01002553 ADDOP_I(c, RAISE_VARARGS, (int)n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002554 break;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002555 case Try_kind:
2556 return compiler_try(c, s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002557 case Assert_kind:
2558 return compiler_assert(c, s);
2559 case Import_kind:
2560 return compiler_import(c, s);
2561 case ImportFrom_kind:
2562 return compiler_from_import(c, s);
2563 case Global_kind:
2564 case Nonlocal_kind:
2565 break;
2566 case Expr_kind:
2567 if (c->c_interactive && c->c_nestlevel <= 1) {
2568 VISIT(c, expr, s->v.Expr.value);
2569 ADDOP(c, PRINT_EXPR);
2570 }
2571 else if (s->v.Expr.value->kind != Str_kind &&
2572 s->v.Expr.value->kind != Num_kind) {
2573 VISIT(c, expr, s->v.Expr.value);
2574 ADDOP(c, POP_TOP);
2575 }
2576 break;
2577 case Pass_kind:
2578 break;
2579 case Break_kind:
2580 if (!compiler_in_loop(c))
2581 return compiler_error(c, "'break' outside loop");
2582 ADDOP(c, BREAK_LOOP);
2583 break;
2584 case Continue_kind:
2585 return compiler_continue(c);
2586 case With_kind:
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05002587 return compiler_with(c, s, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002588 }
2589 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002590}
2591
2592static int
2593unaryop(unaryop_ty op)
2594{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002595 switch (op) {
2596 case Invert:
2597 return UNARY_INVERT;
2598 case Not:
2599 return UNARY_NOT;
2600 case UAdd:
2601 return UNARY_POSITIVE;
2602 case USub:
2603 return UNARY_NEGATIVE;
2604 default:
2605 PyErr_Format(PyExc_SystemError,
2606 "unary op %d should not be possible", op);
2607 return 0;
2608 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002609}
2610
2611static int
2612binop(struct compiler *c, operator_ty op)
2613{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002614 switch (op) {
2615 case Add:
2616 return BINARY_ADD;
2617 case Sub:
2618 return BINARY_SUBTRACT;
2619 case Mult:
2620 return BINARY_MULTIPLY;
2621 case Div:
2622 return BINARY_TRUE_DIVIDE;
2623 case Mod:
2624 return BINARY_MODULO;
2625 case Pow:
2626 return BINARY_POWER;
2627 case LShift:
2628 return BINARY_LSHIFT;
2629 case RShift:
2630 return BINARY_RSHIFT;
2631 case BitOr:
2632 return BINARY_OR;
2633 case BitXor:
2634 return BINARY_XOR;
2635 case BitAnd:
2636 return BINARY_AND;
2637 case FloorDiv:
2638 return BINARY_FLOOR_DIVIDE;
2639 default:
2640 PyErr_Format(PyExc_SystemError,
2641 "binary op %d should not be possible", op);
2642 return 0;
2643 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002644}
2645
2646static int
2647cmpop(cmpop_ty op)
2648{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002649 switch (op) {
2650 case Eq:
2651 return PyCmp_EQ;
2652 case NotEq:
2653 return PyCmp_NE;
2654 case Lt:
2655 return PyCmp_LT;
2656 case LtE:
2657 return PyCmp_LE;
2658 case Gt:
2659 return PyCmp_GT;
2660 case GtE:
2661 return PyCmp_GE;
2662 case Is:
2663 return PyCmp_IS;
2664 case IsNot:
2665 return PyCmp_IS_NOT;
2666 case In:
2667 return PyCmp_IN;
2668 case NotIn:
2669 return PyCmp_NOT_IN;
2670 default:
2671 return PyCmp_BAD;
2672 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002673}
2674
2675static int
2676inplace_binop(struct compiler *c, operator_ty op)
2677{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002678 switch (op) {
2679 case Add:
2680 return INPLACE_ADD;
2681 case Sub:
2682 return INPLACE_SUBTRACT;
2683 case Mult:
2684 return INPLACE_MULTIPLY;
2685 case Div:
2686 return INPLACE_TRUE_DIVIDE;
2687 case Mod:
2688 return INPLACE_MODULO;
2689 case Pow:
2690 return INPLACE_POWER;
2691 case LShift:
2692 return INPLACE_LSHIFT;
2693 case RShift:
2694 return INPLACE_RSHIFT;
2695 case BitOr:
2696 return INPLACE_OR;
2697 case BitXor:
2698 return INPLACE_XOR;
2699 case BitAnd:
2700 return INPLACE_AND;
2701 case FloorDiv:
2702 return INPLACE_FLOOR_DIVIDE;
2703 default:
2704 PyErr_Format(PyExc_SystemError,
2705 "inplace binary op %d should not be possible", op);
2706 return 0;
2707 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002708}
2709
2710static int
2711compiler_nameop(struct compiler *c, identifier name, expr_context_ty ctx)
2712{
Victor Stinnerad9a0662013-11-19 22:23:20 +01002713 int op, scope;
2714 Py_ssize_t arg;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002715 enum { OP_FAST, OP_GLOBAL, OP_DEREF, OP_NAME } optype;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002716
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002717 PyObject *dict = c->u->u_names;
2718 PyObject *mangled;
2719 /* XXX AugStore isn't used anywhere! */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002720
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002721 mangled = _Py_Mangle(c->u->u_private, name);
2722 if (!mangled)
2723 return 0;
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002724
Benjamin Peterson70b224d2012-12-06 17:49:58 -05002725 assert(PyUnicode_CompareWithASCIIString(name, "None") &&
2726 PyUnicode_CompareWithASCIIString(name, "True") &&
2727 PyUnicode_CompareWithASCIIString(name, "False"));
2728
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002729 op = 0;
2730 optype = OP_NAME;
2731 scope = PyST_GetScope(c->u->u_ste, mangled);
2732 switch (scope) {
2733 case FREE:
2734 dict = c->u->u_freevars;
2735 optype = OP_DEREF;
2736 break;
2737 case CELL:
2738 dict = c->u->u_cellvars;
2739 optype = OP_DEREF;
2740 break;
2741 case LOCAL:
2742 if (c->u->u_ste->ste_type == FunctionBlock)
2743 optype = OP_FAST;
2744 break;
2745 case GLOBAL_IMPLICIT:
2746 if (c->u->u_ste->ste_type == FunctionBlock &&
2747 !c->u->u_ste->ste_unoptimized)
2748 optype = OP_GLOBAL;
2749 break;
2750 case GLOBAL_EXPLICIT:
2751 optype = OP_GLOBAL;
2752 break;
2753 default:
2754 /* scope can be 0 */
2755 break;
2756 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002757
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002758 /* XXX Leave assert here, but handle __doc__ and the like better */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002759 assert(scope || PyUnicode_READ_CHAR(name, 0) == '_');
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002760
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002761 switch (optype) {
2762 case OP_DEREF:
2763 switch (ctx) {
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04002764 case Load:
2765 op = (c->u->u_ste->ste_type == ClassBlock) ? LOAD_CLASSDEREF : LOAD_DEREF;
2766 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002767 case Store: op = STORE_DEREF; break;
2768 case AugLoad:
2769 case AugStore:
2770 break;
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00002771 case Del: op = DELETE_DEREF; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002772 case Param:
2773 default:
2774 PyErr_SetString(PyExc_SystemError,
2775 "param invalid for deref variable");
2776 return 0;
2777 }
2778 break;
2779 case OP_FAST:
2780 switch (ctx) {
2781 case Load: op = LOAD_FAST; break;
2782 case Store: op = STORE_FAST; break;
2783 case Del: op = DELETE_FAST; break;
2784 case AugLoad:
2785 case AugStore:
2786 break;
2787 case Param:
2788 default:
2789 PyErr_SetString(PyExc_SystemError,
2790 "param invalid for local variable");
2791 return 0;
2792 }
2793 ADDOP_O(c, op, mangled, varnames);
2794 Py_DECREF(mangled);
2795 return 1;
2796 case OP_GLOBAL:
2797 switch (ctx) {
2798 case Load: op = LOAD_GLOBAL; break;
2799 case Store: op = STORE_GLOBAL; break;
2800 case Del: op = DELETE_GLOBAL; break;
2801 case AugLoad:
2802 case AugStore:
2803 break;
2804 case Param:
2805 default:
2806 PyErr_SetString(PyExc_SystemError,
2807 "param invalid for global variable");
2808 return 0;
2809 }
2810 break;
2811 case OP_NAME:
2812 switch (ctx) {
Benjamin Peterson20f9c3c2010-07-20 22:39:34 +00002813 case Load: op = LOAD_NAME; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002814 case Store: op = STORE_NAME; break;
2815 case Del: op = DELETE_NAME; break;
2816 case AugLoad:
2817 case AugStore:
2818 break;
2819 case Param:
2820 default:
2821 PyErr_SetString(PyExc_SystemError,
2822 "param invalid for name variable");
2823 return 0;
2824 }
2825 break;
2826 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002827
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002828 assert(op);
2829 arg = compiler_add_o(c, dict, mangled);
2830 Py_DECREF(mangled);
2831 if (arg < 0)
2832 return 0;
2833 return compiler_addop_i(c, op, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002834}
2835
2836static int
2837compiler_boolop(struct compiler *c, expr_ty e)
2838{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002839 basicblock *end;
Victor Stinnerad9a0662013-11-19 22:23:20 +01002840 int jumpi;
2841 Py_ssize_t i, n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002842 asdl_seq *s;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002843
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002844 assert(e->kind == BoolOp_kind);
2845 if (e->v.BoolOp.op == And)
2846 jumpi = JUMP_IF_FALSE_OR_POP;
2847 else
2848 jumpi = JUMP_IF_TRUE_OR_POP;
2849 end = compiler_new_block(c);
2850 if (end == NULL)
2851 return 0;
2852 s = e->v.BoolOp.values;
2853 n = asdl_seq_LEN(s) - 1;
2854 assert(n >= 0);
2855 for (i = 0; i < n; ++i) {
2856 VISIT(c, expr, (expr_ty)asdl_seq_GET(s, i));
2857 ADDOP_JABS(c, jumpi, end);
2858 }
2859 VISIT(c, expr, (expr_ty)asdl_seq_GET(s, n));
2860 compiler_use_next_block(c, end);
2861 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002862}
2863
2864static int
2865compiler_list(struct compiler *c, expr_ty e)
2866{
Victor Stinnerad9a0662013-11-19 22:23:20 +01002867 Py_ssize_t n = asdl_seq_LEN(e->v.List.elts);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002868 if (e->v.List.ctx == Store) {
2869 int i, seen_star = 0;
2870 for (i = 0; i < n; i++) {
2871 expr_ty elt = asdl_seq_GET(e->v.List.elts, i);
2872 if (elt->kind == Starred_kind && !seen_star) {
2873 if ((i >= (1 << 8)) ||
2874 (n-i-1 >= (INT_MAX >> 8)))
2875 return compiler_error(c,
2876 "too many expressions in "
2877 "star-unpacking assignment");
2878 ADDOP_I(c, UNPACK_EX, (i + ((n-i-1) << 8)));
2879 seen_star = 1;
2880 asdl_seq_SET(e->v.List.elts, i, elt->v.Starred.value);
2881 } else if (elt->kind == Starred_kind) {
2882 return compiler_error(c,
2883 "two starred expressions in assignment");
2884 }
2885 }
2886 if (!seen_star) {
2887 ADDOP_I(c, UNPACK_SEQUENCE, n);
2888 }
2889 }
2890 VISIT_SEQ(c, expr, e->v.List.elts);
2891 if (e->v.List.ctx == Load) {
2892 ADDOP_I(c, BUILD_LIST, n);
2893 }
2894 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002895}
2896
2897static int
2898compiler_tuple(struct compiler *c, expr_ty e)
2899{
Victor Stinnerad9a0662013-11-19 22:23:20 +01002900 Py_ssize_t n = asdl_seq_LEN(e->v.Tuple.elts);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002901 if (e->v.Tuple.ctx == Store) {
2902 int i, seen_star = 0;
2903 for (i = 0; i < n; i++) {
2904 expr_ty elt = asdl_seq_GET(e->v.Tuple.elts, i);
2905 if (elt->kind == Starred_kind && !seen_star) {
2906 if ((i >= (1 << 8)) ||
2907 (n-i-1 >= (INT_MAX >> 8)))
2908 return compiler_error(c,
2909 "too many expressions in "
2910 "star-unpacking assignment");
2911 ADDOP_I(c, UNPACK_EX, (i + ((n-i-1) << 8)));
2912 seen_star = 1;
2913 asdl_seq_SET(e->v.Tuple.elts, i, elt->v.Starred.value);
2914 } else if (elt->kind == Starred_kind) {
2915 return compiler_error(c,
2916 "two starred expressions in assignment");
2917 }
2918 }
2919 if (!seen_star) {
2920 ADDOP_I(c, UNPACK_SEQUENCE, n);
2921 }
2922 }
2923 VISIT_SEQ(c, expr, e->v.Tuple.elts);
2924 if (e->v.Tuple.ctx == Load) {
2925 ADDOP_I(c, BUILD_TUPLE, n);
2926 }
2927 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002928}
2929
2930static int
2931compiler_compare(struct compiler *c, expr_ty e)
2932{
Victor Stinnerad9a0662013-11-19 22:23:20 +01002933 Py_ssize_t i, n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002934 basicblock *cleanup = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002935
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002936 /* XXX the logic can be cleaned up for 1 or multiple comparisons */
2937 VISIT(c, expr, e->v.Compare.left);
2938 n = asdl_seq_LEN(e->v.Compare.ops);
2939 assert(n > 0);
2940 if (n > 1) {
2941 cleanup = compiler_new_block(c);
2942 if (cleanup == NULL)
2943 return 0;
2944 VISIT(c, expr,
2945 (expr_ty)asdl_seq_GET(e->v.Compare.comparators, 0));
2946 }
2947 for (i = 1; i < n; i++) {
2948 ADDOP(c, DUP_TOP);
2949 ADDOP(c, ROT_THREE);
2950 ADDOP_I(c, COMPARE_OP,
2951 cmpop((cmpop_ty)(asdl_seq_GET(
2952 e->v.Compare.ops, i - 1))));
2953 ADDOP_JABS(c, JUMP_IF_FALSE_OR_POP, cleanup);
2954 NEXT_BLOCK(c);
2955 if (i < (n - 1))
2956 VISIT(c, expr,
2957 (expr_ty)asdl_seq_GET(e->v.Compare.comparators, i));
2958 }
2959 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, n - 1));
2960 ADDOP_I(c, COMPARE_OP,
2961 cmpop((cmpop_ty)(asdl_seq_GET(e->v.Compare.ops, n - 1))));
2962 if (n > 1) {
2963 basicblock *end = compiler_new_block(c);
2964 if (end == NULL)
2965 return 0;
2966 ADDOP_JREL(c, JUMP_FORWARD, end);
2967 compiler_use_next_block(c, cleanup);
2968 ADDOP(c, ROT_TWO);
2969 ADDOP(c, POP_TOP);
2970 compiler_use_next_block(c, end);
2971 }
2972 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002973}
2974
2975static int
2976compiler_call(struct compiler *c, expr_ty e)
2977{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002978 VISIT(c, expr, e->v.Call.func);
2979 return compiler_call_helper(c, 0,
2980 e->v.Call.args,
2981 e->v.Call.keywords,
2982 e->v.Call.starargs,
2983 e->v.Call.kwargs);
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002984}
2985
2986/* shared code between compiler_call and compiler_class */
2987static int
2988compiler_call_helper(struct compiler *c,
Victor Stinnerad9a0662013-11-19 22:23:20 +01002989 Py_ssize_t n, /* Args already pushed */
2990 asdl_seq *args,
2991 asdl_seq *keywords,
2992 expr_ty starargs,
2993 expr_ty kwargs)
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002994{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002995 int code = 0;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002996
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002997 n += asdl_seq_LEN(args);
2998 VISIT_SEQ(c, expr, args);
2999 if (keywords) {
3000 VISIT_SEQ(c, keyword, keywords);
3001 n |= asdl_seq_LEN(keywords) << 8;
3002 }
3003 if (starargs) {
3004 VISIT(c, expr, starargs);
3005 code |= 1;
3006 }
3007 if (kwargs) {
3008 VISIT(c, expr, kwargs);
3009 code |= 2;
3010 }
3011 switch (code) {
3012 case 0:
3013 ADDOP_I(c, CALL_FUNCTION, n);
3014 break;
3015 case 1:
3016 ADDOP_I(c, CALL_FUNCTION_VAR, n);
3017 break;
3018 case 2:
3019 ADDOP_I(c, CALL_FUNCTION_KW, n);
3020 break;
3021 case 3:
3022 ADDOP_I(c, CALL_FUNCTION_VAR_KW, n);
3023 break;
3024 }
3025 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003026}
3027
Nick Coghlan650f0d02007-04-15 12:05:43 +00003028
3029/* List and set comprehensions and generator expressions work by creating a
3030 nested function to perform the actual iteration. This means that the
3031 iteration variables don't leak into the current scope.
3032 The defined function is called immediately following its definition, with the
3033 result of that call being the result of the expression.
3034 The LC/SC version returns the populated container, while the GE version is
3035 flagged in symtable.c as a generator, so it returns the generator object
3036 when the function is called.
3037 This code *knows* that the loop cannot contain break, continue, or return,
3038 so it cheats and skips the SETUP_LOOP/POP_BLOCK steps used in normal loops.
3039
3040 Possible cleanups:
3041 - iterate over the generator sequence instead of using recursion
3042*/
3043
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003044static int
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003045compiler_comprehension_generator(struct compiler *c,
3046 asdl_seq *generators, int gen_index,
3047 expr_ty elt, expr_ty val, int type)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003048{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003049 /* generate code for the iterator, then each of the ifs,
3050 and then write to the element */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003051
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003052 comprehension_ty gen;
3053 basicblock *start, *anchor, *skip, *if_cleanup;
Victor Stinnerad9a0662013-11-19 22:23:20 +01003054 Py_ssize_t i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003055
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003056 start = compiler_new_block(c);
3057 skip = compiler_new_block(c);
3058 if_cleanup = compiler_new_block(c);
3059 anchor = compiler_new_block(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003060
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003061 if (start == NULL || skip == NULL || if_cleanup == NULL ||
3062 anchor == NULL)
3063 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003064
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003065 gen = (comprehension_ty)asdl_seq_GET(generators, gen_index);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003066
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003067 if (gen_index == 0) {
3068 /* Receive outermost iter as an implicit argument */
3069 c->u->u_argcount = 1;
3070 ADDOP_I(c, LOAD_FAST, 0);
3071 }
3072 else {
3073 /* Sub-iter - calculate on the fly */
3074 VISIT(c, expr, gen->iter);
3075 ADDOP(c, GET_ITER);
3076 }
3077 compiler_use_next_block(c, start);
3078 ADDOP_JREL(c, FOR_ITER, anchor);
3079 NEXT_BLOCK(c);
3080 VISIT(c, expr, gen->target);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003081
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003082 /* XXX this needs to be cleaned up...a lot! */
3083 n = asdl_seq_LEN(gen->ifs);
3084 for (i = 0; i < n; i++) {
3085 expr_ty e = (expr_ty)asdl_seq_GET(gen->ifs, i);
3086 VISIT(c, expr, e);
3087 ADDOP_JABS(c, POP_JUMP_IF_FALSE, if_cleanup);
3088 NEXT_BLOCK(c);
3089 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003090
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003091 if (++gen_index < asdl_seq_LEN(generators))
3092 if (!compiler_comprehension_generator(c,
3093 generators, gen_index,
3094 elt, val, type))
3095 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003096
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003097 /* only append after the last for generator */
3098 if (gen_index >= asdl_seq_LEN(generators)) {
3099 /* comprehension specific code */
3100 switch (type) {
3101 case COMP_GENEXP:
3102 VISIT(c, expr, elt);
3103 ADDOP(c, YIELD_VALUE);
3104 ADDOP(c, POP_TOP);
3105 break;
3106 case COMP_LISTCOMP:
3107 VISIT(c, expr, elt);
3108 ADDOP_I(c, LIST_APPEND, gen_index + 1);
3109 break;
3110 case COMP_SETCOMP:
3111 VISIT(c, expr, elt);
3112 ADDOP_I(c, SET_ADD, gen_index + 1);
3113 break;
3114 case COMP_DICTCOMP:
3115 /* With 'd[k] = v', v is evaluated before k, so we do
3116 the same. */
3117 VISIT(c, expr, val);
3118 VISIT(c, expr, elt);
3119 ADDOP_I(c, MAP_ADD, gen_index + 1);
3120 break;
3121 default:
3122 return 0;
3123 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003124
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003125 compiler_use_next_block(c, skip);
3126 }
3127 compiler_use_next_block(c, if_cleanup);
3128 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
3129 compiler_use_next_block(c, anchor);
3130
3131 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003132}
3133
3134static int
Nick Coghlan650f0d02007-04-15 12:05:43 +00003135compiler_comprehension(struct compiler *c, expr_ty e, int type, identifier name,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003136 asdl_seq *generators, expr_ty elt, expr_ty val)
Nick Coghlan650f0d02007-04-15 12:05:43 +00003137{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003138 PyCodeObject *co = NULL;
3139 expr_ty outermost_iter;
Antoine Pitrou86a36b52011-11-25 18:56:07 +01003140 PyObject *qualname = NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00003141
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003142 outermost_iter = ((comprehension_ty)
3143 asdl_seq_GET(generators, 0))->iter;
Nick Coghlan650f0d02007-04-15 12:05:43 +00003144
Antoine Pitrou86a36b52011-11-25 18:56:07 +01003145 if (!compiler_enter_scope(c, name, COMPILER_SCOPE_COMPREHENSION,
3146 (void *)e, e->lineno))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003147 goto error;
Nick Coghlan650f0d02007-04-15 12:05:43 +00003148
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003149 if (type != COMP_GENEXP) {
3150 int op;
3151 switch (type) {
3152 case COMP_LISTCOMP:
3153 op = BUILD_LIST;
3154 break;
3155 case COMP_SETCOMP:
3156 op = BUILD_SET;
3157 break;
3158 case COMP_DICTCOMP:
3159 op = BUILD_MAP;
3160 break;
3161 default:
3162 PyErr_Format(PyExc_SystemError,
3163 "unknown comprehension type %d", type);
3164 goto error_in_scope;
3165 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00003166
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003167 ADDOP_I(c, op, 0);
3168 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00003169
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003170 if (!compiler_comprehension_generator(c, generators, 0, elt,
3171 val, type))
3172 goto error_in_scope;
Nick Coghlan650f0d02007-04-15 12:05:43 +00003173
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003174 if (type != COMP_GENEXP) {
3175 ADDOP(c, RETURN_VALUE);
3176 }
3177
3178 co = assemble(c, 1);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04003179 qualname = c->u->u_qualname;
3180 Py_INCREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003181 compiler_exit_scope(c);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04003182 if (co == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003183 goto error;
3184
Antoine Pitrou86a36b52011-11-25 18:56:07 +01003185 if (!compiler_make_closure(c, co, 0, qualname))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003186 goto error;
Antoine Pitrou86a36b52011-11-25 18:56:07 +01003187 Py_DECREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003188 Py_DECREF(co);
3189
3190 VISIT(c, expr, outermost_iter);
3191 ADDOP(c, GET_ITER);
3192 ADDOP_I(c, CALL_FUNCTION, 1);
3193 return 1;
Nick Coghlan650f0d02007-04-15 12:05:43 +00003194error_in_scope:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003195 compiler_exit_scope(c);
Nick Coghlan650f0d02007-04-15 12:05:43 +00003196error:
Antoine Pitrou86a36b52011-11-25 18:56:07 +01003197 Py_XDECREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003198 Py_XDECREF(co);
3199 return 0;
Nick Coghlan650f0d02007-04-15 12:05:43 +00003200}
3201
3202static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003203compiler_genexp(struct compiler *c, expr_ty e)
3204{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003205 static identifier name;
3206 if (!name) {
3207 name = PyUnicode_FromString("<genexpr>");
3208 if (!name)
3209 return 0;
3210 }
3211 assert(e->kind == GeneratorExp_kind);
3212 return compiler_comprehension(c, e, COMP_GENEXP, name,
3213 e->v.GeneratorExp.generators,
3214 e->v.GeneratorExp.elt, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003215}
3216
3217static int
Nick Coghlan650f0d02007-04-15 12:05:43 +00003218compiler_listcomp(struct compiler *c, expr_ty e)
3219{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003220 static identifier name;
3221 if (!name) {
3222 name = PyUnicode_FromString("<listcomp>");
3223 if (!name)
3224 return 0;
3225 }
3226 assert(e->kind == ListComp_kind);
3227 return compiler_comprehension(c, e, COMP_LISTCOMP, name,
3228 e->v.ListComp.generators,
3229 e->v.ListComp.elt, NULL);
Nick Coghlan650f0d02007-04-15 12:05:43 +00003230}
3231
3232static int
3233compiler_setcomp(struct compiler *c, expr_ty e)
3234{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003235 static identifier name;
3236 if (!name) {
3237 name = PyUnicode_FromString("<setcomp>");
3238 if (!name)
3239 return 0;
3240 }
3241 assert(e->kind == SetComp_kind);
3242 return compiler_comprehension(c, e, COMP_SETCOMP, name,
3243 e->v.SetComp.generators,
3244 e->v.SetComp.elt, NULL);
Guido van Rossum992d4a32007-07-11 13:09:30 +00003245}
3246
3247
3248static int
3249compiler_dictcomp(struct compiler *c, expr_ty e)
3250{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003251 static identifier name;
3252 if (!name) {
3253 name = PyUnicode_FromString("<dictcomp>");
3254 if (!name)
3255 return 0;
3256 }
3257 assert(e->kind == DictComp_kind);
3258 return compiler_comprehension(c, e, COMP_DICTCOMP, name,
3259 e->v.DictComp.generators,
3260 e->v.DictComp.key, e->v.DictComp.value);
Nick Coghlan650f0d02007-04-15 12:05:43 +00003261}
3262
3263
3264static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003265compiler_visit_keyword(struct compiler *c, keyword_ty k)
3266{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003267 ADDOP_O(c, LOAD_CONST, k->arg, consts);
3268 VISIT(c, expr, k->value);
3269 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003270}
3271
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003272/* Test whether expression is constant. For constants, report
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003273 whether they are true or false.
3274
3275 Return values: 1 for true, 0 for false, -1 for non-constant.
3276 */
3277
3278static int
Georg Brandl8334fd92010-12-04 10:26:46 +00003279expr_constant(struct compiler *c, expr_ty e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003280{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003281 char *id;
3282 switch (e->kind) {
3283 case Ellipsis_kind:
3284 return 1;
3285 case Num_kind:
3286 return PyObject_IsTrue(e->v.Num.n);
3287 case Str_kind:
3288 return PyObject_IsTrue(e->v.Str.s);
3289 case Name_kind:
3290 /* optimize away names that can't be reassigned */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003291 id = PyUnicode_AsUTF8(e->v.Name.id);
Benjamin Peterson442f2092012-12-06 17:41:04 -05003292 if (id && strcmp(id, "__debug__") == 0)
3293 return !c->c_optimize;
3294 return -1;
3295 case NameConstant_kind: {
3296 PyObject *o = e->v.NameConstant.value;
3297 if (o == Py_None)
3298 return 0;
3299 else if (o == Py_True)
3300 return 1;
3301 else if (o == Py_False)
3302 return 0;
3303 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003304 default:
3305 return -1;
3306 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003307}
3308
Guido van Rossumc2e20742006-02-27 22:32:47 +00003309/*
3310 Implements the with statement from PEP 343.
3311
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003312 The semantics outlined in that PEP are as follows:
Guido van Rossumc2e20742006-02-27 22:32:47 +00003313
3314 with EXPR as VAR:
3315 BLOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003316
Guido van Rossumc2e20742006-02-27 22:32:47 +00003317 It is implemented roughly as:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003318
Thomas Wouters477c8d52006-05-27 19:21:47 +00003319 context = EXPR
Guido van Rossumc2e20742006-02-27 22:32:47 +00003320 exit = context.__exit__ # not calling it
3321 value = context.__enter__()
3322 try:
3323 VAR = value # if VAR present in the syntax
3324 BLOCK
3325 finally:
3326 if an exception was raised:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003327 exc = copy of (exception, instance, traceback)
Guido van Rossumc2e20742006-02-27 22:32:47 +00003328 else:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003329 exc = (None, None, None)
Guido van Rossumc2e20742006-02-27 22:32:47 +00003330 exit(*exc)
3331 */
3332static int
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003333compiler_with(struct compiler *c, stmt_ty s, int pos)
Guido van Rossumc2e20742006-02-27 22:32:47 +00003334{
Guido van Rossumc2e20742006-02-27 22:32:47 +00003335 basicblock *block, *finally;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003336 withitem_ty item = asdl_seq_GET(s->v.With.items, pos);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003337
3338 assert(s->kind == With_kind);
3339
Guido van Rossumc2e20742006-02-27 22:32:47 +00003340 block = compiler_new_block(c);
3341 finally = compiler_new_block(c);
3342 if (!block || !finally)
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00003343 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003344
Thomas Wouters477c8d52006-05-27 19:21:47 +00003345 /* Evaluate EXPR */
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003346 VISIT(c, expr, item->context_expr);
Benjamin Peterson876b2f22009-06-28 03:18:59 +00003347 ADDOP_JREL(c, SETUP_WITH, finally);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003348
Benjamin Peterson876b2f22009-06-28 03:18:59 +00003349 /* SETUP_WITH pushes a finally block. */
Guido van Rossumc2e20742006-02-27 22:32:47 +00003350 compiler_use_next_block(c, block);
3351 if (!compiler_push_fblock(c, FINALLY_TRY, block)) {
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00003352 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003353 }
3354
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003355 if (item->optional_vars) {
3356 VISIT(c, expr, item->optional_vars);
Benjamin Peterson876b2f22009-06-28 03:18:59 +00003357 }
3358 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003359 /* Discard result from context.__enter__() */
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00003360 ADDOP(c, POP_TOP);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003361 }
3362
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003363 pos++;
3364 if (pos == asdl_seq_LEN(s->v.With.items))
3365 /* BLOCK code */
3366 VISIT_SEQ(c, stmt, s->v.With.body)
3367 else if (!compiler_with(c, s, pos))
3368 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003369
3370 /* End of try block; start the finally block */
3371 ADDOP(c, POP_BLOCK);
3372 compiler_pop_fblock(c, FINALLY_TRY, block);
3373
3374 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3375 compiler_use_next_block(c, finally);
3376 if (!compiler_push_fblock(c, FINALLY_END, finally))
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00003377 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003378
Christian Heimesdd15f6c2008-03-16 00:07:10 +00003379 /* Finally block starts; context.__exit__ is on the stack under
3380 the exception or return information. Just issue our magic
3381 opcode. */
Guido van Rossumc2e20742006-02-27 22:32:47 +00003382 ADDOP(c, WITH_CLEANUP);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003383
3384 /* Finally block ends. */
3385 ADDOP(c, END_FINALLY);
3386 compiler_pop_fblock(c, FINALLY_END, finally);
3387 return 1;
3388}
3389
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003390static int
3391compiler_visit_expr(struct compiler *c, expr_ty e)
3392{
Victor Stinnerad9a0662013-11-19 22:23:20 +01003393 Py_ssize_t i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003394
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003395 /* If expr e has a different line number than the last expr/stmt,
3396 set a new line number for the next instruction.
3397 */
3398 if (e->lineno > c->u->u_lineno) {
3399 c->u->u_lineno = e->lineno;
3400 c->u->u_lineno_set = 0;
3401 }
Benjamin Petersond4efd9e2010-09-20 23:02:10 +00003402 /* Updating the column offset is always harmless. */
3403 c->u->u_col_offset = e->col_offset;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003404 switch (e->kind) {
3405 case BoolOp_kind:
3406 return compiler_boolop(c, e);
3407 case BinOp_kind:
3408 VISIT(c, expr, e->v.BinOp.left);
3409 VISIT(c, expr, e->v.BinOp.right);
3410 ADDOP(c, binop(c, e->v.BinOp.op));
3411 break;
3412 case UnaryOp_kind:
3413 VISIT(c, expr, e->v.UnaryOp.operand);
3414 ADDOP(c, unaryop(e->v.UnaryOp.op));
3415 break;
3416 case Lambda_kind:
3417 return compiler_lambda(c, e);
3418 case IfExp_kind:
3419 return compiler_ifexp(c, e);
3420 case Dict_kind:
3421 n = asdl_seq_LEN(e->v.Dict.values);
Victor Stinnerad9a0662013-11-19 22:23:20 +01003422 /* BUILD_MAP parameter is only used to preallocate the dictionary,
3423 it doesn't need to be exact */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003424 ADDOP_I(c, BUILD_MAP, (n>0xFFFF ? 0xFFFF : n));
3425 for (i = 0; i < n; i++) {
3426 VISIT(c, expr,
3427 (expr_ty)asdl_seq_GET(e->v.Dict.values, i));
3428 VISIT(c, expr,
3429 (expr_ty)asdl_seq_GET(e->v.Dict.keys, i));
3430 ADDOP(c, STORE_MAP);
3431 }
3432 break;
3433 case Set_kind:
3434 n = asdl_seq_LEN(e->v.Set.elts);
3435 VISIT_SEQ(c, expr, e->v.Set.elts);
3436 ADDOP_I(c, BUILD_SET, n);
3437 break;
3438 case GeneratorExp_kind:
3439 return compiler_genexp(c, e);
3440 case ListComp_kind:
3441 return compiler_listcomp(c, e);
3442 case SetComp_kind:
3443 return compiler_setcomp(c, e);
3444 case DictComp_kind:
3445 return compiler_dictcomp(c, e);
3446 case Yield_kind:
3447 if (c->u->u_ste->ste_type != FunctionBlock)
3448 return compiler_error(c, "'yield' outside function");
Mark Dickinsonded35ae2012-11-25 14:36:26 +00003449 if (e->v.Yield.value) {
3450 VISIT(c, expr, e->v.Yield.value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003451 }
3452 else {
3453 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3454 }
Mark Dickinsonded35ae2012-11-25 14:36:26 +00003455 ADDOP(c, YIELD_VALUE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003456 break;
Mark Dickinsonded35ae2012-11-25 14:36:26 +00003457 case YieldFrom_kind:
3458 if (c->u->u_ste->ste_type != FunctionBlock)
3459 return compiler_error(c, "'yield' outside function");
3460 VISIT(c, expr, e->v.YieldFrom.value);
3461 ADDOP(c, GET_ITER);
3462 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3463 ADDOP(c, YIELD_FROM);
3464 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003465 case Compare_kind:
3466 return compiler_compare(c, e);
3467 case Call_kind:
3468 return compiler_call(c, e);
3469 case Num_kind:
3470 ADDOP_O(c, LOAD_CONST, e->v.Num.n, consts);
3471 break;
3472 case Str_kind:
3473 ADDOP_O(c, LOAD_CONST, e->v.Str.s, consts);
3474 break;
3475 case Bytes_kind:
3476 ADDOP_O(c, LOAD_CONST, e->v.Bytes.s, consts);
3477 break;
3478 case Ellipsis_kind:
3479 ADDOP_O(c, LOAD_CONST, Py_Ellipsis, consts);
3480 break;
Benjamin Peterson442f2092012-12-06 17:41:04 -05003481 case NameConstant_kind:
3482 ADDOP_O(c, LOAD_CONST, e->v.NameConstant.value, consts);
3483 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003484 /* The following exprs can be assignment targets. */
3485 case Attribute_kind:
3486 if (e->v.Attribute.ctx != AugStore)
3487 VISIT(c, expr, e->v.Attribute.value);
3488 switch (e->v.Attribute.ctx) {
3489 case AugLoad:
3490 ADDOP(c, DUP_TOP);
3491 /* Fall through to load */
3492 case Load:
3493 ADDOP_NAME(c, LOAD_ATTR, e->v.Attribute.attr, names);
3494 break;
3495 case AugStore:
3496 ADDOP(c, ROT_TWO);
3497 /* Fall through to save */
3498 case Store:
3499 ADDOP_NAME(c, STORE_ATTR, e->v.Attribute.attr, names);
3500 break;
3501 case Del:
3502 ADDOP_NAME(c, DELETE_ATTR, e->v.Attribute.attr, names);
3503 break;
3504 case Param:
3505 default:
3506 PyErr_SetString(PyExc_SystemError,
3507 "param invalid in attribute expression");
3508 return 0;
3509 }
3510 break;
3511 case Subscript_kind:
3512 switch (e->v.Subscript.ctx) {
3513 case AugLoad:
3514 VISIT(c, expr, e->v.Subscript.value);
3515 VISIT_SLICE(c, e->v.Subscript.slice, AugLoad);
3516 break;
3517 case Load:
3518 VISIT(c, expr, e->v.Subscript.value);
3519 VISIT_SLICE(c, e->v.Subscript.slice, Load);
3520 break;
3521 case AugStore:
3522 VISIT_SLICE(c, e->v.Subscript.slice, AugStore);
3523 break;
3524 case Store:
3525 VISIT(c, expr, e->v.Subscript.value);
3526 VISIT_SLICE(c, e->v.Subscript.slice, Store);
3527 break;
3528 case Del:
3529 VISIT(c, expr, e->v.Subscript.value);
3530 VISIT_SLICE(c, e->v.Subscript.slice, Del);
3531 break;
3532 case Param:
3533 default:
3534 PyErr_SetString(PyExc_SystemError,
3535 "param invalid in subscript expression");
3536 return 0;
3537 }
3538 break;
3539 case Starred_kind:
3540 switch (e->v.Starred.ctx) {
3541 case Store:
3542 /* In all legitimate cases, the Starred node was already replaced
3543 * by compiler_list/compiler_tuple. XXX: is that okay? */
3544 return compiler_error(c,
3545 "starred assignment target must be in a list or tuple");
3546 default:
3547 return compiler_error(c,
3548 "can use starred expression only as assignment target");
3549 }
3550 break;
3551 case Name_kind:
3552 return compiler_nameop(c, e->v.Name.id, e->v.Name.ctx);
3553 /* child nodes of List and Tuple will have expr_context set */
3554 case List_kind:
3555 return compiler_list(c, e);
3556 case Tuple_kind:
3557 return compiler_tuple(c, e);
3558 }
3559 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003560}
3561
3562static int
3563compiler_augassign(struct compiler *c, stmt_ty s)
3564{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003565 expr_ty e = s->v.AugAssign.target;
3566 expr_ty auge;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003567
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003568 assert(s->kind == AugAssign_kind);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003569
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003570 switch (e->kind) {
3571 case Attribute_kind:
3572 auge = Attribute(e->v.Attribute.value, e->v.Attribute.attr,
3573 AugLoad, e->lineno, e->col_offset, c->c_arena);
3574 if (auge == NULL)
3575 return 0;
3576 VISIT(c, expr, auge);
3577 VISIT(c, expr, s->v.AugAssign.value);
3578 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
3579 auge->v.Attribute.ctx = AugStore;
3580 VISIT(c, expr, auge);
3581 break;
3582 case Subscript_kind:
3583 auge = Subscript(e->v.Subscript.value, e->v.Subscript.slice,
3584 AugLoad, e->lineno, e->col_offset, c->c_arena);
3585 if (auge == NULL)
3586 return 0;
3587 VISIT(c, expr, auge);
3588 VISIT(c, expr, s->v.AugAssign.value);
3589 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
3590 auge->v.Subscript.ctx = AugStore;
3591 VISIT(c, expr, auge);
3592 break;
3593 case Name_kind:
3594 if (!compiler_nameop(c, e->v.Name.id, Load))
3595 return 0;
3596 VISIT(c, expr, s->v.AugAssign.value);
3597 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
3598 return compiler_nameop(c, e->v.Name.id, Store);
3599 default:
3600 PyErr_Format(PyExc_SystemError,
3601 "invalid node type (%d) for augmented assignment",
3602 e->kind);
3603 return 0;
3604 }
3605 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003606}
3607
3608static int
3609compiler_push_fblock(struct compiler *c, enum fblocktype t, basicblock *b)
3610{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003611 struct fblockinfo *f;
3612 if (c->u->u_nfblocks >= CO_MAXBLOCKS) {
3613 PyErr_SetString(PyExc_SystemError,
3614 "too many statically nested blocks");
3615 return 0;
3616 }
3617 f = &c->u->u_fblock[c->u->u_nfblocks++];
3618 f->fb_type = t;
3619 f->fb_block = b;
3620 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003621}
3622
3623static void
3624compiler_pop_fblock(struct compiler *c, enum fblocktype t, basicblock *b)
3625{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003626 struct compiler_unit *u = c->u;
3627 assert(u->u_nfblocks > 0);
3628 u->u_nfblocks--;
3629 assert(u->u_fblock[u->u_nfblocks].fb_type == t);
3630 assert(u->u_fblock[u->u_nfblocks].fb_block == b);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003631}
3632
Thomas Wouters89f507f2006-12-13 04:49:30 +00003633static int
3634compiler_in_loop(struct compiler *c) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003635 int i;
3636 struct compiler_unit *u = c->u;
3637 for (i = 0; i < u->u_nfblocks; ++i) {
3638 if (u->u_fblock[i].fb_type == LOOP)
3639 return 1;
3640 }
3641 return 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003642}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003643/* Raises a SyntaxError and returns 0.
3644 If something goes wrong, a different exception may be raised.
3645*/
3646
3647static int
3648compiler_error(struct compiler *c, const char *errstr)
3649{
Benjamin Peterson43b06862011-05-27 09:08:01 -05003650 PyObject *loc;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003651 PyObject *u = NULL, *v = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003652
Victor Stinner14e461d2013-08-26 22:28:21 +02003653 loc = PyErr_ProgramTextObject(c->c_filename, c->u->u_lineno);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003654 if (!loc) {
3655 Py_INCREF(Py_None);
3656 loc = Py_None;
3657 }
Victor Stinner14e461d2013-08-26 22:28:21 +02003658 u = Py_BuildValue("(OiiO)", c->c_filename, c->u->u_lineno,
Benjamin Petersond4efd9e2010-09-20 23:02:10 +00003659 c->u->u_col_offset, loc);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003660 if (!u)
3661 goto exit;
3662 v = Py_BuildValue("(zO)", errstr, u);
3663 if (!v)
3664 goto exit;
3665 PyErr_SetObject(PyExc_SyntaxError, v);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003666 exit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003667 Py_DECREF(loc);
3668 Py_XDECREF(u);
3669 Py_XDECREF(v);
3670 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003671}
3672
3673static int
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003674compiler_handle_subscr(struct compiler *c, const char *kind,
3675 expr_context_ty ctx)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003676{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003677 int op = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003678
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003679 /* XXX this code is duplicated */
3680 switch (ctx) {
3681 case AugLoad: /* fall through to Load */
3682 case Load: op = BINARY_SUBSCR; break;
3683 case AugStore:/* fall through to Store */
3684 case Store: op = STORE_SUBSCR; break;
3685 case Del: op = DELETE_SUBSCR; break;
3686 case Param:
3687 PyErr_Format(PyExc_SystemError,
3688 "invalid %s kind %d in subscript\n",
3689 kind, ctx);
3690 return 0;
3691 }
3692 if (ctx == AugLoad) {
Antoine Pitrou74a69fa2010-09-04 18:43:52 +00003693 ADDOP(c, DUP_TOP_TWO);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003694 }
3695 else if (ctx == AugStore) {
3696 ADDOP(c, ROT_THREE);
3697 }
3698 ADDOP(c, op);
3699 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003700}
3701
3702static int
3703compiler_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)
3704{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003705 int n = 2;
3706 assert(s->kind == Slice_kind);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003707
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003708 /* only handles the cases where BUILD_SLICE is emitted */
3709 if (s->v.Slice.lower) {
3710 VISIT(c, expr, s->v.Slice.lower);
3711 }
3712 else {
3713 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3714 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003715
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003716 if (s->v.Slice.upper) {
3717 VISIT(c, expr, s->v.Slice.upper);
3718 }
3719 else {
3720 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3721 }
3722
3723 if (s->v.Slice.step) {
3724 n++;
3725 VISIT(c, expr, s->v.Slice.step);
3726 }
3727 ADDOP_I(c, BUILD_SLICE, n);
3728 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003729}
3730
3731static int
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003732compiler_visit_nested_slice(struct compiler *c, slice_ty s,
3733 expr_context_ty ctx)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003734{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003735 switch (s->kind) {
3736 case Slice_kind:
3737 return compiler_slice(c, s, ctx);
3738 case Index_kind:
3739 VISIT(c, expr, s->v.Index.value);
3740 break;
3741 case ExtSlice_kind:
3742 default:
3743 PyErr_SetString(PyExc_SystemError,
3744 "extended slice invalid in nested slice");
3745 return 0;
3746 }
3747 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003748}
3749
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003750static int
3751compiler_visit_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)
3752{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003753 char * kindname = NULL;
3754 switch (s->kind) {
3755 case Index_kind:
3756 kindname = "index";
3757 if (ctx != AugStore) {
3758 VISIT(c, expr, s->v.Index.value);
3759 }
3760 break;
3761 case Slice_kind:
3762 kindname = "slice";
3763 if (ctx != AugStore) {
3764 if (!compiler_slice(c, s, ctx))
3765 return 0;
3766 }
3767 break;
3768 case ExtSlice_kind:
3769 kindname = "extended slice";
3770 if (ctx != AugStore) {
Victor Stinnerad9a0662013-11-19 22:23:20 +01003771 Py_ssize_t i, n = asdl_seq_LEN(s->v.ExtSlice.dims);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003772 for (i = 0; i < n; i++) {
3773 slice_ty sub = (slice_ty)asdl_seq_GET(
3774 s->v.ExtSlice.dims, i);
3775 if (!compiler_visit_nested_slice(c, sub, ctx))
3776 return 0;
3777 }
3778 ADDOP_I(c, BUILD_TUPLE, n);
3779 }
3780 break;
3781 default:
3782 PyErr_Format(PyExc_SystemError,
3783 "invalid subscript kind %d", s->kind);
3784 return 0;
3785 }
3786 return compiler_handle_subscr(c, kindname, ctx);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003787}
3788
Thomas Wouters89f507f2006-12-13 04:49:30 +00003789/* End of the compiler section, beginning of the assembler section */
3790
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003791/* do depth-first search of basic block graph, starting with block.
3792 post records the block indices in post-order.
3793
3794 XXX must handle implicit jumps from one block to next
3795*/
3796
Thomas Wouters89f507f2006-12-13 04:49:30 +00003797struct assembler {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003798 PyObject *a_bytecode; /* string containing bytecode */
3799 int a_offset; /* offset into bytecode */
3800 int a_nblocks; /* number of reachable blocks */
3801 basicblock **a_postorder; /* list of blocks in dfs postorder */
3802 PyObject *a_lnotab; /* string containing lnotab */
3803 int a_lnotab_off; /* offset into lnotab */
3804 int a_lineno; /* last lineno of emitted instruction */
3805 int a_lineno_off; /* bytecode offset of last lineno */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003806};
3807
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003808static void
3809dfs(struct compiler *c, basicblock *b, struct assembler *a)
3810{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003811 int i;
3812 struct instr *instr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003813
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003814 if (b->b_seen)
3815 return;
3816 b->b_seen = 1;
3817 if (b->b_next != NULL)
3818 dfs(c, b->b_next, a);
3819 for (i = 0; i < b->b_iused; i++) {
3820 instr = &b->b_instr[i];
3821 if (instr->i_jrel || instr->i_jabs)
3822 dfs(c, instr->i_target, a);
3823 }
3824 a->a_postorder[a->a_nblocks++] = b;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003825}
3826
Neal Norwitz2744c6c2005-11-13 01:08:38 +00003827static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003828stackdepth_walk(struct compiler *c, basicblock *b, int depth, int maxdepth)
3829{
Larry Hastings3a907972013-11-23 14:49:22 -08003830 int i, target_depth, effect;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003831 struct instr *instr;
3832 if (b->b_seen || b->b_startdepth >= depth)
3833 return maxdepth;
3834 b->b_seen = 1;
3835 b->b_startdepth = depth;
3836 for (i = 0; i < b->b_iused; i++) {
3837 instr = &b->b_instr[i];
Larry Hastings3a907972013-11-23 14:49:22 -08003838 effect = PyCompile_OpcodeStackEffect(instr->i_opcode, instr->i_oparg);
3839 if (effect == PY_INVALID_STACK_EFFECT) {
3840 fprintf(stderr, "opcode = %d\n", instr->i_opcode);
3841 Py_FatalError("PyCompile_OpcodeStackEffect()");
3842 }
3843 depth += effect;
3844
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003845 if (depth > maxdepth)
3846 maxdepth = depth;
3847 assert(depth >= 0); /* invalid code or bug in stackdepth() */
3848 if (instr->i_jrel || instr->i_jabs) {
3849 target_depth = depth;
3850 if (instr->i_opcode == FOR_ITER) {
3851 target_depth = depth-2;
3852 } else if (instr->i_opcode == SETUP_FINALLY ||
3853 instr->i_opcode == SETUP_EXCEPT) {
3854 target_depth = depth+3;
3855 if (target_depth > maxdepth)
3856 maxdepth = target_depth;
3857 }
3858 maxdepth = stackdepth_walk(c, instr->i_target,
3859 target_depth, maxdepth);
3860 if (instr->i_opcode == JUMP_ABSOLUTE ||
3861 instr->i_opcode == JUMP_FORWARD) {
3862 goto out; /* remaining code is dead */
3863 }
3864 }
3865 }
3866 if (b->b_next)
3867 maxdepth = stackdepth_walk(c, b->b_next, depth, maxdepth);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003868out:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003869 b->b_seen = 0;
3870 return maxdepth;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003871}
3872
3873/* Find the flow path that needs the largest stack. We assume that
3874 * cycles in the flow graph have no net effect on the stack depth.
3875 */
3876static int
3877stackdepth(struct compiler *c)
3878{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003879 basicblock *b, *entryblock;
3880 entryblock = NULL;
3881 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
3882 b->b_seen = 0;
3883 b->b_startdepth = INT_MIN;
3884 entryblock = b;
3885 }
3886 if (!entryblock)
3887 return 0;
3888 return stackdepth_walk(c, entryblock, 0, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003889}
3890
3891static int
3892assemble_init(struct assembler *a, int nblocks, int firstlineno)
3893{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003894 memset(a, 0, sizeof(struct assembler));
3895 a->a_lineno = firstlineno;
3896 a->a_bytecode = PyBytes_FromStringAndSize(NULL, DEFAULT_CODE_SIZE);
3897 if (!a->a_bytecode)
3898 return 0;
3899 a->a_lnotab = PyBytes_FromStringAndSize(NULL, DEFAULT_LNOTAB_SIZE);
3900 if (!a->a_lnotab)
3901 return 0;
Christian Heimes724b8282013-12-04 08:42:46 +01003902 if ((size_t)nblocks > PY_SIZE_MAX / sizeof(basicblock *)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003903 PyErr_NoMemory();
3904 return 0;
3905 }
3906 a->a_postorder = (basicblock **)PyObject_Malloc(
3907 sizeof(basicblock *) * nblocks);
3908 if (!a->a_postorder) {
3909 PyErr_NoMemory();
3910 return 0;
3911 }
3912 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003913}
3914
3915static void
3916assemble_free(struct assembler *a)
3917{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003918 Py_XDECREF(a->a_bytecode);
3919 Py_XDECREF(a->a_lnotab);
3920 if (a->a_postorder)
3921 PyObject_Free(a->a_postorder);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003922}
3923
3924/* Return the size of a basic block in bytes. */
3925
3926static int
3927instrsize(struct instr *instr)
3928{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003929 if (!instr->i_hasarg)
3930 return 1; /* 1 byte for the opcode*/
3931 if (instr->i_oparg > 0xffff)
3932 return 6; /* 1 (opcode) + 1 (EXTENDED_ARG opcode) + 2 (oparg) + 2(oparg extended) */
3933 return 3; /* 1 (opcode) + 2 (oparg) */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003934}
3935
3936static int
3937blocksize(basicblock *b)
3938{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003939 int i;
3940 int size = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003941
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003942 for (i = 0; i < b->b_iused; i++)
3943 size += instrsize(&b->b_instr[i]);
3944 return size;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003945}
3946
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00003947/* Appends a pair to the end of the line number table, a_lnotab, representing
3948 the instruction's bytecode offset and line number. See
3949 Objects/lnotab_notes.txt for the description of the line number table. */
Tim Peters2a7f3842001-06-09 09:26:21 +00003950
Guido van Rossumf68d8e52001-04-14 17:55:09 +00003951static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003952assemble_lnotab(struct assembler *a, struct instr *i)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003953{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003954 int d_bytecode, d_lineno;
Victor Stinnerad9a0662013-11-19 22:23:20 +01003955 Py_ssize_t len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003956 unsigned char *lnotab;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003957
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003958 d_bytecode = a->a_offset - a->a_lineno_off;
3959 d_lineno = i->i_lineno - a->a_lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003960
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003961 assert(d_bytecode >= 0);
3962 assert(d_lineno >= 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003963
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003964 if(d_bytecode == 0 && d_lineno == 0)
3965 return 1;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003966
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003967 if (d_bytecode > 255) {
3968 int j, nbytes, ncodes = d_bytecode / 255;
3969 nbytes = a->a_lnotab_off + 2 * ncodes;
3970 len = PyBytes_GET_SIZE(a->a_lnotab);
3971 if (nbytes >= len) {
3972 if ((len <= INT_MAX / 2) && (len * 2 < nbytes))
3973 len = nbytes;
3974 else if (len <= INT_MAX / 2)
3975 len *= 2;
3976 else {
3977 PyErr_NoMemory();
3978 return 0;
3979 }
3980 if (_PyBytes_Resize(&a->a_lnotab, len) < 0)
3981 return 0;
3982 }
3983 lnotab = (unsigned char *)
3984 PyBytes_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
3985 for (j = 0; j < ncodes; j++) {
3986 *lnotab++ = 255;
3987 *lnotab++ = 0;
3988 }
3989 d_bytecode -= ncodes * 255;
3990 a->a_lnotab_off += ncodes * 2;
3991 }
3992 assert(d_bytecode <= 255);
3993 if (d_lineno > 255) {
3994 int j, nbytes, ncodes = d_lineno / 255;
3995 nbytes = a->a_lnotab_off + 2 * ncodes;
3996 len = PyBytes_GET_SIZE(a->a_lnotab);
3997 if (nbytes >= len) {
3998 if ((len <= INT_MAX / 2) && len * 2 < nbytes)
3999 len = nbytes;
4000 else if (len <= INT_MAX / 2)
4001 len *= 2;
4002 else {
4003 PyErr_NoMemory();
4004 return 0;
4005 }
4006 if (_PyBytes_Resize(&a->a_lnotab, len) < 0)
4007 return 0;
4008 }
4009 lnotab = (unsigned char *)
4010 PyBytes_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
4011 *lnotab++ = d_bytecode;
4012 *lnotab++ = 255;
4013 d_bytecode = 0;
4014 for (j = 1; j < ncodes; j++) {
4015 *lnotab++ = 0;
4016 *lnotab++ = 255;
4017 }
4018 d_lineno -= ncodes * 255;
4019 a->a_lnotab_off += ncodes * 2;
4020 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004021
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004022 len = PyBytes_GET_SIZE(a->a_lnotab);
4023 if (a->a_lnotab_off + 2 >= len) {
4024 if (_PyBytes_Resize(&a->a_lnotab, len * 2) < 0)
4025 return 0;
4026 }
4027 lnotab = (unsigned char *)
4028 PyBytes_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
Tim Peters51e26512001-09-07 08:45:55 +00004029
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004030 a->a_lnotab_off += 2;
4031 if (d_bytecode) {
4032 *lnotab++ = d_bytecode;
Victor Stinner4f2dab52011-05-27 16:46:51 +02004033 *lnotab++ = d_lineno;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004034 }
4035 else { /* First line of a block; def stmt, etc. */
4036 *lnotab++ = 0;
Victor Stinner4f2dab52011-05-27 16:46:51 +02004037 *lnotab++ = d_lineno;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004038 }
4039 a->a_lineno = i->i_lineno;
4040 a->a_lineno_off = a->a_offset;
4041 return 1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004042}
4043
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004044/* assemble_emit()
4045 Extend the bytecode with a new instruction.
4046 Update lnotab if necessary.
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004047*/
4048
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004049static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004050assemble_emit(struct assembler *a, struct instr *i)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004051{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004052 int size, arg = 0, ext = 0;
4053 Py_ssize_t len = PyBytes_GET_SIZE(a->a_bytecode);
4054 char *code;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004055
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004056 size = instrsize(i);
4057 if (i->i_hasarg) {
4058 arg = i->i_oparg;
4059 ext = arg >> 16;
4060 }
4061 if (i->i_lineno && !assemble_lnotab(a, i))
4062 return 0;
4063 if (a->a_offset + size >= len) {
4064 if (len > PY_SSIZE_T_MAX / 2)
4065 return 0;
4066 if (_PyBytes_Resize(&a->a_bytecode, len * 2) < 0)
4067 return 0;
4068 }
4069 code = PyBytes_AS_STRING(a->a_bytecode) + a->a_offset;
4070 a->a_offset += size;
4071 if (size == 6) {
4072 assert(i->i_hasarg);
4073 *code++ = (char)EXTENDED_ARG;
4074 *code++ = ext & 0xff;
4075 *code++ = ext >> 8;
4076 arg &= 0xffff;
4077 }
4078 *code++ = i->i_opcode;
4079 if (i->i_hasarg) {
4080 assert(size == 3 || size == 6);
4081 *code++ = arg & 0xff;
Victor Stinner4f2dab52011-05-27 16:46:51 +02004082 *code++ = arg >> 8;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004083 }
4084 return 1;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004085}
4086
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004087static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004088assemble_jump_offsets(struct assembler *a, struct compiler *c)
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004089{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004090 basicblock *b;
4091 int bsize, totsize, extended_arg_count = 0, last_extended_arg_count;
4092 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004093
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004094 /* Compute the size of each block and fixup jump args.
4095 Replace block pointer with position in bytecode. */
4096 do {
4097 totsize = 0;
4098 for (i = a->a_nblocks - 1; i >= 0; i--) {
4099 b = a->a_postorder[i];
4100 bsize = blocksize(b);
4101 b->b_offset = totsize;
4102 totsize += bsize;
4103 }
4104 last_extended_arg_count = extended_arg_count;
4105 extended_arg_count = 0;
4106 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
4107 bsize = b->b_offset;
4108 for (i = 0; i < b->b_iused; i++) {
4109 struct instr *instr = &b->b_instr[i];
4110 /* Relative jumps are computed relative to
4111 the instruction pointer after fetching
4112 the jump instruction.
4113 */
4114 bsize += instrsize(instr);
4115 if (instr->i_jabs)
4116 instr->i_oparg = instr->i_target->b_offset;
4117 else if (instr->i_jrel) {
4118 int delta = instr->i_target->b_offset - bsize;
4119 instr->i_oparg = delta;
4120 }
4121 else
4122 continue;
4123 if (instr->i_oparg > 0xffff)
4124 extended_arg_count++;
4125 }
4126 }
Neal Norwitzf1d50682005-10-23 23:00:41 +00004127
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004128 /* XXX: This is an awful hack that could hurt performance, but
4129 on the bright side it should work until we come up
4130 with a better solution.
Neal Norwitzf1d50682005-10-23 23:00:41 +00004131
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004132 The issue is that in the first loop blocksize() is called
4133 which calls instrsize() which requires i_oparg be set
4134 appropriately. There is a bootstrap problem because
4135 i_oparg is calculated in the second loop above.
Neal Norwitzf1d50682005-10-23 23:00:41 +00004136
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004137 So we loop until we stop seeing new EXTENDED_ARGs.
4138 The only EXTENDED_ARGs that could be popping up are
4139 ones in jump instructions. So this should converge
4140 fairly quickly.
4141 */
4142 } while (last_extended_arg_count != extended_arg_count);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004143}
4144
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004145static PyObject *
Victor Stinnerad9a0662013-11-19 22:23:20 +01004146dict_keys_inorder(PyObject *dict, Py_ssize_t offset)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004147{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004148 PyObject *tuple, *k, *v;
4149 Py_ssize_t i, pos = 0, size = PyDict_Size(dict);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004150
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004151 tuple = PyTuple_New(size);
4152 if (tuple == NULL)
4153 return NULL;
4154 while (PyDict_Next(dict, &pos, &k, &v)) {
4155 i = PyLong_AS_LONG(v);
4156 /* The keys of the dictionary are tuples. (see compiler_add_o)
4157 The object we want is always first, though. */
4158 k = PyTuple_GET_ITEM(k, 0);
4159 Py_INCREF(k);
4160 assert((i - offset) < size);
4161 assert((i - offset) >= 0);
4162 PyTuple_SET_ITEM(tuple, i - offset, k);
4163 }
4164 return tuple;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004165}
4166
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004167static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004168compute_code_flags(struct compiler *c)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004169{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004170 PySTEntryObject *ste = c->u->u_ste;
Victor Stinnerad9a0662013-11-19 22:23:20 +01004171 int flags = 0;
4172 Py_ssize_t n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004173 if (ste->ste_type == FunctionBlock) {
Benjamin Petersone8e14592013-05-16 14:37:25 -05004174 flags |= CO_NEWLOCALS;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004175 if (!ste->ste_unoptimized)
4176 flags |= CO_OPTIMIZED;
4177 if (ste->ste_nested)
4178 flags |= CO_NESTED;
4179 if (ste->ste_generator)
4180 flags |= CO_GENERATOR;
4181 if (ste->ste_varargs)
4182 flags |= CO_VARARGS;
4183 if (ste->ste_varkeywords)
4184 flags |= CO_VARKEYWORDS;
4185 }
Thomas Wouters5e9f1fa2006-02-28 20:02:27 +00004186
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004187 /* (Only) inherit compilerflags in PyCF_MASK */
4188 flags |= (c->c_flags->cf_flags & PyCF_MASK);
Thomas Wouters5e9f1fa2006-02-28 20:02:27 +00004189
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004190 n = PyDict_Size(c->u->u_freevars);
4191 if (n < 0)
4192 return -1;
4193 if (n == 0) {
4194 n = PyDict_Size(c->u->u_cellvars);
4195 if (n < 0)
Victor Stinnerad9a0662013-11-19 22:23:20 +01004196 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004197 if (n == 0) {
Victor Stinnerad9a0662013-11-19 22:23:20 +01004198 flags |= CO_NOFREE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004199 }
4200 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004201
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004202 return flags;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004203}
4204
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004205static PyCodeObject *
4206makecode(struct compiler *c, struct assembler *a)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004207{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004208 PyObject *tmp;
4209 PyCodeObject *co = NULL;
4210 PyObject *consts = NULL;
4211 PyObject *names = NULL;
4212 PyObject *varnames = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004213 PyObject *name = NULL;
4214 PyObject *freevars = NULL;
4215 PyObject *cellvars = NULL;
4216 PyObject *bytecode = NULL;
Victor Stinnerad9a0662013-11-19 22:23:20 +01004217 Py_ssize_t nlocals;
4218 int nlocals_int;
4219 int flags;
Victor Stinnerf8e32212013-11-19 23:56:34 +01004220 int argcount, kwonlyargcount;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004221
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004222 tmp = dict_keys_inorder(c->u->u_consts, 0);
4223 if (!tmp)
4224 goto error;
4225 consts = PySequence_List(tmp); /* optimize_code requires a list */
4226 Py_DECREF(tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004227
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004228 names = dict_keys_inorder(c->u->u_names, 0);
4229 varnames = dict_keys_inorder(c->u->u_varnames, 0);
4230 if (!consts || !names || !varnames)
4231 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004232
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004233 cellvars = dict_keys_inorder(c->u->u_cellvars, 0);
4234 if (!cellvars)
4235 goto error;
4236 freevars = dict_keys_inorder(c->u->u_freevars, PyTuple_Size(cellvars));
4237 if (!freevars)
4238 goto error;
Victor Stinnerad9a0662013-11-19 22:23:20 +01004239
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004240 nlocals = PyDict_Size(c->u->u_varnames);
Victor Stinnerad9a0662013-11-19 22:23:20 +01004241 assert(nlocals < INT_MAX);
4242 nlocals_int = Py_SAFE_DOWNCAST(nlocals, Py_ssize_t, int);
4243
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004244 flags = compute_code_flags(c);
4245 if (flags < 0)
4246 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004247
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004248 bytecode = PyCode_Optimize(a->a_bytecode, consts, names, a->a_lnotab);
4249 if (!bytecode)
4250 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004251
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004252 tmp = PyList_AsTuple(consts); /* PyCode_New requires a tuple */
4253 if (!tmp)
4254 goto error;
4255 Py_DECREF(consts);
4256 consts = tmp;
4257
Victor Stinnerf8e32212013-11-19 23:56:34 +01004258 argcount = Py_SAFE_DOWNCAST(c->u->u_argcount, Py_ssize_t, int);
4259 kwonlyargcount = Py_SAFE_DOWNCAST(c->u->u_kwonlyargcount, Py_ssize_t, int);
4260 co = PyCode_New(argcount, kwonlyargcount,
Victor Stinnerad9a0662013-11-19 22:23:20 +01004261 nlocals_int, stackdepth(c), flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004262 bytecode, consts, names, varnames,
4263 freevars, cellvars,
Victor Stinner14e461d2013-08-26 22:28:21 +02004264 c->c_filename, c->u->u_name,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004265 c->u->u_firstlineno,
4266 a->a_lnotab);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004267 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004268 Py_XDECREF(consts);
4269 Py_XDECREF(names);
4270 Py_XDECREF(varnames);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004271 Py_XDECREF(name);
4272 Py_XDECREF(freevars);
4273 Py_XDECREF(cellvars);
4274 Py_XDECREF(bytecode);
4275 return co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004276}
4277
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004278
4279/* For debugging purposes only */
4280#if 0
4281static void
4282dump_instr(const struct instr *i)
4283{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004284 const char *jrel = i->i_jrel ? "jrel " : "";
4285 const char *jabs = i->i_jabs ? "jabs " : "";
4286 char arg[128];
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004287
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004288 *arg = '\0';
4289 if (i->i_hasarg)
4290 sprintf(arg, "arg: %d ", i->i_oparg);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004291
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004292 fprintf(stderr, "line: %d, opcode: %d %s%s%s\n",
4293 i->i_lineno, i->i_opcode, arg, jabs, jrel);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004294}
4295
4296static void
4297dump_basicblock(const basicblock *b)
4298{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004299 const char *seen = b->b_seen ? "seen " : "";
4300 const char *b_return = b->b_return ? "return " : "";
4301 fprintf(stderr, "used: %d, depth: %d, offset: %d %s%s\n",
4302 b->b_iused, b->b_startdepth, b->b_offset, seen, b_return);
4303 if (b->b_instr) {
4304 int i;
4305 for (i = 0; i < b->b_iused; i++) {
4306 fprintf(stderr, " [%02d] ", i);
4307 dump_instr(b->b_instr + i);
4308 }
4309 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004310}
4311#endif
4312
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004313static PyCodeObject *
4314assemble(struct compiler *c, int addNone)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004315{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004316 basicblock *b, *entryblock;
4317 struct assembler a;
4318 int i, j, nblocks;
4319 PyCodeObject *co = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004320
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004321 /* Make sure every block that falls off the end returns None.
4322 XXX NEXT_BLOCK() isn't quite right, because if the last
4323 block ends with a jump or return b_next shouldn't set.
4324 */
4325 if (!c->u->u_curblock->b_return) {
4326 NEXT_BLOCK(c);
4327 if (addNone)
4328 ADDOP_O(c, LOAD_CONST, Py_None, consts);
4329 ADDOP(c, RETURN_VALUE);
4330 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004331
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004332 nblocks = 0;
4333 entryblock = NULL;
4334 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
4335 nblocks++;
4336 entryblock = b;
4337 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004338
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004339 /* Set firstlineno if it wasn't explicitly set. */
4340 if (!c->u->u_firstlineno) {
4341 if (entryblock && entryblock->b_instr)
4342 c->u->u_firstlineno = entryblock->b_instr->i_lineno;
4343 else
4344 c->u->u_firstlineno = 1;
4345 }
4346 if (!assemble_init(&a, nblocks, c->u->u_firstlineno))
4347 goto error;
4348 dfs(c, entryblock, &a);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004349
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004350 /* Can't modify the bytecode after computing jump offsets. */
4351 assemble_jump_offsets(&a, c);
Tim Petersb6c3cea2001-06-26 03:36:28 +00004352
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004353 /* Emit code in reverse postorder from dfs. */
4354 for (i = a.a_nblocks - 1; i >= 0; i--) {
4355 b = a.a_postorder[i];
4356 for (j = 0; j < b->b_iused; j++)
4357 if (!assemble_emit(&a, &b->b_instr[j]))
4358 goto error;
4359 }
Tim Petersb6c3cea2001-06-26 03:36:28 +00004360
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004361 if (_PyBytes_Resize(&a.a_lnotab, a.a_lnotab_off) < 0)
4362 goto error;
4363 if (_PyBytes_Resize(&a.a_bytecode, a.a_offset) < 0)
4364 goto error;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004365
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004366 co = makecode(c, &a);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004367 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004368 assemble_free(&a);
4369 return co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004370}
Georg Brandl8334fd92010-12-04 10:26:46 +00004371
4372#undef PyAST_Compile
4373PyAPI_FUNC(PyCodeObject *)
4374PyAST_Compile(mod_ty mod, const char *filename, PyCompilerFlags *flags,
4375 PyArena *arena)
4376{
4377 return PyAST_CompileEx(mod, filename, flags, -1, arena);
4378}
4379