blob: dde6dcff4bdcd99f3ee912ca3251e82584c0ba52 [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
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000123 int u_argcount; /* number of arguments for block */
124 int u_kwonlyargcount; /* number of keyword only arguments for block */
125 /* 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 Stinnerad9a0662013-11-19 22:23:20 +0100173static int compiler_addop_i(struct compiler *, Py_ssize_t, 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
856static int
857opcode_stack_effect(int opcode, int oparg)
858{
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:
1047 fprintf(stderr, "opcode = %d\n", opcode);
1048 Py_FatalError("opcode_stack_effect()");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001049
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001050 }
1051 return 0; /* not reachable */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001052}
1053
1054/* Add an opcode with no argument.
1055 Returns 0 on failure, 1 on success.
1056*/
1057
1058static int
1059compiler_addop(struct compiler *c, int opcode)
1060{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001061 basicblock *b;
1062 struct instr *i;
1063 int off;
1064 off = compiler_next_instr(c, c->u->u_curblock);
1065 if (off < 0)
1066 return 0;
1067 b = c->u->u_curblock;
1068 i = &b->b_instr[off];
1069 i->i_opcode = opcode;
1070 i->i_hasarg = 0;
1071 if (opcode == RETURN_VALUE)
1072 b->b_return = 1;
1073 compiler_set_lineno(c, off);
1074 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001075}
1076
1077static int
1078compiler_add_o(struct compiler *c, PyObject *dict, PyObject *o)
1079{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001080 PyObject *t, *v;
1081 Py_ssize_t arg;
1082 double d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001083
Serhiy Storchaka95949422013-08-27 19:40:23 +03001084 /* necessary to make sure types aren't coerced (e.g., float and complex) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001085 /* _and_ to distinguish 0.0 from -0.0 e.g. on IEEE platforms */
1086 if (PyFloat_Check(o)) {
1087 d = PyFloat_AS_DOUBLE(o);
1088 /* all we need is to make the tuple different in either the 0.0
1089 * or -0.0 case from all others, just to avoid the "coercion".
1090 */
1091 if (d == 0.0 && copysign(1.0, d) < 0.0)
1092 t = PyTuple_Pack(3, o, o->ob_type, Py_None);
1093 else
1094 t = PyTuple_Pack(2, o, o->ob_type);
1095 }
1096 else if (PyComplex_Check(o)) {
1097 Py_complex z;
1098 int real_negzero, imag_negzero;
1099 /* For the complex case we must make complex(x, 0.)
1100 different from complex(x, -0.) and complex(0., y)
1101 different from complex(-0., y), for any x and y.
1102 All four complex zeros must be distinguished.*/
1103 z = PyComplex_AsCComplex(o);
1104 real_negzero = z.real == 0.0 && copysign(1.0, z.real) < 0.0;
1105 imag_negzero = z.imag == 0.0 && copysign(1.0, z.imag) < 0.0;
1106 if (real_negzero && imag_negzero) {
1107 t = PyTuple_Pack(5, o, o->ob_type,
1108 Py_None, Py_None, Py_None);
Christian Heimes400adb02008-02-01 08:12:03 +00001109 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001110 else if (imag_negzero) {
1111 t = PyTuple_Pack(4, o, o->ob_type, Py_None, Py_None);
Guido van Rossum04110fb2007-08-24 16:32:05 +00001112 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001113 else if (real_negzero) {
1114 t = PyTuple_Pack(3, o, o->ob_type, Py_None);
1115 }
1116 else {
1117 t = PyTuple_Pack(2, o, o->ob_type);
1118 }
1119 }
1120 else {
1121 t = PyTuple_Pack(2, o, o->ob_type);
1122 }
1123 if (t == NULL)
1124 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001125
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001126 v = PyDict_GetItem(dict, t);
1127 if (!v) {
1128 if (PyErr_Occurred())
1129 return -1;
1130 arg = PyDict_Size(dict);
Victor Stinnerad9a0662013-11-19 22:23:20 +01001131 v = PyLong_FromSsize_t(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001132 if (!v) {
1133 Py_DECREF(t);
1134 return -1;
1135 }
1136 if (PyDict_SetItem(dict, t, v) < 0) {
1137 Py_DECREF(t);
1138 Py_DECREF(v);
1139 return -1;
1140 }
1141 Py_DECREF(v);
1142 }
1143 else
1144 arg = PyLong_AsLong(v);
1145 Py_DECREF(t);
1146 return arg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001147}
1148
1149static int
1150compiler_addop_o(struct compiler *c, int opcode, PyObject *dict,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001151 PyObject *o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001152{
Victor Stinnerad9a0662013-11-19 22:23:20 +01001153 Py_ssize_t arg = compiler_add_o(c, dict, o);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001154 if (arg < 0)
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00001155 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001156 return compiler_addop_i(c, opcode, arg);
1157}
1158
1159static int
1160compiler_addop_name(struct compiler *c, int opcode, PyObject *dict,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001161 PyObject *o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001162{
Victor Stinnerad9a0662013-11-19 22:23:20 +01001163 Py_ssize_t arg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001164 PyObject *mangled = _Py_Mangle(c->u->u_private, o);
1165 if (!mangled)
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00001166 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001167 arg = compiler_add_o(c, dict, mangled);
1168 Py_DECREF(mangled);
1169 if (arg < 0)
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00001170 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001171 return compiler_addop_i(c, opcode, arg);
1172}
1173
1174/* Add an opcode with an integer argument.
1175 Returns 0 on failure, 1 on success.
1176*/
1177
1178static int
Victor Stinnerad9a0662013-11-19 22:23:20 +01001179compiler_addop_i(struct compiler *c, Py_ssize_t opcode, Py_ssize_t oparg)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001180{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001181 struct instr *i;
1182 int off;
Victor Stinnerad9a0662013-11-19 22:23:20 +01001183
1184 /* Integer arguments are limit to 16-bit. There is an extension for 32-bit
1185 integer arguments. */
1186 assert(INT32_MIN <= opcode);
1187 assert(opcode <= INT32_MAX);
1188
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001189 off = compiler_next_instr(c, c->u->u_curblock);
1190 if (off < 0)
1191 return 0;
1192 i = &c->u->u_curblock->b_instr[off];
Victor Stinnerad9a0662013-11-19 22:23:20 +01001193 i->i_opcode = Py_SAFE_DOWNCAST(opcode, Py_ssize_t, int);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001194 i->i_oparg = oparg;
1195 i->i_hasarg = 1;
1196 compiler_set_lineno(c, off);
1197 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001198}
1199
1200static int
1201compiler_addop_j(struct compiler *c, int opcode, basicblock *b, int absolute)
1202{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001203 struct instr *i;
1204 int off;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001205
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001206 assert(b != NULL);
1207 off = compiler_next_instr(c, c->u->u_curblock);
1208 if (off < 0)
1209 return 0;
1210 i = &c->u->u_curblock->b_instr[off];
1211 i->i_opcode = opcode;
1212 i->i_target = b;
1213 i->i_hasarg = 1;
1214 if (absolute)
1215 i->i_jabs = 1;
1216 else
1217 i->i_jrel = 1;
1218 compiler_set_lineno(c, off);
1219 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001220}
1221
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001222/* The distinction between NEW_BLOCK and NEXT_BLOCK is subtle. (I'd
1223 like to find better names.) NEW_BLOCK() creates a new block and sets
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001224 it as the current block. NEXT_BLOCK() also creates an implicit jump
1225 from the current block to the new block.
1226*/
1227
Thomas Wouters89f507f2006-12-13 04:49:30 +00001228/* The returns inside these macros make it impossible to decref objects
1229 created in the local function. Local objects should use the arena.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001230*/
1231
1232
1233#define NEW_BLOCK(C) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001234 if (compiler_use_new_block((C)) == NULL) \
1235 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001236}
1237
1238#define NEXT_BLOCK(C) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001239 if (compiler_next_block((C)) == NULL) \
1240 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001241}
1242
1243#define ADDOP(C, OP) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001244 if (!compiler_addop((C), (OP))) \
1245 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001246}
1247
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001248#define ADDOP_IN_SCOPE(C, OP) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001249 if (!compiler_addop((C), (OP))) { \
1250 compiler_exit_scope(c); \
1251 return 0; \
1252 } \
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001253}
1254
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001255#define ADDOP_O(C, OP, O, TYPE) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001256 if (!compiler_addop_o((C), (OP), (C)->u->u_ ## TYPE, (O))) \
1257 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001258}
1259
1260#define ADDOP_NAME(C, OP, O, TYPE) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001261 if (!compiler_addop_name((C), (OP), (C)->u->u_ ## TYPE, (O))) \
1262 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001263}
1264
1265#define ADDOP_I(C, OP, O) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001266 if (!compiler_addop_i((C), (OP), (O))) \
1267 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001268}
1269
1270#define ADDOP_JABS(C, OP, O) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001271 if (!compiler_addop_j((C), (OP), (O), 1)) \
1272 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001273}
1274
1275#define ADDOP_JREL(C, OP, O) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001276 if (!compiler_addop_j((C), (OP), (O), 0)) \
1277 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001278}
1279
1280/* VISIT and VISIT_SEQ takes an ASDL type as their second argument. They use
1281 the ASDL name to synthesize the name of the C type and the visit function.
1282*/
1283
1284#define VISIT(C, TYPE, V) {\
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001285 if (!compiler_visit_ ## TYPE((C), (V))) \
1286 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001287}
1288
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001289#define VISIT_IN_SCOPE(C, TYPE, V) {\
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001290 if (!compiler_visit_ ## TYPE((C), (V))) { \
1291 compiler_exit_scope(c); \
1292 return 0; \
1293 } \
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001294}
1295
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001296#define VISIT_SLICE(C, V, CTX) {\
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001297 if (!compiler_visit_slice((C), (V), (CTX))) \
1298 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001299}
1300
1301#define VISIT_SEQ(C, TYPE, SEQ) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001302 int _i; \
1303 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
1304 for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \
1305 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \
1306 if (!compiler_visit_ ## TYPE((C), elt)) \
1307 return 0; \
1308 } \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001309}
1310
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001311#define VISIT_SEQ_IN_SCOPE(C, TYPE, SEQ) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001312 int _i; \
1313 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
1314 for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \
1315 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \
1316 if (!compiler_visit_ ## TYPE((C), elt)) { \
1317 compiler_exit_scope(c); \
1318 return 0; \
1319 } \
1320 } \
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001321}
1322
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001323static int
1324compiler_isdocstring(stmt_ty s)
1325{
1326 if (s->kind != Expr_kind)
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00001327 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001328 return s->v.Expr.value->kind == Str_kind;
1329}
1330
1331/* Compile a sequence of statements, checking for a docstring. */
1332
1333static int
1334compiler_body(struct compiler *c, asdl_seq *stmts)
1335{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001336 int i = 0;
1337 stmt_ty st;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001338
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001339 if (!asdl_seq_LEN(stmts))
1340 return 1;
1341 st = (stmt_ty)asdl_seq_GET(stmts, 0);
Georg Brandl8334fd92010-12-04 10:26:46 +00001342 if (compiler_isdocstring(st) && c->c_optimize < 2) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001343 /* don't generate docstrings if -OO */
1344 i = 1;
1345 VISIT(c, expr, st->v.Expr.value);
1346 if (!compiler_nameop(c, __doc__, Store))
1347 return 0;
1348 }
1349 for (; i < asdl_seq_LEN(stmts); i++)
1350 VISIT(c, stmt, (stmt_ty)asdl_seq_GET(stmts, i));
1351 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001352}
1353
1354static PyCodeObject *
1355compiler_mod(struct compiler *c, mod_ty mod)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001356{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001357 PyCodeObject *co;
1358 int addNone = 1;
1359 static PyObject *module;
1360 if (!module) {
1361 module = PyUnicode_InternFromString("<module>");
1362 if (!module)
1363 return NULL;
1364 }
1365 /* Use 0 for firstlineno initially, will fixup in assemble(). */
Antoine Pitrou86a36b52011-11-25 18:56:07 +01001366 if (!compiler_enter_scope(c, module, COMPILER_SCOPE_MODULE, mod, 0))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001367 return NULL;
1368 switch (mod->kind) {
1369 case Module_kind:
1370 if (!compiler_body(c, mod->v.Module.body)) {
1371 compiler_exit_scope(c);
1372 return 0;
1373 }
1374 break;
1375 case Interactive_kind:
1376 c->c_interactive = 1;
1377 VISIT_SEQ_IN_SCOPE(c, stmt,
1378 mod->v.Interactive.body);
1379 break;
1380 case Expression_kind:
1381 VISIT_IN_SCOPE(c, expr, mod->v.Expression.body);
1382 addNone = 0;
1383 break;
1384 case Suite_kind:
1385 PyErr_SetString(PyExc_SystemError,
1386 "suite should not be possible");
1387 return 0;
1388 default:
1389 PyErr_Format(PyExc_SystemError,
1390 "module kind %d should not be possible",
1391 mod->kind);
1392 return 0;
1393 }
1394 co = assemble(c, addNone);
1395 compiler_exit_scope(c);
1396 return co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001397}
1398
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001399/* The test for LOCAL must come before the test for FREE in order to
1400 handle classes where name is both local and free. The local var is
1401 a method and the free var is a free var referenced within a method.
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001402*/
1403
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001404static int
1405get_ref_type(struct compiler *c, PyObject *name)
1406{
Victor Stinner0b1bc562013-05-16 22:17:17 +02001407 int scope;
Benjamin Peterson312595c2013-05-15 15:26:42 -05001408 if (c->u->u_scope_type == COMPILER_SCOPE_CLASS &&
1409 !PyUnicode_CompareWithASCIIString(name, "__class__"))
1410 return CELL;
Victor Stinner0b1bc562013-05-16 22:17:17 +02001411 scope = PyST_GetScope(c->u->u_ste, name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001412 if (scope == 0) {
1413 char buf[350];
1414 PyOS_snprintf(buf, sizeof(buf),
Victor Stinner14e461d2013-08-26 22:28:21 +02001415 "unknown scope for %.100s in %.100s(%s)\n"
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001416 "symbols: %s\nlocals: %s\nglobals: %s",
1417 PyBytes_AS_STRING(name),
1418 PyBytes_AS_STRING(c->u->u_name),
1419 PyObject_REPR(c->u->u_ste->ste_id),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001420 PyObject_REPR(c->u->u_ste->ste_symbols),
1421 PyObject_REPR(c->u->u_varnames),
1422 PyObject_REPR(c->u->u_names)
1423 );
1424 Py_FatalError(buf);
1425 }
Tim Peters2a7f3842001-06-09 09:26:21 +00001426
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001427 return scope;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001428}
1429
1430static int
1431compiler_lookup_arg(PyObject *dict, PyObject *name)
1432{
1433 PyObject *k, *v;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001434 k = PyTuple_Pack(2, name, name->ob_type);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001435 if (k == NULL)
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00001436 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001437 v = PyDict_GetItem(dict, k);
Neal Norwitz3715c3e2005-11-24 22:09:18 +00001438 Py_DECREF(k);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001439 if (v == NULL)
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00001440 return -1;
Christian Heimes217cfd12007-12-02 14:31:20 +00001441 return PyLong_AS_LONG(v);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001442}
1443
1444static int
Victor Stinnerad9a0662013-11-19 22:23:20 +01001445compiler_make_closure(struct compiler *c, PyCodeObject *co, Py_ssize_t args, PyObject *qualname)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001446{
Victor Stinnerad9a0662013-11-19 22:23:20 +01001447 Py_ssize_t i, free = PyCode_GetNumFree(co);
Antoine Pitrou86a36b52011-11-25 18:56:07 +01001448 if (qualname == NULL)
1449 qualname = co->co_name;
1450
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001451 if (free == 0) {
1452 ADDOP_O(c, LOAD_CONST, (PyObject*)co, consts);
Antoine Pitrou86a36b52011-11-25 18:56:07 +01001453 ADDOP_O(c, LOAD_CONST, qualname, consts);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001454 ADDOP_I(c, MAKE_FUNCTION, args);
1455 return 1;
1456 }
1457 for (i = 0; i < free; ++i) {
1458 /* Bypass com_addop_varname because it will generate
1459 LOAD_DEREF but LOAD_CLOSURE is needed.
1460 */
1461 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
1462 int arg, reftype;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001463
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001464 /* Special case: If a class contains a method with a
1465 free variable that has the same name as a method,
1466 the name will be considered free *and* local in the
1467 class. It should be handled by the closure, as
1468 well as by the normal name loookup logic.
1469 */
1470 reftype = get_ref_type(c, name);
1471 if (reftype == CELL)
1472 arg = compiler_lookup_arg(c->u->u_cellvars, name);
1473 else /* (reftype == FREE) */
1474 arg = compiler_lookup_arg(c->u->u_freevars, name);
1475 if (arg == -1) {
1476 fprintf(stderr,
1477 "lookup %s in %s %d %d\n"
1478 "freevars of %s: %s\n",
1479 PyObject_REPR(name),
1480 PyBytes_AS_STRING(c->u->u_name),
1481 reftype, arg,
1482 _PyUnicode_AsString(co->co_name),
1483 PyObject_REPR(co->co_freevars));
1484 Py_FatalError("compiler_make_closure()");
1485 }
1486 ADDOP_I(c, LOAD_CLOSURE, arg);
1487 }
1488 ADDOP_I(c, BUILD_TUPLE, free);
1489 ADDOP_O(c, LOAD_CONST, (PyObject*)co, consts);
Antoine Pitrou86a36b52011-11-25 18:56:07 +01001490 ADDOP_O(c, LOAD_CONST, qualname, consts);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001491 ADDOP_I(c, MAKE_CLOSURE, args);
1492 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001493}
1494
1495static int
1496compiler_decorators(struct compiler *c, asdl_seq* decos)
1497{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001498 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001499
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001500 if (!decos)
1501 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001502
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001503 for (i = 0; i < asdl_seq_LEN(decos); i++) {
1504 VISIT(c, expr, (expr_ty)asdl_seq_GET(decos, i));
1505 }
1506 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001507}
1508
1509static int
Guido van Rossum4f72a782006-10-27 23:31:49 +00001510compiler_visit_kwonlydefaults(struct compiler *c, asdl_seq *kwonlyargs,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001511 asdl_seq *kw_defaults)
Guido van Rossum4f72a782006-10-27 23:31:49 +00001512{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001513 int i, default_count = 0;
1514 for (i = 0; i < asdl_seq_LEN(kwonlyargs); i++) {
1515 arg_ty arg = asdl_seq_GET(kwonlyargs, i);
1516 expr_ty default_ = asdl_seq_GET(kw_defaults, i);
1517 if (default_) {
Benjamin Peterson32c59b62012-04-17 19:53:21 -04001518 PyObject *mangled = _Py_Mangle(c->u->u_private, arg->arg);
1519 if (!mangled)
1520 return -1;
1521 ADDOP_O(c, LOAD_CONST, mangled, consts);
1522 Py_DECREF(mangled);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001523 if (!compiler_visit_expr(c, default_)) {
1524 return -1;
1525 }
1526 default_count++;
1527 }
1528 }
1529 return default_count;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001530}
1531
1532static int
Neal Norwitzc1505362006-12-28 06:47:50 +00001533compiler_visit_argannotation(struct compiler *c, identifier id,
1534 expr_ty annotation, PyObject *names)
1535{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001536 if (annotation) {
1537 VISIT(c, expr, annotation);
1538 if (PyList_Append(names, id))
1539 return -1;
1540 }
1541 return 0;
Neal Norwitzc1505362006-12-28 06:47:50 +00001542}
1543
1544static int
1545compiler_visit_argannotations(struct compiler *c, asdl_seq* args,
1546 PyObject *names)
1547{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001548 int i, error;
1549 for (i = 0; i < asdl_seq_LEN(args); i++) {
1550 arg_ty arg = (arg_ty)asdl_seq_GET(args, i);
1551 error = compiler_visit_argannotation(
1552 c,
1553 arg->arg,
1554 arg->annotation,
1555 names);
1556 if (error)
1557 return error;
1558 }
1559 return 0;
Neal Norwitzc1505362006-12-28 06:47:50 +00001560}
1561
1562static int
1563compiler_visit_annotations(struct compiler *c, arguments_ty args,
1564 expr_ty returns)
1565{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001566 /* Push arg annotations and a list of the argument names. Return the #
1567 of items pushed. The expressions are evaluated out-of-order wrt the
1568 source code.
Neal Norwitzc1505362006-12-28 06:47:50 +00001569
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001570 More than 2^16-1 annotations is a SyntaxError. Returns -1 on error.
1571 */
1572 static identifier return_str;
1573 PyObject *names;
Victor Stinnerad9a0662013-11-19 22:23:20 +01001574 Py_ssize_t len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001575 names = PyList_New(0);
1576 if (!names)
1577 return -1;
Neal Norwitzc1505362006-12-28 06:47:50 +00001578
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001579 if (compiler_visit_argannotations(c, args->args, names))
1580 goto error;
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001581 if (args->vararg && args->vararg->annotation &&
1582 compiler_visit_argannotation(c, args->vararg->arg,
1583 args->vararg->annotation, names))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001584 goto error;
1585 if (compiler_visit_argannotations(c, args->kwonlyargs, names))
1586 goto error;
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001587 if (args->kwarg && args->kwarg->annotation &&
1588 compiler_visit_argannotation(c, args->kwarg->arg,
1589 args->kwarg->annotation, names))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001590 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +00001591
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001592 if (!return_str) {
1593 return_str = PyUnicode_InternFromString("return");
1594 if (!return_str)
1595 goto error;
1596 }
1597 if (compiler_visit_argannotation(c, return_str, returns, names)) {
1598 goto error;
1599 }
1600
1601 len = PyList_GET_SIZE(names);
1602 if (len > 65534) {
1603 /* len must fit in 16 bits, and len is incremented below */
1604 PyErr_SetString(PyExc_SyntaxError,
1605 "too many annotations");
1606 goto error;
1607 }
1608 if (len) {
1609 /* convert names to a tuple and place on stack */
1610 PyObject *elt;
Victor Stinnerad9a0662013-11-19 22:23:20 +01001611 Py_ssize_t i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001612 PyObject *s = PyTuple_New(len);
1613 if (!s)
1614 goto error;
1615 for (i = 0; i < len; i++) {
1616 elt = PyList_GET_ITEM(names, i);
1617 Py_INCREF(elt);
1618 PyTuple_SET_ITEM(s, i, elt);
1619 }
1620 ADDOP_O(c, LOAD_CONST, s, consts);
1621 Py_DECREF(s);
1622 len++; /* include the just-pushed tuple */
1623 }
1624 Py_DECREF(names);
Victor Stinnerad9a0662013-11-19 22:23:20 +01001625
1626 /* We just checked that len <= 65535, see above */
1627 return Py_SAFE_DOWNCAST(len, Py_ssize_t, int);
Neal Norwitzc1505362006-12-28 06:47:50 +00001628
1629error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001630 Py_DECREF(names);
1631 return -1;
Neal Norwitzc1505362006-12-28 06:47:50 +00001632}
1633
1634static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001635compiler_function(struct compiler *c, stmt_ty s)
1636{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001637 PyCodeObject *co;
Antoine Pitrou86a36b52011-11-25 18:56:07 +01001638 PyObject *qualname, *first_const = Py_None;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001639 arguments_ty args = s->v.FunctionDef.args;
1640 expr_ty returns = s->v.FunctionDef.returns;
1641 asdl_seq* decos = s->v.FunctionDef.decorator_list;
1642 stmt_ty st;
Victor Stinnerad9a0662013-11-19 22:23:20 +01001643 Py_ssize_t i, n, arglength;
1644 int docstring, kw_default_count = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001645 int num_annotations;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001646
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001647 assert(s->kind == FunctionDef_kind);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001648
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001649 if (!compiler_decorators(c, decos))
1650 return 0;
Benjamin Peterson1ef876c2013-02-10 09:29:59 -05001651 if (args->defaults)
1652 VISIT_SEQ(c, expr, args->defaults);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001653 if (args->kwonlyargs) {
1654 int res = compiler_visit_kwonlydefaults(c, args->kwonlyargs,
1655 args->kw_defaults);
1656 if (res < 0)
1657 return 0;
1658 kw_default_count = res;
1659 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001660 num_annotations = compiler_visit_annotations(c, args, returns);
1661 if (num_annotations < 0)
1662 return 0;
1663 assert((num_annotations & 0xFFFF) == num_annotations);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001664
Antoine Pitrou86a36b52011-11-25 18:56:07 +01001665 if (!compiler_enter_scope(c, s->v.FunctionDef.name,
1666 COMPILER_SCOPE_FUNCTION, (void *)s,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001667 s->lineno))
1668 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001669
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001670 st = (stmt_ty)asdl_seq_GET(s->v.FunctionDef.body, 0);
1671 docstring = compiler_isdocstring(st);
Georg Brandl8334fd92010-12-04 10:26:46 +00001672 if (docstring && c->c_optimize < 2)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001673 first_const = st->v.Expr.value->v.Str.s;
1674 if (compiler_add_o(c, c->u->u_consts, first_const) < 0) {
1675 compiler_exit_scope(c);
1676 return 0;
1677 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001678
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001679 c->u->u_argcount = asdl_seq_LEN(args->args);
1680 c->u->u_kwonlyargcount = asdl_seq_LEN(args->kwonlyargs);
1681 n = asdl_seq_LEN(s->v.FunctionDef.body);
1682 /* if there was a docstring, we need to skip the first statement */
1683 for (i = docstring; i < n; i++) {
1684 st = (stmt_ty)asdl_seq_GET(s->v.FunctionDef.body, i);
1685 VISIT_IN_SCOPE(c, stmt, st);
1686 }
1687 co = assemble(c, 1);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04001688 qualname = c->u->u_qualname;
1689 Py_INCREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001690 compiler_exit_scope(c);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04001691 if (co == NULL) {
Antoine Pitrou86a36b52011-11-25 18:56:07 +01001692 Py_XDECREF(qualname);
1693 Py_XDECREF(co);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001694 return 0;
Antoine Pitrou86a36b52011-11-25 18:56:07 +01001695 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001696
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001697 arglength = asdl_seq_LEN(args->defaults);
1698 arglength |= kw_default_count << 8;
1699 arglength |= num_annotations << 16;
Antoine Pitrou86a36b52011-11-25 18:56:07 +01001700 compiler_make_closure(c, co, arglength, qualname);
1701 Py_DECREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001702 Py_DECREF(co);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001703
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001704 /* decorators */
1705 for (i = 0; i < asdl_seq_LEN(decos); i++) {
1706 ADDOP_I(c, CALL_FUNCTION, 1);
1707 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001708
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001709 return compiler_nameop(c, s->v.FunctionDef.name, Store);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001710}
1711
1712static int
1713compiler_class(struct compiler *c, stmt_ty s)
1714{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001715 PyCodeObject *co;
1716 PyObject *str;
1717 int i;
1718 asdl_seq* decos = s->v.ClassDef.decorator_list;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001719
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001720 if (!compiler_decorators(c, decos))
1721 return 0;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001722
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001723 /* ultimately generate code for:
1724 <name> = __build_class__(<func>, <name>, *<bases>, **<keywords>)
1725 where:
1726 <func> is a function/closure created from the class body;
1727 it has a single argument (__locals__) where the dict
1728 (or MutableSequence) representing the locals is passed
1729 <name> is the class name
1730 <bases> is the positional arguments and *varargs argument
1731 <keywords> is the keyword arguments and **kwds argument
1732 This borrows from compiler_call.
1733 */
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001734
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001735 /* 1. compile the class body into a code object */
Antoine Pitrou86a36b52011-11-25 18:56:07 +01001736 if (!compiler_enter_scope(c, s->v.ClassDef.name,
1737 COMPILER_SCOPE_CLASS, (void *)s, s->lineno))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001738 return 0;
1739 /* this block represents what we do in the new scope */
1740 {
1741 /* use the class name for name mangling */
1742 Py_INCREF(s->v.ClassDef.name);
1743 Py_XDECREF(c->u->u_private);
1744 c->u->u_private = s->v.ClassDef.name;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001745 /* load (global) __name__ ... */
1746 str = PyUnicode_InternFromString("__name__");
1747 if (!str || !compiler_nameop(c, str, Load)) {
1748 Py_XDECREF(str);
1749 compiler_exit_scope(c);
1750 return 0;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001751 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001752 Py_DECREF(str);
1753 /* ... and store it as __module__ */
1754 str = PyUnicode_InternFromString("__module__");
1755 if (!str || !compiler_nameop(c, str, Store)) {
1756 Py_XDECREF(str);
1757 compiler_exit_scope(c);
1758 return 0;
1759 }
1760 Py_DECREF(str);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04001761 assert(c->u->u_qualname);
1762 ADDOP_O(c, LOAD_CONST, c->u->u_qualname, consts);
Antoine Pitrou86a36b52011-11-25 18:56:07 +01001763 str = PyUnicode_InternFromString("__qualname__");
1764 if (!str || !compiler_nameop(c, str, Store)) {
1765 Py_XDECREF(str);
1766 compiler_exit_scope(c);
1767 return 0;
1768 }
1769 Py_DECREF(str);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001770 /* compile the body proper */
1771 if (!compiler_body(c, s->v.ClassDef.body)) {
1772 compiler_exit_scope(c);
1773 return 0;
1774 }
Benjamin Peterson312595c2013-05-15 15:26:42 -05001775 if (c->u->u_ste->ste_needs_class_closure) {
1776 /* return the (empty) __class__ cell */
1777 str = PyUnicode_InternFromString("__class__");
1778 if (str == NULL) {
1779 compiler_exit_scope(c);
1780 return 0;
1781 }
1782 i = compiler_lookup_arg(c->u->u_cellvars, str);
1783 Py_DECREF(str);
Victor Stinner98e818b2013-11-05 18:07:34 +01001784 if (i < 0) {
1785 compiler_exit_scope(c);
1786 return 0;
1787 }
Benjamin Peterson312595c2013-05-15 15:26:42 -05001788 assert(i == 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001789 /* Return the cell where to store __class__ */
1790 ADDOP_I(c, LOAD_CLOSURE, i);
1791 }
Benjamin Peterson312595c2013-05-15 15:26:42 -05001792 else {
1793 assert(PyDict_Size(c->u->u_cellvars) == 0);
1794 /* This happens when nobody references the cell. Return None. */
1795 ADDOP_O(c, LOAD_CONST, Py_None, consts);
1796 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001797 ADDOP_IN_SCOPE(c, RETURN_VALUE);
1798 /* create the code object */
1799 co = assemble(c, 1);
1800 }
1801 /* leave the new scope */
1802 compiler_exit_scope(c);
1803 if (co == NULL)
1804 return 0;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001805
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001806 /* 2. load the 'build_class' function */
1807 ADDOP(c, LOAD_BUILD_CLASS);
1808
1809 /* 3. load a function (or closure) made from the code object */
Antoine Pitrou86a36b52011-11-25 18:56:07 +01001810 compiler_make_closure(c, co, 0, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001811 Py_DECREF(co);
1812
1813 /* 4. load class name */
1814 ADDOP_O(c, LOAD_CONST, s->v.ClassDef.name, consts);
1815
1816 /* 5. generate the rest of the code for the call */
1817 if (!compiler_call_helper(c, 2,
1818 s->v.ClassDef.bases,
1819 s->v.ClassDef.keywords,
1820 s->v.ClassDef.starargs,
1821 s->v.ClassDef.kwargs))
1822 return 0;
1823
1824 /* 6. apply decorators */
1825 for (i = 0; i < asdl_seq_LEN(decos); i++) {
1826 ADDOP_I(c, CALL_FUNCTION, 1);
1827 }
1828
1829 /* 7. store into <name> */
1830 if (!compiler_nameop(c, s->v.ClassDef.name, Store))
1831 return 0;
1832 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001833}
1834
1835static int
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001836compiler_ifexp(struct compiler *c, expr_ty e)
1837{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001838 basicblock *end, *next;
1839
1840 assert(e->kind == IfExp_kind);
1841 end = compiler_new_block(c);
1842 if (end == NULL)
1843 return 0;
1844 next = compiler_new_block(c);
1845 if (next == NULL)
1846 return 0;
1847 VISIT(c, expr, e->v.IfExp.test);
1848 ADDOP_JABS(c, POP_JUMP_IF_FALSE, next);
1849 VISIT(c, expr, e->v.IfExp.body);
1850 ADDOP_JREL(c, JUMP_FORWARD, end);
1851 compiler_use_next_block(c, next);
1852 VISIT(c, expr, e->v.IfExp.orelse);
1853 compiler_use_next_block(c, end);
1854 return 1;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001855}
1856
1857static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001858compiler_lambda(struct compiler *c, expr_ty e)
1859{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001860 PyCodeObject *co;
Antoine Pitrou86a36b52011-11-25 18:56:07 +01001861 PyObject *qualname;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001862 static identifier name;
Victor Stinnerad9a0662013-11-19 22:23:20 +01001863 int kw_default_count = 0;
1864 Py_ssize_t arglength;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001865 arguments_ty args = e->v.Lambda.args;
1866 assert(e->kind == Lambda_kind);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001867
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001868 if (!name) {
1869 name = PyUnicode_InternFromString("<lambda>");
1870 if (!name)
1871 return 0;
1872 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001873
Benjamin Peterson419d9a82013-02-10 09:48:22 -05001874 if (args->defaults)
1875 VISIT_SEQ(c, expr, args->defaults);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001876 if (args->kwonlyargs) {
1877 int res = compiler_visit_kwonlydefaults(c, args->kwonlyargs,
1878 args->kw_defaults);
1879 if (res < 0) return 0;
1880 kw_default_count = res;
1881 }
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04001882 if (!compiler_enter_scope(c, name, COMPILER_SCOPE_LAMBDA,
Antoine Pitrou86a36b52011-11-25 18:56:07 +01001883 (void *)e, e->lineno))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001884 return 0;
Neal Norwitz4737b232005-11-19 23:58:29 +00001885
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001886 /* Make None the first constant, so the lambda can't have a
1887 docstring. */
1888 if (compiler_add_o(c, c->u->u_consts, Py_None) < 0)
1889 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001890
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001891 c->u->u_argcount = asdl_seq_LEN(args->args);
1892 c->u->u_kwonlyargcount = asdl_seq_LEN(args->kwonlyargs);
1893 VISIT_IN_SCOPE(c, expr, e->v.Lambda.body);
1894 if (c->u->u_ste->ste_generator) {
1895 ADDOP_IN_SCOPE(c, POP_TOP);
1896 }
1897 else {
1898 ADDOP_IN_SCOPE(c, RETURN_VALUE);
1899 }
1900 co = assemble(c, 1);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04001901 qualname = c->u->u_qualname;
1902 Py_INCREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001903 compiler_exit_scope(c);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04001904 if (co == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001905 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001906
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001907 arglength = asdl_seq_LEN(args->defaults);
1908 arglength |= kw_default_count << 8;
Antoine Pitrou86a36b52011-11-25 18:56:07 +01001909 compiler_make_closure(c, co, arglength, qualname);
1910 Py_DECREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001911 Py_DECREF(co);
1912
1913 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001914}
1915
1916static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001917compiler_if(struct compiler *c, stmt_ty s)
1918{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001919 basicblock *end, *next;
1920 int constant;
1921 assert(s->kind == If_kind);
1922 end = compiler_new_block(c);
1923 if (end == NULL)
1924 return 0;
1925
Georg Brandl8334fd92010-12-04 10:26:46 +00001926 constant = expr_constant(c, s->v.If.test);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001927 /* constant = 0: "if 0"
1928 * constant = 1: "if 1", "if 2", ...
1929 * constant = -1: rest */
1930 if (constant == 0) {
1931 if (s->v.If.orelse)
1932 VISIT_SEQ(c, stmt, s->v.If.orelse);
1933 } else if (constant == 1) {
1934 VISIT_SEQ(c, stmt, s->v.If.body);
1935 } else {
1936 if (s->v.If.orelse) {
1937 next = compiler_new_block(c);
1938 if (next == NULL)
1939 return 0;
1940 }
1941 else
1942 next = end;
1943 VISIT(c, expr, s->v.If.test);
1944 ADDOP_JABS(c, POP_JUMP_IF_FALSE, next);
1945 VISIT_SEQ(c, stmt, s->v.If.body);
1946 ADDOP_JREL(c, JUMP_FORWARD, end);
1947 if (s->v.If.orelse) {
1948 compiler_use_next_block(c, next);
1949 VISIT_SEQ(c, stmt, s->v.If.orelse);
1950 }
1951 }
1952 compiler_use_next_block(c, end);
1953 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001954}
1955
1956static int
1957compiler_for(struct compiler *c, stmt_ty s)
1958{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001959 basicblock *start, *cleanup, *end;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001960
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001961 start = compiler_new_block(c);
1962 cleanup = compiler_new_block(c);
1963 end = compiler_new_block(c);
1964 if (start == NULL || end == NULL || cleanup == NULL)
1965 return 0;
1966 ADDOP_JREL(c, SETUP_LOOP, end);
1967 if (!compiler_push_fblock(c, LOOP, start))
1968 return 0;
1969 VISIT(c, expr, s->v.For.iter);
1970 ADDOP(c, GET_ITER);
1971 compiler_use_next_block(c, start);
1972 ADDOP_JREL(c, FOR_ITER, cleanup);
1973 VISIT(c, expr, s->v.For.target);
1974 VISIT_SEQ(c, stmt, s->v.For.body);
1975 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
1976 compiler_use_next_block(c, cleanup);
1977 ADDOP(c, POP_BLOCK);
1978 compiler_pop_fblock(c, LOOP, start);
1979 VISIT_SEQ(c, stmt, s->v.For.orelse);
1980 compiler_use_next_block(c, end);
1981 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001982}
1983
1984static int
1985compiler_while(struct compiler *c, stmt_ty s)
1986{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001987 basicblock *loop, *orelse, *end, *anchor = NULL;
Georg Brandl8334fd92010-12-04 10:26:46 +00001988 int constant = expr_constant(c, s->v.While.test);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001989
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001990 if (constant == 0) {
1991 if (s->v.While.orelse)
1992 VISIT_SEQ(c, stmt, s->v.While.orelse);
1993 return 1;
1994 }
1995 loop = compiler_new_block(c);
1996 end = compiler_new_block(c);
1997 if (constant == -1) {
1998 anchor = compiler_new_block(c);
1999 if (anchor == NULL)
2000 return 0;
2001 }
2002 if (loop == NULL || end == NULL)
2003 return 0;
2004 if (s->v.While.orelse) {
2005 orelse = compiler_new_block(c);
2006 if (orelse == NULL)
2007 return 0;
2008 }
2009 else
2010 orelse = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002011
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002012 ADDOP_JREL(c, SETUP_LOOP, end);
2013 compiler_use_next_block(c, loop);
2014 if (!compiler_push_fblock(c, LOOP, loop))
2015 return 0;
2016 if (constant == -1) {
2017 VISIT(c, expr, s->v.While.test);
2018 ADDOP_JABS(c, POP_JUMP_IF_FALSE, anchor);
2019 }
2020 VISIT_SEQ(c, stmt, s->v.While.body);
2021 ADDOP_JABS(c, JUMP_ABSOLUTE, loop);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002022
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002023 /* XXX should the two POP instructions be in a separate block
2024 if there is no else clause ?
2025 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002026
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002027 if (constant == -1) {
2028 compiler_use_next_block(c, anchor);
2029 ADDOP(c, POP_BLOCK);
2030 }
2031 compiler_pop_fblock(c, LOOP, loop);
2032 if (orelse != NULL) /* what if orelse is just pass? */
2033 VISIT_SEQ(c, stmt, s->v.While.orelse);
2034 compiler_use_next_block(c, end);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002035
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002036 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002037}
2038
2039static int
2040compiler_continue(struct compiler *c)
2041{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002042 static const char LOOP_ERROR_MSG[] = "'continue' not properly in loop";
2043 static const char IN_FINALLY_ERROR_MSG[] =
2044 "'continue' not supported inside 'finally' clause";
2045 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002046
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002047 if (!c->u->u_nfblocks)
2048 return compiler_error(c, LOOP_ERROR_MSG);
2049 i = c->u->u_nfblocks - 1;
2050 switch (c->u->u_fblock[i].fb_type) {
2051 case LOOP:
2052 ADDOP_JABS(c, JUMP_ABSOLUTE, c->u->u_fblock[i].fb_block);
2053 break;
2054 case EXCEPT:
2055 case FINALLY_TRY:
2056 while (--i >= 0 && c->u->u_fblock[i].fb_type != LOOP) {
2057 /* Prevent continue anywhere under a finally
2058 even if hidden in a sub-try or except. */
2059 if (c->u->u_fblock[i].fb_type == FINALLY_END)
2060 return compiler_error(c, IN_FINALLY_ERROR_MSG);
2061 }
2062 if (i == -1)
2063 return compiler_error(c, LOOP_ERROR_MSG);
2064 ADDOP_JABS(c, CONTINUE_LOOP, c->u->u_fblock[i].fb_block);
2065 break;
2066 case FINALLY_END:
2067 return compiler_error(c, IN_FINALLY_ERROR_MSG);
2068 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002069
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002070 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002071}
2072
2073/* Code generated for "try: <body> finally: <finalbody>" is as follows:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002074
2075 SETUP_FINALLY L
2076 <code for body>
2077 POP_BLOCK
2078 LOAD_CONST <None>
2079 L: <code for finalbody>
2080 END_FINALLY
2081
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002082 The special instructions use the block stack. Each block
2083 stack entry contains the instruction that created it (here
2084 SETUP_FINALLY), the level of the value stack at the time the
2085 block stack entry was created, and a label (here L).
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002086
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002087 SETUP_FINALLY:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002088 Pushes the current value stack level and the label
2089 onto the block stack.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002090 POP_BLOCK:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002091 Pops en entry from the block stack, and pops the value
2092 stack until its level is the same as indicated on the
2093 block stack. (The label is ignored.)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002094 END_FINALLY:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002095 Pops a variable number of entries from the *value* stack
2096 and re-raises the exception they specify. The number of
2097 entries popped depends on the (pseudo) exception type.
2098
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002099 The block stack is unwound when an exception is raised:
2100 when a SETUP_FINALLY entry is found, the exception is pushed
2101 onto the value stack (and the exception condition is cleared),
2102 and the interpreter jumps to the label gotten from the block
2103 stack.
2104*/
2105
2106static int
2107compiler_try_finally(struct compiler *c, stmt_ty s)
2108{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002109 basicblock *body, *end;
2110 body = compiler_new_block(c);
2111 end = compiler_new_block(c);
2112 if (body == NULL || end == NULL)
2113 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002114
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002115 ADDOP_JREL(c, SETUP_FINALLY, end);
2116 compiler_use_next_block(c, body);
2117 if (!compiler_push_fblock(c, FINALLY_TRY, body))
2118 return 0;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002119 if (s->v.Try.handlers && asdl_seq_LEN(s->v.Try.handlers)) {
2120 if (!compiler_try_except(c, s))
2121 return 0;
2122 }
2123 else {
2124 VISIT_SEQ(c, stmt, s->v.Try.body);
2125 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002126 ADDOP(c, POP_BLOCK);
2127 compiler_pop_fblock(c, FINALLY_TRY, body);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002128
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002129 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2130 compiler_use_next_block(c, end);
2131 if (!compiler_push_fblock(c, FINALLY_END, end))
2132 return 0;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002133 VISIT_SEQ(c, stmt, s->v.Try.finalbody);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002134 ADDOP(c, END_FINALLY);
2135 compiler_pop_fblock(c, FINALLY_END, end);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002136
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002137 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002138}
2139
2140/*
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00002141 Code generated for "try: S except E1 as V1: S1 except E2 as V2: S2 ...":
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002142 (The contents of the value stack is shown in [], with the top
2143 at the right; 'tb' is trace-back info, 'val' the exception's
2144 associated value, and 'exc' the exception.)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002145
2146 Value stack Label Instruction Argument
2147 [] SETUP_EXCEPT L1
2148 [] <code for S>
2149 [] POP_BLOCK
2150 [] JUMP_FORWARD L0
2151
2152 [tb, val, exc] L1: DUP )
2153 [tb, val, exc, exc] <evaluate E1> )
2154 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
2155 [tb, val, exc, 1-or-0] POP_JUMP_IF_FALSE L2 )
2156 [tb, val, exc] POP
2157 [tb, val] <assign to V1> (or POP if no V1)
2158 [tb] POP
2159 [] <code for S1>
2160 JUMP_FORWARD L0
2161
2162 [tb, val, exc] L2: DUP
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002163 .............................etc.......................
2164
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002165 [tb, val, exc] Ln+1: END_FINALLY # re-raise exception
2166
2167 [] L0: <next statement>
2168
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002169 Of course, parts are not generated if Vi or Ei is not present.
2170*/
2171static int
2172compiler_try_except(struct compiler *c, stmt_ty s)
2173{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002174 basicblock *body, *orelse, *except, *end;
Victor Stinnerad9a0662013-11-19 22:23:20 +01002175 Py_ssize_t i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002176
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002177 body = compiler_new_block(c);
2178 except = compiler_new_block(c);
2179 orelse = compiler_new_block(c);
2180 end = compiler_new_block(c);
2181 if (body == NULL || except == NULL || orelse == NULL || end == NULL)
2182 return 0;
2183 ADDOP_JREL(c, SETUP_EXCEPT, except);
2184 compiler_use_next_block(c, body);
2185 if (!compiler_push_fblock(c, EXCEPT, body))
2186 return 0;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002187 VISIT_SEQ(c, stmt, s->v.Try.body);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002188 ADDOP(c, POP_BLOCK);
2189 compiler_pop_fblock(c, EXCEPT, body);
2190 ADDOP_JREL(c, JUMP_FORWARD, orelse);
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002191 n = asdl_seq_LEN(s->v.Try.handlers);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002192 compiler_use_next_block(c, except);
2193 for (i = 0; i < n; i++) {
2194 excepthandler_ty handler = (excepthandler_ty)asdl_seq_GET(
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002195 s->v.Try.handlers, i);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002196 if (!handler->v.ExceptHandler.type && i < n-1)
2197 return compiler_error(c, "default 'except:' must be last");
2198 c->u->u_lineno_set = 0;
2199 c->u->u_lineno = handler->lineno;
Benjamin Petersond4efd9e2010-09-20 23:02:10 +00002200 c->u->u_col_offset = handler->col_offset;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002201 except = compiler_new_block(c);
2202 if (except == NULL)
2203 return 0;
2204 if (handler->v.ExceptHandler.type) {
2205 ADDOP(c, DUP_TOP);
2206 VISIT(c, expr, handler->v.ExceptHandler.type);
2207 ADDOP_I(c, COMPARE_OP, PyCmp_EXC_MATCH);
2208 ADDOP_JABS(c, POP_JUMP_IF_FALSE, except);
2209 }
2210 ADDOP(c, POP_TOP);
2211 if (handler->v.ExceptHandler.name) {
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002212 basicblock *cleanup_end, *cleanup_body;
Guido van Rossumb940e112007-01-10 16:19:56 +00002213
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002214 cleanup_end = compiler_new_block(c);
2215 cleanup_body = compiler_new_block(c);
Benjamin Peterson0a5dad92011-05-27 14:17:04 -05002216 if (!(cleanup_end || cleanup_body))
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002217 return 0;
Guido van Rossumb940e112007-01-10 16:19:56 +00002218
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002219 compiler_nameop(c, handler->v.ExceptHandler.name, Store);
2220 ADDOP(c, POP_TOP);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002221
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002222 /*
2223 try:
Ezio Melotti1b6424f2013-04-19 07:10:09 +03002224 # body
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002225 except type as name:
Ezio Melotti1b6424f2013-04-19 07:10:09 +03002226 try:
2227 # body
2228 finally:
2229 name = None
2230 del name
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002231 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002232
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002233 /* second try: */
2234 ADDOP_JREL(c, SETUP_FINALLY, cleanup_end);
2235 compiler_use_next_block(c, cleanup_body);
2236 if (!compiler_push_fblock(c, FINALLY_TRY, cleanup_body))
2237 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002238
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002239 /* second # body */
2240 VISIT_SEQ(c, stmt, handler->v.ExceptHandler.body);
2241 ADDOP(c, POP_BLOCK);
2242 ADDOP(c, POP_EXCEPT);
2243 compiler_pop_fblock(c, FINALLY_TRY, cleanup_body);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002244
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002245 /* finally: */
2246 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2247 compiler_use_next_block(c, cleanup_end);
2248 if (!compiler_push_fblock(c, FINALLY_END, cleanup_end))
2249 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002250
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002251 /* name = None */
2252 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2253 compiler_nameop(c, handler->v.ExceptHandler.name, Store);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002254
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002255 /* del name */
2256 compiler_nameop(c, handler->v.ExceptHandler.name, Del);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002257
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002258 ADDOP(c, END_FINALLY);
2259 compiler_pop_fblock(c, FINALLY_END, cleanup_end);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002260 }
2261 else {
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002262 basicblock *cleanup_body;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002263
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002264 cleanup_body = compiler_new_block(c);
Benjamin Peterson0a5dad92011-05-27 14:17:04 -05002265 if (!cleanup_body)
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002266 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002267
Guido van Rossumb940e112007-01-10 16:19:56 +00002268 ADDOP(c, POP_TOP);
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002269 ADDOP(c, POP_TOP);
2270 compiler_use_next_block(c, cleanup_body);
2271 if (!compiler_push_fblock(c, FINALLY_TRY, cleanup_body))
2272 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002273 VISIT_SEQ(c, stmt, handler->v.ExceptHandler.body);
Benjamin Peterson74897ba2011-05-27 14:10:24 -05002274 ADDOP(c, POP_EXCEPT);
2275 compiler_pop_fblock(c, FINALLY_TRY, cleanup_body);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002276 }
2277 ADDOP_JREL(c, JUMP_FORWARD, end);
2278 compiler_use_next_block(c, except);
2279 }
2280 ADDOP(c, END_FINALLY);
2281 compiler_use_next_block(c, orelse);
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002282 VISIT_SEQ(c, stmt, s->v.Try.orelse);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002283 compiler_use_next_block(c, end);
2284 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002285}
2286
2287static int
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002288compiler_try(struct compiler *c, stmt_ty s) {
2289 if (s->v.Try.finalbody && asdl_seq_LEN(s->v.Try.finalbody))
2290 return compiler_try_finally(c, s);
2291 else
2292 return compiler_try_except(c, s);
2293}
2294
2295
2296static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002297compiler_import_as(struct compiler *c, identifier name, identifier asname)
2298{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002299 /* The IMPORT_NAME opcode was already generated. This function
2300 merely needs to bind the result to a name.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002301
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002302 If there is a dot in name, we need to split it and emit a
2303 LOAD_ATTR for each name.
2304 */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002305 Py_ssize_t dot = PyUnicode_FindChar(name, '.', 0,
2306 PyUnicode_GET_LENGTH(name), 1);
2307 if (dot == -2)
2308 return -1;
2309 if (dot != -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002310 /* Consume the base module name to get the first attribute */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002311 Py_ssize_t pos = dot + 1;
2312 while (dot != -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002313 PyObject *attr;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002314 dot = PyUnicode_FindChar(name, '.', pos,
2315 PyUnicode_GET_LENGTH(name), 1);
2316 if (dot == -2)
2317 return -1;
2318 attr = PyUnicode_Substring(name, pos,
2319 (dot != -1) ? dot :
2320 PyUnicode_GET_LENGTH(name));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002321 if (!attr)
2322 return -1;
2323 ADDOP_O(c, LOAD_ATTR, attr, names);
2324 Py_DECREF(attr);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002325 pos = dot + 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002326 }
2327 }
2328 return compiler_nameop(c, asname, Store);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002329}
2330
2331static int
2332compiler_import(struct compiler *c, stmt_ty s)
2333{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002334 /* The Import node stores a module name like a.b.c as a single
2335 string. This is convenient for all cases except
2336 import a.b.c as d
2337 where we need to parse that string to extract the individual
2338 module names.
2339 XXX Perhaps change the representation to make this case simpler?
2340 */
Victor Stinnerad9a0662013-11-19 22:23:20 +01002341 Py_ssize_t i, n = asdl_seq_LEN(s->v.Import.names);
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002342
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002343 for (i = 0; i < n; i++) {
2344 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.Import.names, i);
2345 int r;
2346 PyObject *level;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002347
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002348 level = PyLong_FromLong(0);
2349 if (level == NULL)
2350 return 0;
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002351
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002352 ADDOP_O(c, LOAD_CONST, level, consts);
2353 Py_DECREF(level);
2354 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2355 ADDOP_NAME(c, IMPORT_NAME, alias->name, names);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002356
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002357 if (alias->asname) {
2358 r = compiler_import_as(c, alias->name, alias->asname);
2359 if (!r)
2360 return r;
2361 }
2362 else {
2363 identifier tmp = alias->name;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002364 Py_ssize_t dot = PyUnicode_FindChar(
2365 alias->name, '.', 0, PyUnicode_GET_LENGTH(alias->name), 1);
Victor Stinner6b64a682013-07-11 22:50:45 +02002366 if (dot != -1) {
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002367 tmp = PyUnicode_Substring(alias->name, 0, dot);
Victor Stinner6b64a682013-07-11 22:50:45 +02002368 if (tmp == NULL)
2369 return 0;
2370 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002371 r = compiler_nameop(c, tmp, Store);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002372 if (dot != -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002373 Py_DECREF(tmp);
2374 }
2375 if (!r)
2376 return r;
2377 }
2378 }
2379 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002380}
2381
2382static int
2383compiler_from_import(struct compiler *c, stmt_ty s)
2384{
Victor Stinnerad9a0662013-11-19 22:23:20 +01002385 Py_ssize_t i, n = asdl_seq_LEN(s->v.ImportFrom.names);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002386
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002387 PyObject *names = PyTuple_New(n);
2388 PyObject *level;
2389 static PyObject *empty_string;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002390
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002391 if (!empty_string) {
2392 empty_string = PyUnicode_FromString("");
2393 if (!empty_string)
2394 return 0;
2395 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002396
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002397 if (!names)
2398 return 0;
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002399
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002400 level = PyLong_FromLong(s->v.ImportFrom.level);
2401 if (!level) {
2402 Py_DECREF(names);
2403 return 0;
2404 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002405
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002406 /* build up the names */
2407 for (i = 0; i < n; i++) {
2408 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);
2409 Py_INCREF(alias->name);
2410 PyTuple_SET_ITEM(names, i, alias->name);
2411 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002412
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002413 if (s->lineno > c->c_future->ff_lineno && s->v.ImportFrom.module &&
2414 !PyUnicode_CompareWithASCIIString(s->v.ImportFrom.module, "__future__")) {
2415 Py_DECREF(level);
2416 Py_DECREF(names);
2417 return compiler_error(c, "from __future__ imports must occur "
2418 "at the beginning of the file");
2419 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002420
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002421 ADDOP_O(c, LOAD_CONST, level, consts);
2422 Py_DECREF(level);
2423 ADDOP_O(c, LOAD_CONST, names, consts);
2424 Py_DECREF(names);
2425 if (s->v.ImportFrom.module) {
2426 ADDOP_NAME(c, IMPORT_NAME, s->v.ImportFrom.module, names);
2427 }
2428 else {
2429 ADDOP_NAME(c, IMPORT_NAME, empty_string, names);
2430 }
2431 for (i = 0; i < n; i++) {
2432 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);
2433 identifier store_name;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002434
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002435 if (i == 0 && PyUnicode_READ_CHAR(alias->name, 0) == '*') {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002436 assert(n == 1);
2437 ADDOP(c, IMPORT_STAR);
2438 return 1;
2439 }
2440
2441 ADDOP_NAME(c, IMPORT_FROM, alias->name, names);
2442 store_name = alias->name;
2443 if (alias->asname)
2444 store_name = alias->asname;
2445
2446 if (!compiler_nameop(c, store_name, Store)) {
2447 Py_DECREF(names);
2448 return 0;
2449 }
2450 }
2451 /* remove imported module */
2452 ADDOP(c, POP_TOP);
2453 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002454}
2455
2456static int
2457compiler_assert(struct compiler *c, stmt_ty s)
2458{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002459 static PyObject *assertion_error = NULL;
2460 basicblock *end;
Victor Stinner14e461d2013-08-26 22:28:21 +02002461 PyObject* msg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002462
Georg Brandl8334fd92010-12-04 10:26:46 +00002463 if (c->c_optimize)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002464 return 1;
2465 if (assertion_error == NULL) {
2466 assertion_error = PyUnicode_InternFromString("AssertionError");
2467 if (assertion_error == NULL)
2468 return 0;
2469 }
2470 if (s->v.Assert.test->kind == Tuple_kind &&
2471 asdl_seq_LEN(s->v.Assert.test->v.Tuple.elts) > 0) {
Victor Stinner14e461d2013-08-26 22:28:21 +02002472 msg = PyUnicode_FromString("assertion is always true, "
2473 "perhaps remove parentheses?");
2474 if (msg == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002475 return 0;
Victor Stinner14e461d2013-08-26 22:28:21 +02002476 if (PyErr_WarnExplicitObject(PyExc_SyntaxWarning, msg,
2477 c->c_filename, c->u->u_lineno,
2478 NULL, NULL) == -1) {
2479 Py_DECREF(msg);
2480 return 0;
2481 }
2482 Py_DECREF(msg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002483 }
2484 VISIT(c, expr, s->v.Assert.test);
2485 end = compiler_new_block(c);
2486 if (end == NULL)
2487 return 0;
2488 ADDOP_JABS(c, POP_JUMP_IF_TRUE, end);
2489 ADDOP_O(c, LOAD_GLOBAL, assertion_error, names);
2490 if (s->v.Assert.msg) {
2491 VISIT(c, expr, s->v.Assert.msg);
2492 ADDOP_I(c, CALL_FUNCTION, 1);
2493 }
2494 ADDOP_I(c, RAISE_VARARGS, 1);
2495 compiler_use_next_block(c, end);
2496 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002497}
2498
2499static int
2500compiler_visit_stmt(struct compiler *c, stmt_ty s)
2501{
Victor Stinnerad9a0662013-11-19 22:23:20 +01002502 Py_ssize_t i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002503
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002504 /* Always assign a lineno to the next instruction for a stmt. */
2505 c->u->u_lineno = s->lineno;
Benjamin Petersond4efd9e2010-09-20 23:02:10 +00002506 c->u->u_col_offset = s->col_offset;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002507 c->u->u_lineno_set = 0;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002508
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002509 switch (s->kind) {
2510 case FunctionDef_kind:
2511 return compiler_function(c, s);
2512 case ClassDef_kind:
2513 return compiler_class(c, s);
2514 case Return_kind:
2515 if (c->u->u_ste->ste_type != FunctionBlock)
2516 return compiler_error(c, "'return' outside function");
2517 if (s->v.Return.value) {
2518 VISIT(c, expr, s->v.Return.value);
2519 }
2520 else
2521 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2522 ADDOP(c, RETURN_VALUE);
2523 break;
2524 case Delete_kind:
2525 VISIT_SEQ(c, expr, s->v.Delete.targets)
2526 break;
2527 case Assign_kind:
2528 n = asdl_seq_LEN(s->v.Assign.targets);
2529 VISIT(c, expr, s->v.Assign.value);
2530 for (i = 0; i < n; i++) {
2531 if (i < n - 1)
2532 ADDOP(c, DUP_TOP);
2533 VISIT(c, expr,
2534 (expr_ty)asdl_seq_GET(s->v.Assign.targets, i));
2535 }
2536 break;
2537 case AugAssign_kind:
2538 return compiler_augassign(c, s);
2539 case For_kind:
2540 return compiler_for(c, s);
2541 case While_kind:
2542 return compiler_while(c, s);
2543 case If_kind:
2544 return compiler_if(c, s);
2545 case Raise_kind:
2546 n = 0;
2547 if (s->v.Raise.exc) {
2548 VISIT(c, expr, s->v.Raise.exc);
2549 n++;
Victor Stinnerad9a0662013-11-19 22:23:20 +01002550 if (s->v.Raise.cause) {
2551 VISIT(c, expr, s->v.Raise.cause);
2552 n++;
2553 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002554 }
Victor Stinnerad9a0662013-11-19 22:23:20 +01002555 ADDOP_I(c, RAISE_VARARGS, (int)n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002556 break;
Benjamin Peterson43af12b2011-05-29 11:43:10 -05002557 case Try_kind:
2558 return compiler_try(c, s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002559 case Assert_kind:
2560 return compiler_assert(c, s);
2561 case Import_kind:
2562 return compiler_import(c, s);
2563 case ImportFrom_kind:
2564 return compiler_from_import(c, s);
2565 case Global_kind:
2566 case Nonlocal_kind:
2567 break;
2568 case Expr_kind:
2569 if (c->c_interactive && c->c_nestlevel <= 1) {
2570 VISIT(c, expr, s->v.Expr.value);
2571 ADDOP(c, PRINT_EXPR);
2572 }
2573 else if (s->v.Expr.value->kind != Str_kind &&
2574 s->v.Expr.value->kind != Num_kind) {
2575 VISIT(c, expr, s->v.Expr.value);
2576 ADDOP(c, POP_TOP);
2577 }
2578 break;
2579 case Pass_kind:
2580 break;
2581 case Break_kind:
2582 if (!compiler_in_loop(c))
2583 return compiler_error(c, "'break' outside loop");
2584 ADDOP(c, BREAK_LOOP);
2585 break;
2586 case Continue_kind:
2587 return compiler_continue(c);
2588 case With_kind:
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05002589 return compiler_with(c, s, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002590 }
2591 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002592}
2593
2594static int
2595unaryop(unaryop_ty op)
2596{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002597 switch (op) {
2598 case Invert:
2599 return UNARY_INVERT;
2600 case Not:
2601 return UNARY_NOT;
2602 case UAdd:
2603 return UNARY_POSITIVE;
2604 case USub:
2605 return UNARY_NEGATIVE;
2606 default:
2607 PyErr_Format(PyExc_SystemError,
2608 "unary op %d should not be possible", op);
2609 return 0;
2610 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002611}
2612
2613static int
2614binop(struct compiler *c, operator_ty op)
2615{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002616 switch (op) {
2617 case Add:
2618 return BINARY_ADD;
2619 case Sub:
2620 return BINARY_SUBTRACT;
2621 case Mult:
2622 return BINARY_MULTIPLY;
2623 case Div:
2624 return BINARY_TRUE_DIVIDE;
2625 case Mod:
2626 return BINARY_MODULO;
2627 case Pow:
2628 return BINARY_POWER;
2629 case LShift:
2630 return BINARY_LSHIFT;
2631 case RShift:
2632 return BINARY_RSHIFT;
2633 case BitOr:
2634 return BINARY_OR;
2635 case BitXor:
2636 return BINARY_XOR;
2637 case BitAnd:
2638 return BINARY_AND;
2639 case FloorDiv:
2640 return BINARY_FLOOR_DIVIDE;
2641 default:
2642 PyErr_Format(PyExc_SystemError,
2643 "binary op %d should not be possible", op);
2644 return 0;
2645 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002646}
2647
2648static int
2649cmpop(cmpop_ty op)
2650{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002651 switch (op) {
2652 case Eq:
2653 return PyCmp_EQ;
2654 case NotEq:
2655 return PyCmp_NE;
2656 case Lt:
2657 return PyCmp_LT;
2658 case LtE:
2659 return PyCmp_LE;
2660 case Gt:
2661 return PyCmp_GT;
2662 case GtE:
2663 return PyCmp_GE;
2664 case Is:
2665 return PyCmp_IS;
2666 case IsNot:
2667 return PyCmp_IS_NOT;
2668 case In:
2669 return PyCmp_IN;
2670 case NotIn:
2671 return PyCmp_NOT_IN;
2672 default:
2673 return PyCmp_BAD;
2674 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002675}
2676
2677static int
2678inplace_binop(struct compiler *c, operator_ty op)
2679{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002680 switch (op) {
2681 case Add:
2682 return INPLACE_ADD;
2683 case Sub:
2684 return INPLACE_SUBTRACT;
2685 case Mult:
2686 return INPLACE_MULTIPLY;
2687 case Div:
2688 return INPLACE_TRUE_DIVIDE;
2689 case Mod:
2690 return INPLACE_MODULO;
2691 case Pow:
2692 return INPLACE_POWER;
2693 case LShift:
2694 return INPLACE_LSHIFT;
2695 case RShift:
2696 return INPLACE_RSHIFT;
2697 case BitOr:
2698 return INPLACE_OR;
2699 case BitXor:
2700 return INPLACE_XOR;
2701 case BitAnd:
2702 return INPLACE_AND;
2703 case FloorDiv:
2704 return INPLACE_FLOOR_DIVIDE;
2705 default:
2706 PyErr_Format(PyExc_SystemError,
2707 "inplace binary op %d should not be possible", op);
2708 return 0;
2709 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002710}
2711
2712static int
2713compiler_nameop(struct compiler *c, identifier name, expr_context_ty ctx)
2714{
Victor Stinnerad9a0662013-11-19 22:23:20 +01002715 int op, scope;
2716 Py_ssize_t arg;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002717 enum { OP_FAST, OP_GLOBAL, OP_DEREF, OP_NAME } optype;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002718
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002719 PyObject *dict = c->u->u_names;
2720 PyObject *mangled;
2721 /* XXX AugStore isn't used anywhere! */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002722
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002723 mangled = _Py_Mangle(c->u->u_private, name);
2724 if (!mangled)
2725 return 0;
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002726
Benjamin Peterson70b224d2012-12-06 17:49:58 -05002727 assert(PyUnicode_CompareWithASCIIString(name, "None") &&
2728 PyUnicode_CompareWithASCIIString(name, "True") &&
2729 PyUnicode_CompareWithASCIIString(name, "False"));
2730
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002731 op = 0;
2732 optype = OP_NAME;
2733 scope = PyST_GetScope(c->u->u_ste, mangled);
2734 switch (scope) {
2735 case FREE:
2736 dict = c->u->u_freevars;
2737 optype = OP_DEREF;
2738 break;
2739 case CELL:
2740 dict = c->u->u_cellvars;
2741 optype = OP_DEREF;
2742 break;
2743 case LOCAL:
2744 if (c->u->u_ste->ste_type == FunctionBlock)
2745 optype = OP_FAST;
2746 break;
2747 case GLOBAL_IMPLICIT:
2748 if (c->u->u_ste->ste_type == FunctionBlock &&
2749 !c->u->u_ste->ste_unoptimized)
2750 optype = OP_GLOBAL;
2751 break;
2752 case GLOBAL_EXPLICIT:
2753 optype = OP_GLOBAL;
2754 break;
2755 default:
2756 /* scope can be 0 */
2757 break;
2758 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002759
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002760 /* XXX Leave assert here, but handle __doc__ and the like better */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002761 assert(scope || PyUnicode_READ_CHAR(name, 0) == '_');
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002762
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002763 switch (optype) {
2764 case OP_DEREF:
2765 switch (ctx) {
Benjamin Peterson3b0431d2013-04-30 09:41:40 -04002766 case Load:
2767 op = (c->u->u_ste->ste_type == ClassBlock) ? LOAD_CLASSDEREF : LOAD_DEREF;
2768 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002769 case Store: op = STORE_DEREF; break;
2770 case AugLoad:
2771 case AugStore:
2772 break;
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00002773 case Del: op = DELETE_DEREF; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002774 case Param:
2775 default:
2776 PyErr_SetString(PyExc_SystemError,
2777 "param invalid for deref variable");
2778 return 0;
2779 }
2780 break;
2781 case OP_FAST:
2782 switch (ctx) {
2783 case Load: op = LOAD_FAST; break;
2784 case Store: op = STORE_FAST; break;
2785 case Del: op = DELETE_FAST; break;
2786 case AugLoad:
2787 case AugStore:
2788 break;
2789 case Param:
2790 default:
2791 PyErr_SetString(PyExc_SystemError,
2792 "param invalid for local variable");
2793 return 0;
2794 }
2795 ADDOP_O(c, op, mangled, varnames);
2796 Py_DECREF(mangled);
2797 return 1;
2798 case OP_GLOBAL:
2799 switch (ctx) {
2800 case Load: op = LOAD_GLOBAL; break;
2801 case Store: op = STORE_GLOBAL; break;
2802 case Del: op = DELETE_GLOBAL; break;
2803 case AugLoad:
2804 case AugStore:
2805 break;
2806 case Param:
2807 default:
2808 PyErr_SetString(PyExc_SystemError,
2809 "param invalid for global variable");
2810 return 0;
2811 }
2812 break;
2813 case OP_NAME:
2814 switch (ctx) {
Benjamin Peterson20f9c3c2010-07-20 22:39:34 +00002815 case Load: op = LOAD_NAME; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002816 case Store: op = STORE_NAME; break;
2817 case Del: op = DELETE_NAME; break;
2818 case AugLoad:
2819 case AugStore:
2820 break;
2821 case Param:
2822 default:
2823 PyErr_SetString(PyExc_SystemError,
2824 "param invalid for name variable");
2825 return 0;
2826 }
2827 break;
2828 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002829
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002830 assert(op);
2831 arg = compiler_add_o(c, dict, mangled);
2832 Py_DECREF(mangled);
2833 if (arg < 0)
2834 return 0;
2835 return compiler_addop_i(c, op, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002836}
2837
2838static int
2839compiler_boolop(struct compiler *c, expr_ty e)
2840{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002841 basicblock *end;
Victor Stinnerad9a0662013-11-19 22:23:20 +01002842 int jumpi;
2843 Py_ssize_t i, n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002844 asdl_seq *s;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002845
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002846 assert(e->kind == BoolOp_kind);
2847 if (e->v.BoolOp.op == And)
2848 jumpi = JUMP_IF_FALSE_OR_POP;
2849 else
2850 jumpi = JUMP_IF_TRUE_OR_POP;
2851 end = compiler_new_block(c);
2852 if (end == NULL)
2853 return 0;
2854 s = e->v.BoolOp.values;
2855 n = asdl_seq_LEN(s) - 1;
2856 assert(n >= 0);
2857 for (i = 0; i < n; ++i) {
2858 VISIT(c, expr, (expr_ty)asdl_seq_GET(s, i));
2859 ADDOP_JABS(c, jumpi, end);
2860 }
2861 VISIT(c, expr, (expr_ty)asdl_seq_GET(s, n));
2862 compiler_use_next_block(c, end);
2863 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002864}
2865
2866static int
2867compiler_list(struct compiler *c, expr_ty e)
2868{
Victor Stinnerad9a0662013-11-19 22:23:20 +01002869 Py_ssize_t n = asdl_seq_LEN(e->v.List.elts);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002870 if (e->v.List.ctx == Store) {
2871 int i, seen_star = 0;
2872 for (i = 0; i < n; i++) {
2873 expr_ty elt = asdl_seq_GET(e->v.List.elts, i);
2874 if (elt->kind == Starred_kind && !seen_star) {
2875 if ((i >= (1 << 8)) ||
2876 (n-i-1 >= (INT_MAX >> 8)))
2877 return compiler_error(c,
2878 "too many expressions in "
2879 "star-unpacking assignment");
2880 ADDOP_I(c, UNPACK_EX, (i + ((n-i-1) << 8)));
2881 seen_star = 1;
2882 asdl_seq_SET(e->v.List.elts, i, elt->v.Starred.value);
2883 } else if (elt->kind == Starred_kind) {
2884 return compiler_error(c,
2885 "two starred expressions in assignment");
2886 }
2887 }
2888 if (!seen_star) {
2889 ADDOP_I(c, UNPACK_SEQUENCE, n);
2890 }
2891 }
2892 VISIT_SEQ(c, expr, e->v.List.elts);
2893 if (e->v.List.ctx == Load) {
2894 ADDOP_I(c, BUILD_LIST, n);
2895 }
2896 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002897}
2898
2899static int
2900compiler_tuple(struct compiler *c, expr_ty e)
2901{
Victor Stinnerad9a0662013-11-19 22:23:20 +01002902 Py_ssize_t n = asdl_seq_LEN(e->v.Tuple.elts);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002903 if (e->v.Tuple.ctx == Store) {
2904 int i, seen_star = 0;
2905 for (i = 0; i < n; i++) {
2906 expr_ty elt = asdl_seq_GET(e->v.Tuple.elts, i);
2907 if (elt->kind == Starred_kind && !seen_star) {
2908 if ((i >= (1 << 8)) ||
2909 (n-i-1 >= (INT_MAX >> 8)))
2910 return compiler_error(c,
2911 "too many expressions in "
2912 "star-unpacking assignment");
2913 ADDOP_I(c, UNPACK_EX, (i + ((n-i-1) << 8)));
2914 seen_star = 1;
2915 asdl_seq_SET(e->v.Tuple.elts, i, elt->v.Starred.value);
2916 } else if (elt->kind == Starred_kind) {
2917 return compiler_error(c,
2918 "two starred expressions in assignment");
2919 }
2920 }
2921 if (!seen_star) {
2922 ADDOP_I(c, UNPACK_SEQUENCE, n);
2923 }
2924 }
2925 VISIT_SEQ(c, expr, e->v.Tuple.elts);
2926 if (e->v.Tuple.ctx == Load) {
2927 ADDOP_I(c, BUILD_TUPLE, n);
2928 }
2929 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002930}
2931
2932static int
2933compiler_compare(struct compiler *c, expr_ty e)
2934{
Victor Stinnerad9a0662013-11-19 22:23:20 +01002935 Py_ssize_t i, n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002936 basicblock *cleanup = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002937
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002938 /* XXX the logic can be cleaned up for 1 or multiple comparisons */
2939 VISIT(c, expr, e->v.Compare.left);
2940 n = asdl_seq_LEN(e->v.Compare.ops);
2941 assert(n > 0);
2942 if (n > 1) {
2943 cleanup = compiler_new_block(c);
2944 if (cleanup == NULL)
2945 return 0;
2946 VISIT(c, expr,
2947 (expr_ty)asdl_seq_GET(e->v.Compare.comparators, 0));
2948 }
2949 for (i = 1; i < n; i++) {
2950 ADDOP(c, DUP_TOP);
2951 ADDOP(c, ROT_THREE);
2952 ADDOP_I(c, COMPARE_OP,
2953 cmpop((cmpop_ty)(asdl_seq_GET(
2954 e->v.Compare.ops, i - 1))));
2955 ADDOP_JABS(c, JUMP_IF_FALSE_OR_POP, cleanup);
2956 NEXT_BLOCK(c);
2957 if (i < (n - 1))
2958 VISIT(c, expr,
2959 (expr_ty)asdl_seq_GET(e->v.Compare.comparators, i));
2960 }
2961 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, n - 1));
2962 ADDOP_I(c, COMPARE_OP,
2963 cmpop((cmpop_ty)(asdl_seq_GET(e->v.Compare.ops, n - 1))));
2964 if (n > 1) {
2965 basicblock *end = compiler_new_block(c);
2966 if (end == NULL)
2967 return 0;
2968 ADDOP_JREL(c, JUMP_FORWARD, end);
2969 compiler_use_next_block(c, cleanup);
2970 ADDOP(c, ROT_TWO);
2971 ADDOP(c, POP_TOP);
2972 compiler_use_next_block(c, end);
2973 }
2974 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002975}
2976
2977static int
2978compiler_call(struct compiler *c, expr_ty e)
2979{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002980 VISIT(c, expr, e->v.Call.func);
2981 return compiler_call_helper(c, 0,
2982 e->v.Call.args,
2983 e->v.Call.keywords,
2984 e->v.Call.starargs,
2985 e->v.Call.kwargs);
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002986}
2987
2988/* shared code between compiler_call and compiler_class */
2989static int
2990compiler_call_helper(struct compiler *c,
Victor Stinnerad9a0662013-11-19 22:23:20 +01002991 Py_ssize_t n, /* Args already pushed */
2992 asdl_seq *args,
2993 asdl_seq *keywords,
2994 expr_ty starargs,
2995 expr_ty kwargs)
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002996{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002997 int code = 0;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002998
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002999 n += asdl_seq_LEN(args);
3000 VISIT_SEQ(c, expr, args);
3001 if (keywords) {
3002 VISIT_SEQ(c, keyword, keywords);
3003 n |= asdl_seq_LEN(keywords) << 8;
3004 }
3005 if (starargs) {
3006 VISIT(c, expr, starargs);
3007 code |= 1;
3008 }
3009 if (kwargs) {
3010 VISIT(c, expr, kwargs);
3011 code |= 2;
3012 }
3013 switch (code) {
3014 case 0:
3015 ADDOP_I(c, CALL_FUNCTION, n);
3016 break;
3017 case 1:
3018 ADDOP_I(c, CALL_FUNCTION_VAR, n);
3019 break;
3020 case 2:
3021 ADDOP_I(c, CALL_FUNCTION_KW, n);
3022 break;
3023 case 3:
3024 ADDOP_I(c, CALL_FUNCTION_VAR_KW, n);
3025 break;
3026 }
3027 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003028}
3029
Nick Coghlan650f0d02007-04-15 12:05:43 +00003030
3031/* List and set comprehensions and generator expressions work by creating a
3032 nested function to perform the actual iteration. This means that the
3033 iteration variables don't leak into the current scope.
3034 The defined function is called immediately following its definition, with the
3035 result of that call being the result of the expression.
3036 The LC/SC version returns the populated container, while the GE version is
3037 flagged in symtable.c as a generator, so it returns the generator object
3038 when the function is called.
3039 This code *knows* that the loop cannot contain break, continue, or return,
3040 so it cheats and skips the SETUP_LOOP/POP_BLOCK steps used in normal loops.
3041
3042 Possible cleanups:
3043 - iterate over the generator sequence instead of using recursion
3044*/
3045
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003046static int
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003047compiler_comprehension_generator(struct compiler *c,
3048 asdl_seq *generators, int gen_index,
3049 expr_ty elt, expr_ty val, int type)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003050{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003051 /* generate code for the iterator, then each of the ifs,
3052 and then write to the element */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003053
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003054 comprehension_ty gen;
3055 basicblock *start, *anchor, *skip, *if_cleanup;
Victor Stinnerad9a0662013-11-19 22:23:20 +01003056 Py_ssize_t i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003057
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003058 start = compiler_new_block(c);
3059 skip = compiler_new_block(c);
3060 if_cleanup = compiler_new_block(c);
3061 anchor = compiler_new_block(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003062
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003063 if (start == NULL || skip == NULL || if_cleanup == NULL ||
3064 anchor == NULL)
3065 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003066
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003067 gen = (comprehension_ty)asdl_seq_GET(generators, gen_index);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003068
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003069 if (gen_index == 0) {
3070 /* Receive outermost iter as an implicit argument */
3071 c->u->u_argcount = 1;
3072 ADDOP_I(c, LOAD_FAST, 0);
3073 }
3074 else {
3075 /* Sub-iter - calculate on the fly */
3076 VISIT(c, expr, gen->iter);
3077 ADDOP(c, GET_ITER);
3078 }
3079 compiler_use_next_block(c, start);
3080 ADDOP_JREL(c, FOR_ITER, anchor);
3081 NEXT_BLOCK(c);
3082 VISIT(c, expr, gen->target);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003083
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003084 /* XXX this needs to be cleaned up...a lot! */
3085 n = asdl_seq_LEN(gen->ifs);
3086 for (i = 0; i < n; i++) {
3087 expr_ty e = (expr_ty)asdl_seq_GET(gen->ifs, i);
3088 VISIT(c, expr, e);
3089 ADDOP_JABS(c, POP_JUMP_IF_FALSE, if_cleanup);
3090 NEXT_BLOCK(c);
3091 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003092
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003093 if (++gen_index < asdl_seq_LEN(generators))
3094 if (!compiler_comprehension_generator(c,
3095 generators, gen_index,
3096 elt, val, type))
3097 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003098
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003099 /* only append after the last for generator */
3100 if (gen_index >= asdl_seq_LEN(generators)) {
3101 /* comprehension specific code */
3102 switch (type) {
3103 case COMP_GENEXP:
3104 VISIT(c, expr, elt);
3105 ADDOP(c, YIELD_VALUE);
3106 ADDOP(c, POP_TOP);
3107 break;
3108 case COMP_LISTCOMP:
3109 VISIT(c, expr, elt);
3110 ADDOP_I(c, LIST_APPEND, gen_index + 1);
3111 break;
3112 case COMP_SETCOMP:
3113 VISIT(c, expr, elt);
3114 ADDOP_I(c, SET_ADD, gen_index + 1);
3115 break;
3116 case COMP_DICTCOMP:
3117 /* With 'd[k] = v', v is evaluated before k, so we do
3118 the same. */
3119 VISIT(c, expr, val);
3120 VISIT(c, expr, elt);
3121 ADDOP_I(c, MAP_ADD, gen_index + 1);
3122 break;
3123 default:
3124 return 0;
3125 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003126
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003127 compiler_use_next_block(c, skip);
3128 }
3129 compiler_use_next_block(c, if_cleanup);
3130 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
3131 compiler_use_next_block(c, anchor);
3132
3133 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003134}
3135
3136static int
Nick Coghlan650f0d02007-04-15 12:05:43 +00003137compiler_comprehension(struct compiler *c, expr_ty e, int type, identifier name,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003138 asdl_seq *generators, expr_ty elt, expr_ty val)
Nick Coghlan650f0d02007-04-15 12:05:43 +00003139{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003140 PyCodeObject *co = NULL;
3141 expr_ty outermost_iter;
Antoine Pitrou86a36b52011-11-25 18:56:07 +01003142 PyObject *qualname = NULL;
Nick Coghlan650f0d02007-04-15 12:05:43 +00003143
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003144 outermost_iter = ((comprehension_ty)
3145 asdl_seq_GET(generators, 0))->iter;
Nick Coghlan650f0d02007-04-15 12:05:43 +00003146
Antoine Pitrou86a36b52011-11-25 18:56:07 +01003147 if (!compiler_enter_scope(c, name, COMPILER_SCOPE_COMPREHENSION,
3148 (void *)e, e->lineno))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003149 goto error;
Nick Coghlan650f0d02007-04-15 12:05:43 +00003150
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003151 if (type != COMP_GENEXP) {
3152 int op;
3153 switch (type) {
3154 case COMP_LISTCOMP:
3155 op = BUILD_LIST;
3156 break;
3157 case COMP_SETCOMP:
3158 op = BUILD_SET;
3159 break;
3160 case COMP_DICTCOMP:
3161 op = BUILD_MAP;
3162 break;
3163 default:
3164 PyErr_Format(PyExc_SystemError,
3165 "unknown comprehension type %d", type);
3166 goto error_in_scope;
3167 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00003168
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003169 ADDOP_I(c, op, 0);
3170 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00003171
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003172 if (!compiler_comprehension_generator(c, generators, 0, elt,
3173 val, type))
3174 goto error_in_scope;
Nick Coghlan650f0d02007-04-15 12:05:43 +00003175
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003176 if (type != COMP_GENEXP) {
3177 ADDOP(c, RETURN_VALUE);
3178 }
3179
3180 co = assemble(c, 1);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04003181 qualname = c->u->u_qualname;
3182 Py_INCREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003183 compiler_exit_scope(c);
Benjamin Peterson6b4f7802013-10-20 17:50:28 -04003184 if (co == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003185 goto error;
3186
Antoine Pitrou86a36b52011-11-25 18:56:07 +01003187 if (!compiler_make_closure(c, co, 0, qualname))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003188 goto error;
Antoine Pitrou86a36b52011-11-25 18:56:07 +01003189 Py_DECREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003190 Py_DECREF(co);
3191
3192 VISIT(c, expr, outermost_iter);
3193 ADDOP(c, GET_ITER);
3194 ADDOP_I(c, CALL_FUNCTION, 1);
3195 return 1;
Nick Coghlan650f0d02007-04-15 12:05:43 +00003196error_in_scope:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003197 compiler_exit_scope(c);
Nick Coghlan650f0d02007-04-15 12:05:43 +00003198error:
Antoine Pitrou86a36b52011-11-25 18:56:07 +01003199 Py_XDECREF(qualname);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003200 Py_XDECREF(co);
3201 return 0;
Nick Coghlan650f0d02007-04-15 12:05:43 +00003202}
3203
3204static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003205compiler_genexp(struct compiler *c, expr_ty e)
3206{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003207 static identifier name;
3208 if (!name) {
3209 name = PyUnicode_FromString("<genexpr>");
3210 if (!name)
3211 return 0;
3212 }
3213 assert(e->kind == GeneratorExp_kind);
3214 return compiler_comprehension(c, e, COMP_GENEXP, name,
3215 e->v.GeneratorExp.generators,
3216 e->v.GeneratorExp.elt, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003217}
3218
3219static int
Nick Coghlan650f0d02007-04-15 12:05:43 +00003220compiler_listcomp(struct compiler *c, expr_ty e)
3221{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003222 static identifier name;
3223 if (!name) {
3224 name = PyUnicode_FromString("<listcomp>");
3225 if (!name)
3226 return 0;
3227 }
3228 assert(e->kind == ListComp_kind);
3229 return compiler_comprehension(c, e, COMP_LISTCOMP, name,
3230 e->v.ListComp.generators,
3231 e->v.ListComp.elt, NULL);
Nick Coghlan650f0d02007-04-15 12:05:43 +00003232}
3233
3234static int
3235compiler_setcomp(struct compiler *c, expr_ty e)
3236{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003237 static identifier name;
3238 if (!name) {
3239 name = PyUnicode_FromString("<setcomp>");
3240 if (!name)
3241 return 0;
3242 }
3243 assert(e->kind == SetComp_kind);
3244 return compiler_comprehension(c, e, COMP_SETCOMP, name,
3245 e->v.SetComp.generators,
3246 e->v.SetComp.elt, NULL);
Guido van Rossum992d4a32007-07-11 13:09:30 +00003247}
3248
3249
3250static int
3251compiler_dictcomp(struct compiler *c, expr_ty e)
3252{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003253 static identifier name;
3254 if (!name) {
3255 name = PyUnicode_FromString("<dictcomp>");
3256 if (!name)
3257 return 0;
3258 }
3259 assert(e->kind == DictComp_kind);
3260 return compiler_comprehension(c, e, COMP_DICTCOMP, name,
3261 e->v.DictComp.generators,
3262 e->v.DictComp.key, e->v.DictComp.value);
Nick Coghlan650f0d02007-04-15 12:05:43 +00003263}
3264
3265
3266static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003267compiler_visit_keyword(struct compiler *c, keyword_ty k)
3268{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003269 ADDOP_O(c, LOAD_CONST, k->arg, consts);
3270 VISIT(c, expr, k->value);
3271 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003272}
3273
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003274/* Test whether expression is constant. For constants, report
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003275 whether they are true or false.
3276
3277 Return values: 1 for true, 0 for false, -1 for non-constant.
3278 */
3279
3280static int
Georg Brandl8334fd92010-12-04 10:26:46 +00003281expr_constant(struct compiler *c, expr_ty e)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003282{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003283 char *id;
3284 switch (e->kind) {
3285 case Ellipsis_kind:
3286 return 1;
3287 case Num_kind:
3288 return PyObject_IsTrue(e->v.Num.n);
3289 case Str_kind:
3290 return PyObject_IsTrue(e->v.Str.s);
3291 case Name_kind:
3292 /* optimize away names that can't be reassigned */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003293 id = PyUnicode_AsUTF8(e->v.Name.id);
Benjamin Peterson442f2092012-12-06 17:41:04 -05003294 if (id && strcmp(id, "__debug__") == 0)
3295 return !c->c_optimize;
3296 return -1;
3297 case NameConstant_kind: {
3298 PyObject *o = e->v.NameConstant.value;
3299 if (o == Py_None)
3300 return 0;
3301 else if (o == Py_True)
3302 return 1;
3303 else if (o == Py_False)
3304 return 0;
3305 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003306 default:
3307 return -1;
3308 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003309}
3310
Guido van Rossumc2e20742006-02-27 22:32:47 +00003311/*
3312 Implements the with statement from PEP 343.
3313
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003314 The semantics outlined in that PEP are as follows:
Guido van Rossumc2e20742006-02-27 22:32:47 +00003315
3316 with EXPR as VAR:
3317 BLOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003318
Guido van Rossumc2e20742006-02-27 22:32:47 +00003319 It is implemented roughly as:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003320
Thomas Wouters477c8d52006-05-27 19:21:47 +00003321 context = EXPR
Guido van Rossumc2e20742006-02-27 22:32:47 +00003322 exit = context.__exit__ # not calling it
3323 value = context.__enter__()
3324 try:
3325 VAR = value # if VAR present in the syntax
3326 BLOCK
3327 finally:
3328 if an exception was raised:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003329 exc = copy of (exception, instance, traceback)
Guido van Rossumc2e20742006-02-27 22:32:47 +00003330 else:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003331 exc = (None, None, None)
Guido van Rossumc2e20742006-02-27 22:32:47 +00003332 exit(*exc)
3333 */
3334static int
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003335compiler_with(struct compiler *c, stmt_ty s, int pos)
Guido van Rossumc2e20742006-02-27 22:32:47 +00003336{
Guido van Rossumc2e20742006-02-27 22:32:47 +00003337 basicblock *block, *finally;
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003338 withitem_ty item = asdl_seq_GET(s->v.With.items, pos);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003339
3340 assert(s->kind == With_kind);
3341
Guido van Rossumc2e20742006-02-27 22:32:47 +00003342 block = compiler_new_block(c);
3343 finally = compiler_new_block(c);
3344 if (!block || !finally)
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00003345 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003346
Thomas Wouters477c8d52006-05-27 19:21:47 +00003347 /* Evaluate EXPR */
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003348 VISIT(c, expr, item->context_expr);
Benjamin Peterson876b2f22009-06-28 03:18:59 +00003349 ADDOP_JREL(c, SETUP_WITH, finally);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003350
Benjamin Peterson876b2f22009-06-28 03:18:59 +00003351 /* SETUP_WITH pushes a finally block. */
Guido van Rossumc2e20742006-02-27 22:32:47 +00003352 compiler_use_next_block(c, block);
3353 if (!compiler_push_fblock(c, FINALLY_TRY, block)) {
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00003354 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003355 }
3356
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003357 if (item->optional_vars) {
3358 VISIT(c, expr, item->optional_vars);
Benjamin Peterson876b2f22009-06-28 03:18:59 +00003359 }
3360 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003361 /* Discard result from context.__enter__() */
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00003362 ADDOP(c, POP_TOP);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003363 }
3364
Benjamin Petersonbf1bbc12011-05-27 13:58:08 -05003365 pos++;
3366 if (pos == asdl_seq_LEN(s->v.With.items))
3367 /* BLOCK code */
3368 VISIT_SEQ(c, stmt, s->v.With.body)
3369 else if (!compiler_with(c, s, pos))
3370 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003371
3372 /* End of try block; start the finally block */
3373 ADDOP(c, POP_BLOCK);
3374 compiler_pop_fblock(c, FINALLY_TRY, block);
3375
3376 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3377 compiler_use_next_block(c, finally);
3378 if (!compiler_push_fblock(c, FINALLY_END, finally))
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00003379 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003380
Christian Heimesdd15f6c2008-03-16 00:07:10 +00003381 /* Finally block starts; context.__exit__ is on the stack under
3382 the exception or return information. Just issue our magic
3383 opcode. */
Guido van Rossumc2e20742006-02-27 22:32:47 +00003384 ADDOP(c, WITH_CLEANUP);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003385
3386 /* Finally block ends. */
3387 ADDOP(c, END_FINALLY);
3388 compiler_pop_fblock(c, FINALLY_END, finally);
3389 return 1;
3390}
3391
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003392static int
3393compiler_visit_expr(struct compiler *c, expr_ty e)
3394{
Victor Stinnerad9a0662013-11-19 22:23:20 +01003395 Py_ssize_t i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003396
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003397 /* If expr e has a different line number than the last expr/stmt,
3398 set a new line number for the next instruction.
3399 */
3400 if (e->lineno > c->u->u_lineno) {
3401 c->u->u_lineno = e->lineno;
3402 c->u->u_lineno_set = 0;
3403 }
Benjamin Petersond4efd9e2010-09-20 23:02:10 +00003404 /* Updating the column offset is always harmless. */
3405 c->u->u_col_offset = e->col_offset;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003406 switch (e->kind) {
3407 case BoolOp_kind:
3408 return compiler_boolop(c, e);
3409 case BinOp_kind:
3410 VISIT(c, expr, e->v.BinOp.left);
3411 VISIT(c, expr, e->v.BinOp.right);
3412 ADDOP(c, binop(c, e->v.BinOp.op));
3413 break;
3414 case UnaryOp_kind:
3415 VISIT(c, expr, e->v.UnaryOp.operand);
3416 ADDOP(c, unaryop(e->v.UnaryOp.op));
3417 break;
3418 case Lambda_kind:
3419 return compiler_lambda(c, e);
3420 case IfExp_kind:
3421 return compiler_ifexp(c, e);
3422 case Dict_kind:
3423 n = asdl_seq_LEN(e->v.Dict.values);
Victor Stinnerad9a0662013-11-19 22:23:20 +01003424 /* BUILD_MAP parameter is only used to preallocate the dictionary,
3425 it doesn't need to be exact */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003426 ADDOP_I(c, BUILD_MAP, (n>0xFFFF ? 0xFFFF : n));
3427 for (i = 0; i < n; i++) {
3428 VISIT(c, expr,
3429 (expr_ty)asdl_seq_GET(e->v.Dict.values, i));
3430 VISIT(c, expr,
3431 (expr_ty)asdl_seq_GET(e->v.Dict.keys, i));
3432 ADDOP(c, STORE_MAP);
3433 }
3434 break;
3435 case Set_kind:
3436 n = asdl_seq_LEN(e->v.Set.elts);
3437 VISIT_SEQ(c, expr, e->v.Set.elts);
3438 ADDOP_I(c, BUILD_SET, n);
3439 break;
3440 case GeneratorExp_kind:
3441 return compiler_genexp(c, e);
3442 case ListComp_kind:
3443 return compiler_listcomp(c, e);
3444 case SetComp_kind:
3445 return compiler_setcomp(c, e);
3446 case DictComp_kind:
3447 return compiler_dictcomp(c, e);
3448 case Yield_kind:
3449 if (c->u->u_ste->ste_type != FunctionBlock)
3450 return compiler_error(c, "'yield' outside function");
Mark Dickinsonded35ae2012-11-25 14:36:26 +00003451 if (e->v.Yield.value) {
3452 VISIT(c, expr, e->v.Yield.value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003453 }
3454 else {
3455 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3456 }
Mark Dickinsonded35ae2012-11-25 14:36:26 +00003457 ADDOP(c, YIELD_VALUE);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003458 break;
Mark Dickinsonded35ae2012-11-25 14:36:26 +00003459 case YieldFrom_kind:
3460 if (c->u->u_ste->ste_type != FunctionBlock)
3461 return compiler_error(c, "'yield' outside function");
3462 VISIT(c, expr, e->v.YieldFrom.value);
3463 ADDOP(c, GET_ITER);
3464 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3465 ADDOP(c, YIELD_FROM);
3466 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003467 case Compare_kind:
3468 return compiler_compare(c, e);
3469 case Call_kind:
3470 return compiler_call(c, e);
3471 case Num_kind:
3472 ADDOP_O(c, LOAD_CONST, e->v.Num.n, consts);
3473 break;
3474 case Str_kind:
3475 ADDOP_O(c, LOAD_CONST, e->v.Str.s, consts);
3476 break;
3477 case Bytes_kind:
3478 ADDOP_O(c, LOAD_CONST, e->v.Bytes.s, consts);
3479 break;
3480 case Ellipsis_kind:
3481 ADDOP_O(c, LOAD_CONST, Py_Ellipsis, consts);
3482 break;
Benjamin Peterson442f2092012-12-06 17:41:04 -05003483 case NameConstant_kind:
3484 ADDOP_O(c, LOAD_CONST, e->v.NameConstant.value, consts);
3485 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003486 /* The following exprs can be assignment targets. */
3487 case Attribute_kind:
3488 if (e->v.Attribute.ctx != AugStore)
3489 VISIT(c, expr, e->v.Attribute.value);
3490 switch (e->v.Attribute.ctx) {
3491 case AugLoad:
3492 ADDOP(c, DUP_TOP);
3493 /* Fall through to load */
3494 case Load:
3495 ADDOP_NAME(c, LOAD_ATTR, e->v.Attribute.attr, names);
3496 break;
3497 case AugStore:
3498 ADDOP(c, ROT_TWO);
3499 /* Fall through to save */
3500 case Store:
3501 ADDOP_NAME(c, STORE_ATTR, e->v.Attribute.attr, names);
3502 break;
3503 case Del:
3504 ADDOP_NAME(c, DELETE_ATTR, e->v.Attribute.attr, names);
3505 break;
3506 case Param:
3507 default:
3508 PyErr_SetString(PyExc_SystemError,
3509 "param invalid in attribute expression");
3510 return 0;
3511 }
3512 break;
3513 case Subscript_kind:
3514 switch (e->v.Subscript.ctx) {
3515 case AugLoad:
3516 VISIT(c, expr, e->v.Subscript.value);
3517 VISIT_SLICE(c, e->v.Subscript.slice, AugLoad);
3518 break;
3519 case Load:
3520 VISIT(c, expr, e->v.Subscript.value);
3521 VISIT_SLICE(c, e->v.Subscript.slice, Load);
3522 break;
3523 case AugStore:
3524 VISIT_SLICE(c, e->v.Subscript.slice, AugStore);
3525 break;
3526 case Store:
3527 VISIT(c, expr, e->v.Subscript.value);
3528 VISIT_SLICE(c, e->v.Subscript.slice, Store);
3529 break;
3530 case Del:
3531 VISIT(c, expr, e->v.Subscript.value);
3532 VISIT_SLICE(c, e->v.Subscript.slice, Del);
3533 break;
3534 case Param:
3535 default:
3536 PyErr_SetString(PyExc_SystemError,
3537 "param invalid in subscript expression");
3538 return 0;
3539 }
3540 break;
3541 case Starred_kind:
3542 switch (e->v.Starred.ctx) {
3543 case Store:
3544 /* In all legitimate cases, the Starred node was already replaced
3545 * by compiler_list/compiler_tuple. XXX: is that okay? */
3546 return compiler_error(c,
3547 "starred assignment target must be in a list or tuple");
3548 default:
3549 return compiler_error(c,
3550 "can use starred expression only as assignment target");
3551 }
3552 break;
3553 case Name_kind:
3554 return compiler_nameop(c, e->v.Name.id, e->v.Name.ctx);
3555 /* child nodes of List and Tuple will have expr_context set */
3556 case List_kind:
3557 return compiler_list(c, e);
3558 case Tuple_kind:
3559 return compiler_tuple(c, e);
3560 }
3561 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003562}
3563
3564static int
3565compiler_augassign(struct compiler *c, stmt_ty s)
3566{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003567 expr_ty e = s->v.AugAssign.target;
3568 expr_ty auge;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003569
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003570 assert(s->kind == AugAssign_kind);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003571
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003572 switch (e->kind) {
3573 case Attribute_kind:
3574 auge = Attribute(e->v.Attribute.value, e->v.Attribute.attr,
3575 AugLoad, e->lineno, e->col_offset, c->c_arena);
3576 if (auge == NULL)
3577 return 0;
3578 VISIT(c, expr, auge);
3579 VISIT(c, expr, s->v.AugAssign.value);
3580 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
3581 auge->v.Attribute.ctx = AugStore;
3582 VISIT(c, expr, auge);
3583 break;
3584 case Subscript_kind:
3585 auge = Subscript(e->v.Subscript.value, e->v.Subscript.slice,
3586 AugLoad, e->lineno, e->col_offset, c->c_arena);
3587 if (auge == NULL)
3588 return 0;
3589 VISIT(c, expr, auge);
3590 VISIT(c, expr, s->v.AugAssign.value);
3591 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
3592 auge->v.Subscript.ctx = AugStore;
3593 VISIT(c, expr, auge);
3594 break;
3595 case Name_kind:
3596 if (!compiler_nameop(c, e->v.Name.id, Load))
3597 return 0;
3598 VISIT(c, expr, s->v.AugAssign.value);
3599 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
3600 return compiler_nameop(c, e->v.Name.id, Store);
3601 default:
3602 PyErr_Format(PyExc_SystemError,
3603 "invalid node type (%d) for augmented assignment",
3604 e->kind);
3605 return 0;
3606 }
3607 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003608}
3609
3610static int
3611compiler_push_fblock(struct compiler *c, enum fblocktype t, basicblock *b)
3612{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003613 struct fblockinfo *f;
3614 if (c->u->u_nfblocks >= CO_MAXBLOCKS) {
3615 PyErr_SetString(PyExc_SystemError,
3616 "too many statically nested blocks");
3617 return 0;
3618 }
3619 f = &c->u->u_fblock[c->u->u_nfblocks++];
3620 f->fb_type = t;
3621 f->fb_block = b;
3622 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003623}
3624
3625static void
3626compiler_pop_fblock(struct compiler *c, enum fblocktype t, basicblock *b)
3627{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003628 struct compiler_unit *u = c->u;
3629 assert(u->u_nfblocks > 0);
3630 u->u_nfblocks--;
3631 assert(u->u_fblock[u->u_nfblocks].fb_type == t);
3632 assert(u->u_fblock[u->u_nfblocks].fb_block == b);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003633}
3634
Thomas Wouters89f507f2006-12-13 04:49:30 +00003635static int
3636compiler_in_loop(struct compiler *c) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003637 int i;
3638 struct compiler_unit *u = c->u;
3639 for (i = 0; i < u->u_nfblocks; ++i) {
3640 if (u->u_fblock[i].fb_type == LOOP)
3641 return 1;
3642 }
3643 return 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003644}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003645/* Raises a SyntaxError and returns 0.
3646 If something goes wrong, a different exception may be raised.
3647*/
3648
3649static int
3650compiler_error(struct compiler *c, const char *errstr)
3651{
Benjamin Peterson43b06862011-05-27 09:08:01 -05003652 PyObject *loc;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003653 PyObject *u = NULL, *v = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003654
Victor Stinner14e461d2013-08-26 22:28:21 +02003655 loc = PyErr_ProgramTextObject(c->c_filename, c->u->u_lineno);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003656 if (!loc) {
3657 Py_INCREF(Py_None);
3658 loc = Py_None;
3659 }
Victor Stinner14e461d2013-08-26 22:28:21 +02003660 u = Py_BuildValue("(OiiO)", c->c_filename, c->u->u_lineno,
Benjamin Petersond4efd9e2010-09-20 23:02:10 +00003661 c->u->u_col_offset, loc);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003662 if (!u)
3663 goto exit;
3664 v = Py_BuildValue("(zO)", errstr, u);
3665 if (!v)
3666 goto exit;
3667 PyErr_SetObject(PyExc_SyntaxError, v);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003668 exit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003669 Py_DECREF(loc);
3670 Py_XDECREF(u);
3671 Py_XDECREF(v);
3672 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003673}
3674
3675static int
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003676compiler_handle_subscr(struct compiler *c, const char *kind,
3677 expr_context_ty ctx)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003678{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003679 int op = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003680
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003681 /* XXX this code is duplicated */
3682 switch (ctx) {
3683 case AugLoad: /* fall through to Load */
3684 case Load: op = BINARY_SUBSCR; break;
3685 case AugStore:/* fall through to Store */
3686 case Store: op = STORE_SUBSCR; break;
3687 case Del: op = DELETE_SUBSCR; break;
3688 case Param:
3689 PyErr_Format(PyExc_SystemError,
3690 "invalid %s kind %d in subscript\n",
3691 kind, ctx);
3692 return 0;
3693 }
3694 if (ctx == AugLoad) {
Antoine Pitrou74a69fa2010-09-04 18:43:52 +00003695 ADDOP(c, DUP_TOP_TWO);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003696 }
3697 else if (ctx == AugStore) {
3698 ADDOP(c, ROT_THREE);
3699 }
3700 ADDOP(c, op);
3701 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003702}
3703
3704static int
3705compiler_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)
3706{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003707 int n = 2;
3708 assert(s->kind == Slice_kind);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003709
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003710 /* only handles the cases where BUILD_SLICE is emitted */
3711 if (s->v.Slice.lower) {
3712 VISIT(c, expr, s->v.Slice.lower);
3713 }
3714 else {
3715 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3716 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003717
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003718 if (s->v.Slice.upper) {
3719 VISIT(c, expr, s->v.Slice.upper);
3720 }
3721 else {
3722 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3723 }
3724
3725 if (s->v.Slice.step) {
3726 n++;
3727 VISIT(c, expr, s->v.Slice.step);
3728 }
3729 ADDOP_I(c, BUILD_SLICE, n);
3730 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003731}
3732
3733static int
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003734compiler_visit_nested_slice(struct compiler *c, slice_ty s,
3735 expr_context_ty ctx)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003736{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003737 switch (s->kind) {
3738 case Slice_kind:
3739 return compiler_slice(c, s, ctx);
3740 case Index_kind:
3741 VISIT(c, expr, s->v.Index.value);
3742 break;
3743 case ExtSlice_kind:
3744 default:
3745 PyErr_SetString(PyExc_SystemError,
3746 "extended slice invalid in nested slice");
3747 return 0;
3748 }
3749 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003750}
3751
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003752static int
3753compiler_visit_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)
3754{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003755 char * kindname = NULL;
3756 switch (s->kind) {
3757 case Index_kind:
3758 kindname = "index";
3759 if (ctx != AugStore) {
3760 VISIT(c, expr, s->v.Index.value);
3761 }
3762 break;
3763 case Slice_kind:
3764 kindname = "slice";
3765 if (ctx != AugStore) {
3766 if (!compiler_slice(c, s, ctx))
3767 return 0;
3768 }
3769 break;
3770 case ExtSlice_kind:
3771 kindname = "extended slice";
3772 if (ctx != AugStore) {
Victor Stinnerad9a0662013-11-19 22:23:20 +01003773 Py_ssize_t i, n = asdl_seq_LEN(s->v.ExtSlice.dims);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003774 for (i = 0; i < n; i++) {
3775 slice_ty sub = (slice_ty)asdl_seq_GET(
3776 s->v.ExtSlice.dims, i);
3777 if (!compiler_visit_nested_slice(c, sub, ctx))
3778 return 0;
3779 }
3780 ADDOP_I(c, BUILD_TUPLE, n);
3781 }
3782 break;
3783 default:
3784 PyErr_Format(PyExc_SystemError,
3785 "invalid subscript kind %d", s->kind);
3786 return 0;
3787 }
3788 return compiler_handle_subscr(c, kindname, ctx);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003789}
3790
Thomas Wouters89f507f2006-12-13 04:49:30 +00003791/* End of the compiler section, beginning of the assembler section */
3792
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003793/* do depth-first search of basic block graph, starting with block.
3794 post records the block indices in post-order.
3795
3796 XXX must handle implicit jumps from one block to next
3797*/
3798
Thomas Wouters89f507f2006-12-13 04:49:30 +00003799struct assembler {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003800 PyObject *a_bytecode; /* string containing bytecode */
3801 int a_offset; /* offset into bytecode */
3802 int a_nblocks; /* number of reachable blocks */
3803 basicblock **a_postorder; /* list of blocks in dfs postorder */
3804 PyObject *a_lnotab; /* string containing lnotab */
3805 int a_lnotab_off; /* offset into lnotab */
3806 int a_lineno; /* last lineno of emitted instruction */
3807 int a_lineno_off; /* bytecode offset of last lineno */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003808};
3809
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003810static void
3811dfs(struct compiler *c, basicblock *b, struct assembler *a)
3812{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003813 int i;
3814 struct instr *instr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003815
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003816 if (b->b_seen)
3817 return;
3818 b->b_seen = 1;
3819 if (b->b_next != NULL)
3820 dfs(c, b->b_next, a);
3821 for (i = 0; i < b->b_iused; i++) {
3822 instr = &b->b_instr[i];
3823 if (instr->i_jrel || instr->i_jabs)
3824 dfs(c, instr->i_target, a);
3825 }
3826 a->a_postorder[a->a_nblocks++] = b;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003827}
3828
Neal Norwitz2744c6c2005-11-13 01:08:38 +00003829static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003830stackdepth_walk(struct compiler *c, basicblock *b, int depth, int maxdepth)
3831{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003832 int i, target_depth;
3833 struct instr *instr;
3834 if (b->b_seen || b->b_startdepth >= depth)
3835 return maxdepth;
3836 b->b_seen = 1;
3837 b->b_startdepth = depth;
3838 for (i = 0; i < b->b_iused; i++) {
3839 instr = &b->b_instr[i];
3840 depth += opcode_stack_effect(instr->i_opcode, instr->i_oparg);
3841 if (depth > maxdepth)
3842 maxdepth = depth;
3843 assert(depth >= 0); /* invalid code or bug in stackdepth() */
3844 if (instr->i_jrel || instr->i_jabs) {
3845 target_depth = depth;
3846 if (instr->i_opcode == FOR_ITER) {
3847 target_depth = depth-2;
3848 } else if (instr->i_opcode == SETUP_FINALLY ||
3849 instr->i_opcode == SETUP_EXCEPT) {
3850 target_depth = depth+3;
3851 if (target_depth > maxdepth)
3852 maxdepth = target_depth;
3853 }
3854 maxdepth = stackdepth_walk(c, instr->i_target,
3855 target_depth, maxdepth);
3856 if (instr->i_opcode == JUMP_ABSOLUTE ||
3857 instr->i_opcode == JUMP_FORWARD) {
3858 goto out; /* remaining code is dead */
3859 }
3860 }
3861 }
3862 if (b->b_next)
3863 maxdepth = stackdepth_walk(c, b->b_next, depth, maxdepth);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003864out:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003865 b->b_seen = 0;
3866 return maxdepth;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003867}
3868
3869/* Find the flow path that needs the largest stack. We assume that
3870 * cycles in the flow graph have no net effect on the stack depth.
3871 */
3872static int
3873stackdepth(struct compiler *c)
3874{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003875 basicblock *b, *entryblock;
3876 entryblock = NULL;
3877 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
3878 b->b_seen = 0;
3879 b->b_startdepth = INT_MIN;
3880 entryblock = b;
3881 }
3882 if (!entryblock)
3883 return 0;
3884 return stackdepth_walk(c, entryblock, 0, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003885}
3886
3887static int
3888assemble_init(struct assembler *a, int nblocks, int firstlineno)
3889{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003890 memset(a, 0, sizeof(struct assembler));
3891 a->a_lineno = firstlineno;
3892 a->a_bytecode = PyBytes_FromStringAndSize(NULL, DEFAULT_CODE_SIZE);
3893 if (!a->a_bytecode)
3894 return 0;
3895 a->a_lnotab = PyBytes_FromStringAndSize(NULL, DEFAULT_LNOTAB_SIZE);
3896 if (!a->a_lnotab)
3897 return 0;
3898 if (nblocks > PY_SIZE_MAX / sizeof(basicblock *)) {
3899 PyErr_NoMemory();
3900 return 0;
3901 }
3902 a->a_postorder = (basicblock **)PyObject_Malloc(
3903 sizeof(basicblock *) * nblocks);
3904 if (!a->a_postorder) {
3905 PyErr_NoMemory();
3906 return 0;
3907 }
3908 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003909}
3910
3911static void
3912assemble_free(struct assembler *a)
3913{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003914 Py_XDECREF(a->a_bytecode);
3915 Py_XDECREF(a->a_lnotab);
3916 if (a->a_postorder)
3917 PyObject_Free(a->a_postorder);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003918}
3919
3920/* Return the size of a basic block in bytes. */
3921
3922static int
3923instrsize(struct instr *instr)
3924{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003925 if (!instr->i_hasarg)
3926 return 1; /* 1 byte for the opcode*/
3927 if (instr->i_oparg > 0xffff)
3928 return 6; /* 1 (opcode) + 1 (EXTENDED_ARG opcode) + 2 (oparg) + 2(oparg extended) */
3929 return 3; /* 1 (opcode) + 2 (oparg) */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003930}
3931
3932static int
3933blocksize(basicblock *b)
3934{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003935 int i;
3936 int size = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003937
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003938 for (i = 0; i < b->b_iused; i++)
3939 size += instrsize(&b->b_instr[i]);
3940 return size;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003941}
3942
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00003943/* Appends a pair to the end of the line number table, a_lnotab, representing
3944 the instruction's bytecode offset and line number. See
3945 Objects/lnotab_notes.txt for the description of the line number table. */
Tim Peters2a7f3842001-06-09 09:26:21 +00003946
Guido van Rossumf68d8e52001-04-14 17:55:09 +00003947static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003948assemble_lnotab(struct assembler *a, struct instr *i)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003949{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003950 int d_bytecode, d_lineno;
Victor Stinnerad9a0662013-11-19 22:23:20 +01003951 Py_ssize_t len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003952 unsigned char *lnotab;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003953
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003954 d_bytecode = a->a_offset - a->a_lineno_off;
3955 d_lineno = i->i_lineno - a->a_lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003956
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003957 assert(d_bytecode >= 0);
3958 assert(d_lineno >= 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003959
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003960 if(d_bytecode == 0 && d_lineno == 0)
3961 return 1;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003962
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003963 if (d_bytecode > 255) {
3964 int j, nbytes, ncodes = d_bytecode / 255;
3965 nbytes = a->a_lnotab_off + 2 * ncodes;
3966 len = PyBytes_GET_SIZE(a->a_lnotab);
3967 if (nbytes >= len) {
3968 if ((len <= INT_MAX / 2) && (len * 2 < nbytes))
3969 len = nbytes;
3970 else if (len <= INT_MAX / 2)
3971 len *= 2;
3972 else {
3973 PyErr_NoMemory();
3974 return 0;
3975 }
3976 if (_PyBytes_Resize(&a->a_lnotab, len) < 0)
3977 return 0;
3978 }
3979 lnotab = (unsigned char *)
3980 PyBytes_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
3981 for (j = 0; j < ncodes; j++) {
3982 *lnotab++ = 255;
3983 *lnotab++ = 0;
3984 }
3985 d_bytecode -= ncodes * 255;
3986 a->a_lnotab_off += ncodes * 2;
3987 }
3988 assert(d_bytecode <= 255);
3989 if (d_lineno > 255) {
3990 int j, nbytes, ncodes = d_lineno / 255;
3991 nbytes = a->a_lnotab_off + 2 * ncodes;
3992 len = PyBytes_GET_SIZE(a->a_lnotab);
3993 if (nbytes >= len) {
3994 if ((len <= INT_MAX / 2) && len * 2 < nbytes)
3995 len = nbytes;
3996 else if (len <= INT_MAX / 2)
3997 len *= 2;
3998 else {
3999 PyErr_NoMemory();
4000 return 0;
4001 }
4002 if (_PyBytes_Resize(&a->a_lnotab, len) < 0)
4003 return 0;
4004 }
4005 lnotab = (unsigned char *)
4006 PyBytes_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
4007 *lnotab++ = d_bytecode;
4008 *lnotab++ = 255;
4009 d_bytecode = 0;
4010 for (j = 1; j < ncodes; j++) {
4011 *lnotab++ = 0;
4012 *lnotab++ = 255;
4013 }
4014 d_lineno -= ncodes * 255;
4015 a->a_lnotab_off += ncodes * 2;
4016 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004017
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004018 len = PyBytes_GET_SIZE(a->a_lnotab);
4019 if (a->a_lnotab_off + 2 >= len) {
4020 if (_PyBytes_Resize(&a->a_lnotab, len * 2) < 0)
4021 return 0;
4022 }
4023 lnotab = (unsigned char *)
4024 PyBytes_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
Tim Peters51e26512001-09-07 08:45:55 +00004025
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004026 a->a_lnotab_off += 2;
4027 if (d_bytecode) {
4028 *lnotab++ = d_bytecode;
Victor Stinner4f2dab52011-05-27 16:46:51 +02004029 *lnotab++ = d_lineno;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004030 }
4031 else { /* First line of a block; def stmt, etc. */
4032 *lnotab++ = 0;
Victor Stinner4f2dab52011-05-27 16:46:51 +02004033 *lnotab++ = d_lineno;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004034 }
4035 a->a_lineno = i->i_lineno;
4036 a->a_lineno_off = a->a_offset;
4037 return 1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004038}
4039
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004040/* assemble_emit()
4041 Extend the bytecode with a new instruction.
4042 Update lnotab if necessary.
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004043*/
4044
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004045static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004046assemble_emit(struct assembler *a, struct instr *i)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004047{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004048 int size, arg = 0, ext = 0;
4049 Py_ssize_t len = PyBytes_GET_SIZE(a->a_bytecode);
4050 char *code;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004051
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004052 size = instrsize(i);
4053 if (i->i_hasarg) {
4054 arg = i->i_oparg;
4055 ext = arg >> 16;
4056 }
4057 if (i->i_lineno && !assemble_lnotab(a, i))
4058 return 0;
4059 if (a->a_offset + size >= len) {
4060 if (len > PY_SSIZE_T_MAX / 2)
4061 return 0;
4062 if (_PyBytes_Resize(&a->a_bytecode, len * 2) < 0)
4063 return 0;
4064 }
4065 code = PyBytes_AS_STRING(a->a_bytecode) + a->a_offset;
4066 a->a_offset += size;
4067 if (size == 6) {
4068 assert(i->i_hasarg);
4069 *code++ = (char)EXTENDED_ARG;
4070 *code++ = ext & 0xff;
4071 *code++ = ext >> 8;
4072 arg &= 0xffff;
4073 }
4074 *code++ = i->i_opcode;
4075 if (i->i_hasarg) {
4076 assert(size == 3 || size == 6);
4077 *code++ = arg & 0xff;
Victor Stinner4f2dab52011-05-27 16:46:51 +02004078 *code++ = arg >> 8;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004079 }
4080 return 1;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004081}
4082
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00004083static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004084assemble_jump_offsets(struct assembler *a, struct compiler *c)
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004085{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004086 basicblock *b;
4087 int bsize, totsize, extended_arg_count = 0, last_extended_arg_count;
4088 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004089
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004090 /* Compute the size of each block and fixup jump args.
4091 Replace block pointer with position in bytecode. */
4092 do {
4093 totsize = 0;
4094 for (i = a->a_nblocks - 1; i >= 0; i--) {
4095 b = a->a_postorder[i];
4096 bsize = blocksize(b);
4097 b->b_offset = totsize;
4098 totsize += bsize;
4099 }
4100 last_extended_arg_count = extended_arg_count;
4101 extended_arg_count = 0;
4102 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
4103 bsize = b->b_offset;
4104 for (i = 0; i < b->b_iused; i++) {
4105 struct instr *instr = &b->b_instr[i];
4106 /* Relative jumps are computed relative to
4107 the instruction pointer after fetching
4108 the jump instruction.
4109 */
4110 bsize += instrsize(instr);
4111 if (instr->i_jabs)
4112 instr->i_oparg = instr->i_target->b_offset;
4113 else if (instr->i_jrel) {
4114 int delta = instr->i_target->b_offset - bsize;
4115 instr->i_oparg = delta;
4116 }
4117 else
4118 continue;
4119 if (instr->i_oparg > 0xffff)
4120 extended_arg_count++;
4121 }
4122 }
Neal Norwitzf1d50682005-10-23 23:00:41 +00004123
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004124 /* XXX: This is an awful hack that could hurt performance, but
4125 on the bright side it should work until we come up
4126 with a better solution.
Neal Norwitzf1d50682005-10-23 23:00:41 +00004127
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004128 The issue is that in the first loop blocksize() is called
4129 which calls instrsize() which requires i_oparg be set
4130 appropriately. There is a bootstrap problem because
4131 i_oparg is calculated in the second loop above.
Neal Norwitzf1d50682005-10-23 23:00:41 +00004132
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004133 So we loop until we stop seeing new EXTENDED_ARGs.
4134 The only EXTENDED_ARGs that could be popping up are
4135 ones in jump instructions. So this should converge
4136 fairly quickly.
4137 */
4138 } while (last_extended_arg_count != extended_arg_count);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004139}
4140
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004141static PyObject *
Victor Stinnerad9a0662013-11-19 22:23:20 +01004142dict_keys_inorder(PyObject *dict, Py_ssize_t offset)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004143{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004144 PyObject *tuple, *k, *v;
4145 Py_ssize_t i, pos = 0, size = PyDict_Size(dict);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004146
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004147 tuple = PyTuple_New(size);
4148 if (tuple == NULL)
4149 return NULL;
4150 while (PyDict_Next(dict, &pos, &k, &v)) {
4151 i = PyLong_AS_LONG(v);
4152 /* The keys of the dictionary are tuples. (see compiler_add_o)
4153 The object we want is always first, though. */
4154 k = PyTuple_GET_ITEM(k, 0);
4155 Py_INCREF(k);
4156 assert((i - offset) < size);
4157 assert((i - offset) >= 0);
4158 PyTuple_SET_ITEM(tuple, i - offset, k);
4159 }
4160 return tuple;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004161}
4162
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004163static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004164compute_code_flags(struct compiler *c)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004165{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004166 PySTEntryObject *ste = c->u->u_ste;
Victor Stinnerad9a0662013-11-19 22:23:20 +01004167 int flags = 0;
4168 Py_ssize_t n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004169 if (ste->ste_type == FunctionBlock) {
Benjamin Petersone8e14592013-05-16 14:37:25 -05004170 flags |= CO_NEWLOCALS;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004171 if (!ste->ste_unoptimized)
4172 flags |= CO_OPTIMIZED;
4173 if (ste->ste_nested)
4174 flags |= CO_NESTED;
4175 if (ste->ste_generator)
4176 flags |= CO_GENERATOR;
4177 if (ste->ste_varargs)
4178 flags |= CO_VARARGS;
4179 if (ste->ste_varkeywords)
4180 flags |= CO_VARKEYWORDS;
4181 }
Thomas Wouters5e9f1fa2006-02-28 20:02:27 +00004182
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004183 /* (Only) inherit compilerflags in PyCF_MASK */
4184 flags |= (c->c_flags->cf_flags & PyCF_MASK);
Thomas Wouters5e9f1fa2006-02-28 20:02:27 +00004185
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004186 n = PyDict_Size(c->u->u_freevars);
4187 if (n < 0)
4188 return -1;
4189 if (n == 0) {
4190 n = PyDict_Size(c->u->u_cellvars);
4191 if (n < 0)
Victor Stinnerad9a0662013-11-19 22:23:20 +01004192 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004193 if (n == 0) {
Victor Stinnerad9a0662013-11-19 22:23:20 +01004194 flags |= CO_NOFREE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004195 }
4196 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004197
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004198 return flags;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004199}
4200
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004201static PyCodeObject *
4202makecode(struct compiler *c, struct assembler *a)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004203{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004204 PyObject *tmp;
4205 PyCodeObject *co = NULL;
4206 PyObject *consts = NULL;
4207 PyObject *names = NULL;
4208 PyObject *varnames = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004209 PyObject *name = NULL;
4210 PyObject *freevars = NULL;
4211 PyObject *cellvars = NULL;
4212 PyObject *bytecode = NULL;
Victor Stinnerad9a0662013-11-19 22:23:20 +01004213 Py_ssize_t nlocals;
4214 int nlocals_int;
4215 int flags;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004216
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004217 tmp = dict_keys_inorder(c->u->u_consts, 0);
4218 if (!tmp)
4219 goto error;
4220 consts = PySequence_List(tmp); /* optimize_code requires a list */
4221 Py_DECREF(tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004222
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004223 names = dict_keys_inorder(c->u->u_names, 0);
4224 varnames = dict_keys_inorder(c->u->u_varnames, 0);
4225 if (!consts || !names || !varnames)
4226 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004227
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004228 cellvars = dict_keys_inorder(c->u->u_cellvars, 0);
4229 if (!cellvars)
4230 goto error;
4231 freevars = dict_keys_inorder(c->u->u_freevars, PyTuple_Size(cellvars));
4232 if (!freevars)
4233 goto error;
Victor Stinnerad9a0662013-11-19 22:23:20 +01004234
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004235 nlocals = PyDict_Size(c->u->u_varnames);
Victor Stinnerad9a0662013-11-19 22:23:20 +01004236 assert(nlocals < INT_MAX);
4237 nlocals_int = Py_SAFE_DOWNCAST(nlocals, Py_ssize_t, int);
4238
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004239 flags = compute_code_flags(c);
4240 if (flags < 0)
4241 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004242
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004243 bytecode = PyCode_Optimize(a->a_bytecode, consts, names, a->a_lnotab);
4244 if (!bytecode)
4245 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004246
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004247 tmp = PyList_AsTuple(consts); /* PyCode_New requires a tuple */
4248 if (!tmp)
4249 goto error;
4250 Py_DECREF(consts);
4251 consts = tmp;
4252
4253 co = PyCode_New(c->u->u_argcount, c->u->u_kwonlyargcount,
Victor Stinnerad9a0662013-11-19 22:23:20 +01004254 nlocals_int, stackdepth(c), flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004255 bytecode, consts, names, varnames,
4256 freevars, cellvars,
Victor Stinner14e461d2013-08-26 22:28:21 +02004257 c->c_filename, c->u->u_name,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004258 c->u->u_firstlineno,
4259 a->a_lnotab);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004260 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004261 Py_XDECREF(consts);
4262 Py_XDECREF(names);
4263 Py_XDECREF(varnames);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004264 Py_XDECREF(name);
4265 Py_XDECREF(freevars);
4266 Py_XDECREF(cellvars);
4267 Py_XDECREF(bytecode);
4268 return co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004269}
4270
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004271
4272/* For debugging purposes only */
4273#if 0
4274static void
4275dump_instr(const struct instr *i)
4276{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004277 const char *jrel = i->i_jrel ? "jrel " : "";
4278 const char *jabs = i->i_jabs ? "jabs " : "";
4279 char arg[128];
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004280
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004281 *arg = '\0';
4282 if (i->i_hasarg)
4283 sprintf(arg, "arg: %d ", i->i_oparg);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004284
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004285 fprintf(stderr, "line: %d, opcode: %d %s%s%s\n",
4286 i->i_lineno, i->i_opcode, arg, jabs, jrel);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004287}
4288
4289static void
4290dump_basicblock(const basicblock *b)
4291{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004292 const char *seen = b->b_seen ? "seen " : "";
4293 const char *b_return = b->b_return ? "return " : "";
4294 fprintf(stderr, "used: %d, depth: %d, offset: %d %s%s\n",
4295 b->b_iused, b->b_startdepth, b->b_offset, seen, b_return);
4296 if (b->b_instr) {
4297 int i;
4298 for (i = 0; i < b->b_iused; i++) {
4299 fprintf(stderr, " [%02d] ", i);
4300 dump_instr(b->b_instr + i);
4301 }
4302 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004303}
4304#endif
4305
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004306static PyCodeObject *
4307assemble(struct compiler *c, int addNone)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004308{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004309 basicblock *b, *entryblock;
4310 struct assembler a;
4311 int i, j, nblocks;
4312 PyCodeObject *co = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004313
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004314 /* Make sure every block that falls off the end returns None.
4315 XXX NEXT_BLOCK() isn't quite right, because if the last
4316 block ends with a jump or return b_next shouldn't set.
4317 */
4318 if (!c->u->u_curblock->b_return) {
4319 NEXT_BLOCK(c);
4320 if (addNone)
4321 ADDOP_O(c, LOAD_CONST, Py_None, consts);
4322 ADDOP(c, RETURN_VALUE);
4323 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004324
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004325 nblocks = 0;
4326 entryblock = NULL;
4327 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
4328 nblocks++;
4329 entryblock = b;
4330 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004331
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004332 /* Set firstlineno if it wasn't explicitly set. */
4333 if (!c->u->u_firstlineno) {
4334 if (entryblock && entryblock->b_instr)
4335 c->u->u_firstlineno = entryblock->b_instr->i_lineno;
4336 else
4337 c->u->u_firstlineno = 1;
4338 }
4339 if (!assemble_init(&a, nblocks, c->u->u_firstlineno))
4340 goto error;
4341 dfs(c, entryblock, &a);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004342
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004343 /* Can't modify the bytecode after computing jump offsets. */
4344 assemble_jump_offsets(&a, c);
Tim Petersb6c3cea2001-06-26 03:36:28 +00004345
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004346 /* Emit code in reverse postorder from dfs. */
4347 for (i = a.a_nblocks - 1; i >= 0; i--) {
4348 b = a.a_postorder[i];
4349 for (j = 0; j < b->b_iused; j++)
4350 if (!assemble_emit(&a, &b->b_instr[j]))
4351 goto error;
4352 }
Tim Petersb6c3cea2001-06-26 03:36:28 +00004353
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004354 if (_PyBytes_Resize(&a.a_lnotab, a.a_lnotab_off) < 0)
4355 goto error;
4356 if (_PyBytes_Resize(&a.a_bytecode, a.a_offset) < 0)
4357 goto error;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004358
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004359 co = makecode(c, &a);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004360 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004361 assemble_free(&a);
4362 return co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004363}
Georg Brandl8334fd92010-12-04 10:26:46 +00004364
4365#undef PyAST_Compile
4366PyAPI_FUNC(PyCodeObject *)
4367PyAST_Compile(mod_ty mod, const char *filename, PyCompilerFlags *flags,
4368 PyArena *arena)
4369{
4370 return PyAST_CompileEx(mod, filename, flags, -1, arena);
4371}
4372