blob: 290075763a69e1f03335fcbec0641732ba13f0b1 [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 Pitrouc83ea132010-05-09 14:46:46 +00008 * 2. Builds a symbol table. See symtable.c.
Neal Norwitzf733a012006-10-29 18:30:10 +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 Pitrouc83ea132010-05-09 14:46:46 +000011 * this file.
Neal Norwitzf733a012006-10-29 18:30:10 +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
Neal Norwitzf733a012006-10-29 18:30:10 +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"
Neal Norwitzadb69fc2005-12-17 20:54:49 +000028#include "pyarena.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000029#include "ast.h"
30#include "code.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000031#include "compile.h"
Jeremy Hylton4b38da62001-02-02 18:19:15 +000032#include "symtable.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000033#include "opcode.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000034
Guido van Rossum8e793d91997-03-03 19:13:14 +000035int Py_OptimizeFlag = 0;
36
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000037#define DEFAULT_BLOCK_SIZE 16
38#define DEFAULT_BLOCKS 8
39#define DEFAULT_CODE_SIZE 128
40#define DEFAULT_LNOTAB_SIZE 16
Jeremy Hylton29906ee2001-02-27 04:23:34 +000041
Alexandre Vassalottib6465472010-01-11 22:36:12 +000042#define COMP_GENEXP 0
43#define COMP_SETCOMP 1
44#define COMP_DICTCOMP 2
45
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000046struct instr {
Antoine Pitrouc83ea132010-05-09 14:46:46 +000047 unsigned i_jabs : 1;
48 unsigned i_jrel : 1;
49 unsigned i_hasarg : 1;
50 unsigned char i_opcode;
51 int i_oparg;
52 struct basicblock_ *i_target; /* target block (if jump instruction) */
53 int i_lineno;
Guido van Rossum3f5da241990-12-20 15:06:42 +000054};
55
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000056typedef struct basicblock_ {
Jeremy Hylton12603c42006-04-01 16:18:02 +000057 /* Each basicblock in a compilation unit is linked via b_list in the
58 reverse order that the block are allocated. b_list points to the next
59 block, not to be confused with b_next, which is next by control flow. */
Antoine Pitrouc83ea132010-05-09 14:46:46 +000060 struct basicblock_ *b_list;
61 /* number of instructions used */
62 int b_iused;
63 /* length of instruction array (b_instr) */
64 int b_ialloc;
65 /* pointer to an array of instructions, initially NULL */
66 struct instr *b_instr;
67 /* If b_next is non-NULL, it is a pointer to the next
68 block reached by normal control flow. */
69 struct basicblock_ *b_next;
70 /* b_seen is used to perform a DFS of basicblocks. */
71 unsigned b_seen : 1;
72 /* b_return is true if a RETURN_VALUE opcode is inserted. */
73 unsigned b_return : 1;
74 /* depth of stack upon entry of block, computed by stackdepth() */
75 int b_startdepth;
76 /* instruction offset for block, computed by assemble_jump_offsets() */
77 int b_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000078} basicblock;
79
80/* fblockinfo tracks the current frame block.
81
Jeremy Hyltone9357b22006-03-01 15:47:05 +000082A frame block is used to handle loops, try/except, and try/finally.
83It's called a frame block to distinguish it from a basic block in the
84compiler IR.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000085*/
86
87enum fblocktype { LOOP, EXCEPT, FINALLY_TRY, FINALLY_END };
88
89struct fblockinfo {
Antoine Pitrouc83ea132010-05-09 14:46:46 +000090 enum fblocktype fb_type;
91 basicblock *fb_block;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000092};
93
94/* The following items change on entry and exit of code blocks.
95 They must be saved and restored when returning to a block.
96*/
97struct compiler_unit {
Antoine Pitrouc83ea132010-05-09 14:46:46 +000098 PySTEntryObject *u_ste;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000099
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000100 PyObject *u_name;
101 /* The following fields are dicts that map objects to
102 the index of them in co_XXX. The index is used as
103 the argument for opcodes that refer to those collections.
104 */
105 PyObject *u_consts; /* all constants */
106 PyObject *u_names; /* all names */
107 PyObject *u_varnames; /* local variables */
108 PyObject *u_cellvars; /* cell variables */
109 PyObject *u_freevars; /* free variables */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000110
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000111 PyObject *u_private; /* for private name mangling */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000112
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000113 int u_argcount; /* number of arguments for block */
114 /* Pointer to the most recently allocated block. By following b_list
115 members, you can reach all early allocated blocks. */
116 basicblock *u_blocks;
117 basicblock *u_curblock; /* pointer to current block */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000118
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000119 int u_nfblocks;
120 struct fblockinfo u_fblock[CO_MAXBLOCKS];
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000121
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000122 int u_firstlineno; /* the first lineno of the block */
123 int u_lineno; /* the lineno for the current stmt */
124 bool u_lineno_set; /* boolean to indicate whether instr
125 has been generated with current lineno */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000126};
127
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000128/* This struct captures the global state of a compilation.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000129
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000130The u pointer points to the current compilation unit, while units
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000131for enclosing blocks are stored in c_stack. The u and c_stack are
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000132managed by compiler_enter_scope() and compiler_exit_scope().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000133*/
134
135struct compiler {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000136 const char *c_filename;
137 struct symtable *c_st;
138 PyFutureFeatures *c_future; /* pointer to module's __future__ */
139 PyCompilerFlags *c_flags;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000140
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000141 int c_interactive; /* true if in interactive mode */
142 int c_nestlevel;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000143
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000144 struct compiler_unit *u; /* compiler state for current block */
145 PyObject *c_stack; /* Python list holding compiler_unit ptrs */
146 PyArena *c_arena; /* pointer to memory allocation arena */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000147};
148
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000149static int compiler_enter_scope(struct compiler *, identifier, void *, int);
150static void compiler_free(struct compiler *);
151static basicblock *compiler_new_block(struct compiler *);
152static int compiler_next_instr(struct compiler *, basicblock *);
153static int compiler_addop(struct compiler *, int);
154static int compiler_addop_o(struct compiler *, int, PyObject *, PyObject *);
155static int compiler_addop_i(struct compiler *, int, int);
156static int compiler_addop_j(struct compiler *, int, basicblock *, int);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000157static basicblock *compiler_use_new_block(struct compiler *);
158static int compiler_error(struct compiler *, const char *);
159static int compiler_nameop(struct compiler *, identifier, expr_context_ty);
160
161static PyCodeObject *compiler_mod(struct compiler *, mod_ty);
162static int compiler_visit_stmt(struct compiler *, stmt_ty);
163static int compiler_visit_keyword(struct compiler *, keyword_ty);
164static int compiler_visit_expr(struct compiler *, expr_ty);
165static int compiler_augassign(struct compiler *, stmt_ty);
166static int compiler_visit_slice(struct compiler *, slice_ty,
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000167 expr_context_ty);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000168
169static int compiler_push_fblock(struct compiler *, enum fblocktype,
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000170 basicblock *);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000171static void compiler_pop_fblock(struct compiler *, enum fblocktype,
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000172 basicblock *);
Jeremy Hylton82271f12006-10-04 02:24:52 +0000173/* Returns true if there is a loop on the fblock stack. */
174static int compiler_in_loop(struct compiler *);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000175
176static int inplace_binop(struct compiler *, operator_ty);
177static int expr_constant(expr_ty e);
178
Guido van Rossumc2e20742006-02-27 22:32:47 +0000179static int compiler_with(struct compiler *, stmt_ty);
180
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000181static PyCodeObject *assemble(struct compiler *, int addNone);
182static PyObject *__doc__;
183
Larry Hastings402b73f2010-03-25 00:54:54 +0000184#define COMPILER_CAPSULE_NAME_COMPILER_UNIT "compile.c compiler unit"
185
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000186PyObject *
Anthony Baxter7b782b62006-04-11 12:01:56 +0000187_Py_Mangle(PyObject *privateobj, PyObject *ident)
Michael W. Hudson60934622004-08-12 17:56:29 +0000188{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000189 /* Name mangling: __private becomes _classname__private.
190 This is independent from how the name is used. */
191 const char *p, *name = PyString_AsString(ident);
192 char *buffer;
193 size_t nlen, plen;
194 if (privateobj == NULL || !PyString_Check(privateobj) ||
195 name == NULL || name[0] != '_' || name[1] != '_') {
196 Py_INCREF(ident);
197 return ident;
198 }
199 p = PyString_AsString(privateobj);
200 nlen = strlen(name);
201 /* Don't mangle __id__ or names with dots.
Jeremy Hylton37075c52007-02-27 01:01:59 +0000202
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000203 The only time a name with a dot can occur is when
204 we are compiling an import statement that has a
205 package name.
Jeremy Hylton37075c52007-02-27 01:01:59 +0000206
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000207 TODO(jhylton): Decide whether we want to support
208 mangling of the module name, e.g. __M.X.
209 */
210 if ((name[nlen-1] == '_' && name[nlen-2] == '_')
211 || strchr(name, '.')) {
212 Py_INCREF(ident);
213 return ident; /* Don't mangle __whatever__ */
214 }
215 /* Strip leading underscores from class name */
216 while (*p == '_')
217 p++;
218 if (*p == '\0') {
219 Py_INCREF(ident);
220 return ident; /* Don't mangle if class is just underscores */
221 }
222 plen = strlen(p);
Gregory P. Smith9d534572008-06-11 07:41:16 +0000223
Antoine Pitrou022db592013-04-06 21:21:04 +0200224 if (plen + nlen >= PY_SSIZE_T_MAX - 1) {
225 PyErr_SetString(PyExc_OverflowError,
226 "private identifier too large to be mangled");
227 return NULL;
228 }
Gregory P. Smith9d534572008-06-11 07:41:16 +0000229
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000230 ident = PyString_FromStringAndSize(NULL, 1 + nlen + plen);
231 if (!ident)
232 return 0;
233 /* ident = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
234 buffer = PyString_AS_STRING(ident);
235 buffer[0] = '_';
236 strncpy(buffer+1, p, plen);
237 strcpy(buffer+1+plen, name);
238 return ident;
Michael W. Hudson60934622004-08-12 17:56:29 +0000239}
240
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000241static int
242compiler_init(struct compiler *c)
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000243{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000244 memset(c, 0, sizeof(struct compiler));
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000245
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000246 c->c_stack = PyList_New(0);
247 if (!c->c_stack)
248 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000249
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000250 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000251}
252
253PyCodeObject *
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000254PyAST_Compile(mod_ty mod, const char *filename, PyCompilerFlags *flags,
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000255 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000256{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000257 struct compiler c;
258 PyCodeObject *co = NULL;
259 PyCompilerFlags local_flags;
260 int merged;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000261
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000262 if (!__doc__) {
263 __doc__ = PyString_InternFromString("__doc__");
264 if (!__doc__)
265 return NULL;
266 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000267
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000268 if (!compiler_init(&c))
269 return NULL;
270 c.c_filename = filename;
271 c.c_arena = arena;
272 c.c_future = PyFuture_FromAST(mod, filename);
273 if (c.c_future == NULL)
274 goto finally;
275 if (!flags) {
276 local_flags.cf_flags = 0;
277 flags = &local_flags;
278 }
279 merged = c.c_future->ff_features | flags->cf_flags;
280 c.c_future->ff_features = merged;
281 flags->cf_flags = merged;
282 c.c_flags = flags;
283 c.c_nestlevel = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000284
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000285 c.c_st = PySymtable_Build(mod, filename, c.c_future);
286 if (c.c_st == NULL) {
287 if (!PyErr_Occurred())
288 PyErr_SetString(PyExc_SystemError, "no symtable");
289 goto finally;
290 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000291
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000292 co = compiler_mod(&c, mod);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000293
Thomas Wouters1175c432006-02-27 22:49:54 +0000294 finally:
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000295 compiler_free(&c);
296 assert(co || PyErr_Occurred());
297 return co;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000298}
299
300PyCodeObject *
301PyNode_Compile(struct _node *n, const char *filename)
302{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000303 PyCodeObject *co = NULL;
304 mod_ty mod;
305 PyArena *arena = PyArena_New();
306 if (!arena)
307 return NULL;
308 mod = PyAST_FromNode(n, NULL, filename, arena);
309 if (mod)
310 co = PyAST_Compile(mod, filename, NULL, arena);
311 PyArena_Free(arena);
312 return co;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000313}
314
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000315static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000316compiler_free(struct compiler *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000317{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000318 if (c->c_st)
319 PySymtable_Free(c->c_st);
320 if (c->c_future)
321 PyObject_Free(c->c_future);
322 Py_DECREF(c->c_stack);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000323}
324
Guido van Rossum79f25d91997-04-29 20:08:16 +0000325static PyObject *
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000326list2dict(PyObject *list)
Guido van Rossum2dff9911992-09-03 20:50:59 +0000327{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000328 Py_ssize_t i, n;
329 PyObject *v, *k;
330 PyObject *dict = PyDict_New();
331 if (!dict) return NULL;
Guido van Rossumd076c731998-10-07 19:42:25 +0000332
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000333 n = PyList_Size(list);
334 for (i = 0; i < n; i++) {
335 v = PyInt_FromLong(i);
336 if (!v) {
337 Py_DECREF(dict);
338 return NULL;
339 }
340 k = PyList_GET_ITEM(list, i);
341 k = PyTuple_Pack(2, k, k->ob_type);
342 if (k == NULL || PyDict_SetItem(dict, k, v) < 0) {
343 Py_XDECREF(k);
344 Py_DECREF(v);
345 Py_DECREF(dict);
346 return NULL;
347 }
348 Py_DECREF(k);
349 Py_DECREF(v);
350 }
351 return dict;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000352}
353
354/* Return new dict containing names from src that match scope(s).
355
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000356src is a symbol table dictionary. If the scope of a name matches
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000357either scope_type or flag is set, insert it into the new dict. The
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000358values are integers, starting at offset and increasing by one for
359each key.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000360*/
361
362static PyObject *
363dictbytype(PyObject *src, int scope_type, int flag, int offset)
364{
Meador Inge0e3755e2012-07-18 17:48:34 -0500365 Py_ssize_t i = offset, scope, num_keys, key_i;
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000366 PyObject *k, *v, *dest = PyDict_New();
Meador Inge6642d1f2012-07-18 14:09:04 -0500367 PyObject *sorted_keys;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000368
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000369 assert(offset >= 0);
370 if (dest == NULL)
371 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000372
Meador Inge6642d1f2012-07-18 14:09:04 -0500373 /* Sort the keys so that we have a deterministic order on the indexes
374 saved in the returned dictionary. These indexes are used as indexes
375 into the free and cell var storage. Therefore if they aren't
376 deterministic, then the generated bytecode is not deterministic.
377 */
378 sorted_keys = PyDict_Keys(src);
379 if (sorted_keys == NULL)
380 return NULL;
381 if (PyList_Sort(sorted_keys) != 0) {
382 Py_DECREF(sorted_keys);
383 return NULL;
384 }
Meador Ingeb8a56902012-07-18 16:32:37 -0500385 num_keys = PyList_GET_SIZE(sorted_keys);
Meador Inge6642d1f2012-07-18 14:09:04 -0500386
387 for (key_i = 0; key_i < num_keys; key_i++) {
388 k = PyList_GET_ITEM(sorted_keys, key_i);
389 v = PyDict_GetItem(src, k);
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000390 /* XXX this should probably be a macro in symtable.h */
391 assert(PyInt_Check(v));
392 scope = (PyInt_AS_LONG(v) >> SCOPE_OFF) & SCOPE_MASK;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000393
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000394 if (scope == scope_type || PyInt_AS_LONG(v) & flag) {
395 PyObject *tuple, *item = PyInt_FromLong(i);
396 if (item == NULL) {
Meador Inge6642d1f2012-07-18 14:09:04 -0500397 Py_DECREF(sorted_keys);
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000398 Py_DECREF(dest);
399 return NULL;
400 }
401 i++;
402 tuple = PyTuple_Pack(2, k, k->ob_type);
403 if (!tuple || PyDict_SetItem(dest, tuple, item) < 0) {
Meador Inge6642d1f2012-07-18 14:09:04 -0500404 Py_DECREF(sorted_keys);
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000405 Py_DECREF(item);
406 Py_DECREF(dest);
407 Py_XDECREF(tuple);
408 return NULL;
409 }
410 Py_DECREF(item);
411 Py_DECREF(tuple);
412 }
413 }
Meador Inge6642d1f2012-07-18 14:09:04 -0500414 Py_DECREF(sorted_keys);
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000415 return dest;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000416}
417
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000418static void
419compiler_unit_check(struct compiler_unit *u)
420{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000421 basicblock *block;
422 for (block = u->u_blocks; block != NULL; block = block->b_list) {
423 assert((void *)block != (void *)0xcbcbcbcb);
424 assert((void *)block != (void *)0xfbfbfbfb);
425 assert((void *)block != (void *)0xdbdbdbdb);
426 if (block->b_instr != NULL) {
427 assert(block->b_ialloc > 0);
428 assert(block->b_iused > 0);
429 assert(block->b_ialloc >= block->b_iused);
430 }
431 else {
432 assert (block->b_iused == 0);
433 assert (block->b_ialloc == 0);
434 }
435 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000436}
437
438static void
439compiler_unit_free(struct compiler_unit *u)
440{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000441 basicblock *b, *next;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000442
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000443 compiler_unit_check(u);
444 b = u->u_blocks;
445 while (b != NULL) {
446 if (b->b_instr)
447 PyObject_Free((void *)b->b_instr);
448 next = b->b_list;
449 PyObject_Free((void *)b);
450 b = next;
451 }
452 Py_CLEAR(u->u_ste);
453 Py_CLEAR(u->u_name);
454 Py_CLEAR(u->u_consts);
455 Py_CLEAR(u->u_names);
456 Py_CLEAR(u->u_varnames);
457 Py_CLEAR(u->u_freevars);
458 Py_CLEAR(u->u_cellvars);
459 Py_CLEAR(u->u_private);
460 PyObject_Free(u);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000461}
462
463static int
464compiler_enter_scope(struct compiler *c, identifier name, void *key,
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000465 int lineno)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000466{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000467 struct compiler_unit *u;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000468
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000469 u = (struct compiler_unit *)PyObject_Malloc(sizeof(
470 struct compiler_unit));
471 if (!u) {
472 PyErr_NoMemory();
473 return 0;
474 }
475 memset(u, 0, sizeof(struct compiler_unit));
476 u->u_argcount = 0;
477 u->u_ste = PySymtable_Lookup(c->c_st, key);
478 if (!u->u_ste) {
479 compiler_unit_free(u);
480 return 0;
481 }
482 Py_INCREF(name);
483 u->u_name = name;
484 u->u_varnames = list2dict(u->u_ste->ste_varnames);
485 u->u_cellvars = dictbytype(u->u_ste->ste_symbols, CELL, 0, 0);
486 if (!u->u_varnames || !u->u_cellvars) {
487 compiler_unit_free(u);
488 return 0;
489 }
Neal Norwitzd12bd012006-07-21 07:59:47 +0000490
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000491 u->u_freevars = dictbytype(u->u_ste->ste_symbols, FREE, DEF_FREE_CLASS,
492 PyDict_Size(u->u_cellvars));
493 if (!u->u_freevars) {
494 compiler_unit_free(u);
495 return 0;
496 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000497
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000498 u->u_blocks = NULL;
499 u->u_nfblocks = 0;
500 u->u_firstlineno = lineno;
501 u->u_lineno = 0;
502 u->u_lineno_set = false;
503 u->u_consts = PyDict_New();
504 if (!u->u_consts) {
505 compiler_unit_free(u);
506 return 0;
507 }
508 u->u_names = PyDict_New();
509 if (!u->u_names) {
510 compiler_unit_free(u);
511 return 0;
512 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000513
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000514 u->u_private = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000515
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000516 /* Push the old compiler_unit on the stack. */
517 if (c->u) {
518 PyObject *capsule = PyCapsule_New(c->u, COMPILER_CAPSULE_NAME_COMPILER_UNIT, NULL);
519 if (!capsule || PyList_Append(c->c_stack, capsule) < 0) {
520 Py_XDECREF(capsule);
521 compiler_unit_free(u);
522 return 0;
523 }
524 Py_DECREF(capsule);
525 u->u_private = c->u->u_private;
526 Py_XINCREF(u->u_private);
527 }
528 c->u = u;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000529
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000530 c->c_nestlevel++;
531 if (compiler_use_new_block(c) == NULL)
532 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000533
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000534 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000535}
536
Neil Schemenauerc396d9e2005-10-25 06:30:14 +0000537static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000538compiler_exit_scope(struct compiler *c)
539{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000540 int n;
541 PyObject *capsule;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000542
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000543 c->c_nestlevel--;
544 compiler_unit_free(c->u);
545 /* Restore c->u to the parent unit. */
546 n = PyList_GET_SIZE(c->c_stack) - 1;
547 if (n >= 0) {
548 capsule = PyList_GET_ITEM(c->c_stack, n);
549 c->u = (struct compiler_unit *)PyCapsule_GetPointer(capsule, COMPILER_CAPSULE_NAME_COMPILER_UNIT);
550 assert(c->u);
551 /* we are deleting from a list so this really shouldn't fail */
552 if (PySequence_DelItem(c->c_stack, n) < 0)
553 Py_FatalError("compiler_exit_scope()");
554 compiler_unit_check(c->u);
555 }
556 else
557 c->u = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000558
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000559}
560
561/* Allocate a new block and return a pointer to it.
562 Returns NULL on error.
563*/
564
565static basicblock *
566compiler_new_block(struct compiler *c)
567{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000568 basicblock *b;
569 struct compiler_unit *u;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000570
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000571 u = c->u;
572 b = (basicblock *)PyObject_Malloc(sizeof(basicblock));
573 if (b == NULL) {
574 PyErr_NoMemory();
575 return NULL;
576 }
577 memset((void *)b, 0, sizeof(basicblock));
578 /* Extend the singly linked list of blocks with new block. */
579 b->b_list = u->u_blocks;
580 u->u_blocks = b;
581 return b;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000582}
583
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000584static basicblock *
585compiler_use_new_block(struct compiler *c)
586{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000587 basicblock *block = compiler_new_block(c);
588 if (block == NULL)
589 return NULL;
590 c->u->u_curblock = block;
591 return block;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000592}
593
594static basicblock *
595compiler_next_block(struct compiler *c)
596{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000597 basicblock *block = compiler_new_block(c);
598 if (block == NULL)
599 return NULL;
600 c->u->u_curblock->b_next = block;
601 c->u->u_curblock = block;
602 return block;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000603}
604
605static basicblock *
606compiler_use_next_block(struct compiler *c, basicblock *block)
607{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000608 assert(block != NULL);
609 c->u->u_curblock->b_next = block;
610 c->u->u_curblock = block;
611 return block;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000612}
613
614/* Returns the offset of the next instruction in the current block's
615 b_instr array. Resizes the b_instr as necessary.
616 Returns -1 on failure.
Neal Norwitzf733a012006-10-29 18:30:10 +0000617*/
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000618
619static int
620compiler_next_instr(struct compiler *c, basicblock *b)
621{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000622 assert(b != NULL);
623 if (b->b_instr == NULL) {
624 b->b_instr = (struct instr *)PyObject_Malloc(
625 sizeof(struct instr) * DEFAULT_BLOCK_SIZE);
626 if (b->b_instr == NULL) {
627 PyErr_NoMemory();
628 return -1;
629 }
630 b->b_ialloc = DEFAULT_BLOCK_SIZE;
631 memset((char *)b->b_instr, 0,
632 sizeof(struct instr) * DEFAULT_BLOCK_SIZE);
633 }
634 else if (b->b_iused == b->b_ialloc) {
635 struct instr *tmp;
636 size_t oldsize, newsize;
637 oldsize = b->b_ialloc * sizeof(struct instr);
638 newsize = oldsize << 1;
Gregory P. Smith9d534572008-06-11 07:41:16 +0000639
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000640 if (oldsize > (PY_SIZE_MAX >> 1)) {
641 PyErr_NoMemory();
642 return -1;
643 }
Gregory P. Smith9d534572008-06-11 07:41:16 +0000644
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000645 if (newsize == 0) {
646 PyErr_NoMemory();
647 return -1;
648 }
649 b->b_ialloc <<= 1;
650 tmp = (struct instr *)PyObject_Realloc(
651 (void *)b->b_instr, newsize);
652 if (tmp == NULL) {
653 PyErr_NoMemory();
654 return -1;
655 }
656 b->b_instr = tmp;
657 memset((char *)b->b_instr + oldsize, 0, newsize - oldsize);
658 }
659 return b->b_iused++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000660}
661
Amaury Forgeot d'Arc6fd03bb2008-02-04 21:45:05 +0000662/* Set the i_lineno member of the instruction at offset off if the
663 line number for the current expression/statement has not
Jeremy Hylton12603c42006-04-01 16:18:02 +0000664 already been set. If it has been set, the call has no effect.
665
Amaury Forgeot d'Arc6fd03bb2008-02-04 21:45:05 +0000666 The line number is reset in the following cases:
667 - when entering a new scope
668 - on each statement
669 - on each expression that start a new line
670 - before the "except" clause
671 - before the "for" and "while" expressions
Neal Norwitzf733a012006-10-29 18:30:10 +0000672*/
Jeremy Hylton12603c42006-04-01 16:18:02 +0000673
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000674static void
675compiler_set_lineno(struct compiler *c, int off)
676{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000677 basicblock *b;
678 if (c->u->u_lineno_set)
679 return;
680 c->u->u_lineno_set = true;
681 b = c->u->u_curblock;
682 b->b_instr[off].i_lineno = c->u->u_lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000683}
684
685static int
686opcode_stack_effect(int opcode, int oparg)
687{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000688 switch (opcode) {
689 case POP_TOP:
690 return -1;
691 case ROT_TWO:
692 case ROT_THREE:
693 return 0;
694 case DUP_TOP:
695 return 1;
696 case ROT_FOUR:
697 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000698
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000699 case UNARY_POSITIVE:
700 case UNARY_NEGATIVE:
701 case UNARY_NOT:
702 case UNARY_CONVERT:
703 case UNARY_INVERT:
704 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000705
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000706 case SET_ADD:
707 case LIST_APPEND:
708 return -1;
Neal Norwitz10be2ea2006-03-03 20:29:11 +0000709
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000710 case MAP_ADD:
711 return -2;
Alexandre Vassalottib6465472010-01-11 22:36:12 +0000712
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000713 case BINARY_POWER:
714 case BINARY_MULTIPLY:
715 case BINARY_DIVIDE:
716 case BINARY_MODULO:
717 case BINARY_ADD:
718 case BINARY_SUBTRACT:
719 case BINARY_SUBSCR:
720 case BINARY_FLOOR_DIVIDE:
721 case BINARY_TRUE_DIVIDE:
722 return -1;
723 case INPLACE_FLOOR_DIVIDE:
724 case INPLACE_TRUE_DIVIDE:
725 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000726
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000727 case SLICE+0:
728 return 0;
729 case SLICE+1:
730 return -1;
731 case SLICE+2:
732 return -1;
733 case SLICE+3:
734 return -2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000735
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000736 case STORE_SLICE+0:
737 return -2;
738 case STORE_SLICE+1:
739 return -3;
740 case STORE_SLICE+2:
741 return -3;
742 case STORE_SLICE+3:
743 return -4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000744
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000745 case DELETE_SLICE+0:
746 return -1;
747 case DELETE_SLICE+1:
748 return -2;
749 case DELETE_SLICE+2:
750 return -2;
751 case DELETE_SLICE+3:
752 return -3;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000753
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000754 case INPLACE_ADD:
755 case INPLACE_SUBTRACT:
756 case INPLACE_MULTIPLY:
757 case INPLACE_DIVIDE:
758 case INPLACE_MODULO:
759 return -1;
760 case STORE_SUBSCR:
761 return -3;
762 case STORE_MAP:
763 return -2;
764 case DELETE_SUBSCR:
765 return -2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000766
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000767 case BINARY_LSHIFT:
768 case BINARY_RSHIFT:
769 case BINARY_AND:
770 case BINARY_XOR:
771 case BINARY_OR:
772 return -1;
773 case INPLACE_POWER:
774 return -1;
775 case GET_ITER:
776 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000777
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000778 case PRINT_EXPR:
779 return -1;
780 case PRINT_ITEM:
781 return -1;
782 case PRINT_NEWLINE:
783 return 0;
784 case PRINT_ITEM_TO:
785 return -2;
786 case PRINT_NEWLINE_TO:
787 return -1;
788 case INPLACE_LSHIFT:
789 case INPLACE_RSHIFT:
790 case INPLACE_AND:
791 case INPLACE_XOR:
792 case INPLACE_OR:
793 return -1;
794 case BREAK_LOOP:
795 return 0;
796 case SETUP_WITH:
797 return 4;
798 case WITH_CLEANUP:
799 return -1; /* XXX Sometimes more */
800 case LOAD_LOCALS:
801 return 1;
802 case RETURN_VALUE:
803 return -1;
804 case IMPORT_STAR:
805 return -1;
806 case EXEC_STMT:
807 return -3;
808 case YIELD_VALUE:
809 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000810
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000811 case POP_BLOCK:
812 return 0;
813 case END_FINALLY:
814 return -3; /* or -1 or -2 if no exception occurred or
815 return/break/continue */
816 case BUILD_CLASS:
817 return -2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000818
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000819 case STORE_NAME:
820 return -1;
821 case DELETE_NAME:
822 return 0;
823 case UNPACK_SEQUENCE:
824 return oparg-1;
825 case FOR_ITER:
826 return 1; /* or -1, at end of iterator */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000827
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000828 case STORE_ATTR:
829 return -2;
830 case DELETE_ATTR:
831 return -1;
832 case STORE_GLOBAL:
833 return -1;
834 case DELETE_GLOBAL:
835 return 0;
836 case DUP_TOPX:
837 return oparg;
838 case LOAD_CONST:
839 return 1;
840 case LOAD_NAME:
841 return 1;
842 case BUILD_TUPLE:
843 case BUILD_LIST:
844 case BUILD_SET:
845 return 1-oparg;
846 case BUILD_MAP:
847 return 1;
848 case LOAD_ATTR:
849 return 0;
850 case COMPARE_OP:
851 return -1;
852 case IMPORT_NAME:
853 return -1;
854 case IMPORT_FROM:
855 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000856
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000857 case JUMP_FORWARD:
858 case JUMP_IF_TRUE_OR_POP: /* -1 if jump not taken */
859 case JUMP_IF_FALSE_OR_POP: /* "" */
860 case JUMP_ABSOLUTE:
861 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000862
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000863 case POP_JUMP_IF_FALSE:
864 case POP_JUMP_IF_TRUE:
865 return -1;
Jeffrey Yasskin68d68522009-02-28 19:03:21 +0000866
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000867 case LOAD_GLOBAL:
868 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000869
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000870 case CONTINUE_LOOP:
871 return 0;
872 case SETUP_LOOP:
873 case SETUP_EXCEPT:
874 case SETUP_FINALLY:
875 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000876
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000877 case LOAD_FAST:
878 return 1;
879 case STORE_FAST:
880 return -1;
881 case DELETE_FAST:
882 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000883
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000884 case RAISE_VARARGS:
885 return -oparg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000886#define NARGS(o) (((o) % 256) + 2*((o) / 256))
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000887 case CALL_FUNCTION:
888 return -NARGS(oparg);
889 case CALL_FUNCTION_VAR:
890 case CALL_FUNCTION_KW:
891 return -NARGS(oparg)-1;
892 case CALL_FUNCTION_VAR_KW:
893 return -NARGS(oparg)-2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000894#undef NARGS
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000895 case MAKE_FUNCTION:
896 return -oparg;
897 case BUILD_SLICE:
898 if (oparg == 3)
899 return -2;
900 else
901 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000902
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000903 case MAKE_CLOSURE:
904 return -oparg-1;
905 case LOAD_CLOSURE:
906 return 1;
907 case LOAD_DEREF:
908 return 1;
909 case STORE_DEREF:
910 return -1;
911 default:
912 fprintf(stderr, "opcode = %d\n", opcode);
913 Py_FatalError("opcode_stack_effect()");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000914
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000915 }
916 return 0; /* not reachable */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000917}
918
919/* Add an opcode with no argument.
920 Returns 0 on failure, 1 on success.
921*/
922
923static int
924compiler_addop(struct compiler *c, int opcode)
925{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000926 basicblock *b;
927 struct instr *i;
928 int off;
929 off = compiler_next_instr(c, c->u->u_curblock);
930 if (off < 0)
931 return 0;
932 b = c->u->u_curblock;
933 i = &b->b_instr[off];
934 i->i_opcode = opcode;
935 i->i_hasarg = 0;
936 if (opcode == RETURN_VALUE)
937 b->b_return = 1;
938 compiler_set_lineno(c, off);
939 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000940}
941
942static int
943compiler_add_o(struct compiler *c, PyObject *dict, PyObject *o)
944{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000945 PyObject *t, *v;
946 Py_ssize_t arg;
947 double d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000948
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000949 /* necessary to make sure types aren't coerced (e.g., int and long) */
950 /* _and_ to distinguish 0.0 from -0.0 e.g. on IEEE platforms */
951 if (PyFloat_Check(o)) {
952 d = PyFloat_AS_DOUBLE(o);
953 /* all we need is to make the tuple different in either the 0.0
954 * or -0.0 case from all others, just to avoid the "coercion".
955 */
956 if (d == 0.0 && copysign(1.0, d) < 0.0)
957 t = PyTuple_Pack(3, o, o->ob_type, Py_None);
958 else
959 t = PyTuple_Pack(2, o, o->ob_type);
960 }
Mark Dickinson026ac7c2009-10-15 17:45:39 +0000961#ifndef WITHOUT_COMPLEX
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000962 else if (PyComplex_Check(o)) {
963 Py_complex z;
964 int real_negzero, imag_negzero;
965 /* For the complex case we must make complex(x, 0.)
966 different from complex(x, -0.) and complex(0., y)
967 different from complex(-0., y), for any x and y.
968 All four complex zeros must be distinguished.*/
969 z = PyComplex_AsCComplex(o);
970 real_negzero = z.real == 0.0 && copysign(1.0, z.real) < 0.0;
971 imag_negzero = z.imag == 0.0 && copysign(1.0, z.imag) < 0.0;
972 if (real_negzero && imag_negzero) {
973 t = PyTuple_Pack(5, o, o->ob_type,
974 Py_None, Py_None, Py_None);
Mark Dickinson105be772008-01-31 22:17:37 +0000975 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000976 else if (imag_negzero) {
977 t = PyTuple_Pack(4, o, o->ob_type, Py_None, Py_None);
978 }
979 else if (real_negzero) {
980 t = PyTuple_Pack(3, o, o->ob_type, Py_None);
981 }
982 else {
983 t = PyTuple_Pack(2, o, o->ob_type);
984 }
985 }
Mark Dickinson026ac7c2009-10-15 17:45:39 +0000986#endif /* WITHOUT_COMPLEX */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000987 else {
988 t = PyTuple_Pack(2, o, o->ob_type);
989 }
990 if (t == NULL)
991 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000992
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000993 v = PyDict_GetItem(dict, t);
994 if (!v) {
995 arg = PyDict_Size(dict);
996 v = PyInt_FromLong(arg);
997 if (!v) {
998 Py_DECREF(t);
999 return -1;
1000 }
1001 if (PyDict_SetItem(dict, t, v) < 0) {
1002 Py_DECREF(t);
1003 Py_DECREF(v);
1004 return -1;
1005 }
1006 Py_DECREF(v);
1007 }
1008 else
1009 arg = PyInt_AsLong(v);
1010 Py_DECREF(t);
1011 return arg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001012}
1013
1014static int
1015compiler_addop_o(struct compiler *c, int opcode, PyObject *dict,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001016 PyObject *o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001017{
1018 int arg = compiler_add_o(c, dict, o);
1019 if (arg < 0)
Antoine Pitroua4d36a92010-06-22 21:42:05 +00001020 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001021 return compiler_addop_i(c, opcode, arg);
1022}
1023
1024static int
1025compiler_addop_name(struct compiler *c, int opcode, PyObject *dict,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001026 PyObject *o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001027{
1028 int arg;
1029 PyObject *mangled = _Py_Mangle(c->u->u_private, o);
1030 if (!mangled)
Antoine Pitroua4d36a92010-06-22 21:42:05 +00001031 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001032 arg = compiler_add_o(c, dict, mangled);
1033 Py_DECREF(mangled);
1034 if (arg < 0)
Antoine Pitroua4d36a92010-06-22 21:42:05 +00001035 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001036 return compiler_addop_i(c, opcode, arg);
1037}
1038
1039/* Add an opcode with an integer argument.
1040 Returns 0 on failure, 1 on success.
1041*/
1042
1043static int
1044compiler_addop_i(struct compiler *c, int opcode, int oparg)
1045{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001046 struct instr *i;
1047 int off;
1048 off = compiler_next_instr(c, c->u->u_curblock);
1049 if (off < 0)
1050 return 0;
1051 i = &c->u->u_curblock->b_instr[off];
1052 i->i_opcode = opcode;
1053 i->i_oparg = oparg;
1054 i->i_hasarg = 1;
1055 compiler_set_lineno(c, off);
1056 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001057}
1058
1059static int
1060compiler_addop_j(struct compiler *c, int opcode, basicblock *b, int absolute)
1061{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001062 struct instr *i;
1063 int off;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001064
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001065 assert(b != NULL);
1066 off = compiler_next_instr(c, c->u->u_curblock);
1067 if (off < 0)
1068 return 0;
1069 i = &c->u->u_curblock->b_instr[off];
1070 i->i_opcode = opcode;
1071 i->i_target = b;
1072 i->i_hasarg = 1;
1073 if (absolute)
1074 i->i_jabs = 1;
1075 else
1076 i->i_jrel = 1;
1077 compiler_set_lineno(c, off);
1078 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001079}
1080
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001081/* The distinction between NEW_BLOCK and NEXT_BLOCK is subtle. (I'd
1082 like to find better names.) NEW_BLOCK() creates a new block and sets
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001083 it as the current block. NEXT_BLOCK() also creates an implicit jump
1084 from the current block to the new block.
1085*/
1086
Neal Norwitzf733a012006-10-29 18:30:10 +00001087/* The returns inside these macros make it impossible to decref objects
1088 created in the local function. Local objects should use the arena.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001089*/
1090
1091
1092#define NEW_BLOCK(C) { \
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001093 if (compiler_use_new_block((C)) == NULL) \
1094 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001095}
1096
1097#define NEXT_BLOCK(C) { \
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001098 if (compiler_next_block((C)) == NULL) \
1099 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001100}
1101
1102#define ADDOP(C, OP) { \
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001103 if (!compiler_addop((C), (OP))) \
1104 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001105}
1106
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001107#define ADDOP_IN_SCOPE(C, OP) { \
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001108 if (!compiler_addop((C), (OP))) { \
1109 compiler_exit_scope(c); \
1110 return 0; \
1111 } \
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001112}
1113
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001114#define ADDOP_O(C, OP, O, TYPE) { \
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001115 if (!compiler_addop_o((C), (OP), (C)->u->u_ ## TYPE, (O))) \
1116 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001117}
1118
1119#define ADDOP_NAME(C, OP, O, TYPE) { \
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001120 if (!compiler_addop_name((C), (OP), (C)->u->u_ ## TYPE, (O))) \
1121 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001122}
1123
1124#define ADDOP_I(C, OP, O) { \
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001125 if (!compiler_addop_i((C), (OP), (O))) \
1126 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001127}
1128
1129#define ADDOP_JABS(C, OP, O) { \
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001130 if (!compiler_addop_j((C), (OP), (O), 1)) \
1131 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001132}
1133
1134#define ADDOP_JREL(C, OP, O) { \
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001135 if (!compiler_addop_j((C), (OP), (O), 0)) \
1136 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001137}
1138
1139/* VISIT and VISIT_SEQ takes an ASDL type as their second argument. They use
1140 the ASDL name to synthesize the name of the C type and the visit function.
1141*/
1142
1143#define VISIT(C, TYPE, V) {\
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001144 if (!compiler_visit_ ## TYPE((C), (V))) \
1145 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001146}
1147
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001148#define VISIT_IN_SCOPE(C, TYPE, V) {\
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001149 if (!compiler_visit_ ## TYPE((C), (V))) { \
1150 compiler_exit_scope(c); \
1151 return 0; \
1152 } \
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001153}
1154
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001155#define VISIT_SLICE(C, V, CTX) {\
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001156 if (!compiler_visit_slice((C), (V), (CTX))) \
1157 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001158}
1159
1160#define VISIT_SEQ(C, TYPE, SEQ) { \
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001161 int _i; \
1162 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
1163 for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \
1164 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \
1165 if (!compiler_visit_ ## TYPE((C), elt)) \
1166 return 0; \
1167 } \
Anthony Baxter7b782b62006-04-11 12:01:56 +00001168}
1169
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001170#define VISIT_SEQ_IN_SCOPE(C, TYPE, SEQ) { \
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001171 int _i; \
1172 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
1173 for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \
1174 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \
1175 if (!compiler_visit_ ## TYPE((C), elt)) { \
1176 compiler_exit_scope(c); \
1177 return 0; \
1178 } \
1179 } \
Anthony Baxter7b782b62006-04-11 12:01:56 +00001180}
1181
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001182static int
1183compiler_isdocstring(stmt_ty s)
1184{
1185 if (s->kind != Expr_kind)
Antoine Pitroua4d36a92010-06-22 21:42:05 +00001186 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001187 return s->v.Expr.value->kind == Str_kind;
1188}
1189
1190/* Compile a sequence of statements, checking for a docstring. */
1191
1192static int
1193compiler_body(struct compiler *c, asdl_seq *stmts)
1194{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001195 int i = 0;
1196 stmt_ty st;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001197
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001198 if (!asdl_seq_LEN(stmts))
1199 return 1;
1200 st = (stmt_ty)asdl_seq_GET(stmts, 0);
1201 if (compiler_isdocstring(st) && Py_OptimizeFlag < 2) {
1202 /* don't generate docstrings if -OO */
1203 i = 1;
1204 VISIT(c, expr, st->v.Expr.value);
1205 if (!compiler_nameop(c, __doc__, Store))
1206 return 0;
1207 }
1208 for (; i < asdl_seq_LEN(stmts); i++)
1209 VISIT(c, stmt, (stmt_ty)asdl_seq_GET(stmts, i));
1210 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001211}
1212
1213static PyCodeObject *
1214compiler_mod(struct compiler *c, mod_ty mod)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001215{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001216 PyCodeObject *co;
1217 int addNone = 1;
1218 static PyObject *module;
1219 if (!module) {
1220 module = PyString_InternFromString("<module>");
1221 if (!module)
1222 return NULL;
1223 }
1224 /* Use 0 for firstlineno initially, will fixup in assemble(). */
1225 if (!compiler_enter_scope(c, module, mod, 0))
1226 return NULL;
1227 switch (mod->kind) {
1228 case Module_kind:
1229 if (!compiler_body(c, mod->v.Module.body)) {
1230 compiler_exit_scope(c);
1231 return 0;
1232 }
1233 break;
1234 case Interactive_kind:
1235 c->c_interactive = 1;
1236 VISIT_SEQ_IN_SCOPE(c, stmt,
1237 mod->v.Interactive.body);
1238 break;
1239 case Expression_kind:
1240 VISIT_IN_SCOPE(c, expr, mod->v.Expression.body);
1241 addNone = 0;
1242 break;
1243 case Suite_kind:
1244 PyErr_SetString(PyExc_SystemError,
1245 "suite should not be possible");
1246 return 0;
1247 default:
1248 PyErr_Format(PyExc_SystemError,
1249 "module kind %d should not be possible",
1250 mod->kind);
1251 return 0;
1252 }
1253 co = assemble(c, addNone);
1254 compiler_exit_scope(c);
1255 return co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001256}
1257
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001258/* The test for LOCAL must come before the test for FREE in order to
1259 handle classes where name is both local and free. The local var is
1260 a method and the free var is a free var referenced within a method.
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001261*/
1262
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001263static int
1264get_ref_type(struct compiler *c, PyObject *name)
1265{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001266 int scope = PyST_GetScope(c->u->u_ste, name);
1267 if (scope == 0) {
1268 char buf[350];
1269 PyOS_snprintf(buf, sizeof(buf),
1270 "unknown scope for %.100s in %.100s(%s) in %s\n"
1271 "symbols: %s\nlocals: %s\nglobals: %s",
1272 PyString_AS_STRING(name),
1273 PyString_AS_STRING(c->u->u_name),
Serhiy Storchakaa86c0912014-11-19 00:11:05 +02001274 PyString_AS_STRING(PyObject_Repr(c->u->u_ste->ste_id)),
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001275 c->c_filename,
Serhiy Storchakaa86c0912014-11-19 00:11:05 +02001276 PyString_AS_STRING(PyObject_Repr(c->u->u_ste->ste_symbols)),
1277 PyString_AS_STRING(PyObject_Repr(c->u->u_varnames)),
1278 PyString_AS_STRING(PyObject_Repr(c->u->u_names))
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001279 );
1280 Py_FatalError(buf);
1281 }
Tim Peters2a7f3842001-06-09 09:26:21 +00001282
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001283 return scope;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001284}
1285
1286static int
1287compiler_lookup_arg(PyObject *dict, PyObject *name)
1288{
1289 PyObject *k, *v;
Georg Brandl7784f122006-05-26 20:04:44 +00001290 k = PyTuple_Pack(2, name, name->ob_type);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001291 if (k == NULL)
Antoine Pitroua4d36a92010-06-22 21:42:05 +00001292 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001293 v = PyDict_GetItem(dict, k);
Neal Norwitz3715c3e2005-11-24 22:09:18 +00001294 Py_DECREF(k);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001295 if (v == NULL)
Antoine Pitroua4d36a92010-06-22 21:42:05 +00001296 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001297 return PyInt_AS_LONG(v);
1298}
1299
1300static int
1301compiler_make_closure(struct compiler *c, PyCodeObject *co, int args)
1302{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001303 int i, free = PyCode_GetNumFree(co);
1304 if (free == 0) {
1305 ADDOP_O(c, LOAD_CONST, (PyObject*)co, consts);
1306 ADDOP_I(c, MAKE_FUNCTION, args);
1307 return 1;
1308 }
1309 for (i = 0; i < free; ++i) {
1310 /* Bypass com_addop_varname because it will generate
1311 LOAD_DEREF but LOAD_CLOSURE is needed.
1312 */
1313 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
1314 int arg, reftype;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001315
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001316 /* Special case: If a class contains a method with a
1317 free variable that has the same name as a method,
1318 the name will be considered free *and* local in the
1319 class. It should be handled by the closure, as
1320 well as by the normal name loookup logic.
1321 */
1322 reftype = get_ref_type(c, name);
1323 if (reftype == CELL)
1324 arg = compiler_lookup_arg(c->u->u_cellvars, name);
1325 else /* (reftype == FREE) */
1326 arg = compiler_lookup_arg(c->u->u_freevars, name);
1327 if (arg == -1) {
1328 printf("lookup %s in %s %d %d\n"
1329 "freevars of %s: %s\n",
Serhiy Storchakaa86c0912014-11-19 00:11:05 +02001330 PyString_AS_STRING(PyObject_Repr(name)),
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001331 PyString_AS_STRING(c->u->u_name),
1332 reftype, arg,
1333 PyString_AS_STRING(co->co_name),
Serhiy Storchakaa86c0912014-11-19 00:11:05 +02001334 PyString_AS_STRING(PyObject_Repr(co->co_freevars)));
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001335 Py_FatalError("compiler_make_closure()");
1336 }
1337 ADDOP_I(c, LOAD_CLOSURE, arg);
1338 }
1339 ADDOP_I(c, BUILD_TUPLE, free);
1340 ADDOP_O(c, LOAD_CONST, (PyObject*)co, consts);
1341 ADDOP_I(c, MAKE_CLOSURE, args);
1342 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001343}
1344
1345static int
1346compiler_decorators(struct compiler *c, asdl_seq* decos)
1347{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001348 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001349
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001350 if (!decos)
1351 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001352
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001353 for (i = 0; i < asdl_seq_LEN(decos); i++) {
1354 VISIT(c, expr, (expr_ty)asdl_seq_GET(decos, i));
1355 }
1356 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001357}
1358
1359static int
1360compiler_arguments(struct compiler *c, arguments_ty args)
1361{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001362 int i;
1363 int n = asdl_seq_LEN(args->args);
1364 /* Correctly handle nested argument lists */
1365 for (i = 0; i < n; i++) {
1366 expr_ty arg = (expr_ty)asdl_seq_GET(args->args, i);
1367 if (arg->kind == Tuple_kind) {
1368 PyObject *id = PyString_FromFormat(".%d", i);
1369 if (id == NULL) {
1370 return 0;
1371 }
1372 if (!compiler_nameop(c, id, Load)) {
1373 Py_DECREF(id);
1374 return 0;
1375 }
1376 Py_DECREF(id);
1377 VISIT(c, expr, arg);
1378 }
1379 }
1380 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001381}
1382
1383static int
1384compiler_function(struct compiler *c, stmt_ty s)
1385{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001386 PyCodeObject *co;
1387 PyObject *first_const = Py_None;
1388 arguments_ty args = s->v.FunctionDef.args;
1389 asdl_seq* decos = s->v.FunctionDef.decorator_list;
1390 stmt_ty st;
1391 int i, n, docstring;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001392
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001393 assert(s->kind == FunctionDef_kind);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001394
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001395 if (!compiler_decorators(c, decos))
1396 return 0;
1397 if (args->defaults)
1398 VISIT_SEQ(c, expr, args->defaults);
1399 if (!compiler_enter_scope(c, s->v.FunctionDef.name, (void *)s,
1400 s->lineno))
1401 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001402
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001403 st = (stmt_ty)asdl_seq_GET(s->v.FunctionDef.body, 0);
1404 docstring = compiler_isdocstring(st);
1405 if (docstring && Py_OptimizeFlag < 2)
1406 first_const = st->v.Expr.value->v.Str.s;
1407 if (compiler_add_o(c, c->u->u_consts, first_const) < 0) {
1408 compiler_exit_scope(c);
1409 return 0;
1410 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001411
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001412 /* unpack nested arguments */
1413 compiler_arguments(c, args);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001414
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001415 c->u->u_argcount = asdl_seq_LEN(args->args);
1416 n = asdl_seq_LEN(s->v.FunctionDef.body);
1417 /* if there was a docstring, we need to skip the first statement */
1418 for (i = docstring; i < n; i++) {
1419 st = (stmt_ty)asdl_seq_GET(s->v.FunctionDef.body, i);
1420 VISIT_IN_SCOPE(c, stmt, st);
1421 }
1422 co = assemble(c, 1);
1423 compiler_exit_scope(c);
1424 if (co == NULL)
1425 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001426
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001427 compiler_make_closure(c, co, asdl_seq_LEN(args->defaults));
1428 Py_DECREF(co);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001429
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001430 for (i = 0; i < asdl_seq_LEN(decos); i++) {
1431 ADDOP_I(c, CALL_FUNCTION, 1);
1432 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001433
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001434 return compiler_nameop(c, s->v.FunctionDef.name, Store);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001435}
1436
1437static int
1438compiler_class(struct compiler *c, stmt_ty s)
1439{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001440 int n, i;
1441 PyCodeObject *co;
1442 PyObject *str;
1443 asdl_seq* decos = s->v.ClassDef.decorator_list;
Christian Heimes5224d282008-02-23 15:01:05 +00001444
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001445 if (!compiler_decorators(c, decos))
1446 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001447
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001448 /* push class name on stack, needed by BUILD_CLASS */
1449 ADDOP_O(c, LOAD_CONST, s->v.ClassDef.name, consts);
1450 /* push the tuple of base classes on the stack */
1451 n = asdl_seq_LEN(s->v.ClassDef.bases);
1452 if (n > 0)
1453 VISIT_SEQ(c, expr, s->v.ClassDef.bases);
1454 ADDOP_I(c, BUILD_TUPLE, n);
1455 if (!compiler_enter_scope(c, s->v.ClassDef.name, (void *)s,
1456 s->lineno))
1457 return 0;
1458 Py_XDECREF(c->u->u_private);
1459 c->u->u_private = s->v.ClassDef.name;
1460 Py_INCREF(c->u->u_private);
1461 str = PyString_InternFromString("__name__");
1462 if (!str || !compiler_nameop(c, str, Load)) {
1463 Py_XDECREF(str);
1464 compiler_exit_scope(c);
1465 return 0;
1466 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001467
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001468 Py_DECREF(str);
1469 str = PyString_InternFromString("__module__");
1470 if (!str || !compiler_nameop(c, str, Store)) {
1471 Py_XDECREF(str);
1472 compiler_exit_scope(c);
1473 return 0;
1474 }
1475 Py_DECREF(str);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001476
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001477 if (!compiler_body(c, s->v.ClassDef.body)) {
1478 compiler_exit_scope(c);
1479 return 0;
1480 }
Neal Norwitz4737b232005-11-19 23:58:29 +00001481
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001482 ADDOP_IN_SCOPE(c, LOAD_LOCALS);
1483 ADDOP_IN_SCOPE(c, RETURN_VALUE);
1484 co = assemble(c, 1);
1485 compiler_exit_scope(c);
1486 if (co == NULL)
1487 return 0;
1488
1489 compiler_make_closure(c, co, 0);
1490 Py_DECREF(co);
1491
1492 ADDOP_I(c, CALL_FUNCTION, 0);
1493 ADDOP(c, BUILD_CLASS);
1494 /* apply decorators */
1495 for (i = 0; i < asdl_seq_LEN(decos); i++) {
1496 ADDOP_I(c, CALL_FUNCTION, 1);
1497 }
1498 if (!compiler_nameop(c, s->v.ClassDef.name, Store))
1499 return 0;
1500 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001501}
1502
1503static int
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001504compiler_ifexp(struct compiler *c, expr_ty e)
1505{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001506 basicblock *end, *next;
1507
1508 assert(e->kind == IfExp_kind);
1509 end = compiler_new_block(c);
1510 if (end == NULL)
1511 return 0;
1512 next = compiler_new_block(c);
1513 if (next == NULL)
1514 return 0;
1515 VISIT(c, expr, e->v.IfExp.test);
1516 ADDOP_JABS(c, POP_JUMP_IF_FALSE, next);
1517 VISIT(c, expr, e->v.IfExp.body);
1518 ADDOP_JREL(c, JUMP_FORWARD, end);
1519 compiler_use_next_block(c, next);
1520 VISIT(c, expr, e->v.IfExp.orelse);
1521 compiler_use_next_block(c, end);
1522 return 1;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001523}
1524
1525static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001526compiler_lambda(struct compiler *c, expr_ty e)
1527{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001528 PyCodeObject *co;
1529 static identifier name;
1530 arguments_ty args = e->v.Lambda.args;
1531 assert(e->kind == Lambda_kind);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001532
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001533 if (!name) {
1534 name = PyString_InternFromString("<lambda>");
1535 if (!name)
1536 return 0;
1537 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001538
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001539 if (args->defaults)
1540 VISIT_SEQ(c, expr, args->defaults);
1541 if (!compiler_enter_scope(c, name, (void *)e, e->lineno))
1542 return 0;
Neal Norwitz4737b232005-11-19 23:58:29 +00001543
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001544 /* unpack nested arguments */
1545 compiler_arguments(c, args);
Benjamin Peterson0dee9c12010-03-17 20:41:42 +00001546
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001547 /* Make None the first constant, so the lambda can't have a
1548 docstring. */
1549 if (compiler_add_o(c, c->u->u_consts, Py_None) < 0)
1550 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001551
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001552 c->u->u_argcount = asdl_seq_LEN(args->args);
1553 VISIT_IN_SCOPE(c, expr, e->v.Lambda.body);
1554 if (c->u->u_ste->ste_generator) {
1555 ADDOP_IN_SCOPE(c, POP_TOP);
1556 }
1557 else {
1558 ADDOP_IN_SCOPE(c, RETURN_VALUE);
1559 }
1560 co = assemble(c, 1);
1561 compiler_exit_scope(c);
1562 if (co == NULL)
1563 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001564
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001565 compiler_make_closure(c, co, asdl_seq_LEN(args->defaults));
1566 Py_DECREF(co);
1567
1568 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001569}
1570
1571static int
1572compiler_print(struct compiler *c, stmt_ty s)
1573{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001574 int i, n;
1575 bool dest;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001576
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001577 assert(s->kind == Print_kind);
1578 n = asdl_seq_LEN(s->v.Print.values);
1579 dest = false;
1580 if (s->v.Print.dest) {
1581 VISIT(c, expr, s->v.Print.dest);
1582 dest = true;
1583 }
1584 for (i = 0; i < n; i++) {
1585 expr_ty e = (expr_ty)asdl_seq_GET(s->v.Print.values, i);
1586 if (dest) {
1587 ADDOP(c, DUP_TOP);
1588 VISIT(c, expr, e);
1589 ADDOP(c, ROT_TWO);
1590 ADDOP(c, PRINT_ITEM_TO);
1591 }
1592 else {
1593 VISIT(c, expr, e);
1594 ADDOP(c, PRINT_ITEM);
1595 }
1596 }
1597 if (s->v.Print.nl) {
1598 if (dest)
1599 ADDOP(c, PRINT_NEWLINE_TO)
1600 else
1601 ADDOP(c, PRINT_NEWLINE)
1602 }
1603 else if (dest)
1604 ADDOP(c, POP_TOP);
1605 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001606}
1607
1608static int
1609compiler_if(struct compiler *c, stmt_ty s)
1610{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001611 basicblock *end, *next;
1612 int constant;
1613 assert(s->kind == If_kind);
1614 end = compiler_new_block(c);
1615 if (end == NULL)
1616 return 0;
1617
1618 constant = expr_constant(s->v.If.test);
1619 /* constant = 0: "if 0"
1620 * constant = 1: "if 1", "if 2", ...
1621 * constant = -1: rest */
1622 if (constant == 0) {
1623 if (s->v.If.orelse)
1624 VISIT_SEQ(c, stmt, s->v.If.orelse);
1625 } else if (constant == 1) {
1626 VISIT_SEQ(c, stmt, s->v.If.body);
1627 } else {
1628 if (s->v.If.orelse) {
1629 next = compiler_new_block(c);
1630 if (next == NULL)
1631 return 0;
1632 }
1633 else
1634 next = end;
1635 VISIT(c, expr, s->v.If.test);
1636 ADDOP_JABS(c, POP_JUMP_IF_FALSE, next);
1637 VISIT_SEQ(c, stmt, s->v.If.body);
1638 ADDOP_JREL(c, JUMP_FORWARD, end);
1639 if (s->v.If.orelse) {
1640 compiler_use_next_block(c, next);
1641 VISIT_SEQ(c, stmt, s->v.If.orelse);
1642 }
1643 }
1644 compiler_use_next_block(c, end);
1645 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001646}
1647
1648static int
1649compiler_for(struct compiler *c, stmt_ty s)
1650{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001651 basicblock *start, *cleanup, *end;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001652
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001653 start = compiler_new_block(c);
1654 cleanup = compiler_new_block(c);
1655 end = compiler_new_block(c);
1656 if (start == NULL || end == NULL || cleanup == NULL)
1657 return 0;
1658 ADDOP_JREL(c, SETUP_LOOP, end);
1659 if (!compiler_push_fblock(c, LOOP, start))
1660 return 0;
1661 VISIT(c, expr, s->v.For.iter);
1662 ADDOP(c, GET_ITER);
1663 compiler_use_next_block(c, start);
1664 ADDOP_JREL(c, FOR_ITER, cleanup);
1665 VISIT(c, expr, s->v.For.target);
1666 VISIT_SEQ(c, stmt, s->v.For.body);
1667 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
1668 compiler_use_next_block(c, cleanup);
1669 ADDOP(c, POP_BLOCK);
1670 compiler_pop_fblock(c, LOOP, start);
1671 VISIT_SEQ(c, stmt, s->v.For.orelse);
1672 compiler_use_next_block(c, end);
1673 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001674}
1675
1676static int
1677compiler_while(struct compiler *c, stmt_ty s)
1678{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001679 basicblock *loop, *orelse, *end, *anchor = NULL;
1680 int constant = expr_constant(s->v.While.test);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001681
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001682 if (constant == 0) {
1683 if (s->v.While.orelse)
1684 VISIT_SEQ(c, stmt, s->v.While.orelse);
1685 return 1;
1686 }
1687 loop = compiler_new_block(c);
1688 end = compiler_new_block(c);
1689 if (constant == -1) {
1690 anchor = compiler_new_block(c);
1691 if (anchor == NULL)
1692 return 0;
1693 }
1694 if (loop == NULL || end == NULL)
1695 return 0;
1696 if (s->v.While.orelse) {
1697 orelse = compiler_new_block(c);
1698 if (orelse == NULL)
1699 return 0;
1700 }
1701 else
1702 orelse = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001703
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001704 ADDOP_JREL(c, SETUP_LOOP, end);
1705 compiler_use_next_block(c, loop);
1706 if (!compiler_push_fblock(c, LOOP, loop))
1707 return 0;
1708 if (constant == -1) {
1709 VISIT(c, expr, s->v.While.test);
1710 ADDOP_JABS(c, POP_JUMP_IF_FALSE, anchor);
1711 }
1712 VISIT_SEQ(c, stmt, s->v.While.body);
1713 ADDOP_JABS(c, JUMP_ABSOLUTE, loop);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001714
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001715 /* XXX should the two POP instructions be in a separate block
1716 if there is no else clause ?
1717 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001718
Benjamin Peterson7a6a9732014-12-13 16:06:19 -05001719 if (constant == -1)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001720 compiler_use_next_block(c, anchor);
Benjamin Peterson7a6a9732014-12-13 16:06:19 -05001721 ADDOP(c, POP_BLOCK);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001722 compiler_pop_fblock(c, LOOP, loop);
1723 if (orelse != NULL) /* what if orelse is just pass? */
1724 VISIT_SEQ(c, stmt, s->v.While.orelse);
1725 compiler_use_next_block(c, end);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001726
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001727 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001728}
1729
1730static int
1731compiler_continue(struct compiler *c)
1732{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001733 static const char LOOP_ERROR_MSG[] = "'continue' not properly in loop";
1734 static const char IN_FINALLY_ERROR_MSG[] =
1735 "'continue' not supported inside 'finally' clause";
1736 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001737
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001738 if (!c->u->u_nfblocks)
1739 return compiler_error(c, LOOP_ERROR_MSG);
1740 i = c->u->u_nfblocks - 1;
1741 switch (c->u->u_fblock[i].fb_type) {
1742 case LOOP:
1743 ADDOP_JABS(c, JUMP_ABSOLUTE, c->u->u_fblock[i].fb_block);
1744 break;
1745 case EXCEPT:
1746 case FINALLY_TRY:
1747 while (--i >= 0 && c->u->u_fblock[i].fb_type != LOOP) {
1748 /* Prevent continue anywhere under a finally
1749 even if hidden in a sub-try or except. */
1750 if (c->u->u_fblock[i].fb_type == FINALLY_END)
1751 return compiler_error(c, IN_FINALLY_ERROR_MSG);
1752 }
1753 if (i == -1)
1754 return compiler_error(c, LOOP_ERROR_MSG);
1755 ADDOP_JABS(c, CONTINUE_LOOP, c->u->u_fblock[i].fb_block);
1756 break;
1757 case FINALLY_END:
1758 return compiler_error(c, IN_FINALLY_ERROR_MSG);
1759 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001760
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001761 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001762}
1763
1764/* Code generated for "try: <body> finally: <finalbody>" is as follows:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001765
1766 SETUP_FINALLY L
1767 <code for body>
1768 POP_BLOCK
1769 LOAD_CONST <None>
1770 L: <code for finalbody>
1771 END_FINALLY
1772
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001773 The special instructions use the block stack. Each block
1774 stack entry contains the instruction that created it (here
1775 SETUP_FINALLY), the level of the value stack at the time the
1776 block stack entry was created, and a label (here L).
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001777
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001778 SETUP_FINALLY:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001779 Pushes the current value stack level and the label
1780 onto the block stack.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001781 POP_BLOCK:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001782 Pops en entry from the block stack, and pops the value
1783 stack until its level is the same as indicated on the
1784 block stack. (The label is ignored.)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001785 END_FINALLY:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001786 Pops a variable number of entries from the *value* stack
1787 and re-raises the exception they specify. The number of
1788 entries popped depends on the (pseudo) exception type.
1789
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001790 The block stack is unwound when an exception is raised:
1791 when a SETUP_FINALLY entry is found, the exception is pushed
1792 onto the value stack (and the exception condition is cleared),
1793 and the interpreter jumps to the label gotten from the block
1794 stack.
1795*/
1796
1797static int
1798compiler_try_finally(struct compiler *c, stmt_ty s)
1799{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001800 basicblock *body, *end;
1801 body = compiler_new_block(c);
1802 end = compiler_new_block(c);
1803 if (body == NULL || end == NULL)
1804 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001805
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001806 ADDOP_JREL(c, SETUP_FINALLY, end);
1807 compiler_use_next_block(c, body);
1808 if (!compiler_push_fblock(c, FINALLY_TRY, body))
1809 return 0;
1810 VISIT_SEQ(c, stmt, s->v.TryFinally.body);
1811 ADDOP(c, POP_BLOCK);
1812 compiler_pop_fblock(c, FINALLY_TRY, body);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001813
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001814 ADDOP_O(c, LOAD_CONST, Py_None, consts);
1815 compiler_use_next_block(c, end);
1816 if (!compiler_push_fblock(c, FINALLY_END, end))
1817 return 0;
1818 VISIT_SEQ(c, stmt, s->v.TryFinally.finalbody);
1819 ADDOP(c, END_FINALLY);
1820 compiler_pop_fblock(c, FINALLY_END, end);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001821
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001822 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001823}
1824
1825/*
1826 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
1827 (The contents of the value stack is shown in [], with the top
1828 at the right; 'tb' is trace-back info, 'val' the exception's
1829 associated value, and 'exc' the exception.)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001830
1831 Value stack Label Instruction Argument
1832 [] SETUP_EXCEPT L1
1833 [] <code for S>
1834 [] POP_BLOCK
1835 [] JUMP_FORWARD L0
1836
1837 [tb, val, exc] L1: DUP )
1838 [tb, val, exc, exc] <evaluate E1> )
1839 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
1840 [tb, val, exc, 1-or-0] POP_JUMP_IF_FALSE L2 )
1841 [tb, val, exc] POP
1842 [tb, val] <assign to V1> (or POP if no V1)
1843 [tb] POP
1844 [] <code for S1>
1845 JUMP_FORWARD L0
1846
1847 [tb, val, exc] L2: DUP
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001848 .............................etc.......................
1849
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001850 [tb, val, exc] Ln+1: END_FINALLY # re-raise exception
1851
1852 [] L0: <next statement>
1853
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001854 Of course, parts are not generated if Vi or Ei is not present.
1855*/
1856static int
1857compiler_try_except(struct compiler *c, stmt_ty s)
1858{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001859 basicblock *body, *orelse, *except, *end;
1860 int i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001861
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001862 body = compiler_new_block(c);
1863 except = compiler_new_block(c);
1864 orelse = compiler_new_block(c);
1865 end = compiler_new_block(c);
1866 if (body == NULL || except == NULL || orelse == NULL || end == NULL)
1867 return 0;
1868 ADDOP_JREL(c, SETUP_EXCEPT, except);
1869 compiler_use_next_block(c, body);
1870 if (!compiler_push_fblock(c, EXCEPT, body))
1871 return 0;
1872 VISIT_SEQ(c, stmt, s->v.TryExcept.body);
1873 ADDOP(c, POP_BLOCK);
1874 compiler_pop_fblock(c, EXCEPT, body);
1875 ADDOP_JREL(c, JUMP_FORWARD, orelse);
1876 n = asdl_seq_LEN(s->v.TryExcept.handlers);
1877 compiler_use_next_block(c, except);
1878 for (i = 0; i < n; i++) {
1879 excepthandler_ty handler = (excepthandler_ty)asdl_seq_GET(
1880 s->v.TryExcept.handlers, i);
1881 if (!handler->v.ExceptHandler.type && i < n-1)
1882 return compiler_error(c, "default 'except:' must be last");
1883 c->u->u_lineno_set = false;
1884 c->u->u_lineno = handler->lineno;
1885 except = compiler_new_block(c);
1886 if (except == NULL)
1887 return 0;
1888 if (handler->v.ExceptHandler.type) {
1889 ADDOP(c, DUP_TOP);
1890 VISIT(c, expr, handler->v.ExceptHandler.type);
1891 ADDOP_I(c, COMPARE_OP, PyCmp_EXC_MATCH);
1892 ADDOP_JABS(c, POP_JUMP_IF_FALSE, except);
1893 }
1894 ADDOP(c, POP_TOP);
1895 if (handler->v.ExceptHandler.name) {
1896 VISIT(c, expr, handler->v.ExceptHandler.name);
1897 }
1898 else {
1899 ADDOP(c, POP_TOP);
1900 }
1901 ADDOP(c, POP_TOP);
1902 VISIT_SEQ(c, stmt, handler->v.ExceptHandler.body);
1903 ADDOP_JREL(c, JUMP_FORWARD, end);
1904 compiler_use_next_block(c, except);
1905 }
1906 ADDOP(c, END_FINALLY);
1907 compiler_use_next_block(c, orelse);
1908 VISIT_SEQ(c, stmt, s->v.TryExcept.orelse);
1909 compiler_use_next_block(c, end);
1910 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001911}
1912
1913static int
1914compiler_import_as(struct compiler *c, identifier name, identifier asname)
1915{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001916 /* The IMPORT_NAME opcode was already generated. This function
1917 merely needs to bind the result to a name.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001918
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001919 If there is a dot in name, we need to split it and emit a
1920 LOAD_ATTR for each name.
1921 */
1922 const char *src = PyString_AS_STRING(name);
1923 const char *dot = strchr(src, '.');
1924 if (dot) {
1925 /* Consume the base module name to get the first attribute */
1926 src = dot + 1;
1927 while (dot) {
1928 /* NB src is only defined when dot != NULL */
1929 PyObject *attr;
1930 dot = strchr(src, '.');
1931 attr = PyString_FromStringAndSize(src,
1932 dot ? dot - src : strlen(src));
1933 if (!attr)
1934 return -1;
1935 ADDOP_O(c, LOAD_ATTR, attr, names);
1936 Py_DECREF(attr);
1937 src = dot + 1;
1938 }
1939 }
1940 return compiler_nameop(c, asname, Store);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001941}
1942
1943static int
1944compiler_import(struct compiler *c, stmt_ty s)
1945{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001946 /* The Import node stores a module name like a.b.c as a single
1947 string. This is convenient for all cases except
1948 import a.b.c as d
1949 where we need to parse that string to extract the individual
1950 module names.
1951 XXX Perhaps change the representation to make this case simpler?
1952 */
1953 int i, n = asdl_seq_LEN(s->v.Import.names);
Thomas Woutersf7f438b2006-02-28 16:09:29 +00001954
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001955 for (i = 0; i < n; i++) {
1956 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.Import.names, i);
1957 int r;
1958 PyObject *level;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001959
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001960 if (c->c_flags && (c->c_flags->cf_flags & CO_FUTURE_ABSOLUTE_IMPORT))
1961 level = PyInt_FromLong(0);
1962 else
1963 level = PyInt_FromLong(-1);
Thomas Woutersf7f438b2006-02-28 16:09:29 +00001964
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001965 if (level == NULL)
1966 return 0;
Thomas Woutersf7f438b2006-02-28 16:09:29 +00001967
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001968 ADDOP_O(c, LOAD_CONST, level, consts);
1969 Py_DECREF(level);
1970 ADDOP_O(c, LOAD_CONST, Py_None, consts);
1971 ADDOP_NAME(c, IMPORT_NAME, alias->name, names);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001972
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001973 if (alias->asname) {
1974 r = compiler_import_as(c, alias->name, alias->asname);
1975 if (!r)
1976 return r;
1977 }
1978 else {
1979 identifier tmp = alias->name;
1980 const char *base = PyString_AS_STRING(alias->name);
1981 char *dot = strchr(base, '.');
Benjamin Peterson0287f2f2015-07-27 07:47:21 -07001982 if (dot) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001983 tmp = PyString_FromStringAndSize(base,
1984 dot - base);
Benjamin Peterson0287f2f2015-07-27 07:47:21 -07001985 if (tmp == NULL)
1986 return 0;
1987 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001988 r = compiler_nameop(c, tmp, Store);
1989 if (dot) {
1990 Py_DECREF(tmp);
1991 }
1992 if (!r)
1993 return r;
1994 }
1995 }
1996 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001997}
1998
1999static int
2000compiler_from_import(struct compiler *c, stmt_ty s)
2001{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002002 int i, n = asdl_seq_LEN(s->v.ImportFrom.names);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002003
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002004 PyObject *names = PyTuple_New(n);
2005 PyObject *level;
2006 static PyObject *empty_string;
Benjamin Petersona72be3b2009-06-13 20:23:33 +00002007
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002008 if (!empty_string) {
2009 empty_string = PyString_FromString("");
2010 if (!empty_string)
2011 return 0;
2012 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002013
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002014 if (!names)
2015 return 0;
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002016
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002017 if (s->v.ImportFrom.level == 0 && c->c_flags &&
2018 !(c->c_flags->cf_flags & CO_FUTURE_ABSOLUTE_IMPORT))
2019 level = PyInt_FromLong(-1);
2020 else
2021 level = PyInt_FromLong(s->v.ImportFrom.level);
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002022
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002023 if (!level) {
2024 Py_DECREF(names);
2025 return 0;
2026 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002027
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002028 /* build up the names */
2029 for (i = 0; i < n; i++) {
2030 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);
2031 Py_INCREF(alias->name);
2032 PyTuple_SET_ITEM(names, i, alias->name);
2033 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002034
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002035 if (s->lineno > c->c_future->ff_lineno && s->v.ImportFrom.module &&
2036 !strcmp(PyString_AS_STRING(s->v.ImportFrom.module), "__future__")) {
2037 Py_DECREF(level);
2038 Py_DECREF(names);
2039 return compiler_error(c, "from __future__ imports must occur "
2040 "at the beginning of the file");
2041 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002042
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002043 ADDOP_O(c, LOAD_CONST, level, consts);
2044 Py_DECREF(level);
2045 ADDOP_O(c, LOAD_CONST, names, consts);
2046 Py_DECREF(names);
2047 if (s->v.ImportFrom.module) {
2048 ADDOP_NAME(c, IMPORT_NAME, s->v.ImportFrom.module, names);
2049 }
2050 else {
2051 ADDOP_NAME(c, IMPORT_NAME, empty_string, names);
2052 }
2053 for (i = 0; i < n; i++) {
2054 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);
2055 identifier store_name;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002056
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002057 if (i == 0 && *PyString_AS_STRING(alias->name) == '*') {
2058 assert(n == 1);
2059 ADDOP(c, IMPORT_STAR);
2060 return 1;
2061 }
2062
2063 ADDOP_NAME(c, IMPORT_FROM, alias->name, names);
2064 store_name = alias->name;
2065 if (alias->asname)
2066 store_name = alias->asname;
2067
2068 if (!compiler_nameop(c, store_name, Store)) {
2069 Py_DECREF(names);
2070 return 0;
2071 }
2072 }
2073 /* remove imported module */
2074 ADDOP(c, POP_TOP);
2075 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002076}
2077
2078static int
2079compiler_assert(struct compiler *c, stmt_ty s)
2080{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002081 static PyObject *assertion_error = NULL;
2082 basicblock *end;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002083
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002084 if (Py_OptimizeFlag)
2085 return 1;
2086 if (assertion_error == NULL) {
2087 assertion_error = PyString_InternFromString("AssertionError");
2088 if (assertion_error == NULL)
2089 return 0;
2090 }
2091 if (s->v.Assert.test->kind == Tuple_kind &&
2092 asdl_seq_LEN(s->v.Assert.test->v.Tuple.elts) > 0) {
2093 const char* msg =
2094 "assertion is always true, perhaps remove parentheses?";
2095 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, c->c_filename,
2096 c->u->u_lineno, NULL, NULL) == -1)
2097 return 0;
2098 }
2099 VISIT(c, expr, s->v.Assert.test);
2100 end = compiler_new_block(c);
2101 if (end == NULL)
2102 return 0;
2103 ADDOP_JABS(c, POP_JUMP_IF_TRUE, end);
2104 ADDOP_O(c, LOAD_GLOBAL, assertion_error, names);
2105 if (s->v.Assert.msg) {
2106 VISIT(c, expr, s->v.Assert.msg);
Benjamin Peterson0c0d7562011-10-27 08:21:59 -04002107 ADDOP_I(c, CALL_FUNCTION, 1);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002108 }
Benjamin Peterson0c0d7562011-10-27 08:21:59 -04002109 ADDOP_I(c, RAISE_VARARGS, 1);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002110 compiler_use_next_block(c, end);
2111 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002112}
2113
2114static int
2115compiler_visit_stmt(struct compiler *c, stmt_ty s)
2116{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002117 int i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002118
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002119 /* Always assign a lineno to the next instruction for a stmt. */
2120 c->u->u_lineno = s->lineno;
2121 c->u->u_lineno_set = false;
Jeremy Hylton12603c42006-04-01 16:18:02 +00002122
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002123 switch (s->kind) {
2124 case FunctionDef_kind:
2125 return compiler_function(c, s);
2126 case ClassDef_kind:
2127 return compiler_class(c, s);
2128 case Return_kind:
2129 if (c->u->u_ste->ste_type != FunctionBlock)
2130 return compiler_error(c, "'return' outside function");
2131 if (s->v.Return.value) {
2132 VISIT(c, expr, s->v.Return.value);
2133 }
2134 else
2135 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2136 ADDOP(c, RETURN_VALUE);
2137 break;
2138 case Delete_kind:
2139 VISIT_SEQ(c, expr, s->v.Delete.targets)
2140 break;
2141 case Assign_kind:
2142 n = asdl_seq_LEN(s->v.Assign.targets);
2143 VISIT(c, expr, s->v.Assign.value);
2144 for (i = 0; i < n; i++) {
2145 if (i < n - 1)
2146 ADDOP(c, DUP_TOP);
2147 VISIT(c, expr,
2148 (expr_ty)asdl_seq_GET(s->v.Assign.targets, i));
2149 }
2150 break;
2151 case AugAssign_kind:
2152 return compiler_augassign(c, s);
2153 case Print_kind:
2154 return compiler_print(c, s);
2155 case For_kind:
2156 return compiler_for(c, s);
2157 case While_kind:
2158 return compiler_while(c, s);
2159 case If_kind:
2160 return compiler_if(c, s);
2161 case Raise_kind:
2162 n = 0;
2163 if (s->v.Raise.type) {
2164 VISIT(c, expr, s->v.Raise.type);
2165 n++;
2166 if (s->v.Raise.inst) {
2167 VISIT(c, expr, s->v.Raise.inst);
2168 n++;
2169 if (s->v.Raise.tback) {
2170 VISIT(c, expr, s->v.Raise.tback);
2171 n++;
2172 }
2173 }
2174 }
2175 ADDOP_I(c, RAISE_VARARGS, n);
2176 break;
2177 case TryExcept_kind:
2178 return compiler_try_except(c, s);
2179 case TryFinally_kind:
2180 return compiler_try_finally(c, s);
2181 case Assert_kind:
2182 return compiler_assert(c, s);
2183 case Import_kind:
2184 return compiler_import(c, s);
2185 case ImportFrom_kind:
2186 return compiler_from_import(c, s);
2187 case Exec_kind:
2188 VISIT(c, expr, s->v.Exec.body);
2189 if (s->v.Exec.globals) {
2190 VISIT(c, expr, s->v.Exec.globals);
2191 if (s->v.Exec.locals) {
2192 VISIT(c, expr, s->v.Exec.locals);
2193 } else {
2194 ADDOP(c, DUP_TOP);
2195 }
2196 } else {
2197 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2198 ADDOP(c, DUP_TOP);
2199 }
2200 ADDOP(c, EXEC_STMT);
2201 break;
2202 case Global_kind:
2203 break;
2204 case Expr_kind:
2205 if (c->c_interactive && c->c_nestlevel <= 1) {
2206 VISIT(c, expr, s->v.Expr.value);
2207 ADDOP(c, PRINT_EXPR);
2208 }
2209 else if (s->v.Expr.value->kind != Str_kind &&
2210 s->v.Expr.value->kind != Num_kind) {
2211 VISIT(c, expr, s->v.Expr.value);
2212 ADDOP(c, POP_TOP);
2213 }
2214 break;
2215 case Pass_kind:
2216 break;
2217 case Break_kind:
2218 if (!compiler_in_loop(c))
2219 return compiler_error(c, "'break' outside loop");
2220 ADDOP(c, BREAK_LOOP);
2221 break;
2222 case Continue_kind:
2223 return compiler_continue(c);
2224 case With_kind:
2225 return compiler_with(c, s);
2226 }
2227 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002228}
2229
2230static int
2231unaryop(unaryop_ty op)
2232{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002233 switch (op) {
2234 case Invert:
2235 return UNARY_INVERT;
2236 case Not:
2237 return UNARY_NOT;
2238 case UAdd:
2239 return UNARY_POSITIVE;
2240 case USub:
2241 return UNARY_NEGATIVE;
2242 default:
2243 PyErr_Format(PyExc_SystemError,
2244 "unary op %d should not be possible", op);
2245 return 0;
2246 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002247}
2248
2249static int
2250binop(struct compiler *c, operator_ty op)
2251{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002252 switch (op) {
2253 case Add:
2254 return BINARY_ADD;
2255 case Sub:
2256 return BINARY_SUBTRACT;
2257 case Mult:
2258 return BINARY_MULTIPLY;
2259 case Div:
2260 if (c->c_flags && c->c_flags->cf_flags & CO_FUTURE_DIVISION)
2261 return BINARY_TRUE_DIVIDE;
2262 else
2263 return BINARY_DIVIDE;
2264 case Mod:
2265 return BINARY_MODULO;
2266 case Pow:
2267 return BINARY_POWER;
2268 case LShift:
2269 return BINARY_LSHIFT;
2270 case RShift:
2271 return BINARY_RSHIFT;
2272 case BitOr:
2273 return BINARY_OR;
2274 case BitXor:
2275 return BINARY_XOR;
2276 case BitAnd:
2277 return BINARY_AND;
2278 case FloorDiv:
2279 return BINARY_FLOOR_DIVIDE;
2280 default:
2281 PyErr_Format(PyExc_SystemError,
2282 "binary op %d should not be possible", op);
2283 return 0;
2284 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002285}
2286
2287static int
2288cmpop(cmpop_ty op)
2289{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002290 switch (op) {
2291 case Eq:
2292 return PyCmp_EQ;
2293 case NotEq:
2294 return PyCmp_NE;
2295 case Lt:
2296 return PyCmp_LT;
2297 case LtE:
2298 return PyCmp_LE;
2299 case Gt:
2300 return PyCmp_GT;
2301 case GtE:
2302 return PyCmp_GE;
2303 case Is:
2304 return PyCmp_IS;
2305 case IsNot:
2306 return PyCmp_IS_NOT;
2307 case In:
2308 return PyCmp_IN;
2309 case NotIn:
2310 return PyCmp_NOT_IN;
2311 default:
2312 return PyCmp_BAD;
2313 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002314}
2315
2316static int
2317inplace_binop(struct compiler *c, operator_ty op)
2318{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002319 switch (op) {
2320 case Add:
2321 return INPLACE_ADD;
2322 case Sub:
2323 return INPLACE_SUBTRACT;
2324 case Mult:
2325 return INPLACE_MULTIPLY;
2326 case Div:
2327 if (c->c_flags && c->c_flags->cf_flags & CO_FUTURE_DIVISION)
2328 return INPLACE_TRUE_DIVIDE;
2329 else
2330 return INPLACE_DIVIDE;
2331 case Mod:
2332 return INPLACE_MODULO;
2333 case Pow:
2334 return INPLACE_POWER;
2335 case LShift:
2336 return INPLACE_LSHIFT;
2337 case RShift:
2338 return INPLACE_RSHIFT;
2339 case BitOr:
2340 return INPLACE_OR;
2341 case BitXor:
2342 return INPLACE_XOR;
2343 case BitAnd:
2344 return INPLACE_AND;
2345 case FloorDiv:
2346 return INPLACE_FLOOR_DIVIDE;
2347 default:
2348 PyErr_Format(PyExc_SystemError,
2349 "inplace binary op %d should not be possible", op);
2350 return 0;
2351 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002352}
2353
2354static int
2355compiler_nameop(struct compiler *c, identifier name, expr_context_ty ctx)
2356{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002357 int op, scope, arg;
2358 enum { OP_FAST, OP_GLOBAL, OP_DEREF, OP_NAME } optype;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002359
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002360 PyObject *dict = c->u->u_names;
2361 PyObject *mangled;
2362 /* XXX AugStore isn't used anywhere! */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002363
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002364 mangled = _Py_Mangle(c->u->u_private, name);
2365 if (!mangled)
2366 return 0;
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002367
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002368 op = 0;
2369 optype = OP_NAME;
2370 scope = PyST_GetScope(c->u->u_ste, mangled);
2371 switch (scope) {
2372 case FREE:
2373 dict = c->u->u_freevars;
2374 optype = OP_DEREF;
2375 break;
2376 case CELL:
2377 dict = c->u->u_cellvars;
2378 optype = OP_DEREF;
2379 break;
2380 case LOCAL:
2381 if (c->u->u_ste->ste_type == FunctionBlock)
2382 optype = OP_FAST;
2383 break;
2384 case GLOBAL_IMPLICIT:
2385 if (c->u->u_ste->ste_type == FunctionBlock &&
2386 !c->u->u_ste->ste_unoptimized)
2387 optype = OP_GLOBAL;
2388 break;
2389 case GLOBAL_EXPLICIT:
2390 optype = OP_GLOBAL;
2391 break;
2392 default:
2393 /* scope can be 0 */
2394 break;
2395 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002396
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002397 /* XXX Leave assert here, but handle __doc__ and the like better */
2398 assert(scope || PyString_AS_STRING(name)[0] == '_');
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002399
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002400 switch (optype) {
2401 case OP_DEREF:
2402 switch (ctx) {
2403 case Load: op = LOAD_DEREF; break;
2404 case Store: op = STORE_DEREF; break;
2405 case AugLoad:
2406 case AugStore:
2407 break;
2408 case Del:
2409 PyErr_Format(PyExc_SyntaxError,
2410 "can not delete variable '%s' referenced "
2411 "in nested scope",
2412 PyString_AS_STRING(name));
2413 Py_DECREF(mangled);
2414 return 0;
2415 case Param:
2416 default:
2417 PyErr_SetString(PyExc_SystemError,
2418 "param invalid for deref variable");
2419 return 0;
2420 }
2421 break;
2422 case OP_FAST:
2423 switch (ctx) {
2424 case Load: op = LOAD_FAST; break;
2425 case Store: op = STORE_FAST; break;
2426 case Del: op = DELETE_FAST; break;
2427 case AugLoad:
2428 case AugStore:
2429 break;
2430 case Param:
2431 default:
2432 PyErr_SetString(PyExc_SystemError,
2433 "param invalid for local variable");
2434 return 0;
2435 }
2436 ADDOP_O(c, op, mangled, varnames);
2437 Py_DECREF(mangled);
2438 return 1;
2439 case OP_GLOBAL:
2440 switch (ctx) {
2441 case Load: op = LOAD_GLOBAL; break;
2442 case Store: op = STORE_GLOBAL; break;
2443 case Del: op = DELETE_GLOBAL; break;
2444 case AugLoad:
2445 case AugStore:
2446 break;
2447 case Param:
2448 default:
2449 PyErr_SetString(PyExc_SystemError,
2450 "param invalid for global variable");
2451 return 0;
2452 }
2453 break;
2454 case OP_NAME:
2455 switch (ctx) {
2456 case Load: op = LOAD_NAME; break;
2457 case Store: op = STORE_NAME; break;
2458 case Del: op = DELETE_NAME; break;
2459 case AugLoad:
2460 case AugStore:
2461 break;
2462 case Param:
2463 default:
2464 PyErr_SetString(PyExc_SystemError,
2465 "param invalid for name variable");
2466 return 0;
2467 }
2468 break;
2469 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002470
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002471 assert(op);
2472 arg = compiler_add_o(c, dict, mangled);
2473 Py_DECREF(mangled);
2474 if (arg < 0)
2475 return 0;
2476 return compiler_addop_i(c, op, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002477}
2478
2479static int
2480compiler_boolop(struct compiler *c, expr_ty e)
2481{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002482 basicblock *end;
2483 int jumpi, i, n;
2484 asdl_seq *s;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002485
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002486 assert(e->kind == BoolOp_kind);
2487 if (e->v.BoolOp.op == And)
2488 jumpi = JUMP_IF_FALSE_OR_POP;
2489 else
2490 jumpi = JUMP_IF_TRUE_OR_POP;
2491 end = compiler_new_block(c);
2492 if (end == NULL)
2493 return 0;
2494 s = e->v.BoolOp.values;
2495 n = asdl_seq_LEN(s) - 1;
2496 assert(n >= 0);
2497 for (i = 0; i < n; ++i) {
2498 VISIT(c, expr, (expr_ty)asdl_seq_GET(s, i));
2499 ADDOP_JABS(c, jumpi, end);
2500 }
2501 VISIT(c, expr, (expr_ty)asdl_seq_GET(s, n));
2502 compiler_use_next_block(c, end);
2503 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002504}
2505
2506static int
2507compiler_list(struct compiler *c, expr_ty e)
2508{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002509 int n = asdl_seq_LEN(e->v.List.elts);
2510 if (e->v.List.ctx == Store) {
2511 ADDOP_I(c, UNPACK_SEQUENCE, n);
2512 }
2513 VISIT_SEQ(c, expr, e->v.List.elts);
2514 if (e->v.List.ctx == Load) {
2515 ADDOP_I(c, BUILD_LIST, n);
2516 }
2517 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002518}
2519
2520static int
2521compiler_tuple(struct compiler *c, expr_ty e)
2522{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002523 int n = asdl_seq_LEN(e->v.Tuple.elts);
2524 if (e->v.Tuple.ctx == Store) {
2525 ADDOP_I(c, UNPACK_SEQUENCE, n);
2526 }
2527 VISIT_SEQ(c, expr, e->v.Tuple.elts);
2528 if (e->v.Tuple.ctx == Load) {
2529 ADDOP_I(c, BUILD_TUPLE, n);
2530 }
2531 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002532}
2533
2534static int
2535compiler_compare(struct compiler *c, expr_ty e)
2536{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002537 int i, n;
2538 basicblock *cleanup = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002539
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002540 /* XXX the logic can be cleaned up for 1 or multiple comparisons */
2541 VISIT(c, expr, e->v.Compare.left);
2542 n = asdl_seq_LEN(e->v.Compare.ops);
2543 assert(n > 0);
2544 if (n > 1) {
2545 cleanup = compiler_new_block(c);
2546 if (cleanup == NULL)
2547 return 0;
2548 VISIT(c, expr,
2549 (expr_ty)asdl_seq_GET(e->v.Compare.comparators, 0));
2550 }
2551 for (i = 1; i < n; i++) {
2552 ADDOP(c, DUP_TOP);
2553 ADDOP(c, ROT_THREE);
2554 ADDOP_I(c, COMPARE_OP,
2555 cmpop((cmpop_ty)(asdl_seq_GET(
2556 e->v.Compare.ops, i - 1))));
2557 ADDOP_JABS(c, JUMP_IF_FALSE_OR_POP, cleanup);
2558 NEXT_BLOCK(c);
2559 if (i < (n - 1))
2560 VISIT(c, expr,
2561 (expr_ty)asdl_seq_GET(e->v.Compare.comparators, i));
2562 }
2563 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, n - 1));
2564 ADDOP_I(c, COMPARE_OP,
2565 cmpop((cmpop_ty)(asdl_seq_GET(e->v.Compare.ops, n - 1))));
2566 if (n > 1) {
2567 basicblock *end = compiler_new_block(c);
2568 if (end == NULL)
2569 return 0;
2570 ADDOP_JREL(c, JUMP_FORWARD, end);
2571 compiler_use_next_block(c, cleanup);
2572 ADDOP(c, ROT_TWO);
2573 ADDOP(c, POP_TOP);
2574 compiler_use_next_block(c, end);
2575 }
2576 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002577}
2578
2579static int
2580compiler_call(struct compiler *c, expr_ty e)
2581{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002582 int n, code = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002583
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002584 VISIT(c, expr, e->v.Call.func);
2585 n = asdl_seq_LEN(e->v.Call.args);
2586 VISIT_SEQ(c, expr, e->v.Call.args);
2587 if (e->v.Call.keywords) {
2588 VISIT_SEQ(c, keyword, e->v.Call.keywords);
2589 n |= asdl_seq_LEN(e->v.Call.keywords) << 8;
2590 }
2591 if (e->v.Call.starargs) {
2592 VISIT(c, expr, e->v.Call.starargs);
2593 code |= 1;
2594 }
2595 if (e->v.Call.kwargs) {
2596 VISIT(c, expr, e->v.Call.kwargs);
2597 code |= 2;
2598 }
2599 switch (code) {
2600 case 0:
2601 ADDOP_I(c, CALL_FUNCTION, n);
2602 break;
2603 case 1:
2604 ADDOP_I(c, CALL_FUNCTION_VAR, n);
2605 break;
2606 case 2:
2607 ADDOP_I(c, CALL_FUNCTION_KW, n);
2608 break;
2609 case 3:
2610 ADDOP_I(c, CALL_FUNCTION_VAR_KW, n);
2611 break;
2612 }
2613 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002614}
2615
2616static int
Antoine Pitroud0c35152008-12-17 00:38:28 +00002617compiler_listcomp_generator(struct compiler *c, asdl_seq *generators,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002618 int gen_index, expr_ty elt)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002619{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002620 /* generate code for the iterator, then each of the ifs,
2621 and then write to the element */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002622
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002623 comprehension_ty l;
2624 basicblock *start, *anchor, *skip, *if_cleanup;
2625 int i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002626
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002627 start = compiler_new_block(c);
2628 skip = compiler_new_block(c);
2629 if_cleanup = compiler_new_block(c);
2630 anchor = compiler_new_block(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002631
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002632 if (start == NULL || skip == NULL || if_cleanup == NULL ||
2633 anchor == NULL)
2634 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002635
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002636 l = (comprehension_ty)asdl_seq_GET(generators, gen_index);
2637 VISIT(c, expr, l->iter);
2638 ADDOP(c, GET_ITER);
2639 compiler_use_next_block(c, start);
2640 ADDOP_JREL(c, FOR_ITER, anchor);
2641 NEXT_BLOCK(c);
2642 VISIT(c, expr, l->target);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002643
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002644 /* XXX this needs to be cleaned up...a lot! */
2645 n = asdl_seq_LEN(l->ifs);
2646 for (i = 0; i < n; i++) {
2647 expr_ty e = (expr_ty)asdl_seq_GET(l->ifs, i);
2648 VISIT(c, expr, e);
2649 ADDOP_JABS(c, POP_JUMP_IF_FALSE, if_cleanup);
2650 NEXT_BLOCK(c);
2651 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002652
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002653 if (++gen_index < asdl_seq_LEN(generators))
2654 if (!compiler_listcomp_generator(c, generators, gen_index, elt))
2655 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002656
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002657 /* only append after the last for generator */
2658 if (gen_index >= asdl_seq_LEN(generators)) {
2659 VISIT(c, expr, elt);
2660 ADDOP_I(c, LIST_APPEND, gen_index+1);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002661
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002662 compiler_use_next_block(c, skip);
2663 }
2664 compiler_use_next_block(c, if_cleanup);
2665 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
2666 compiler_use_next_block(c, anchor);
2667
2668 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002669}
2670
2671static int
2672compiler_listcomp(struct compiler *c, expr_ty e)
2673{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002674 assert(e->kind == ListComp_kind);
2675 ADDOP_I(c, BUILD_LIST, 0);
2676 return compiler_listcomp_generator(c, e->v.ListComp.generators, 0,
2677 e->v.ListComp.elt);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002678}
2679
Alexandre Vassalottib6465472010-01-11 22:36:12 +00002680/* Dict and set comprehensions and generator expressions work by creating a
2681 nested function to perform the actual iteration. This means that the
2682 iteration variables don't leak into the current scope.
2683 The defined function is called immediately following its definition, with the
2684 result of that call being the result of the expression.
2685 The LC/SC version returns the populated container, while the GE version is
2686 flagged in symtable.c as a generator, so it returns the generator object
2687 when the function is called.
2688 This code *knows* that the loop cannot contain break, continue, or return,
2689 so it cheats and skips the SETUP_LOOP/POP_BLOCK steps used in normal loops.
2690
2691 Possible cleanups:
2692 - iterate over the generator sequence instead of using recursion
2693*/
2694
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002695static int
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002696compiler_comprehension_generator(struct compiler *c,
2697 asdl_seq *generators, int gen_index,
2698 expr_ty elt, expr_ty val, int type)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002699{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002700 /* generate code for the iterator, then each of the ifs,
2701 and then write to the element */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002702
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002703 comprehension_ty gen;
2704 basicblock *start, *anchor, *skip, *if_cleanup;
2705 int i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002706
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002707 start = compiler_new_block(c);
2708 skip = compiler_new_block(c);
2709 if_cleanup = compiler_new_block(c);
2710 anchor = compiler_new_block(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002711
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002712 if (start == NULL || skip == NULL || if_cleanup == NULL ||
2713 anchor == NULL)
2714 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002715
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002716 gen = (comprehension_ty)asdl_seq_GET(generators, gen_index);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002717
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002718 if (gen_index == 0) {
2719 /* Receive outermost iter as an implicit argument */
2720 c->u->u_argcount = 1;
2721 ADDOP_I(c, LOAD_FAST, 0);
2722 }
2723 else {
2724 /* Sub-iter - calculate on the fly */
2725 VISIT(c, expr, gen->iter);
2726 ADDOP(c, GET_ITER);
2727 }
2728 compiler_use_next_block(c, start);
2729 ADDOP_JREL(c, FOR_ITER, anchor);
2730 NEXT_BLOCK(c);
2731 VISIT(c, expr, gen->target);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002732
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002733 /* XXX this needs to be cleaned up...a lot! */
2734 n = asdl_seq_LEN(gen->ifs);
2735 for (i = 0; i < n; i++) {
2736 expr_ty e = (expr_ty)asdl_seq_GET(gen->ifs, i);
2737 VISIT(c, expr, e);
2738 ADDOP_JABS(c, POP_JUMP_IF_FALSE, if_cleanup);
2739 NEXT_BLOCK(c);
2740 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002741
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002742 if (++gen_index < asdl_seq_LEN(generators))
2743 if (!compiler_comprehension_generator(c,
2744 generators, gen_index,
2745 elt, val, type))
2746 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002747
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002748 /* only append after the last for generator */
2749 if (gen_index >= asdl_seq_LEN(generators)) {
2750 /* comprehension specific code */
2751 switch (type) {
2752 case COMP_GENEXP:
2753 VISIT(c, expr, elt);
2754 ADDOP(c, YIELD_VALUE);
2755 ADDOP(c, POP_TOP);
2756 break;
2757 case COMP_SETCOMP:
2758 VISIT(c, expr, elt);
2759 ADDOP_I(c, SET_ADD, gen_index + 1);
2760 break;
2761 case COMP_DICTCOMP:
2762 /* With 'd[k] = v', v is evaluated before k, so we do
2763 the same. */
2764 VISIT(c, expr, val);
2765 VISIT(c, expr, elt);
2766 ADDOP_I(c, MAP_ADD, gen_index + 1);
2767 break;
2768 default:
2769 return 0;
2770 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002771
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002772 compiler_use_next_block(c, skip);
2773 }
2774 compiler_use_next_block(c, if_cleanup);
2775 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
2776 compiler_use_next_block(c, anchor);
2777
2778 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002779}
2780
2781static int
Alexandre Vassalottib6465472010-01-11 22:36:12 +00002782compiler_comprehension(struct compiler *c, expr_ty e, int type, identifier name,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002783 asdl_seq *generators, expr_ty elt, expr_ty val)
Alexandre Vassalottib6465472010-01-11 22:36:12 +00002784{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002785 PyCodeObject *co = NULL;
2786 expr_ty outermost_iter;
Alexandre Vassalottib6465472010-01-11 22:36:12 +00002787
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002788 outermost_iter = ((comprehension_ty)
2789 asdl_seq_GET(generators, 0))->iter;
Alexandre Vassalottib6465472010-01-11 22:36:12 +00002790
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002791 if (!compiler_enter_scope(c, name, (void *)e, e->lineno))
2792 goto error;
Alexandre Vassalottib6465472010-01-11 22:36:12 +00002793
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002794 if (type != COMP_GENEXP) {
2795 int op;
2796 switch (type) {
2797 case COMP_SETCOMP:
2798 op = BUILD_SET;
2799 break;
2800 case COMP_DICTCOMP:
2801 op = BUILD_MAP;
2802 break;
2803 default:
2804 PyErr_Format(PyExc_SystemError,
2805 "unknown comprehension type %d", type);
2806 goto error_in_scope;
2807 }
Alexandre Vassalottib6465472010-01-11 22:36:12 +00002808
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002809 ADDOP_I(c, op, 0);
2810 }
Alexandre Vassalottib6465472010-01-11 22:36:12 +00002811
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002812 if (!compiler_comprehension_generator(c, generators, 0, elt,
2813 val, type))
2814 goto error_in_scope;
Alexandre Vassalottib6465472010-01-11 22:36:12 +00002815
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002816 if (type != COMP_GENEXP) {
2817 ADDOP(c, RETURN_VALUE);
2818 }
2819
2820 co = assemble(c, 1);
2821 compiler_exit_scope(c);
2822 if (co == NULL)
2823 goto error;
2824
2825 if (!compiler_make_closure(c, co, 0))
2826 goto error;
2827 Py_DECREF(co);
2828
2829 VISIT(c, expr, outermost_iter);
2830 ADDOP(c, GET_ITER);
2831 ADDOP_I(c, CALL_FUNCTION, 1);
2832 return 1;
Alexandre Vassalottib6465472010-01-11 22:36:12 +00002833error_in_scope:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002834 compiler_exit_scope(c);
Alexandre Vassalottib6465472010-01-11 22:36:12 +00002835error:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002836 Py_XDECREF(co);
2837 return 0;
Alexandre Vassalottib6465472010-01-11 22:36:12 +00002838}
2839
2840static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002841compiler_genexp(struct compiler *c, expr_ty e)
2842{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002843 static identifier name;
2844 if (!name) {
2845 name = PyString_FromString("<genexpr>");
2846 if (!name)
2847 return 0;
2848 }
2849 assert(e->kind == GeneratorExp_kind);
2850 return compiler_comprehension(c, e, COMP_GENEXP, name,
2851 e->v.GeneratorExp.generators,
2852 e->v.GeneratorExp.elt, NULL);
Alexandre Vassalottib6465472010-01-11 22:36:12 +00002853}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002854
Alexandre Vassalottib6465472010-01-11 22:36:12 +00002855static int
2856compiler_setcomp(struct compiler *c, expr_ty e)
2857{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002858 static identifier name;
2859 if (!name) {
2860 name = PyString_FromString("<setcomp>");
2861 if (!name)
2862 return 0;
2863 }
2864 assert(e->kind == SetComp_kind);
2865 return compiler_comprehension(c, e, COMP_SETCOMP, name,
2866 e->v.SetComp.generators,
2867 e->v.SetComp.elt, NULL);
Alexandre Vassalottib6465472010-01-11 22:36:12 +00002868}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002869
Alexandre Vassalottib6465472010-01-11 22:36:12 +00002870static int
2871compiler_dictcomp(struct compiler *c, expr_ty e)
2872{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002873 static identifier name;
2874 if (!name) {
2875 name = PyString_FromString("<dictcomp>");
2876 if (!name)
2877 return 0;
2878 }
2879 assert(e->kind == DictComp_kind);
2880 return compiler_comprehension(c, e, COMP_DICTCOMP, name,
2881 e->v.DictComp.generators,
2882 e->v.DictComp.key, e->v.DictComp.value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002883}
2884
2885static int
2886compiler_visit_keyword(struct compiler *c, keyword_ty k)
2887{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002888 ADDOP_O(c, LOAD_CONST, k->arg, consts);
2889 VISIT(c, expr, k->value);
2890 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002891}
2892
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002893/* Test whether expression is constant. For constants, report
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002894 whether they are true or false.
2895
2896 Return values: 1 for true, 0 for false, -1 for non-constant.
2897 */
2898
2899static int
2900expr_constant(expr_ty e)
2901{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002902 switch (e->kind) {
2903 case Num_kind:
2904 return PyObject_IsTrue(e->v.Num.n);
2905 case Str_kind:
2906 return PyObject_IsTrue(e->v.Str.s);
2907 case Name_kind:
2908 /* __debug__ is not assignable, so we can optimize
2909 * it away in if and while statements */
2910 if (strcmp(PyString_AS_STRING(e->v.Name.id),
2911 "__debug__") == 0)
2912 return ! Py_OptimizeFlag;
2913 /* fall through */
2914 default:
2915 return -1;
2916 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002917}
2918
Guido van Rossumc2e20742006-02-27 22:32:47 +00002919/*
2920 Implements the with statement from PEP 343.
2921
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002922 The semantics outlined in that PEP are as follows:
Guido van Rossumc2e20742006-02-27 22:32:47 +00002923
2924 with EXPR as VAR:
2925 BLOCK
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002926
Guido van Rossumc2e20742006-02-27 22:32:47 +00002927 It is implemented roughly as:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002928
Guido van Rossumda5b7012006-05-02 19:47:52 +00002929 context = EXPR
Guido van Rossumc2e20742006-02-27 22:32:47 +00002930 exit = context.__exit__ # not calling it
2931 value = context.__enter__()
2932 try:
2933 VAR = value # if VAR present in the syntax
2934 BLOCK
2935 finally:
2936 if an exception was raised:
Serhiy Storchakaf0aa88f2015-06-11 00:06:27 +03002937 exc = copy of (exception, instance, traceback)
Guido van Rossumc2e20742006-02-27 22:32:47 +00002938 else:
Serhiy Storchakaf0aa88f2015-06-11 00:06:27 +03002939 exc = (None, None, None)
Guido van Rossumc2e20742006-02-27 22:32:47 +00002940 exit(*exc)
2941 */
2942static int
2943compiler_with(struct compiler *c, stmt_ty s)
2944{
Guido van Rossumc2e20742006-02-27 22:32:47 +00002945 basicblock *block, *finally;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002946
2947 assert(s->kind == With_kind);
2948
Guido van Rossumc2e20742006-02-27 22:32:47 +00002949 block = compiler_new_block(c);
2950 finally = compiler_new_block(c);
2951 if (!block || !finally)
Antoine Pitroua4d36a92010-06-22 21:42:05 +00002952 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002953
Guido van Rossumda5b7012006-05-02 19:47:52 +00002954 /* Evaluate EXPR */
Guido van Rossumc2e20742006-02-27 22:32:47 +00002955 VISIT(c, expr, s->v.With.context_expr);
Benjamin Peterson1880d8b2009-05-25 13:13:44 +00002956 ADDOP_JREL(c, SETUP_WITH, finally);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002957
Benjamin Peterson1880d8b2009-05-25 13:13:44 +00002958 /* SETUP_WITH pushes a finally block. */
Guido van Rossumc2e20742006-02-27 22:32:47 +00002959 compiler_use_next_block(c, block);
Benjamin Peterson565d7852010-02-05 02:12:14 +00002960 /* Note that the block is actually called SETUP_WITH in ceval.c, but
2961 functions the same as SETUP_FINALLY except that exceptions are
2962 normalized. */
Guido van Rossumc2e20742006-02-27 22:32:47 +00002963 if (!compiler_push_fblock(c, FINALLY_TRY, block)) {
Antoine Pitroua4d36a92010-06-22 21:42:05 +00002964 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002965 }
2966
2967 if (s->v.With.optional_vars) {
Antoine Pitroua4d36a92010-06-22 21:42:05 +00002968 VISIT(c, expr, s->v.With.optional_vars);
Benjamin Peterson1880d8b2009-05-25 13:13:44 +00002969 }
2970 else {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00002971 /* Discard result from context.__enter__() */
Antoine Pitroua4d36a92010-06-22 21:42:05 +00002972 ADDOP(c, POP_TOP);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002973 }
2974
2975 /* BLOCK code */
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002976 VISIT_SEQ(c, stmt, s->v.With.body);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002977
2978 /* End of try block; start the finally block */
2979 ADDOP(c, POP_BLOCK);
2980 compiler_pop_fblock(c, FINALLY_TRY, block);
2981
2982 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2983 compiler_use_next_block(c, finally);
2984 if (!compiler_push_fblock(c, FINALLY_END, finally))
Antoine Pitroua4d36a92010-06-22 21:42:05 +00002985 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002986
Nick Coghlan7af53be2008-03-07 14:13:28 +00002987 /* Finally block starts; context.__exit__ is on the stack under
2988 the exception or return information. Just issue our magic
2989 opcode. */
Guido van Rossumc2e20742006-02-27 22:32:47 +00002990 ADDOP(c, WITH_CLEANUP);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002991
2992 /* Finally block ends. */
2993 ADDOP(c, END_FINALLY);
2994 compiler_pop_fblock(c, FINALLY_END, finally);
2995 return 1;
2996}
2997
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002998static int
2999compiler_visit_expr(struct compiler *c, expr_ty e)
3000{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003001 int i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003002
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003003 /* If expr e has a different line number than the last expr/stmt,
3004 set a new line number for the next instruction.
3005 */
3006 if (e->lineno > c->u->u_lineno) {
3007 c->u->u_lineno = e->lineno;
3008 c->u->u_lineno_set = false;
3009 }
3010 switch (e->kind) {
3011 case BoolOp_kind:
3012 return compiler_boolop(c, e);
3013 case BinOp_kind:
3014 VISIT(c, expr, e->v.BinOp.left);
3015 VISIT(c, expr, e->v.BinOp.right);
3016 ADDOP(c, binop(c, e->v.BinOp.op));
3017 break;
3018 case UnaryOp_kind:
3019 VISIT(c, expr, e->v.UnaryOp.operand);
3020 ADDOP(c, unaryop(e->v.UnaryOp.op));
3021 break;
3022 case Lambda_kind:
3023 return compiler_lambda(c, e);
3024 case IfExp_kind:
3025 return compiler_ifexp(c, e);
3026 case Dict_kind:
3027 n = asdl_seq_LEN(e->v.Dict.values);
3028 ADDOP_I(c, BUILD_MAP, (n>0xFFFF ? 0xFFFF : n));
3029 for (i = 0; i < n; i++) {
3030 VISIT(c, expr,
3031 (expr_ty)asdl_seq_GET(e->v.Dict.values, i));
3032 VISIT(c, expr,
3033 (expr_ty)asdl_seq_GET(e->v.Dict.keys, i));
3034 ADDOP(c, STORE_MAP);
3035 }
3036 break;
3037 case Set_kind:
3038 n = asdl_seq_LEN(e->v.Set.elts);
3039 VISIT_SEQ(c, expr, e->v.Set.elts);
3040 ADDOP_I(c, BUILD_SET, n);
3041 break;
3042 case ListComp_kind:
3043 return compiler_listcomp(c, e);
3044 case SetComp_kind:
3045 return compiler_setcomp(c, e);
3046 case DictComp_kind:
3047 return compiler_dictcomp(c, e);
3048 case GeneratorExp_kind:
3049 return compiler_genexp(c, e);
3050 case Yield_kind:
3051 if (c->u->u_ste->ste_type != FunctionBlock)
3052 return compiler_error(c, "'yield' outside function");
3053 if (e->v.Yield.value) {
3054 VISIT(c, expr, e->v.Yield.value);
3055 }
3056 else {
3057 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3058 }
3059 ADDOP(c, YIELD_VALUE);
3060 break;
3061 case Compare_kind:
3062 return compiler_compare(c, e);
3063 case Call_kind:
3064 return compiler_call(c, e);
3065 case Repr_kind:
3066 VISIT(c, expr, e->v.Repr.value);
3067 ADDOP(c, UNARY_CONVERT);
3068 break;
3069 case Num_kind:
3070 ADDOP_O(c, LOAD_CONST, e->v.Num.n, consts);
3071 break;
3072 case Str_kind:
3073 ADDOP_O(c, LOAD_CONST, e->v.Str.s, consts);
3074 break;
3075 /* The following exprs can be assignment targets. */
3076 case Attribute_kind:
3077 if (e->v.Attribute.ctx != AugStore)
3078 VISIT(c, expr, e->v.Attribute.value);
3079 switch (e->v.Attribute.ctx) {
3080 case AugLoad:
3081 ADDOP(c, DUP_TOP);
3082 /* Fall through to load */
3083 case Load:
3084 ADDOP_NAME(c, LOAD_ATTR, e->v.Attribute.attr, names);
3085 break;
3086 case AugStore:
3087 ADDOP(c, ROT_TWO);
3088 /* Fall through to save */
3089 case Store:
3090 ADDOP_NAME(c, STORE_ATTR, e->v.Attribute.attr, names);
3091 break;
3092 case Del:
3093 ADDOP_NAME(c, DELETE_ATTR, e->v.Attribute.attr, names);
3094 break;
3095 case Param:
3096 default:
3097 PyErr_SetString(PyExc_SystemError,
3098 "param invalid in attribute expression");
3099 return 0;
3100 }
3101 break;
3102 case Subscript_kind:
3103 switch (e->v.Subscript.ctx) {
3104 case AugLoad:
3105 VISIT(c, expr, e->v.Subscript.value);
3106 VISIT_SLICE(c, e->v.Subscript.slice, AugLoad);
3107 break;
3108 case Load:
3109 VISIT(c, expr, e->v.Subscript.value);
3110 VISIT_SLICE(c, e->v.Subscript.slice, Load);
3111 break;
3112 case AugStore:
3113 VISIT_SLICE(c, e->v.Subscript.slice, AugStore);
3114 break;
3115 case Store:
3116 VISIT(c, expr, e->v.Subscript.value);
3117 VISIT_SLICE(c, e->v.Subscript.slice, Store);
3118 break;
3119 case Del:
3120 VISIT(c, expr, e->v.Subscript.value);
3121 VISIT_SLICE(c, e->v.Subscript.slice, Del);
3122 break;
3123 case Param:
3124 default:
3125 PyErr_SetString(PyExc_SystemError,
3126 "param invalid in subscript expression");
3127 return 0;
3128 }
3129 break;
3130 case Name_kind:
3131 return compiler_nameop(c, e->v.Name.id, e->v.Name.ctx);
3132 /* child nodes of List and Tuple will have expr_context set */
3133 case List_kind:
3134 return compiler_list(c, e);
3135 case Tuple_kind:
3136 return compiler_tuple(c, e);
3137 }
3138 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003139}
3140
3141static int
3142compiler_augassign(struct compiler *c, stmt_ty s)
3143{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003144 expr_ty e = s->v.AugAssign.target;
3145 expr_ty auge;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003146
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003147 assert(s->kind == AugAssign_kind);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003148
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003149 switch (e->kind) {
3150 case Attribute_kind:
3151 auge = Attribute(e->v.Attribute.value, e->v.Attribute.attr,
3152 AugLoad, e->lineno, e->col_offset, c->c_arena);
3153 if (auge == NULL)
3154 return 0;
3155 VISIT(c, expr, auge);
3156 VISIT(c, expr, s->v.AugAssign.value);
3157 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
3158 auge->v.Attribute.ctx = AugStore;
3159 VISIT(c, expr, auge);
3160 break;
3161 case Subscript_kind:
3162 auge = Subscript(e->v.Subscript.value, e->v.Subscript.slice,
3163 AugLoad, e->lineno, e->col_offset, c->c_arena);
3164 if (auge == NULL)
3165 return 0;
3166 VISIT(c, expr, auge);
3167 VISIT(c, expr, s->v.AugAssign.value);
3168 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
3169 auge->v.Subscript.ctx = AugStore;
3170 VISIT(c, expr, auge);
3171 break;
3172 case Name_kind:
3173 if (!compiler_nameop(c, e->v.Name.id, Load))
3174 return 0;
3175 VISIT(c, expr, s->v.AugAssign.value);
3176 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
3177 return compiler_nameop(c, e->v.Name.id, Store);
3178 default:
3179 PyErr_Format(PyExc_SystemError,
3180 "invalid node type (%d) for augmented assignment",
3181 e->kind);
3182 return 0;
3183 }
3184 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003185}
3186
3187static int
3188compiler_push_fblock(struct compiler *c, enum fblocktype t, basicblock *b)
3189{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003190 struct fblockinfo *f;
3191 if (c->u->u_nfblocks >= CO_MAXBLOCKS) {
3192 PyErr_SetString(PyExc_SystemError,
3193 "too many statically nested blocks");
3194 return 0;
3195 }
3196 f = &c->u->u_fblock[c->u->u_nfblocks++];
3197 f->fb_type = t;
3198 f->fb_block = b;
3199 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003200}
3201
3202static void
3203compiler_pop_fblock(struct compiler *c, enum fblocktype t, basicblock *b)
3204{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003205 struct compiler_unit *u = c->u;
3206 assert(u->u_nfblocks > 0);
3207 u->u_nfblocks--;
3208 assert(u->u_fblock[u->u_nfblocks].fb_type == t);
3209 assert(u->u_fblock[u->u_nfblocks].fb_block == b);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003210}
3211
Jeremy Hylton82271f12006-10-04 02:24:52 +00003212static int
3213compiler_in_loop(struct compiler *c) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003214 int i;
3215 struct compiler_unit *u = c->u;
3216 for (i = 0; i < u->u_nfblocks; ++i) {
3217 if (u->u_fblock[i].fb_type == LOOP)
3218 return 1;
3219 }
3220 return 0;
Jeremy Hylton82271f12006-10-04 02:24:52 +00003221}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003222/* Raises a SyntaxError and returns 0.
3223 If something goes wrong, a different exception may be raised.
3224*/
3225
3226static int
3227compiler_error(struct compiler *c, const char *errstr)
3228{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003229 PyObject *loc;
3230 PyObject *u = NULL, *v = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003231
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003232 loc = PyErr_ProgramText(c->c_filename, c->u->u_lineno);
3233 if (!loc) {
3234 Py_INCREF(Py_None);
3235 loc = Py_None;
3236 }
3237 u = Py_BuildValue("(ziOO)", c->c_filename, c->u->u_lineno,
3238 Py_None, loc);
3239 if (!u)
3240 goto exit;
3241 v = Py_BuildValue("(zO)", errstr, u);
3242 if (!v)
3243 goto exit;
3244 PyErr_SetObject(PyExc_SyntaxError, v);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003245 exit:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003246 Py_DECREF(loc);
3247 Py_XDECREF(u);
3248 Py_XDECREF(v);
3249 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003250}
3251
3252static int
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003253compiler_handle_subscr(struct compiler *c, const char *kind,
3254 expr_context_ty ctx)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003255{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003256 int op = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003257
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003258 /* XXX this code is duplicated */
3259 switch (ctx) {
3260 case AugLoad: /* fall through to Load */
3261 case Load: op = BINARY_SUBSCR; break;
3262 case AugStore:/* fall through to Store */
3263 case Store: op = STORE_SUBSCR; break;
3264 case Del: op = DELETE_SUBSCR; break;
3265 case Param:
3266 PyErr_Format(PyExc_SystemError,
3267 "invalid %s kind %d in subscript\n",
3268 kind, ctx);
3269 return 0;
3270 }
3271 if (ctx == AugLoad) {
3272 ADDOP_I(c, DUP_TOPX, 2);
3273 }
3274 else if (ctx == AugStore) {
3275 ADDOP(c, ROT_THREE);
3276 }
3277 ADDOP(c, op);
3278 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003279}
3280
3281static int
3282compiler_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)
3283{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003284 int n = 2;
3285 assert(s->kind == Slice_kind);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003286
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003287 /* only handles the cases where BUILD_SLICE is emitted */
3288 if (s->v.Slice.lower) {
3289 VISIT(c, expr, s->v.Slice.lower);
3290 }
3291 else {
3292 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3293 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003294
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003295 if (s->v.Slice.upper) {
3296 VISIT(c, expr, s->v.Slice.upper);
3297 }
3298 else {
3299 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3300 }
3301
3302 if (s->v.Slice.step) {
3303 n++;
3304 VISIT(c, expr, s->v.Slice.step);
3305 }
3306 ADDOP_I(c, BUILD_SLICE, n);
3307 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003308}
3309
3310static int
3311compiler_simple_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)
3312{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003313 int op = 0, slice_offset = 0, stack_count = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003314
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003315 assert(s->v.Slice.step == NULL);
3316 if (s->v.Slice.lower) {
3317 slice_offset++;
3318 stack_count++;
3319 if (ctx != AugStore)
3320 VISIT(c, expr, s->v.Slice.lower);
3321 }
3322 if (s->v.Slice.upper) {
3323 slice_offset += 2;
3324 stack_count++;
3325 if (ctx != AugStore)
3326 VISIT(c, expr, s->v.Slice.upper);
3327 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003328
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003329 if (ctx == AugLoad) {
3330 switch (stack_count) {
3331 case 0: ADDOP(c, DUP_TOP); break;
3332 case 1: ADDOP_I(c, DUP_TOPX, 2); break;
3333 case 2: ADDOP_I(c, DUP_TOPX, 3); break;
3334 }
3335 }
3336 else if (ctx == AugStore) {
3337 switch (stack_count) {
3338 case 0: ADDOP(c, ROT_TWO); break;
3339 case 1: ADDOP(c, ROT_THREE); break;
3340 case 2: ADDOP(c, ROT_FOUR); break;
3341 }
3342 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003343
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003344 switch (ctx) {
3345 case AugLoad: /* fall through to Load */
3346 case Load: op = SLICE; break;
3347 case AugStore:/* fall through to Store */
3348 case Store: op = STORE_SLICE; break;
3349 case Del: op = DELETE_SLICE; break;
3350 case Param:
3351 default:
3352 PyErr_SetString(PyExc_SystemError,
3353 "param invalid in simple slice");
3354 return 0;
3355 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003356
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003357 ADDOP(c, op + slice_offset);
3358 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003359}
3360
3361static int
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003362compiler_visit_nested_slice(struct compiler *c, slice_ty s,
3363 expr_context_ty ctx)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003364{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003365 switch (s->kind) {
3366 case Ellipsis_kind:
3367 ADDOP_O(c, LOAD_CONST, Py_Ellipsis, consts);
3368 break;
3369 case Slice_kind:
3370 return compiler_slice(c, s, ctx);
3371 case Index_kind:
3372 VISIT(c, expr, s->v.Index.value);
3373 break;
3374 case ExtSlice_kind:
3375 default:
3376 PyErr_SetString(PyExc_SystemError,
3377 "extended slice invalid in nested slice");
3378 return 0;
3379 }
3380 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003381}
3382
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003383static int
3384compiler_visit_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)
3385{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003386 char * kindname = NULL;
3387 switch (s->kind) {
3388 case Index_kind:
3389 kindname = "index";
3390 if (ctx != AugStore) {
3391 VISIT(c, expr, s->v.Index.value);
3392 }
3393 break;
3394 case Ellipsis_kind:
3395 kindname = "ellipsis";
3396 if (ctx != AugStore) {
3397 ADDOP_O(c, LOAD_CONST, Py_Ellipsis, consts);
3398 }
3399 break;
3400 case Slice_kind:
3401 kindname = "slice";
3402 if (!s->v.Slice.step)
3403 return compiler_simple_slice(c, s, ctx);
3404 if (ctx != AugStore) {
3405 if (!compiler_slice(c, s, ctx))
3406 return 0;
3407 }
3408 break;
3409 case ExtSlice_kind:
3410 kindname = "extended slice";
3411 if (ctx != AugStore) {
3412 int i, n = asdl_seq_LEN(s->v.ExtSlice.dims);
3413 for (i = 0; i < n; i++) {
3414 slice_ty sub = (slice_ty)asdl_seq_GET(
3415 s->v.ExtSlice.dims, i);
3416 if (!compiler_visit_nested_slice(c, sub, ctx))
3417 return 0;
3418 }
3419 ADDOP_I(c, BUILD_TUPLE, n);
3420 }
3421 break;
3422 default:
3423 PyErr_Format(PyExc_SystemError,
3424 "invalid subscript kind %d", s->kind);
3425 return 0;
3426 }
3427 return compiler_handle_subscr(c, kindname, ctx);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003428}
3429
Neal Norwitzf733a012006-10-29 18:30:10 +00003430
3431/* End of the compiler section, beginning of the assembler section */
3432
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003433/* do depth-first search of basic block graph, starting with block.
3434 post records the block indices in post-order.
3435
3436 XXX must handle implicit jumps from one block to next
3437*/
3438
Neal Norwitzf733a012006-10-29 18:30:10 +00003439struct assembler {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003440 PyObject *a_bytecode; /* string containing bytecode */
3441 int a_offset; /* offset into bytecode */
3442 int a_nblocks; /* number of reachable blocks */
3443 basicblock **a_postorder; /* list of blocks in dfs postorder */
3444 PyObject *a_lnotab; /* string containing lnotab */
3445 int a_lnotab_off; /* offset into lnotab */
3446 int a_lineno; /* last lineno of emitted instruction */
3447 int a_lineno_off; /* bytecode offset of last lineno */
Neal Norwitzf733a012006-10-29 18:30:10 +00003448};
3449
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003450static void
3451dfs(struct compiler *c, basicblock *b, struct assembler *a)
3452{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003453 int i;
3454 struct instr *instr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003455
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003456 if (b->b_seen)
3457 return;
3458 b->b_seen = 1;
3459 if (b->b_next != NULL)
3460 dfs(c, b->b_next, a);
3461 for (i = 0; i < b->b_iused; i++) {
3462 instr = &b->b_instr[i];
3463 if (instr->i_jrel || instr->i_jabs)
3464 dfs(c, instr->i_target, a);
3465 }
3466 a->a_postorder[a->a_nblocks++] = b;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003467}
3468
Neal Norwitz2744c6c2005-11-13 01:08:38 +00003469static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003470stackdepth_walk(struct compiler *c, basicblock *b, int depth, int maxdepth)
3471{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003472 int i, target_depth;
3473 struct instr *instr;
3474 if (b->b_seen || b->b_startdepth >= depth)
3475 return maxdepth;
3476 b->b_seen = 1;
3477 b->b_startdepth = depth;
3478 for (i = 0; i < b->b_iused; i++) {
3479 instr = &b->b_instr[i];
3480 depth += opcode_stack_effect(instr->i_opcode, instr->i_oparg);
3481 if (depth > maxdepth)
3482 maxdepth = depth;
3483 assert(depth >= 0); /* invalid code or bug in stackdepth() */
3484 if (instr->i_jrel || instr->i_jabs) {
3485 target_depth = depth;
3486 if (instr->i_opcode == FOR_ITER) {
3487 target_depth = depth-2;
Antoine Pitrouab4a6912014-05-23 11:46:03 +02003488 }
3489 else if (instr->i_opcode == SETUP_FINALLY ||
3490 instr->i_opcode == SETUP_EXCEPT) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003491 target_depth = depth+3;
3492 if (target_depth > maxdepth)
3493 maxdepth = target_depth;
3494 }
Antoine Pitrouab4a6912014-05-23 11:46:03 +02003495 else if (instr->i_opcode == JUMP_IF_TRUE_OR_POP ||
3496 instr->i_opcode == JUMP_IF_FALSE_OR_POP)
3497 depth = depth - 1;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003498 maxdepth = stackdepth_walk(c, instr->i_target,
3499 target_depth, maxdepth);
3500 if (instr->i_opcode == JUMP_ABSOLUTE ||
3501 instr->i_opcode == JUMP_FORWARD) {
3502 goto out; /* remaining code is dead */
3503 }
3504 }
3505 }
3506 if (b->b_next)
3507 maxdepth = stackdepth_walk(c, b->b_next, depth, maxdepth);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003508out:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003509 b->b_seen = 0;
3510 return maxdepth;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003511}
3512
3513/* Find the flow path that needs the largest stack. We assume that
3514 * cycles in the flow graph have no net effect on the stack depth.
3515 */
3516static int
3517stackdepth(struct compiler *c)
3518{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003519 basicblock *b, *entryblock;
3520 entryblock = NULL;
3521 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
3522 b->b_seen = 0;
3523 b->b_startdepth = INT_MIN;
3524 entryblock = b;
3525 }
3526 if (!entryblock)
3527 return 0;
3528 return stackdepth_walk(c, entryblock, 0, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003529}
3530
3531static int
3532assemble_init(struct assembler *a, int nblocks, int firstlineno)
3533{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003534 memset(a, 0, sizeof(struct assembler));
3535 a->a_lineno = firstlineno;
3536 a->a_bytecode = PyString_FromStringAndSize(NULL, DEFAULT_CODE_SIZE);
3537 if (!a->a_bytecode)
3538 return 0;
3539 a->a_lnotab = PyString_FromStringAndSize(NULL, DEFAULT_LNOTAB_SIZE);
3540 if (!a->a_lnotab)
3541 return 0;
3542 if (nblocks > PY_SIZE_MAX / sizeof(basicblock *)) {
3543 PyErr_NoMemory();
3544 return 0;
3545 }
3546 a->a_postorder = (basicblock **)PyObject_Malloc(
3547 sizeof(basicblock *) * nblocks);
3548 if (!a->a_postorder) {
3549 PyErr_NoMemory();
3550 return 0;
3551 }
3552 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003553}
3554
3555static void
3556assemble_free(struct assembler *a)
3557{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003558 Py_XDECREF(a->a_bytecode);
3559 Py_XDECREF(a->a_lnotab);
3560 if (a->a_postorder)
3561 PyObject_Free(a->a_postorder);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003562}
3563
3564/* Return the size of a basic block in bytes. */
3565
3566static int
3567instrsize(struct instr *instr)
3568{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003569 if (!instr->i_hasarg)
3570 return 1; /* 1 byte for the opcode*/
3571 if (instr->i_oparg > 0xffff)
3572 return 6; /* 1 (opcode) + 1 (EXTENDED_ARG opcode) + 2 (oparg) + 2(oparg extended) */
3573 return 3; /* 1 (opcode) + 2 (oparg) */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003574}
3575
3576static int
3577blocksize(basicblock *b)
3578{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003579 int i;
3580 int size = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003581
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003582 for (i = 0; i < b->b_iused; i++)
3583 size += instrsize(&b->b_instr[i]);
3584 return size;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003585}
3586
Jeffrey Yasskin655d8352009-05-23 23:23:01 +00003587/* Appends a pair to the end of the line number table, a_lnotab, representing
3588 the instruction's bytecode offset and line number. See
3589 Objects/lnotab_notes.txt for the description of the line number table. */
Tim Peters2a7f3842001-06-09 09:26:21 +00003590
Guido van Rossumf68d8e52001-04-14 17:55:09 +00003591static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003592assemble_lnotab(struct assembler *a, struct instr *i)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003593{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003594 int d_bytecode, d_lineno;
3595 int len;
3596 unsigned char *lnotab;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003597
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003598 d_bytecode = a->a_offset - a->a_lineno_off;
3599 d_lineno = i->i_lineno - a->a_lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003600
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003601 assert(d_bytecode >= 0);
3602 assert(d_lineno >= 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003603
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003604 if(d_bytecode == 0 && d_lineno == 0)
3605 return 1;
Amaury Forgeot d'Arc99af7db2008-02-05 00:26:21 +00003606
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003607 if (d_bytecode > 255) {
3608 int j, nbytes, ncodes = d_bytecode / 255;
3609 nbytes = a->a_lnotab_off + 2 * ncodes;
3610 len = PyString_GET_SIZE(a->a_lnotab);
3611 if (nbytes >= len) {
3612 if ((len <= INT_MAX / 2) && (len * 2 < nbytes))
3613 len = nbytes;
3614 else if (len <= INT_MAX / 2)
3615 len *= 2;
3616 else {
3617 PyErr_NoMemory();
3618 return 0;
3619 }
3620 if (_PyString_Resize(&a->a_lnotab, len) < 0)
3621 return 0;
3622 }
3623 lnotab = (unsigned char *)
3624 PyString_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
3625 for (j = 0; j < ncodes; j++) {
3626 *lnotab++ = 255;
3627 *lnotab++ = 0;
3628 }
3629 d_bytecode -= ncodes * 255;
3630 a->a_lnotab_off += ncodes * 2;
3631 }
3632 assert(d_bytecode <= 255);
3633 if (d_lineno > 255) {
3634 int j, nbytes, ncodes = d_lineno / 255;
3635 nbytes = a->a_lnotab_off + 2 * ncodes;
3636 len = PyString_GET_SIZE(a->a_lnotab);
3637 if (nbytes >= len) {
3638 if ((len <= INT_MAX / 2) && len * 2 < nbytes)
3639 len = nbytes;
3640 else if (len <= INT_MAX / 2)
3641 len *= 2;
3642 else {
3643 PyErr_NoMemory();
3644 return 0;
3645 }
3646 if (_PyString_Resize(&a->a_lnotab, len) < 0)
3647 return 0;
3648 }
3649 lnotab = (unsigned char *)
3650 PyString_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
3651 *lnotab++ = d_bytecode;
3652 *lnotab++ = 255;
3653 d_bytecode = 0;
3654 for (j = 1; j < ncodes; j++) {
3655 *lnotab++ = 0;
3656 *lnotab++ = 255;
3657 }
3658 d_lineno -= ncodes * 255;
3659 a->a_lnotab_off += ncodes * 2;
3660 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003661
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003662 len = PyString_GET_SIZE(a->a_lnotab);
3663 if (a->a_lnotab_off + 2 >= len) {
3664 if (_PyString_Resize(&a->a_lnotab, len * 2) < 0)
3665 return 0;
3666 }
3667 lnotab = (unsigned char *)
3668 PyString_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
Tim Peters51e26512001-09-07 08:45:55 +00003669
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003670 a->a_lnotab_off += 2;
3671 if (d_bytecode) {
3672 *lnotab++ = d_bytecode;
3673 *lnotab++ = d_lineno;
3674 }
3675 else { /* First line of a block; def stmt, etc. */
3676 *lnotab++ = 0;
3677 *lnotab++ = d_lineno;
3678 }
3679 a->a_lineno = i->i_lineno;
3680 a->a_lineno_off = a->a_offset;
3681 return 1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003682}
3683
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003684/* assemble_emit()
3685 Extend the bytecode with a new instruction.
3686 Update lnotab if necessary.
Jeremy Hylton376e63d2003-08-28 14:42:14 +00003687*/
3688
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003689static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003690assemble_emit(struct assembler *a, struct instr *i)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003691{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003692 int size, arg = 0, ext = 0;
3693 Py_ssize_t len = PyString_GET_SIZE(a->a_bytecode);
3694 char *code;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003695
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003696 size = instrsize(i);
3697 if (i->i_hasarg) {
3698 arg = i->i_oparg;
3699 ext = arg >> 16;
3700 }
3701 if (i->i_lineno && !assemble_lnotab(a, i))
3702 return 0;
3703 if (a->a_offset + size >= len) {
3704 if (len > PY_SSIZE_T_MAX / 2)
3705 return 0;
3706 if (_PyString_Resize(&a->a_bytecode, len * 2) < 0)
3707 return 0;
3708 }
3709 code = PyString_AS_STRING(a->a_bytecode) + a->a_offset;
3710 a->a_offset += size;
3711 if (size == 6) {
3712 assert(i->i_hasarg);
3713 *code++ = (char)EXTENDED_ARG;
3714 *code++ = ext & 0xff;
3715 *code++ = ext >> 8;
3716 arg &= 0xffff;
3717 }
3718 *code++ = i->i_opcode;
3719 if (i->i_hasarg) {
3720 assert(size == 3 || size == 6);
3721 *code++ = arg & 0xff;
3722 *code++ = arg >> 8;
3723 }
3724 return 1;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00003725}
3726
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003727static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003728assemble_jump_offsets(struct assembler *a, struct compiler *c)
Anthony Baxterc2a5a632004-08-02 06:10:11 +00003729{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003730 basicblock *b;
3731 int bsize, totsize, extended_arg_count = 0, last_extended_arg_count;
3732 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003733
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003734 /* Compute the size of each block and fixup jump args.
3735 Replace block pointer with position in bytecode. */
3736 do {
3737 totsize = 0;
3738 for (i = a->a_nblocks - 1; i >= 0; i--) {
3739 b = a->a_postorder[i];
3740 bsize = blocksize(b);
3741 b->b_offset = totsize;
3742 totsize += bsize;
3743 }
3744 last_extended_arg_count = extended_arg_count;
3745 extended_arg_count = 0;
3746 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
3747 bsize = b->b_offset;
3748 for (i = 0; i < b->b_iused; i++) {
3749 struct instr *instr = &b->b_instr[i];
3750 /* Relative jumps are computed relative to
3751 the instruction pointer after fetching
3752 the jump instruction.
3753 */
3754 bsize += instrsize(instr);
3755 if (instr->i_jabs)
3756 instr->i_oparg = instr->i_target->b_offset;
3757 else if (instr->i_jrel) {
3758 int delta = instr->i_target->b_offset - bsize;
3759 instr->i_oparg = delta;
3760 }
3761 else
3762 continue;
3763 if (instr->i_oparg > 0xffff)
3764 extended_arg_count++;
3765 }
3766 }
Neal Norwitzf1d50682005-10-23 23:00:41 +00003767
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003768 /* XXX: This is an awful hack that could hurt performance, but
3769 on the bright side it should work until we come up
3770 with a better solution.
Neal Norwitzf1d50682005-10-23 23:00:41 +00003771
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003772 The issue is that in the first loop blocksize() is called
3773 which calls instrsize() which requires i_oparg be set
3774 appropriately. There is a bootstrap problem because
3775 i_oparg is calculated in the second loop above.
Neal Norwitzf1d50682005-10-23 23:00:41 +00003776
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003777 So we loop until we stop seeing new EXTENDED_ARGs.
3778 The only EXTENDED_ARGs that could be popping up are
3779 ones in jump instructions. So this should converge
3780 fairly quickly.
3781 */
3782 } while (last_extended_arg_count != extended_arg_count);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003783}
3784
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003785static PyObject *
3786dict_keys_inorder(PyObject *dict, int offset)
3787{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003788 PyObject *tuple, *k, *v;
3789 Py_ssize_t i, pos = 0, size = PyDict_Size(dict);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003790
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003791 tuple = PyTuple_New(size);
3792 if (tuple == NULL)
3793 return NULL;
3794 while (PyDict_Next(dict, &pos, &k, &v)) {
3795 i = PyInt_AS_LONG(v);
3796 /* The keys of the dictionary are tuples. (see compiler_add_o)
3797 The object we want is always first, though. */
3798 k = PyTuple_GET_ITEM(k, 0);
3799 Py_INCREF(k);
3800 assert((i - offset) < size);
3801 assert((i - offset) >= 0);
3802 PyTuple_SET_ITEM(tuple, i - offset, k);
3803 }
3804 return tuple;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003805}
3806
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003807static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003808compute_code_flags(struct compiler *c)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003809{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003810 PySTEntryObject *ste = c->u->u_ste;
3811 int flags = 0, n;
3812 if (ste->ste_type != ModuleBlock)
3813 flags |= CO_NEWLOCALS;
3814 if (ste->ste_type == FunctionBlock) {
3815 if (!ste->ste_unoptimized)
3816 flags |= CO_OPTIMIZED;
3817 if (ste->ste_nested)
3818 flags |= CO_NESTED;
3819 if (ste->ste_generator)
3820 flags |= CO_GENERATOR;
3821 if (ste->ste_varargs)
3822 flags |= CO_VARARGS;
3823 if (ste->ste_varkeywords)
3824 flags |= CO_VARKEYWORDS;
3825 }
Thomas Wouters5e9f1fa2006-02-28 20:02:27 +00003826
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003827 /* (Only) inherit compilerflags in PyCF_MASK */
3828 flags |= (c->c_flags->cf_flags & PyCF_MASK);
Thomas Wouters5e9f1fa2006-02-28 20:02:27 +00003829
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003830 n = PyDict_Size(c->u->u_freevars);
3831 if (n < 0)
3832 return -1;
3833 if (n == 0) {
3834 n = PyDict_Size(c->u->u_cellvars);
3835 if (n < 0)
3836 return -1;
3837 if (n == 0) {
3838 flags |= CO_NOFREE;
3839 }
3840 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00003841
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003842 return flags;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00003843}
3844
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003845static PyCodeObject *
3846makecode(struct compiler *c, struct assembler *a)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003847{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003848 PyObject *tmp;
3849 PyCodeObject *co = NULL;
3850 PyObject *consts = NULL;
3851 PyObject *names = NULL;
3852 PyObject *varnames = NULL;
3853 PyObject *filename = NULL;
3854 PyObject *name = NULL;
3855 PyObject *freevars = NULL;
3856 PyObject *cellvars = NULL;
3857 PyObject *bytecode = NULL;
3858 int nlocals, flags;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003859
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003860 tmp = dict_keys_inorder(c->u->u_consts, 0);
3861 if (!tmp)
3862 goto error;
3863 consts = PySequence_List(tmp); /* optimize_code requires a list */
3864 Py_DECREF(tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003865
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003866 names = dict_keys_inorder(c->u->u_names, 0);
3867 varnames = dict_keys_inorder(c->u->u_varnames, 0);
3868 if (!consts || !names || !varnames)
3869 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003870
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003871 cellvars = dict_keys_inorder(c->u->u_cellvars, 0);
3872 if (!cellvars)
3873 goto error;
3874 freevars = dict_keys_inorder(c->u->u_freevars, PyTuple_Size(cellvars));
3875 if (!freevars)
3876 goto error;
3877 filename = PyString_FromString(c->c_filename);
3878 if (!filename)
3879 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003880
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003881 nlocals = PyDict_Size(c->u->u_varnames);
3882 flags = compute_code_flags(c);
3883 if (flags < 0)
3884 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003885
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003886 bytecode = PyCode_Optimize(a->a_bytecode, consts, names, a->a_lnotab);
3887 if (!bytecode)
3888 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003889
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003890 tmp = PyList_AsTuple(consts); /* PyCode_New requires a tuple */
3891 if (!tmp)
3892 goto error;
3893 Py_DECREF(consts);
3894 consts = tmp;
3895
3896 co = PyCode_New(c->u->u_argcount, nlocals, stackdepth(c), flags,
3897 bytecode, consts, names, varnames,
3898 freevars, cellvars,
3899 filename, c->u->u_name,
3900 c->u->u_firstlineno,
3901 a->a_lnotab);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003902 error:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003903 Py_XDECREF(consts);
3904 Py_XDECREF(names);
3905 Py_XDECREF(varnames);
3906 Py_XDECREF(filename);
3907 Py_XDECREF(name);
3908 Py_XDECREF(freevars);
3909 Py_XDECREF(cellvars);
3910 Py_XDECREF(bytecode);
3911 return co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003912}
3913
Neal Norwitz4ffedad2006-08-04 04:58:47 +00003914
3915/* For debugging purposes only */
3916#if 0
3917static void
3918dump_instr(const struct instr *i)
3919{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003920 const char *jrel = i->i_jrel ? "jrel " : "";
3921 const char *jabs = i->i_jabs ? "jabs " : "";
3922 char arg[128];
Neal Norwitz4ffedad2006-08-04 04:58:47 +00003923
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003924 *arg = '\0';
3925 if (i->i_hasarg)
3926 sprintf(arg, "arg: %d ", i->i_oparg);
Neal Norwitz4ffedad2006-08-04 04:58:47 +00003927
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003928 fprintf(stderr, "line: %d, opcode: %d %s%s%s\n",
3929 i->i_lineno, i->i_opcode, arg, jabs, jrel);
Neal Norwitz4ffedad2006-08-04 04:58:47 +00003930}
3931
3932static void
3933dump_basicblock(const basicblock *b)
3934{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003935 const char *seen = b->b_seen ? "seen " : "";
3936 const char *b_return = b->b_return ? "return " : "";
3937 fprintf(stderr, "used: %d, depth: %d, offset: %d %s%s\n",
3938 b->b_iused, b->b_startdepth, b->b_offset, seen, b_return);
3939 if (b->b_instr) {
3940 int i;
3941 for (i = 0; i < b->b_iused; i++) {
3942 fprintf(stderr, " [%02d] ", i);
3943 dump_instr(b->b_instr + i);
3944 }
3945 }
Neal Norwitz4ffedad2006-08-04 04:58:47 +00003946}
3947#endif
3948
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003949static PyCodeObject *
3950assemble(struct compiler *c, int addNone)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003951{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003952 basicblock *b, *entryblock;
3953 struct assembler a;
3954 int i, j, nblocks;
3955 PyCodeObject *co = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003956
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003957 /* Make sure every block that falls off the end returns None.
3958 XXX NEXT_BLOCK() isn't quite right, because if the last
3959 block ends with a jump or return b_next shouldn't set.
3960 */
3961 if (!c->u->u_curblock->b_return) {
3962 NEXT_BLOCK(c);
3963 if (addNone)
3964 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3965 ADDOP(c, RETURN_VALUE);
3966 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003967
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003968 nblocks = 0;
3969 entryblock = NULL;
3970 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
3971 nblocks++;
3972 entryblock = b;
3973 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003974
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003975 /* Set firstlineno if it wasn't explicitly set. */
3976 if (!c->u->u_firstlineno) {
3977 if (entryblock && entryblock->b_instr)
3978 c->u->u_firstlineno = entryblock->b_instr->i_lineno;
3979 else
3980 c->u->u_firstlineno = 1;
3981 }
3982 if (!assemble_init(&a, nblocks, c->u->u_firstlineno))
3983 goto error;
3984 dfs(c, entryblock, &a);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003985
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003986 /* Can't modify the bytecode after computing jump offsets. */
3987 assemble_jump_offsets(&a, c);
Tim Petersb6c3cea2001-06-26 03:36:28 +00003988
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003989 /* Emit code in reverse postorder from dfs. */
3990 for (i = a.a_nblocks - 1; i >= 0; i--) {
3991 b = a.a_postorder[i];
3992 for (j = 0; j < b->b_iused; j++)
3993 if (!assemble_emit(&a, &b->b_instr[j]))
3994 goto error;
3995 }
Tim Petersb6c3cea2001-06-26 03:36:28 +00003996
Antoine Pitrouc83ea132010-05-09 14:46:46 +00003997 if (_PyString_Resize(&a.a_lnotab, a.a_lnotab_off) < 0)
3998 goto error;
3999 if (_PyString_Resize(&a.a_bytecode, a.a_offset) < 0)
4000 goto error;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004001
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004002 co = makecode(c, &a);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004003 error:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00004004 assemble_free(&a);
4005 return co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004006}