blob: 6650504ec01044aa8b9732e3d8d5dd2000603c4c [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 Pitrouc7c96a92010-05-09 15:15:40 +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 Pitrouc7c96a92010-05-09 15:15:40 +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
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000042struct instr {
Antoine Pitrouc7c96a92010-05-09 15:15:40 +000043 unsigned i_jabs : 1;
44 unsigned i_jrel : 1;
45 unsigned i_hasarg : 1;
46 unsigned char i_opcode;
47 int i_oparg;
48 struct basicblock_ *i_target; /* target block (if jump instruction) */
49 int i_lineno;
Guido van Rossum3f5da241990-12-20 15:06:42 +000050};
51
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000052typedef struct basicblock_ {
Jeremy Hylton12603c42006-04-01 16:18:02 +000053 /* Each basicblock in a compilation unit is linked via b_list in the
54 reverse order that the block are allocated. b_list points to the next
55 block, not to be confused with b_next, which is next by control flow. */
Antoine Pitrouc7c96a92010-05-09 15:15:40 +000056 struct basicblock_ *b_list;
57 /* number of instructions used */
58 int b_iused;
59 /* length of instruction array (b_instr) */
60 int b_ialloc;
61 /* pointer to an array of instructions, initially NULL */
62 struct instr *b_instr;
63 /* If b_next is non-NULL, it is a pointer to the next
64 block reached by normal control flow. */
65 struct basicblock_ *b_next;
66 /* b_seen is used to perform a DFS of basicblocks. */
67 unsigned b_seen : 1;
68 /* b_return is true if a RETURN_VALUE opcode is inserted. */
69 unsigned b_return : 1;
70 /* depth of stack upon entry of block, computed by stackdepth() */
71 int b_startdepth;
72 /* instruction offset for block, computed by assemble_jump_offsets() */
73 int b_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000074} basicblock;
75
76/* fblockinfo tracks the current frame block.
77
Jeremy Hyltone9357b22006-03-01 15:47:05 +000078A frame block is used to handle loops, try/except, and try/finally.
79It's called a frame block to distinguish it from a basic block in the
80compiler IR.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000081*/
82
83enum fblocktype { LOOP, EXCEPT, FINALLY_TRY, FINALLY_END };
84
85struct fblockinfo {
Antoine Pitrouc7c96a92010-05-09 15:15:40 +000086 enum fblocktype fb_type;
87 basicblock *fb_block;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000088};
89
90/* The following items change on entry and exit of code blocks.
91 They must be saved and restored when returning to a block.
92*/
93struct compiler_unit {
Antoine Pitrouc7c96a92010-05-09 15:15:40 +000094 PySTEntryObject *u_ste;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000095
Antoine Pitrouc7c96a92010-05-09 15:15:40 +000096 PyObject *u_name;
97 /* The following fields are dicts that map objects to
98 the index of them in co_XXX. The index is used as
99 the argument for opcodes that refer to those collections.
100 */
101 PyObject *u_consts; /* all constants */
102 PyObject *u_names; /* all names */
103 PyObject *u_varnames; /* local variables */
104 PyObject *u_cellvars; /* cell variables */
105 PyObject *u_freevars; /* free variables */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000106
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000107 PyObject *u_private; /* for private name mangling */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000108
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000109 int u_argcount; /* number of arguments for block */
110 /* Pointer to the most recently allocated block. By following b_list
111 members, you can reach all early allocated blocks. */
112 basicblock *u_blocks;
113 basicblock *u_curblock; /* pointer to current block */
114 int u_tmpname; /* temporary variables for list comps */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000115
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000116 int u_nfblocks;
117 struct fblockinfo u_fblock[CO_MAXBLOCKS];
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000118
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000119 int u_firstlineno; /* the first lineno of the block */
120 int u_lineno; /* the lineno for the current stmt */
121 bool u_lineno_set; /* boolean to indicate whether instr
122 has been generated with current lineno */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000123};
124
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000125/* This struct captures the global state of a compilation.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000126
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000127The u pointer points to the current compilation unit, while units
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000128for enclosing blocks are stored in c_stack. The u and c_stack are
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000129managed by compiler_enter_scope() and compiler_exit_scope().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000130*/
131
132struct compiler {
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000133 const char *c_filename;
134 struct symtable *c_st;
135 PyFutureFeatures *c_future; /* pointer to module's __future__ */
136 PyCompilerFlags *c_flags;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000137
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000138 int c_interactive; /* true if in interactive mode */
139 int c_nestlevel;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000140
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000141 struct compiler_unit *u; /* compiler state for current block */
142 PyObject *c_stack; /* Python list holding compiler_unit ptrs */
143 char *c_encoding; /* source encoding (a borrowed reference) */
144 PyArena *c_arena; /* pointer to memory allocation arena */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000145};
146
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000147static int compiler_enter_scope(struct compiler *, identifier, void *, int);
148static void compiler_free(struct compiler *);
149static basicblock *compiler_new_block(struct compiler *);
150static int compiler_next_instr(struct compiler *, basicblock *);
151static int compiler_addop(struct compiler *, int);
152static int compiler_addop_o(struct compiler *, int, PyObject *, PyObject *);
153static int compiler_addop_i(struct compiler *, int, int);
154static int compiler_addop_j(struct compiler *, int, basicblock *, int);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000155static basicblock *compiler_use_new_block(struct compiler *);
156static int compiler_error(struct compiler *, const char *);
157static int compiler_nameop(struct compiler *, identifier, expr_context_ty);
158
159static PyCodeObject *compiler_mod(struct compiler *, mod_ty);
160static int compiler_visit_stmt(struct compiler *, stmt_ty);
161static int compiler_visit_keyword(struct compiler *, keyword_ty);
162static int compiler_visit_expr(struct compiler *, expr_ty);
163static int compiler_augassign(struct compiler *, stmt_ty);
164static int compiler_visit_slice(struct compiler *, slice_ty,
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000165 expr_context_ty);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000166
167static int compiler_push_fblock(struct compiler *, enum fblocktype,
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000168 basicblock *);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000169static void compiler_pop_fblock(struct compiler *, enum fblocktype,
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000170 basicblock *);
Jeremy Hylton82271f12006-10-04 02:24:52 +0000171/* Returns true if there is a loop on the fblock stack. */
172static int compiler_in_loop(struct compiler *);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000173
174static int inplace_binop(struct compiler *, operator_ty);
175static int expr_constant(expr_ty e);
176
Guido van Rossumc2e20742006-02-27 22:32:47 +0000177static int compiler_with(struct compiler *, stmt_ty);
178
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000179static PyCodeObject *assemble(struct compiler *, int addNone);
180static PyObject *__doc__;
181
182PyObject *
Anthony Baxter7b782b62006-04-11 12:01:56 +0000183_Py_Mangle(PyObject *privateobj, PyObject *ident)
Michael W. Hudson60934622004-08-12 17:56:29 +0000184{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000185 /* Name mangling: __private becomes _classname__private.
186 This is independent from how the name is used. */
187 const char *p, *name = PyString_AsString(ident);
188 char *buffer;
189 size_t nlen, plen;
190 if (privateobj == NULL || !PyString_Check(privateobj) ||
191 name == NULL || name[0] != '_' || name[1] != '_') {
192 Py_INCREF(ident);
193 return ident;
194 }
195 p = PyString_AsString(privateobj);
196 nlen = strlen(name);
197 /* Don't mangle __id__ or names with dots.
Jeremy Hylton37075c52007-02-27 01:01:59 +0000198
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000199 The only time a name with a dot can occur is when
200 we are compiling an import statement that has a
201 package name.
Jeremy Hylton37075c52007-02-27 01:01:59 +0000202
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000203 TODO(jhylton): Decide whether we want to support
204 mangling of the module name, e.g. __M.X.
205 */
206 if ((name[nlen-1] == '_' && name[nlen-2] == '_')
207 || strchr(name, '.')) {
208 Py_INCREF(ident);
209 return ident; /* Don't mangle __whatever__ */
210 }
211 /* Strip leading underscores from class name */
212 while (*p == '_')
213 p++;
214 if (*p == '\0') {
215 Py_INCREF(ident);
216 return ident; /* Don't mangle if class is just underscores */
217 }
218 plen = strlen(p);
Gregory P. Smith9d534572008-06-11 07:41:16 +0000219
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000220 assert(1 <= PY_SSIZE_T_MAX - nlen);
221 assert(1 + nlen <= PY_SSIZE_T_MAX - plen);
Gregory P. Smith9d534572008-06-11 07:41:16 +0000222
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000223 ident = PyString_FromStringAndSize(NULL, 1 + nlen + plen);
224 if (!ident)
225 return 0;
226 /* ident = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
227 buffer = PyString_AS_STRING(ident);
228 buffer[0] = '_';
229 strncpy(buffer+1, p, plen);
230 strcpy(buffer+1+plen, name);
231 return ident;
Michael W. Hudson60934622004-08-12 17:56:29 +0000232}
233
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000234static int
235compiler_init(struct compiler *c)
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000236{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000237 memset(c, 0, sizeof(struct compiler));
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000238
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000239 c->c_stack = PyList_New(0);
240 if (!c->c_stack)
241 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000242
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000243 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000244}
245
246PyCodeObject *
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000247PyAST_Compile(mod_ty mod, const char *filename, PyCompilerFlags *flags,
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000248 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000249{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000250 struct compiler c;
251 PyCodeObject *co = NULL;
252 PyCompilerFlags local_flags;
253 int merged;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000254
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000255 if (!__doc__) {
256 __doc__ = PyString_InternFromString("__doc__");
257 if (!__doc__)
258 return NULL;
259 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000260
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000261 if (!compiler_init(&c))
262 return NULL;
263 c.c_filename = filename;
264 c.c_arena = arena;
265 c.c_future = PyFuture_FromAST(mod, filename);
266 if (c.c_future == NULL)
267 goto finally;
268 if (!flags) {
269 local_flags.cf_flags = 0;
270 flags = &local_flags;
271 }
272 merged = c.c_future->ff_features | flags->cf_flags;
273 c.c_future->ff_features = merged;
274 flags->cf_flags = merged;
275 c.c_flags = flags;
276 c.c_nestlevel = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000277
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000278 c.c_st = PySymtable_Build(mod, filename, c.c_future);
279 if (c.c_st == NULL) {
280 if (!PyErr_Occurred())
281 PyErr_SetString(PyExc_SystemError, "no symtable");
282 goto finally;
283 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000284
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000285 /* XXX initialize to NULL for now, need to handle */
286 c.c_encoding = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000287
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000288 co = compiler_mod(&c, mod);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000289
Thomas Wouters1175c432006-02-27 22:49:54 +0000290 finally:
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000291 compiler_free(&c);
292 assert(co || PyErr_Occurred());
293 return co;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000294}
295
296PyCodeObject *
297PyNode_Compile(struct _node *n, const char *filename)
298{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000299 PyCodeObject *co = NULL;
300 mod_ty mod;
301 PyArena *arena = PyArena_New();
302 if (!arena)
303 return NULL;
304 mod = PyAST_FromNode(n, NULL, filename, arena);
305 if (mod)
306 co = PyAST_Compile(mod, filename, NULL, arena);
307 PyArena_Free(arena);
308 return co;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000309}
310
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000311static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000312compiler_free(struct compiler *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000313{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000314 if (c->c_st)
315 PySymtable_Free(c->c_st);
316 if (c->c_future)
317 PyObject_Free(c->c_future);
318 Py_DECREF(c->c_stack);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000319}
320
Guido van Rossum79f25d91997-04-29 20:08:16 +0000321static PyObject *
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000322list2dict(PyObject *list)
Guido van Rossum2dff9911992-09-03 20:50:59 +0000323{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000324 Py_ssize_t i, n;
325 PyObject *v, *k;
326 PyObject *dict = PyDict_New();
327 if (!dict) return NULL;
Guido van Rossumd076c731998-10-07 19:42:25 +0000328
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000329 n = PyList_Size(list);
330 for (i = 0; i < n; i++) {
331 v = PyInt_FromLong(i);
332 if (!v) {
333 Py_DECREF(dict);
334 return NULL;
335 }
336 k = PyList_GET_ITEM(list, i);
337 k = PyTuple_Pack(2, k, k->ob_type);
338 if (k == NULL || PyDict_SetItem(dict, k, v) < 0) {
339 Py_XDECREF(k);
340 Py_DECREF(v);
341 Py_DECREF(dict);
342 return NULL;
343 }
344 Py_DECREF(k);
345 Py_DECREF(v);
346 }
347 return dict;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000348}
349
350/* Return new dict containing names from src that match scope(s).
351
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000352src is a symbol table dictionary. If the scope of a name matches
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000353either scope_type or flag is set, insert it into the new dict. The
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000354values are integers, starting at offset and increasing by one for
355each key.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000356*/
357
358static PyObject *
359dictbytype(PyObject *src, int scope_type, int flag, int offset)
360{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000361 Py_ssize_t pos = 0, i = offset, scope;
362 PyObject *k, *v, *dest = PyDict_New();
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000363
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000364 assert(offset >= 0);
365 if (dest == NULL)
366 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000367
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000368 while (PyDict_Next(src, &pos, &k, &v)) {
369 /* XXX this should probably be a macro in symtable.h */
370 assert(PyInt_Check(v));
371 scope = (PyInt_AS_LONG(v) >> SCOPE_OFF) & SCOPE_MASK;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000372
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000373 if (scope == scope_type || PyInt_AS_LONG(v) & flag) {
374 PyObject *tuple, *item = PyInt_FromLong(i);
375 if (item == NULL) {
376 Py_DECREF(dest);
377 return NULL;
378 }
379 i++;
380 tuple = PyTuple_Pack(2, k, k->ob_type);
381 if (!tuple || PyDict_SetItem(dest, tuple, item) < 0) {
382 Py_DECREF(item);
383 Py_DECREF(dest);
384 Py_XDECREF(tuple);
385 return NULL;
386 }
387 Py_DECREF(item);
388 Py_DECREF(tuple);
389 }
390 }
391 return dest;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000392}
393
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000394static void
395compiler_unit_check(struct compiler_unit *u)
396{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000397 basicblock *block;
398 for (block = u->u_blocks; block != NULL; block = block->b_list) {
399 assert((void *)block != (void *)0xcbcbcbcb);
400 assert((void *)block != (void *)0xfbfbfbfb);
401 assert((void *)block != (void *)0xdbdbdbdb);
402 if (block->b_instr != NULL) {
403 assert(block->b_ialloc > 0);
404 assert(block->b_iused > 0);
405 assert(block->b_ialloc >= block->b_iused);
406 }
407 else {
408 assert (block->b_iused == 0);
409 assert (block->b_ialloc == 0);
410 }
411 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000412}
413
414static void
415compiler_unit_free(struct compiler_unit *u)
416{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000417 basicblock *b, *next;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000418
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000419 compiler_unit_check(u);
420 b = u->u_blocks;
421 while (b != NULL) {
422 if (b->b_instr)
423 PyObject_Free((void *)b->b_instr);
424 next = b->b_list;
425 PyObject_Free((void *)b);
426 b = next;
427 }
428 Py_CLEAR(u->u_ste);
429 Py_CLEAR(u->u_name);
430 Py_CLEAR(u->u_consts);
431 Py_CLEAR(u->u_names);
432 Py_CLEAR(u->u_varnames);
433 Py_CLEAR(u->u_freevars);
434 Py_CLEAR(u->u_cellvars);
435 Py_CLEAR(u->u_private);
436 PyObject_Free(u);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000437}
438
439static int
440compiler_enter_scope(struct compiler *c, identifier name, void *key,
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000441 int lineno)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000442{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000443 struct compiler_unit *u;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000444
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000445 u = (struct compiler_unit *)PyObject_Malloc(sizeof(
446 struct compiler_unit));
447 if (!u) {
448 PyErr_NoMemory();
449 return 0;
450 }
451 memset(u, 0, sizeof(struct compiler_unit));
452 u->u_argcount = 0;
453 u->u_ste = PySymtable_Lookup(c->c_st, key);
454 if (!u->u_ste) {
455 compiler_unit_free(u);
456 return 0;
457 }
458 Py_INCREF(name);
459 u->u_name = name;
460 u->u_varnames = list2dict(u->u_ste->ste_varnames);
461 u->u_cellvars = dictbytype(u->u_ste->ste_symbols, CELL, 0, 0);
462 if (!u->u_varnames || !u->u_cellvars) {
463 compiler_unit_free(u);
464 return 0;
465 }
Neal Norwitzd12bd012006-07-21 07:59:47 +0000466
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000467 u->u_freevars = dictbytype(u->u_ste->ste_symbols, FREE, DEF_FREE_CLASS,
468 PyDict_Size(u->u_cellvars));
469 if (!u->u_freevars) {
470 compiler_unit_free(u);
471 return 0;
472 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000473
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000474 u->u_blocks = NULL;
475 u->u_tmpname = 0;
476 u->u_nfblocks = 0;
477 u->u_firstlineno = lineno;
478 u->u_lineno = 0;
479 u->u_lineno_set = false;
480 u->u_consts = PyDict_New();
481 if (!u->u_consts) {
482 compiler_unit_free(u);
483 return 0;
484 }
485 u->u_names = PyDict_New();
486 if (!u->u_names) {
487 compiler_unit_free(u);
488 return 0;
489 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000490
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000491 u->u_private = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000492
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000493 /* Push the old compiler_unit on the stack. */
494 if (c->u) {
495 PyObject *wrapper = PyCObject_FromVoidPtr(c->u, NULL);
496 if (!wrapper || PyList_Append(c->c_stack, wrapper) < 0) {
497 Py_XDECREF(wrapper);
498 compiler_unit_free(u);
499 return 0;
500 }
501 Py_DECREF(wrapper);
502 u->u_private = c->u->u_private;
503 Py_XINCREF(u->u_private);
504 }
505 c->u = u;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000506
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000507 c->c_nestlevel++;
508 if (compiler_use_new_block(c) == NULL)
509 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000510
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000511 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000512}
513
Neil Schemenauerc396d9e2005-10-25 06:30:14 +0000514static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000515compiler_exit_scope(struct compiler *c)
516{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000517 int n;
518 PyObject *wrapper;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000519
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000520 c->c_nestlevel--;
521 compiler_unit_free(c->u);
522 /* Restore c->u to the parent unit. */
523 n = PyList_GET_SIZE(c->c_stack) - 1;
524 if (n >= 0) {
525 wrapper = PyList_GET_ITEM(c->c_stack, n);
526 c->u = (struct compiler_unit *)PyCObject_AsVoidPtr(wrapper);
527 assert(c->u);
528 /* we are deleting from a list so this really shouldn't fail */
529 if (PySequence_DelItem(c->c_stack, n) < 0)
530 Py_FatalError("compiler_exit_scope()");
531 compiler_unit_check(c->u);
532 }
533 else
534 c->u = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000535
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000536}
537
Guido van Rossumc2e20742006-02-27 22:32:47 +0000538/* Allocate a new "anonymous" local variable.
539 Used by list comprehensions and with statements.
540*/
541
542static PyObject *
543compiler_new_tmpname(struct compiler *c)
544{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000545 char tmpname[256];
546 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++c->u->u_tmpname);
547 return PyString_FromString(tmpname);
Guido van Rossumc2e20742006-02-27 22:32:47 +0000548}
549
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000550/* Allocate a new block and return a pointer to it.
551 Returns NULL on error.
552*/
553
554static basicblock *
555compiler_new_block(struct compiler *c)
556{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000557 basicblock *b;
558 struct compiler_unit *u;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000559
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000560 u = c->u;
561 b = (basicblock *)PyObject_Malloc(sizeof(basicblock));
562 if (b == NULL) {
563 PyErr_NoMemory();
564 return NULL;
565 }
566 memset((void *)b, 0, sizeof(basicblock));
567 /* Extend the singly linked list of blocks with new block. */
568 b->b_list = u->u_blocks;
569 u->u_blocks = b;
570 return b;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000571}
572
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000573static basicblock *
574compiler_use_new_block(struct compiler *c)
575{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000576 basicblock *block = compiler_new_block(c);
577 if (block == NULL)
578 return NULL;
579 c->u->u_curblock = block;
580 return block;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000581}
582
583static basicblock *
584compiler_next_block(struct compiler *c)
585{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000586 basicblock *block = compiler_new_block(c);
587 if (block == NULL)
588 return NULL;
589 c->u->u_curblock->b_next = block;
590 c->u->u_curblock = block;
591 return block;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000592}
593
594static basicblock *
595compiler_use_next_block(struct compiler *c, basicblock *block)
596{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000597 assert(block != NULL);
598 c->u->u_curblock->b_next = block;
599 c->u->u_curblock = block;
600 return block;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000601}
602
603/* Returns the offset of the next instruction in the current block's
604 b_instr array. Resizes the b_instr as necessary.
605 Returns -1 on failure.
Neal Norwitzf733a012006-10-29 18:30:10 +0000606*/
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000607
608static int
609compiler_next_instr(struct compiler *c, basicblock *b)
610{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000611 assert(b != NULL);
612 if (b->b_instr == NULL) {
613 b->b_instr = (struct instr *)PyObject_Malloc(
614 sizeof(struct instr) * DEFAULT_BLOCK_SIZE);
615 if (b->b_instr == NULL) {
616 PyErr_NoMemory();
617 return -1;
618 }
619 b->b_ialloc = DEFAULT_BLOCK_SIZE;
620 memset((char *)b->b_instr, 0,
621 sizeof(struct instr) * DEFAULT_BLOCK_SIZE);
622 }
623 else if (b->b_iused == b->b_ialloc) {
624 struct instr *tmp;
625 size_t oldsize, newsize;
626 oldsize = b->b_ialloc * sizeof(struct instr);
627 newsize = oldsize << 1;
Gregory P. Smith9d534572008-06-11 07:41:16 +0000628
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000629 if (oldsize > (PY_SIZE_MAX >> 1)) {
630 PyErr_NoMemory();
631 return -1;
632 }
Gregory P. Smith9d534572008-06-11 07:41:16 +0000633
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000634 if (newsize == 0) {
635 PyErr_NoMemory();
636 return -1;
637 }
638 b->b_ialloc <<= 1;
639 tmp = (struct instr *)PyObject_Realloc(
640 (void *)b->b_instr, newsize);
641 if (tmp == NULL) {
642 PyErr_NoMemory();
643 return -1;
644 }
645 b->b_instr = tmp;
646 memset((char *)b->b_instr + oldsize, 0, newsize - oldsize);
647 }
648 return b->b_iused++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000649}
650
Amaury Forgeot d'Arc6fd03bb2008-02-04 21:45:05 +0000651/* Set the i_lineno member of the instruction at offset off if the
652 line number for the current expression/statement has not
Jeremy Hylton12603c42006-04-01 16:18:02 +0000653 already been set. If it has been set, the call has no effect.
654
Amaury Forgeot d'Arc6fd03bb2008-02-04 21:45:05 +0000655 The line number is reset in the following cases:
656 - when entering a new scope
657 - on each statement
658 - on each expression that start a new line
659 - before the "except" clause
660 - before the "for" and "while" expressions
Neal Norwitzf733a012006-10-29 18:30:10 +0000661*/
Jeremy Hylton12603c42006-04-01 16:18:02 +0000662
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000663static void
664compiler_set_lineno(struct compiler *c, int off)
665{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000666 basicblock *b;
667 if (c->u->u_lineno_set)
668 return;
669 c->u->u_lineno_set = true;
670 b = c->u->u_curblock;
671 b->b_instr[off].i_lineno = c->u->u_lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000672}
673
674static int
675opcode_stack_effect(int opcode, int oparg)
676{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000677 switch (opcode) {
678 case POP_TOP:
679 return -1;
680 case ROT_TWO:
681 case ROT_THREE:
682 return 0;
683 case DUP_TOP:
684 return 1;
685 case ROT_FOUR:
686 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000687
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000688 case UNARY_POSITIVE:
689 case UNARY_NEGATIVE:
690 case UNARY_NOT:
691 case UNARY_CONVERT:
692 case UNARY_INVERT:
693 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000694
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000695 case LIST_APPEND:
696 return -2;
Neal Norwitz10be2ea2006-03-03 20:29:11 +0000697
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000698 case BINARY_POWER:
699 case BINARY_MULTIPLY:
700 case BINARY_DIVIDE:
701 case BINARY_MODULO:
702 case BINARY_ADD:
703 case BINARY_SUBTRACT:
704 case BINARY_SUBSCR:
705 case BINARY_FLOOR_DIVIDE:
706 case BINARY_TRUE_DIVIDE:
707 return -1;
708 case INPLACE_FLOOR_DIVIDE:
709 case INPLACE_TRUE_DIVIDE:
710 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000711
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000712 case SLICE+0:
713 return 1;
714 case SLICE+1:
715 return 0;
716 case SLICE+2:
717 return 0;
718 case SLICE+3:
719 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000720
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000721 case STORE_SLICE+0:
722 return -2;
723 case STORE_SLICE+1:
724 return -3;
725 case STORE_SLICE+2:
726 return -3;
727 case STORE_SLICE+3:
728 return -4;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000729
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000730 case DELETE_SLICE+0:
731 return -1;
732 case DELETE_SLICE+1:
733 return -2;
734 case DELETE_SLICE+2:
735 return -2;
736 case DELETE_SLICE+3:
737 return -3;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000738
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000739 case INPLACE_ADD:
740 case INPLACE_SUBTRACT:
741 case INPLACE_MULTIPLY:
742 case INPLACE_DIVIDE:
743 case INPLACE_MODULO:
744 return -1;
745 case STORE_SUBSCR:
746 return -3;
747 case STORE_MAP:
748 return -2;
749 case DELETE_SUBSCR:
750 return -2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000751
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000752 case BINARY_LSHIFT:
753 case BINARY_RSHIFT:
754 case BINARY_AND:
755 case BINARY_XOR:
756 case BINARY_OR:
757 return -1;
758 case INPLACE_POWER:
759 return -1;
760 case GET_ITER:
761 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000762
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000763 case PRINT_EXPR:
764 return -1;
765 case PRINT_ITEM:
766 return -1;
767 case PRINT_NEWLINE:
768 return 0;
769 case PRINT_ITEM_TO:
770 return -2;
771 case PRINT_NEWLINE_TO:
772 return -1;
773 case INPLACE_LSHIFT:
774 case INPLACE_RSHIFT:
775 case INPLACE_AND:
776 case INPLACE_XOR:
777 case INPLACE_OR:
778 return -1;
779 case BREAK_LOOP:
780 return 0;
781 case WITH_CLEANUP:
782 return -1; /* XXX Sometimes more */
783 case LOAD_LOCALS:
784 return 1;
785 case RETURN_VALUE:
786 return -1;
787 case IMPORT_STAR:
788 return -1;
789 case EXEC_STMT:
790 return -3;
791 case YIELD_VALUE:
792 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000793
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000794 case POP_BLOCK:
795 return 0;
796 case END_FINALLY:
797 return -1; /* or -2 or -3 if exception occurred */
798 case BUILD_CLASS:
799 return -2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000800
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000801 case STORE_NAME:
802 return -1;
803 case DELETE_NAME:
804 return 0;
805 case UNPACK_SEQUENCE:
806 return oparg-1;
807 case FOR_ITER:
808 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000809
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000810 case STORE_ATTR:
811 return -2;
812 case DELETE_ATTR:
813 return -1;
814 case STORE_GLOBAL:
815 return -1;
816 case DELETE_GLOBAL:
817 return 0;
818 case DUP_TOPX:
819 return oparg;
820 case LOAD_CONST:
821 return 1;
822 case LOAD_NAME:
823 return 1;
824 case BUILD_TUPLE:
825 case BUILD_LIST:
826 return 1-oparg;
827 case BUILD_MAP:
828 return 1;
829 case LOAD_ATTR:
830 return 0;
831 case COMPARE_OP:
832 return -1;
833 case IMPORT_NAME:
834 return 0;
835 case IMPORT_FROM:
836 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000837
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000838 case JUMP_FORWARD:
839 case JUMP_IF_FALSE:
840 case JUMP_IF_TRUE:
841 case JUMP_ABSOLUTE:
842 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000843
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000844 case LOAD_GLOBAL:
845 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000846
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000847 case CONTINUE_LOOP:
848 return 0;
849 case SETUP_LOOP:
850 return 0;
851 case SETUP_EXCEPT:
852 case SETUP_FINALLY:
853 return 3; /* actually pushed by an exception */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000854
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000855 case LOAD_FAST:
856 return 1;
857 case STORE_FAST:
858 return -1;
859 case DELETE_FAST:
860 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000861
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000862 case RAISE_VARARGS:
863 return -oparg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000864#define NARGS(o) (((o) % 256) + 2*((o) / 256))
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000865 case CALL_FUNCTION:
866 return -NARGS(oparg);
867 case CALL_FUNCTION_VAR:
868 case CALL_FUNCTION_KW:
869 return -NARGS(oparg)-1;
870 case CALL_FUNCTION_VAR_KW:
871 return -NARGS(oparg)-2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000872#undef NARGS
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000873 case MAKE_FUNCTION:
874 return -oparg;
875 case BUILD_SLICE:
876 if (oparg == 3)
877 return -2;
878 else
879 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000880
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000881 case MAKE_CLOSURE:
882 return -oparg;
883 case LOAD_CLOSURE:
884 return 1;
885 case LOAD_DEREF:
886 return 1;
887 case STORE_DEREF:
888 return -1;
889 default:
890 fprintf(stderr, "opcode = %d\n", opcode);
891 Py_FatalError("opcode_stack_effect()");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000892
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000893 }
894 return 0; /* not reachable */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000895}
896
897/* Add an opcode with no argument.
898 Returns 0 on failure, 1 on success.
899*/
900
901static int
902compiler_addop(struct compiler *c, int opcode)
903{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000904 basicblock *b;
905 struct instr *i;
906 int off;
907 off = compiler_next_instr(c, c->u->u_curblock);
908 if (off < 0)
909 return 0;
910 b = c->u->u_curblock;
911 i = &b->b_instr[off];
912 i->i_opcode = opcode;
913 i->i_hasarg = 0;
914 if (opcode == RETURN_VALUE)
915 b->b_return = 1;
916 compiler_set_lineno(c, off);
917 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000918}
919
920static int
921compiler_add_o(struct compiler *c, PyObject *dict, PyObject *o)
922{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000923 PyObject *t, *v;
924 Py_ssize_t arg;
925 double d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000926
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000927 /* necessary to make sure types aren't coerced (e.g., int and long) */
928 /* _and_ to distinguish 0.0 from -0.0 e.g. on IEEE platforms */
929 if (PyFloat_Check(o)) {
930 d = PyFloat_AS_DOUBLE(o);
931 /* all we need is to make the tuple different in either the 0.0
932 * or -0.0 case from all others, just to avoid the "coercion".
933 */
934 if (d == 0.0 && copysign(1.0, d) < 0.0)
935 t = PyTuple_Pack(3, o, o->ob_type, Py_None);
936 else
937 t = PyTuple_Pack(2, o, o->ob_type);
938 }
Mark Dickinsona47460a2009-10-27 17:26:31 +0000939#ifndef WITHOUT_COMPLEX
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000940 else if (PyComplex_Check(o)) {
941 Py_complex z;
942 int real_negzero, imag_negzero;
943 /* For the complex case we must make complex(x, 0.)
944 different from complex(x, -0.) and complex(0., y)
945 different from complex(-0., y), for any x and y.
946 All four complex zeros must be distinguished.*/
947 z = PyComplex_AsCComplex(o);
948 real_negzero = z.real == 0.0 && copysign(1.0, z.real) < 0.0;
949 imag_negzero = z.imag == 0.0 && copysign(1.0, z.imag) < 0.0;
950 if (real_negzero && imag_negzero) {
951 t = PyTuple_Pack(5, o, o->ob_type,
952 Py_None, Py_None, Py_None);
Mark Dickinson105be772008-01-31 22:17:37 +0000953 }
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000954 else if (imag_negzero) {
955 t = PyTuple_Pack(4, o, o->ob_type, Py_None, Py_None);
956 }
957 else if (real_negzero) {
958 t = PyTuple_Pack(3, o, o->ob_type, Py_None);
959 }
960 else {
961 t = PyTuple_Pack(2, o, o->ob_type);
962 }
963 }
Mark Dickinsona47460a2009-10-27 17:26:31 +0000964#endif /* WITHOUT_COMPLEX */
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000965 else {
966 t = PyTuple_Pack(2, o, o->ob_type);
967 }
968 if (t == NULL)
969 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000970
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000971 v = PyDict_GetItem(dict, t);
972 if (!v) {
973 arg = PyDict_Size(dict);
974 v = PyInt_FromLong(arg);
975 if (!v) {
976 Py_DECREF(t);
977 return -1;
978 }
979 if (PyDict_SetItem(dict, t, v) < 0) {
980 Py_DECREF(t);
981 Py_DECREF(v);
982 return -1;
983 }
984 Py_DECREF(v);
985 }
986 else
987 arg = PyInt_AsLong(v);
988 Py_DECREF(t);
989 return arg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000990}
991
992static int
993compiler_addop_o(struct compiler *c, int opcode, PyObject *dict,
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000994 PyObject *o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000995{
996 int arg = compiler_add_o(c, dict, o);
997 if (arg < 0)
Antoine Pitrouc31616d2010-06-22 21:47:04 +0000998 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000999 return compiler_addop_i(c, opcode, arg);
1000}
1001
1002static int
1003compiler_addop_name(struct compiler *c, int opcode, PyObject *dict,
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001004 PyObject *o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001005{
1006 int arg;
1007 PyObject *mangled = _Py_Mangle(c->u->u_private, o);
1008 if (!mangled)
Antoine Pitrouc31616d2010-06-22 21:47:04 +00001009 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001010 arg = compiler_add_o(c, dict, mangled);
1011 Py_DECREF(mangled);
1012 if (arg < 0)
Antoine Pitrouc31616d2010-06-22 21:47:04 +00001013 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001014 return compiler_addop_i(c, opcode, arg);
1015}
1016
1017/* Add an opcode with an integer argument.
1018 Returns 0 on failure, 1 on success.
1019*/
1020
1021static int
1022compiler_addop_i(struct compiler *c, int opcode, int oparg)
1023{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001024 struct instr *i;
1025 int off;
1026 off = compiler_next_instr(c, c->u->u_curblock);
1027 if (off < 0)
1028 return 0;
1029 i = &c->u->u_curblock->b_instr[off];
1030 i->i_opcode = opcode;
1031 i->i_oparg = oparg;
1032 i->i_hasarg = 1;
1033 compiler_set_lineno(c, off);
1034 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001035}
1036
1037static int
1038compiler_addop_j(struct compiler *c, int opcode, basicblock *b, int absolute)
1039{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001040 struct instr *i;
1041 int off;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001042
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001043 assert(b != NULL);
1044 off = compiler_next_instr(c, c->u->u_curblock);
1045 if (off < 0)
1046 return 0;
1047 i = &c->u->u_curblock->b_instr[off];
1048 i->i_opcode = opcode;
1049 i->i_target = b;
1050 i->i_hasarg = 1;
1051 if (absolute)
1052 i->i_jabs = 1;
1053 else
1054 i->i_jrel = 1;
1055 compiler_set_lineno(c, off);
1056 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001057}
1058
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001059/* The distinction between NEW_BLOCK and NEXT_BLOCK is subtle. (I'd
1060 like to find better names.) NEW_BLOCK() creates a new block and sets
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001061 it as the current block. NEXT_BLOCK() also creates an implicit jump
1062 from the current block to the new block.
1063*/
1064
Neal Norwitzf733a012006-10-29 18:30:10 +00001065/* The returns inside these macros make it impossible to decref objects
1066 created in the local function. Local objects should use the arena.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001067*/
1068
1069
1070#define NEW_BLOCK(C) { \
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001071 if (compiler_use_new_block((C)) == NULL) \
1072 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001073}
1074
1075#define NEXT_BLOCK(C) { \
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001076 if (compiler_next_block((C)) == NULL) \
1077 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001078}
1079
1080#define ADDOP(C, OP) { \
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001081 if (!compiler_addop((C), (OP))) \
1082 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001083}
1084
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001085#define ADDOP_IN_SCOPE(C, OP) { \
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001086 if (!compiler_addop((C), (OP))) { \
1087 compiler_exit_scope(c); \
1088 return 0; \
1089 } \
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001090}
1091
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001092#define ADDOP_O(C, OP, O, TYPE) { \
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001093 if (!compiler_addop_o((C), (OP), (C)->u->u_ ## TYPE, (O))) \
1094 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001095}
1096
1097#define ADDOP_NAME(C, OP, O, TYPE) { \
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001098 if (!compiler_addop_name((C), (OP), (C)->u->u_ ## TYPE, (O))) \
1099 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001100}
1101
1102#define ADDOP_I(C, OP, O) { \
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001103 if (!compiler_addop_i((C), (OP), (O))) \
1104 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001105}
1106
1107#define ADDOP_JABS(C, OP, O) { \
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001108 if (!compiler_addop_j((C), (OP), (O), 1)) \
1109 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001110}
1111
1112#define ADDOP_JREL(C, OP, O) { \
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001113 if (!compiler_addop_j((C), (OP), (O), 0)) \
1114 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001115}
1116
1117/* VISIT and VISIT_SEQ takes an ASDL type as their second argument. They use
1118 the ASDL name to synthesize the name of the C type and the visit function.
1119*/
1120
1121#define VISIT(C, TYPE, V) {\
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001122 if (!compiler_visit_ ## TYPE((C), (V))) \
1123 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001124}
1125
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001126#define VISIT_IN_SCOPE(C, TYPE, V) {\
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001127 if (!compiler_visit_ ## TYPE((C), (V))) { \
1128 compiler_exit_scope(c); \
1129 return 0; \
1130 } \
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001131}
1132
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001133#define VISIT_SLICE(C, V, CTX) {\
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001134 if (!compiler_visit_slice((C), (V), (CTX))) \
1135 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001136}
1137
1138#define VISIT_SEQ(C, TYPE, SEQ) { \
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001139 int _i; \
1140 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
1141 for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \
1142 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \
1143 if (!compiler_visit_ ## TYPE((C), elt)) \
1144 return 0; \
1145 } \
Anthony Baxter7b782b62006-04-11 12:01:56 +00001146}
1147
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001148#define VISIT_SEQ_IN_SCOPE(C, TYPE, SEQ) { \
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001149 int _i; \
1150 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
1151 for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \
1152 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \
1153 if (!compiler_visit_ ## TYPE((C), elt)) { \
1154 compiler_exit_scope(c); \
1155 return 0; \
1156 } \
1157 } \
Anthony Baxter7b782b62006-04-11 12:01:56 +00001158}
1159
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001160static int
1161compiler_isdocstring(stmt_ty s)
1162{
1163 if (s->kind != Expr_kind)
Antoine Pitrouc31616d2010-06-22 21:47:04 +00001164 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001165 return s->v.Expr.value->kind == Str_kind;
1166}
1167
1168/* Compile a sequence of statements, checking for a docstring. */
1169
1170static int
1171compiler_body(struct compiler *c, asdl_seq *stmts)
1172{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001173 int i = 0;
1174 stmt_ty st;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001175
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001176 if (!asdl_seq_LEN(stmts))
1177 return 1;
1178 st = (stmt_ty)asdl_seq_GET(stmts, 0);
1179 if (compiler_isdocstring(st) && Py_OptimizeFlag < 2) {
1180 /* don't generate docstrings if -OO */
1181 i = 1;
1182 VISIT(c, expr, st->v.Expr.value);
1183 if (!compiler_nameop(c, __doc__, Store))
1184 return 0;
1185 }
1186 for (; i < asdl_seq_LEN(stmts); i++)
1187 VISIT(c, stmt, (stmt_ty)asdl_seq_GET(stmts, i));
1188 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001189}
1190
1191static PyCodeObject *
1192compiler_mod(struct compiler *c, mod_ty mod)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001193{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001194 PyCodeObject *co;
1195 int addNone = 1;
1196 static PyObject *module;
1197 if (!module) {
1198 module = PyString_InternFromString("<module>");
1199 if (!module)
1200 return NULL;
1201 }
1202 /* Use 0 for firstlineno initially, will fixup in assemble(). */
1203 if (!compiler_enter_scope(c, module, mod, 0))
1204 return NULL;
1205 switch (mod->kind) {
1206 case Module_kind:
1207 if (!compiler_body(c, mod->v.Module.body)) {
1208 compiler_exit_scope(c);
1209 return 0;
1210 }
1211 break;
1212 case Interactive_kind:
1213 c->c_interactive = 1;
1214 VISIT_SEQ_IN_SCOPE(c, stmt,
1215 mod->v.Interactive.body);
1216 break;
1217 case Expression_kind:
1218 VISIT_IN_SCOPE(c, expr, mod->v.Expression.body);
1219 addNone = 0;
1220 break;
1221 case Suite_kind:
1222 PyErr_SetString(PyExc_SystemError,
1223 "suite should not be possible");
1224 return 0;
1225 default:
1226 PyErr_Format(PyExc_SystemError,
1227 "module kind %d should not be possible",
1228 mod->kind);
1229 return 0;
1230 }
1231 co = assemble(c, addNone);
1232 compiler_exit_scope(c);
1233 return co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001234}
1235
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001236/* The test for LOCAL must come before the test for FREE in order to
1237 handle classes where name is both local and free. The local var is
1238 a method and the free var is a free var referenced within a method.
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001239*/
1240
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001241static int
1242get_ref_type(struct compiler *c, PyObject *name)
1243{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001244 int scope = PyST_GetScope(c->u->u_ste, name);
1245 if (scope == 0) {
1246 char buf[350];
1247 PyOS_snprintf(buf, sizeof(buf),
1248 "unknown scope for %.100s in %.100s(%s) in %s\n"
1249 "symbols: %s\nlocals: %s\nglobals: %s\n",
1250 PyString_AS_STRING(name),
1251 PyString_AS_STRING(c->u->u_name),
1252 PyObject_REPR(c->u->u_ste->ste_id),
1253 c->c_filename,
1254 PyObject_REPR(c->u->u_ste->ste_symbols),
1255 PyObject_REPR(c->u->u_varnames),
1256 PyObject_REPR(c->u->u_names)
1257 );
1258 Py_FatalError(buf);
1259 }
Tim Peters2a7f3842001-06-09 09:26:21 +00001260
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001261 return scope;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001262}
1263
1264static int
1265compiler_lookup_arg(PyObject *dict, PyObject *name)
1266{
1267 PyObject *k, *v;
Georg Brandl7784f122006-05-26 20:04:44 +00001268 k = PyTuple_Pack(2, name, name->ob_type);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001269 if (k == NULL)
Antoine Pitrouc31616d2010-06-22 21:47:04 +00001270 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001271 v = PyDict_GetItem(dict, k);
Neal Norwitz3715c3e2005-11-24 22:09:18 +00001272 Py_DECREF(k);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001273 if (v == NULL)
Antoine Pitrouc31616d2010-06-22 21:47:04 +00001274 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001275 return PyInt_AS_LONG(v);
1276}
1277
1278static int
1279compiler_make_closure(struct compiler *c, PyCodeObject *co, int args)
1280{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001281 int i, free = PyCode_GetNumFree(co);
1282 if (free == 0) {
1283 ADDOP_O(c, LOAD_CONST, (PyObject*)co, consts);
1284 ADDOP_I(c, MAKE_FUNCTION, args);
1285 return 1;
1286 }
1287 for (i = 0; i < free; ++i) {
1288 /* Bypass com_addop_varname because it will generate
1289 LOAD_DEREF but LOAD_CLOSURE is needed.
1290 */
1291 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
1292 int arg, reftype;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001293
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001294 /* Special case: If a class contains a method with a
1295 free variable that has the same name as a method,
1296 the name will be considered free *and* local in the
1297 class. It should be handled by the closure, as
1298 well as by the normal name loookup logic.
1299 */
1300 reftype = get_ref_type(c, name);
1301 if (reftype == CELL)
1302 arg = compiler_lookup_arg(c->u->u_cellvars, name);
1303 else /* (reftype == FREE) */
1304 arg = compiler_lookup_arg(c->u->u_freevars, name);
1305 if (arg == -1) {
1306 printf("lookup %s in %s %d %d\n"
1307 "freevars of %s: %s\n",
1308 PyObject_REPR(name),
1309 PyString_AS_STRING(c->u->u_name),
1310 reftype, arg,
1311 PyString_AS_STRING(co->co_name),
1312 PyObject_REPR(co->co_freevars));
1313 Py_FatalError("compiler_make_closure()");
1314 }
1315 ADDOP_I(c, LOAD_CLOSURE, arg);
1316 }
1317 ADDOP_I(c, BUILD_TUPLE, free);
1318 ADDOP_O(c, LOAD_CONST, (PyObject*)co, consts);
1319 ADDOP_I(c, MAKE_CLOSURE, args);
1320 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001321}
1322
1323static int
1324compiler_decorators(struct compiler *c, asdl_seq* decos)
1325{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001326 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001327
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001328 if (!decos)
1329 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001330
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001331 for (i = 0; i < asdl_seq_LEN(decos); i++) {
1332 VISIT(c, expr, (expr_ty)asdl_seq_GET(decos, i));
1333 }
1334 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001335}
1336
1337static int
1338compiler_arguments(struct compiler *c, arguments_ty args)
1339{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001340 int i;
1341 int n = asdl_seq_LEN(args->args);
1342 /* Correctly handle nested argument lists */
1343 for (i = 0; i < n; i++) {
1344 expr_ty arg = (expr_ty)asdl_seq_GET(args->args, i);
1345 if (arg->kind == Tuple_kind) {
1346 PyObject *id = PyString_FromFormat(".%d", i);
1347 if (id == NULL) {
1348 return 0;
1349 }
1350 if (!compiler_nameop(c, id, Load)) {
1351 Py_DECREF(id);
1352 return 0;
1353 }
1354 Py_DECREF(id);
1355 VISIT(c, expr, arg);
1356 }
1357 }
1358 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001359}
1360
1361static int
1362compiler_function(struct compiler *c, stmt_ty s)
1363{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001364 PyCodeObject *co;
1365 PyObject *first_const = Py_None;
1366 arguments_ty args = s->v.FunctionDef.args;
1367 asdl_seq* decos = s->v.FunctionDef.decorator_list;
1368 stmt_ty st;
1369 int i, n, docstring;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001370
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001371 assert(s->kind == FunctionDef_kind);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001372
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001373 if (!compiler_decorators(c, decos))
1374 return 0;
1375 if (args->defaults)
1376 VISIT_SEQ(c, expr, args->defaults);
1377 if (!compiler_enter_scope(c, s->v.FunctionDef.name, (void *)s,
1378 s->lineno))
1379 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001380
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001381 st = (stmt_ty)asdl_seq_GET(s->v.FunctionDef.body, 0);
1382 docstring = compiler_isdocstring(st);
1383 if (docstring && Py_OptimizeFlag < 2)
1384 first_const = st->v.Expr.value->v.Str.s;
1385 if (compiler_add_o(c, c->u->u_consts, first_const) < 0) {
1386 compiler_exit_scope(c);
1387 return 0;
1388 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001389
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001390 /* unpack nested arguments */
1391 compiler_arguments(c, args);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001392
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001393 c->u->u_argcount = asdl_seq_LEN(args->args);
1394 n = asdl_seq_LEN(s->v.FunctionDef.body);
1395 /* if there was a docstring, we need to skip the first statement */
1396 for (i = docstring; i < n; i++) {
1397 st = (stmt_ty)asdl_seq_GET(s->v.FunctionDef.body, i);
1398 VISIT_IN_SCOPE(c, stmt, st);
1399 }
1400 co = assemble(c, 1);
1401 compiler_exit_scope(c);
1402 if (co == NULL)
1403 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001404
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001405 compiler_make_closure(c, co, asdl_seq_LEN(args->defaults));
1406 Py_DECREF(co);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001407
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001408 for (i = 0; i < asdl_seq_LEN(decos); i++) {
1409 ADDOP_I(c, CALL_FUNCTION, 1);
1410 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001411
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001412 return compiler_nameop(c, s->v.FunctionDef.name, Store);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001413}
1414
1415static int
1416compiler_class(struct compiler *c, stmt_ty s)
1417{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001418 int n, i;
1419 PyCodeObject *co;
1420 PyObject *str;
1421 asdl_seq* decos = s->v.ClassDef.decorator_list;
Christian Heimes5224d282008-02-23 15:01:05 +00001422
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001423 if (!compiler_decorators(c, decos))
1424 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001425
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001426 /* push class name on stack, needed by BUILD_CLASS */
1427 ADDOP_O(c, LOAD_CONST, s->v.ClassDef.name, consts);
1428 /* push the tuple of base classes on the stack */
1429 n = asdl_seq_LEN(s->v.ClassDef.bases);
1430 if (n > 0)
1431 VISIT_SEQ(c, expr, s->v.ClassDef.bases);
1432 ADDOP_I(c, BUILD_TUPLE, n);
1433 if (!compiler_enter_scope(c, s->v.ClassDef.name, (void *)s,
1434 s->lineno))
1435 return 0;
1436 Py_XDECREF(c->u->u_private);
1437 c->u->u_private = s->v.ClassDef.name;
1438 Py_INCREF(c->u->u_private);
1439 str = PyString_InternFromString("__name__");
1440 if (!str || !compiler_nameop(c, str, Load)) {
1441 Py_XDECREF(str);
1442 compiler_exit_scope(c);
1443 return 0;
1444 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001445
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001446 Py_DECREF(str);
1447 str = PyString_InternFromString("__module__");
1448 if (!str || !compiler_nameop(c, str, Store)) {
1449 Py_XDECREF(str);
1450 compiler_exit_scope(c);
1451 return 0;
1452 }
1453 Py_DECREF(str);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001454
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001455 if (!compiler_body(c, s->v.ClassDef.body)) {
1456 compiler_exit_scope(c);
1457 return 0;
1458 }
Neal Norwitz4737b232005-11-19 23:58:29 +00001459
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001460 ADDOP_IN_SCOPE(c, LOAD_LOCALS);
1461 ADDOP_IN_SCOPE(c, RETURN_VALUE);
1462 co = assemble(c, 1);
1463 compiler_exit_scope(c);
1464 if (co == NULL)
1465 return 0;
1466
1467 compiler_make_closure(c, co, 0);
1468 Py_DECREF(co);
1469
1470 ADDOP_I(c, CALL_FUNCTION, 0);
1471 ADDOP(c, BUILD_CLASS);
1472 /* apply decorators */
1473 for (i = 0; i < asdl_seq_LEN(decos); i++) {
1474 ADDOP_I(c, CALL_FUNCTION, 1);
1475 }
1476 if (!compiler_nameop(c, s->v.ClassDef.name, Store))
1477 return 0;
1478 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001479}
1480
1481static int
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001482compiler_ifexp(struct compiler *c, expr_ty e)
1483{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001484 basicblock *end, *next;
1485
1486 assert(e->kind == IfExp_kind);
1487 end = compiler_new_block(c);
1488 if (end == NULL)
1489 return 0;
1490 next = compiler_new_block(c);
1491 if (next == NULL)
1492 return 0;
1493 VISIT(c, expr, e->v.IfExp.test);
1494 ADDOP_JREL(c, JUMP_IF_FALSE, next);
1495 ADDOP(c, POP_TOP);
1496 VISIT(c, expr, e->v.IfExp.body);
1497 ADDOP_JREL(c, JUMP_FORWARD, end);
1498 compiler_use_next_block(c, next);
1499 ADDOP(c, POP_TOP);
1500 VISIT(c, expr, e->v.IfExp.orelse);
1501 compiler_use_next_block(c, end);
1502 return 1;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001503}
1504
1505static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001506compiler_lambda(struct compiler *c, expr_ty e)
1507{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001508 PyCodeObject *co;
1509 static identifier name;
1510 arguments_ty args = e->v.Lambda.args;
1511 assert(e->kind == Lambda_kind);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001512
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001513 if (!name) {
1514 name = PyString_InternFromString("<lambda>");
1515 if (!name)
1516 return 0;
1517 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001518
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001519 if (args->defaults)
1520 VISIT_SEQ(c, expr, args->defaults);
1521 if (!compiler_enter_scope(c, name, (void *)e, e->lineno))
1522 return 0;
Neal Norwitz4737b232005-11-19 23:58:29 +00001523
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001524 /* unpack nested arguments */
1525 compiler_arguments(c, args);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001526
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001527 c->u->u_argcount = asdl_seq_LEN(args->args);
1528 VISIT_IN_SCOPE(c, expr, e->v.Lambda.body);
1529 ADDOP_IN_SCOPE(c, RETURN_VALUE);
1530 co = assemble(c, 1);
1531 compiler_exit_scope(c);
1532 if (co == NULL)
1533 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001534
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001535 compiler_make_closure(c, co, asdl_seq_LEN(args->defaults));
1536 Py_DECREF(co);
1537
1538 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001539}
1540
1541static int
1542compiler_print(struct compiler *c, stmt_ty s)
1543{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001544 int i, n;
1545 bool dest;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001546
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001547 assert(s->kind == Print_kind);
1548 n = asdl_seq_LEN(s->v.Print.values);
1549 dest = false;
1550 if (s->v.Print.dest) {
1551 VISIT(c, expr, s->v.Print.dest);
1552 dest = true;
1553 }
1554 for (i = 0; i < n; i++) {
1555 expr_ty e = (expr_ty)asdl_seq_GET(s->v.Print.values, i);
1556 if (dest) {
1557 ADDOP(c, DUP_TOP);
1558 VISIT(c, expr, e);
1559 ADDOP(c, ROT_TWO);
1560 ADDOP(c, PRINT_ITEM_TO);
1561 }
1562 else {
1563 VISIT(c, expr, e);
1564 ADDOP(c, PRINT_ITEM);
1565 }
1566 }
1567 if (s->v.Print.nl) {
1568 if (dest)
1569 ADDOP(c, PRINT_NEWLINE_TO)
1570 else
1571 ADDOP(c, PRINT_NEWLINE)
1572 }
1573 else if (dest)
1574 ADDOP(c, POP_TOP);
1575 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001576}
1577
1578static int
1579compiler_if(struct compiler *c, stmt_ty s)
1580{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001581 basicblock *end, *next;
1582 int constant;
1583 assert(s->kind == If_kind);
1584 end = compiler_new_block(c);
1585 if (end == NULL)
1586 return 0;
1587 next = compiler_new_block(c);
1588 if (next == NULL)
1589 return 0;
1590
1591 constant = expr_constant(s->v.If.test);
1592 /* constant = 0: "if 0"
1593 * constant = 1: "if 1", "if 2", ...
1594 * constant = -1: rest */
1595 if (constant == 0) {
1596 if (s->v.If.orelse)
1597 VISIT_SEQ(c, stmt, s->v.If.orelse);
1598 } else if (constant == 1) {
1599 VISIT_SEQ(c, stmt, s->v.If.body);
1600 } else {
1601 VISIT(c, expr, s->v.If.test);
1602 ADDOP_JREL(c, JUMP_IF_FALSE, next);
1603 ADDOP(c, POP_TOP);
1604 VISIT_SEQ(c, stmt, s->v.If.body);
1605 ADDOP_JREL(c, JUMP_FORWARD, end);
1606 compiler_use_next_block(c, next);
1607 ADDOP(c, POP_TOP);
1608 if (s->v.If.orelse)
1609 VISIT_SEQ(c, stmt, s->v.If.orelse);
1610 }
1611 compiler_use_next_block(c, end);
1612 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001613}
1614
1615static int
1616compiler_for(struct compiler *c, stmt_ty s)
1617{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001618 basicblock *start, *cleanup, *end;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001619
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001620 start = compiler_new_block(c);
1621 cleanup = compiler_new_block(c);
1622 end = compiler_new_block(c);
1623 if (start == NULL || end == NULL || cleanup == NULL)
1624 return 0;
1625 ADDOP_JREL(c, SETUP_LOOP, end);
1626 if (!compiler_push_fblock(c, LOOP, start))
1627 return 0;
1628 VISIT(c, expr, s->v.For.iter);
1629 ADDOP(c, GET_ITER);
1630 compiler_use_next_block(c, start);
1631 /* for expressions must be traced on each iteration,
1632 so we need to set an extra line number. */
1633 c->u->u_lineno_set = false;
1634 ADDOP_JREL(c, FOR_ITER, cleanup);
1635 VISIT(c, expr, s->v.For.target);
1636 VISIT_SEQ(c, stmt, s->v.For.body);
1637 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
1638 compiler_use_next_block(c, cleanup);
1639 ADDOP(c, POP_BLOCK);
1640 compiler_pop_fblock(c, LOOP, start);
1641 VISIT_SEQ(c, stmt, s->v.For.orelse);
1642 compiler_use_next_block(c, end);
1643 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001644}
1645
1646static int
1647compiler_while(struct compiler *c, stmt_ty s)
1648{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001649 basicblock *loop, *orelse, *end, *anchor = NULL;
1650 int constant = expr_constant(s->v.While.test);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001651
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001652 if (constant == 0) {
1653 if (s->v.While.orelse)
1654 VISIT_SEQ(c, stmt, s->v.While.orelse);
1655 return 1;
1656 }
1657 loop = compiler_new_block(c);
1658 end = compiler_new_block(c);
1659 if (constant == -1) {
1660 anchor = compiler_new_block(c);
1661 if (anchor == NULL)
1662 return 0;
1663 }
1664 if (loop == NULL || end == NULL)
1665 return 0;
1666 if (s->v.While.orelse) {
1667 orelse = compiler_new_block(c);
1668 if (orelse == NULL)
1669 return 0;
1670 }
1671 else
1672 orelse = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001673
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001674 ADDOP_JREL(c, SETUP_LOOP, end);
1675 compiler_use_next_block(c, loop);
1676 if (!compiler_push_fblock(c, LOOP, loop))
1677 return 0;
1678 if (constant == -1) {
1679 /* while expressions must be traced on each iteration,
1680 so we need to set an extra line number. */
1681 c->u->u_lineno_set = false;
1682 VISIT(c, expr, s->v.While.test);
1683 ADDOP_JREL(c, JUMP_IF_FALSE, anchor);
1684 ADDOP(c, POP_TOP);
1685 }
1686 VISIT_SEQ(c, stmt, s->v.While.body);
1687 ADDOP_JABS(c, JUMP_ABSOLUTE, loop);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001688
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001689 /* XXX should the two POP instructions be in a separate block
1690 if there is no else clause ?
1691 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001692
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001693 if (constant == -1) {
1694 compiler_use_next_block(c, anchor);
1695 ADDOP(c, POP_TOP);
1696 ADDOP(c, POP_BLOCK);
1697 }
1698 compiler_pop_fblock(c, LOOP, loop);
1699 if (orelse != NULL) /* what if orelse is just pass? */
1700 VISIT_SEQ(c, stmt, s->v.While.orelse);
1701 compiler_use_next_block(c, end);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001702
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001703 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001704}
1705
1706static int
1707compiler_continue(struct compiler *c)
1708{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001709 static const char LOOP_ERROR_MSG[] = "'continue' not properly in loop";
1710 static const char IN_FINALLY_ERROR_MSG[] =
1711 "'continue' not supported inside 'finally' clause";
1712 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001713
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001714 if (!c->u->u_nfblocks)
1715 return compiler_error(c, LOOP_ERROR_MSG);
1716 i = c->u->u_nfblocks - 1;
1717 switch (c->u->u_fblock[i].fb_type) {
1718 case LOOP:
1719 ADDOP_JABS(c, JUMP_ABSOLUTE, c->u->u_fblock[i].fb_block);
1720 break;
1721 case EXCEPT:
1722 case FINALLY_TRY:
1723 while (--i >= 0 && c->u->u_fblock[i].fb_type != LOOP) {
1724 /* Prevent continue anywhere under a finally
1725 even if hidden in a sub-try or except. */
1726 if (c->u->u_fblock[i].fb_type == FINALLY_END)
1727 return compiler_error(c, IN_FINALLY_ERROR_MSG);
1728 }
1729 if (i == -1)
1730 return compiler_error(c, LOOP_ERROR_MSG);
1731 ADDOP_JABS(c, CONTINUE_LOOP, c->u->u_fblock[i].fb_block);
1732 break;
1733 case FINALLY_END:
1734 return compiler_error(c, IN_FINALLY_ERROR_MSG);
1735 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001736
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001737 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001738}
1739
1740/* Code generated for "try: <body> finally: <finalbody>" is as follows:
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001741
1742 SETUP_FINALLY L
1743 <code for body>
1744 POP_BLOCK
1745 LOAD_CONST <None>
1746 L: <code for finalbody>
1747 END_FINALLY
1748
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001749 The special instructions use the block stack. Each block
1750 stack entry contains the instruction that created it (here
1751 SETUP_FINALLY), the level of the value stack at the time the
1752 block stack entry was created, and a label (here L).
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001753
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001754 SETUP_FINALLY:
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001755 Pushes the current value stack level and the label
1756 onto the block stack.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001757 POP_BLOCK:
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001758 Pops en entry from the block stack, and pops the value
1759 stack until its level is the same as indicated on the
1760 block stack. (The label is ignored.)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001761 END_FINALLY:
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001762 Pops a variable number of entries from the *value* stack
1763 and re-raises the exception they specify. The number of
1764 entries popped depends on the (pseudo) exception type.
1765
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001766 The block stack is unwound when an exception is raised:
1767 when a SETUP_FINALLY entry is found, the exception is pushed
1768 onto the value stack (and the exception condition is cleared),
1769 and the interpreter jumps to the label gotten from the block
1770 stack.
1771*/
1772
1773static int
1774compiler_try_finally(struct compiler *c, stmt_ty s)
1775{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001776 basicblock *body, *end;
1777 body = compiler_new_block(c);
1778 end = compiler_new_block(c);
1779 if (body == NULL || end == NULL)
1780 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001781
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001782 ADDOP_JREL(c, SETUP_FINALLY, end);
1783 compiler_use_next_block(c, body);
1784 if (!compiler_push_fblock(c, FINALLY_TRY, body))
1785 return 0;
1786 VISIT_SEQ(c, stmt, s->v.TryFinally.body);
1787 ADDOP(c, POP_BLOCK);
1788 compiler_pop_fblock(c, FINALLY_TRY, body);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001789
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001790 ADDOP_O(c, LOAD_CONST, Py_None, consts);
1791 compiler_use_next_block(c, end);
1792 if (!compiler_push_fblock(c, FINALLY_END, end))
1793 return 0;
1794 VISIT_SEQ(c, stmt, s->v.TryFinally.finalbody);
1795 ADDOP(c, END_FINALLY);
1796 compiler_pop_fblock(c, FINALLY_END, end);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001797
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001798 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001799}
1800
1801/*
1802 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
1803 (The contents of the value stack is shown in [], with the top
1804 at the right; 'tb' is trace-back info, 'val' the exception's
1805 associated value, and 'exc' the exception.)
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001806
1807 Value stack Label Instruction Argument
1808 [] SETUP_EXCEPT L1
1809 [] <code for S>
1810 [] POP_BLOCK
1811 [] JUMP_FORWARD L0
1812
1813 [tb, val, exc] L1: DUP )
1814 [tb, val, exc, exc] <evaluate E1> )
1815 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
1816 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
1817 [tb, val, exc, 1] POP )
1818 [tb, val, exc] POP
1819 [tb, val] <assign to V1> (or POP if no V1)
1820 [tb] POP
1821 [] <code for S1>
1822 JUMP_FORWARD L0
1823
1824 [tb, val, exc, 0] L2: POP
1825 [tb, val, exc] DUP
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001826 .............................etc.......................
1827
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001828 [tb, val, exc, 0] Ln+1: POP
1829 [tb, val, exc] END_FINALLY # re-raise exception
1830
1831 [] L0: <next statement>
1832
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001833 Of course, parts are not generated if Vi or Ei is not present.
1834*/
1835static int
1836compiler_try_except(struct compiler *c, stmt_ty s)
1837{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001838 basicblock *body, *orelse, *except, *end;
1839 int i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001840
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001841 body = compiler_new_block(c);
1842 except = compiler_new_block(c);
1843 orelse = compiler_new_block(c);
1844 end = compiler_new_block(c);
1845 if (body == NULL || except == NULL || orelse == NULL || end == NULL)
1846 return 0;
1847 ADDOP_JREL(c, SETUP_EXCEPT, except);
1848 compiler_use_next_block(c, body);
1849 if (!compiler_push_fblock(c, EXCEPT, body))
1850 return 0;
1851 VISIT_SEQ(c, stmt, s->v.TryExcept.body);
1852 ADDOP(c, POP_BLOCK);
1853 compiler_pop_fblock(c, EXCEPT, body);
1854 ADDOP_JREL(c, JUMP_FORWARD, orelse);
1855 n = asdl_seq_LEN(s->v.TryExcept.handlers);
1856 compiler_use_next_block(c, except);
1857 for (i = 0; i < n; i++) {
1858 excepthandler_ty handler = (excepthandler_ty)asdl_seq_GET(
1859 s->v.TryExcept.handlers, i);
1860 if (!handler->v.ExceptHandler.type && i < n-1)
1861 return compiler_error(c, "default 'except:' must be last");
1862 c->u->u_lineno_set = false;
1863 c->u->u_lineno = handler->lineno;
1864 except = compiler_new_block(c);
1865 if (except == NULL)
1866 return 0;
1867 if (handler->v.ExceptHandler.type) {
1868 ADDOP(c, DUP_TOP);
1869 VISIT(c, expr, handler->v.ExceptHandler.type);
1870 ADDOP_I(c, COMPARE_OP, PyCmp_EXC_MATCH);
1871 ADDOP_JREL(c, JUMP_IF_FALSE, except);
1872 ADDOP(c, POP_TOP);
1873 }
1874 ADDOP(c, POP_TOP);
1875 if (handler->v.ExceptHandler.name) {
1876 VISIT(c, expr, handler->v.ExceptHandler.name);
1877 }
1878 else {
1879 ADDOP(c, POP_TOP);
1880 }
1881 ADDOP(c, POP_TOP);
1882 VISIT_SEQ(c, stmt, handler->v.ExceptHandler.body);
1883 ADDOP_JREL(c, JUMP_FORWARD, end);
1884 compiler_use_next_block(c, except);
1885 if (handler->v.ExceptHandler.type)
1886 ADDOP(c, POP_TOP);
1887 }
1888 ADDOP(c, END_FINALLY);
1889 compiler_use_next_block(c, orelse);
1890 VISIT_SEQ(c, stmt, s->v.TryExcept.orelse);
1891 compiler_use_next_block(c, end);
1892 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001893}
1894
1895static int
1896compiler_import_as(struct compiler *c, identifier name, identifier asname)
1897{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001898 /* The IMPORT_NAME opcode was already generated. This function
1899 merely needs to bind the result to a name.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001900
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001901 If there is a dot in name, we need to split it and emit a
1902 LOAD_ATTR for each name.
1903 */
1904 const char *src = PyString_AS_STRING(name);
1905 const char *dot = strchr(src, '.');
1906 if (dot) {
1907 /* Consume the base module name to get the first attribute */
1908 src = dot + 1;
1909 while (dot) {
1910 /* NB src is only defined when dot != NULL */
1911 PyObject *attr;
1912 dot = strchr(src, '.');
1913 attr = PyString_FromStringAndSize(src,
1914 dot ? dot - src : strlen(src));
1915 if (!attr)
1916 return -1;
1917 ADDOP_O(c, LOAD_ATTR, attr, names);
1918 Py_DECREF(attr);
1919 src = dot + 1;
1920 }
1921 }
1922 return compiler_nameop(c, asname, Store);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001923}
1924
1925static int
1926compiler_import(struct compiler *c, stmt_ty s)
1927{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001928 /* The Import node stores a module name like a.b.c as a single
1929 string. This is convenient for all cases except
1930 import a.b.c as d
1931 where we need to parse that string to extract the individual
1932 module names.
1933 XXX Perhaps change the representation to make this case simpler?
1934 */
1935 int i, n = asdl_seq_LEN(s->v.Import.names);
Thomas Woutersf7f438b2006-02-28 16:09:29 +00001936
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001937 for (i = 0; i < n; i++) {
1938 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.Import.names, i);
1939 int r;
1940 PyObject *level;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001941
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001942 if (c->c_flags && (c->c_flags->cf_flags & CO_FUTURE_ABSOLUTE_IMPORT))
1943 level = PyInt_FromLong(0);
1944 else
1945 level = PyInt_FromLong(-1);
Thomas Woutersf7f438b2006-02-28 16:09:29 +00001946
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001947 if (level == NULL)
1948 return 0;
Thomas Woutersf7f438b2006-02-28 16:09:29 +00001949
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001950 ADDOP_O(c, LOAD_CONST, level, consts);
1951 Py_DECREF(level);
1952 ADDOP_O(c, LOAD_CONST, Py_None, consts);
1953 ADDOP_NAME(c, IMPORT_NAME, alias->name, names);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001954
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001955 if (alias->asname) {
1956 r = compiler_import_as(c, alias->name, alias->asname);
1957 if (!r)
1958 return r;
1959 }
1960 else {
1961 identifier tmp = alias->name;
1962 const char *base = PyString_AS_STRING(alias->name);
1963 char *dot = strchr(base, '.');
1964 if (dot)
1965 tmp = PyString_FromStringAndSize(base,
1966 dot - base);
1967 r = compiler_nameop(c, tmp, Store);
1968 if (dot) {
1969 Py_DECREF(tmp);
1970 }
1971 if (!r)
1972 return r;
1973 }
1974 }
1975 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001976}
1977
1978static int
1979compiler_from_import(struct compiler *c, stmt_ty s)
1980{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001981 int i, n = asdl_seq_LEN(s->v.ImportFrom.names);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001982
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001983 PyObject *names = PyTuple_New(n);
1984 PyObject *level;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001985
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001986 if (!names)
1987 return 0;
Thomas Woutersf7f438b2006-02-28 16:09:29 +00001988
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001989 if (s->v.ImportFrom.level == 0 && c->c_flags &&
1990 !(c->c_flags->cf_flags & CO_FUTURE_ABSOLUTE_IMPORT))
1991 level = PyInt_FromLong(-1);
1992 else
1993 level = PyInt_FromLong(s->v.ImportFrom.level);
Thomas Woutersf7f438b2006-02-28 16:09:29 +00001994
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001995 if (!level) {
1996 Py_DECREF(names);
1997 return 0;
1998 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001999
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002000 /* build up the names */
2001 for (i = 0; i < n; i++) {
2002 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);
2003 Py_INCREF(alias->name);
2004 PyTuple_SET_ITEM(names, i, alias->name);
2005 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002006
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002007 if (s->lineno > c->c_future->ff_lineno) {
2008 if (!strcmp(PyString_AS_STRING(s->v.ImportFrom.module),
2009 "__future__")) {
2010 Py_DECREF(level);
2011 Py_DECREF(names);
2012 return compiler_error(c,
2013 "from __future__ imports must occur "
2014 "at the beginning of the file");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002015
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002016 }
2017 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002018
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002019 ADDOP_O(c, LOAD_CONST, level, consts);
2020 Py_DECREF(level);
2021 ADDOP_O(c, LOAD_CONST, names, consts);
2022 Py_DECREF(names);
2023 ADDOP_NAME(c, IMPORT_NAME, s->v.ImportFrom.module, names);
2024 for (i = 0; i < n; i++) {
2025 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);
2026 identifier store_name;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002027
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002028 if (i == 0 && *PyString_AS_STRING(alias->name) == '*') {
2029 assert(n == 1);
2030 ADDOP(c, IMPORT_STAR);
2031 return 1;
2032 }
2033
2034 ADDOP_NAME(c, IMPORT_FROM, alias->name, names);
2035 store_name = alias->name;
2036 if (alias->asname)
2037 store_name = alias->asname;
2038
2039 if (!compiler_nameop(c, store_name, Store)) {
2040 Py_DECREF(names);
2041 return 0;
2042 }
2043 }
2044 /* remove imported module */
2045 ADDOP(c, POP_TOP);
2046 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002047}
2048
2049static int
2050compiler_assert(struct compiler *c, stmt_ty s)
2051{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002052 static PyObject *assertion_error = NULL;
2053 basicblock *end;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002054
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002055 if (Py_OptimizeFlag)
2056 return 1;
2057 if (assertion_error == NULL) {
2058 assertion_error = PyString_InternFromString("AssertionError");
2059 if (assertion_error == NULL)
2060 return 0;
2061 }
2062 if (s->v.Assert.test->kind == Tuple_kind &&
2063 asdl_seq_LEN(s->v.Assert.test->v.Tuple.elts) > 0) {
2064 const char* msg =
2065 "assertion is always true, perhaps remove parentheses?";
2066 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, c->c_filename,
2067 c->u->u_lineno, NULL, NULL) == -1)
2068 return 0;
2069 }
2070 VISIT(c, expr, s->v.Assert.test);
2071 end = compiler_new_block(c);
2072 if (end == NULL)
2073 return 0;
2074 ADDOP_JREL(c, JUMP_IF_TRUE, end);
2075 ADDOP(c, POP_TOP);
2076 ADDOP_O(c, LOAD_GLOBAL, assertion_error, names);
2077 if (s->v.Assert.msg) {
2078 VISIT(c, expr, s->v.Assert.msg);
2079 ADDOP_I(c, RAISE_VARARGS, 2);
2080 }
2081 else {
2082 ADDOP_I(c, RAISE_VARARGS, 1);
2083 }
2084 compiler_use_next_block(c, end);
2085 ADDOP(c, POP_TOP);
2086 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002087}
2088
2089static int
2090compiler_visit_stmt(struct compiler *c, stmt_ty s)
2091{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002092 int i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002093
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002094 /* Always assign a lineno to the next instruction for a stmt. */
2095 c->u->u_lineno = s->lineno;
2096 c->u->u_lineno_set = false;
Jeremy Hylton12603c42006-04-01 16:18:02 +00002097
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002098 switch (s->kind) {
2099 case FunctionDef_kind:
2100 return compiler_function(c, s);
2101 case ClassDef_kind:
2102 return compiler_class(c, s);
2103 case Return_kind:
2104 if (c->u->u_ste->ste_type != FunctionBlock)
2105 return compiler_error(c, "'return' outside function");
2106 if (s->v.Return.value) {
2107 VISIT(c, expr, s->v.Return.value);
2108 }
2109 else
2110 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2111 ADDOP(c, RETURN_VALUE);
2112 break;
2113 case Delete_kind:
2114 VISIT_SEQ(c, expr, s->v.Delete.targets)
2115 break;
2116 case Assign_kind:
2117 n = asdl_seq_LEN(s->v.Assign.targets);
2118 VISIT(c, expr, s->v.Assign.value);
2119 for (i = 0; i < n; i++) {
2120 if (i < n - 1)
2121 ADDOP(c, DUP_TOP);
2122 VISIT(c, expr,
2123 (expr_ty)asdl_seq_GET(s->v.Assign.targets, i));
2124 }
2125 break;
2126 case AugAssign_kind:
2127 return compiler_augassign(c, s);
2128 case Print_kind:
2129 return compiler_print(c, s);
2130 case For_kind:
2131 return compiler_for(c, s);
2132 case While_kind:
2133 return compiler_while(c, s);
2134 case If_kind:
2135 return compiler_if(c, s);
2136 case Raise_kind:
2137 n = 0;
2138 if (s->v.Raise.type) {
2139 VISIT(c, expr, s->v.Raise.type);
2140 n++;
2141 if (s->v.Raise.inst) {
2142 VISIT(c, expr, s->v.Raise.inst);
2143 n++;
2144 if (s->v.Raise.tback) {
2145 VISIT(c, expr, s->v.Raise.tback);
2146 n++;
2147 }
2148 }
2149 }
2150 ADDOP_I(c, RAISE_VARARGS, n);
2151 break;
2152 case TryExcept_kind:
2153 return compiler_try_except(c, s);
2154 case TryFinally_kind:
2155 return compiler_try_finally(c, s);
2156 case Assert_kind:
2157 return compiler_assert(c, s);
2158 case Import_kind:
2159 return compiler_import(c, s);
2160 case ImportFrom_kind:
2161 return compiler_from_import(c, s);
2162 case Exec_kind:
2163 VISIT(c, expr, s->v.Exec.body);
2164 if (s->v.Exec.globals) {
2165 VISIT(c, expr, s->v.Exec.globals);
2166 if (s->v.Exec.locals) {
2167 VISIT(c, expr, s->v.Exec.locals);
2168 } else {
2169 ADDOP(c, DUP_TOP);
2170 }
2171 } else {
2172 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2173 ADDOP(c, DUP_TOP);
2174 }
2175 ADDOP(c, EXEC_STMT);
2176 break;
2177 case Global_kind:
2178 break;
2179 case Expr_kind:
2180 if (c->c_interactive && c->c_nestlevel <= 1) {
2181 VISIT(c, expr, s->v.Expr.value);
2182 ADDOP(c, PRINT_EXPR);
2183 }
2184 else if (s->v.Expr.value->kind != Str_kind &&
2185 s->v.Expr.value->kind != Num_kind) {
2186 VISIT(c, expr, s->v.Expr.value);
2187 ADDOP(c, POP_TOP);
2188 }
2189 break;
2190 case Pass_kind:
2191 break;
2192 case Break_kind:
2193 if (!compiler_in_loop(c))
2194 return compiler_error(c, "'break' outside loop");
2195 ADDOP(c, BREAK_LOOP);
2196 break;
2197 case Continue_kind:
2198 return compiler_continue(c);
2199 case With_kind:
2200 return compiler_with(c, s);
2201 }
2202 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002203}
2204
2205static int
2206unaryop(unaryop_ty op)
2207{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002208 switch (op) {
2209 case Invert:
2210 return UNARY_INVERT;
2211 case Not:
2212 return UNARY_NOT;
2213 case UAdd:
2214 return UNARY_POSITIVE;
2215 case USub:
2216 return UNARY_NEGATIVE;
2217 default:
2218 PyErr_Format(PyExc_SystemError,
2219 "unary op %d should not be possible", op);
2220 return 0;
2221 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002222}
2223
2224static int
2225binop(struct compiler *c, operator_ty op)
2226{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002227 switch (op) {
2228 case Add:
2229 return BINARY_ADD;
2230 case Sub:
2231 return BINARY_SUBTRACT;
2232 case Mult:
2233 return BINARY_MULTIPLY;
2234 case Div:
2235 if (c->c_flags && c->c_flags->cf_flags & CO_FUTURE_DIVISION)
2236 return BINARY_TRUE_DIVIDE;
2237 else
2238 return BINARY_DIVIDE;
2239 case Mod:
2240 return BINARY_MODULO;
2241 case Pow:
2242 return BINARY_POWER;
2243 case LShift:
2244 return BINARY_LSHIFT;
2245 case RShift:
2246 return BINARY_RSHIFT;
2247 case BitOr:
2248 return BINARY_OR;
2249 case BitXor:
2250 return BINARY_XOR;
2251 case BitAnd:
2252 return BINARY_AND;
2253 case FloorDiv:
2254 return BINARY_FLOOR_DIVIDE;
2255 default:
2256 PyErr_Format(PyExc_SystemError,
2257 "binary op %d should not be possible", op);
2258 return 0;
2259 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002260}
2261
2262static int
2263cmpop(cmpop_ty op)
2264{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002265 switch (op) {
2266 case Eq:
2267 return PyCmp_EQ;
2268 case NotEq:
2269 return PyCmp_NE;
2270 case Lt:
2271 return PyCmp_LT;
2272 case LtE:
2273 return PyCmp_LE;
2274 case Gt:
2275 return PyCmp_GT;
2276 case GtE:
2277 return PyCmp_GE;
2278 case Is:
2279 return PyCmp_IS;
2280 case IsNot:
2281 return PyCmp_IS_NOT;
2282 case In:
2283 return PyCmp_IN;
2284 case NotIn:
2285 return PyCmp_NOT_IN;
2286 default:
2287 return PyCmp_BAD;
2288 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002289}
2290
2291static int
2292inplace_binop(struct compiler *c, operator_ty op)
2293{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002294 switch (op) {
2295 case Add:
2296 return INPLACE_ADD;
2297 case Sub:
2298 return INPLACE_SUBTRACT;
2299 case Mult:
2300 return INPLACE_MULTIPLY;
2301 case Div:
2302 if (c->c_flags && c->c_flags->cf_flags & CO_FUTURE_DIVISION)
2303 return INPLACE_TRUE_DIVIDE;
2304 else
2305 return INPLACE_DIVIDE;
2306 case Mod:
2307 return INPLACE_MODULO;
2308 case Pow:
2309 return INPLACE_POWER;
2310 case LShift:
2311 return INPLACE_LSHIFT;
2312 case RShift:
2313 return INPLACE_RSHIFT;
2314 case BitOr:
2315 return INPLACE_OR;
2316 case BitXor:
2317 return INPLACE_XOR;
2318 case BitAnd:
2319 return INPLACE_AND;
2320 case FloorDiv:
2321 return INPLACE_FLOOR_DIVIDE;
2322 default:
2323 PyErr_Format(PyExc_SystemError,
2324 "inplace binary op %d should not be possible", op);
2325 return 0;
2326 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002327}
2328
2329static int
2330compiler_nameop(struct compiler *c, identifier name, expr_context_ty ctx)
2331{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002332 int op, scope, arg;
2333 enum { OP_FAST, OP_GLOBAL, OP_DEREF, OP_NAME } optype;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002334
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002335 PyObject *dict = c->u->u_names;
2336 PyObject *mangled;
2337 /* XXX AugStore isn't used anywhere! */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002338
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002339 /* First check for assignment to __debug__. Param? */
2340 if ((ctx == Store || ctx == AugStore || ctx == Del)
2341 && !strcmp(PyString_AS_STRING(name), "__debug__")) {
2342 return compiler_error(c, "can not assign to __debug__");
2343 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002344
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002345 mangled = _Py_Mangle(c->u->u_private, name);
2346 if (!mangled)
2347 return 0;
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002348
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002349 op = 0;
2350 optype = OP_NAME;
2351 scope = PyST_GetScope(c->u->u_ste, mangled);
2352 switch (scope) {
2353 case FREE:
2354 dict = c->u->u_freevars;
2355 optype = OP_DEREF;
2356 break;
2357 case CELL:
2358 dict = c->u->u_cellvars;
2359 optype = OP_DEREF;
2360 break;
2361 case LOCAL:
2362 if (c->u->u_ste->ste_type == FunctionBlock)
2363 optype = OP_FAST;
2364 break;
2365 case GLOBAL_IMPLICIT:
2366 if (c->u->u_ste->ste_type == FunctionBlock &&
2367 !c->u->u_ste->ste_unoptimized)
2368 optype = OP_GLOBAL;
2369 break;
2370 case GLOBAL_EXPLICIT:
2371 optype = OP_GLOBAL;
2372 break;
2373 default:
2374 /* scope can be 0 */
2375 break;
2376 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002377
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002378 /* XXX Leave assert here, but handle __doc__ and the like better */
2379 assert(scope || PyString_AS_STRING(name)[0] == '_');
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002380
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002381 switch (optype) {
2382 case OP_DEREF:
2383 switch (ctx) {
2384 case Load: op = LOAD_DEREF; break;
2385 case Store: op = STORE_DEREF; break;
2386 case AugLoad:
2387 case AugStore:
2388 break;
2389 case Del:
2390 PyErr_Format(PyExc_SyntaxError,
2391 "can not delete variable '%s' referenced "
2392 "in nested scope",
2393 PyString_AS_STRING(name));
2394 Py_DECREF(mangled);
2395 return 0;
2396 case Param:
2397 default:
2398 PyErr_SetString(PyExc_SystemError,
2399 "param invalid for deref variable");
2400 return 0;
2401 }
2402 break;
2403 case OP_FAST:
2404 switch (ctx) {
2405 case Load: op = LOAD_FAST; break;
2406 case Store: op = STORE_FAST; break;
2407 case Del: op = DELETE_FAST; break;
2408 case AugLoad:
2409 case AugStore:
2410 break;
2411 case Param:
2412 default:
2413 PyErr_SetString(PyExc_SystemError,
2414 "param invalid for local variable");
2415 return 0;
2416 }
2417 ADDOP_O(c, op, mangled, varnames);
2418 Py_DECREF(mangled);
2419 return 1;
2420 case OP_GLOBAL:
2421 switch (ctx) {
2422 case Load: op = LOAD_GLOBAL; break;
2423 case Store: op = STORE_GLOBAL; break;
2424 case Del: op = DELETE_GLOBAL; break;
2425 case AugLoad:
2426 case AugStore:
2427 break;
2428 case Param:
2429 default:
2430 PyErr_SetString(PyExc_SystemError,
2431 "param invalid for global variable");
2432 return 0;
2433 }
2434 break;
2435 case OP_NAME:
2436 switch (ctx) {
2437 case Load: op = LOAD_NAME; break;
2438 case Store: op = STORE_NAME; break;
2439 case Del: op = DELETE_NAME; break;
2440 case AugLoad:
2441 case AugStore:
2442 break;
2443 case Param:
2444 default:
2445 PyErr_SetString(PyExc_SystemError,
2446 "param invalid for name variable");
2447 return 0;
2448 }
2449 break;
2450 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002451
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002452 assert(op);
2453 arg = compiler_add_o(c, dict, mangled);
2454 Py_DECREF(mangled);
2455 if (arg < 0)
2456 return 0;
2457 return compiler_addop_i(c, op, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002458}
2459
2460static int
2461compiler_boolop(struct compiler *c, expr_ty e)
2462{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002463 basicblock *end;
2464 int jumpi, i, n;
2465 asdl_seq *s;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002466
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002467 assert(e->kind == BoolOp_kind);
2468 if (e->v.BoolOp.op == And)
2469 jumpi = JUMP_IF_FALSE;
2470 else
2471 jumpi = JUMP_IF_TRUE;
2472 end = compiler_new_block(c);
2473 if (end == NULL)
2474 return 0;
2475 s = e->v.BoolOp.values;
2476 n = asdl_seq_LEN(s) - 1;
2477 assert(n >= 0);
2478 for (i = 0; i < n; ++i) {
2479 VISIT(c, expr, (expr_ty)asdl_seq_GET(s, i));
2480 ADDOP_JREL(c, jumpi, end);
2481 ADDOP(c, POP_TOP)
2482 }
2483 VISIT(c, expr, (expr_ty)asdl_seq_GET(s, n));
2484 compiler_use_next_block(c, end);
2485 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002486}
2487
2488static int
2489compiler_list(struct compiler *c, expr_ty e)
2490{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002491 int n = asdl_seq_LEN(e->v.List.elts);
2492 if (e->v.List.ctx == Store) {
2493 ADDOP_I(c, UNPACK_SEQUENCE, n);
2494 }
2495 VISIT_SEQ(c, expr, e->v.List.elts);
2496 if (e->v.List.ctx == Load) {
2497 ADDOP_I(c, BUILD_LIST, n);
2498 }
2499 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002500}
2501
2502static int
2503compiler_tuple(struct compiler *c, expr_ty e)
2504{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002505 int n = asdl_seq_LEN(e->v.Tuple.elts);
2506 if (e->v.Tuple.ctx == Store) {
2507 ADDOP_I(c, UNPACK_SEQUENCE, n);
2508 }
2509 VISIT_SEQ(c, expr, e->v.Tuple.elts);
2510 if (e->v.Tuple.ctx == Load) {
2511 ADDOP_I(c, BUILD_TUPLE, n);
2512 }
2513 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002514}
2515
2516static int
2517compiler_compare(struct compiler *c, expr_ty e)
2518{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002519 int i, n;
2520 basicblock *cleanup = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002521
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002522 /* XXX the logic can be cleaned up for 1 or multiple comparisons */
2523 VISIT(c, expr, e->v.Compare.left);
2524 n = asdl_seq_LEN(e->v.Compare.ops);
2525 assert(n > 0);
2526 if (n > 1) {
2527 cleanup = compiler_new_block(c);
2528 if (cleanup == NULL)
2529 return 0;
2530 VISIT(c, expr,
2531 (expr_ty)asdl_seq_GET(e->v.Compare.comparators, 0));
2532 }
2533 for (i = 1; i < n; i++) {
2534 ADDOP(c, DUP_TOP);
2535 ADDOP(c, ROT_THREE);
2536 ADDOP_I(c, COMPARE_OP,
2537 cmpop((cmpop_ty)(asdl_seq_GET(
2538 e->v.Compare.ops, i - 1))));
2539 ADDOP_JREL(c, JUMP_IF_FALSE, cleanup);
2540 NEXT_BLOCK(c);
2541 ADDOP(c, POP_TOP);
2542 if (i < (n - 1))
2543 VISIT(c, expr,
2544 (expr_ty)asdl_seq_GET(e->v.Compare.comparators, i));
2545 }
2546 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, n - 1));
2547 ADDOP_I(c, COMPARE_OP,
2548 cmpop((cmpop_ty)(asdl_seq_GET(e->v.Compare.ops, n - 1))));
2549 if (n > 1) {
2550 basicblock *end = compiler_new_block(c);
2551 if (end == NULL)
2552 return 0;
2553 ADDOP_JREL(c, JUMP_FORWARD, end);
2554 compiler_use_next_block(c, cleanup);
2555 ADDOP(c, ROT_TWO);
2556 ADDOP(c, POP_TOP);
2557 compiler_use_next_block(c, end);
2558 }
2559 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002560}
2561
2562static int
2563compiler_call(struct compiler *c, expr_ty e)
2564{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002565 int n, code = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002566
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002567 VISIT(c, expr, e->v.Call.func);
2568 n = asdl_seq_LEN(e->v.Call.args);
2569 VISIT_SEQ(c, expr, e->v.Call.args);
2570 if (e->v.Call.keywords) {
2571 VISIT_SEQ(c, keyword, e->v.Call.keywords);
2572 n |= asdl_seq_LEN(e->v.Call.keywords) << 8;
2573 }
2574 if (e->v.Call.starargs) {
2575 VISIT(c, expr, e->v.Call.starargs);
2576 code |= 1;
2577 }
2578 if (e->v.Call.kwargs) {
2579 VISIT(c, expr, e->v.Call.kwargs);
2580 code |= 2;
2581 }
2582 switch (code) {
2583 case 0:
2584 ADDOP_I(c, CALL_FUNCTION, n);
2585 break;
2586 case 1:
2587 ADDOP_I(c, CALL_FUNCTION_VAR, n);
2588 break;
2589 case 2:
2590 ADDOP_I(c, CALL_FUNCTION_KW, n);
2591 break;
2592 case 3:
2593 ADDOP_I(c, CALL_FUNCTION_VAR_KW, n);
2594 break;
2595 }
2596 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002597}
2598
2599static int
2600compiler_listcomp_generator(struct compiler *c, PyObject *tmpname,
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002601 asdl_seq *generators, int gen_index,
2602 expr_ty elt)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002603{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002604 /* generate code for the iterator, then each of the ifs,
2605 and then write to the element */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002606
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002607 comprehension_ty l;
2608 basicblock *start, *anchor, *skip, *if_cleanup;
2609 int i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002610
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002611 start = compiler_new_block(c);
2612 skip = compiler_new_block(c);
2613 if_cleanup = compiler_new_block(c);
2614 anchor = compiler_new_block(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002615
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002616 if (start == NULL || skip == NULL || if_cleanup == NULL ||
2617 anchor == NULL)
2618 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002619
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002620 l = (comprehension_ty)asdl_seq_GET(generators, gen_index);
2621 VISIT(c, expr, l->iter);
2622 ADDOP(c, GET_ITER);
2623 compiler_use_next_block(c, start);
2624 ADDOP_JREL(c, FOR_ITER, anchor);
2625 NEXT_BLOCK(c);
2626 VISIT(c, expr, l->target);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002627
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002628 /* XXX this needs to be cleaned up...a lot! */
2629 n = asdl_seq_LEN(l->ifs);
2630 for (i = 0; i < n; i++) {
2631 expr_ty e = (expr_ty)asdl_seq_GET(l->ifs, i);
2632 VISIT(c, expr, e);
2633 ADDOP_JREL(c, JUMP_IF_FALSE, if_cleanup);
2634 NEXT_BLOCK(c);
2635 ADDOP(c, POP_TOP);
2636 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002637
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002638 if (++gen_index < asdl_seq_LEN(generators))
2639 if (!compiler_listcomp_generator(c, tmpname,
2640 generators, gen_index, elt))
2641 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002642
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002643 /* only append after the last for generator */
2644 if (gen_index >= asdl_seq_LEN(generators)) {
2645 if (!compiler_nameop(c, tmpname, Load))
2646 return 0;
2647 VISIT(c, expr, elt);
2648 ADDOP(c, LIST_APPEND);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002649
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002650 compiler_use_next_block(c, skip);
2651 }
2652 for (i = 0; i < n; i++) {
2653 ADDOP_I(c, JUMP_FORWARD, 1);
2654 if (i == 0)
2655 compiler_use_next_block(c, if_cleanup);
2656 ADDOP(c, POP_TOP);
2657 }
2658 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
2659 compiler_use_next_block(c, anchor);
2660 /* delete the temporary list name added to locals */
2661 if (gen_index == 1)
2662 if (!compiler_nameop(c, tmpname, Del))
2663 return 0;
2664
2665 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002666}
2667
2668static int
2669compiler_listcomp(struct compiler *c, expr_ty e)
2670{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002671 identifier tmp;
2672 int rc = 0;
2673 asdl_seq *generators = e->v.ListComp.generators;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002674
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002675 assert(e->kind == ListComp_kind);
2676 tmp = compiler_new_tmpname(c);
2677 if (!tmp)
2678 return 0;
2679 ADDOP_I(c, BUILD_LIST, 0);
2680 ADDOP(c, DUP_TOP);
2681 if (compiler_nameop(c, tmp, Store))
2682 rc = compiler_listcomp_generator(c, tmp, generators, 0,
2683 e->v.ListComp.elt);
2684 Py_DECREF(tmp);
2685 return rc;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002686}
2687
2688static int
2689compiler_genexp_generator(struct compiler *c,
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002690 asdl_seq *generators, int gen_index,
2691 expr_ty elt)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002692{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002693 /* generate code for the iterator, then each of the ifs,
2694 and then write to the element */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002695
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002696 comprehension_ty ge;
2697 basicblock *start, *anchor, *skip, *if_cleanup, *end;
2698 int i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002699
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002700 start = compiler_new_block(c);
2701 skip = compiler_new_block(c);
2702 if_cleanup = compiler_new_block(c);
2703 anchor = compiler_new_block(c);
2704 end = compiler_new_block(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002705
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002706 if (start == NULL || skip == NULL || if_cleanup == NULL ||
2707 anchor == NULL || end == NULL)
2708 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002709
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002710 ge = (comprehension_ty)asdl_seq_GET(generators, gen_index);
2711 ADDOP_JREL(c, SETUP_LOOP, end);
2712 if (!compiler_push_fblock(c, LOOP, start))
2713 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002714
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002715 if (gen_index == 0) {
2716 /* Receive outermost iter as an implicit argument */
2717 c->u->u_argcount = 1;
2718 ADDOP_I(c, LOAD_FAST, 0);
2719 }
2720 else {
2721 /* Sub-iter - calculate on the fly */
2722 VISIT(c, expr, ge->iter);
2723 ADDOP(c, GET_ITER);
2724 }
2725 compiler_use_next_block(c, start);
2726 ADDOP_JREL(c, FOR_ITER, anchor);
2727 NEXT_BLOCK(c);
2728 VISIT(c, expr, ge->target);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002729
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002730 /* XXX this needs to be cleaned up...a lot! */
2731 n = asdl_seq_LEN(ge->ifs);
2732 for (i = 0; i < n; i++) {
2733 expr_ty e = (expr_ty)asdl_seq_GET(ge->ifs, i);
2734 VISIT(c, expr, e);
2735 ADDOP_JREL(c, JUMP_IF_FALSE, if_cleanup);
2736 NEXT_BLOCK(c);
2737 ADDOP(c, POP_TOP);
2738 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002739
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002740 if (++gen_index < asdl_seq_LEN(generators))
2741 if (!compiler_genexp_generator(c, generators, gen_index, elt))
2742 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002743
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002744 /* only append after the last 'for' generator */
2745 if (gen_index >= asdl_seq_LEN(generators)) {
2746 VISIT(c, expr, elt);
2747 ADDOP(c, YIELD_VALUE);
2748 ADDOP(c, POP_TOP);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002749
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002750 compiler_use_next_block(c, skip);
2751 }
2752 for (i = 0; i < n; i++) {
2753 ADDOP_I(c, JUMP_FORWARD, 1);
2754 if (i == 0)
2755 compiler_use_next_block(c, if_cleanup);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002756
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002757 ADDOP(c, POP_TOP);
2758 }
2759 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
2760 compiler_use_next_block(c, anchor);
2761 ADDOP(c, POP_BLOCK);
2762 compiler_pop_fblock(c, LOOP, start);
2763 compiler_use_next_block(c, end);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002764
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002765 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002766}
2767
2768static int
2769compiler_genexp(struct compiler *c, expr_ty e)
2770{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002771 static identifier name;
2772 PyCodeObject *co;
2773 expr_ty outermost_iter = ((comprehension_ty)
2774 (asdl_seq_GET(e->v.GeneratorExp.generators,
2775 0)))->iter;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002776
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002777 if (!name) {
2778 name = PyString_FromString("<genexpr>");
2779 if (!name)
2780 return 0;
2781 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002782
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002783 if (!compiler_enter_scope(c, name, (void *)e, e->lineno))
2784 return 0;
2785 compiler_genexp_generator(c, e->v.GeneratorExp.generators, 0,
2786 e->v.GeneratorExp.elt);
2787 co = assemble(c, 1);
2788 compiler_exit_scope(c);
2789 if (co == NULL)
2790 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002791
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002792 compiler_make_closure(c, co, 0);
2793 Py_DECREF(co);
Neal Norwitz4737b232005-11-19 23:58:29 +00002794
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002795 VISIT(c, expr, outermost_iter);
2796 ADDOP(c, GET_ITER);
2797 ADDOP_I(c, CALL_FUNCTION, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002798
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002799 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002800}
2801
2802static int
2803compiler_visit_keyword(struct compiler *c, keyword_ty k)
2804{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002805 ADDOP_O(c, LOAD_CONST, k->arg, consts);
2806 VISIT(c, expr, k->value);
2807 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002808}
2809
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002810/* Test whether expression is constant. For constants, report
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002811 whether they are true or false.
2812
2813 Return values: 1 for true, 0 for false, -1 for non-constant.
2814 */
2815
2816static int
2817expr_constant(expr_ty e)
2818{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002819 switch (e->kind) {
2820 case Num_kind:
2821 return PyObject_IsTrue(e->v.Num.n);
2822 case Str_kind:
2823 return PyObject_IsTrue(e->v.Str.s);
2824 case Name_kind:
2825 /* __debug__ is not assignable, so we can optimize
2826 * it away in if and while statements */
2827 if (strcmp(PyString_AS_STRING(e->v.Name.id),
2828 "__debug__") == 0)
2829 return ! Py_OptimizeFlag;
2830 /* fall through */
2831 default:
2832 return -1;
2833 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002834}
2835
Guido van Rossumc2e20742006-02-27 22:32:47 +00002836/*
2837 Implements the with statement from PEP 343.
2838
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002839 The semantics outlined in that PEP are as follows:
Guido van Rossumc2e20742006-02-27 22:32:47 +00002840
2841 with EXPR as VAR:
2842 BLOCK
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002843
Guido van Rossumc2e20742006-02-27 22:32:47 +00002844 It is implemented roughly as:
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002845
Guido van Rossumda5b7012006-05-02 19:47:52 +00002846 context = EXPR
Guido van Rossumc2e20742006-02-27 22:32:47 +00002847 exit = context.__exit__ # not calling it
2848 value = context.__enter__()
2849 try:
2850 VAR = value # if VAR present in the syntax
2851 BLOCK
2852 finally:
2853 if an exception was raised:
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002854 exc = copy of (exception, instance, traceback)
Guido van Rossumc2e20742006-02-27 22:32:47 +00002855 else:
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002856 exc = (None, None, None)
Guido van Rossumc2e20742006-02-27 22:32:47 +00002857 exit(*exc)
2858 */
2859static int
2860compiler_with(struct compiler *c, stmt_ty s)
2861{
Guido van Rossumda5b7012006-05-02 19:47:52 +00002862 static identifier enter_attr, exit_attr;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002863 basicblock *block, *finally;
Nick Coghlan7af53be2008-03-07 14:13:28 +00002864 identifier tmpvalue = NULL;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002865
2866 assert(s->kind == With_kind);
2867
Guido van Rossumc2e20742006-02-27 22:32:47 +00002868 if (!enter_attr) {
Antoine Pitrouc31616d2010-06-22 21:47:04 +00002869 enter_attr = PyString_InternFromString("__enter__");
2870 if (!enter_attr)
2871 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002872 }
2873 if (!exit_attr) {
Antoine Pitrouc31616d2010-06-22 21:47:04 +00002874 exit_attr = PyString_InternFromString("__exit__");
2875 if (!exit_attr)
2876 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002877 }
2878
2879 block = compiler_new_block(c);
2880 finally = compiler_new_block(c);
2881 if (!block || !finally)
Antoine Pitrouc31616d2010-06-22 21:47:04 +00002882 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002883
Guido van Rossumc2e20742006-02-27 22:32:47 +00002884 if (s->v.With.optional_vars) {
Antoine Pitrouc31616d2010-06-22 21:47:04 +00002885 /* Create a temporary variable to hold context.__enter__().
2886 We need to do this rather than preserving it on the stack
2887 because SETUP_FINALLY remembers the stack level.
2888 We need to do the assignment *inside* the try/finally
2889 so that context.__exit__() is called when the assignment
2890 fails. But we need to call context.__enter__() *before*
2891 the try/finally so that if it fails we won't call
2892 context.__exit__().
2893 */
2894 tmpvalue = compiler_new_tmpname(c);
2895 if (tmpvalue == NULL)
2896 return 0;
2897 PyArena_AddPyObject(c->c_arena, tmpvalue);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002898 }
2899
Guido van Rossumda5b7012006-05-02 19:47:52 +00002900 /* Evaluate EXPR */
Guido van Rossumc2e20742006-02-27 22:32:47 +00002901 VISIT(c, expr, s->v.With.context_expr);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002902
Nick Coghlan7af53be2008-03-07 14:13:28 +00002903 /* Squirrel away context.__exit__ by stuffing it under context */
Guido van Rossumc2e20742006-02-27 22:32:47 +00002904 ADDOP(c, DUP_TOP);
2905 ADDOP_O(c, LOAD_ATTR, exit_attr, names);
Nick Coghlan7af53be2008-03-07 14:13:28 +00002906 ADDOP(c, ROT_TWO);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002907
2908 /* Call context.__enter__() */
2909 ADDOP_O(c, LOAD_ATTR, enter_attr, names);
2910 ADDOP_I(c, CALL_FUNCTION, 0);
2911
2912 if (s->v.With.optional_vars) {
Antoine Pitrouc31616d2010-06-22 21:47:04 +00002913 /* Store it in tmpvalue */
2914 if (!compiler_nameop(c, tmpvalue, Store))
2915 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002916 }
2917 else {
Antoine Pitrouc31616d2010-06-22 21:47:04 +00002918 /* Discard result from context.__enter__() */
2919 ADDOP(c, POP_TOP);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002920 }
2921
2922 /* Start the try block */
2923 ADDOP_JREL(c, SETUP_FINALLY, finally);
2924
2925 compiler_use_next_block(c, block);
2926 if (!compiler_push_fblock(c, FINALLY_TRY, block)) {
Antoine Pitrouc31616d2010-06-22 21:47:04 +00002927 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002928 }
2929
2930 if (s->v.With.optional_vars) {
Antoine Pitrouc31616d2010-06-22 21:47:04 +00002931 /* Bind saved result of context.__enter__() to VAR */
2932 if (!compiler_nameop(c, tmpvalue, Load) ||
2933 !compiler_nameop(c, tmpvalue, Del))
2934 return 0;
2935 VISIT(c, expr, s->v.With.optional_vars);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002936 }
2937
2938 /* BLOCK code */
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002939 VISIT_SEQ(c, stmt, s->v.With.body);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002940
2941 /* End of try block; start the finally block */
2942 ADDOP(c, POP_BLOCK);
2943 compiler_pop_fblock(c, FINALLY_TRY, block);
2944
2945 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2946 compiler_use_next_block(c, finally);
2947 if (!compiler_push_fblock(c, FINALLY_END, finally))
Antoine Pitrouc31616d2010-06-22 21:47:04 +00002948 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002949
Nick Coghlan7af53be2008-03-07 14:13:28 +00002950 /* Finally block starts; context.__exit__ is on the stack under
2951 the exception or return information. Just issue our magic
2952 opcode. */
Guido van Rossumc2e20742006-02-27 22:32:47 +00002953 ADDOP(c, WITH_CLEANUP);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002954
2955 /* Finally block ends. */
2956 ADDOP(c, END_FINALLY);
2957 compiler_pop_fblock(c, FINALLY_END, finally);
2958 return 1;
2959}
2960
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002961static int
2962compiler_visit_expr(struct compiler *c, expr_ty e)
2963{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002964 int i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002965
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002966 /* If expr e has a different line number than the last expr/stmt,
2967 set a new line number for the next instruction.
2968 */
2969 if (e->lineno > c->u->u_lineno) {
2970 c->u->u_lineno = e->lineno;
2971 c->u->u_lineno_set = false;
2972 }
2973 switch (e->kind) {
2974 case BoolOp_kind:
2975 return compiler_boolop(c, e);
2976 case BinOp_kind:
2977 VISIT(c, expr, e->v.BinOp.left);
2978 VISIT(c, expr, e->v.BinOp.right);
2979 ADDOP(c, binop(c, e->v.BinOp.op));
2980 break;
2981 case UnaryOp_kind:
2982 VISIT(c, expr, e->v.UnaryOp.operand);
2983 ADDOP(c, unaryop(e->v.UnaryOp.op));
2984 break;
2985 case Lambda_kind:
2986 return compiler_lambda(c, e);
2987 case IfExp_kind:
2988 return compiler_ifexp(c, e);
2989 case Dict_kind:
2990 n = asdl_seq_LEN(e->v.Dict.values);
2991 ADDOP_I(c, BUILD_MAP, (n>0xFFFF ? 0xFFFF : n));
2992 for (i = 0; i < n; i++) {
2993 VISIT(c, expr,
2994 (expr_ty)asdl_seq_GET(e->v.Dict.values, i));
2995 VISIT(c, expr,
2996 (expr_ty)asdl_seq_GET(e->v.Dict.keys, i));
2997 ADDOP(c, STORE_MAP);
2998 }
2999 break;
3000 case ListComp_kind:
3001 return compiler_listcomp(c, e);
3002 case GeneratorExp_kind:
3003 return compiler_genexp(c, e);
3004 case Yield_kind:
3005 if (c->u->u_ste->ste_type != FunctionBlock)
3006 return compiler_error(c, "'yield' outside function");
3007 if (e->v.Yield.value) {
3008 VISIT(c, expr, e->v.Yield.value);
3009 }
3010 else {
3011 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3012 }
3013 ADDOP(c, YIELD_VALUE);
3014 break;
3015 case Compare_kind:
3016 return compiler_compare(c, e);
3017 case Call_kind:
3018 return compiler_call(c, e);
3019 case Repr_kind:
3020 VISIT(c, expr, e->v.Repr.value);
3021 ADDOP(c, UNARY_CONVERT);
3022 break;
3023 case Num_kind:
3024 ADDOP_O(c, LOAD_CONST, e->v.Num.n, consts);
3025 break;
3026 case Str_kind:
3027 ADDOP_O(c, LOAD_CONST, e->v.Str.s, consts);
3028 break;
3029 /* The following exprs can be assignment targets. */
3030 case Attribute_kind:
3031 if (e->v.Attribute.ctx != AugStore)
3032 VISIT(c, expr, e->v.Attribute.value);
3033 switch (e->v.Attribute.ctx) {
3034 case AugLoad:
3035 ADDOP(c, DUP_TOP);
3036 /* Fall through to load */
3037 case Load:
3038 ADDOP_NAME(c, LOAD_ATTR, e->v.Attribute.attr, names);
3039 break;
3040 case AugStore:
3041 ADDOP(c, ROT_TWO);
3042 /* Fall through to save */
3043 case Store:
3044 ADDOP_NAME(c, STORE_ATTR, e->v.Attribute.attr, names);
3045 break;
3046 case Del:
3047 ADDOP_NAME(c, DELETE_ATTR, e->v.Attribute.attr, names);
3048 break;
3049 case Param:
3050 default:
3051 PyErr_SetString(PyExc_SystemError,
3052 "param invalid in attribute expression");
3053 return 0;
3054 }
3055 break;
3056 case Subscript_kind:
3057 switch (e->v.Subscript.ctx) {
3058 case AugLoad:
3059 VISIT(c, expr, e->v.Subscript.value);
3060 VISIT_SLICE(c, e->v.Subscript.slice, AugLoad);
3061 break;
3062 case Load:
3063 VISIT(c, expr, e->v.Subscript.value);
3064 VISIT_SLICE(c, e->v.Subscript.slice, Load);
3065 break;
3066 case AugStore:
3067 VISIT_SLICE(c, e->v.Subscript.slice, AugStore);
3068 break;
3069 case Store:
3070 VISIT(c, expr, e->v.Subscript.value);
3071 VISIT_SLICE(c, e->v.Subscript.slice, Store);
3072 break;
3073 case Del:
3074 VISIT(c, expr, e->v.Subscript.value);
3075 VISIT_SLICE(c, e->v.Subscript.slice, Del);
3076 break;
3077 case Param:
3078 default:
3079 PyErr_SetString(PyExc_SystemError,
3080 "param invalid in subscript expression");
3081 return 0;
3082 }
3083 break;
3084 case Name_kind:
3085 return compiler_nameop(c, e->v.Name.id, e->v.Name.ctx);
3086 /* child nodes of List and Tuple will have expr_context set */
3087 case List_kind:
3088 return compiler_list(c, e);
3089 case Tuple_kind:
3090 return compiler_tuple(c, e);
3091 }
3092 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003093}
3094
3095static int
3096compiler_augassign(struct compiler *c, stmt_ty s)
3097{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003098 expr_ty e = s->v.AugAssign.target;
3099 expr_ty auge;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003100
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003101 assert(s->kind == AugAssign_kind);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003102
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003103 switch (e->kind) {
3104 case Attribute_kind:
3105 auge = Attribute(e->v.Attribute.value, e->v.Attribute.attr,
3106 AugLoad, e->lineno, e->col_offset, c->c_arena);
3107 if (auge == NULL)
3108 return 0;
3109 VISIT(c, expr, auge);
3110 VISIT(c, expr, s->v.AugAssign.value);
3111 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
3112 auge->v.Attribute.ctx = AugStore;
3113 VISIT(c, expr, auge);
3114 break;
3115 case Subscript_kind:
3116 auge = Subscript(e->v.Subscript.value, e->v.Subscript.slice,
3117 AugLoad, e->lineno, e->col_offset, c->c_arena);
3118 if (auge == NULL)
3119 return 0;
3120 VISIT(c, expr, auge);
3121 VISIT(c, expr, s->v.AugAssign.value);
3122 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
3123 auge->v.Subscript.ctx = AugStore;
3124 VISIT(c, expr, auge);
3125 break;
3126 case Name_kind:
3127 if (!compiler_nameop(c, e->v.Name.id, Load))
3128 return 0;
3129 VISIT(c, expr, s->v.AugAssign.value);
3130 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
3131 return compiler_nameop(c, e->v.Name.id, Store);
3132 default:
3133 PyErr_Format(PyExc_SystemError,
3134 "invalid node type (%d) for augmented assignment",
3135 e->kind);
3136 return 0;
3137 }
3138 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003139}
3140
3141static int
3142compiler_push_fblock(struct compiler *c, enum fblocktype t, basicblock *b)
3143{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003144 struct fblockinfo *f;
3145 if (c->u->u_nfblocks >= CO_MAXBLOCKS) {
3146 PyErr_SetString(PyExc_SystemError,
3147 "too many statically nested blocks");
3148 return 0;
3149 }
3150 f = &c->u->u_fblock[c->u->u_nfblocks++];
3151 f->fb_type = t;
3152 f->fb_block = b;
3153 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003154}
3155
3156static void
3157compiler_pop_fblock(struct compiler *c, enum fblocktype t, basicblock *b)
3158{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003159 struct compiler_unit *u = c->u;
3160 assert(u->u_nfblocks > 0);
3161 u->u_nfblocks--;
3162 assert(u->u_fblock[u->u_nfblocks].fb_type == t);
3163 assert(u->u_fblock[u->u_nfblocks].fb_block == b);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003164}
3165
Jeremy Hylton82271f12006-10-04 02:24:52 +00003166static int
3167compiler_in_loop(struct compiler *c) {
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003168 int i;
3169 struct compiler_unit *u = c->u;
3170 for (i = 0; i < u->u_nfblocks; ++i) {
3171 if (u->u_fblock[i].fb_type == LOOP)
3172 return 1;
3173 }
3174 return 0;
Jeremy Hylton82271f12006-10-04 02:24:52 +00003175}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003176/* Raises a SyntaxError and returns 0.
3177 If something goes wrong, a different exception may be raised.
3178*/
3179
3180static int
3181compiler_error(struct compiler *c, const char *errstr)
3182{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003183 PyObject *loc;
3184 PyObject *u = NULL, *v = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003185
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003186 loc = PyErr_ProgramText(c->c_filename, c->u->u_lineno);
3187 if (!loc) {
3188 Py_INCREF(Py_None);
3189 loc = Py_None;
3190 }
3191 u = Py_BuildValue("(ziOO)", c->c_filename, c->u->u_lineno,
3192 Py_None, loc);
3193 if (!u)
3194 goto exit;
3195 v = Py_BuildValue("(zO)", errstr, u);
3196 if (!v)
3197 goto exit;
3198 PyErr_SetObject(PyExc_SyntaxError, v);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003199 exit:
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003200 Py_DECREF(loc);
3201 Py_XDECREF(u);
3202 Py_XDECREF(v);
3203 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003204}
3205
3206static int
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003207compiler_handle_subscr(struct compiler *c, const char *kind,
3208 expr_context_ty ctx)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003209{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003210 int op = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003211
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003212 /* XXX this code is duplicated */
3213 switch (ctx) {
3214 case AugLoad: /* fall through to Load */
3215 case Load: op = BINARY_SUBSCR; break;
3216 case AugStore:/* fall through to Store */
3217 case Store: op = STORE_SUBSCR; break;
3218 case Del: op = DELETE_SUBSCR; break;
3219 case Param:
3220 PyErr_Format(PyExc_SystemError,
3221 "invalid %s kind %d in subscript\n",
3222 kind, ctx);
3223 return 0;
3224 }
3225 if (ctx == AugLoad) {
3226 ADDOP_I(c, DUP_TOPX, 2);
3227 }
3228 else if (ctx == AugStore) {
3229 ADDOP(c, ROT_THREE);
3230 }
3231 ADDOP(c, op);
3232 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003233}
3234
3235static int
3236compiler_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)
3237{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003238 int n = 2;
3239 assert(s->kind == Slice_kind);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003240
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003241 /* only handles the cases where BUILD_SLICE is emitted */
3242 if (s->v.Slice.lower) {
3243 VISIT(c, expr, s->v.Slice.lower);
3244 }
3245 else {
3246 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3247 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003248
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003249 if (s->v.Slice.upper) {
3250 VISIT(c, expr, s->v.Slice.upper);
3251 }
3252 else {
3253 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3254 }
3255
3256 if (s->v.Slice.step) {
3257 n++;
3258 VISIT(c, expr, s->v.Slice.step);
3259 }
3260 ADDOP_I(c, BUILD_SLICE, n);
3261 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003262}
3263
3264static int
3265compiler_simple_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)
3266{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003267 int op = 0, slice_offset = 0, stack_count = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003268
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003269 assert(s->v.Slice.step == NULL);
3270 if (s->v.Slice.lower) {
3271 slice_offset++;
3272 stack_count++;
3273 if (ctx != AugStore)
3274 VISIT(c, expr, s->v.Slice.lower);
3275 }
3276 if (s->v.Slice.upper) {
3277 slice_offset += 2;
3278 stack_count++;
3279 if (ctx != AugStore)
3280 VISIT(c, expr, s->v.Slice.upper);
3281 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003282
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003283 if (ctx == AugLoad) {
3284 switch (stack_count) {
3285 case 0: ADDOP(c, DUP_TOP); break;
3286 case 1: ADDOP_I(c, DUP_TOPX, 2); break;
3287 case 2: ADDOP_I(c, DUP_TOPX, 3); break;
3288 }
3289 }
3290 else if (ctx == AugStore) {
3291 switch (stack_count) {
3292 case 0: ADDOP(c, ROT_TWO); break;
3293 case 1: ADDOP(c, ROT_THREE); break;
3294 case 2: ADDOP(c, ROT_FOUR); break;
3295 }
3296 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003297
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003298 switch (ctx) {
3299 case AugLoad: /* fall through to Load */
3300 case Load: op = SLICE; break;
3301 case AugStore:/* fall through to Store */
3302 case Store: op = STORE_SLICE; break;
3303 case Del: op = DELETE_SLICE; break;
3304 case Param:
3305 default:
3306 PyErr_SetString(PyExc_SystemError,
3307 "param invalid in simple slice");
3308 return 0;
3309 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003310
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003311 ADDOP(c, op + slice_offset);
3312 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003313}
3314
3315static int
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003316compiler_visit_nested_slice(struct compiler *c, slice_ty s,
3317 expr_context_ty ctx)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003318{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003319 switch (s->kind) {
3320 case Ellipsis_kind:
3321 ADDOP_O(c, LOAD_CONST, Py_Ellipsis, consts);
3322 break;
3323 case Slice_kind:
3324 return compiler_slice(c, s, ctx);
3325 case Index_kind:
3326 VISIT(c, expr, s->v.Index.value);
3327 break;
3328 case ExtSlice_kind:
3329 default:
3330 PyErr_SetString(PyExc_SystemError,
3331 "extended slice invalid in nested slice");
3332 return 0;
3333 }
3334 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003335}
3336
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003337static int
3338compiler_visit_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)
3339{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003340 char * kindname = NULL;
3341 switch (s->kind) {
3342 case Index_kind:
3343 kindname = "index";
3344 if (ctx != AugStore) {
3345 VISIT(c, expr, s->v.Index.value);
3346 }
3347 break;
3348 case Ellipsis_kind:
3349 kindname = "ellipsis";
3350 if (ctx != AugStore) {
3351 ADDOP_O(c, LOAD_CONST, Py_Ellipsis, consts);
3352 }
3353 break;
3354 case Slice_kind:
3355 kindname = "slice";
3356 if (!s->v.Slice.step)
3357 return compiler_simple_slice(c, s, ctx);
3358 if (ctx != AugStore) {
3359 if (!compiler_slice(c, s, ctx))
3360 return 0;
3361 }
3362 break;
3363 case ExtSlice_kind:
3364 kindname = "extended slice";
3365 if (ctx != AugStore) {
3366 int i, n = asdl_seq_LEN(s->v.ExtSlice.dims);
3367 for (i = 0; i < n; i++) {
3368 slice_ty sub = (slice_ty)asdl_seq_GET(
3369 s->v.ExtSlice.dims, i);
3370 if (!compiler_visit_nested_slice(c, sub, ctx))
3371 return 0;
3372 }
3373 ADDOP_I(c, BUILD_TUPLE, n);
3374 }
3375 break;
3376 default:
3377 PyErr_Format(PyExc_SystemError,
3378 "invalid subscript kind %d", s->kind);
3379 return 0;
3380 }
3381 return compiler_handle_subscr(c, kindname, ctx);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003382}
3383
Neal Norwitzf733a012006-10-29 18:30:10 +00003384
3385/* End of the compiler section, beginning of the assembler section */
3386
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003387/* do depth-first search of basic block graph, starting with block.
3388 post records the block indices in post-order.
3389
3390 XXX must handle implicit jumps from one block to next
3391*/
3392
Neal Norwitzf733a012006-10-29 18:30:10 +00003393struct assembler {
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003394 PyObject *a_bytecode; /* string containing bytecode */
3395 int a_offset; /* offset into bytecode */
3396 int a_nblocks; /* number of reachable blocks */
3397 basicblock **a_postorder; /* list of blocks in dfs postorder */
3398 PyObject *a_lnotab; /* string containing lnotab */
3399 int a_lnotab_off; /* offset into lnotab */
3400 int a_lineno; /* last lineno of emitted instruction */
3401 int a_lineno_off; /* bytecode offset of last lineno */
Neal Norwitzf733a012006-10-29 18:30:10 +00003402};
3403
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003404static void
3405dfs(struct compiler *c, basicblock *b, struct assembler *a)
3406{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003407 int i;
3408 struct instr *instr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003409
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003410 if (b->b_seen)
3411 return;
3412 b->b_seen = 1;
3413 if (b->b_next != NULL)
3414 dfs(c, b->b_next, a);
3415 for (i = 0; i < b->b_iused; i++) {
3416 instr = &b->b_instr[i];
3417 if (instr->i_jrel || instr->i_jabs)
3418 dfs(c, instr->i_target, a);
3419 }
3420 a->a_postorder[a->a_nblocks++] = b;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003421}
3422
Neal Norwitz2744c6c2005-11-13 01:08:38 +00003423static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003424stackdepth_walk(struct compiler *c, basicblock *b, int depth, int maxdepth)
3425{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003426 int i;
3427 struct instr *instr;
3428 if (b->b_seen || b->b_startdepth >= depth)
3429 return maxdepth;
3430 b->b_seen = 1;
3431 b->b_startdepth = depth;
3432 for (i = 0; i < b->b_iused; i++) {
3433 instr = &b->b_instr[i];
3434 depth += opcode_stack_effect(instr->i_opcode, instr->i_oparg);
3435 if (depth > maxdepth)
3436 maxdepth = depth;
3437 assert(depth >= 0); /* invalid code or bug in stackdepth() */
3438 if (instr->i_jrel || instr->i_jabs) {
3439 maxdepth = stackdepth_walk(c, instr->i_target,
3440 depth, maxdepth);
3441 if (instr->i_opcode == JUMP_ABSOLUTE ||
3442 instr->i_opcode == JUMP_FORWARD) {
3443 goto out; /* remaining code is dead */
3444 }
3445 }
3446 }
3447 if (b->b_next)
3448 maxdepth = stackdepth_walk(c, b->b_next, depth, maxdepth);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003449out:
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003450 b->b_seen = 0;
3451 return maxdepth;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003452}
3453
3454/* Find the flow path that needs the largest stack. We assume that
3455 * cycles in the flow graph have no net effect on the stack depth.
3456 */
3457static int
3458stackdepth(struct compiler *c)
3459{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003460 basicblock *b, *entryblock;
3461 entryblock = NULL;
3462 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
3463 b->b_seen = 0;
3464 b->b_startdepth = INT_MIN;
3465 entryblock = b;
3466 }
3467 if (!entryblock)
3468 return 0;
3469 return stackdepth_walk(c, entryblock, 0, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003470}
3471
3472static int
3473assemble_init(struct assembler *a, int nblocks, int firstlineno)
3474{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003475 memset(a, 0, sizeof(struct assembler));
3476 a->a_lineno = firstlineno;
3477 a->a_bytecode = PyString_FromStringAndSize(NULL, DEFAULT_CODE_SIZE);
3478 if (!a->a_bytecode)
3479 return 0;
3480 a->a_lnotab = PyString_FromStringAndSize(NULL, DEFAULT_LNOTAB_SIZE);
3481 if (!a->a_lnotab)
3482 return 0;
3483 if (nblocks > PY_SIZE_MAX / sizeof(basicblock *)) {
3484 PyErr_NoMemory();
3485 return 0;
3486 }
3487 a->a_postorder = (basicblock **)PyObject_Malloc(
3488 sizeof(basicblock *) * nblocks);
3489 if (!a->a_postorder) {
3490 PyErr_NoMemory();
3491 return 0;
3492 }
3493 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003494}
3495
3496static void
3497assemble_free(struct assembler *a)
3498{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003499 Py_XDECREF(a->a_bytecode);
3500 Py_XDECREF(a->a_lnotab);
3501 if (a->a_postorder)
3502 PyObject_Free(a->a_postorder);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003503}
3504
3505/* Return the size of a basic block in bytes. */
3506
3507static int
3508instrsize(struct instr *instr)
3509{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003510 if (!instr->i_hasarg)
3511 return 1; /* 1 byte for the opcode*/
3512 if (instr->i_oparg > 0xffff)
3513 return 6; /* 1 (opcode) + 1 (EXTENDED_ARG opcode) + 2 (oparg) + 2(oparg extended) */
3514 return 3; /* 1 (opcode) + 2 (oparg) */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003515}
3516
3517static int
3518blocksize(basicblock *b)
3519{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003520 int i;
3521 int size = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003522
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003523 for (i = 0; i < b->b_iused; i++)
3524 size += instrsize(&b->b_instr[i]);
3525 return size;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003526}
3527
3528/* All about a_lnotab.
3529
3530c_lnotab is an array of unsigned bytes disguised as a Python string.
3531It is used to map bytecode offsets to source code line #s (when needed
3532for tracebacks).
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003533
Tim Peters2a7f3842001-06-09 09:26:21 +00003534The array is conceptually a list of
3535 (bytecode offset increment, line number increment)
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003536pairs. The details are important and delicate, best illustrated by example:
Tim Peters2a7f3842001-06-09 09:26:21 +00003537
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003538 byte code offset source code line number
3539 0 1
3540 6 2
3541 50 7
3542 350 307
3543 361 308
Tim Peters2a7f3842001-06-09 09:26:21 +00003544
3545The first trick is that these numbers aren't stored, only the increments
3546from one row to the next (this doesn't really work, but it's a start):
3547
3548 0, 1, 6, 1, 44, 5, 300, 300, 11, 1
3549
3550The second trick is that an unsigned byte can't hold negative values, or
3551values larger than 255, so (a) there's a deep assumption that byte code
3552offsets and their corresponding line #s both increase monotonically, and (b)
3553if at least one column jumps by more than 255 from one row to the next, more
3554than one pair is written to the table. In case #b, there's no way to know
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003555from looking at the table later how many were written. That's the delicate
Tim Peters2a7f3842001-06-09 09:26:21 +00003556part. A user of c_lnotab desiring to find the source line number
3557corresponding to a bytecode address A should do something like this
3558
3559 lineno = addr = 0
3560 for addr_incr, line_incr in c_lnotab:
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003561 addr += addr_incr
3562 if addr > A:
3563 return lineno
3564 lineno += line_incr
Tim Peters2a7f3842001-06-09 09:26:21 +00003565
3566In order for this to work, when the addr field increments by more than 255,
3567the line # increment in each pair generated must be 0 until the remaining addr
Neal Norwitz84be93b2006-07-16 01:50:38 +00003568increment is < 256. So, in the example above, assemble_lnotab (it used
3569to be called com_set_lineno) should not (as was actually done until 2.2)
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003570expand 300, 300 to 255, 255, 45, 45,
3571 but to 255, 0, 45, 255, 0, 45.
Tim Peters2a7f3842001-06-09 09:26:21 +00003572*/
3573
Guido van Rossumf68d8e52001-04-14 17:55:09 +00003574static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003575assemble_lnotab(struct assembler *a, struct instr *i)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003576{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003577 int d_bytecode, d_lineno;
3578 int len;
3579 unsigned char *lnotab;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003580
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003581 d_bytecode = a->a_offset - a->a_lineno_off;
3582 d_lineno = i->i_lineno - a->a_lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003583
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003584 assert(d_bytecode >= 0);
3585 assert(d_lineno >= 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003586
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003587 if(d_bytecode == 0 && d_lineno == 0)
3588 return 1;
Amaury Forgeot d'Arc99af7db2008-02-05 00:26:21 +00003589
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003590 if (d_bytecode > 255) {
3591 int j, nbytes, ncodes = d_bytecode / 255;
3592 nbytes = a->a_lnotab_off + 2 * ncodes;
3593 len = PyString_GET_SIZE(a->a_lnotab);
3594 if (nbytes >= len) {
3595 if ((len <= INT_MAX / 2) && (len * 2 < nbytes))
3596 len = nbytes;
3597 else if (len <= INT_MAX / 2)
3598 len *= 2;
3599 else {
3600 PyErr_NoMemory();
3601 return 0;
3602 }
3603 if (_PyString_Resize(&a->a_lnotab, len) < 0)
3604 return 0;
3605 }
3606 lnotab = (unsigned char *)
3607 PyString_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
3608 for (j = 0; j < ncodes; j++) {
3609 *lnotab++ = 255;
3610 *lnotab++ = 0;
3611 }
3612 d_bytecode -= ncodes * 255;
3613 a->a_lnotab_off += ncodes * 2;
3614 }
3615 assert(d_bytecode <= 255);
3616 if (d_lineno > 255) {
3617 int j, nbytes, ncodes = d_lineno / 255;
3618 nbytes = a->a_lnotab_off + 2 * ncodes;
3619 len = PyString_GET_SIZE(a->a_lnotab);
3620 if (nbytes >= len) {
3621 if ((len <= INT_MAX / 2) && len * 2 < nbytes)
3622 len = nbytes;
3623 else if (len <= INT_MAX / 2)
3624 len *= 2;
3625 else {
3626 PyErr_NoMemory();
3627 return 0;
3628 }
3629 if (_PyString_Resize(&a->a_lnotab, len) < 0)
3630 return 0;
3631 }
3632 lnotab = (unsigned char *)
3633 PyString_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
3634 *lnotab++ = d_bytecode;
3635 *lnotab++ = 255;
3636 d_bytecode = 0;
3637 for (j = 1; j < ncodes; j++) {
3638 *lnotab++ = 0;
3639 *lnotab++ = 255;
3640 }
3641 d_lineno -= ncodes * 255;
3642 a->a_lnotab_off += ncodes * 2;
3643 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003644
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003645 len = PyString_GET_SIZE(a->a_lnotab);
3646 if (a->a_lnotab_off + 2 >= len) {
3647 if (_PyString_Resize(&a->a_lnotab, len * 2) < 0)
3648 return 0;
3649 }
3650 lnotab = (unsigned char *)
3651 PyString_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
Tim Peters51e26512001-09-07 08:45:55 +00003652
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003653 a->a_lnotab_off += 2;
3654 if (d_bytecode) {
3655 *lnotab++ = d_bytecode;
3656 *lnotab++ = d_lineno;
3657 }
3658 else { /* First line of a block; def stmt, etc. */
3659 *lnotab++ = 0;
3660 *lnotab++ = d_lineno;
3661 }
3662 a->a_lineno = i->i_lineno;
3663 a->a_lineno_off = a->a_offset;
3664 return 1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003665}
3666
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003667/* assemble_emit()
3668 Extend the bytecode with a new instruction.
3669 Update lnotab if necessary.
Jeremy Hylton376e63d2003-08-28 14:42:14 +00003670*/
3671
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003672static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003673assemble_emit(struct assembler *a, struct instr *i)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003674{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003675 int size, arg = 0, ext = 0;
3676 Py_ssize_t len = PyString_GET_SIZE(a->a_bytecode);
3677 char *code;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003678
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003679 size = instrsize(i);
3680 if (i->i_hasarg) {
3681 arg = i->i_oparg;
3682 ext = arg >> 16;
3683 }
3684 if (i->i_lineno && !assemble_lnotab(a, i))
3685 return 0;
3686 if (a->a_offset + size >= len) {
3687 if (len > PY_SSIZE_T_MAX / 2)
3688 return 0;
3689 if (_PyString_Resize(&a->a_bytecode, len * 2) < 0)
3690 return 0;
3691 }
3692 code = PyString_AS_STRING(a->a_bytecode) + a->a_offset;
3693 a->a_offset += size;
3694 if (size == 6) {
3695 assert(i->i_hasarg);
3696 *code++ = (char)EXTENDED_ARG;
3697 *code++ = ext & 0xff;
3698 *code++ = ext >> 8;
3699 arg &= 0xffff;
3700 }
3701 *code++ = i->i_opcode;
3702 if (i->i_hasarg) {
3703 assert(size == 3 || size == 6);
3704 *code++ = arg & 0xff;
3705 *code++ = arg >> 8;
3706 }
3707 return 1;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00003708}
3709
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003710static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003711assemble_jump_offsets(struct assembler *a, struct compiler *c)
Anthony Baxterc2a5a632004-08-02 06:10:11 +00003712{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003713 basicblock *b;
3714 int bsize, totsize, extended_arg_count, last_extended_arg_count = 0;
3715 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003716
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003717 /* Compute the size of each block and fixup jump args.
3718 Replace block pointer with position in bytecode. */
Neal Norwitzf1d50682005-10-23 23:00:41 +00003719start:
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003720 totsize = 0;
3721 for (i = a->a_nblocks - 1; i >= 0; i--) {
3722 b = a->a_postorder[i];
3723 bsize = blocksize(b);
3724 b->b_offset = totsize;
3725 totsize += bsize;
3726 }
3727 extended_arg_count = 0;
3728 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
3729 bsize = b->b_offset;
3730 for (i = 0; i < b->b_iused; i++) {
3731 struct instr *instr = &b->b_instr[i];
3732 /* Relative jumps are computed relative to
3733 the instruction pointer after fetching
3734 the jump instruction.
3735 */
3736 bsize += instrsize(instr);
3737 if (instr->i_jabs)
3738 instr->i_oparg = instr->i_target->b_offset;
3739 else if (instr->i_jrel) {
3740 int delta = instr->i_target->b_offset - bsize;
3741 instr->i_oparg = delta;
3742 }
3743 else
3744 continue;
3745 if (instr->i_oparg > 0xffff)
3746 extended_arg_count++;
3747 }
3748 }
Neal Norwitzf1d50682005-10-23 23:00:41 +00003749
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003750 /* XXX: This is an awful hack that could hurt performance, but
3751 on the bright side it should work until we come up
3752 with a better solution.
Neal Norwitzf1d50682005-10-23 23:00:41 +00003753
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003754 In the meantime, should the goto be dropped in favor
3755 of a loop?
Neal Norwitzf1d50682005-10-23 23:00:41 +00003756
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003757 The issue is that in the first loop blocksize() is called
3758 which calls instrsize() which requires i_oparg be set
3759 appropriately. There is a bootstrap problem because
3760 i_oparg is calculated in the second loop above.
Neal Norwitzf1d50682005-10-23 23:00:41 +00003761
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003762 So we loop until we stop seeing new EXTENDED_ARGs.
3763 The only EXTENDED_ARGs that could be popping up are
3764 ones in jump instructions. So this should converge
3765 fairly quickly.
3766 */
3767 if (last_extended_arg_count != extended_arg_count) {
3768 last_extended_arg_count = extended_arg_count;
3769 goto start;
3770 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003771}
3772
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003773static PyObject *
3774dict_keys_inorder(PyObject *dict, int offset)
3775{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003776 PyObject *tuple, *k, *v;
3777 Py_ssize_t i, pos = 0, size = PyDict_Size(dict);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003778
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003779 tuple = PyTuple_New(size);
3780 if (tuple == NULL)
3781 return NULL;
3782 while (PyDict_Next(dict, &pos, &k, &v)) {
3783 i = PyInt_AS_LONG(v);
3784 k = PyTuple_GET_ITEM(k, 0);
3785 Py_INCREF(k);
3786 assert((i - offset) < size);
3787 assert((i - offset) >= 0);
3788 PyTuple_SET_ITEM(tuple, i - offset, k);
3789 }
3790 return tuple;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003791}
3792
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003793static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003794compute_code_flags(struct compiler *c)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003795{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003796 PySTEntryObject *ste = c->u->u_ste;
3797 int flags = 0, n;
3798 if (ste->ste_type != ModuleBlock)
3799 flags |= CO_NEWLOCALS;
3800 if (ste->ste_type == FunctionBlock) {
3801 if (!ste->ste_unoptimized)
3802 flags |= CO_OPTIMIZED;
3803 if (ste->ste_nested)
3804 flags |= CO_NESTED;
3805 if (ste->ste_generator)
3806 flags |= CO_GENERATOR;
3807 }
3808 if (ste->ste_varargs)
3809 flags |= CO_VARARGS;
3810 if (ste->ste_varkeywords)
3811 flags |= CO_VARKEYWORDS;
3812 if (ste->ste_generator)
3813 flags |= CO_GENERATOR;
Thomas Wouters5e9f1fa2006-02-28 20:02:27 +00003814
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003815 /* (Only) inherit compilerflags in PyCF_MASK */
3816 flags |= (c->c_flags->cf_flags & PyCF_MASK);
Thomas Wouters5e9f1fa2006-02-28 20:02:27 +00003817
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003818 n = PyDict_Size(c->u->u_freevars);
3819 if (n < 0)
3820 return -1;
3821 if (n == 0) {
3822 n = PyDict_Size(c->u->u_cellvars);
3823 if (n < 0)
3824 return -1;
3825 if (n == 0) {
3826 flags |= CO_NOFREE;
3827 }
3828 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00003829
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003830 return flags;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00003831}
3832
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003833static PyCodeObject *
3834makecode(struct compiler *c, struct assembler *a)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003835{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003836 PyObject *tmp;
3837 PyCodeObject *co = NULL;
3838 PyObject *consts = NULL;
3839 PyObject *names = NULL;
3840 PyObject *varnames = NULL;
3841 PyObject *filename = NULL;
3842 PyObject *name = NULL;
3843 PyObject *freevars = NULL;
3844 PyObject *cellvars = NULL;
3845 PyObject *bytecode = NULL;
3846 int nlocals, flags;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003847
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003848 tmp = dict_keys_inorder(c->u->u_consts, 0);
3849 if (!tmp)
3850 goto error;
3851 consts = PySequence_List(tmp); /* optimize_code requires a list */
3852 Py_DECREF(tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003853
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003854 names = dict_keys_inorder(c->u->u_names, 0);
3855 varnames = dict_keys_inorder(c->u->u_varnames, 0);
3856 if (!consts || !names || !varnames)
3857 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003858
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003859 cellvars = dict_keys_inorder(c->u->u_cellvars, 0);
3860 if (!cellvars)
3861 goto error;
3862 freevars = dict_keys_inorder(c->u->u_freevars, PyTuple_Size(cellvars));
3863 if (!freevars)
3864 goto error;
3865 filename = PyString_FromString(c->c_filename);
3866 if (!filename)
3867 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003868
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003869 nlocals = PyDict_Size(c->u->u_varnames);
3870 flags = compute_code_flags(c);
3871 if (flags < 0)
3872 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003873
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003874 bytecode = PyCode_Optimize(a->a_bytecode, consts, names, a->a_lnotab);
3875 if (!bytecode)
3876 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003877
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003878 tmp = PyList_AsTuple(consts); /* PyCode_New requires a tuple */
3879 if (!tmp)
3880 goto error;
3881 Py_DECREF(consts);
3882 consts = tmp;
3883
3884 co = PyCode_New(c->u->u_argcount, nlocals, stackdepth(c), flags,
3885 bytecode, consts, names, varnames,
3886 freevars, cellvars,
3887 filename, c->u->u_name,
3888 c->u->u_firstlineno,
3889 a->a_lnotab);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003890 error:
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003891 Py_XDECREF(consts);
3892 Py_XDECREF(names);
3893 Py_XDECREF(varnames);
3894 Py_XDECREF(filename);
3895 Py_XDECREF(name);
3896 Py_XDECREF(freevars);
3897 Py_XDECREF(cellvars);
3898 Py_XDECREF(bytecode);
3899 return co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003900}
3901
Neal Norwitz4ffedad2006-08-04 04:58:47 +00003902
3903/* For debugging purposes only */
3904#if 0
3905static void
3906dump_instr(const struct instr *i)
3907{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003908 const char *jrel = i->i_jrel ? "jrel " : "";
3909 const char *jabs = i->i_jabs ? "jabs " : "";
3910 char arg[128];
Neal Norwitz4ffedad2006-08-04 04:58:47 +00003911
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003912 *arg = '\0';
3913 if (i->i_hasarg)
3914 sprintf(arg, "arg: %d ", i->i_oparg);
Neal Norwitz4ffedad2006-08-04 04:58:47 +00003915
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003916 fprintf(stderr, "line: %d, opcode: %d %s%s%s\n",
3917 i->i_lineno, i->i_opcode, arg, jabs, jrel);
Neal Norwitz4ffedad2006-08-04 04:58:47 +00003918}
3919
3920static void
3921dump_basicblock(const basicblock *b)
3922{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003923 const char *seen = b->b_seen ? "seen " : "";
3924 const char *b_return = b->b_return ? "return " : "";
3925 fprintf(stderr, "used: %d, depth: %d, offset: %d %s%s\n",
3926 b->b_iused, b->b_startdepth, b->b_offset, seen, b_return);
3927 if (b->b_instr) {
3928 int i;
3929 for (i = 0; i < b->b_iused; i++) {
3930 fprintf(stderr, " [%02d] ", i);
3931 dump_instr(b->b_instr + i);
3932 }
3933 }
Neal Norwitz4ffedad2006-08-04 04:58:47 +00003934}
3935#endif
3936
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003937static PyCodeObject *
3938assemble(struct compiler *c, int addNone)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003939{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003940 basicblock *b, *entryblock;
3941 struct assembler a;
3942 int i, j, nblocks;
3943 PyCodeObject *co = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003944
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003945 /* Make sure every block that falls off the end returns None.
3946 XXX NEXT_BLOCK() isn't quite right, because if the last
3947 block ends with a jump or return b_next shouldn't set.
3948 */
3949 if (!c->u->u_curblock->b_return) {
3950 NEXT_BLOCK(c);
3951 if (addNone)
3952 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3953 ADDOP(c, RETURN_VALUE);
3954 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003955
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003956 nblocks = 0;
3957 entryblock = NULL;
3958 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
3959 nblocks++;
3960 entryblock = b;
3961 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003962
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003963 /* Set firstlineno if it wasn't explicitly set. */
3964 if (!c->u->u_firstlineno) {
3965 if (entryblock && entryblock->b_instr)
3966 c->u->u_firstlineno = entryblock->b_instr->i_lineno;
3967 else
3968 c->u->u_firstlineno = 1;
3969 }
3970 if (!assemble_init(&a, nblocks, c->u->u_firstlineno))
3971 goto error;
3972 dfs(c, entryblock, &a);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003973
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003974 /* Can't modify the bytecode after computing jump offsets. */
3975 assemble_jump_offsets(&a, c);
Tim Petersb6c3cea2001-06-26 03:36:28 +00003976
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003977 /* Emit code in reverse postorder from dfs. */
3978 for (i = a.a_nblocks - 1; i >= 0; i--) {
3979 b = a.a_postorder[i];
3980 for (j = 0; j < b->b_iused; j++)
3981 if (!assemble_emit(&a, &b->b_instr[j]))
3982 goto error;
3983 }
Tim Petersb6c3cea2001-06-26 03:36:28 +00003984
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003985 if (_PyString_Resize(&a.a_lnotab, a.a_lnotab_off) < 0)
3986 goto error;
3987 if (_PyString_Resize(&a.a_bytecode, a.a_offset) < 0)
3988 goto error;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003989
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003990 co = makecode(c, &a);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003991 error:
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00003992 assemble_free(&a);
3993 return co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003994}