blob: 5341e6b53597d8fed85d5107e00c706b3ce481a5 [file] [log] [blame]
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001/*
2 * This file compiles an abstract syntax tree (AST) into Python bytecode.
3 *
4 * The primary entry point is PyAST_Compile(), which returns a
5 * PyCodeObject. The compiler makes several passes to build the code
6 * object:
7 * 1. Checks for future statements. See future.c
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008 * 2. Builds a symbol table. See symtable.c.
Thomas Wouters89f507f2006-12-13 04:49:30 +00009 * 3. Generate code for basic blocks. See compiler_mod() in this file.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000010 * 4. Assemble the basic blocks into final code. See assemble() in
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000011 * this file.
Thomas Wouters89f507f2006-12-13 04:49:30 +000012 * 5. Optimize the byte code (peephole optimizations). See peephole.c
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000013 *
14 * Note that compiler_mod() suggests module, but the module ast type
15 * (mod_ty) has cases for expressions and interactive statements.
Nick Coghlan944d3eb2005-11-16 12:46:55 +000016 *
Jeremy Hyltone9357b22006-03-01 15:47:05 +000017 * CAUTION: The VISIT_* macros abort the current function when they
18 * encounter a problem. So don't invoke them when there is memory
19 * which needs to be released. Code blocks are OK, as the compiler
Thomas Wouters89f507f2006-12-13 04:49:30 +000020 * structure takes care of releasing those. Use the arena to manage
21 * objects.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000022 */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000023
Guido van Rossum79f25d91997-04-29 20:08:16 +000024#include "Python.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000025
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000026#include "Python-ast.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000027#include "node.h"
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
Nick Coghlan650f0d02007-04-15 12:05:43 +000042#define COMP_GENEXP 0
43#define COMP_LISTCOMP 1
44#define COMP_SETCOMP 2
Guido van Rossum992d4a32007-07-11 13:09:30 +000045#define COMP_DICTCOMP 3
Nick Coghlan650f0d02007-04-15 12:05:43 +000046
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000047struct instr {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000048 unsigned i_jabs : 1;
49 unsigned i_jrel : 1;
50 unsigned i_hasarg : 1;
51 unsigned char i_opcode;
52 int i_oparg;
53 struct basicblock_ *i_target; /* target block (if jump instruction) */
54 int i_lineno;
Guido van Rossum3f5da241990-12-20 15:06:42 +000055};
56
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000057typedef struct basicblock_ {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000058 /* Each basicblock in a compilation unit is linked via b_list in the
59 reverse order that the block are allocated. b_list points to the next
60 block, not to be confused with b_next, which is next by control flow. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000061 struct basicblock_ *b_list;
62 /* number of instructions used */
63 int b_iused;
64 /* length of instruction array (b_instr) */
65 int b_ialloc;
66 /* pointer to an array of instructions, initially NULL */
67 struct instr *b_instr;
68 /* If b_next is non-NULL, it is a pointer to the next
69 block reached by normal control flow. */
70 struct basicblock_ *b_next;
71 /* b_seen is used to perform a DFS of basicblocks. */
72 unsigned b_seen : 1;
73 /* b_return is true if a RETURN_VALUE opcode is inserted. */
74 unsigned b_return : 1;
75 /* depth of stack upon entry of block, computed by stackdepth() */
76 int b_startdepth;
77 /* instruction offset for block, computed by assemble_jump_offsets() */
78 int b_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000079} basicblock;
80
81/* fblockinfo tracks the current frame block.
82
Jeremy Hyltone9357b22006-03-01 15:47:05 +000083A frame block is used to handle loops, try/except, and try/finally.
84It's called a frame block to distinguish it from a basic block in the
85compiler IR.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000086*/
87
88enum fblocktype { LOOP, EXCEPT, FINALLY_TRY, FINALLY_END };
89
90struct fblockinfo {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000091 enum fblocktype fb_type;
92 basicblock *fb_block;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000093};
94
95/* The following items change on entry and exit of code blocks.
96 They must be saved and restored when returning to a block.
97*/
98struct compiler_unit {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000099 PySTEntryObject *u_ste;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000100
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000101 PyObject *u_name;
102 /* The following fields are dicts that map objects to
103 the index of them in co_XXX. The index is used as
104 the argument for opcodes that refer to those collections.
105 */
106 PyObject *u_consts; /* all constants */
107 PyObject *u_names; /* all names */
108 PyObject *u_varnames; /* local variables */
109 PyObject *u_cellvars; /* cell variables */
110 PyObject *u_freevars; /* free variables */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000111
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000112 PyObject *u_private; /* for private name mangling */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000113
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000114 int u_argcount; /* number of arguments for block */
115 int u_kwonlyargcount; /* number of keyword only arguments for block */
116 /* Pointer to the most recently allocated block. By following b_list
117 members, you can reach all early allocated blocks. */
118 basicblock *u_blocks;
119 basicblock *u_curblock; /* pointer to current block */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000120
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000121 int u_nfblocks;
122 struct fblockinfo u_fblock[CO_MAXBLOCKS];
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000123
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000124 int u_firstlineno; /* the first lineno of the block */
125 int u_lineno; /* the lineno for the current stmt */
126 int u_lineno_set; /* boolean to indicate whether instr
127 has been generated with current lineno */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000128};
129
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000130/* This struct captures the global state of a compilation.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000131
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000132The u pointer points to the current compilation unit, while units
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000133for enclosing blocks are stored in c_stack. The u and c_stack are
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000134managed by compiler_enter_scope() and compiler_exit_scope().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000135*/
136
137struct compiler {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000138 const char *c_filename;
139 struct symtable *c_st;
140 PyFutureFeatures *c_future; /* pointer to module's __future__ */
141 PyCompilerFlags *c_flags;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000142
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000143 int c_interactive; /* true if in interactive mode */
144 int c_nestlevel;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000145
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000146 struct compiler_unit *u; /* compiler state for current block */
147 PyObject *c_stack; /* Python list holding compiler_unit ptrs */
148 PyArena *c_arena; /* pointer to memory allocation arena */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000149};
150
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000151static int compiler_enter_scope(struct compiler *, identifier, void *, int);
152static void compiler_free(struct compiler *);
153static basicblock *compiler_new_block(struct compiler *);
154static int compiler_next_instr(struct compiler *, basicblock *);
155static int compiler_addop(struct compiler *, int);
156static int compiler_addop_o(struct compiler *, int, PyObject *, PyObject *);
157static int compiler_addop_i(struct compiler *, int, int);
158static int compiler_addop_j(struct compiler *, int, basicblock *, int);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000159static basicblock *compiler_use_new_block(struct compiler *);
160static int compiler_error(struct compiler *, const char *);
161static int compiler_nameop(struct compiler *, identifier, expr_context_ty);
162
163static PyCodeObject *compiler_mod(struct compiler *, mod_ty);
164static int compiler_visit_stmt(struct compiler *, stmt_ty);
165static int compiler_visit_keyword(struct compiler *, keyword_ty);
166static int compiler_visit_expr(struct compiler *, expr_ty);
167static int compiler_augassign(struct compiler *, stmt_ty);
168static int compiler_visit_slice(struct compiler *, slice_ty,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000169 expr_context_ty);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000170
171static int compiler_push_fblock(struct compiler *, enum fblocktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000172 basicblock *);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000173static void compiler_pop_fblock(struct compiler *, enum fblocktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000174 basicblock *);
Thomas Wouters89f507f2006-12-13 04:49:30 +0000175/* Returns true if there is a loop on the fblock stack. */
176static int compiler_in_loop(struct compiler *);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000177
178static int inplace_binop(struct compiler *, operator_ty);
179static int expr_constant(expr_ty e);
180
Guido van Rossumc2e20742006-02-27 22:32:47 +0000181static int compiler_with(struct compiler *, stmt_ty);
Guido van Rossum52cc1d82007-03-18 15:41:51 +0000182static int compiler_call_helper(struct compiler *c, int n,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000183 asdl_seq *args,
184 asdl_seq *keywords,
185 expr_ty starargs,
186 expr_ty kwargs);
Guido van Rossumc2e20742006-02-27 22:32:47 +0000187
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000188static PyCodeObject *assemble(struct compiler *, int addNone);
189static PyObject *__doc__;
190
Benjamin Petersonb173f782009-05-05 22:31:58 +0000191#define COMPILER_CAPSULE_NAME_COMPILER_UNIT "compile.c compiler unit"
192
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000193PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000194_Py_Mangle(PyObject *privateobj, PyObject *ident)
Michael W. Hudson60934622004-08-12 17:56:29 +0000195{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000196 /* Name mangling: __private becomes _classname__private.
197 This is independent from how the name is used. */
198 const Py_UNICODE *p, *name = PyUnicode_AS_UNICODE(ident);
199 Py_UNICODE *buffer;
200 size_t nlen, plen;
201 if (privateobj == NULL || !PyUnicode_Check(privateobj) ||
202 name == NULL || name[0] != '_' || name[1] != '_') {
203 Py_INCREF(ident);
204 return ident;
205 }
206 p = PyUnicode_AS_UNICODE(privateobj);
207 nlen = Py_UNICODE_strlen(name);
208 /* Don't mangle __id__ or names with dots.
Guido van Rossumd8faa362007-04-27 19:54:29 +0000209
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000210 The only time a name with a dot can occur is when
211 we are compiling an import statement that has a
212 package name.
Guido van Rossumd8faa362007-04-27 19:54:29 +0000213
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000214 TODO(jhylton): Decide whether we want to support
215 mangling of the module name, e.g. __M.X.
216 */
217 if ((name[nlen-1] == '_' && name[nlen-2] == '_')
218 || Py_UNICODE_strchr(name, '.')) {
219 Py_INCREF(ident);
220 return ident; /* Don't mangle __whatever__ */
221 }
222 /* Strip leading underscores from class name */
223 while (*p == '_')
224 p++;
225 if (*p == 0) {
226 Py_INCREF(ident);
227 return ident; /* Don't mangle if class is just underscores */
228 }
229 plen = Py_UNICODE_strlen(p);
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000230
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000231 assert(1 <= PY_SSIZE_T_MAX - nlen);
232 assert(1 + nlen <= PY_SSIZE_T_MAX - plen);
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000233
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000234 ident = PyUnicode_FromStringAndSize(NULL, 1 + nlen + plen);
235 if (!ident)
236 return 0;
237 /* ident = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
238 buffer = PyUnicode_AS_UNICODE(ident);
239 buffer[0] = '_';
240 Py_UNICODE_strncpy(buffer+1, p, plen);
241 Py_UNICODE_strcpy(buffer+1+plen, name);
242 return ident;
Michael W. Hudson60934622004-08-12 17:56:29 +0000243}
244
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000245static int
246compiler_init(struct compiler *c)
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000247{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000248 memset(c, 0, sizeof(struct compiler));
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000249
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000250 c->c_stack = PyList_New(0);
251 if (!c->c_stack)
252 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000253
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000254 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000255}
256
257PyCodeObject *
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000258PyAST_Compile(mod_ty mod, const char *filename, PyCompilerFlags *flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000259 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000260{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000261 struct compiler c;
262 PyCodeObject *co = NULL;
263 PyCompilerFlags local_flags;
264 int merged;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000265
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000266 if (!__doc__) {
267 __doc__ = PyUnicode_InternFromString("__doc__");
268 if (!__doc__)
269 return NULL;
270 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000271
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000272 if (!compiler_init(&c))
273 return NULL;
274 c.c_filename = filename;
275 c.c_arena = arena;
276 c.c_future = PyFuture_FromAST(mod, filename);
277 if (c.c_future == NULL)
278 goto finally;
279 if (!flags) {
280 local_flags.cf_flags = 0;
281 flags = &local_flags;
282 }
283 merged = c.c_future->ff_features | flags->cf_flags;
284 c.c_future->ff_features = merged;
285 flags->cf_flags = merged;
286 c.c_flags = flags;
287 c.c_nestlevel = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000288
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000289 c.c_st = PySymtable_Build(mod, filename, c.c_future);
290 if (c.c_st == NULL) {
291 if (!PyErr_Occurred())
292 PyErr_SetString(PyExc_SystemError, "no symtable");
293 goto finally;
294 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000295
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000296 co = compiler_mod(&c, mod);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000297
Thomas Wouters1175c432006-02-27 22:49:54 +0000298 finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000299 compiler_free(&c);
300 assert(co || PyErr_Occurred());
301 return co;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000302}
303
304PyCodeObject *
305PyNode_Compile(struct _node *n, const char *filename)
306{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000307 PyCodeObject *co = NULL;
308 mod_ty mod;
309 PyArena *arena = PyArena_New();
310 if (!arena)
311 return NULL;
312 mod = PyAST_FromNode(n, NULL, filename, arena);
313 if (mod)
314 co = PyAST_Compile(mod, filename, NULL, arena);
315 PyArena_Free(arena);
316 return co;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000317}
318
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000319static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000320compiler_free(struct compiler *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000321{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000322 if (c->c_st)
323 PySymtable_Free(c->c_st);
324 if (c->c_future)
325 PyObject_Free(c->c_future);
326 Py_DECREF(c->c_stack);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000327}
328
Guido van Rossum79f25d91997-04-29 20:08:16 +0000329static PyObject *
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000330list2dict(PyObject *list)
Guido van Rossum2dff9911992-09-03 20:50:59 +0000331{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000332 Py_ssize_t i, n;
333 PyObject *v, *k;
334 PyObject *dict = PyDict_New();
335 if (!dict) return NULL;
Guido van Rossumd076c731998-10-07 19:42:25 +0000336
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000337 n = PyList_Size(list);
338 for (i = 0; i < n; i++) {
339 v = PyLong_FromLong(i);
340 if (!v) {
341 Py_DECREF(dict);
342 return NULL;
343 }
344 k = PyList_GET_ITEM(list, i);
345 k = PyTuple_Pack(2, k, k->ob_type);
346 if (k == NULL || PyDict_SetItem(dict, k, v) < 0) {
347 Py_XDECREF(k);
348 Py_DECREF(v);
349 Py_DECREF(dict);
350 return NULL;
351 }
352 Py_DECREF(k);
353 Py_DECREF(v);
354 }
355 return dict;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000356}
357
358/* Return new dict containing names from src that match scope(s).
359
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000360src is a symbol table dictionary. If the scope of a name matches
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000361either scope_type or flag is set, insert it into the new dict. The
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000362values are integers, starting at offset and increasing by one for
363each key.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000364*/
365
366static PyObject *
367dictbytype(PyObject *src, int scope_type, int flag, int offset)
368{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000369 Py_ssize_t pos = 0, i = offset, scope;
370 PyObject *k, *v, *dest = PyDict_New();
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000371
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000372 assert(offset >= 0);
373 if (dest == NULL)
374 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000375
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000376 while (PyDict_Next(src, &pos, &k, &v)) {
377 /* XXX this should probably be a macro in symtable.h */
378 long vi;
379 assert(PyLong_Check(v));
380 vi = PyLong_AS_LONG(v);
381 scope = (vi >> SCOPE_OFFSET) & SCOPE_MASK;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000382
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000383 if (scope == scope_type || vi & flag) {
384 PyObject *tuple, *item = PyLong_FromLong(i);
385 if (item == NULL) {
386 Py_DECREF(dest);
387 return NULL;
388 }
389 i++;
390 tuple = PyTuple_Pack(2, k, k->ob_type);
391 if (!tuple || PyDict_SetItem(dest, tuple, item) < 0) {
392 Py_DECREF(item);
393 Py_DECREF(dest);
394 Py_XDECREF(tuple);
395 return NULL;
396 }
397 Py_DECREF(item);
398 Py_DECREF(tuple);
399 }
400 }
401 return dest;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000402}
403
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000404static void
405compiler_unit_check(struct compiler_unit *u)
406{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000407 basicblock *block;
408 for (block = u->u_blocks; block != NULL; block = block->b_list) {
409 assert((void *)block != (void *)0xcbcbcbcb);
410 assert((void *)block != (void *)0xfbfbfbfb);
411 assert((void *)block != (void *)0xdbdbdbdb);
412 if (block->b_instr != NULL) {
413 assert(block->b_ialloc > 0);
414 assert(block->b_iused > 0);
415 assert(block->b_ialloc >= block->b_iused);
416 }
417 else {
418 assert (block->b_iused == 0);
419 assert (block->b_ialloc == 0);
420 }
421 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000422}
423
424static void
425compiler_unit_free(struct compiler_unit *u)
426{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000427 basicblock *b, *next;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000428
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000429 compiler_unit_check(u);
430 b = u->u_blocks;
431 while (b != NULL) {
432 if (b->b_instr)
433 PyObject_Free((void *)b->b_instr);
434 next = b->b_list;
435 PyObject_Free((void *)b);
436 b = next;
437 }
438 Py_CLEAR(u->u_ste);
439 Py_CLEAR(u->u_name);
440 Py_CLEAR(u->u_consts);
441 Py_CLEAR(u->u_names);
442 Py_CLEAR(u->u_varnames);
443 Py_CLEAR(u->u_freevars);
444 Py_CLEAR(u->u_cellvars);
445 Py_CLEAR(u->u_private);
446 PyObject_Free(u);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000447}
448
449static int
450compiler_enter_scope(struct compiler *c, identifier name, void *key,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000451 int lineno)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000452{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000453 struct compiler_unit *u;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000454
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000455 u = (struct compiler_unit *)PyObject_Malloc(sizeof(
456 struct compiler_unit));
457 if (!u) {
458 PyErr_NoMemory();
459 return 0;
460 }
461 memset(u, 0, sizeof(struct compiler_unit));
462 u->u_argcount = 0;
463 u->u_kwonlyargcount = 0;
464 u->u_ste = PySymtable_Lookup(c->c_st, key);
465 if (!u->u_ste) {
466 compiler_unit_free(u);
467 return 0;
468 }
469 Py_INCREF(name);
470 u->u_name = name;
471 u->u_varnames = list2dict(u->u_ste->ste_varnames);
472 u->u_cellvars = dictbytype(u->u_ste->ste_symbols, CELL, 0, 0);
473 if (!u->u_varnames || !u->u_cellvars) {
474 compiler_unit_free(u);
475 return 0;
476 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000477
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000478 u->u_freevars = dictbytype(u->u_ste->ste_symbols, FREE, DEF_FREE_CLASS,
479 PyDict_Size(u->u_cellvars));
480 if (!u->u_freevars) {
481 compiler_unit_free(u);
482 return 0;
483 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000484
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000485 u->u_blocks = NULL;
486 u->u_nfblocks = 0;
487 u->u_firstlineno = lineno;
488 u->u_lineno = 0;
489 u->u_lineno_set = 0;
490 u->u_consts = PyDict_New();
491 if (!u->u_consts) {
492 compiler_unit_free(u);
493 return 0;
494 }
495 u->u_names = PyDict_New();
496 if (!u->u_names) {
497 compiler_unit_free(u);
498 return 0;
499 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000500
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000501 u->u_private = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000502
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000503 /* Push the old compiler_unit on the stack. */
504 if (c->u) {
505 PyObject *capsule = PyCapsule_New(c->u, COMPILER_CAPSULE_NAME_COMPILER_UNIT, NULL);
506 if (!capsule || PyList_Append(c->c_stack, capsule) < 0) {
507 Py_XDECREF(capsule);
508 compiler_unit_free(u);
509 return 0;
510 }
511 Py_DECREF(capsule);
512 u->u_private = c->u->u_private;
513 Py_XINCREF(u->u_private);
514 }
515 c->u = u;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000516
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000517 c->c_nestlevel++;
518 if (compiler_use_new_block(c) == NULL)
519 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000520
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000521 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000522}
523
Neil Schemenauerc396d9e2005-10-25 06:30:14 +0000524static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000525compiler_exit_scope(struct compiler *c)
526{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000527 int n;
528 PyObject *capsule;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000529
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000530 c->c_nestlevel--;
531 compiler_unit_free(c->u);
532 /* Restore c->u to the parent unit. */
533 n = PyList_GET_SIZE(c->c_stack) - 1;
534 if (n >= 0) {
535 capsule = PyList_GET_ITEM(c->c_stack, n);
536 c->u = (struct compiler_unit *)PyCapsule_GetPointer(capsule, COMPILER_CAPSULE_NAME_COMPILER_UNIT);
537 assert(c->u);
538 /* we are deleting from a list so this really shouldn't fail */
539 if (PySequence_DelItem(c->c_stack, n) < 0)
540 Py_FatalError("compiler_exit_scope()");
541 compiler_unit_check(c->u);
542 }
543 else
544 c->u = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000545
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000546}
547
548/* Allocate a new block and return a pointer to it.
549 Returns NULL on error.
550*/
551
552static basicblock *
553compiler_new_block(struct compiler *c)
554{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000555 basicblock *b;
556 struct compiler_unit *u;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000557
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000558 u = c->u;
559 b = (basicblock *)PyObject_Malloc(sizeof(basicblock));
560 if (b == NULL) {
561 PyErr_NoMemory();
562 return NULL;
563 }
564 memset((void *)b, 0, sizeof(basicblock));
565 /* Extend the singly linked list of blocks with new block. */
566 b->b_list = u->u_blocks;
567 u->u_blocks = b;
568 return b;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000569}
570
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000571static basicblock *
572compiler_use_new_block(struct compiler *c)
573{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000574 basicblock *block = compiler_new_block(c);
575 if (block == NULL)
576 return NULL;
577 c->u->u_curblock = block;
578 return block;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000579}
580
581static basicblock *
582compiler_next_block(struct compiler *c)
583{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000584 basicblock *block = compiler_new_block(c);
585 if (block == NULL)
586 return NULL;
587 c->u->u_curblock->b_next = block;
588 c->u->u_curblock = block;
589 return block;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000590}
591
592static basicblock *
593compiler_use_next_block(struct compiler *c, basicblock *block)
594{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000595 assert(block != NULL);
596 c->u->u_curblock->b_next = block;
597 c->u->u_curblock = block;
598 return block;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000599}
600
601/* Returns the offset of the next instruction in the current block's
602 b_instr array. Resizes the b_instr as necessary.
603 Returns -1 on failure.
Thomas Wouters89f507f2006-12-13 04:49:30 +0000604*/
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000605
606static int
607compiler_next_instr(struct compiler *c, basicblock *b)
608{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000609 assert(b != NULL);
610 if (b->b_instr == NULL) {
611 b->b_instr = (struct instr *)PyObject_Malloc(
612 sizeof(struct instr) * DEFAULT_BLOCK_SIZE);
613 if (b->b_instr == NULL) {
614 PyErr_NoMemory();
615 return -1;
616 }
617 b->b_ialloc = DEFAULT_BLOCK_SIZE;
618 memset((char *)b->b_instr, 0,
619 sizeof(struct instr) * DEFAULT_BLOCK_SIZE);
620 }
621 else if (b->b_iused == b->b_ialloc) {
622 struct instr *tmp;
623 size_t oldsize, newsize;
624 oldsize = b->b_ialloc * sizeof(struct instr);
625 newsize = oldsize << 1;
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000626
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000627 if (oldsize > (PY_SIZE_MAX >> 1)) {
628 PyErr_NoMemory();
629 return -1;
630 }
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000631
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000632 if (newsize == 0) {
633 PyErr_NoMemory();
634 return -1;
635 }
636 b->b_ialloc <<= 1;
637 tmp = (struct instr *)PyObject_Realloc(
638 (void *)b->b_instr, newsize);
639 if (tmp == NULL) {
640 PyErr_NoMemory();
641 return -1;
642 }
643 b->b_instr = tmp;
644 memset((char *)b->b_instr + oldsize, 0, newsize - oldsize);
645 }
646 return b->b_iused++;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000647}
648
Christian Heimes2202f872008-02-06 14:31:34 +0000649/* Set the i_lineno member of the instruction at offset off if the
650 line number for the current expression/statement has not
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000651 already been set. If it has been set, the call has no effect.
652
Christian Heimes2202f872008-02-06 14:31:34 +0000653 The line number is reset in the following cases:
654 - when entering a new scope
655 - on each statement
656 - on each expression that start a new line
657 - before the "except" clause
658 - before the "for" and "while" expressions
Thomas Wouters89f507f2006-12-13 04:49:30 +0000659*/
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000660
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000661static void
662compiler_set_lineno(struct compiler *c, int off)
663{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000664 basicblock *b;
665 if (c->u->u_lineno_set)
666 return;
667 c->u->u_lineno_set = 1;
668 b = c->u->u_curblock;
669 b->b_instr[off].i_lineno = c->u->u_lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000670}
671
672static int
673opcode_stack_effect(int opcode, int oparg)
674{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000675 switch (opcode) {
676 case POP_TOP:
677 return -1;
678 case ROT_TWO:
679 case ROT_THREE:
680 return 0;
681 case DUP_TOP:
682 return 1;
Antoine Pitrou74a69fa2010-09-04 18:43:52 +0000683 case DUP_TOP_TWO:
684 return 2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000685
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000686 case UNARY_POSITIVE:
687 case UNARY_NEGATIVE:
688 case UNARY_NOT:
689 case UNARY_INVERT:
690 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000691
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000692 case SET_ADD:
693 case LIST_APPEND:
694 return -1;
695 case MAP_ADD:
696 return -2;
Neal Norwitz10be2ea2006-03-03 20:29:11 +0000697
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000698 case BINARY_POWER:
699 case BINARY_MULTIPLY:
700 case BINARY_MODULO:
701 case BINARY_ADD:
702 case BINARY_SUBTRACT:
703 case BINARY_SUBSCR:
704 case BINARY_FLOOR_DIVIDE:
705 case BINARY_TRUE_DIVIDE:
706 return -1;
707 case INPLACE_FLOOR_DIVIDE:
708 case INPLACE_TRUE_DIVIDE:
709 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000710
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000711 case INPLACE_ADD:
712 case INPLACE_SUBTRACT:
713 case INPLACE_MULTIPLY:
714 case INPLACE_MODULO:
715 return -1;
716 case STORE_SUBSCR:
717 return -3;
718 case STORE_MAP:
719 return -2;
720 case DELETE_SUBSCR:
721 return -2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000722
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000723 case BINARY_LSHIFT:
724 case BINARY_RSHIFT:
725 case BINARY_AND:
726 case BINARY_XOR:
727 case BINARY_OR:
728 return -1;
729 case INPLACE_POWER:
730 return -1;
731 case GET_ITER:
732 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000733
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000734 case PRINT_EXPR:
735 return -1;
736 case LOAD_BUILD_CLASS:
737 return 1;
738 case INPLACE_LSHIFT:
739 case INPLACE_RSHIFT:
740 case INPLACE_AND:
741 case INPLACE_XOR:
742 case INPLACE_OR:
743 return -1;
744 case BREAK_LOOP:
745 return 0;
746 case SETUP_WITH:
747 return 7;
748 case WITH_CLEANUP:
749 return -1; /* XXX Sometimes more */
750 case STORE_LOCALS:
751 return -1;
752 case RETURN_VALUE:
753 return -1;
754 case IMPORT_STAR:
755 return -1;
756 case YIELD_VALUE:
757 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000758
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000759 case POP_BLOCK:
760 return 0;
761 case POP_EXCEPT:
762 return 0; /* -3 except if bad bytecode */
763 case END_FINALLY:
764 return -1; /* or -2 or -3 if exception occurred */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000765
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000766 case STORE_NAME:
767 return -1;
768 case DELETE_NAME:
769 return 0;
770 case UNPACK_SEQUENCE:
771 return oparg-1;
772 case UNPACK_EX:
773 return (oparg&0xFF) + (oparg>>8);
774 case FOR_ITER:
775 return 1; /* or -1, at end of iterator */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000776
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000777 case STORE_ATTR:
778 return -2;
779 case DELETE_ATTR:
780 return -1;
781 case STORE_GLOBAL:
782 return -1;
783 case DELETE_GLOBAL:
784 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000785 case LOAD_CONST:
786 return 1;
787 case LOAD_NAME:
788 return 1;
789 case BUILD_TUPLE:
790 case BUILD_LIST:
791 case BUILD_SET:
792 return 1-oparg;
793 case BUILD_MAP:
794 return 1;
795 case LOAD_ATTR:
796 return 0;
797 case COMPARE_OP:
798 return -1;
799 case IMPORT_NAME:
800 return -1;
801 case IMPORT_FROM:
802 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000803
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000804 case JUMP_FORWARD:
805 case JUMP_IF_TRUE_OR_POP: /* -1 if jump not taken */
806 case JUMP_IF_FALSE_OR_POP: /* "" */
807 case JUMP_ABSOLUTE:
808 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000809
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000810 case POP_JUMP_IF_FALSE:
811 case POP_JUMP_IF_TRUE:
812 return -1;
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +0000813
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000814 case LOAD_GLOBAL:
815 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000816
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000817 case CONTINUE_LOOP:
818 return 0;
819 case SETUP_LOOP:
820 return 0;
821 case SETUP_EXCEPT:
822 case SETUP_FINALLY:
823 return 6; /* can push 3 values for the new exception
824 + 3 others for the previous exception state */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000825
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000826 case LOAD_FAST:
827 return 1;
828 case STORE_FAST:
829 return -1;
830 case DELETE_FAST:
831 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000832
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000833 case RAISE_VARARGS:
834 return -oparg;
Neal Norwitzc1505362006-12-28 06:47:50 +0000835#define NARGS(o) (((o) % 256) + 2*(((o) / 256) % 256))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000836 case CALL_FUNCTION:
837 return -NARGS(oparg);
838 case CALL_FUNCTION_VAR:
839 case CALL_FUNCTION_KW:
840 return -NARGS(oparg)-1;
841 case CALL_FUNCTION_VAR_KW:
842 return -NARGS(oparg)-2;
843 case MAKE_FUNCTION:
844 return -NARGS(oparg) - ((oparg >> 16) & 0xffff);
845 case MAKE_CLOSURE:
846 return -1 - NARGS(oparg) - ((oparg >> 16) & 0xffff);
Guido van Rossum4f72a782006-10-27 23:31:49 +0000847#undef NARGS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000848 case BUILD_SLICE:
849 if (oparg == 3)
850 return -2;
851 else
852 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000853
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000854 case LOAD_CLOSURE:
855 return 1;
856 case LOAD_DEREF:
857 return 1;
858 case STORE_DEREF:
859 return -1;
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +0000860 case DELETE_DEREF:
861 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000862 default:
863 fprintf(stderr, "opcode = %d\n", opcode);
864 Py_FatalError("opcode_stack_effect()");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000865
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000866 }
867 return 0; /* not reachable */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000868}
869
870/* Add an opcode with no argument.
871 Returns 0 on failure, 1 on success.
872*/
873
874static int
875compiler_addop(struct compiler *c, int opcode)
876{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000877 basicblock *b;
878 struct instr *i;
879 int off;
880 off = compiler_next_instr(c, c->u->u_curblock);
881 if (off < 0)
882 return 0;
883 b = c->u->u_curblock;
884 i = &b->b_instr[off];
885 i->i_opcode = opcode;
886 i->i_hasarg = 0;
887 if (opcode == RETURN_VALUE)
888 b->b_return = 1;
889 compiler_set_lineno(c, off);
890 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000891}
892
893static int
894compiler_add_o(struct compiler *c, PyObject *dict, PyObject *o)
895{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000896 PyObject *t, *v;
897 Py_ssize_t arg;
898 double d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000899
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000900 /* necessary to make sure types aren't coerced (e.g., int and long) */
901 /* _and_ to distinguish 0.0 from -0.0 e.g. on IEEE platforms */
902 if (PyFloat_Check(o)) {
903 d = PyFloat_AS_DOUBLE(o);
904 /* all we need is to make the tuple different in either the 0.0
905 * or -0.0 case from all others, just to avoid the "coercion".
906 */
907 if (d == 0.0 && copysign(1.0, d) < 0.0)
908 t = PyTuple_Pack(3, o, o->ob_type, Py_None);
909 else
910 t = PyTuple_Pack(2, o, o->ob_type);
911 }
912 else if (PyComplex_Check(o)) {
913 Py_complex z;
914 int real_negzero, imag_negzero;
915 /* For the complex case we must make complex(x, 0.)
916 different from complex(x, -0.) and complex(0., y)
917 different from complex(-0., y), for any x and y.
918 All four complex zeros must be distinguished.*/
919 z = PyComplex_AsCComplex(o);
920 real_negzero = z.real == 0.0 && copysign(1.0, z.real) < 0.0;
921 imag_negzero = z.imag == 0.0 && copysign(1.0, z.imag) < 0.0;
922 if (real_negzero && imag_negzero) {
923 t = PyTuple_Pack(5, o, o->ob_type,
924 Py_None, Py_None, Py_None);
Christian Heimes400adb02008-02-01 08:12:03 +0000925 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000926 else if (imag_negzero) {
927 t = PyTuple_Pack(4, o, o->ob_type, Py_None, Py_None);
Guido van Rossum04110fb2007-08-24 16:32:05 +0000928 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000929 else if (real_negzero) {
930 t = PyTuple_Pack(3, o, o->ob_type, Py_None);
931 }
932 else {
933 t = PyTuple_Pack(2, o, o->ob_type);
934 }
935 }
936 else {
937 t = PyTuple_Pack(2, o, o->ob_type);
938 }
939 if (t == NULL)
940 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000941
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000942 v = PyDict_GetItem(dict, t);
943 if (!v) {
944 if (PyErr_Occurred())
945 return -1;
946 arg = PyDict_Size(dict);
947 v = PyLong_FromLong(arg);
948 if (!v) {
949 Py_DECREF(t);
950 return -1;
951 }
952 if (PyDict_SetItem(dict, t, v) < 0) {
953 Py_DECREF(t);
954 Py_DECREF(v);
955 return -1;
956 }
957 Py_DECREF(v);
958 }
959 else
960 arg = PyLong_AsLong(v);
961 Py_DECREF(t);
962 return arg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000963}
964
965static int
966compiler_addop_o(struct compiler *c, int opcode, PyObject *dict,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000967 PyObject *o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000968{
969 int arg = compiler_add_o(c, dict, o);
970 if (arg < 0)
Antoine Pitrou9aee2c82010-06-22 21:49:39 +0000971 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000972 return compiler_addop_i(c, opcode, arg);
973}
974
975static int
976compiler_addop_name(struct compiler *c, int opcode, PyObject *dict,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000977 PyObject *o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000978{
979 int arg;
980 PyObject *mangled = _Py_Mangle(c->u->u_private, o);
981 if (!mangled)
Antoine Pitrou9aee2c82010-06-22 21:49:39 +0000982 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000983 arg = compiler_add_o(c, dict, mangled);
984 Py_DECREF(mangled);
985 if (arg < 0)
Antoine Pitrou9aee2c82010-06-22 21:49:39 +0000986 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000987 return compiler_addop_i(c, opcode, arg);
988}
989
990/* Add an opcode with an integer argument.
991 Returns 0 on failure, 1 on success.
992*/
993
994static int
995compiler_addop_i(struct compiler *c, int opcode, int oparg)
996{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000997 struct instr *i;
998 int off;
999 off = compiler_next_instr(c, c->u->u_curblock);
1000 if (off < 0)
1001 return 0;
1002 i = &c->u->u_curblock->b_instr[off];
1003 i->i_opcode = opcode;
1004 i->i_oparg = oparg;
1005 i->i_hasarg = 1;
1006 compiler_set_lineno(c, off);
1007 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001008}
1009
1010static int
1011compiler_addop_j(struct compiler *c, int opcode, basicblock *b, int absolute)
1012{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001013 struct instr *i;
1014 int off;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001015
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001016 assert(b != NULL);
1017 off = compiler_next_instr(c, c->u->u_curblock);
1018 if (off < 0)
1019 return 0;
1020 i = &c->u->u_curblock->b_instr[off];
1021 i->i_opcode = opcode;
1022 i->i_target = b;
1023 i->i_hasarg = 1;
1024 if (absolute)
1025 i->i_jabs = 1;
1026 else
1027 i->i_jrel = 1;
1028 compiler_set_lineno(c, off);
1029 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001030}
1031
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001032/* The distinction between NEW_BLOCK and NEXT_BLOCK is subtle. (I'd
1033 like to find better names.) NEW_BLOCK() creates a new block and sets
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001034 it as the current block. NEXT_BLOCK() also creates an implicit jump
1035 from the current block to the new block.
1036*/
1037
Thomas Wouters89f507f2006-12-13 04:49:30 +00001038/* The returns inside these macros make it impossible to decref objects
1039 created in the local function. Local objects should use the arena.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001040*/
1041
1042
1043#define NEW_BLOCK(C) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001044 if (compiler_use_new_block((C)) == NULL) \
1045 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001046}
1047
1048#define NEXT_BLOCK(C) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001049 if (compiler_next_block((C)) == NULL) \
1050 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001051}
1052
1053#define ADDOP(C, OP) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001054 if (!compiler_addop((C), (OP))) \
1055 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001056}
1057
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001058#define ADDOP_IN_SCOPE(C, OP) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001059 if (!compiler_addop((C), (OP))) { \
1060 compiler_exit_scope(c); \
1061 return 0; \
1062 } \
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001063}
1064
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001065#define ADDOP_O(C, OP, O, TYPE) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001066 if (!compiler_addop_o((C), (OP), (C)->u->u_ ## TYPE, (O))) \
1067 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001068}
1069
1070#define ADDOP_NAME(C, OP, O, TYPE) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001071 if (!compiler_addop_name((C), (OP), (C)->u->u_ ## TYPE, (O))) \
1072 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001073}
1074
1075#define ADDOP_I(C, OP, O) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001076 if (!compiler_addop_i((C), (OP), (O))) \
1077 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001078}
1079
1080#define ADDOP_JABS(C, OP, O) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001081 if (!compiler_addop_j((C), (OP), (O), 1)) \
1082 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001083}
1084
1085#define ADDOP_JREL(C, OP, O) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001086 if (!compiler_addop_j((C), (OP), (O), 0)) \
1087 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001088}
1089
1090/* VISIT and VISIT_SEQ takes an ASDL type as their second argument. They use
1091 the ASDL name to synthesize the name of the C type and the visit function.
1092*/
1093
1094#define VISIT(C, TYPE, V) {\
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001095 if (!compiler_visit_ ## TYPE((C), (V))) \
1096 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001097}
1098
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001099#define VISIT_IN_SCOPE(C, TYPE, V) {\
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001100 if (!compiler_visit_ ## TYPE((C), (V))) { \
1101 compiler_exit_scope(c); \
1102 return 0; \
1103 } \
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001104}
1105
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001106#define VISIT_SLICE(C, V, CTX) {\
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001107 if (!compiler_visit_slice((C), (V), (CTX))) \
1108 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001109}
1110
1111#define VISIT_SEQ(C, TYPE, SEQ) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001112 int _i; \
1113 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
1114 for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \
1115 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \
1116 if (!compiler_visit_ ## TYPE((C), elt)) \
1117 return 0; \
1118 } \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001119}
1120
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001121#define VISIT_SEQ_IN_SCOPE(C, TYPE, SEQ) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001122 int _i; \
1123 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
1124 for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \
1125 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \
1126 if (!compiler_visit_ ## TYPE((C), elt)) { \
1127 compiler_exit_scope(c); \
1128 return 0; \
1129 } \
1130 } \
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001131}
1132
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001133static int
1134compiler_isdocstring(stmt_ty s)
1135{
1136 if (s->kind != Expr_kind)
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00001137 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001138 return s->v.Expr.value->kind == Str_kind;
1139}
1140
1141/* Compile a sequence of statements, checking for a docstring. */
1142
1143static int
1144compiler_body(struct compiler *c, asdl_seq *stmts)
1145{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001146 int i = 0;
1147 stmt_ty st;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001148
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001149 if (!asdl_seq_LEN(stmts))
1150 return 1;
1151 st = (stmt_ty)asdl_seq_GET(stmts, 0);
1152 if (compiler_isdocstring(st) && Py_OptimizeFlag < 2) {
1153 /* don't generate docstrings if -OO */
1154 i = 1;
1155 VISIT(c, expr, st->v.Expr.value);
1156 if (!compiler_nameop(c, __doc__, Store))
1157 return 0;
1158 }
1159 for (; i < asdl_seq_LEN(stmts); i++)
1160 VISIT(c, stmt, (stmt_ty)asdl_seq_GET(stmts, i));
1161 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001162}
1163
1164static PyCodeObject *
1165compiler_mod(struct compiler *c, mod_ty mod)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001166{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001167 PyCodeObject *co;
1168 int addNone = 1;
1169 static PyObject *module;
1170 if (!module) {
1171 module = PyUnicode_InternFromString("<module>");
1172 if (!module)
1173 return NULL;
1174 }
1175 /* Use 0 for firstlineno initially, will fixup in assemble(). */
1176 if (!compiler_enter_scope(c, module, mod, 0))
1177 return NULL;
1178 switch (mod->kind) {
1179 case Module_kind:
1180 if (!compiler_body(c, mod->v.Module.body)) {
1181 compiler_exit_scope(c);
1182 return 0;
1183 }
1184 break;
1185 case Interactive_kind:
1186 c->c_interactive = 1;
1187 VISIT_SEQ_IN_SCOPE(c, stmt,
1188 mod->v.Interactive.body);
1189 break;
1190 case Expression_kind:
1191 VISIT_IN_SCOPE(c, expr, mod->v.Expression.body);
1192 addNone = 0;
1193 break;
1194 case Suite_kind:
1195 PyErr_SetString(PyExc_SystemError,
1196 "suite should not be possible");
1197 return 0;
1198 default:
1199 PyErr_Format(PyExc_SystemError,
1200 "module kind %d should not be possible",
1201 mod->kind);
1202 return 0;
1203 }
1204 co = assemble(c, addNone);
1205 compiler_exit_scope(c);
1206 return co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001207}
1208
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001209/* The test for LOCAL must come before the test for FREE in order to
1210 handle classes where name is both local and free. The local var is
1211 a method and the free var is a free var referenced within a method.
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001212*/
1213
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001214static int
1215get_ref_type(struct compiler *c, PyObject *name)
1216{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001217 int scope = PyST_GetScope(c->u->u_ste, name);
1218 if (scope == 0) {
1219 char buf[350];
1220 PyOS_snprintf(buf, sizeof(buf),
1221 "unknown scope for %.100s in %.100s(%s) in %s\n"
1222 "symbols: %s\nlocals: %s\nglobals: %s",
1223 PyBytes_AS_STRING(name),
1224 PyBytes_AS_STRING(c->u->u_name),
1225 PyObject_REPR(c->u->u_ste->ste_id),
1226 c->c_filename,
1227 PyObject_REPR(c->u->u_ste->ste_symbols),
1228 PyObject_REPR(c->u->u_varnames),
1229 PyObject_REPR(c->u->u_names)
1230 );
1231 Py_FatalError(buf);
1232 }
Tim Peters2a7f3842001-06-09 09:26:21 +00001233
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001234 return scope;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001235}
1236
1237static int
1238compiler_lookup_arg(PyObject *dict, PyObject *name)
1239{
1240 PyObject *k, *v;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001241 k = PyTuple_Pack(2, name, name->ob_type);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001242 if (k == NULL)
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00001243 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001244 v = PyDict_GetItem(dict, k);
Neal Norwitz3715c3e2005-11-24 22:09:18 +00001245 Py_DECREF(k);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001246 if (v == NULL)
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00001247 return -1;
Christian Heimes217cfd12007-12-02 14:31:20 +00001248 return PyLong_AS_LONG(v);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001249}
1250
1251static int
1252compiler_make_closure(struct compiler *c, PyCodeObject *co, int args)
1253{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001254 int i, free = PyCode_GetNumFree(co);
1255 if (free == 0) {
1256 ADDOP_O(c, LOAD_CONST, (PyObject*)co, consts);
1257 ADDOP_I(c, MAKE_FUNCTION, args);
1258 return 1;
1259 }
1260 for (i = 0; i < free; ++i) {
1261 /* Bypass com_addop_varname because it will generate
1262 LOAD_DEREF but LOAD_CLOSURE is needed.
1263 */
1264 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
1265 int arg, reftype;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001266
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001267 /* Special case: If a class contains a method with a
1268 free variable that has the same name as a method,
1269 the name will be considered free *and* local in the
1270 class. It should be handled by the closure, as
1271 well as by the normal name loookup logic.
1272 */
1273 reftype = get_ref_type(c, name);
1274 if (reftype == CELL)
1275 arg = compiler_lookup_arg(c->u->u_cellvars, name);
1276 else /* (reftype == FREE) */
1277 arg = compiler_lookup_arg(c->u->u_freevars, name);
1278 if (arg == -1) {
1279 fprintf(stderr,
1280 "lookup %s in %s %d %d\n"
1281 "freevars of %s: %s\n",
1282 PyObject_REPR(name),
1283 PyBytes_AS_STRING(c->u->u_name),
1284 reftype, arg,
1285 _PyUnicode_AsString(co->co_name),
1286 PyObject_REPR(co->co_freevars));
1287 Py_FatalError("compiler_make_closure()");
1288 }
1289 ADDOP_I(c, LOAD_CLOSURE, arg);
1290 }
1291 ADDOP_I(c, BUILD_TUPLE, free);
1292 ADDOP_O(c, LOAD_CONST, (PyObject*)co, consts);
1293 ADDOP_I(c, MAKE_CLOSURE, args);
1294 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001295}
1296
1297static int
1298compiler_decorators(struct compiler *c, asdl_seq* decos)
1299{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001300 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001301
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001302 if (!decos)
1303 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001304
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001305 for (i = 0; i < asdl_seq_LEN(decos); i++) {
1306 VISIT(c, expr, (expr_ty)asdl_seq_GET(decos, i));
1307 }
1308 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001309}
1310
1311static int
Guido van Rossum4f72a782006-10-27 23:31:49 +00001312compiler_visit_kwonlydefaults(struct compiler *c, asdl_seq *kwonlyargs,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001313 asdl_seq *kw_defaults)
Guido van Rossum4f72a782006-10-27 23:31:49 +00001314{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001315 int i, default_count = 0;
1316 for (i = 0; i < asdl_seq_LEN(kwonlyargs); i++) {
1317 arg_ty arg = asdl_seq_GET(kwonlyargs, i);
1318 expr_ty default_ = asdl_seq_GET(kw_defaults, i);
1319 if (default_) {
1320 ADDOP_O(c, LOAD_CONST, arg->arg, consts);
1321 if (!compiler_visit_expr(c, default_)) {
1322 return -1;
1323 }
1324 default_count++;
1325 }
1326 }
1327 return default_count;
Guido van Rossum4f72a782006-10-27 23:31:49 +00001328}
1329
1330static int
Neal Norwitzc1505362006-12-28 06:47:50 +00001331compiler_visit_argannotation(struct compiler *c, identifier id,
1332 expr_ty annotation, PyObject *names)
1333{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001334 if (annotation) {
1335 VISIT(c, expr, annotation);
1336 if (PyList_Append(names, id))
1337 return -1;
1338 }
1339 return 0;
Neal Norwitzc1505362006-12-28 06:47:50 +00001340}
1341
1342static int
1343compiler_visit_argannotations(struct compiler *c, asdl_seq* args,
1344 PyObject *names)
1345{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001346 int i, error;
1347 for (i = 0; i < asdl_seq_LEN(args); i++) {
1348 arg_ty arg = (arg_ty)asdl_seq_GET(args, i);
1349 error = compiler_visit_argannotation(
1350 c,
1351 arg->arg,
1352 arg->annotation,
1353 names);
1354 if (error)
1355 return error;
1356 }
1357 return 0;
Neal Norwitzc1505362006-12-28 06:47:50 +00001358}
1359
1360static int
1361compiler_visit_annotations(struct compiler *c, arguments_ty args,
1362 expr_ty returns)
1363{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001364 /* Push arg annotations and a list of the argument names. Return the #
1365 of items pushed. The expressions are evaluated out-of-order wrt the
1366 source code.
Neal Norwitzc1505362006-12-28 06:47:50 +00001367
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001368 More than 2^16-1 annotations is a SyntaxError. Returns -1 on error.
1369 */
1370 static identifier return_str;
1371 PyObject *names;
1372 int len;
1373 names = PyList_New(0);
1374 if (!names)
1375 return -1;
Neal Norwitzc1505362006-12-28 06:47:50 +00001376
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001377 if (compiler_visit_argannotations(c, args->args, names))
1378 goto error;
1379 if (args->varargannotation &&
1380 compiler_visit_argannotation(c, args->vararg,
1381 args->varargannotation, names))
1382 goto error;
1383 if (compiler_visit_argannotations(c, args->kwonlyargs, names))
1384 goto error;
1385 if (args->kwargannotation &&
1386 compiler_visit_argannotation(c, args->kwarg,
1387 args->kwargannotation, names))
1388 goto error;
Neal Norwitzc1505362006-12-28 06:47:50 +00001389
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001390 if (!return_str) {
1391 return_str = PyUnicode_InternFromString("return");
1392 if (!return_str)
1393 goto error;
1394 }
1395 if (compiler_visit_argannotation(c, return_str, returns, names)) {
1396 goto error;
1397 }
1398
1399 len = PyList_GET_SIZE(names);
1400 if (len > 65534) {
1401 /* len must fit in 16 bits, and len is incremented below */
1402 PyErr_SetString(PyExc_SyntaxError,
1403 "too many annotations");
1404 goto error;
1405 }
1406 if (len) {
1407 /* convert names to a tuple and place on stack */
1408 PyObject *elt;
1409 int i;
1410 PyObject *s = PyTuple_New(len);
1411 if (!s)
1412 goto error;
1413 for (i = 0; i < len; i++) {
1414 elt = PyList_GET_ITEM(names, i);
1415 Py_INCREF(elt);
1416 PyTuple_SET_ITEM(s, i, elt);
1417 }
1418 ADDOP_O(c, LOAD_CONST, s, consts);
1419 Py_DECREF(s);
1420 len++; /* include the just-pushed tuple */
1421 }
1422 Py_DECREF(names);
1423 return len;
Neal Norwitzc1505362006-12-28 06:47:50 +00001424
1425error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001426 Py_DECREF(names);
1427 return -1;
Neal Norwitzc1505362006-12-28 06:47:50 +00001428}
1429
1430static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001431compiler_function(struct compiler *c, stmt_ty s)
1432{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001433 PyCodeObject *co;
1434 PyObject *first_const = Py_None;
1435 arguments_ty args = s->v.FunctionDef.args;
1436 expr_ty returns = s->v.FunctionDef.returns;
1437 asdl_seq* decos = s->v.FunctionDef.decorator_list;
1438 stmt_ty st;
1439 int i, n, docstring, kw_default_count = 0, arglength;
1440 int num_annotations;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001441
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001442 assert(s->kind == FunctionDef_kind);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001443
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001444 if (!compiler_decorators(c, decos))
1445 return 0;
1446 if (args->kwonlyargs) {
1447 int res = compiler_visit_kwonlydefaults(c, args->kwonlyargs,
1448 args->kw_defaults);
1449 if (res < 0)
1450 return 0;
1451 kw_default_count = res;
1452 }
1453 if (args->defaults)
1454 VISIT_SEQ(c, expr, args->defaults);
1455 num_annotations = compiler_visit_annotations(c, args, returns);
1456 if (num_annotations < 0)
1457 return 0;
1458 assert((num_annotations & 0xFFFF) == num_annotations);
Guido van Rossum4f72a782006-10-27 23:31:49 +00001459
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001460 if (!compiler_enter_scope(c, s->v.FunctionDef.name, (void *)s,
1461 s->lineno))
1462 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001463
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001464 st = (stmt_ty)asdl_seq_GET(s->v.FunctionDef.body, 0);
1465 docstring = compiler_isdocstring(st);
1466 if (docstring && Py_OptimizeFlag < 2)
1467 first_const = st->v.Expr.value->v.Str.s;
1468 if (compiler_add_o(c, c->u->u_consts, first_const) < 0) {
1469 compiler_exit_scope(c);
1470 return 0;
1471 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001472
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001473 c->u->u_argcount = asdl_seq_LEN(args->args);
1474 c->u->u_kwonlyargcount = asdl_seq_LEN(args->kwonlyargs);
1475 n = asdl_seq_LEN(s->v.FunctionDef.body);
1476 /* if there was a docstring, we need to skip the first statement */
1477 for (i = docstring; i < n; i++) {
1478 st = (stmt_ty)asdl_seq_GET(s->v.FunctionDef.body, i);
1479 VISIT_IN_SCOPE(c, stmt, st);
1480 }
1481 co = assemble(c, 1);
1482 compiler_exit_scope(c);
1483 if (co == NULL)
1484 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001485
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001486 arglength = asdl_seq_LEN(args->defaults);
1487 arglength |= kw_default_count << 8;
1488 arglength |= num_annotations << 16;
1489 compiler_make_closure(c, co, arglength);
1490 Py_DECREF(co);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001491
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001492 /* decorators */
1493 for (i = 0; i < asdl_seq_LEN(decos); i++) {
1494 ADDOP_I(c, CALL_FUNCTION, 1);
1495 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001496
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001497 return compiler_nameop(c, s->v.FunctionDef.name, Store);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001498}
1499
1500static int
1501compiler_class(struct compiler *c, stmt_ty s)
1502{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001503 PyCodeObject *co;
1504 PyObject *str;
1505 int i;
1506 asdl_seq* decos = s->v.ClassDef.decorator_list;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001507
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001508 if (!compiler_decorators(c, decos))
1509 return 0;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001510
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001511 /* ultimately generate code for:
1512 <name> = __build_class__(<func>, <name>, *<bases>, **<keywords>)
1513 where:
1514 <func> is a function/closure created from the class body;
1515 it has a single argument (__locals__) where the dict
1516 (or MutableSequence) representing the locals is passed
1517 <name> is the class name
1518 <bases> is the positional arguments and *varargs argument
1519 <keywords> is the keyword arguments and **kwds argument
1520 This borrows from compiler_call.
1521 */
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001522
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001523 /* 1. compile the class body into a code object */
1524 if (!compiler_enter_scope(c, s->v.ClassDef.name, (void *)s, s->lineno))
1525 return 0;
1526 /* this block represents what we do in the new scope */
1527 {
1528 /* use the class name for name mangling */
1529 Py_INCREF(s->v.ClassDef.name);
1530 Py_XDECREF(c->u->u_private);
1531 c->u->u_private = s->v.ClassDef.name;
1532 /* force it to have one mandatory argument */
1533 c->u->u_argcount = 1;
1534 /* load the first argument (__locals__) ... */
1535 ADDOP_I(c, LOAD_FAST, 0);
1536 /* ... and store it into f_locals */
1537 ADDOP_IN_SCOPE(c, STORE_LOCALS);
1538 /* load (global) __name__ ... */
1539 str = PyUnicode_InternFromString("__name__");
1540 if (!str || !compiler_nameop(c, str, Load)) {
1541 Py_XDECREF(str);
1542 compiler_exit_scope(c);
1543 return 0;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001544 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001545 Py_DECREF(str);
1546 /* ... and store it as __module__ */
1547 str = PyUnicode_InternFromString("__module__");
1548 if (!str || !compiler_nameop(c, str, Store)) {
1549 Py_XDECREF(str);
1550 compiler_exit_scope(c);
1551 return 0;
1552 }
1553 Py_DECREF(str);
1554 /* compile the body proper */
1555 if (!compiler_body(c, s->v.ClassDef.body)) {
1556 compiler_exit_scope(c);
1557 return 0;
1558 }
1559 /* return the (empty) __class__ cell */
1560 str = PyUnicode_InternFromString("__class__");
1561 if (str == NULL) {
1562 compiler_exit_scope(c);
1563 return 0;
1564 }
1565 i = compiler_lookup_arg(c->u->u_cellvars, str);
1566 Py_DECREF(str);
1567 if (i == -1) {
1568 /* This happens when nobody references the cell */
1569 PyErr_Clear();
1570 /* Return None */
1571 ADDOP_O(c, LOAD_CONST, Py_None, consts);
1572 }
1573 else {
1574 /* Return the cell where to store __class__ */
1575 ADDOP_I(c, LOAD_CLOSURE, i);
1576 }
1577 ADDOP_IN_SCOPE(c, RETURN_VALUE);
1578 /* create the code object */
1579 co = assemble(c, 1);
1580 }
1581 /* leave the new scope */
1582 compiler_exit_scope(c);
1583 if (co == NULL)
1584 return 0;
Guido van Rossumd59da4b2007-05-22 18:11:13 +00001585
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001586 /* 2. load the 'build_class' function */
1587 ADDOP(c, LOAD_BUILD_CLASS);
1588
1589 /* 3. load a function (or closure) made from the code object */
1590 compiler_make_closure(c, co, 0);
1591 Py_DECREF(co);
1592
1593 /* 4. load class name */
1594 ADDOP_O(c, LOAD_CONST, s->v.ClassDef.name, consts);
1595
1596 /* 5. generate the rest of the code for the call */
1597 if (!compiler_call_helper(c, 2,
1598 s->v.ClassDef.bases,
1599 s->v.ClassDef.keywords,
1600 s->v.ClassDef.starargs,
1601 s->v.ClassDef.kwargs))
1602 return 0;
1603
1604 /* 6. apply decorators */
1605 for (i = 0; i < asdl_seq_LEN(decos); i++) {
1606 ADDOP_I(c, CALL_FUNCTION, 1);
1607 }
1608
1609 /* 7. store into <name> */
1610 if (!compiler_nameop(c, s->v.ClassDef.name, Store))
1611 return 0;
1612 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001613}
1614
1615static int
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001616compiler_ifexp(struct compiler *c, expr_ty e)
1617{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001618 basicblock *end, *next;
1619
1620 assert(e->kind == IfExp_kind);
1621 end = compiler_new_block(c);
1622 if (end == NULL)
1623 return 0;
1624 next = compiler_new_block(c);
1625 if (next == NULL)
1626 return 0;
1627 VISIT(c, expr, e->v.IfExp.test);
1628 ADDOP_JABS(c, POP_JUMP_IF_FALSE, next);
1629 VISIT(c, expr, e->v.IfExp.body);
1630 ADDOP_JREL(c, JUMP_FORWARD, end);
1631 compiler_use_next_block(c, next);
1632 VISIT(c, expr, e->v.IfExp.orelse);
1633 compiler_use_next_block(c, end);
1634 return 1;
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001635}
1636
1637static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001638compiler_lambda(struct compiler *c, expr_ty e)
1639{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001640 PyCodeObject *co;
1641 static identifier name;
1642 int kw_default_count = 0, arglength;
1643 arguments_ty args = e->v.Lambda.args;
1644 assert(e->kind == Lambda_kind);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001645
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001646 if (!name) {
1647 name = PyUnicode_InternFromString("<lambda>");
1648 if (!name)
1649 return 0;
1650 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001651
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001652 if (args->kwonlyargs) {
1653 int res = compiler_visit_kwonlydefaults(c, args->kwonlyargs,
1654 args->kw_defaults);
1655 if (res < 0) return 0;
1656 kw_default_count = res;
1657 }
1658 if (args->defaults)
1659 VISIT_SEQ(c, expr, args->defaults);
1660 if (!compiler_enter_scope(c, name, (void *)e, e->lineno))
1661 return 0;
Neal Norwitz4737b232005-11-19 23:58:29 +00001662
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001663 /* Make None the first constant, so the lambda can't have a
1664 docstring. */
1665 if (compiler_add_o(c, c->u->u_consts, Py_None) < 0)
1666 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001667
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001668 c->u->u_argcount = asdl_seq_LEN(args->args);
1669 c->u->u_kwonlyargcount = asdl_seq_LEN(args->kwonlyargs);
1670 VISIT_IN_SCOPE(c, expr, e->v.Lambda.body);
1671 if (c->u->u_ste->ste_generator) {
1672 ADDOP_IN_SCOPE(c, POP_TOP);
1673 }
1674 else {
1675 ADDOP_IN_SCOPE(c, RETURN_VALUE);
1676 }
1677 co = assemble(c, 1);
1678 compiler_exit_scope(c);
1679 if (co == NULL)
1680 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001681
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001682 arglength = asdl_seq_LEN(args->defaults);
1683 arglength |= kw_default_count << 8;
1684 compiler_make_closure(c, co, arglength);
1685 Py_DECREF(co);
1686
1687 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001688}
1689
1690static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001691compiler_if(struct compiler *c, stmt_ty s)
1692{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001693 basicblock *end, *next;
1694 int constant;
1695 assert(s->kind == If_kind);
1696 end = compiler_new_block(c);
1697 if (end == NULL)
1698 return 0;
1699
1700 constant = expr_constant(s->v.If.test);
1701 /* constant = 0: "if 0"
1702 * constant = 1: "if 1", "if 2", ...
1703 * constant = -1: rest */
1704 if (constant == 0) {
1705 if (s->v.If.orelse)
1706 VISIT_SEQ(c, stmt, s->v.If.orelse);
1707 } else if (constant == 1) {
1708 VISIT_SEQ(c, stmt, s->v.If.body);
1709 } else {
1710 if (s->v.If.orelse) {
1711 next = compiler_new_block(c);
1712 if (next == NULL)
1713 return 0;
1714 }
1715 else
1716 next = end;
1717 VISIT(c, expr, s->v.If.test);
1718 ADDOP_JABS(c, POP_JUMP_IF_FALSE, next);
1719 VISIT_SEQ(c, stmt, s->v.If.body);
1720 ADDOP_JREL(c, JUMP_FORWARD, end);
1721 if (s->v.If.orelse) {
1722 compiler_use_next_block(c, next);
1723 VISIT_SEQ(c, stmt, s->v.If.orelse);
1724 }
1725 }
1726 compiler_use_next_block(c, end);
1727 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001728}
1729
1730static int
1731compiler_for(struct compiler *c, stmt_ty s)
1732{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001733 basicblock *start, *cleanup, *end;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001734
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001735 start = compiler_new_block(c);
1736 cleanup = compiler_new_block(c);
1737 end = compiler_new_block(c);
1738 if (start == NULL || end == NULL || cleanup == NULL)
1739 return 0;
1740 ADDOP_JREL(c, SETUP_LOOP, end);
1741 if (!compiler_push_fblock(c, LOOP, start))
1742 return 0;
1743 VISIT(c, expr, s->v.For.iter);
1744 ADDOP(c, GET_ITER);
1745 compiler_use_next_block(c, start);
1746 ADDOP_JREL(c, FOR_ITER, cleanup);
1747 VISIT(c, expr, s->v.For.target);
1748 VISIT_SEQ(c, stmt, s->v.For.body);
1749 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
1750 compiler_use_next_block(c, cleanup);
1751 ADDOP(c, POP_BLOCK);
1752 compiler_pop_fblock(c, LOOP, start);
1753 VISIT_SEQ(c, stmt, s->v.For.orelse);
1754 compiler_use_next_block(c, end);
1755 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001756}
1757
1758static int
1759compiler_while(struct compiler *c, stmt_ty s)
1760{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001761 basicblock *loop, *orelse, *end, *anchor = NULL;
1762 int constant = expr_constant(s->v.While.test);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001763
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001764 if (constant == 0) {
1765 if (s->v.While.orelse)
1766 VISIT_SEQ(c, stmt, s->v.While.orelse);
1767 return 1;
1768 }
1769 loop = compiler_new_block(c);
1770 end = compiler_new_block(c);
1771 if (constant == -1) {
1772 anchor = compiler_new_block(c);
1773 if (anchor == NULL)
1774 return 0;
1775 }
1776 if (loop == NULL || end == NULL)
1777 return 0;
1778 if (s->v.While.orelse) {
1779 orelse = compiler_new_block(c);
1780 if (orelse == NULL)
1781 return 0;
1782 }
1783 else
1784 orelse = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001785
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001786 ADDOP_JREL(c, SETUP_LOOP, end);
1787 compiler_use_next_block(c, loop);
1788 if (!compiler_push_fblock(c, LOOP, loop))
1789 return 0;
1790 if (constant == -1) {
1791 VISIT(c, expr, s->v.While.test);
1792 ADDOP_JABS(c, POP_JUMP_IF_FALSE, anchor);
1793 }
1794 VISIT_SEQ(c, stmt, s->v.While.body);
1795 ADDOP_JABS(c, JUMP_ABSOLUTE, loop);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001796
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001797 /* XXX should the two POP instructions be in a separate block
1798 if there is no else clause ?
1799 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001800
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001801 if (constant == -1) {
1802 compiler_use_next_block(c, anchor);
1803 ADDOP(c, POP_BLOCK);
1804 }
1805 compiler_pop_fblock(c, LOOP, loop);
1806 if (orelse != NULL) /* what if orelse is just pass? */
1807 VISIT_SEQ(c, stmt, s->v.While.orelse);
1808 compiler_use_next_block(c, end);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001809
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001810 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001811}
1812
1813static int
1814compiler_continue(struct compiler *c)
1815{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001816 static const char LOOP_ERROR_MSG[] = "'continue' not properly in loop";
1817 static const char IN_FINALLY_ERROR_MSG[] =
1818 "'continue' not supported inside 'finally' clause";
1819 int i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001820
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001821 if (!c->u->u_nfblocks)
1822 return compiler_error(c, LOOP_ERROR_MSG);
1823 i = c->u->u_nfblocks - 1;
1824 switch (c->u->u_fblock[i].fb_type) {
1825 case LOOP:
1826 ADDOP_JABS(c, JUMP_ABSOLUTE, c->u->u_fblock[i].fb_block);
1827 break;
1828 case EXCEPT:
1829 case FINALLY_TRY:
1830 while (--i >= 0 && c->u->u_fblock[i].fb_type != LOOP) {
1831 /* Prevent continue anywhere under a finally
1832 even if hidden in a sub-try or except. */
1833 if (c->u->u_fblock[i].fb_type == FINALLY_END)
1834 return compiler_error(c, IN_FINALLY_ERROR_MSG);
1835 }
1836 if (i == -1)
1837 return compiler_error(c, LOOP_ERROR_MSG);
1838 ADDOP_JABS(c, CONTINUE_LOOP, c->u->u_fblock[i].fb_block);
1839 break;
1840 case FINALLY_END:
1841 return compiler_error(c, IN_FINALLY_ERROR_MSG);
1842 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001843
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001844 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001845}
1846
1847/* Code generated for "try: <body> finally: <finalbody>" is as follows:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001848
1849 SETUP_FINALLY L
1850 <code for body>
1851 POP_BLOCK
1852 LOAD_CONST <None>
1853 L: <code for finalbody>
1854 END_FINALLY
1855
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001856 The special instructions use the block stack. Each block
1857 stack entry contains the instruction that created it (here
1858 SETUP_FINALLY), the level of the value stack at the time the
1859 block stack entry was created, and a label (here L).
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001860
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001861 SETUP_FINALLY:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001862 Pushes the current value stack level and the label
1863 onto the block stack.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001864 POP_BLOCK:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001865 Pops en entry from the block stack, and pops the value
1866 stack until its level is the same as indicated on the
1867 block stack. (The label is ignored.)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001868 END_FINALLY:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001869 Pops a variable number of entries from the *value* stack
1870 and re-raises the exception they specify. The number of
1871 entries popped depends on the (pseudo) exception type.
1872
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001873 The block stack is unwound when an exception is raised:
1874 when a SETUP_FINALLY entry is found, the exception is pushed
1875 onto the value stack (and the exception condition is cleared),
1876 and the interpreter jumps to the label gotten from the block
1877 stack.
1878*/
1879
1880static int
1881compiler_try_finally(struct compiler *c, stmt_ty s)
1882{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001883 basicblock *body, *end;
1884 body = compiler_new_block(c);
1885 end = compiler_new_block(c);
1886 if (body == NULL || end == NULL)
1887 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001888
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001889 ADDOP_JREL(c, SETUP_FINALLY, end);
1890 compiler_use_next_block(c, body);
1891 if (!compiler_push_fblock(c, FINALLY_TRY, body))
1892 return 0;
1893 VISIT_SEQ(c, stmt, s->v.TryFinally.body);
1894 ADDOP(c, POP_BLOCK);
1895 compiler_pop_fblock(c, FINALLY_TRY, body);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001896
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001897 ADDOP_O(c, LOAD_CONST, Py_None, consts);
1898 compiler_use_next_block(c, end);
1899 if (!compiler_push_fblock(c, FINALLY_END, end))
1900 return 0;
1901 VISIT_SEQ(c, stmt, s->v.TryFinally.finalbody);
1902 ADDOP(c, END_FINALLY);
1903 compiler_pop_fblock(c, FINALLY_END, end);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001904
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001905 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001906}
1907
1908/*
Jeffrey Yasskin9de7ec72009-02-25 02:25:04 +00001909 Code generated for "try: S except E1 as V1: S1 except E2 as V2: S2 ...":
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001910 (The contents of the value stack is shown in [], with the top
1911 at the right; 'tb' is trace-back info, 'val' the exception's
1912 associated value, and 'exc' the exception.)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001913
1914 Value stack Label Instruction Argument
1915 [] SETUP_EXCEPT L1
1916 [] <code for S>
1917 [] POP_BLOCK
1918 [] JUMP_FORWARD L0
1919
1920 [tb, val, exc] L1: DUP )
1921 [tb, val, exc, exc] <evaluate E1> )
1922 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
1923 [tb, val, exc, 1-or-0] POP_JUMP_IF_FALSE L2 )
1924 [tb, val, exc] POP
1925 [tb, val] <assign to V1> (or POP if no V1)
1926 [tb] POP
1927 [] <code for S1>
1928 JUMP_FORWARD L0
1929
1930 [tb, val, exc] L2: DUP
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001931 .............................etc.......................
1932
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001933 [tb, val, exc] Ln+1: END_FINALLY # re-raise exception
1934
1935 [] L0: <next statement>
1936
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001937 Of course, parts are not generated if Vi or Ei is not present.
1938*/
1939static int
1940compiler_try_except(struct compiler *c, stmt_ty s)
1941{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001942 basicblock *body, *orelse, *except, *end;
1943 int i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001944
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001945 body = compiler_new_block(c);
1946 except = compiler_new_block(c);
1947 orelse = compiler_new_block(c);
1948 end = compiler_new_block(c);
1949 if (body == NULL || except == NULL || orelse == NULL || end == NULL)
1950 return 0;
1951 ADDOP_JREL(c, SETUP_EXCEPT, except);
1952 compiler_use_next_block(c, body);
1953 if (!compiler_push_fblock(c, EXCEPT, body))
1954 return 0;
1955 VISIT_SEQ(c, stmt, s->v.TryExcept.body);
1956 ADDOP(c, POP_BLOCK);
1957 compiler_pop_fblock(c, EXCEPT, body);
1958 ADDOP_JREL(c, JUMP_FORWARD, orelse);
1959 n = asdl_seq_LEN(s->v.TryExcept.handlers);
1960 compiler_use_next_block(c, except);
1961 for (i = 0; i < n; i++) {
1962 excepthandler_ty handler = (excepthandler_ty)asdl_seq_GET(
1963 s->v.TryExcept.handlers, i);
1964 if (!handler->v.ExceptHandler.type && i < n-1)
1965 return compiler_error(c, "default 'except:' must be last");
1966 c->u->u_lineno_set = 0;
1967 c->u->u_lineno = handler->lineno;
1968 except = compiler_new_block(c);
1969 if (except == NULL)
1970 return 0;
1971 if (handler->v.ExceptHandler.type) {
1972 ADDOP(c, DUP_TOP);
1973 VISIT(c, expr, handler->v.ExceptHandler.type);
1974 ADDOP_I(c, COMPARE_OP, PyCmp_EXC_MATCH);
1975 ADDOP_JABS(c, POP_JUMP_IF_FALSE, except);
1976 }
1977 ADDOP(c, POP_TOP);
1978 if (handler->v.ExceptHandler.name) {
1979 basicblock *cleanup_end, *cleanup_body;
Guido van Rossumb940e112007-01-10 16:19:56 +00001980
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001981 cleanup_end = compiler_new_block(c);
1982 cleanup_body = compiler_new_block(c);
1983 if(!(cleanup_end || cleanup_body))
1984 return 0;
Guido van Rossumb940e112007-01-10 16:19:56 +00001985
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001986 compiler_nameop(c, handler->v.ExceptHandler.name, Store);
1987 ADDOP(c, POP_TOP);
1988
1989 /*
1990 try:
1991 # body
1992 except type as name:
1993 try:
1994 # body
1995 finally:
1996 name = None
1997 del name
1998 */
1999
2000 /* second try: */
2001 ADDOP_JREL(c, SETUP_FINALLY, cleanup_end);
2002 compiler_use_next_block(c, cleanup_body);
2003 if (!compiler_push_fblock(c, FINALLY_TRY, cleanup_body))
2004 return 0;
2005
2006 /* second # body */
2007 VISIT_SEQ(c, stmt, handler->v.ExceptHandler.body);
2008 ADDOP(c, POP_BLOCK);
2009 ADDOP(c, POP_EXCEPT);
2010 compiler_pop_fblock(c, FINALLY_TRY, cleanup_body);
2011
2012 /* finally: */
2013 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2014 compiler_use_next_block(c, cleanup_end);
2015 if (!compiler_push_fblock(c, FINALLY_END, cleanup_end))
2016 return 0;
2017
2018 /* name = None */
2019 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2020 compiler_nameop(c, handler->v.ExceptHandler.name, Store);
2021
2022 /* del name */
2023 compiler_nameop(c, handler->v.ExceptHandler.name, Del);
2024
2025 ADDOP(c, END_FINALLY);
2026 compiler_pop_fblock(c, FINALLY_END, cleanup_end);
2027 }
2028 else {
2029 basicblock *cleanup_body;
2030
2031 cleanup_body = compiler_new_block(c);
2032 if(!cleanup_body)
2033 return 0;
2034
Guido van Rossumb940e112007-01-10 16:19:56 +00002035 ADDOP(c, POP_TOP);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002036 ADDOP(c, POP_TOP);
2037 compiler_use_next_block(c, cleanup_body);
2038 if (!compiler_push_fblock(c, FINALLY_TRY, cleanup_body))
2039 return 0;
2040 VISIT_SEQ(c, stmt, handler->v.ExceptHandler.body);
2041 ADDOP(c, POP_EXCEPT);
2042 compiler_pop_fblock(c, FINALLY_TRY, cleanup_body);
2043 }
2044 ADDOP_JREL(c, JUMP_FORWARD, end);
2045 compiler_use_next_block(c, except);
2046 }
2047 ADDOP(c, END_FINALLY);
2048 compiler_use_next_block(c, orelse);
2049 VISIT_SEQ(c, stmt, s->v.TryExcept.orelse);
2050 compiler_use_next_block(c, end);
2051 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002052}
2053
2054static int
2055compiler_import_as(struct compiler *c, identifier name, identifier asname)
2056{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002057 /* The IMPORT_NAME opcode was already generated. This function
2058 merely needs to bind the result to a name.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002059
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002060 If there is a dot in name, we need to split it and emit a
2061 LOAD_ATTR for each name.
2062 */
2063 const Py_UNICODE *src = PyUnicode_AS_UNICODE(name);
2064 const Py_UNICODE *dot = Py_UNICODE_strchr(src, '.');
2065 if (dot) {
2066 /* Consume the base module name to get the first attribute */
2067 src = dot + 1;
2068 while (dot) {
2069 /* NB src is only defined when dot != NULL */
2070 PyObject *attr;
2071 dot = Py_UNICODE_strchr(src, '.');
2072 attr = PyUnicode_FromUnicode(src,
2073 dot ? dot - src : Py_UNICODE_strlen(src));
2074 if (!attr)
2075 return -1;
2076 ADDOP_O(c, LOAD_ATTR, attr, names);
2077 Py_DECREF(attr);
2078 src = dot + 1;
2079 }
2080 }
2081 return compiler_nameop(c, asname, Store);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002082}
2083
2084static int
2085compiler_import(struct compiler *c, stmt_ty s)
2086{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002087 /* The Import node stores a module name like a.b.c as a single
2088 string. This is convenient for all cases except
2089 import a.b.c as d
2090 where we need to parse that string to extract the individual
2091 module names.
2092 XXX Perhaps change the representation to make this case simpler?
2093 */
2094 int i, n = asdl_seq_LEN(s->v.Import.names);
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002095
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002096 for (i = 0; i < n; i++) {
2097 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.Import.names, i);
2098 int r;
2099 PyObject *level;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002100
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002101 level = PyLong_FromLong(0);
2102 if (level == NULL)
2103 return 0;
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002104
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002105 ADDOP_O(c, LOAD_CONST, level, consts);
2106 Py_DECREF(level);
2107 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2108 ADDOP_NAME(c, IMPORT_NAME, alias->name, names);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002109
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002110 if (alias->asname) {
2111 r = compiler_import_as(c, alias->name, alias->asname);
2112 if (!r)
2113 return r;
2114 }
2115 else {
2116 identifier tmp = alias->name;
2117 const Py_UNICODE *base = PyUnicode_AS_UNICODE(alias->name);
2118 Py_UNICODE *dot = Py_UNICODE_strchr(base, '.');
2119 if (dot)
2120 tmp = PyUnicode_FromUnicode(base,
2121 dot - base);
2122 r = compiler_nameop(c, tmp, Store);
2123 if (dot) {
2124 Py_DECREF(tmp);
2125 }
2126 if (!r)
2127 return r;
2128 }
2129 }
2130 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002131}
2132
2133static int
2134compiler_from_import(struct compiler *c, stmt_ty s)
2135{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002136 int i, n = asdl_seq_LEN(s->v.ImportFrom.names);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002137
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002138 PyObject *names = PyTuple_New(n);
2139 PyObject *level;
2140 static PyObject *empty_string;
Benjamin Peterson78565b22009-06-28 19:19:51 +00002141
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002142 if (!empty_string) {
2143 empty_string = PyUnicode_FromString("");
2144 if (!empty_string)
2145 return 0;
2146 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002147
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002148 if (!names)
2149 return 0;
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002150
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002151 level = PyLong_FromLong(s->v.ImportFrom.level);
2152 if (!level) {
2153 Py_DECREF(names);
2154 return 0;
2155 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002156
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002157 /* build up the names */
2158 for (i = 0; i < n; i++) {
2159 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);
2160 Py_INCREF(alias->name);
2161 PyTuple_SET_ITEM(names, i, alias->name);
2162 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002163
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002164 if (s->lineno > c->c_future->ff_lineno && s->v.ImportFrom.module &&
2165 !PyUnicode_CompareWithASCIIString(s->v.ImportFrom.module, "__future__")) {
2166 Py_DECREF(level);
2167 Py_DECREF(names);
2168 return compiler_error(c, "from __future__ imports must occur "
2169 "at the beginning of the file");
2170 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002171
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002172 ADDOP_O(c, LOAD_CONST, level, consts);
2173 Py_DECREF(level);
2174 ADDOP_O(c, LOAD_CONST, names, consts);
2175 Py_DECREF(names);
2176 if (s->v.ImportFrom.module) {
2177 ADDOP_NAME(c, IMPORT_NAME, s->v.ImportFrom.module, names);
2178 }
2179 else {
2180 ADDOP_NAME(c, IMPORT_NAME, empty_string, names);
2181 }
2182 for (i = 0; i < n; i++) {
2183 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);
2184 identifier store_name;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002185
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002186 if (i == 0 && *PyUnicode_AS_UNICODE(alias->name) == '*') {
2187 assert(n == 1);
2188 ADDOP(c, IMPORT_STAR);
2189 return 1;
2190 }
2191
2192 ADDOP_NAME(c, IMPORT_FROM, alias->name, names);
2193 store_name = alias->name;
2194 if (alias->asname)
2195 store_name = alias->asname;
2196
2197 if (!compiler_nameop(c, store_name, Store)) {
2198 Py_DECREF(names);
2199 return 0;
2200 }
2201 }
2202 /* remove imported module */
2203 ADDOP(c, POP_TOP);
2204 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002205}
2206
2207static int
2208compiler_assert(struct compiler *c, stmt_ty s)
2209{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002210 static PyObject *assertion_error = NULL;
2211 basicblock *end;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002212
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002213 if (Py_OptimizeFlag)
2214 return 1;
2215 if (assertion_error == NULL) {
2216 assertion_error = PyUnicode_InternFromString("AssertionError");
2217 if (assertion_error == NULL)
2218 return 0;
2219 }
2220 if (s->v.Assert.test->kind == Tuple_kind &&
2221 asdl_seq_LEN(s->v.Assert.test->v.Tuple.elts) > 0) {
2222 const char* msg =
2223 "assertion is always true, perhaps remove parentheses?";
2224 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, c->c_filename,
2225 c->u->u_lineno, NULL, NULL) == -1)
2226 return 0;
2227 }
2228 VISIT(c, expr, s->v.Assert.test);
2229 end = compiler_new_block(c);
2230 if (end == NULL)
2231 return 0;
2232 ADDOP_JABS(c, POP_JUMP_IF_TRUE, end);
2233 ADDOP_O(c, LOAD_GLOBAL, assertion_error, names);
2234 if (s->v.Assert.msg) {
2235 VISIT(c, expr, s->v.Assert.msg);
2236 ADDOP_I(c, CALL_FUNCTION, 1);
2237 }
2238 ADDOP_I(c, RAISE_VARARGS, 1);
2239 compiler_use_next_block(c, end);
2240 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002241}
2242
2243static int
2244compiler_visit_stmt(struct compiler *c, stmt_ty s)
2245{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002246 int i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002247
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002248 /* Always assign a lineno to the next instruction for a stmt. */
2249 c->u->u_lineno = s->lineno;
2250 c->u->u_lineno_set = 0;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002251
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002252 switch (s->kind) {
2253 case FunctionDef_kind:
2254 return compiler_function(c, s);
2255 case ClassDef_kind:
2256 return compiler_class(c, s);
2257 case Return_kind:
2258 if (c->u->u_ste->ste_type != FunctionBlock)
2259 return compiler_error(c, "'return' outside function");
2260 if (s->v.Return.value) {
2261 VISIT(c, expr, s->v.Return.value);
2262 }
2263 else
2264 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2265 ADDOP(c, RETURN_VALUE);
2266 break;
2267 case Delete_kind:
2268 VISIT_SEQ(c, expr, s->v.Delete.targets)
2269 break;
2270 case Assign_kind:
2271 n = asdl_seq_LEN(s->v.Assign.targets);
2272 VISIT(c, expr, s->v.Assign.value);
2273 for (i = 0; i < n; i++) {
2274 if (i < n - 1)
2275 ADDOP(c, DUP_TOP);
2276 VISIT(c, expr,
2277 (expr_ty)asdl_seq_GET(s->v.Assign.targets, i));
2278 }
2279 break;
2280 case AugAssign_kind:
2281 return compiler_augassign(c, s);
2282 case For_kind:
2283 return compiler_for(c, s);
2284 case While_kind:
2285 return compiler_while(c, s);
2286 case If_kind:
2287 return compiler_if(c, s);
2288 case Raise_kind:
2289 n = 0;
2290 if (s->v.Raise.exc) {
2291 VISIT(c, expr, s->v.Raise.exc);
2292 n++;
2293 if (s->v.Raise.cause) {
2294 VISIT(c, expr, s->v.Raise.cause);
2295 n++;
2296 }
2297 }
2298 ADDOP_I(c, RAISE_VARARGS, n);
2299 break;
2300 case TryExcept_kind:
2301 return compiler_try_except(c, s);
2302 case TryFinally_kind:
2303 return compiler_try_finally(c, s);
2304 case Assert_kind:
2305 return compiler_assert(c, s);
2306 case Import_kind:
2307 return compiler_import(c, s);
2308 case ImportFrom_kind:
2309 return compiler_from_import(c, s);
2310 case Global_kind:
2311 case Nonlocal_kind:
2312 break;
2313 case Expr_kind:
2314 if (c->c_interactive && c->c_nestlevel <= 1) {
2315 VISIT(c, expr, s->v.Expr.value);
2316 ADDOP(c, PRINT_EXPR);
2317 }
2318 else if (s->v.Expr.value->kind != Str_kind &&
2319 s->v.Expr.value->kind != Num_kind) {
2320 VISIT(c, expr, s->v.Expr.value);
2321 ADDOP(c, POP_TOP);
2322 }
2323 break;
2324 case Pass_kind:
2325 break;
2326 case Break_kind:
2327 if (!compiler_in_loop(c))
2328 return compiler_error(c, "'break' outside loop");
2329 ADDOP(c, BREAK_LOOP);
2330 break;
2331 case Continue_kind:
2332 return compiler_continue(c);
2333 case With_kind:
2334 return compiler_with(c, s);
2335 }
2336 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002337}
2338
2339static int
2340unaryop(unaryop_ty op)
2341{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002342 switch (op) {
2343 case Invert:
2344 return UNARY_INVERT;
2345 case Not:
2346 return UNARY_NOT;
2347 case UAdd:
2348 return UNARY_POSITIVE;
2349 case USub:
2350 return UNARY_NEGATIVE;
2351 default:
2352 PyErr_Format(PyExc_SystemError,
2353 "unary op %d should not be possible", op);
2354 return 0;
2355 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002356}
2357
2358static int
2359binop(struct compiler *c, operator_ty op)
2360{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002361 switch (op) {
2362 case Add:
2363 return BINARY_ADD;
2364 case Sub:
2365 return BINARY_SUBTRACT;
2366 case Mult:
2367 return BINARY_MULTIPLY;
2368 case Div:
2369 return BINARY_TRUE_DIVIDE;
2370 case Mod:
2371 return BINARY_MODULO;
2372 case Pow:
2373 return BINARY_POWER;
2374 case LShift:
2375 return BINARY_LSHIFT;
2376 case RShift:
2377 return BINARY_RSHIFT;
2378 case BitOr:
2379 return BINARY_OR;
2380 case BitXor:
2381 return BINARY_XOR;
2382 case BitAnd:
2383 return BINARY_AND;
2384 case FloorDiv:
2385 return BINARY_FLOOR_DIVIDE;
2386 default:
2387 PyErr_Format(PyExc_SystemError,
2388 "binary op %d should not be possible", op);
2389 return 0;
2390 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002391}
2392
2393static int
2394cmpop(cmpop_ty op)
2395{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002396 switch (op) {
2397 case Eq:
2398 return PyCmp_EQ;
2399 case NotEq:
2400 return PyCmp_NE;
2401 case Lt:
2402 return PyCmp_LT;
2403 case LtE:
2404 return PyCmp_LE;
2405 case Gt:
2406 return PyCmp_GT;
2407 case GtE:
2408 return PyCmp_GE;
2409 case Is:
2410 return PyCmp_IS;
2411 case IsNot:
2412 return PyCmp_IS_NOT;
2413 case In:
2414 return PyCmp_IN;
2415 case NotIn:
2416 return PyCmp_NOT_IN;
2417 default:
2418 return PyCmp_BAD;
2419 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002420}
2421
2422static int
2423inplace_binop(struct compiler *c, operator_ty op)
2424{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002425 switch (op) {
2426 case Add:
2427 return INPLACE_ADD;
2428 case Sub:
2429 return INPLACE_SUBTRACT;
2430 case Mult:
2431 return INPLACE_MULTIPLY;
2432 case Div:
2433 return INPLACE_TRUE_DIVIDE;
2434 case Mod:
2435 return INPLACE_MODULO;
2436 case Pow:
2437 return INPLACE_POWER;
2438 case LShift:
2439 return INPLACE_LSHIFT;
2440 case RShift:
2441 return INPLACE_RSHIFT;
2442 case BitOr:
2443 return INPLACE_OR;
2444 case BitXor:
2445 return INPLACE_XOR;
2446 case BitAnd:
2447 return INPLACE_AND;
2448 case FloorDiv:
2449 return INPLACE_FLOOR_DIVIDE;
2450 default:
2451 PyErr_Format(PyExc_SystemError,
2452 "inplace binary op %d should not be possible", op);
2453 return 0;
2454 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002455}
2456
2457static int
2458compiler_nameop(struct compiler *c, identifier name, expr_context_ty ctx)
2459{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002460 int op, scope, arg;
2461 enum { OP_FAST, OP_GLOBAL, OP_DEREF, OP_NAME } optype;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002462
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002463 PyObject *dict = c->u->u_names;
2464 PyObject *mangled;
2465 /* XXX AugStore isn't used anywhere! */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002466
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002467 mangled = _Py_Mangle(c->u->u_private, name);
2468 if (!mangled)
2469 return 0;
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002470
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002471 op = 0;
2472 optype = OP_NAME;
2473 scope = PyST_GetScope(c->u->u_ste, mangled);
2474 switch (scope) {
2475 case FREE:
2476 dict = c->u->u_freevars;
2477 optype = OP_DEREF;
2478 break;
2479 case CELL:
2480 dict = c->u->u_cellvars;
2481 optype = OP_DEREF;
2482 break;
2483 case LOCAL:
2484 if (c->u->u_ste->ste_type == FunctionBlock)
2485 optype = OP_FAST;
2486 break;
2487 case GLOBAL_IMPLICIT:
2488 if (c->u->u_ste->ste_type == FunctionBlock &&
2489 !c->u->u_ste->ste_unoptimized)
2490 optype = OP_GLOBAL;
2491 break;
2492 case GLOBAL_EXPLICIT:
2493 optype = OP_GLOBAL;
2494 break;
2495 default:
2496 /* scope can be 0 */
2497 break;
2498 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002499
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002500 /* XXX Leave assert here, but handle __doc__ and the like better */
2501 assert(scope || PyUnicode_AS_UNICODE(name)[0] == '_');
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002502
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002503 switch (optype) {
2504 case OP_DEREF:
2505 switch (ctx) {
2506 case Load: op = LOAD_DEREF; break;
2507 case Store: op = STORE_DEREF; break;
2508 case AugLoad:
2509 case AugStore:
2510 break;
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +00002511 case Del: op = DELETE_DEREF; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002512 case Param:
2513 default:
2514 PyErr_SetString(PyExc_SystemError,
2515 "param invalid for deref variable");
2516 return 0;
2517 }
2518 break;
2519 case OP_FAST:
2520 switch (ctx) {
2521 case Load: op = LOAD_FAST; break;
2522 case Store: op = STORE_FAST; break;
2523 case Del: op = DELETE_FAST; break;
2524 case AugLoad:
2525 case AugStore:
2526 break;
2527 case Param:
2528 default:
2529 PyErr_SetString(PyExc_SystemError,
2530 "param invalid for local variable");
2531 return 0;
2532 }
2533 ADDOP_O(c, op, mangled, varnames);
2534 Py_DECREF(mangled);
2535 return 1;
2536 case OP_GLOBAL:
2537 switch (ctx) {
2538 case Load: op = LOAD_GLOBAL; break;
2539 case Store: op = STORE_GLOBAL; break;
2540 case Del: op = DELETE_GLOBAL; break;
2541 case AugLoad:
2542 case AugStore:
2543 break;
2544 case Param:
2545 default:
2546 PyErr_SetString(PyExc_SystemError,
2547 "param invalid for global variable");
2548 return 0;
2549 }
2550 break;
2551 case OP_NAME:
2552 switch (ctx) {
Benjamin Peterson20f9c3c2010-07-20 22:39:34 +00002553 case Load: op = LOAD_NAME; break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002554 case Store: op = STORE_NAME; break;
2555 case Del: op = DELETE_NAME; break;
2556 case AugLoad:
2557 case AugStore:
2558 break;
2559 case Param:
2560 default:
2561 PyErr_SetString(PyExc_SystemError,
2562 "param invalid for name variable");
2563 return 0;
2564 }
2565 break;
2566 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002567
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002568 assert(op);
2569 arg = compiler_add_o(c, dict, mangled);
2570 Py_DECREF(mangled);
2571 if (arg < 0)
2572 return 0;
2573 return compiler_addop_i(c, op, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002574}
2575
2576static int
2577compiler_boolop(struct compiler *c, expr_ty e)
2578{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002579 basicblock *end;
2580 int jumpi, i, n;
2581 asdl_seq *s;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002582
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002583 assert(e->kind == BoolOp_kind);
2584 if (e->v.BoolOp.op == And)
2585 jumpi = JUMP_IF_FALSE_OR_POP;
2586 else
2587 jumpi = JUMP_IF_TRUE_OR_POP;
2588 end = compiler_new_block(c);
2589 if (end == NULL)
2590 return 0;
2591 s = e->v.BoolOp.values;
2592 n = asdl_seq_LEN(s) - 1;
2593 assert(n >= 0);
2594 for (i = 0; i < n; ++i) {
2595 VISIT(c, expr, (expr_ty)asdl_seq_GET(s, i));
2596 ADDOP_JABS(c, jumpi, end);
2597 }
2598 VISIT(c, expr, (expr_ty)asdl_seq_GET(s, n));
2599 compiler_use_next_block(c, end);
2600 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002601}
2602
2603static int
2604compiler_list(struct compiler *c, expr_ty e)
2605{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002606 int n = asdl_seq_LEN(e->v.List.elts);
2607 if (e->v.List.ctx == Store) {
2608 int i, seen_star = 0;
2609 for (i = 0; i < n; i++) {
2610 expr_ty elt = asdl_seq_GET(e->v.List.elts, i);
2611 if (elt->kind == Starred_kind && !seen_star) {
2612 if ((i >= (1 << 8)) ||
2613 (n-i-1 >= (INT_MAX >> 8)))
2614 return compiler_error(c,
2615 "too many expressions in "
2616 "star-unpacking assignment");
2617 ADDOP_I(c, UNPACK_EX, (i + ((n-i-1) << 8)));
2618 seen_star = 1;
2619 asdl_seq_SET(e->v.List.elts, i, elt->v.Starred.value);
2620 } else if (elt->kind == Starred_kind) {
2621 return compiler_error(c,
2622 "two starred expressions in assignment");
2623 }
2624 }
2625 if (!seen_star) {
2626 ADDOP_I(c, UNPACK_SEQUENCE, n);
2627 }
2628 }
2629 VISIT_SEQ(c, expr, e->v.List.elts);
2630 if (e->v.List.ctx == Load) {
2631 ADDOP_I(c, BUILD_LIST, n);
2632 }
2633 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002634}
2635
2636static int
2637compiler_tuple(struct compiler *c, expr_ty e)
2638{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002639 int n = asdl_seq_LEN(e->v.Tuple.elts);
2640 if (e->v.Tuple.ctx == Store) {
2641 int i, seen_star = 0;
2642 for (i = 0; i < n; i++) {
2643 expr_ty elt = asdl_seq_GET(e->v.Tuple.elts, i);
2644 if (elt->kind == Starred_kind && !seen_star) {
2645 if ((i >= (1 << 8)) ||
2646 (n-i-1 >= (INT_MAX >> 8)))
2647 return compiler_error(c,
2648 "too many expressions in "
2649 "star-unpacking assignment");
2650 ADDOP_I(c, UNPACK_EX, (i + ((n-i-1) << 8)));
2651 seen_star = 1;
2652 asdl_seq_SET(e->v.Tuple.elts, i, elt->v.Starred.value);
2653 } else if (elt->kind == Starred_kind) {
2654 return compiler_error(c,
2655 "two starred expressions in assignment");
2656 }
2657 }
2658 if (!seen_star) {
2659 ADDOP_I(c, UNPACK_SEQUENCE, n);
2660 }
2661 }
2662 VISIT_SEQ(c, expr, e->v.Tuple.elts);
2663 if (e->v.Tuple.ctx == Load) {
2664 ADDOP_I(c, BUILD_TUPLE, n);
2665 }
2666 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002667}
2668
2669static int
2670compiler_compare(struct compiler *c, expr_ty e)
2671{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002672 int i, n;
2673 basicblock *cleanup = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002674
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002675 /* XXX the logic can be cleaned up for 1 or multiple comparisons */
2676 VISIT(c, expr, e->v.Compare.left);
2677 n = asdl_seq_LEN(e->v.Compare.ops);
2678 assert(n > 0);
2679 if (n > 1) {
2680 cleanup = compiler_new_block(c);
2681 if (cleanup == NULL)
2682 return 0;
2683 VISIT(c, expr,
2684 (expr_ty)asdl_seq_GET(e->v.Compare.comparators, 0));
2685 }
2686 for (i = 1; i < n; i++) {
2687 ADDOP(c, DUP_TOP);
2688 ADDOP(c, ROT_THREE);
2689 ADDOP_I(c, COMPARE_OP,
2690 cmpop((cmpop_ty)(asdl_seq_GET(
2691 e->v.Compare.ops, i - 1))));
2692 ADDOP_JABS(c, JUMP_IF_FALSE_OR_POP, cleanup);
2693 NEXT_BLOCK(c);
2694 if (i < (n - 1))
2695 VISIT(c, expr,
2696 (expr_ty)asdl_seq_GET(e->v.Compare.comparators, i));
2697 }
2698 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, n - 1));
2699 ADDOP_I(c, COMPARE_OP,
2700 cmpop((cmpop_ty)(asdl_seq_GET(e->v.Compare.ops, n - 1))));
2701 if (n > 1) {
2702 basicblock *end = compiler_new_block(c);
2703 if (end == NULL)
2704 return 0;
2705 ADDOP_JREL(c, JUMP_FORWARD, end);
2706 compiler_use_next_block(c, cleanup);
2707 ADDOP(c, ROT_TWO);
2708 ADDOP(c, POP_TOP);
2709 compiler_use_next_block(c, end);
2710 }
2711 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002712}
2713
2714static int
2715compiler_call(struct compiler *c, expr_ty e)
2716{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002717 VISIT(c, expr, e->v.Call.func);
2718 return compiler_call_helper(c, 0,
2719 e->v.Call.args,
2720 e->v.Call.keywords,
2721 e->v.Call.starargs,
2722 e->v.Call.kwargs);
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002723}
2724
2725/* shared code between compiler_call and compiler_class */
2726static int
2727compiler_call_helper(struct compiler *c,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002728 int n, /* Args already pushed */
2729 asdl_seq *args,
2730 asdl_seq *keywords,
2731 expr_ty starargs,
2732 expr_ty kwargs)
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002733{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002734 int code = 0;
Guido van Rossum52cc1d82007-03-18 15:41:51 +00002735
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002736 n += asdl_seq_LEN(args);
2737 VISIT_SEQ(c, expr, args);
2738 if (keywords) {
2739 VISIT_SEQ(c, keyword, keywords);
2740 n |= asdl_seq_LEN(keywords) << 8;
2741 }
2742 if (starargs) {
2743 VISIT(c, expr, starargs);
2744 code |= 1;
2745 }
2746 if (kwargs) {
2747 VISIT(c, expr, kwargs);
2748 code |= 2;
2749 }
2750 switch (code) {
2751 case 0:
2752 ADDOP_I(c, CALL_FUNCTION, n);
2753 break;
2754 case 1:
2755 ADDOP_I(c, CALL_FUNCTION_VAR, n);
2756 break;
2757 case 2:
2758 ADDOP_I(c, CALL_FUNCTION_KW, n);
2759 break;
2760 case 3:
2761 ADDOP_I(c, CALL_FUNCTION_VAR_KW, n);
2762 break;
2763 }
2764 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002765}
2766
Nick Coghlan650f0d02007-04-15 12:05:43 +00002767
2768/* List and set comprehensions and generator expressions work by creating a
2769 nested function to perform the actual iteration. This means that the
2770 iteration variables don't leak into the current scope.
2771 The defined function is called immediately following its definition, with the
2772 result of that call being the result of the expression.
2773 The LC/SC version returns the populated container, while the GE version is
2774 flagged in symtable.c as a generator, so it returns the generator object
2775 when the function is called.
2776 This code *knows* that the loop cannot contain break, continue, or return,
2777 so it cheats and skips the SETUP_LOOP/POP_BLOCK steps used in normal loops.
2778
2779 Possible cleanups:
2780 - iterate over the generator sequence instead of using recursion
2781*/
2782
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002783static int
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002784compiler_comprehension_generator(struct compiler *c,
2785 asdl_seq *generators, int gen_index,
2786 expr_ty elt, expr_ty val, int type)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002787{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002788 /* generate code for the iterator, then each of the ifs,
2789 and then write to the element */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002790
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002791 comprehension_ty gen;
2792 basicblock *start, *anchor, *skip, *if_cleanup;
2793 int i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002794
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002795 start = compiler_new_block(c);
2796 skip = compiler_new_block(c);
2797 if_cleanup = compiler_new_block(c);
2798 anchor = compiler_new_block(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002799
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002800 if (start == NULL || skip == NULL || if_cleanup == NULL ||
2801 anchor == NULL)
2802 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002803
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002804 gen = (comprehension_ty)asdl_seq_GET(generators, gen_index);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002805
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002806 if (gen_index == 0) {
2807 /* Receive outermost iter as an implicit argument */
2808 c->u->u_argcount = 1;
2809 ADDOP_I(c, LOAD_FAST, 0);
2810 }
2811 else {
2812 /* Sub-iter - calculate on the fly */
2813 VISIT(c, expr, gen->iter);
2814 ADDOP(c, GET_ITER);
2815 }
2816 compiler_use_next_block(c, start);
2817 ADDOP_JREL(c, FOR_ITER, anchor);
2818 NEXT_BLOCK(c);
2819 VISIT(c, expr, gen->target);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002820
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002821 /* XXX this needs to be cleaned up...a lot! */
2822 n = asdl_seq_LEN(gen->ifs);
2823 for (i = 0; i < n; i++) {
2824 expr_ty e = (expr_ty)asdl_seq_GET(gen->ifs, i);
2825 VISIT(c, expr, e);
2826 ADDOP_JABS(c, POP_JUMP_IF_FALSE, if_cleanup);
2827 NEXT_BLOCK(c);
2828 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002829
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002830 if (++gen_index < asdl_seq_LEN(generators))
2831 if (!compiler_comprehension_generator(c,
2832 generators, gen_index,
2833 elt, val, type))
2834 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002835
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002836 /* only append after the last for generator */
2837 if (gen_index >= asdl_seq_LEN(generators)) {
2838 /* comprehension specific code */
2839 switch (type) {
2840 case COMP_GENEXP:
2841 VISIT(c, expr, elt);
2842 ADDOP(c, YIELD_VALUE);
2843 ADDOP(c, POP_TOP);
2844 break;
2845 case COMP_LISTCOMP:
2846 VISIT(c, expr, elt);
2847 ADDOP_I(c, LIST_APPEND, gen_index + 1);
2848 break;
2849 case COMP_SETCOMP:
2850 VISIT(c, expr, elt);
2851 ADDOP_I(c, SET_ADD, gen_index + 1);
2852 break;
2853 case COMP_DICTCOMP:
2854 /* With 'd[k] = v', v is evaluated before k, so we do
2855 the same. */
2856 VISIT(c, expr, val);
2857 VISIT(c, expr, elt);
2858 ADDOP_I(c, MAP_ADD, gen_index + 1);
2859 break;
2860 default:
2861 return 0;
2862 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002863
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002864 compiler_use_next_block(c, skip);
2865 }
2866 compiler_use_next_block(c, if_cleanup);
2867 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
2868 compiler_use_next_block(c, anchor);
2869
2870 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002871}
2872
2873static int
Nick Coghlan650f0d02007-04-15 12:05:43 +00002874compiler_comprehension(struct compiler *c, expr_ty e, int type, identifier name,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002875 asdl_seq *generators, expr_ty elt, expr_ty val)
Nick Coghlan650f0d02007-04-15 12:05:43 +00002876{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002877 PyCodeObject *co = NULL;
2878 expr_ty outermost_iter;
Nick Coghlan650f0d02007-04-15 12:05:43 +00002879
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002880 outermost_iter = ((comprehension_ty)
2881 asdl_seq_GET(generators, 0))->iter;
Nick Coghlan650f0d02007-04-15 12:05:43 +00002882
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002883 if (!compiler_enter_scope(c, name, (void *)e, e->lineno))
2884 goto error;
Nick Coghlan650f0d02007-04-15 12:05:43 +00002885
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002886 if (type != COMP_GENEXP) {
2887 int op;
2888 switch (type) {
2889 case COMP_LISTCOMP:
2890 op = BUILD_LIST;
2891 break;
2892 case COMP_SETCOMP:
2893 op = BUILD_SET;
2894 break;
2895 case COMP_DICTCOMP:
2896 op = BUILD_MAP;
2897 break;
2898 default:
2899 PyErr_Format(PyExc_SystemError,
2900 "unknown comprehension type %d", type);
2901 goto error_in_scope;
2902 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00002903
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002904 ADDOP_I(c, op, 0);
2905 }
Nick Coghlan650f0d02007-04-15 12:05:43 +00002906
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002907 if (!compiler_comprehension_generator(c, generators, 0, elt,
2908 val, type))
2909 goto error_in_scope;
Nick Coghlan650f0d02007-04-15 12:05:43 +00002910
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002911 if (type != COMP_GENEXP) {
2912 ADDOP(c, RETURN_VALUE);
2913 }
2914
2915 co = assemble(c, 1);
2916 compiler_exit_scope(c);
2917 if (co == NULL)
2918 goto error;
2919
2920 if (!compiler_make_closure(c, co, 0))
2921 goto error;
2922 Py_DECREF(co);
2923
2924 VISIT(c, expr, outermost_iter);
2925 ADDOP(c, GET_ITER);
2926 ADDOP_I(c, CALL_FUNCTION, 1);
2927 return 1;
Nick Coghlan650f0d02007-04-15 12:05:43 +00002928error_in_scope:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002929 compiler_exit_scope(c);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002930error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002931 Py_XDECREF(co);
2932 return 0;
Nick Coghlan650f0d02007-04-15 12:05:43 +00002933}
2934
2935static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002936compiler_genexp(struct compiler *c, expr_ty e)
2937{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002938 static identifier name;
2939 if (!name) {
2940 name = PyUnicode_FromString("<genexpr>");
2941 if (!name)
2942 return 0;
2943 }
2944 assert(e->kind == GeneratorExp_kind);
2945 return compiler_comprehension(c, e, COMP_GENEXP, name,
2946 e->v.GeneratorExp.generators,
2947 e->v.GeneratorExp.elt, NULL);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002948}
2949
2950static int
Nick Coghlan650f0d02007-04-15 12:05:43 +00002951compiler_listcomp(struct compiler *c, expr_ty e)
2952{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002953 static identifier name;
2954 if (!name) {
2955 name = PyUnicode_FromString("<listcomp>");
2956 if (!name)
2957 return 0;
2958 }
2959 assert(e->kind == ListComp_kind);
2960 return compiler_comprehension(c, e, COMP_LISTCOMP, name,
2961 e->v.ListComp.generators,
2962 e->v.ListComp.elt, NULL);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002963}
2964
2965static int
2966compiler_setcomp(struct compiler *c, expr_ty e)
2967{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002968 static identifier name;
2969 if (!name) {
2970 name = PyUnicode_FromString("<setcomp>");
2971 if (!name)
2972 return 0;
2973 }
2974 assert(e->kind == SetComp_kind);
2975 return compiler_comprehension(c, e, COMP_SETCOMP, name,
2976 e->v.SetComp.generators,
2977 e->v.SetComp.elt, NULL);
Guido van Rossum992d4a32007-07-11 13:09:30 +00002978}
2979
2980
2981static int
2982compiler_dictcomp(struct compiler *c, expr_ty e)
2983{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002984 static identifier name;
2985 if (!name) {
2986 name = PyUnicode_FromString("<dictcomp>");
2987 if (!name)
2988 return 0;
2989 }
2990 assert(e->kind == DictComp_kind);
2991 return compiler_comprehension(c, e, COMP_DICTCOMP, name,
2992 e->v.DictComp.generators,
2993 e->v.DictComp.key, e->v.DictComp.value);
Nick Coghlan650f0d02007-04-15 12:05:43 +00002994}
2995
2996
2997static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002998compiler_visit_keyword(struct compiler *c, keyword_ty k)
2999{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003000 ADDOP_O(c, LOAD_CONST, k->arg, consts);
3001 VISIT(c, expr, k->value);
3002 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003003}
3004
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003005/* Test whether expression is constant. For constants, report
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003006 whether they are true or false.
3007
3008 Return values: 1 for true, 0 for false, -1 for non-constant.
3009 */
3010
3011static int
3012expr_constant(expr_ty e)
3013{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003014 char *id;
3015 switch (e->kind) {
3016 case Ellipsis_kind:
3017 return 1;
3018 case Num_kind:
3019 return PyObject_IsTrue(e->v.Num.n);
3020 case Str_kind:
3021 return PyObject_IsTrue(e->v.Str.s);
3022 case Name_kind:
3023 /* optimize away names that can't be reassigned */
3024 id = PyBytes_AS_STRING(
3025 _PyUnicode_AsDefaultEncodedString(e->v.Name.id, NULL));
3026 if (strcmp(id, "True") == 0) return 1;
3027 if (strcmp(id, "False") == 0) return 0;
3028 if (strcmp(id, "None") == 0) return 0;
3029 if (strcmp(id, "__debug__") == 0)
3030 return ! Py_OptimizeFlag;
3031 /* fall through */
3032 default:
3033 return -1;
3034 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003035}
3036
Guido van Rossumc2e20742006-02-27 22:32:47 +00003037/*
3038 Implements the with statement from PEP 343.
3039
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003040 The semantics outlined in that PEP are as follows:
Guido van Rossumc2e20742006-02-27 22:32:47 +00003041
3042 with EXPR as VAR:
3043 BLOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003044
Guido van Rossumc2e20742006-02-27 22:32:47 +00003045 It is implemented roughly as:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003046
Thomas Wouters477c8d52006-05-27 19:21:47 +00003047 context = EXPR
Guido van Rossumc2e20742006-02-27 22:32:47 +00003048 exit = context.__exit__ # not calling it
3049 value = context.__enter__()
3050 try:
3051 VAR = value # if VAR present in the syntax
3052 BLOCK
3053 finally:
3054 if an exception was raised:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003055 exc = copy of (exception, instance, traceback)
Guido van Rossumc2e20742006-02-27 22:32:47 +00003056 else:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003057 exc = (None, None, None)
Guido van Rossumc2e20742006-02-27 22:32:47 +00003058 exit(*exc)
3059 */
3060static int
3061compiler_with(struct compiler *c, stmt_ty s)
3062{
Guido van Rossumc2e20742006-02-27 22:32:47 +00003063 basicblock *block, *finally;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003064
3065 assert(s->kind == With_kind);
3066
Guido van Rossumc2e20742006-02-27 22:32:47 +00003067 block = compiler_new_block(c);
3068 finally = compiler_new_block(c);
3069 if (!block || !finally)
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00003070 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003071
Thomas Wouters477c8d52006-05-27 19:21:47 +00003072 /* Evaluate EXPR */
Guido van Rossumc2e20742006-02-27 22:32:47 +00003073 VISIT(c, expr, s->v.With.context_expr);
Benjamin Peterson876b2f22009-06-28 03:18:59 +00003074 ADDOP_JREL(c, SETUP_WITH, finally);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003075
Benjamin Peterson876b2f22009-06-28 03:18:59 +00003076 /* SETUP_WITH pushes a finally block. */
Guido van Rossumc2e20742006-02-27 22:32:47 +00003077 compiler_use_next_block(c, block);
3078 if (!compiler_push_fblock(c, FINALLY_TRY, block)) {
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00003079 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003080 }
3081
3082 if (s->v.With.optional_vars) {
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00003083 VISIT(c, expr, s->v.With.optional_vars);
Benjamin Peterson876b2f22009-06-28 03:18:59 +00003084 }
3085 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003086 /* Discard result from context.__enter__() */
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00003087 ADDOP(c, POP_TOP);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003088 }
3089
3090 /* BLOCK code */
3091 VISIT_SEQ(c, stmt, s->v.With.body);
3092
3093 /* End of try block; start the finally block */
3094 ADDOP(c, POP_BLOCK);
3095 compiler_pop_fblock(c, FINALLY_TRY, block);
3096
3097 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3098 compiler_use_next_block(c, finally);
3099 if (!compiler_push_fblock(c, FINALLY_END, finally))
Antoine Pitrou9aee2c82010-06-22 21:49:39 +00003100 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00003101
Christian Heimesdd15f6c2008-03-16 00:07:10 +00003102 /* Finally block starts; context.__exit__ is on the stack under
3103 the exception or return information. Just issue our magic
3104 opcode. */
Guido van Rossumc2e20742006-02-27 22:32:47 +00003105 ADDOP(c, WITH_CLEANUP);
Guido van Rossumc2e20742006-02-27 22:32:47 +00003106
3107 /* Finally block ends. */
3108 ADDOP(c, END_FINALLY);
3109 compiler_pop_fblock(c, FINALLY_END, finally);
3110 return 1;
3111}
3112
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003113static int
3114compiler_visit_expr(struct compiler *c, expr_ty e)
3115{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003116 int i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003117
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003118 /* If expr e has a different line number than the last expr/stmt,
3119 set a new line number for the next instruction.
3120 */
3121 if (e->lineno > c->u->u_lineno) {
3122 c->u->u_lineno = e->lineno;
3123 c->u->u_lineno_set = 0;
3124 }
3125 switch (e->kind) {
3126 case BoolOp_kind:
3127 return compiler_boolop(c, e);
3128 case BinOp_kind:
3129 VISIT(c, expr, e->v.BinOp.left);
3130 VISIT(c, expr, e->v.BinOp.right);
3131 ADDOP(c, binop(c, e->v.BinOp.op));
3132 break;
3133 case UnaryOp_kind:
3134 VISIT(c, expr, e->v.UnaryOp.operand);
3135 ADDOP(c, unaryop(e->v.UnaryOp.op));
3136 break;
3137 case Lambda_kind:
3138 return compiler_lambda(c, e);
3139 case IfExp_kind:
3140 return compiler_ifexp(c, e);
3141 case Dict_kind:
3142 n = asdl_seq_LEN(e->v.Dict.values);
3143 ADDOP_I(c, BUILD_MAP, (n>0xFFFF ? 0xFFFF : n));
3144 for (i = 0; i < n; i++) {
3145 VISIT(c, expr,
3146 (expr_ty)asdl_seq_GET(e->v.Dict.values, i));
3147 VISIT(c, expr,
3148 (expr_ty)asdl_seq_GET(e->v.Dict.keys, i));
3149 ADDOP(c, STORE_MAP);
3150 }
3151 break;
3152 case Set_kind:
3153 n = asdl_seq_LEN(e->v.Set.elts);
3154 VISIT_SEQ(c, expr, e->v.Set.elts);
3155 ADDOP_I(c, BUILD_SET, n);
3156 break;
3157 case GeneratorExp_kind:
3158 return compiler_genexp(c, e);
3159 case ListComp_kind:
3160 return compiler_listcomp(c, e);
3161 case SetComp_kind:
3162 return compiler_setcomp(c, e);
3163 case DictComp_kind:
3164 return compiler_dictcomp(c, e);
3165 case Yield_kind:
3166 if (c->u->u_ste->ste_type != FunctionBlock)
3167 return compiler_error(c, "'yield' outside function");
3168 if (e->v.Yield.value) {
3169 VISIT(c, expr, e->v.Yield.value);
3170 }
3171 else {
3172 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3173 }
3174 ADDOP(c, YIELD_VALUE);
3175 break;
3176 case Compare_kind:
3177 return compiler_compare(c, e);
3178 case Call_kind:
3179 return compiler_call(c, e);
3180 case Num_kind:
3181 ADDOP_O(c, LOAD_CONST, e->v.Num.n, consts);
3182 break;
3183 case Str_kind:
3184 ADDOP_O(c, LOAD_CONST, e->v.Str.s, consts);
3185 break;
3186 case Bytes_kind:
3187 ADDOP_O(c, LOAD_CONST, e->v.Bytes.s, consts);
3188 break;
3189 case Ellipsis_kind:
3190 ADDOP_O(c, LOAD_CONST, Py_Ellipsis, consts);
3191 break;
3192 /* The following exprs can be assignment targets. */
3193 case Attribute_kind:
3194 if (e->v.Attribute.ctx != AugStore)
3195 VISIT(c, expr, e->v.Attribute.value);
3196 switch (e->v.Attribute.ctx) {
3197 case AugLoad:
3198 ADDOP(c, DUP_TOP);
3199 /* Fall through to load */
3200 case Load:
3201 ADDOP_NAME(c, LOAD_ATTR, e->v.Attribute.attr, names);
3202 break;
3203 case AugStore:
3204 ADDOP(c, ROT_TWO);
3205 /* Fall through to save */
3206 case Store:
3207 ADDOP_NAME(c, STORE_ATTR, e->v.Attribute.attr, names);
3208 break;
3209 case Del:
3210 ADDOP_NAME(c, DELETE_ATTR, e->v.Attribute.attr, names);
3211 break;
3212 case Param:
3213 default:
3214 PyErr_SetString(PyExc_SystemError,
3215 "param invalid in attribute expression");
3216 return 0;
3217 }
3218 break;
3219 case Subscript_kind:
3220 switch (e->v.Subscript.ctx) {
3221 case AugLoad:
3222 VISIT(c, expr, e->v.Subscript.value);
3223 VISIT_SLICE(c, e->v.Subscript.slice, AugLoad);
3224 break;
3225 case Load:
3226 VISIT(c, expr, e->v.Subscript.value);
3227 VISIT_SLICE(c, e->v.Subscript.slice, Load);
3228 break;
3229 case AugStore:
3230 VISIT_SLICE(c, e->v.Subscript.slice, AugStore);
3231 break;
3232 case Store:
3233 VISIT(c, expr, e->v.Subscript.value);
3234 VISIT_SLICE(c, e->v.Subscript.slice, Store);
3235 break;
3236 case Del:
3237 VISIT(c, expr, e->v.Subscript.value);
3238 VISIT_SLICE(c, e->v.Subscript.slice, Del);
3239 break;
3240 case Param:
3241 default:
3242 PyErr_SetString(PyExc_SystemError,
3243 "param invalid in subscript expression");
3244 return 0;
3245 }
3246 break;
3247 case Starred_kind:
3248 switch (e->v.Starred.ctx) {
3249 case Store:
3250 /* In all legitimate cases, the Starred node was already replaced
3251 * by compiler_list/compiler_tuple. XXX: is that okay? */
3252 return compiler_error(c,
3253 "starred assignment target must be in a list or tuple");
3254 default:
3255 return compiler_error(c,
3256 "can use starred expression only as assignment target");
3257 }
3258 break;
3259 case Name_kind:
3260 return compiler_nameop(c, e->v.Name.id, e->v.Name.ctx);
3261 /* child nodes of List and Tuple will have expr_context set */
3262 case List_kind:
3263 return compiler_list(c, e);
3264 case Tuple_kind:
3265 return compiler_tuple(c, e);
3266 }
3267 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003268}
3269
3270static int
3271compiler_augassign(struct compiler *c, stmt_ty s)
3272{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003273 expr_ty e = s->v.AugAssign.target;
3274 expr_ty auge;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003275
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003276 assert(s->kind == AugAssign_kind);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003277
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003278 switch (e->kind) {
3279 case Attribute_kind:
3280 auge = Attribute(e->v.Attribute.value, e->v.Attribute.attr,
3281 AugLoad, e->lineno, e->col_offset, c->c_arena);
3282 if (auge == NULL)
3283 return 0;
3284 VISIT(c, expr, auge);
3285 VISIT(c, expr, s->v.AugAssign.value);
3286 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
3287 auge->v.Attribute.ctx = AugStore;
3288 VISIT(c, expr, auge);
3289 break;
3290 case Subscript_kind:
3291 auge = Subscript(e->v.Subscript.value, e->v.Subscript.slice,
3292 AugLoad, e->lineno, e->col_offset, c->c_arena);
3293 if (auge == NULL)
3294 return 0;
3295 VISIT(c, expr, auge);
3296 VISIT(c, expr, s->v.AugAssign.value);
3297 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
3298 auge->v.Subscript.ctx = AugStore;
3299 VISIT(c, expr, auge);
3300 break;
3301 case Name_kind:
3302 if (!compiler_nameop(c, e->v.Name.id, Load))
3303 return 0;
3304 VISIT(c, expr, s->v.AugAssign.value);
3305 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
3306 return compiler_nameop(c, e->v.Name.id, Store);
3307 default:
3308 PyErr_Format(PyExc_SystemError,
3309 "invalid node type (%d) for augmented assignment",
3310 e->kind);
3311 return 0;
3312 }
3313 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003314}
3315
3316static int
3317compiler_push_fblock(struct compiler *c, enum fblocktype t, basicblock *b)
3318{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003319 struct fblockinfo *f;
3320 if (c->u->u_nfblocks >= CO_MAXBLOCKS) {
3321 PyErr_SetString(PyExc_SystemError,
3322 "too many statically nested blocks");
3323 return 0;
3324 }
3325 f = &c->u->u_fblock[c->u->u_nfblocks++];
3326 f->fb_type = t;
3327 f->fb_block = b;
3328 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003329}
3330
3331static void
3332compiler_pop_fblock(struct compiler *c, enum fblocktype t, basicblock *b)
3333{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003334 struct compiler_unit *u = c->u;
3335 assert(u->u_nfblocks > 0);
3336 u->u_nfblocks--;
3337 assert(u->u_fblock[u->u_nfblocks].fb_type == t);
3338 assert(u->u_fblock[u->u_nfblocks].fb_block == b);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003339}
3340
Thomas Wouters89f507f2006-12-13 04:49:30 +00003341static int
3342compiler_in_loop(struct compiler *c) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003343 int i;
3344 struct compiler_unit *u = c->u;
3345 for (i = 0; i < u->u_nfblocks; ++i) {
3346 if (u->u_fblock[i].fb_type == LOOP)
3347 return 1;
3348 }
3349 return 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00003350}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003351/* Raises a SyntaxError and returns 0.
3352 If something goes wrong, a different exception may be raised.
3353*/
3354
3355static int
3356compiler_error(struct compiler *c, const char *errstr)
3357{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003358 PyObject *loc;
3359 PyObject *u = NULL, *v = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003360
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003361 loc = PyErr_ProgramText(c->c_filename, c->u->u_lineno);
3362 if (!loc) {
3363 Py_INCREF(Py_None);
3364 loc = Py_None;
3365 }
3366 u = Py_BuildValue("(ziOO)", c->c_filename, c->u->u_lineno,
3367 Py_None, loc);
3368 if (!u)
3369 goto exit;
3370 v = Py_BuildValue("(zO)", errstr, u);
3371 if (!v)
3372 goto exit;
3373 PyErr_SetObject(PyExc_SyntaxError, v);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003374 exit:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003375 Py_DECREF(loc);
3376 Py_XDECREF(u);
3377 Py_XDECREF(v);
3378 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003379}
3380
3381static int
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003382compiler_handle_subscr(struct compiler *c, const char *kind,
3383 expr_context_ty ctx)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003384{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003385 int op = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003386
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003387 /* XXX this code is duplicated */
3388 switch (ctx) {
3389 case AugLoad: /* fall through to Load */
3390 case Load: op = BINARY_SUBSCR; break;
3391 case AugStore:/* fall through to Store */
3392 case Store: op = STORE_SUBSCR; break;
3393 case Del: op = DELETE_SUBSCR; break;
3394 case Param:
3395 PyErr_Format(PyExc_SystemError,
3396 "invalid %s kind %d in subscript\n",
3397 kind, ctx);
3398 return 0;
3399 }
3400 if (ctx == AugLoad) {
Antoine Pitrou74a69fa2010-09-04 18:43:52 +00003401 ADDOP(c, DUP_TOP_TWO);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003402 }
3403 else if (ctx == AugStore) {
3404 ADDOP(c, ROT_THREE);
3405 }
3406 ADDOP(c, op);
3407 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003408}
3409
3410static int
3411compiler_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)
3412{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003413 int n = 2;
3414 assert(s->kind == Slice_kind);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003415
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003416 /* only handles the cases where BUILD_SLICE is emitted */
3417 if (s->v.Slice.lower) {
3418 VISIT(c, expr, s->v.Slice.lower);
3419 }
3420 else {
3421 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3422 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003423
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003424 if (s->v.Slice.upper) {
3425 VISIT(c, expr, s->v.Slice.upper);
3426 }
3427 else {
3428 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3429 }
3430
3431 if (s->v.Slice.step) {
3432 n++;
3433 VISIT(c, expr, s->v.Slice.step);
3434 }
3435 ADDOP_I(c, BUILD_SLICE, n);
3436 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003437}
3438
3439static int
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003440compiler_visit_nested_slice(struct compiler *c, slice_ty s,
3441 expr_context_ty ctx)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003442{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003443 switch (s->kind) {
3444 case Slice_kind:
3445 return compiler_slice(c, s, ctx);
3446 case Index_kind:
3447 VISIT(c, expr, s->v.Index.value);
3448 break;
3449 case ExtSlice_kind:
3450 default:
3451 PyErr_SetString(PyExc_SystemError,
3452 "extended slice invalid in nested slice");
3453 return 0;
3454 }
3455 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003456}
3457
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003458static int
3459compiler_visit_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)
3460{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003461 char * kindname = NULL;
3462 switch (s->kind) {
3463 case Index_kind:
3464 kindname = "index";
3465 if (ctx != AugStore) {
3466 VISIT(c, expr, s->v.Index.value);
3467 }
3468 break;
3469 case Slice_kind:
3470 kindname = "slice";
3471 if (ctx != AugStore) {
3472 if (!compiler_slice(c, s, ctx))
3473 return 0;
3474 }
3475 break;
3476 case ExtSlice_kind:
3477 kindname = "extended slice";
3478 if (ctx != AugStore) {
3479 int i, n = asdl_seq_LEN(s->v.ExtSlice.dims);
3480 for (i = 0; i < n; i++) {
3481 slice_ty sub = (slice_ty)asdl_seq_GET(
3482 s->v.ExtSlice.dims, i);
3483 if (!compiler_visit_nested_slice(c, sub, ctx))
3484 return 0;
3485 }
3486 ADDOP_I(c, BUILD_TUPLE, n);
3487 }
3488 break;
3489 default:
3490 PyErr_Format(PyExc_SystemError,
3491 "invalid subscript kind %d", s->kind);
3492 return 0;
3493 }
3494 return compiler_handle_subscr(c, kindname, ctx);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003495}
3496
Thomas Wouters89f507f2006-12-13 04:49:30 +00003497/* End of the compiler section, beginning of the assembler section */
3498
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003499/* do depth-first search of basic block graph, starting with block.
3500 post records the block indices in post-order.
3501
3502 XXX must handle implicit jumps from one block to next
3503*/
3504
Thomas Wouters89f507f2006-12-13 04:49:30 +00003505struct assembler {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003506 PyObject *a_bytecode; /* string containing bytecode */
3507 int a_offset; /* offset into bytecode */
3508 int a_nblocks; /* number of reachable blocks */
3509 basicblock **a_postorder; /* list of blocks in dfs postorder */
3510 PyObject *a_lnotab; /* string containing lnotab */
3511 int a_lnotab_off; /* offset into lnotab */
3512 int a_lineno; /* last lineno of emitted instruction */
3513 int a_lineno_off; /* bytecode offset of last lineno */
Thomas Wouters89f507f2006-12-13 04:49:30 +00003514};
3515
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003516static void
3517dfs(struct compiler *c, basicblock *b, struct assembler *a)
3518{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003519 int i;
3520 struct instr *instr = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003521
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003522 if (b->b_seen)
3523 return;
3524 b->b_seen = 1;
3525 if (b->b_next != NULL)
3526 dfs(c, b->b_next, a);
3527 for (i = 0; i < b->b_iused; i++) {
3528 instr = &b->b_instr[i];
3529 if (instr->i_jrel || instr->i_jabs)
3530 dfs(c, instr->i_target, a);
3531 }
3532 a->a_postorder[a->a_nblocks++] = b;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003533}
3534
Neal Norwitz2744c6c2005-11-13 01:08:38 +00003535static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003536stackdepth_walk(struct compiler *c, basicblock *b, int depth, int maxdepth)
3537{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003538 int i, target_depth;
3539 struct instr *instr;
3540 if (b->b_seen || b->b_startdepth >= depth)
3541 return maxdepth;
3542 b->b_seen = 1;
3543 b->b_startdepth = depth;
3544 for (i = 0; i < b->b_iused; i++) {
3545 instr = &b->b_instr[i];
3546 depth += opcode_stack_effect(instr->i_opcode, instr->i_oparg);
3547 if (depth > maxdepth)
3548 maxdepth = depth;
3549 assert(depth >= 0); /* invalid code or bug in stackdepth() */
3550 if (instr->i_jrel || instr->i_jabs) {
3551 target_depth = depth;
3552 if (instr->i_opcode == FOR_ITER) {
3553 target_depth = depth-2;
3554 } else if (instr->i_opcode == SETUP_FINALLY ||
3555 instr->i_opcode == SETUP_EXCEPT) {
3556 target_depth = depth+3;
3557 if (target_depth > maxdepth)
3558 maxdepth = target_depth;
3559 }
3560 maxdepth = stackdepth_walk(c, instr->i_target,
3561 target_depth, maxdepth);
3562 if (instr->i_opcode == JUMP_ABSOLUTE ||
3563 instr->i_opcode == JUMP_FORWARD) {
3564 goto out; /* remaining code is dead */
3565 }
3566 }
3567 }
3568 if (b->b_next)
3569 maxdepth = stackdepth_walk(c, b->b_next, depth, maxdepth);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003570out:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003571 b->b_seen = 0;
3572 return maxdepth;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003573}
3574
3575/* Find the flow path that needs the largest stack. We assume that
3576 * cycles in the flow graph have no net effect on the stack depth.
3577 */
3578static int
3579stackdepth(struct compiler *c)
3580{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003581 basicblock *b, *entryblock;
3582 entryblock = NULL;
3583 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
3584 b->b_seen = 0;
3585 b->b_startdepth = INT_MIN;
3586 entryblock = b;
3587 }
3588 if (!entryblock)
3589 return 0;
3590 return stackdepth_walk(c, entryblock, 0, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003591}
3592
3593static int
3594assemble_init(struct assembler *a, int nblocks, int firstlineno)
3595{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003596 memset(a, 0, sizeof(struct assembler));
3597 a->a_lineno = firstlineno;
3598 a->a_bytecode = PyBytes_FromStringAndSize(NULL, DEFAULT_CODE_SIZE);
3599 if (!a->a_bytecode)
3600 return 0;
3601 a->a_lnotab = PyBytes_FromStringAndSize(NULL, DEFAULT_LNOTAB_SIZE);
3602 if (!a->a_lnotab)
3603 return 0;
3604 if (nblocks > PY_SIZE_MAX / sizeof(basicblock *)) {
3605 PyErr_NoMemory();
3606 return 0;
3607 }
3608 a->a_postorder = (basicblock **)PyObject_Malloc(
3609 sizeof(basicblock *) * nblocks);
3610 if (!a->a_postorder) {
3611 PyErr_NoMemory();
3612 return 0;
3613 }
3614 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003615}
3616
3617static void
3618assemble_free(struct assembler *a)
3619{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003620 Py_XDECREF(a->a_bytecode);
3621 Py_XDECREF(a->a_lnotab);
3622 if (a->a_postorder)
3623 PyObject_Free(a->a_postorder);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003624}
3625
3626/* Return the size of a basic block in bytes. */
3627
3628static int
3629instrsize(struct instr *instr)
3630{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003631 if (!instr->i_hasarg)
3632 return 1; /* 1 byte for the opcode*/
3633 if (instr->i_oparg > 0xffff)
3634 return 6; /* 1 (opcode) + 1 (EXTENDED_ARG opcode) + 2 (oparg) + 2(oparg extended) */
3635 return 3; /* 1 (opcode) + 2 (oparg) */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003636}
3637
3638static int
3639blocksize(basicblock *b)
3640{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003641 int i;
3642 int size = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003643
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003644 for (i = 0; i < b->b_iused; i++)
3645 size += instrsize(&b->b_instr[i]);
3646 return size;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003647}
3648
Alexandre Vassalotti7b82b402009-07-21 04:30:03 +00003649/* Appends a pair to the end of the line number table, a_lnotab, representing
3650 the instruction's bytecode offset and line number. See
3651 Objects/lnotab_notes.txt for the description of the line number table. */
Tim Peters2a7f3842001-06-09 09:26:21 +00003652
Guido van Rossumf68d8e52001-04-14 17:55:09 +00003653static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003654assemble_lnotab(struct assembler *a, struct instr *i)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003655{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003656 int d_bytecode, d_lineno;
3657 int len;
3658 unsigned char *lnotab;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003659
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003660 d_bytecode = a->a_offset - a->a_lineno_off;
3661 d_lineno = i->i_lineno - a->a_lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003662
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003663 assert(d_bytecode >= 0);
3664 assert(d_lineno >= 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003665
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003666 if(d_bytecode == 0 && d_lineno == 0)
3667 return 1;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003668
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003669 if (d_bytecode > 255) {
3670 int j, nbytes, ncodes = d_bytecode / 255;
3671 nbytes = a->a_lnotab_off + 2 * ncodes;
3672 len = PyBytes_GET_SIZE(a->a_lnotab);
3673 if (nbytes >= len) {
3674 if ((len <= INT_MAX / 2) && (len * 2 < nbytes))
3675 len = nbytes;
3676 else if (len <= INT_MAX / 2)
3677 len *= 2;
3678 else {
3679 PyErr_NoMemory();
3680 return 0;
3681 }
3682 if (_PyBytes_Resize(&a->a_lnotab, len) < 0)
3683 return 0;
3684 }
3685 lnotab = (unsigned char *)
3686 PyBytes_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
3687 for (j = 0; j < ncodes; j++) {
3688 *lnotab++ = 255;
3689 *lnotab++ = 0;
3690 }
3691 d_bytecode -= ncodes * 255;
3692 a->a_lnotab_off += ncodes * 2;
3693 }
3694 assert(d_bytecode <= 255);
3695 if (d_lineno > 255) {
3696 int j, nbytes, ncodes = d_lineno / 255;
3697 nbytes = a->a_lnotab_off + 2 * ncodes;
3698 len = PyBytes_GET_SIZE(a->a_lnotab);
3699 if (nbytes >= len) {
3700 if ((len <= INT_MAX / 2) && len * 2 < nbytes)
3701 len = nbytes;
3702 else if (len <= INT_MAX / 2)
3703 len *= 2;
3704 else {
3705 PyErr_NoMemory();
3706 return 0;
3707 }
3708 if (_PyBytes_Resize(&a->a_lnotab, len) < 0)
3709 return 0;
3710 }
3711 lnotab = (unsigned char *)
3712 PyBytes_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
3713 *lnotab++ = d_bytecode;
3714 *lnotab++ = 255;
3715 d_bytecode = 0;
3716 for (j = 1; j < ncodes; j++) {
3717 *lnotab++ = 0;
3718 *lnotab++ = 255;
3719 }
3720 d_lineno -= ncodes * 255;
3721 a->a_lnotab_off += ncodes * 2;
3722 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003723
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003724 len = PyBytes_GET_SIZE(a->a_lnotab);
3725 if (a->a_lnotab_off + 2 >= len) {
3726 if (_PyBytes_Resize(&a->a_lnotab, len * 2) < 0)
3727 return 0;
3728 }
3729 lnotab = (unsigned char *)
3730 PyBytes_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
Tim Peters51e26512001-09-07 08:45:55 +00003731
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003732 a->a_lnotab_off += 2;
3733 if (d_bytecode) {
3734 *lnotab++ = d_bytecode;
3735 *lnotab++ = d_lineno;
3736 }
3737 else { /* First line of a block; def stmt, etc. */
3738 *lnotab++ = 0;
3739 *lnotab++ = d_lineno;
3740 }
3741 a->a_lineno = i->i_lineno;
3742 a->a_lineno_off = a->a_offset;
3743 return 1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003744}
3745
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003746/* assemble_emit()
3747 Extend the bytecode with a new instruction.
3748 Update lnotab if necessary.
Jeremy Hylton376e63d2003-08-28 14:42:14 +00003749*/
3750
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003751static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003752assemble_emit(struct assembler *a, struct instr *i)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003753{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003754 int size, arg = 0, ext = 0;
3755 Py_ssize_t len = PyBytes_GET_SIZE(a->a_bytecode);
3756 char *code;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003757
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003758 size = instrsize(i);
3759 if (i->i_hasarg) {
3760 arg = i->i_oparg;
3761 ext = arg >> 16;
3762 }
3763 if (i->i_lineno && !assemble_lnotab(a, i))
3764 return 0;
3765 if (a->a_offset + size >= len) {
3766 if (len > PY_SSIZE_T_MAX / 2)
3767 return 0;
3768 if (_PyBytes_Resize(&a->a_bytecode, len * 2) < 0)
3769 return 0;
3770 }
3771 code = PyBytes_AS_STRING(a->a_bytecode) + a->a_offset;
3772 a->a_offset += size;
3773 if (size == 6) {
3774 assert(i->i_hasarg);
3775 *code++ = (char)EXTENDED_ARG;
3776 *code++ = ext & 0xff;
3777 *code++ = ext >> 8;
3778 arg &= 0xffff;
3779 }
3780 *code++ = i->i_opcode;
3781 if (i->i_hasarg) {
3782 assert(size == 3 || size == 6);
3783 *code++ = arg & 0xff;
3784 *code++ = arg >> 8;
3785 }
3786 return 1;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00003787}
3788
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003789static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003790assemble_jump_offsets(struct assembler *a, struct compiler *c)
Anthony Baxterc2a5a632004-08-02 06:10:11 +00003791{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003792 basicblock *b;
3793 int bsize, totsize, extended_arg_count = 0, last_extended_arg_count;
3794 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003795
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003796 /* Compute the size of each block and fixup jump args.
3797 Replace block pointer with position in bytecode. */
3798 do {
3799 totsize = 0;
3800 for (i = a->a_nblocks - 1; i >= 0; i--) {
3801 b = a->a_postorder[i];
3802 bsize = blocksize(b);
3803 b->b_offset = totsize;
3804 totsize += bsize;
3805 }
3806 last_extended_arg_count = extended_arg_count;
3807 extended_arg_count = 0;
3808 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
3809 bsize = b->b_offset;
3810 for (i = 0; i < b->b_iused; i++) {
3811 struct instr *instr = &b->b_instr[i];
3812 /* Relative jumps are computed relative to
3813 the instruction pointer after fetching
3814 the jump instruction.
3815 */
3816 bsize += instrsize(instr);
3817 if (instr->i_jabs)
3818 instr->i_oparg = instr->i_target->b_offset;
3819 else if (instr->i_jrel) {
3820 int delta = instr->i_target->b_offset - bsize;
3821 instr->i_oparg = delta;
3822 }
3823 else
3824 continue;
3825 if (instr->i_oparg > 0xffff)
3826 extended_arg_count++;
3827 }
3828 }
Neal Norwitzf1d50682005-10-23 23:00:41 +00003829
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003830 /* XXX: This is an awful hack that could hurt performance, but
3831 on the bright side it should work until we come up
3832 with a better solution.
Neal Norwitzf1d50682005-10-23 23:00:41 +00003833
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003834 The issue is that in the first loop blocksize() is called
3835 which calls instrsize() which requires i_oparg be set
3836 appropriately. There is a bootstrap problem because
3837 i_oparg is calculated in the second loop above.
Neal Norwitzf1d50682005-10-23 23:00:41 +00003838
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003839 So we loop until we stop seeing new EXTENDED_ARGs.
3840 The only EXTENDED_ARGs that could be popping up are
3841 ones in jump instructions. So this should converge
3842 fairly quickly.
3843 */
3844 } while (last_extended_arg_count != extended_arg_count);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003845}
3846
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003847static PyObject *
3848dict_keys_inorder(PyObject *dict, int offset)
3849{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003850 PyObject *tuple, *k, *v;
3851 Py_ssize_t i, pos = 0, size = PyDict_Size(dict);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003852
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003853 tuple = PyTuple_New(size);
3854 if (tuple == NULL)
3855 return NULL;
3856 while (PyDict_Next(dict, &pos, &k, &v)) {
3857 i = PyLong_AS_LONG(v);
3858 /* The keys of the dictionary are tuples. (see compiler_add_o)
3859 The object we want is always first, though. */
3860 k = PyTuple_GET_ITEM(k, 0);
3861 Py_INCREF(k);
3862 assert((i - offset) < size);
3863 assert((i - offset) >= 0);
3864 PyTuple_SET_ITEM(tuple, i - offset, k);
3865 }
3866 return tuple;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003867}
3868
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003869static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003870compute_code_flags(struct compiler *c)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003871{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003872 PySTEntryObject *ste = c->u->u_ste;
3873 int flags = 0, n;
3874 if (ste->ste_type != ModuleBlock)
3875 flags |= CO_NEWLOCALS;
3876 if (ste->ste_type == FunctionBlock) {
3877 if (!ste->ste_unoptimized)
3878 flags |= CO_OPTIMIZED;
3879 if (ste->ste_nested)
3880 flags |= CO_NESTED;
3881 if (ste->ste_generator)
3882 flags |= CO_GENERATOR;
3883 if (ste->ste_varargs)
3884 flags |= CO_VARARGS;
3885 if (ste->ste_varkeywords)
3886 flags |= CO_VARKEYWORDS;
3887 }
Thomas Wouters5e9f1fa2006-02-28 20:02:27 +00003888
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003889 /* (Only) inherit compilerflags in PyCF_MASK */
3890 flags |= (c->c_flags->cf_flags & PyCF_MASK);
Thomas Wouters5e9f1fa2006-02-28 20:02:27 +00003891
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003892 n = PyDict_Size(c->u->u_freevars);
3893 if (n < 0)
3894 return -1;
3895 if (n == 0) {
3896 n = PyDict_Size(c->u->u_cellvars);
3897 if (n < 0)
3898 return -1;
3899 if (n == 0) {
3900 flags |= CO_NOFREE;
3901 }
3902 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00003903
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003904 return flags;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00003905}
3906
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003907static PyCodeObject *
3908makecode(struct compiler *c, struct assembler *a)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003909{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003910 PyObject *tmp;
3911 PyCodeObject *co = NULL;
3912 PyObject *consts = NULL;
3913 PyObject *names = NULL;
3914 PyObject *varnames = NULL;
3915 PyObject *filename = NULL;
3916 PyObject *name = NULL;
3917 PyObject *freevars = NULL;
3918 PyObject *cellvars = NULL;
3919 PyObject *bytecode = NULL;
3920 int nlocals, flags;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003921
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003922 tmp = dict_keys_inorder(c->u->u_consts, 0);
3923 if (!tmp)
3924 goto error;
3925 consts = PySequence_List(tmp); /* optimize_code requires a list */
3926 Py_DECREF(tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003927
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003928 names = dict_keys_inorder(c->u->u_names, 0);
3929 varnames = dict_keys_inorder(c->u->u_varnames, 0);
3930 if (!consts || !names || !varnames)
3931 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003932
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003933 cellvars = dict_keys_inorder(c->u->u_cellvars, 0);
3934 if (!cellvars)
3935 goto error;
3936 freevars = dict_keys_inorder(c->u->u_freevars, PyTuple_Size(cellvars));
3937 if (!freevars)
3938 goto error;
Victor Stinner0fe25a42010-06-17 23:08:50 +00003939 filename = PyUnicode_FromString(c->c_filename);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003940 if (!filename)
3941 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003942
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003943 nlocals = PyDict_Size(c->u->u_varnames);
3944 flags = compute_code_flags(c);
3945 if (flags < 0)
3946 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003947
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003948 bytecode = PyCode_Optimize(a->a_bytecode, consts, names, a->a_lnotab);
3949 if (!bytecode)
3950 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003951
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003952 tmp = PyList_AsTuple(consts); /* PyCode_New requires a tuple */
3953 if (!tmp)
3954 goto error;
3955 Py_DECREF(consts);
3956 consts = tmp;
3957
3958 co = PyCode_New(c->u->u_argcount, c->u->u_kwonlyargcount,
3959 nlocals, stackdepth(c), flags,
3960 bytecode, consts, names, varnames,
3961 freevars, cellvars,
3962 filename, c->u->u_name,
3963 c->u->u_firstlineno,
3964 a->a_lnotab);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003965 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003966 Py_XDECREF(consts);
3967 Py_XDECREF(names);
3968 Py_XDECREF(varnames);
3969 Py_XDECREF(filename);
3970 Py_XDECREF(name);
3971 Py_XDECREF(freevars);
3972 Py_XDECREF(cellvars);
3973 Py_XDECREF(bytecode);
3974 return co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003975}
3976
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003977
3978/* For debugging purposes only */
3979#if 0
3980static void
3981dump_instr(const struct instr *i)
3982{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003983 const char *jrel = i->i_jrel ? "jrel " : "";
3984 const char *jabs = i->i_jabs ? "jabs " : "";
3985 char arg[128];
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003986
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003987 *arg = '\0';
3988 if (i->i_hasarg)
3989 sprintf(arg, "arg: %d ", i->i_oparg);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003990
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003991 fprintf(stderr, "line: %d, opcode: %d %s%s%s\n",
3992 i->i_lineno, i->i_opcode, arg, jabs, jrel);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003993}
3994
3995static void
3996dump_basicblock(const basicblock *b)
3997{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003998 const char *seen = b->b_seen ? "seen " : "";
3999 const char *b_return = b->b_return ? "return " : "";
4000 fprintf(stderr, "used: %d, depth: %d, offset: %d %s%s\n",
4001 b->b_iused, b->b_startdepth, b->b_offset, seen, b_return);
4002 if (b->b_instr) {
4003 int i;
4004 for (i = 0; i < b->b_iused; i++) {
4005 fprintf(stderr, " [%02d] ", i);
4006 dump_instr(b->b_instr + i);
4007 }
4008 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004009}
4010#endif
4011
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004012static PyCodeObject *
4013assemble(struct compiler *c, int addNone)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004014{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004015 basicblock *b, *entryblock;
4016 struct assembler a;
4017 int i, j, nblocks;
4018 PyCodeObject *co = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004019
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004020 /* Make sure every block that falls off the end returns None.
4021 XXX NEXT_BLOCK() isn't quite right, because if the last
4022 block ends with a jump or return b_next shouldn't set.
4023 */
4024 if (!c->u->u_curblock->b_return) {
4025 NEXT_BLOCK(c);
4026 if (addNone)
4027 ADDOP_O(c, LOAD_CONST, Py_None, consts);
4028 ADDOP(c, RETURN_VALUE);
4029 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004030
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004031 nblocks = 0;
4032 entryblock = NULL;
4033 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
4034 nblocks++;
4035 entryblock = b;
4036 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004037
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004038 /* Set firstlineno if it wasn't explicitly set. */
4039 if (!c->u->u_firstlineno) {
4040 if (entryblock && entryblock->b_instr)
4041 c->u->u_firstlineno = entryblock->b_instr->i_lineno;
4042 else
4043 c->u->u_firstlineno = 1;
4044 }
4045 if (!assemble_init(&a, nblocks, c->u->u_firstlineno))
4046 goto error;
4047 dfs(c, entryblock, &a);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004048
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004049 /* Can't modify the bytecode after computing jump offsets. */
4050 assemble_jump_offsets(&a, c);
Tim Petersb6c3cea2001-06-26 03:36:28 +00004051
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004052 /* Emit code in reverse postorder from dfs. */
4053 for (i = a.a_nblocks - 1; i >= 0; i--) {
4054 b = a.a_postorder[i];
4055 for (j = 0; j < b->b_iused; j++)
4056 if (!assemble_emit(&a, &b->b_instr[j]))
4057 goto error;
4058 }
Tim Petersb6c3cea2001-06-26 03:36:28 +00004059
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004060 if (_PyBytes_Resize(&a.a_lnotab, a.a_lnotab_off) < 0)
4061 goto error;
4062 if (_PyBytes_Resize(&a.a_bytecode, a.a_offset) < 0)
4063 goto error;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004064
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004065 co = makecode(c, &a);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00004066 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004067 assemble_free(&a);
4068 return co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004069}