blob: 12210e1296ff4cd2866f8a02752f53d78f092d91 [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
Jeremy Hyltone9357b22006-03-01 15:47:05 +00008 * 2. Builds a symbol table. See symtable.c.
Neal Norwitzf733a012006-10-29 18:30:10 +00009 * 3. Generate code for basic blocks. See compiler_mod() in this file.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000010 * 4. Assemble the basic blocks into final code. See assemble() in
Jeremy Hylton819de6c2007-02-27 16:13:23 +000011 * this file.
Neal Norwitzf733a012006-10-29 18:30:10 +000012 * 5. Optimize the byte code (peephole optimizations). See peephole.c
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000013 *
14 * Note that compiler_mod() suggests module, but the module ast type
15 * (mod_ty) has cases for expressions and interactive statements.
Nick Coghlan944d3eb2005-11-16 12:46:55 +000016 *
Jeremy Hyltone9357b22006-03-01 15:47:05 +000017 * CAUTION: The VISIT_* macros abort the current function when they
18 * encounter a problem. So don't invoke them when there is memory
19 * which needs to be released. Code blocks are OK, as the compiler
Neal Norwitzf733a012006-10-29 18:30:10 +000020 * structure takes care of releasing those. Use the arena to manage
21 * objects.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000022 */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000023
Guido van Rossum79f25d91997-04-29 20:08:16 +000024#include "Python.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000025
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000026#include "Python-ast.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000027#include "node.h"
Neal Norwitzadb69fc2005-12-17 20:54:49 +000028#include "pyarena.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000029#include "ast.h"
30#include "code.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000031#include "compile.h"
Jeremy Hylton4b38da62001-02-02 18:19:15 +000032#include "symtable.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000033#include "opcode.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000034
Guido van Rossum8e793d91997-03-03 19:13:14 +000035int Py_OptimizeFlag = 0;
36
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000037#define DEFAULT_BLOCK_SIZE 16
38#define DEFAULT_BLOCKS 8
39#define DEFAULT_CODE_SIZE 128
40#define DEFAULT_LNOTAB_SIZE 16
Jeremy Hylton29906ee2001-02-27 04:23:34 +000041
Alexandre Vassalottib6465472010-01-11 22:36:12 +000042#define COMP_GENEXP 0
43#define COMP_SETCOMP 1
44#define COMP_DICTCOMP 2
45
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000046struct instr {
Neal Norwitz08b401f2006-01-07 21:24:09 +000047 unsigned i_jabs : 1;
48 unsigned i_jrel : 1;
49 unsigned i_hasarg : 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000050 unsigned char i_opcode;
51 int i_oparg;
52 struct basicblock_ *i_target; /* target block (if jump instruction) */
53 int i_lineno;
Guido van Rossum3f5da241990-12-20 15:06:42 +000054};
55
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000056typedef struct basicblock_ {
Jeremy Hylton12603c42006-04-01 16:18:02 +000057 /* Each basicblock in a compilation unit is linked via b_list in the
58 reverse order that the block are allocated. b_list points to the next
59 block, not to be confused with b_next, which is next by control flow. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000060 struct basicblock_ *b_list;
61 /* number of instructions used */
62 int b_iused;
63 /* length of instruction array (b_instr) */
64 int b_ialloc;
65 /* pointer to an array of instructions, initially NULL */
66 struct instr *b_instr;
67 /* If b_next is non-NULL, it is a pointer to the next
68 block reached by normal control flow. */
69 struct basicblock_ *b_next;
70 /* b_seen is used to perform a DFS of basicblocks. */
Neal Norwitz08b401f2006-01-07 21:24:09 +000071 unsigned b_seen : 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000072 /* b_return is true if a RETURN_VALUE opcode is inserted. */
Neal Norwitz08b401f2006-01-07 21:24:09 +000073 unsigned b_return : 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000074 /* depth of stack upon entry of block, computed by stackdepth() */
75 int b_startdepth;
76 /* instruction offset for block, computed by assemble_jump_offsets() */
Jeremy Hyltone9357b22006-03-01 15:47:05 +000077 int b_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000078} basicblock;
79
80/* fblockinfo tracks the current frame block.
81
Jeremy Hyltone9357b22006-03-01 15:47:05 +000082A frame block is used to handle loops, try/except, and try/finally.
83It's called a frame block to distinguish it from a basic block in the
84compiler IR.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000085*/
86
87enum fblocktype { LOOP, EXCEPT, FINALLY_TRY, FINALLY_END };
88
89struct fblockinfo {
Jeremy Hyltone9357b22006-03-01 15:47:05 +000090 enum fblocktype fb_type;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000091 basicblock *fb_block;
92};
93
94/* The following items change on entry and exit of code blocks.
95 They must be saved and restored when returning to a block.
96*/
97struct compiler_unit {
98 PySTEntryObject *u_ste;
99
100 PyObject *u_name;
101 /* The following fields are dicts that map objects to
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000102 the index of them in co_XXX. The index is used as
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000103 the argument for opcodes that refer to those collections.
104 */
105 PyObject *u_consts; /* all constants */
106 PyObject *u_names; /* all names */
107 PyObject *u_varnames; /* local variables */
108 PyObject *u_cellvars; /* cell variables */
109 PyObject *u_freevars; /* free variables */
110
111 PyObject *u_private; /* for private name mangling */
112
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000113 int u_argcount; /* number of arguments for block */
Neal Norwitzf733a012006-10-29 18:30:10 +0000114 /* Pointer to the most recently allocated block. By following b_list
115 members, you can reach all early allocated blocks. */
Jeremy Hylton12603c42006-04-01 16:18:02 +0000116 basicblock *u_blocks;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000117 basicblock *u_curblock; /* pointer to current block */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000118
119 int u_nfblocks;
120 struct fblockinfo u_fblock[CO_MAXBLOCKS];
121
122 int u_firstlineno; /* the first lineno of the block */
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000123 int u_lineno; /* the lineno for the current stmt */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000124 bool u_lineno_set; /* boolean to indicate whether instr
125 has been generated with current lineno */
126};
127
128/* This struct captures the global state of a compilation.
129
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000130The u pointer points to the current compilation unit, while units
131for enclosing blocks are stored in c_stack. The u and c_stack are
132managed by compiler_enter_scope() and compiler_exit_scope().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000133*/
134
135struct compiler {
136 const char *c_filename;
137 struct symtable *c_st;
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000138 PyFutureFeatures *c_future; /* pointer to module's __future__ */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000139 PyCompilerFlags *c_flags;
140
Neal Norwitz4ffedad2006-08-04 04:58:47 +0000141 int c_interactive; /* true if in interactive mode */
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000142 int c_nestlevel;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000143
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000144 struct compiler_unit *u; /* compiler state for current block */
145 PyObject *c_stack; /* Python list holding compiler_unit ptrs */
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000146 PyArena *c_arena; /* pointer to memory allocation arena */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000147};
148
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000149static int compiler_enter_scope(struct compiler *, identifier, void *, int);
150static void compiler_free(struct compiler *);
151static basicblock *compiler_new_block(struct compiler *);
152static int compiler_next_instr(struct compiler *, basicblock *);
153static int compiler_addop(struct compiler *, int);
154static int compiler_addop_o(struct compiler *, int, PyObject *, PyObject *);
155static int compiler_addop_i(struct compiler *, int, int);
156static int compiler_addop_j(struct compiler *, int, basicblock *, int);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000157static basicblock *compiler_use_new_block(struct compiler *);
158static int compiler_error(struct compiler *, const char *);
159static int compiler_nameop(struct compiler *, identifier, expr_context_ty);
160
161static PyCodeObject *compiler_mod(struct compiler *, mod_ty);
162static int compiler_visit_stmt(struct compiler *, stmt_ty);
163static int compiler_visit_keyword(struct compiler *, keyword_ty);
164static int compiler_visit_expr(struct compiler *, expr_ty);
165static int compiler_augassign(struct compiler *, stmt_ty);
166static int compiler_visit_slice(struct compiler *, slice_ty,
167 expr_context_ty);
168
169static int compiler_push_fblock(struct compiler *, enum fblocktype,
170 basicblock *);
171static void compiler_pop_fblock(struct compiler *, enum fblocktype,
172 basicblock *);
Jeremy Hylton82271f12006-10-04 02:24:52 +0000173/* Returns true if there is a loop on the fblock stack. */
174static int compiler_in_loop(struct compiler *);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000175
176static int inplace_binop(struct compiler *, operator_ty);
177static int expr_constant(expr_ty e);
178
Guido van Rossumc2e20742006-02-27 22:32:47 +0000179static int compiler_with(struct compiler *, stmt_ty);
180
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000181static PyCodeObject *assemble(struct compiler *, int addNone);
182static PyObject *__doc__;
183
184PyObject *
Anthony Baxter7b782b62006-04-11 12:01:56 +0000185_Py_Mangle(PyObject *privateobj, PyObject *ident)
Michael W. Hudson60934622004-08-12 17:56:29 +0000186{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000187 /* Name mangling: __private becomes _classname__private.
188 This is independent from how the name is used. */
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000189 const char *p, *name = PyString_AsString(ident);
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000190 char *buffer;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000191 size_t nlen, plen;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000192 if (privateobj == NULL || !PyString_Check(privateobj) ||
Neal Norwitz84167d02006-08-12 01:45:47 +0000193 name == NULL || name[0] != '_' || name[1] != '_') {
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000194 Py_INCREF(ident);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000195 return ident;
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000196 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000197 p = PyString_AsString(privateobj);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000198 nlen = strlen(name);
Jeremy Hylton819de6c2007-02-27 16:13:23 +0000199 /* Don't mangle __id__ or names with dots.
Jeremy Hylton37075c52007-02-27 01:01:59 +0000200
Jeremy Hylton819de6c2007-02-27 16:13:23 +0000201 The only time a name with a dot can occur is when
202 we are compiling an import statement that has a
203 package name.
Jeremy Hylton37075c52007-02-27 01:01:59 +0000204
Jeremy Hylton819de6c2007-02-27 16:13:23 +0000205 TODO(jhylton): Decide whether we want to support
206 mangling of the module name, e.g. __M.X.
207 */
Jeremy Hylton37075c52007-02-27 01:01:59 +0000208 if ((name[nlen-1] == '_' && name[nlen-2] == '_')
Jeremy Hylton819de6c2007-02-27 16:13:23 +0000209 || strchr(name, '.')) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000210 Py_INCREF(ident);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000211 return ident; /* Don't mangle __whatever__ */
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000212 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000213 /* Strip leading underscores from class name */
214 while (*p == '_')
215 p++;
216 if (*p == '\0') {
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000217 Py_INCREF(ident);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000218 return ident; /* Don't mangle if class is just underscores */
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000219 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000220 plen = strlen(p);
Gregory P. Smith9d534572008-06-11 07:41:16 +0000221
222 assert(1 <= PY_SSIZE_T_MAX - nlen);
223 assert(1 + nlen <= PY_SSIZE_T_MAX - plen);
224
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000225 ident = PyString_FromStringAndSize(NULL, 1 + nlen + plen);
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000226 if (!ident)
227 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000228 /* ident = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000229 buffer = PyString_AS_STRING(ident);
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000230 buffer[0] = '_';
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000231 strncpy(buffer+1, p, plen);
232 strcpy(buffer+1+plen, name);
233 return ident;
Michael W. Hudson60934622004-08-12 17:56:29 +0000234}
235
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000236static int
237compiler_init(struct compiler *c)
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000238{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000239 memset(c, 0, sizeof(struct compiler));
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000240
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000241 c->c_stack = PyList_New(0);
242 if (!c->c_stack)
243 return 0;
244
245 return 1;
246}
247
248PyCodeObject *
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000249PyAST_Compile(mod_ty mod, const char *filename, PyCompilerFlags *flags,
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000250 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000251{
252 struct compiler c;
253 PyCodeObject *co = NULL;
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000254 PyCompilerFlags local_flags;
255 int merged;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000256
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000257 if (!__doc__) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000258 __doc__ = PyString_InternFromString("__doc__");
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000259 if (!__doc__)
260 return NULL;
261 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000262
263 if (!compiler_init(&c))
Thomas Woutersbfe51ea2006-02-27 22:48:55 +0000264 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000265 c.c_filename = filename;
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000266 c.c_arena = arena;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000267 c.c_future = PyFuture_FromAST(mod, filename);
268 if (c.c_future == NULL)
Thomas Wouters1175c432006-02-27 22:49:54 +0000269 goto finally;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000270 if (!flags) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000271 local_flags.cf_flags = 0;
272 flags = &local_flags;
273 }
274 merged = c.c_future->ff_features | flags->cf_flags;
275 c.c_future->ff_features = merged;
276 flags->cf_flags = merged;
277 c.c_flags = flags;
278 c.c_nestlevel = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000279
280 c.c_st = PySymtable_Build(mod, filename, c.c_future);
281 if (c.c_st == NULL) {
282 if (!PyErr_Occurred())
283 PyErr_SetString(PyExc_SystemError, "no symtable");
Thomas Wouters1175c432006-02-27 22:49:54 +0000284 goto finally;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000285 }
286
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000287 co = compiler_mod(&c, mod);
288
Thomas Wouters1175c432006-02-27 22:49:54 +0000289 finally:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000290 compiler_free(&c);
Thomas Woutersbfe51ea2006-02-27 22:48:55 +0000291 assert(co || PyErr_Occurred());
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000292 return co;
293}
294
295PyCodeObject *
296PyNode_Compile(struct _node *n, const char *filename)
297{
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000298 PyCodeObject *co = NULL;
Neal Norwitzb59d08c2006-07-22 16:20:49 +0000299 mod_ty mod;
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000300 PyArena *arena = PyArena_New();
Neal Norwitzb59d08c2006-07-22 16:20:49 +0000301 if (!arena)
302 return NULL;
303 mod = PyAST_FromNode(n, NULL, filename, arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000304 if (mod)
305 co = PyAST_Compile(mod, filename, NULL, arena);
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000306 PyArena_Free(arena);
Raymond Hettinger37a724d2003-09-15 21:43:16 +0000307 return co;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000308}
309
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000310static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000311compiler_free(struct compiler *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000312{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000313 if (c->c_st)
314 PySymtable_Free(c->c_st);
315 if (c->c_future)
Neal Norwitz14bc4e42006-04-10 06:57:06 +0000316 PyObject_Free(c->c_future);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000317 Py_DECREF(c->c_stack);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000318}
319
Guido van Rossum79f25d91997-04-29 20:08:16 +0000320static PyObject *
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000321list2dict(PyObject *list)
Guido van Rossum2dff9911992-09-03 20:50:59 +0000322{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000323 Py_ssize_t i, n;
Georg Brandl5c170fd2006-03-17 19:03:25 +0000324 PyObject *v, *k;
325 PyObject *dict = PyDict_New();
326 if (!dict) return NULL;
Guido van Rossumd076c731998-10-07 19:42:25 +0000327
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000328 n = PyList_Size(list);
329 for (i = 0; i < n; i++) {
330 v = PyInt_FromLong(i);
331 if (!v) {
332 Py_DECREF(dict);
333 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000334 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000335 k = PyList_GET_ITEM(list, i);
Georg Brandl7784f122006-05-26 20:04:44 +0000336 k = PyTuple_Pack(2, k, k->ob_type);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000337 if (k == NULL || PyDict_SetItem(dict, k, v) < 0) {
338 Py_XDECREF(k);
339 Py_DECREF(v);
340 Py_DECREF(dict);
341 return NULL;
342 }
Neal Norwitz4737b232005-11-19 23:58:29 +0000343 Py_DECREF(k);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000344 Py_DECREF(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000345 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000346 return dict;
347}
348
349/* Return new dict containing names from src that match scope(s).
350
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000351src is a symbol table dictionary. If the scope of a name matches
352either scope_type or flag is set, insert it into the new dict. The
353values are integers, starting at offset and increasing by one for
354each key.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000355*/
356
357static PyObject *
358dictbytype(PyObject *src, int scope_type, int flag, int offset)
359{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000360 Py_ssize_t pos = 0, i = offset, scope;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000361 PyObject *k, *v, *dest = PyDict_New();
362
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000363 assert(offset >= 0);
364 if (dest == NULL)
365 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000366
367 while (PyDict_Next(src, &pos, &k, &v)) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000368 /* XXX this should probably be a macro in symtable.h */
369 assert(PyInt_Check(v));
370 scope = (PyInt_AS_LONG(v) >> SCOPE_OFF) & SCOPE_MASK;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000371
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000372 if (scope == scope_type || PyInt_AS_LONG(v) & flag) {
373 PyObject *tuple, *item = PyInt_FromLong(i);
374 if (item == NULL) {
375 Py_DECREF(dest);
376 return NULL;
377 }
378 i++;
Georg Brandl7784f122006-05-26 20:04:44 +0000379 tuple = PyTuple_Pack(2, k, k->ob_type);
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000380 if (!tuple || PyDict_SetItem(dest, tuple, item) < 0) {
381 Py_DECREF(item);
382 Py_DECREF(dest);
383 Py_XDECREF(tuple);
384 return NULL;
385 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000386 Py_DECREF(item);
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000387 Py_DECREF(tuple);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000388 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000389 }
390 return dest;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000391}
392
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000393static void
394compiler_unit_check(struct compiler_unit *u)
395{
396 basicblock *block;
397 for (block = u->u_blocks; block != NULL; block = block->b_list) {
Brett Cannona6c41bc2008-02-07 07:47:31 +0000398 assert((void *)block != (void *)0xcbcbcbcb);
399 assert((void *)block != (void *)0xfbfbfbfb);
400 assert((void *)block != (void *)0xdbdbdbdb);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000401 if (block->b_instr != NULL) {
402 assert(block->b_ialloc > 0);
403 assert(block->b_iused > 0);
404 assert(block->b_ialloc >= block->b_iused);
405 }
406 else {
407 assert (block->b_iused == 0);
408 assert (block->b_ialloc == 0);
409 }
410 }
411}
412
413static void
414compiler_unit_free(struct compiler_unit *u)
415{
416 basicblock *b, *next;
417
418 compiler_unit_check(u);
419 b = u->u_blocks;
420 while (b != NULL) {
421 if (b->b_instr)
422 PyObject_Free((void *)b->b_instr);
423 next = b->b_list;
424 PyObject_Free((void *)b);
425 b = next;
426 }
Neal Norwitzb59d08c2006-07-22 16:20:49 +0000427 Py_CLEAR(u->u_ste);
428 Py_CLEAR(u->u_name);
429 Py_CLEAR(u->u_consts);
430 Py_CLEAR(u->u_names);
431 Py_CLEAR(u->u_varnames);
432 Py_CLEAR(u->u_freevars);
433 Py_CLEAR(u->u_cellvars);
434 Py_CLEAR(u->u_private);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000435 PyObject_Free(u);
436}
437
438static int
439compiler_enter_scope(struct compiler *c, identifier name, void *key,
440 int lineno)
441{
442 struct compiler_unit *u;
443
Anthony Baxter7b782b62006-04-11 12:01:56 +0000444 u = (struct compiler_unit *)PyObject_Malloc(sizeof(
Jeremy Hylton819de6c2007-02-27 16:13:23 +0000445 struct compiler_unit));
Neal Norwitz87b801c2005-12-18 04:42:47 +0000446 if (!u) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000447 PyErr_NoMemory();
448 return 0;
Neal Norwitz87b801c2005-12-18 04:42:47 +0000449 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000450 memset(u, 0, sizeof(struct compiler_unit));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000451 u->u_argcount = 0;
452 u->u_ste = PySymtable_Lookup(c->c_st, key);
453 if (!u->u_ste) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000454 compiler_unit_free(u);
455 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000456 }
457 Py_INCREF(name);
458 u->u_name = name;
459 u->u_varnames = list2dict(u->u_ste->ste_varnames);
460 u->u_cellvars = dictbytype(u->u_ste->ste_symbols, CELL, 0, 0);
Neal Norwitzd12bd012006-07-21 07:59:47 +0000461 if (!u->u_varnames || !u->u_cellvars) {
462 compiler_unit_free(u);
463 return 0;
464 }
465
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000466 u->u_freevars = dictbytype(u->u_ste->ste_symbols, FREE, DEF_FREE_CLASS,
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000467 PyDict_Size(u->u_cellvars));
Neal Norwitzd12bd012006-07-21 07:59:47 +0000468 if (!u->u_freevars) {
469 compiler_unit_free(u);
470 return 0;
471 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000472
473 u->u_blocks = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000474 u->u_nfblocks = 0;
475 u->u_firstlineno = lineno;
476 u->u_lineno = 0;
477 u->u_lineno_set = false;
478 u->u_consts = PyDict_New();
479 if (!u->u_consts) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000480 compiler_unit_free(u);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000481 return 0;
482 }
483 u->u_names = PyDict_New();
484 if (!u->u_names) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000485 compiler_unit_free(u);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000486 return 0;
487 }
488
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000489 u->u_private = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000490
491 /* Push the old compiler_unit on the stack. */
492 if (c->u) {
493 PyObject *wrapper = PyCObject_FromVoidPtr(c->u, NULL);
Neal Norwitzb59d08c2006-07-22 16:20:49 +0000494 if (!wrapper || PyList_Append(c->c_stack, wrapper) < 0) {
495 Py_XDECREF(wrapper);
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000496 compiler_unit_free(u);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000497 return 0;
498 }
499 Py_DECREF(wrapper);
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000500 u->u_private = c->u->u_private;
501 Py_XINCREF(u->u_private);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000502 }
503 c->u = u;
504
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000505 c->c_nestlevel++;
Martin v. Löwis94962612006-01-02 21:15:05 +0000506 if (compiler_use_new_block(c) == NULL)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000507 return 0;
508
509 return 1;
510}
511
Neil Schemenauerc396d9e2005-10-25 06:30:14 +0000512static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000513compiler_exit_scope(struct compiler *c)
514{
515 int n;
516 PyObject *wrapper;
517
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000518 c->c_nestlevel--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000519 compiler_unit_free(c->u);
520 /* Restore c->u to the parent unit. */
521 n = PyList_GET_SIZE(c->c_stack) - 1;
522 if (n >= 0) {
523 wrapper = PyList_GET_ITEM(c->c_stack, n);
524 c->u = (struct compiler_unit *)PyCObject_AsVoidPtr(wrapper);
Neal Norwitz87557cd2006-08-21 18:01:30 +0000525 assert(c->u);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +0000526 /* we are deleting from a list so this really shouldn't fail */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000527 if (PySequence_DelItem(c->c_stack, n) < 0)
Neil Schemenauerc396d9e2005-10-25 06:30:14 +0000528 Py_FatalError("compiler_exit_scope()");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000529 compiler_unit_check(c->u);
530 }
531 else
532 c->u = NULL;
533
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000534}
535
536/* Allocate a new block and return a pointer to it.
537 Returns NULL on error.
538*/
539
540static basicblock *
541compiler_new_block(struct compiler *c)
542{
543 basicblock *b;
544 struct compiler_unit *u;
545
546 u = c->u;
547 b = (basicblock *)PyObject_Malloc(sizeof(basicblock));
Neal Norwitz87b801c2005-12-18 04:42:47 +0000548 if (b == NULL) {
549 PyErr_NoMemory();
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000550 return NULL;
Neal Norwitz87b801c2005-12-18 04:42:47 +0000551 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000552 memset((void *)b, 0, sizeof(basicblock));
Neal Norwitzf733a012006-10-29 18:30:10 +0000553 /* Extend the singly linked list of blocks with new block. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000554 b->b_list = u->u_blocks;
555 u->u_blocks = b;
556 return b;
557}
558
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000559static basicblock *
560compiler_use_new_block(struct compiler *c)
561{
562 basicblock *block = compiler_new_block(c);
563 if (block == NULL)
564 return NULL;
565 c->u->u_curblock = block;
566 return block;
567}
568
569static basicblock *
570compiler_next_block(struct compiler *c)
571{
572 basicblock *block = compiler_new_block(c);
573 if (block == NULL)
574 return NULL;
575 c->u->u_curblock->b_next = block;
576 c->u->u_curblock = block;
577 return block;
578}
579
580static basicblock *
581compiler_use_next_block(struct compiler *c, basicblock *block)
582{
583 assert(block != NULL);
584 c->u->u_curblock->b_next = block;
585 c->u->u_curblock = block;
586 return block;
587}
588
589/* Returns the offset of the next instruction in the current block's
590 b_instr array. Resizes the b_instr as necessary.
591 Returns -1 on failure.
Neal Norwitzf733a012006-10-29 18:30:10 +0000592*/
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000593
594static int
595compiler_next_instr(struct compiler *c, basicblock *b)
596{
597 assert(b != NULL);
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000598 if (b->b_instr == NULL) {
Anthony Baxter7b782b62006-04-11 12:01:56 +0000599 b->b_instr = (struct instr *)PyObject_Malloc(
Jeremy Hylton819de6c2007-02-27 16:13:23 +0000600 sizeof(struct instr) * DEFAULT_BLOCK_SIZE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000601 if (b->b_instr == NULL) {
602 PyErr_NoMemory();
603 return -1;
604 }
605 b->b_ialloc = DEFAULT_BLOCK_SIZE;
606 memset((char *)b->b_instr, 0,
607 sizeof(struct instr) * DEFAULT_BLOCK_SIZE);
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000608 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000609 else if (b->b_iused == b->b_ialloc) {
Neal Norwitzb59d08c2006-07-22 16:20:49 +0000610 struct instr *tmp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000611 size_t oldsize, newsize;
612 oldsize = b->b_ialloc * sizeof(struct instr);
613 newsize = oldsize << 1;
Gregory P. Smith9d534572008-06-11 07:41:16 +0000614
615 if (oldsize > (PY_SIZE_MAX >> 1)) {
616 PyErr_NoMemory();
617 return -1;
618 }
619
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000620 if (newsize == 0) {
621 PyErr_NoMemory();
622 return -1;
623 }
624 b->b_ialloc <<= 1;
Neal Norwitzb59d08c2006-07-22 16:20:49 +0000625 tmp = (struct instr *)PyObject_Realloc(
Jeremy Hylton819de6c2007-02-27 16:13:23 +0000626 (void *)b->b_instr, newsize);
Neal Norwitzb59d08c2006-07-22 16:20:49 +0000627 if (tmp == NULL) {
628 PyErr_NoMemory();
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000629 return -1;
Neal Norwitzb59d08c2006-07-22 16:20:49 +0000630 }
631 b->b_instr = tmp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000632 memset((char *)b->b_instr + oldsize, 0, newsize - oldsize);
633 }
634 return b->b_iused++;
635}
636
Amaury Forgeot d'Arc6fd03bb2008-02-04 21:45:05 +0000637/* Set the i_lineno member of the instruction at offset off if the
638 line number for the current expression/statement has not
Jeremy Hylton12603c42006-04-01 16:18:02 +0000639 already been set. If it has been set, the call has no effect.
640
Amaury Forgeot d'Arc6fd03bb2008-02-04 21:45:05 +0000641 The line number is reset in the following cases:
642 - when entering a new scope
643 - on each statement
644 - on each expression that start a new line
645 - before the "except" clause
646 - before the "for" and "while" expressions
Neal Norwitzf733a012006-10-29 18:30:10 +0000647*/
Jeremy Hylton12603c42006-04-01 16:18:02 +0000648
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000649static void
650compiler_set_lineno(struct compiler *c, int off)
651{
652 basicblock *b;
653 if (c->u->u_lineno_set)
654 return;
655 c->u->u_lineno_set = true;
656 b = c->u->u_curblock;
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000657 b->b_instr[off].i_lineno = c->u->u_lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000658}
659
660static int
661opcode_stack_effect(int opcode, int oparg)
662{
663 switch (opcode) {
664 case POP_TOP:
665 return -1;
666 case ROT_TWO:
667 case ROT_THREE:
668 return 0;
669 case DUP_TOP:
670 return 1;
671 case ROT_FOUR:
672 return 0;
673
674 case UNARY_POSITIVE:
675 case UNARY_NEGATIVE:
676 case UNARY_NOT:
677 case UNARY_CONVERT:
678 case UNARY_INVERT:
679 return 0;
680
Alexandre Vassalottib6465472010-01-11 22:36:12 +0000681 case SET_ADD:
Neal Norwitz10be2ea2006-03-03 20:29:11 +0000682 case LIST_APPEND:
Antoine Pitroud0c35152008-12-17 00:38:28 +0000683 return -1;
Neal Norwitz10be2ea2006-03-03 20:29:11 +0000684
Alexandre Vassalottib6465472010-01-11 22:36:12 +0000685 case MAP_ADD:
686 return -2;
687
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000688 case BINARY_POWER:
689 case BINARY_MULTIPLY:
690 case BINARY_DIVIDE:
691 case BINARY_MODULO:
692 case BINARY_ADD:
693 case BINARY_SUBTRACT:
694 case BINARY_SUBSCR:
695 case BINARY_FLOOR_DIVIDE:
696 case BINARY_TRUE_DIVIDE:
697 return -1;
698 case INPLACE_FLOOR_DIVIDE:
699 case INPLACE_TRUE_DIVIDE:
700 return -1;
701
702 case SLICE+0:
Neil Schemenauer7fdd1cb2009-10-14 17:17:14 +0000703 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000704 case SLICE+1:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000705 return -1;
Neil Schemenauer7fdd1cb2009-10-14 17:17:14 +0000706 case SLICE+2:
707 return -1;
708 case SLICE+3:
709 return -2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000710
711 case STORE_SLICE+0:
712 return -2;
713 case STORE_SLICE+1:
714 return -3;
715 case STORE_SLICE+2:
716 return -3;
717 case STORE_SLICE+3:
718 return -4;
719
720 case DELETE_SLICE+0:
721 return -1;
722 case DELETE_SLICE+1:
723 return -2;
724 case DELETE_SLICE+2:
725 return -2;
726 case DELETE_SLICE+3:
727 return -3;
728
729 case INPLACE_ADD:
730 case INPLACE_SUBTRACT:
731 case INPLACE_MULTIPLY:
732 case INPLACE_DIVIDE:
733 case INPLACE_MODULO:
734 return -1;
735 case STORE_SUBSCR:
736 return -3;
Raymond Hettingereffde122007-12-18 18:26:18 +0000737 case STORE_MAP:
738 return -2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000739 case DELETE_SUBSCR:
740 return -2;
741
742 case BINARY_LSHIFT:
743 case BINARY_RSHIFT:
744 case BINARY_AND:
745 case BINARY_XOR:
746 case BINARY_OR:
747 return -1;
748 case INPLACE_POWER:
749 return -1;
750 case GET_ITER:
751 return 0;
752
753 case PRINT_EXPR:
754 return -1;
755 case PRINT_ITEM:
756 return -1;
757 case PRINT_NEWLINE:
758 return 0;
759 case PRINT_ITEM_TO:
760 return -2;
761 case PRINT_NEWLINE_TO:
762 return -1;
763 case INPLACE_LSHIFT:
764 case INPLACE_RSHIFT:
765 case INPLACE_AND:
766 case INPLACE_XOR:
767 case INPLACE_OR:
768 return -1;
769 case BREAK_LOOP:
770 return 0;
Benjamin Peterson1880d8b2009-05-25 13:13:44 +0000771 case SETUP_WITH:
Benjamin Peterson49a6b0e2009-05-25 20:12:57 +0000772 return 4;
Guido van Rossumc2e20742006-02-27 22:32:47 +0000773 case WITH_CLEANUP:
Guido van Rossumf6694362006-03-10 02:28:35 +0000774 return -1; /* XXX Sometimes more */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000775 case LOAD_LOCALS:
776 return 1;
777 case RETURN_VALUE:
778 return -1;
779 case IMPORT_STAR:
780 return -1;
781 case EXEC_STMT:
782 return -3;
783 case YIELD_VALUE:
784 return 0;
785
786 case POP_BLOCK:
787 return 0;
788 case END_FINALLY:
Neil Schemenauer7fdd1cb2009-10-14 17:17:14 +0000789 return -3; /* or -1 or -2 if no exception occurred or
790 return/break/continue */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000791 case BUILD_CLASS:
792 return -2;
793
794 case STORE_NAME:
795 return -1;
796 case DELETE_NAME:
797 return 0;
798 case UNPACK_SEQUENCE:
799 return oparg-1;
800 case FOR_ITER:
Neil Schemenauer7fdd1cb2009-10-14 17:17:14 +0000801 return 1; /* or -1, at end of iterator */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000802
803 case STORE_ATTR:
804 return -2;
805 case DELETE_ATTR:
806 return -1;
807 case STORE_GLOBAL:
808 return -1;
809 case DELETE_GLOBAL:
810 return 0;
811 case DUP_TOPX:
812 return oparg;
813 case LOAD_CONST:
814 return 1;
815 case LOAD_NAME:
816 return 1;
817 case BUILD_TUPLE:
818 case BUILD_LIST:
Alexandre Vassalottiee936a22010-01-09 23:35:54 +0000819 case BUILD_SET:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000820 return 1-oparg;
821 case BUILD_MAP:
822 return 1;
823 case LOAD_ATTR:
824 return 0;
825 case COMPARE_OP:
826 return -1;
827 case IMPORT_NAME:
Neil Schemenauer7fdd1cb2009-10-14 17:17:14 +0000828 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000829 case IMPORT_FROM:
830 return 1;
831
832 case JUMP_FORWARD:
Jeffrey Yasskin68d68522009-02-28 19:03:21 +0000833 case JUMP_IF_TRUE_OR_POP: /* -1 if jump not taken */
834 case JUMP_IF_FALSE_OR_POP: /* "" */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000835 case JUMP_ABSOLUTE:
836 return 0;
837
Jeffrey Yasskin68d68522009-02-28 19:03:21 +0000838 case POP_JUMP_IF_FALSE:
839 case POP_JUMP_IF_TRUE:
840 return -1;
841
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000842 case LOAD_GLOBAL:
843 return 1;
844
845 case CONTINUE_LOOP:
846 return 0;
847 case SETUP_LOOP:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000848 case SETUP_EXCEPT:
849 case SETUP_FINALLY:
Neil Schemenauer7fdd1cb2009-10-14 17:17:14 +0000850 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000851
852 case LOAD_FAST:
853 return 1;
854 case STORE_FAST:
855 return -1;
856 case DELETE_FAST:
857 return 0;
858
859 case RAISE_VARARGS:
860 return -oparg;
861#define NARGS(o) (((o) % 256) + 2*((o) / 256))
862 case CALL_FUNCTION:
863 return -NARGS(oparg);
864 case CALL_FUNCTION_VAR:
865 case CALL_FUNCTION_KW:
866 return -NARGS(oparg)-1;
867 case CALL_FUNCTION_VAR_KW:
868 return -NARGS(oparg)-2;
869#undef NARGS
870 case MAKE_FUNCTION:
871 return -oparg;
872 case BUILD_SLICE:
873 if (oparg == 3)
874 return -2;
875 else
876 return -1;
877
878 case MAKE_CLOSURE:
Neil Schemenauer7fdd1cb2009-10-14 17:17:14 +0000879 return -oparg-1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000880 case LOAD_CLOSURE:
881 return 1;
882 case LOAD_DEREF:
883 return 1;
884 case STORE_DEREF:
885 return -1;
886 default:
887 fprintf(stderr, "opcode = %d\n", opcode);
888 Py_FatalError("opcode_stack_effect()");
889
890 }
891 return 0; /* not reachable */
892}
893
894/* Add an opcode with no argument.
895 Returns 0 on failure, 1 on success.
896*/
897
898static int
899compiler_addop(struct compiler *c, int opcode)
900{
901 basicblock *b;
902 struct instr *i;
903 int off;
904 off = compiler_next_instr(c, c->u->u_curblock);
905 if (off < 0)
906 return 0;
907 b = c->u->u_curblock;
908 i = &b->b_instr[off];
909 i->i_opcode = opcode;
910 i->i_hasarg = 0;
911 if (opcode == RETURN_VALUE)
912 b->b_return = 1;
913 compiler_set_lineno(c, off);
914 return 1;
915}
916
917static int
918compiler_add_o(struct compiler *c, PyObject *dict, PyObject *o)
919{
920 PyObject *t, *v;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000921 Py_ssize_t arg;
Mark Dickinson105be772008-01-31 22:17:37 +0000922 double d;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000923
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000924 /* necessary to make sure types aren't coerced (e.g., int and long) */
Alex Martellid8672aa2007-08-22 21:14:17 +0000925 /* _and_ to distinguish 0.0 from -0.0 e.g. on IEEE platforms */
926 if (PyFloat_Check(o)) {
Mark Dickinson105be772008-01-31 22:17:37 +0000927 d = PyFloat_AS_DOUBLE(o);
Mark Dickinson105be772008-01-31 22:17:37 +0000928 /* all we need is to make the tuple different in either the 0.0
929 * or -0.0 case from all others, just to avoid the "coercion".
930 */
Mark Dickinsonccc690d2009-11-28 16:32:27 +0000931 if (d == 0.0 && copysign(1.0, d) < 0.0)
Mark Dickinson105be772008-01-31 22:17:37 +0000932 t = PyTuple_Pack(3, o, o->ob_type, Py_None);
933 else
934 t = PyTuple_Pack(2, o, o->ob_type);
935 }
Mark Dickinson026ac7c2009-10-15 17:45:39 +0000936#ifndef WITHOUT_COMPLEX
Mark Dickinson105be772008-01-31 22:17:37 +0000937 else if (PyComplex_Check(o)) {
Mark Dickinson026ac7c2009-10-15 17:45:39 +0000938 Py_complex z;
Mark Dickinsonccc690d2009-11-28 16:32:27 +0000939 int real_negzero, imag_negzero;
940 /* For the complex case we must make complex(x, 0.)
941 different from complex(x, -0.) and complex(0., y)
942 different from complex(-0., y), for any x and y.
943 All four complex zeros must be distinguished.*/
Mark Dickinson105be772008-01-31 22:17:37 +0000944 z = PyComplex_AsCComplex(o);
Mark Dickinsonccc690d2009-11-28 16:32:27 +0000945 real_negzero = z.real == 0.0 && copysign(1.0, z.real) < 0.0;
946 imag_negzero = z.imag == 0.0 && copysign(1.0, z.imag) < 0.0;
947 if (real_negzero && imag_negzero) {
948 t = PyTuple_Pack(5, o, o->ob_type,
949 Py_None, Py_None, Py_None);
Mark Dickinson105be772008-01-31 22:17:37 +0000950 }
Mark Dickinsonccc690d2009-11-28 16:32:27 +0000951 else if (imag_negzero) {
952 t = PyTuple_Pack(4, o, o->ob_type, Py_None, Py_None);
Mark Dickinson105be772008-01-31 22:17:37 +0000953 }
Mark Dickinsonccc690d2009-11-28 16:32:27 +0000954 else if (real_negzero) {
955 t = PyTuple_Pack(3, o, o->ob_type, Py_None);
Mark Dickinson105be772008-01-31 22:17:37 +0000956 }
957 else {
958 t = PyTuple_Pack(2, o, o->ob_type);
959 }
960 }
Mark Dickinson026ac7c2009-10-15 17:45:39 +0000961#endif /* WITHOUT_COMPLEX */
Mark Dickinson105be772008-01-31 22:17:37 +0000962 else {
963 t = PyTuple_Pack(2, o, o->ob_type);
Alex Martellid8672aa2007-08-22 21:14:17 +0000964 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000965 if (t == NULL)
Mark Dickinson105be772008-01-31 22:17:37 +0000966 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000967
968 v = PyDict_GetItem(dict, t);
969 if (!v) {
970 arg = PyDict_Size(dict);
971 v = PyInt_FromLong(arg);
972 if (!v) {
973 Py_DECREF(t);
974 return -1;
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000975 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000976 if (PyDict_SetItem(dict, t, v) < 0) {
977 Py_DECREF(t);
978 Py_DECREF(v);
979 return -1;
980 }
981 Py_DECREF(v);
982 }
983 else
984 arg = PyInt_AsLong(v);
985 Py_DECREF(t);
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000986 return arg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000987}
988
989static int
990compiler_addop_o(struct compiler *c, int opcode, PyObject *dict,
991 PyObject *o)
992{
993 int arg = compiler_add_o(c, dict, o);
994 if (arg < 0)
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000995 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000996 return compiler_addop_i(c, opcode, arg);
997}
998
999static int
1000compiler_addop_name(struct compiler *c, int opcode, PyObject *dict,
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001001 PyObject *o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001002{
1003 int arg;
1004 PyObject *mangled = _Py_Mangle(c->u->u_private, o);
1005 if (!mangled)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001006 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001007 arg = compiler_add_o(c, dict, mangled);
1008 Py_DECREF(mangled);
1009 if (arg < 0)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001010 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001011 return compiler_addop_i(c, opcode, arg);
1012}
1013
1014/* Add an opcode with an integer argument.
1015 Returns 0 on failure, 1 on success.
1016*/
1017
1018static int
1019compiler_addop_i(struct compiler *c, int opcode, int oparg)
1020{
1021 struct instr *i;
1022 int off;
1023 off = compiler_next_instr(c, c->u->u_curblock);
1024 if (off < 0)
1025 return 0;
1026 i = &c->u->u_curblock->b_instr[off];
1027 i->i_opcode = opcode;
1028 i->i_oparg = oparg;
1029 i->i_hasarg = 1;
1030 compiler_set_lineno(c, off);
1031 return 1;
1032}
1033
1034static int
1035compiler_addop_j(struct compiler *c, int opcode, basicblock *b, int absolute)
1036{
1037 struct instr *i;
1038 int off;
1039
1040 assert(b != NULL);
1041 off = compiler_next_instr(c, c->u->u_curblock);
1042 if (off < 0)
1043 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001044 i = &c->u->u_curblock->b_instr[off];
1045 i->i_opcode = opcode;
1046 i->i_target = b;
1047 i->i_hasarg = 1;
1048 if (absolute)
1049 i->i_jabs = 1;
1050 else
1051 i->i_jrel = 1;
Jeremy Hylton12603c42006-04-01 16:18:02 +00001052 compiler_set_lineno(c, off);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001053 return 1;
1054}
1055
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001056/* The distinction between NEW_BLOCK and NEXT_BLOCK is subtle. (I'd
1057 like to find better names.) NEW_BLOCK() creates a new block and sets
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001058 it as the current block. NEXT_BLOCK() also creates an implicit jump
1059 from the current block to the new block.
1060*/
1061
Neal Norwitzf733a012006-10-29 18:30:10 +00001062/* The returns inside these macros make it impossible to decref objects
1063 created in the local function. Local objects should use the arena.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001064*/
1065
1066
1067#define NEW_BLOCK(C) { \
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001068 if (compiler_use_new_block((C)) == NULL) \
1069 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001070}
1071
1072#define NEXT_BLOCK(C) { \
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001073 if (compiler_next_block((C)) == NULL) \
1074 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001075}
1076
1077#define ADDOP(C, OP) { \
1078 if (!compiler_addop((C), (OP))) \
1079 return 0; \
1080}
1081
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001082#define ADDOP_IN_SCOPE(C, OP) { \
1083 if (!compiler_addop((C), (OP))) { \
1084 compiler_exit_scope(c); \
1085 return 0; \
1086 } \
1087}
1088
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001089#define ADDOP_O(C, OP, O, TYPE) { \
1090 if (!compiler_addop_o((C), (OP), (C)->u->u_ ## TYPE, (O))) \
1091 return 0; \
1092}
1093
1094#define ADDOP_NAME(C, OP, O, TYPE) { \
1095 if (!compiler_addop_name((C), (OP), (C)->u->u_ ## TYPE, (O))) \
1096 return 0; \
1097}
1098
1099#define ADDOP_I(C, OP, O) { \
1100 if (!compiler_addop_i((C), (OP), (O))) \
1101 return 0; \
1102}
1103
1104#define ADDOP_JABS(C, OP, O) { \
1105 if (!compiler_addop_j((C), (OP), (O), 1)) \
1106 return 0; \
1107}
1108
1109#define ADDOP_JREL(C, OP, O) { \
1110 if (!compiler_addop_j((C), (OP), (O), 0)) \
1111 return 0; \
1112}
1113
1114/* VISIT and VISIT_SEQ takes an ASDL type as their second argument. They use
1115 the ASDL name to synthesize the name of the C type and the visit function.
1116*/
1117
1118#define VISIT(C, TYPE, V) {\
1119 if (!compiler_visit_ ## TYPE((C), (V))) \
1120 return 0; \
1121}
1122
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001123#define VISIT_IN_SCOPE(C, TYPE, V) {\
1124 if (!compiler_visit_ ## TYPE((C), (V))) { \
1125 compiler_exit_scope(c); \
1126 return 0; \
1127 } \
1128}
1129
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001130#define VISIT_SLICE(C, V, CTX) {\
1131 if (!compiler_visit_slice((C), (V), (CTX))) \
1132 return 0; \
1133}
1134
1135#define VISIT_SEQ(C, TYPE, SEQ) { \
Neal Norwitz08b401f2006-01-07 21:24:09 +00001136 int _i; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001137 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
Neal Norwitz08b401f2006-01-07 21:24:09 +00001138 for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001139 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \
Anthony Baxter7b782b62006-04-11 12:01:56 +00001140 if (!compiler_visit_ ## TYPE((C), elt)) \
1141 return 0; \
1142 } \
1143}
1144
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001145#define VISIT_SEQ_IN_SCOPE(C, TYPE, SEQ) { \
Neal Norwitz08b401f2006-01-07 21:24:09 +00001146 int _i; \
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001147 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
Neal Norwitz08b401f2006-01-07 21:24:09 +00001148 for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001149 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \
Anthony Baxter7b782b62006-04-11 12:01:56 +00001150 if (!compiler_visit_ ## TYPE((C), elt)) { \
1151 compiler_exit_scope(c); \
1152 return 0; \
1153 } \
1154 } \
1155}
1156
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001157static int
1158compiler_isdocstring(stmt_ty s)
1159{
1160 if (s->kind != Expr_kind)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001161 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001162 return s->v.Expr.value->kind == Str_kind;
1163}
1164
1165/* Compile a sequence of statements, checking for a docstring. */
1166
1167static int
1168compiler_body(struct compiler *c, asdl_seq *stmts)
1169{
1170 int i = 0;
1171 stmt_ty st;
1172
1173 if (!asdl_seq_LEN(stmts))
1174 return 1;
Anthony Baxter7b782b62006-04-11 12:01:56 +00001175 st = (stmt_ty)asdl_seq_GET(stmts, 0);
Georg Brandla5ea6892007-06-01 11:33:33 +00001176 if (compiler_isdocstring(st) && Py_OptimizeFlag < 2) {
1177 /* don't generate docstrings if -OO */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001178 i = 1;
1179 VISIT(c, expr, st->v.Expr.value);
1180 if (!compiler_nameop(c, __doc__, Store))
1181 return 0;
1182 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001183 for (; i < asdl_seq_LEN(stmts); i++)
Anthony Baxter7b782b62006-04-11 12:01:56 +00001184 VISIT(c, stmt, (stmt_ty)asdl_seq_GET(stmts, i));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001185 return 1;
1186}
1187
1188static PyCodeObject *
1189compiler_mod(struct compiler *c, mod_ty mod)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001190{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001191 PyCodeObject *co;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001192 int addNone = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001193 static PyObject *module;
1194 if (!module) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001195 module = PyString_InternFromString("<module>");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001196 if (!module)
1197 return NULL;
1198 }
Neal Norwitzed657552006-07-10 00:04:44 +00001199 /* Use 0 for firstlineno initially, will fixup in assemble(). */
1200 if (!compiler_enter_scope(c, module, mod, 0))
Guido van Rossumd076c731998-10-07 19:42:25 +00001201 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001202 switch (mod->kind) {
1203 case Module_kind:
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001204 if (!compiler_body(c, mod->v.Module.body)) {
1205 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001206 return 0;
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001207 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001208 break;
1209 case Interactive_kind:
1210 c->c_interactive = 1;
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001211 VISIT_SEQ_IN_SCOPE(c, stmt,
Jeremy Hylton819de6c2007-02-27 16:13:23 +00001212 mod->v.Interactive.body);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001213 break;
1214 case Expression_kind:
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001215 VISIT_IN_SCOPE(c, expr, mod->v.Expression.body);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001216 addNone = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001217 break;
1218 case Suite_kind:
Neal Norwitz4737b232005-11-19 23:58:29 +00001219 PyErr_SetString(PyExc_SystemError,
1220 "suite should not be possible");
1221 return 0;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001222 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00001223 PyErr_Format(PyExc_SystemError,
1224 "module kind %d should not be possible",
1225 mod->kind);
1226 return 0;
Guido van Rossumd076c731998-10-07 19:42:25 +00001227 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001228 co = assemble(c, addNone);
1229 compiler_exit_scope(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001230 return co;
1231}
1232
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001233/* The test for LOCAL must come before the test for FREE in order to
1234 handle classes where name is both local and free. The local var is
1235 a method and the free var is a free var referenced within a method.
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001236*/
1237
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001238static int
1239get_ref_type(struct compiler *c, PyObject *name)
1240{
1241 int scope = PyST_GetScope(c->u->u_ste, name);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001242 if (scope == 0) {
1243 char buf[350];
1244 PyOS_snprintf(buf, sizeof(buf),
1245 "unknown scope for %.100s in %.100s(%s) in %s\n"
Amaury Forgeot d'Arc59ce0422009-01-17 20:18:59 +00001246 "symbols: %s\nlocals: %s\nglobals: %s",
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001247 PyString_AS_STRING(name),
1248 PyString_AS_STRING(c->u->u_name),
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001249 PyObject_REPR(c->u->u_ste->ste_id),
1250 c->c_filename,
1251 PyObject_REPR(c->u->u_ste->ste_symbols),
1252 PyObject_REPR(c->u->u_varnames),
1253 PyObject_REPR(c->u->u_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001254 );
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001255 Py_FatalError(buf);
1256 }
Tim Peters2a7f3842001-06-09 09:26:21 +00001257
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001258 return scope;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001259}
1260
1261static int
1262compiler_lookup_arg(PyObject *dict, PyObject *name)
1263{
1264 PyObject *k, *v;
Georg Brandl7784f122006-05-26 20:04:44 +00001265 k = PyTuple_Pack(2, name, name->ob_type);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001266 if (k == NULL)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001267 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001268 v = PyDict_GetItem(dict, k);
Neal Norwitz3715c3e2005-11-24 22:09:18 +00001269 Py_DECREF(k);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001270 if (v == NULL)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001271 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001272 return PyInt_AS_LONG(v);
1273}
1274
1275static int
1276compiler_make_closure(struct compiler *c, PyCodeObject *co, int args)
1277{
1278 int i, free = PyCode_GetNumFree(co);
1279 if (free == 0) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001280 ADDOP_O(c, LOAD_CONST, (PyObject*)co, consts);
1281 ADDOP_I(c, MAKE_FUNCTION, args);
1282 return 1;
1283 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001284 for (i = 0; i < free; ++i) {
1285 /* Bypass com_addop_varname because it will generate
1286 LOAD_DEREF but LOAD_CLOSURE is needed.
1287 */
1288 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
1289 int arg, reftype;
1290
1291 /* Special case: If a class contains a method with a
1292 free variable that has the same name as a method,
1293 the name will be considered free *and* local in the
1294 class. It should be handled by the closure, as
1295 well as by the normal name loookup logic.
1296 */
1297 reftype = get_ref_type(c, name);
1298 if (reftype == CELL)
1299 arg = compiler_lookup_arg(c->u->u_cellvars, name);
1300 else /* (reftype == FREE) */
1301 arg = compiler_lookup_arg(c->u->u_freevars, name);
1302 if (arg == -1) {
1303 printf("lookup %s in %s %d %d\n"
1304 "freevars of %s: %s\n",
1305 PyObject_REPR(name),
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001306 PyString_AS_STRING(c->u->u_name),
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001307 reftype, arg,
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001308 PyString_AS_STRING(co->co_name),
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001309 PyObject_REPR(co->co_freevars));
1310 Py_FatalError("compiler_make_closure()");
1311 }
1312 ADDOP_I(c, LOAD_CLOSURE, arg);
1313 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001314 ADDOP_I(c, BUILD_TUPLE, free);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001315 ADDOP_O(c, LOAD_CONST, (PyObject*)co, consts);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001316 ADDOP_I(c, MAKE_CLOSURE, args);
1317 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001318}
1319
1320static int
1321compiler_decorators(struct compiler *c, asdl_seq* decos)
1322{
1323 int i;
1324
1325 if (!decos)
1326 return 1;
1327
1328 for (i = 0; i < asdl_seq_LEN(decos); i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00001329 VISIT(c, expr, (expr_ty)asdl_seq_GET(decos, i));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001330 }
1331 return 1;
1332}
1333
1334static int
1335compiler_arguments(struct compiler *c, arguments_ty args)
1336{
1337 int i;
1338 int n = asdl_seq_LEN(args->args);
1339 /* Correctly handle nested argument lists */
1340 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00001341 expr_ty arg = (expr_ty)asdl_seq_GET(args->args, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001342 if (arg->kind == Tuple_kind) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001343 PyObject *id = PyString_FromFormat(".%d", i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001344 if (id == NULL) {
1345 return 0;
1346 }
1347 if (!compiler_nameop(c, id, Load)) {
1348 Py_DECREF(id);
1349 return 0;
1350 }
1351 Py_DECREF(id);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001352 VISIT(c, expr, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001353 }
1354 }
1355 return 1;
1356}
1357
1358static int
1359compiler_function(struct compiler *c, stmt_ty s)
1360{
1361 PyCodeObject *co;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001362 PyObject *first_const = Py_None;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001363 arguments_ty args = s->v.FunctionDef.args;
Christian Heimes5224d282008-02-23 15:01:05 +00001364 asdl_seq* decos = s->v.FunctionDef.decorator_list;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001365 stmt_ty st;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001366 int i, n, docstring;
1367
1368 assert(s->kind == FunctionDef_kind);
1369
1370 if (!compiler_decorators(c, decos))
1371 return 0;
1372 if (args->defaults)
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001373 VISIT_SEQ(c, expr, args->defaults);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001374 if (!compiler_enter_scope(c, s->v.FunctionDef.name, (void *)s,
1375 s->lineno))
1376 return 0;
1377
Anthony Baxter7b782b62006-04-11 12:01:56 +00001378 st = (stmt_ty)asdl_seq_GET(s->v.FunctionDef.body, 0);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001379 docstring = compiler_isdocstring(st);
Georg Brandl5a5bc7b2007-09-19 06:37:19 +00001380 if (docstring && Py_OptimizeFlag < 2)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001381 first_const = st->v.Expr.value->v.Str.s;
1382 if (compiler_add_o(c, c->u->u_consts, first_const) < 0) {
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001383 compiler_exit_scope(c);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001384 return 0;
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001385 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001386
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001387 /* unpack nested arguments */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001388 compiler_arguments(c, args);
1389
1390 c->u->u_argcount = asdl_seq_LEN(args->args);
1391 n = asdl_seq_LEN(s->v.FunctionDef.body);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001392 /* if there was a docstring, we need to skip the first statement */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001393 for (i = docstring; i < n; i++) {
Neal Norwitz4ffedad2006-08-04 04:58:47 +00001394 st = (stmt_ty)asdl_seq_GET(s->v.FunctionDef.body, i);
1395 VISIT_IN_SCOPE(c, stmt, st);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001396 }
1397 co = assemble(c, 1);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001398 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001399 if (co == NULL)
1400 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001401
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001402 compiler_make_closure(c, co, asdl_seq_LEN(args->defaults));
Neal Norwitz4737b232005-11-19 23:58:29 +00001403 Py_DECREF(co);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001404
1405 for (i = 0; i < asdl_seq_LEN(decos); i++) {
1406 ADDOP_I(c, CALL_FUNCTION, 1);
1407 }
1408
1409 return compiler_nameop(c, s->v.FunctionDef.name, Store);
1410}
1411
1412static int
1413compiler_class(struct compiler *c, stmt_ty s)
1414{
Christian Heimes5224d282008-02-23 15:01:05 +00001415 int n, i;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001416 PyCodeObject *co;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001417 PyObject *str;
Christian Heimes5224d282008-02-23 15:01:05 +00001418 asdl_seq* decos = s->v.ClassDef.decorator_list;
1419
1420 if (!compiler_decorators(c, decos))
1421 return 0;
1422
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001423 /* push class name on stack, needed by BUILD_CLASS */
1424 ADDOP_O(c, LOAD_CONST, s->v.ClassDef.name, consts);
1425 /* push the tuple of base classes on the stack */
1426 n = asdl_seq_LEN(s->v.ClassDef.bases);
1427 if (n > 0)
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001428 VISIT_SEQ(c, expr, s->v.ClassDef.bases);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001429 ADDOP_I(c, BUILD_TUPLE, n);
1430 if (!compiler_enter_scope(c, s->v.ClassDef.name, (void *)s,
1431 s->lineno))
1432 return 0;
Amaury Forgeot d'Arc69b747b2008-03-28 20:30:50 +00001433 Py_XDECREF(c->u->u_private);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001434 c->u->u_private = s->v.ClassDef.name;
1435 Py_INCREF(c->u->u_private);
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001436 str = PyString_InternFromString("__name__");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001437 if (!str || !compiler_nameop(c, str, Load)) {
1438 Py_XDECREF(str);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001439 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001440 return 0;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001441 }
1442
1443 Py_DECREF(str);
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001444 str = PyString_InternFromString("__module__");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001445 if (!str || !compiler_nameop(c, str, Store)) {
1446 Py_XDECREF(str);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001447 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001448 return 0;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001449 }
1450 Py_DECREF(str);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001451
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001452 if (!compiler_body(c, s->v.ClassDef.body)) {
1453 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001454 return 0;
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001455 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001456
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001457 ADDOP_IN_SCOPE(c, LOAD_LOCALS);
1458 ADDOP_IN_SCOPE(c, RETURN_VALUE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001459 co = assemble(c, 1);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001460 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001461 if (co == NULL)
1462 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001463
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001464 compiler_make_closure(c, co, 0);
Neal Norwitz4737b232005-11-19 23:58:29 +00001465 Py_DECREF(co);
1466
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001467 ADDOP_I(c, CALL_FUNCTION, 0);
1468 ADDOP(c, BUILD_CLASS);
Christian Heimes5224d282008-02-23 15:01:05 +00001469 /* apply decorators */
1470 for (i = 0; i < asdl_seq_LEN(decos); i++) {
1471 ADDOP_I(c, CALL_FUNCTION, 1);
1472 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001473 if (!compiler_nameop(c, s->v.ClassDef.name, Store))
1474 return 0;
1475 return 1;
1476}
1477
1478static int
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001479compiler_ifexp(struct compiler *c, expr_ty e)
1480{
1481 basicblock *end, *next;
1482
1483 assert(e->kind == IfExp_kind);
1484 end = compiler_new_block(c);
1485 if (end == NULL)
1486 return 0;
1487 next = compiler_new_block(c);
1488 if (next == NULL)
1489 return 0;
1490 VISIT(c, expr, e->v.IfExp.test);
Jeffrey Yasskin68d68522009-02-28 19:03:21 +00001491 ADDOP_JABS(c, POP_JUMP_IF_FALSE, next);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001492 VISIT(c, expr, e->v.IfExp.body);
1493 ADDOP_JREL(c, JUMP_FORWARD, end);
1494 compiler_use_next_block(c, next);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001495 VISIT(c, expr, e->v.IfExp.orelse);
1496 compiler_use_next_block(c, end);
1497 return 1;
1498}
1499
1500static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001501compiler_lambda(struct compiler *c, expr_ty e)
1502{
1503 PyCodeObject *co;
Nick Coghlan944d3eb2005-11-16 12:46:55 +00001504 static identifier name;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001505 arguments_ty args = e->v.Lambda.args;
1506 assert(e->kind == Lambda_kind);
1507
Nick Coghlan944d3eb2005-11-16 12:46:55 +00001508 if (!name) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001509 name = PyString_InternFromString("<lambda>");
Nick Coghlan944d3eb2005-11-16 12:46:55 +00001510 if (!name)
1511 return 0;
1512 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001513
1514 if (args->defaults)
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001515 VISIT_SEQ(c, expr, args->defaults);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001516 if (!compiler_enter_scope(c, name, (void *)e, e->lineno))
1517 return 0;
Neal Norwitz4737b232005-11-19 23:58:29 +00001518
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001519 /* unpack nested arguments */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001520 compiler_arguments(c, args);
Benjamin Peterson0dee9c12010-03-17 20:41:42 +00001521
1522 /* Make None the first constant, so the lambda can't have a
1523 docstring. */
1524 if (compiler_add_o(c, c->u->u_consts, Py_None) < 0)
1525 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001526
1527 c->u->u_argcount = asdl_seq_LEN(args->args);
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001528 VISIT_IN_SCOPE(c, expr, e->v.Lambda.body);
Benjamin Peterson8d5934b2008-12-27 18:24:11 +00001529 if (c->u->u_ste->ste_generator) {
1530 ADDOP_IN_SCOPE(c, POP_TOP);
1531 }
1532 else {
1533 ADDOP_IN_SCOPE(c, RETURN_VALUE);
1534 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001535 co = assemble(c, 1);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001536 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001537 if (co == NULL)
1538 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001539
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001540 compiler_make_closure(c, co, asdl_seq_LEN(args->defaults));
Neal Norwitz4737b232005-11-19 23:58:29 +00001541 Py_DECREF(co);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001542
1543 return 1;
1544}
1545
1546static int
1547compiler_print(struct compiler *c, stmt_ty s)
1548{
1549 int i, n;
1550 bool dest;
1551
1552 assert(s->kind == Print_kind);
1553 n = asdl_seq_LEN(s->v.Print.values);
1554 dest = false;
1555 if (s->v.Print.dest) {
1556 VISIT(c, expr, s->v.Print.dest);
1557 dest = true;
1558 }
1559 for (i = 0; i < n; i++) {
1560 expr_ty e = (expr_ty)asdl_seq_GET(s->v.Print.values, i);
1561 if (dest) {
1562 ADDOP(c, DUP_TOP);
1563 VISIT(c, expr, e);
1564 ADDOP(c, ROT_TWO);
1565 ADDOP(c, PRINT_ITEM_TO);
1566 }
1567 else {
1568 VISIT(c, expr, e);
1569 ADDOP(c, PRINT_ITEM);
1570 }
1571 }
1572 if (s->v.Print.nl) {
1573 if (dest)
1574 ADDOP(c, PRINT_NEWLINE_TO)
1575 else
1576 ADDOP(c, PRINT_NEWLINE)
1577 }
1578 else if (dest)
1579 ADDOP(c, POP_TOP);
1580 return 1;
1581}
1582
1583static int
1584compiler_if(struct compiler *c, stmt_ty s)
1585{
1586 basicblock *end, *next;
Georg Brandlddbaa662006-06-04 21:56:52 +00001587 int constant;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001588 assert(s->kind == If_kind);
1589 end = compiler_new_block(c);
1590 if (end == NULL)
1591 return 0;
Georg Brandlddbaa662006-06-04 21:56:52 +00001592
1593 constant = expr_constant(s->v.If.test);
1594 /* constant = 0: "if 0"
1595 * constant = 1: "if 1", "if 2", ...
1596 * constant = -1: rest */
1597 if (constant == 0) {
1598 if (s->v.If.orelse)
1599 VISIT_SEQ(c, stmt, s->v.If.orelse);
1600 } else if (constant == 1) {
1601 VISIT_SEQ(c, stmt, s->v.If.body);
1602 } else {
Jeffrey Yasskin68d68522009-02-28 19:03:21 +00001603 if (s->v.If.orelse) {
1604 next = compiler_new_block(c);
1605 if (next == NULL)
1606 return 0;
1607 }
1608 else
1609 next = end;
Georg Brandlddbaa662006-06-04 21:56:52 +00001610 VISIT(c, expr, s->v.If.test);
Jeffrey Yasskin68d68522009-02-28 19:03:21 +00001611 ADDOP_JABS(c, POP_JUMP_IF_FALSE, next);
Georg Brandlddbaa662006-06-04 21:56:52 +00001612 VISIT_SEQ(c, stmt, s->v.If.body);
1613 ADDOP_JREL(c, JUMP_FORWARD, end);
Jeffrey Yasskin68d68522009-02-28 19:03:21 +00001614 if (s->v.If.orelse) {
1615 compiler_use_next_block(c, next);
Jeremy Hylton819de6c2007-02-27 16:13:23 +00001616 VISIT_SEQ(c, stmt, s->v.If.orelse);
Jeffrey Yasskin68d68522009-02-28 19:03:21 +00001617 }
Georg Brandlddbaa662006-06-04 21:56:52 +00001618 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001619 compiler_use_next_block(c, end);
1620 return 1;
1621}
1622
1623static int
1624compiler_for(struct compiler *c, stmt_ty s)
1625{
1626 basicblock *start, *cleanup, *end;
1627
1628 start = compiler_new_block(c);
1629 cleanup = compiler_new_block(c);
1630 end = compiler_new_block(c);
1631 if (start == NULL || end == NULL || cleanup == NULL)
1632 return 0;
1633 ADDOP_JREL(c, SETUP_LOOP, end);
1634 if (!compiler_push_fblock(c, LOOP, start))
1635 return 0;
1636 VISIT(c, expr, s->v.For.iter);
1637 ADDOP(c, GET_ITER);
1638 compiler_use_next_block(c, start);
1639 ADDOP_JREL(c, FOR_ITER, cleanup);
1640 VISIT(c, expr, s->v.For.target);
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001641 VISIT_SEQ(c, stmt, s->v.For.body);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001642 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
1643 compiler_use_next_block(c, cleanup);
1644 ADDOP(c, POP_BLOCK);
1645 compiler_pop_fblock(c, LOOP, start);
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001646 VISIT_SEQ(c, stmt, s->v.For.orelse);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001647 compiler_use_next_block(c, end);
1648 return 1;
1649}
1650
1651static int
1652compiler_while(struct compiler *c, stmt_ty s)
1653{
1654 basicblock *loop, *orelse, *end, *anchor = NULL;
1655 int constant = expr_constant(s->v.While.test);
1656
Amaury Forgeot d'Arc16570f52008-01-24 22:51:18 +00001657 if (constant == 0) {
1658 if (s->v.While.orelse)
1659 VISIT_SEQ(c, stmt, s->v.While.orelse);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001660 return 1;
Amaury Forgeot d'Arc16570f52008-01-24 22:51:18 +00001661 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001662 loop = compiler_new_block(c);
1663 end = compiler_new_block(c);
1664 if (constant == -1) {
1665 anchor = compiler_new_block(c);
1666 if (anchor == NULL)
1667 return 0;
1668 }
1669 if (loop == NULL || end == NULL)
1670 return 0;
1671 if (s->v.While.orelse) {
1672 orelse = compiler_new_block(c);
1673 if (orelse == NULL)
1674 return 0;
1675 }
1676 else
1677 orelse = NULL;
1678
1679 ADDOP_JREL(c, SETUP_LOOP, end);
Nick Coghlanb90f52e2007-08-25 04:35:54 +00001680 compiler_use_next_block(c, loop);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001681 if (!compiler_push_fblock(c, LOOP, loop))
1682 return 0;
1683 if (constant == -1) {
1684 VISIT(c, expr, s->v.While.test);
Jeffrey Yasskin68d68522009-02-28 19:03:21 +00001685 ADDOP_JABS(c, POP_JUMP_IF_FALSE, anchor);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001686 }
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001687 VISIT_SEQ(c, stmt, s->v.While.body);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001688 ADDOP_JABS(c, JUMP_ABSOLUTE, loop);
1689
1690 /* XXX should the two POP instructions be in a separate block
1691 if there is no else clause ?
1692 */
1693
1694 if (constant == -1) {
1695 compiler_use_next_block(c, anchor);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001696 ADDOP(c, POP_BLOCK);
1697 }
1698 compiler_pop_fblock(c, LOOP, loop);
Jeremy Hylton12603c42006-04-01 16:18:02 +00001699 if (orelse != NULL) /* what if orelse is just pass? */
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001700 VISIT_SEQ(c, stmt, s->v.While.orelse);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001701 compiler_use_next_block(c, end);
1702
1703 return 1;
1704}
1705
1706static int
1707compiler_continue(struct compiler *c)
1708{
1709 static const char LOOP_ERROR_MSG[] = "'continue' not properly in loop";
Neal Norwitz4f096d92006-08-21 19:47:08 +00001710 static const char IN_FINALLY_ERROR_MSG[] =
1711 "'continue' not supported inside 'finally' clause";
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001712 int i;
1713
1714 if (!c->u->u_nfblocks)
1715 return compiler_error(c, LOOP_ERROR_MSG);
1716 i = c->u->u_nfblocks - 1;
1717 switch (c->u->u_fblock[i].fb_type) {
1718 case LOOP:
1719 ADDOP_JABS(c, JUMP_ABSOLUTE, c->u->u_fblock[i].fb_block);
1720 break;
1721 case EXCEPT:
1722 case FINALLY_TRY:
Neal Norwitz4f096d92006-08-21 19:47:08 +00001723 while (--i >= 0 && c->u->u_fblock[i].fb_type != LOOP) {
1724 /* Prevent continue anywhere under a finally
1725 even if hidden in a sub-try or except. */
1726 if (c->u->u_fblock[i].fb_type == FINALLY_END)
1727 return compiler_error(c, IN_FINALLY_ERROR_MSG);
1728 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001729 if (i == -1)
1730 return compiler_error(c, LOOP_ERROR_MSG);
1731 ADDOP_JABS(c, CONTINUE_LOOP, c->u->u_fblock[i].fb_block);
1732 break;
1733 case FINALLY_END:
Neal Norwitz4f096d92006-08-21 19:47:08 +00001734 return compiler_error(c, IN_FINALLY_ERROR_MSG);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001735 }
1736
1737 return 1;
1738}
1739
1740/* Code generated for "try: <body> finally: <finalbody>" is as follows:
1741
1742 SETUP_FINALLY L
1743 <code for body>
1744 POP_BLOCK
1745 LOAD_CONST <None>
1746 L: <code for finalbody>
1747 END_FINALLY
1748
1749 The special instructions use the block stack. Each block
1750 stack entry contains the instruction that created it (here
1751 SETUP_FINALLY), the level of the value stack at the time the
1752 block stack entry was created, and a label (here L).
1753
1754 SETUP_FINALLY:
1755 Pushes the current value stack level and the label
1756 onto the block stack.
1757 POP_BLOCK:
1758 Pops en entry from the block stack, and pops the value
1759 stack until its level is the same as indicated on the
1760 block stack. (The label is ignored.)
1761 END_FINALLY:
1762 Pops a variable number of entries from the *value* stack
1763 and re-raises the exception they specify. The number of
1764 entries popped depends on the (pseudo) exception type.
1765
1766 The block stack is unwound when an exception is raised:
1767 when a SETUP_FINALLY entry is found, the exception is pushed
1768 onto the value stack (and the exception condition is cleared),
1769 and the interpreter jumps to the label gotten from the block
1770 stack.
1771*/
1772
1773static int
1774compiler_try_finally(struct compiler *c, stmt_ty s)
1775{
1776 basicblock *body, *end;
1777 body = compiler_new_block(c);
1778 end = compiler_new_block(c);
1779 if (body == NULL || end == NULL)
1780 return 0;
1781
1782 ADDOP_JREL(c, SETUP_FINALLY, end);
1783 compiler_use_next_block(c, body);
1784 if (!compiler_push_fblock(c, FINALLY_TRY, body))
1785 return 0;
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001786 VISIT_SEQ(c, stmt, s->v.TryFinally.body);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001787 ADDOP(c, POP_BLOCK);
1788 compiler_pop_fblock(c, FINALLY_TRY, body);
1789
1790 ADDOP_O(c, LOAD_CONST, Py_None, consts);
1791 compiler_use_next_block(c, end);
1792 if (!compiler_push_fblock(c, FINALLY_END, end))
1793 return 0;
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001794 VISIT_SEQ(c, stmt, s->v.TryFinally.finalbody);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001795 ADDOP(c, END_FINALLY);
1796 compiler_pop_fblock(c, FINALLY_END, end);
1797
1798 return 1;
1799}
1800
1801/*
1802 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
1803 (The contents of the value stack is shown in [], with the top
1804 at the right; 'tb' is trace-back info, 'val' the exception's
1805 associated value, and 'exc' the exception.)
1806
1807 Value stack Label Instruction Argument
1808 [] SETUP_EXCEPT L1
1809 [] <code for S>
1810 [] POP_BLOCK
1811 [] JUMP_FORWARD L0
1812
1813 [tb, val, exc] L1: DUP )
1814 [tb, val, exc, exc] <evaluate E1> )
1815 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
Jeffrey Yasskin68d68522009-02-28 19:03:21 +00001816 [tb, val, exc, 1-or-0] POP_JUMP_IF_FALSE L2 )
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001817 [tb, val, exc] POP
1818 [tb, val] <assign to V1> (or POP if no V1)
1819 [tb] POP
1820 [] <code for S1>
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001821 JUMP_FORWARD L0
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001822
Jeffrey Yasskin68d68522009-02-28 19:03:21 +00001823 [tb, val, exc] L2: DUP
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001824 .............................etc.......................
1825
Jeffrey Yasskin68d68522009-02-28 19:03:21 +00001826 [tb, val, exc] Ln+1: END_FINALLY # re-raise exception
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001827
1828 [] L0: <next statement>
1829
1830 Of course, parts are not generated if Vi or Ei is not present.
1831*/
1832static int
1833compiler_try_except(struct compiler *c, stmt_ty s)
1834{
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001835 basicblock *body, *orelse, *except, *end;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001836 int i, n;
1837
1838 body = compiler_new_block(c);
1839 except = compiler_new_block(c);
1840 orelse = compiler_new_block(c);
1841 end = compiler_new_block(c);
1842 if (body == NULL || except == NULL || orelse == NULL || end == NULL)
1843 return 0;
1844 ADDOP_JREL(c, SETUP_EXCEPT, except);
1845 compiler_use_next_block(c, body);
1846 if (!compiler_push_fblock(c, EXCEPT, body))
1847 return 0;
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001848 VISIT_SEQ(c, stmt, s->v.TryExcept.body);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001849 ADDOP(c, POP_BLOCK);
1850 compiler_pop_fblock(c, EXCEPT, body);
1851 ADDOP_JREL(c, JUMP_FORWARD, orelse);
1852 n = asdl_seq_LEN(s->v.TryExcept.handlers);
1853 compiler_use_next_block(c, except);
1854 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00001855 excepthandler_ty handler = (excepthandler_ty)asdl_seq_GET(
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001856 s->v.TryExcept.handlers, i);
Georg Brandla48f3ab2008-03-30 06:40:17 +00001857 if (!handler->v.ExceptHandler.type && i < n-1)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001858 return compiler_error(c, "default 'except:' must be last");
Amaury Forgeot d'Arc6fd03bb2008-02-04 21:45:05 +00001859 c->u->u_lineno_set = false;
1860 c->u->u_lineno = handler->lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001861 except = compiler_new_block(c);
1862 if (except == NULL)
1863 return 0;
Georg Brandla48f3ab2008-03-30 06:40:17 +00001864 if (handler->v.ExceptHandler.type) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001865 ADDOP(c, DUP_TOP);
Georg Brandla48f3ab2008-03-30 06:40:17 +00001866 VISIT(c, expr, handler->v.ExceptHandler.type);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001867 ADDOP_I(c, COMPARE_OP, PyCmp_EXC_MATCH);
Jeffrey Yasskin68d68522009-02-28 19:03:21 +00001868 ADDOP_JABS(c, POP_JUMP_IF_FALSE, except);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001869 }
1870 ADDOP(c, POP_TOP);
Georg Brandla48f3ab2008-03-30 06:40:17 +00001871 if (handler->v.ExceptHandler.name) {
1872 VISIT(c, expr, handler->v.ExceptHandler.name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001873 }
1874 else {
1875 ADDOP(c, POP_TOP);
1876 }
1877 ADDOP(c, POP_TOP);
Georg Brandla48f3ab2008-03-30 06:40:17 +00001878 VISIT_SEQ(c, stmt, handler->v.ExceptHandler.body);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001879 ADDOP_JREL(c, JUMP_FORWARD, end);
1880 compiler_use_next_block(c, except);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001881 }
1882 ADDOP(c, END_FINALLY);
1883 compiler_use_next_block(c, orelse);
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001884 VISIT_SEQ(c, stmt, s->v.TryExcept.orelse);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001885 compiler_use_next_block(c, end);
1886 return 1;
1887}
1888
1889static int
1890compiler_import_as(struct compiler *c, identifier name, identifier asname)
1891{
1892 /* The IMPORT_NAME opcode was already generated. This function
1893 merely needs to bind the result to a name.
1894
1895 If there is a dot in name, we need to split it and emit a
1896 LOAD_ATTR for each name.
1897 */
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001898 const char *src = PyString_AS_STRING(name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001899 const char *dot = strchr(src, '.');
1900 if (dot) {
1901 /* Consume the base module name to get the first attribute */
1902 src = dot + 1;
1903 while (dot) {
1904 /* NB src is only defined when dot != NULL */
Armin Rigo31441302005-10-21 12:57:31 +00001905 PyObject *attr;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001906 dot = strchr(src, '.');
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001907 attr = PyString_FromStringAndSize(src,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001908 dot ? dot - src : strlen(src));
Neal Norwitz7bcabc62005-11-20 23:58:38 +00001909 if (!attr)
1910 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001911 ADDOP_O(c, LOAD_ATTR, attr, names);
Neal Norwitz7bcabc62005-11-20 23:58:38 +00001912 Py_DECREF(attr);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001913 src = dot + 1;
1914 }
1915 }
1916 return compiler_nameop(c, asname, Store);
1917}
1918
1919static int
1920compiler_import(struct compiler *c, stmt_ty s)
1921{
1922 /* The Import node stores a module name like a.b.c as a single
1923 string. This is convenient for all cases except
1924 import a.b.c as d
1925 where we need to parse that string to extract the individual
1926 module names.
1927 XXX Perhaps change the representation to make this case simpler?
1928 */
1929 int i, n = asdl_seq_LEN(s->v.Import.names);
Thomas Woutersf7f438b2006-02-28 16:09:29 +00001930
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001931 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00001932 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.Import.names, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001933 int r;
Thomas Woutersf7f438b2006-02-28 16:09:29 +00001934 PyObject *level;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001935
Neal Norwitzcbce2802006-04-03 06:26:32 +00001936 if (c->c_flags && (c->c_flags->cf_flags & CO_FUTURE_ABSOLUTE_IMPORT))
Thomas Woutersf7f438b2006-02-28 16:09:29 +00001937 level = PyInt_FromLong(0);
1938 else
1939 level = PyInt_FromLong(-1);
1940
1941 if (level == NULL)
1942 return 0;
1943
1944 ADDOP_O(c, LOAD_CONST, level, consts);
1945 Py_DECREF(level);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001946 ADDOP_O(c, LOAD_CONST, Py_None, consts);
1947 ADDOP_NAME(c, IMPORT_NAME, alias->name, names);
1948
1949 if (alias->asname) {
Neil Schemenauerac699ef2005-10-23 03:45:42 +00001950 r = compiler_import_as(c, alias->name, alias->asname);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001951 if (!r)
1952 return r;
1953 }
1954 else {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001955 identifier tmp = alias->name;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001956 const char *base = PyString_AS_STRING(alias->name);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001957 char *dot = strchr(base, '.');
1958 if (dot)
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001959 tmp = PyString_FromStringAndSize(base,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001960 dot - base);
1961 r = compiler_nameop(c, tmp, Store);
1962 if (dot) {
1963 Py_DECREF(tmp);
1964 }
1965 if (!r)
1966 return r;
1967 }
1968 }
1969 return 1;
1970}
1971
1972static int
1973compiler_from_import(struct compiler *c, stmt_ty s)
1974{
1975 int i, n = asdl_seq_LEN(s->v.ImportFrom.names);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001976
1977 PyObject *names = PyTuple_New(n);
Thomas Woutersf7f438b2006-02-28 16:09:29 +00001978 PyObject *level;
Benjamin Petersona72be3b2009-06-13 20:23:33 +00001979 static PyObject *empty_string;
1980
1981 if (!empty_string) {
1982 empty_string = PyString_FromString("");
1983 if (!empty_string)
1984 return 0;
1985 }
Thomas Woutersf7f438b2006-02-28 16:09:29 +00001986
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001987 if (!names)
1988 return 0;
1989
Thomas Woutersf7f438b2006-02-28 16:09:29 +00001990 if (s->v.ImportFrom.level == 0 && c->c_flags &&
Neal Norwitzcbce2802006-04-03 06:26:32 +00001991 !(c->c_flags->cf_flags & CO_FUTURE_ABSOLUTE_IMPORT))
Thomas Woutersf7f438b2006-02-28 16:09:29 +00001992 level = PyInt_FromLong(-1);
1993 else
1994 level = PyInt_FromLong(s->v.ImportFrom.level);
1995
1996 if (!level) {
1997 Py_DECREF(names);
1998 return 0;
1999 }
2000
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002001 /* build up the names */
2002 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00002003 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002004 Py_INCREF(alias->name);
2005 PyTuple_SET_ITEM(names, i, alias->name);
2006 }
2007
Benjamin Petersona72be3b2009-06-13 20:23:33 +00002008 if (s->lineno > c->c_future->ff_lineno && s->v.ImportFrom.module &&
2009 !strcmp(PyString_AS_STRING(s->v.ImportFrom.module), "__future__")) {
2010 Py_DECREF(level);
2011 Py_DECREF(names);
2012 return compiler_error(c, "from __future__ imports must occur "
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002013 "at the beginning of the file");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002014 }
2015
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002016 ADDOP_O(c, LOAD_CONST, level, consts);
2017 Py_DECREF(level);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002018 ADDOP_O(c, LOAD_CONST, names, consts);
Neal Norwitz3715c3e2005-11-24 22:09:18 +00002019 Py_DECREF(names);
Benjamin Petersona72be3b2009-06-13 20:23:33 +00002020 if (s->v.ImportFrom.module) {
2021 ADDOP_NAME(c, IMPORT_NAME, s->v.ImportFrom.module, names);
2022 }
2023 else {
2024 ADDOP_NAME(c, IMPORT_NAME, empty_string, names);
2025 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002026 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00002027 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002028 identifier store_name;
2029
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002030 if (i == 0 && *PyString_AS_STRING(alias->name) == '*') {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002031 assert(n == 1);
2032 ADDOP(c, IMPORT_STAR);
Neal Norwitz28b32ac2005-12-06 07:41:30 +00002033 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002034 }
2035
2036 ADDOP_NAME(c, IMPORT_FROM, alias->name, names);
2037 store_name = alias->name;
2038 if (alias->asname)
2039 store_name = alias->asname;
2040
2041 if (!compiler_nameop(c, store_name, Store)) {
2042 Py_DECREF(names);
2043 return 0;
2044 }
2045 }
Neal Norwitz28b32ac2005-12-06 07:41:30 +00002046 /* remove imported module */
2047 ADDOP(c, POP_TOP);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002048 return 1;
2049}
2050
2051static int
2052compiler_assert(struct compiler *c, stmt_ty s)
2053{
2054 static PyObject *assertion_error = NULL;
2055 basicblock *end;
2056
2057 if (Py_OptimizeFlag)
2058 return 1;
2059 if (assertion_error == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002060 assertion_error = PyString_InternFromString("AssertionError");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002061 if (assertion_error == NULL)
2062 return 0;
2063 }
Neal Norwitz400aeda2008-03-15 22:03:18 +00002064 if (s->v.Assert.test->kind == Tuple_kind &&
2065 asdl_seq_LEN(s->v.Assert.test->v.Tuple.elts) > 0) {
2066 const char* msg =
2067 "assertion is always true, perhaps remove parentheses?";
2068 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, c->c_filename,
2069 c->u->u_lineno, NULL, NULL) == -1)
2070 return 0;
2071 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002072 VISIT(c, expr, s->v.Assert.test);
2073 end = compiler_new_block(c);
2074 if (end == NULL)
2075 return 0;
Jeffrey Yasskin68d68522009-02-28 19:03:21 +00002076 ADDOP_JABS(c, POP_JUMP_IF_TRUE, end);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002077 ADDOP_O(c, LOAD_GLOBAL, assertion_error, names);
2078 if (s->v.Assert.msg) {
2079 VISIT(c, expr, s->v.Assert.msg);
2080 ADDOP_I(c, RAISE_VARARGS, 2);
2081 }
2082 else {
2083 ADDOP_I(c, RAISE_VARARGS, 1);
2084 }
Neal Norwitz51abbc72005-12-18 07:06:23 +00002085 compiler_use_next_block(c, end);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002086 return 1;
2087}
2088
2089static int
2090compiler_visit_stmt(struct compiler *c, stmt_ty s)
2091{
2092 int i, n;
2093
Neal Norwitzf733a012006-10-29 18:30:10 +00002094 /* Always assign a lineno to the next instruction for a stmt. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002095 c->u->u_lineno = s->lineno;
2096 c->u->u_lineno_set = false;
Jeremy Hylton12603c42006-04-01 16:18:02 +00002097
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002098 switch (s->kind) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002099 case FunctionDef_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002100 return compiler_function(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002101 case ClassDef_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002102 return compiler_class(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002103 case Return_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002104 if (c->u->u_ste->ste_type != FunctionBlock)
2105 return compiler_error(c, "'return' outside function");
2106 if (s->v.Return.value) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002107 VISIT(c, expr, s->v.Return.value);
2108 }
2109 else
2110 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2111 ADDOP(c, RETURN_VALUE);
2112 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002113 case Delete_kind:
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002114 VISIT_SEQ(c, expr, s->v.Delete.targets)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002115 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002116 case Assign_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002117 n = asdl_seq_LEN(s->v.Assign.targets);
2118 VISIT(c, expr, s->v.Assign.value);
2119 for (i = 0; i < n; i++) {
2120 if (i < n - 1)
2121 ADDOP(c, DUP_TOP);
2122 VISIT(c, expr,
2123 (expr_ty)asdl_seq_GET(s->v.Assign.targets, i));
2124 }
2125 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002126 case AugAssign_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002127 return compiler_augassign(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002128 case Print_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002129 return compiler_print(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002130 case For_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002131 return compiler_for(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002132 case While_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002133 return compiler_while(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002134 case If_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002135 return compiler_if(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002136 case Raise_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002137 n = 0;
2138 if (s->v.Raise.type) {
2139 VISIT(c, expr, s->v.Raise.type);
2140 n++;
2141 if (s->v.Raise.inst) {
2142 VISIT(c, expr, s->v.Raise.inst);
2143 n++;
2144 if (s->v.Raise.tback) {
2145 VISIT(c, expr, s->v.Raise.tback);
2146 n++;
2147 }
2148 }
2149 }
2150 ADDOP_I(c, RAISE_VARARGS, n);
2151 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002152 case TryExcept_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002153 return compiler_try_except(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002154 case TryFinally_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002155 return compiler_try_finally(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002156 case Assert_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002157 return compiler_assert(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002158 case Import_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002159 return compiler_import(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002160 case ImportFrom_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002161 return compiler_from_import(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002162 case Exec_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002163 VISIT(c, expr, s->v.Exec.body);
2164 if (s->v.Exec.globals) {
2165 VISIT(c, expr, s->v.Exec.globals);
2166 if (s->v.Exec.locals) {
2167 VISIT(c, expr, s->v.Exec.locals);
2168 } else {
2169 ADDOP(c, DUP_TOP);
2170 }
2171 } else {
2172 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2173 ADDOP(c, DUP_TOP);
2174 }
2175 ADDOP(c, EXEC_STMT);
2176 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002177 case Global_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002178 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002179 case Expr_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002180 if (c->c_interactive && c->c_nestlevel <= 1) {
Neal Norwitz0cbd8052006-08-04 05:09:28 +00002181 VISIT(c, expr, s->v.Expr.value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002182 ADDOP(c, PRINT_EXPR);
2183 }
Neal Norwitz0cbd8052006-08-04 05:09:28 +00002184 else if (s->v.Expr.value->kind != Str_kind &&
2185 s->v.Expr.value->kind != Num_kind) {
2186 VISIT(c, expr, s->v.Expr.value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002187 ADDOP(c, POP_TOP);
2188 }
2189 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002190 case Pass_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002191 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002192 case Break_kind:
Jeremy Hylton819de6c2007-02-27 16:13:23 +00002193 if (!compiler_in_loop(c))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002194 return compiler_error(c, "'break' outside loop");
2195 ADDOP(c, BREAK_LOOP);
2196 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002197 case Continue_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002198 return compiler_continue(c);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002199 case With_kind:
2200 return compiler_with(c, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002201 }
2202 return 1;
2203}
2204
2205static int
2206unaryop(unaryop_ty op)
2207{
2208 switch (op) {
2209 case Invert:
2210 return UNARY_INVERT;
2211 case Not:
2212 return UNARY_NOT;
2213 case UAdd:
2214 return UNARY_POSITIVE;
2215 case USub:
2216 return UNARY_NEGATIVE;
Georg Brandlfc8eef32008-03-28 12:11:56 +00002217 default:
2218 PyErr_Format(PyExc_SystemError,
2219 "unary op %d should not be possible", op);
2220 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002221 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002222}
2223
2224static int
2225binop(struct compiler *c, operator_ty op)
2226{
2227 switch (op) {
2228 case Add:
2229 return BINARY_ADD;
2230 case Sub:
2231 return BINARY_SUBTRACT;
2232 case Mult:
2233 return BINARY_MULTIPLY;
2234 case Div:
2235 if (c->c_flags && c->c_flags->cf_flags & CO_FUTURE_DIVISION)
2236 return BINARY_TRUE_DIVIDE;
2237 else
2238 return BINARY_DIVIDE;
2239 case Mod:
2240 return BINARY_MODULO;
2241 case Pow:
2242 return BINARY_POWER;
2243 case LShift:
2244 return BINARY_LSHIFT;
2245 case RShift:
2246 return BINARY_RSHIFT;
2247 case BitOr:
2248 return BINARY_OR;
2249 case BitXor:
2250 return BINARY_XOR;
2251 case BitAnd:
2252 return BINARY_AND;
2253 case FloorDiv:
2254 return BINARY_FLOOR_DIVIDE;
Georg Brandlfc8eef32008-03-28 12:11:56 +00002255 default:
2256 PyErr_Format(PyExc_SystemError,
2257 "binary op %d should not be possible", op);
2258 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002259 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002260}
2261
2262static int
2263cmpop(cmpop_ty op)
2264{
2265 switch (op) {
2266 case Eq:
2267 return PyCmp_EQ;
2268 case NotEq:
2269 return PyCmp_NE;
2270 case Lt:
2271 return PyCmp_LT;
2272 case LtE:
2273 return PyCmp_LE;
2274 case Gt:
2275 return PyCmp_GT;
2276 case GtE:
2277 return PyCmp_GE;
2278 case Is:
2279 return PyCmp_IS;
2280 case IsNot:
2281 return PyCmp_IS_NOT;
2282 case In:
2283 return PyCmp_IN;
2284 case NotIn:
2285 return PyCmp_NOT_IN;
Georg Brandlfc8eef32008-03-28 12:11:56 +00002286 default:
2287 return PyCmp_BAD;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002288 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002289}
2290
2291static int
2292inplace_binop(struct compiler *c, operator_ty op)
2293{
2294 switch (op) {
2295 case Add:
2296 return INPLACE_ADD;
2297 case Sub:
2298 return INPLACE_SUBTRACT;
2299 case Mult:
2300 return INPLACE_MULTIPLY;
2301 case Div:
2302 if (c->c_flags && c->c_flags->cf_flags & CO_FUTURE_DIVISION)
2303 return INPLACE_TRUE_DIVIDE;
2304 else
2305 return INPLACE_DIVIDE;
2306 case Mod:
2307 return INPLACE_MODULO;
2308 case Pow:
2309 return INPLACE_POWER;
2310 case LShift:
2311 return INPLACE_LSHIFT;
2312 case RShift:
2313 return INPLACE_RSHIFT;
2314 case BitOr:
2315 return INPLACE_OR;
2316 case BitXor:
2317 return INPLACE_XOR;
2318 case BitAnd:
2319 return INPLACE_AND;
2320 case FloorDiv:
2321 return INPLACE_FLOOR_DIVIDE;
Georg Brandlfc8eef32008-03-28 12:11:56 +00002322 default:
2323 PyErr_Format(PyExc_SystemError,
2324 "inplace binary op %d should not be possible", op);
2325 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002326 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002327}
2328
2329static int
2330compiler_nameop(struct compiler *c, identifier name, expr_context_ty ctx)
2331{
Neil Schemenauerdad06a12005-10-23 18:52:36 +00002332 int op, scope, arg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002333 enum { OP_FAST, OP_GLOBAL, OP_DEREF, OP_NAME } optype;
2334
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002335 PyObject *dict = c->u->u_names;
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002336 PyObject *mangled;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002337 /* XXX AugStore isn't used anywhere! */
2338
Neal Norwitz0031ff32008-02-25 01:45:37 +00002339 mangled = _Py_Mangle(c->u->u_private, name);
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002340 if (!mangled)
2341 return 0;
2342
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002343 op = 0;
2344 optype = OP_NAME;
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002345 scope = PyST_GetScope(c->u->u_ste, mangled);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002346 switch (scope) {
2347 case FREE:
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002348 dict = c->u->u_freevars;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002349 optype = OP_DEREF;
2350 break;
2351 case CELL:
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002352 dict = c->u->u_cellvars;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002353 optype = OP_DEREF;
2354 break;
2355 case LOCAL:
2356 if (c->u->u_ste->ste_type == FunctionBlock)
2357 optype = OP_FAST;
2358 break;
2359 case GLOBAL_IMPLICIT:
Neil Schemenauerd403c452005-10-23 04:24:49 +00002360 if (c->u->u_ste->ste_type == FunctionBlock &&
2361 !c->u->u_ste->ste_unoptimized)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002362 optype = OP_GLOBAL;
2363 break;
2364 case GLOBAL_EXPLICIT:
2365 optype = OP_GLOBAL;
2366 break;
Neal Norwitz4e6bf492005-12-18 05:32:41 +00002367 default:
2368 /* scope can be 0 */
2369 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002370 }
2371
2372 /* XXX Leave assert here, but handle __doc__ and the like better */
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002373 assert(scope || PyString_AS_STRING(name)[0] == '_');
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002374
2375 switch (optype) {
2376 case OP_DEREF:
2377 switch (ctx) {
2378 case Load: op = LOAD_DEREF; break;
2379 case Store: op = STORE_DEREF; break;
2380 case AugLoad:
2381 case AugStore:
2382 break;
2383 case Del:
2384 PyErr_Format(PyExc_SyntaxError,
2385 "can not delete variable '%s' referenced "
2386 "in nested scope",
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002387 PyString_AS_STRING(name));
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002388 Py_DECREF(mangled);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002389 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002390 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00002391 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00002392 PyErr_SetString(PyExc_SystemError,
2393 "param invalid for deref variable");
2394 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002395 }
2396 break;
2397 case OP_FAST:
2398 switch (ctx) {
2399 case Load: op = LOAD_FAST; break;
2400 case Store: op = STORE_FAST; break;
2401 case Del: op = DELETE_FAST; break;
2402 case AugLoad:
2403 case AugStore:
2404 break;
2405 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00002406 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00002407 PyErr_SetString(PyExc_SystemError,
2408 "param invalid for local variable");
2409 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002410 }
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002411 ADDOP_O(c, op, mangled, varnames);
2412 Py_DECREF(mangled);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002413 return 1;
2414 case OP_GLOBAL:
2415 switch (ctx) {
2416 case Load: op = LOAD_GLOBAL; break;
2417 case Store: op = STORE_GLOBAL; break;
2418 case Del: op = DELETE_GLOBAL; break;
2419 case AugLoad:
2420 case AugStore:
2421 break;
2422 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00002423 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00002424 PyErr_SetString(PyExc_SystemError,
2425 "param invalid for global variable");
2426 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002427 }
2428 break;
2429 case OP_NAME:
2430 switch (ctx) {
2431 case Load: op = LOAD_NAME; break;
2432 case Store: op = STORE_NAME; break;
2433 case Del: op = DELETE_NAME; break;
2434 case AugLoad:
2435 case AugStore:
2436 break;
2437 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00002438 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00002439 PyErr_SetString(PyExc_SystemError,
2440 "param invalid for name variable");
2441 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002442 }
2443 break;
2444 }
2445
2446 assert(op);
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002447 arg = compiler_add_o(c, dict, mangled);
Neal Norwitz4737b232005-11-19 23:58:29 +00002448 Py_DECREF(mangled);
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002449 if (arg < 0)
2450 return 0;
Neil Schemenauerdad06a12005-10-23 18:52:36 +00002451 return compiler_addop_i(c, op, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002452}
2453
2454static int
2455compiler_boolop(struct compiler *c, expr_ty e)
2456{
2457 basicblock *end;
2458 int jumpi, i, n;
2459 asdl_seq *s;
2460
2461 assert(e->kind == BoolOp_kind);
2462 if (e->v.BoolOp.op == And)
Jeffrey Yasskin68d68522009-02-28 19:03:21 +00002463 jumpi = JUMP_IF_FALSE_OR_POP;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002464 else
Jeffrey Yasskin68d68522009-02-28 19:03:21 +00002465 jumpi = JUMP_IF_TRUE_OR_POP;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002466 end = compiler_new_block(c);
Martin v. Löwis94962612006-01-02 21:15:05 +00002467 if (end == NULL)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002468 return 0;
2469 s = e->v.BoolOp.values;
2470 n = asdl_seq_LEN(s) - 1;
Neal Norwitzc173b482006-07-30 19:18:13 +00002471 assert(n >= 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002472 for (i = 0; i < n; ++i) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00002473 VISIT(c, expr, (expr_ty)asdl_seq_GET(s, i));
Jeffrey Yasskin68d68522009-02-28 19:03:21 +00002474 ADDOP_JABS(c, jumpi, end);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002475 }
Anthony Baxter7b782b62006-04-11 12:01:56 +00002476 VISIT(c, expr, (expr_ty)asdl_seq_GET(s, n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002477 compiler_use_next_block(c, end);
2478 return 1;
2479}
2480
2481static int
2482compiler_list(struct compiler *c, expr_ty e)
2483{
2484 int n = asdl_seq_LEN(e->v.List.elts);
2485 if (e->v.List.ctx == Store) {
2486 ADDOP_I(c, UNPACK_SEQUENCE, n);
2487 }
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002488 VISIT_SEQ(c, expr, e->v.List.elts);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002489 if (e->v.List.ctx == Load) {
2490 ADDOP_I(c, BUILD_LIST, n);
2491 }
2492 return 1;
2493}
2494
2495static int
2496compiler_tuple(struct compiler *c, expr_ty e)
2497{
2498 int n = asdl_seq_LEN(e->v.Tuple.elts);
2499 if (e->v.Tuple.ctx == Store) {
2500 ADDOP_I(c, UNPACK_SEQUENCE, n);
2501 }
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002502 VISIT_SEQ(c, expr, e->v.Tuple.elts);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002503 if (e->v.Tuple.ctx == Load) {
2504 ADDOP_I(c, BUILD_TUPLE, n);
2505 }
2506 return 1;
2507}
2508
2509static int
2510compiler_compare(struct compiler *c, expr_ty e)
2511{
2512 int i, n;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002513 basicblock *cleanup = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002514
2515 /* XXX the logic can be cleaned up for 1 or multiple comparisons */
2516 VISIT(c, expr, e->v.Compare.left);
2517 n = asdl_seq_LEN(e->v.Compare.ops);
2518 assert(n > 0);
2519 if (n > 1) {
2520 cleanup = compiler_new_block(c);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002521 if (cleanup == NULL)
2522 return 0;
Anthony Baxter7b782b62006-04-11 12:01:56 +00002523 VISIT(c, expr,
Jeremy Hylton819de6c2007-02-27 16:13:23 +00002524 (expr_ty)asdl_seq_GET(e->v.Compare.comparators, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002525 }
2526 for (i = 1; i < n; i++) {
2527 ADDOP(c, DUP_TOP);
2528 ADDOP(c, ROT_THREE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002529 ADDOP_I(c, COMPARE_OP,
Martin v. Löwis0cc56e52006-04-13 12:29:43 +00002530 cmpop((cmpop_ty)(asdl_seq_GET(
Jeremy Hylton819de6c2007-02-27 16:13:23 +00002531 e->v.Compare.ops, i - 1))));
Jeffrey Yasskin68d68522009-02-28 19:03:21 +00002532 ADDOP_JABS(c, JUMP_IF_FALSE_OR_POP, cleanup);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002533 NEXT_BLOCK(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002534 if (i < (n - 1))
Anthony Baxter7b782b62006-04-11 12:01:56 +00002535 VISIT(c, expr,
Jeremy Hylton819de6c2007-02-27 16:13:23 +00002536 (expr_ty)asdl_seq_GET(e->v.Compare.comparators, i));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002537 }
Anthony Baxter7b782b62006-04-11 12:01:56 +00002538 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, n - 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002539 ADDOP_I(c, COMPARE_OP,
Martin v. Löwis0cc56e52006-04-13 12:29:43 +00002540 cmpop((cmpop_ty)(asdl_seq_GET(e->v.Compare.ops, n - 1))));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002541 if (n > 1) {
2542 basicblock *end = compiler_new_block(c);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002543 if (end == NULL)
2544 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002545 ADDOP_JREL(c, JUMP_FORWARD, end);
2546 compiler_use_next_block(c, cleanup);
2547 ADDOP(c, ROT_TWO);
2548 ADDOP(c, POP_TOP);
2549 compiler_use_next_block(c, end);
2550 }
2551 return 1;
2552}
2553
2554static int
2555compiler_call(struct compiler *c, expr_ty e)
2556{
2557 int n, code = 0;
2558
2559 VISIT(c, expr, e->v.Call.func);
2560 n = asdl_seq_LEN(e->v.Call.args);
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002561 VISIT_SEQ(c, expr, e->v.Call.args);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002562 if (e->v.Call.keywords) {
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002563 VISIT_SEQ(c, keyword, e->v.Call.keywords);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002564 n |= asdl_seq_LEN(e->v.Call.keywords) << 8;
2565 }
2566 if (e->v.Call.starargs) {
2567 VISIT(c, expr, e->v.Call.starargs);
2568 code |= 1;
2569 }
2570 if (e->v.Call.kwargs) {
2571 VISIT(c, expr, e->v.Call.kwargs);
2572 code |= 2;
2573 }
2574 switch (code) {
2575 case 0:
2576 ADDOP_I(c, CALL_FUNCTION, n);
2577 break;
2578 case 1:
2579 ADDOP_I(c, CALL_FUNCTION_VAR, n);
2580 break;
2581 case 2:
2582 ADDOP_I(c, CALL_FUNCTION_KW, n);
2583 break;
2584 case 3:
2585 ADDOP_I(c, CALL_FUNCTION_VAR_KW, n);
2586 break;
2587 }
2588 return 1;
2589}
2590
2591static int
Antoine Pitroud0c35152008-12-17 00:38:28 +00002592compiler_listcomp_generator(struct compiler *c, asdl_seq *generators,
2593 int gen_index, expr_ty elt)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002594{
2595 /* generate code for the iterator, then each of the ifs,
2596 and then write to the element */
2597
2598 comprehension_ty l;
2599 basicblock *start, *anchor, *skip, *if_cleanup;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002600 int i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002601
2602 start = compiler_new_block(c);
2603 skip = compiler_new_block(c);
2604 if_cleanup = compiler_new_block(c);
2605 anchor = compiler_new_block(c);
2606
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002607 if (start == NULL || skip == NULL || if_cleanup == NULL ||
2608 anchor == NULL)
2609 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002610
Anthony Baxter7b782b62006-04-11 12:01:56 +00002611 l = (comprehension_ty)asdl_seq_GET(generators, gen_index);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002612 VISIT(c, expr, l->iter);
2613 ADDOP(c, GET_ITER);
2614 compiler_use_next_block(c, start);
2615 ADDOP_JREL(c, FOR_ITER, anchor);
2616 NEXT_BLOCK(c);
2617 VISIT(c, expr, l->target);
2618
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002619 /* XXX this needs to be cleaned up...a lot! */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002620 n = asdl_seq_LEN(l->ifs);
2621 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00002622 expr_ty e = (expr_ty)asdl_seq_GET(l->ifs, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002623 VISIT(c, expr, e);
Jeffrey Yasskin68d68522009-02-28 19:03:21 +00002624 ADDOP_JABS(c, POP_JUMP_IF_FALSE, if_cleanup);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002625 NEXT_BLOCK(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002626 }
2627
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002628 if (++gen_index < asdl_seq_LEN(generators))
Antoine Pitroud0c35152008-12-17 00:38:28 +00002629 if (!compiler_listcomp_generator(c, generators, gen_index, elt))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002630 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002631
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002632 /* only append after the last for generator */
2633 if (gen_index >= asdl_seq_LEN(generators)) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002634 VISIT(c, expr, elt);
Antoine Pitroud0c35152008-12-17 00:38:28 +00002635 ADDOP_I(c, LIST_APPEND, gen_index+1);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002636
2637 compiler_use_next_block(c, skip);
2638 }
Jeffrey Yasskin68d68522009-02-28 19:03:21 +00002639 compiler_use_next_block(c, if_cleanup);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002640 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
2641 compiler_use_next_block(c, anchor);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002642
2643 return 1;
2644}
2645
2646static int
2647compiler_listcomp(struct compiler *c, expr_ty e)
2648{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002649 assert(e->kind == ListComp_kind);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002650 ADDOP_I(c, BUILD_LIST, 0);
Antoine Pitroud0c35152008-12-17 00:38:28 +00002651 return compiler_listcomp_generator(c, e->v.ListComp.generators, 0,
2652 e->v.ListComp.elt);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002653}
2654
Alexandre Vassalottib6465472010-01-11 22:36:12 +00002655/* Dict and set comprehensions and generator expressions work by creating a
2656 nested function to perform the actual iteration. This means that the
2657 iteration variables don't leak into the current scope.
2658 The defined function is called immediately following its definition, with the
2659 result of that call being the result of the expression.
2660 The LC/SC version returns the populated container, while the GE version is
2661 flagged in symtable.c as a generator, so it returns the generator object
2662 when the function is called.
2663 This code *knows* that the loop cannot contain break, continue, or return,
2664 so it cheats and skips the SETUP_LOOP/POP_BLOCK steps used in normal loops.
2665
2666 Possible cleanups:
2667 - iterate over the generator sequence instead of using recursion
2668*/
2669
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002670static int
Alexandre Vassalottib6465472010-01-11 22:36:12 +00002671compiler_comprehension_generator(struct compiler *c,
2672 asdl_seq *generators, int gen_index,
2673 expr_ty elt, expr_ty val, int type)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002674{
2675 /* generate code for the iterator, then each of the ifs,
2676 and then write to the element */
2677
Alexandre Vassalottib6465472010-01-11 22:36:12 +00002678 comprehension_ty gen;
2679 basicblock *start, *anchor, *skip, *if_cleanup;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002680 int i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002681
2682 start = compiler_new_block(c);
2683 skip = compiler_new_block(c);
2684 if_cleanup = compiler_new_block(c);
2685 anchor = compiler_new_block(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002686
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002687 if (start == NULL || skip == NULL || if_cleanup == NULL ||
Alexandre Vassalottib6465472010-01-11 22:36:12 +00002688 anchor == NULL)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002689 return 0;
2690
Alexandre Vassalottib6465472010-01-11 22:36:12 +00002691 gen = (comprehension_ty)asdl_seq_GET(generators, gen_index);
2692
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002693 if (gen_index == 0) {
2694 /* Receive outermost iter as an implicit argument */
2695 c->u->u_argcount = 1;
2696 ADDOP_I(c, LOAD_FAST, 0);
2697 }
2698 else {
2699 /* Sub-iter - calculate on the fly */
Alexandre Vassalottib6465472010-01-11 22:36:12 +00002700 VISIT(c, expr, gen->iter);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002701 ADDOP(c, GET_ITER);
2702 }
2703 compiler_use_next_block(c, start);
2704 ADDOP_JREL(c, FOR_ITER, anchor);
2705 NEXT_BLOCK(c);
Alexandre Vassalottib6465472010-01-11 22:36:12 +00002706 VISIT(c, expr, gen->target);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002707
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002708 /* XXX this needs to be cleaned up...a lot! */
Alexandre Vassalottib6465472010-01-11 22:36:12 +00002709 n = asdl_seq_LEN(gen->ifs);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002710 for (i = 0; i < n; i++) {
Alexandre Vassalottib6465472010-01-11 22:36:12 +00002711 expr_ty e = (expr_ty)asdl_seq_GET(gen->ifs, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002712 VISIT(c, expr, e);
Jeffrey Yasskin68d68522009-02-28 19:03:21 +00002713 ADDOP_JABS(c, POP_JUMP_IF_FALSE, if_cleanup);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002714 NEXT_BLOCK(c);
Jeffrey Yasskin68d68522009-02-28 19:03:21 +00002715 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002716
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002717 if (++gen_index < asdl_seq_LEN(generators))
Alexandre Vassalottib6465472010-01-11 22:36:12 +00002718 if (!compiler_comprehension_generator(c,
2719 generators, gen_index,
2720 elt, val, type))
2721 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002722
Alexandre Vassalottib6465472010-01-11 22:36:12 +00002723 /* only append after the last for generator */
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002724 if (gen_index >= asdl_seq_LEN(generators)) {
Alexandre Vassalottib6465472010-01-11 22:36:12 +00002725 /* comprehension specific code */
2726 switch (type) {
2727 case COMP_GENEXP:
2728 VISIT(c, expr, elt);
2729 ADDOP(c, YIELD_VALUE);
2730 ADDOP(c, POP_TOP);
2731 break;
2732 case COMP_SETCOMP:
2733 VISIT(c, expr, elt);
2734 ADDOP_I(c, SET_ADD, gen_index + 1);
2735 break;
2736 case COMP_DICTCOMP:
2737 /* With 'd[k] = v', v is evaluated before k, so we do
2738 the same. */
2739 VISIT(c, expr, val);
2740 VISIT(c, expr, elt);
2741 ADDOP_I(c, MAP_ADD, gen_index + 1);
2742 break;
2743 default:
2744 return 0;
2745 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002746
2747 compiler_use_next_block(c, skip);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002748 }
Jeffrey Yasskin68d68522009-02-28 19:03:21 +00002749 compiler_use_next_block(c, if_cleanup);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002750 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
2751 compiler_use_next_block(c, anchor);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002752
2753 return 1;
2754}
2755
2756static int
Alexandre Vassalottib6465472010-01-11 22:36:12 +00002757compiler_comprehension(struct compiler *c, expr_ty e, int type, identifier name,
2758 asdl_seq *generators, expr_ty elt, expr_ty val)
2759{
2760 PyCodeObject *co = NULL;
2761 expr_ty outermost_iter;
2762
2763 outermost_iter = ((comprehension_ty)
2764 asdl_seq_GET(generators, 0))->iter;
2765
2766 if (!compiler_enter_scope(c, name, (void *)e, e->lineno))
2767 goto error;
2768
2769 if (type != COMP_GENEXP) {
2770 int op;
2771 switch (type) {
2772 case COMP_SETCOMP:
2773 op = BUILD_SET;
2774 break;
2775 case COMP_DICTCOMP:
2776 op = BUILD_MAP;
2777 break;
2778 default:
2779 PyErr_Format(PyExc_SystemError,
2780 "unknown comprehension type %d", type);
2781 goto error_in_scope;
2782 }
2783
2784 ADDOP_I(c, op, 0);
2785 }
2786
2787 if (!compiler_comprehension_generator(c, generators, 0, elt,
2788 val, type))
2789 goto error_in_scope;
2790
2791 if (type != COMP_GENEXP) {
2792 ADDOP(c, RETURN_VALUE);
2793 }
2794
2795 co = assemble(c, 1);
2796 compiler_exit_scope(c);
2797 if (co == NULL)
2798 goto error;
2799
2800 if (!compiler_make_closure(c, co, 0))
2801 goto error;
2802 Py_DECREF(co);
2803
2804 VISIT(c, expr, outermost_iter);
2805 ADDOP(c, GET_ITER);
2806 ADDOP_I(c, CALL_FUNCTION, 1);
2807 return 1;
2808error_in_scope:
2809 compiler_exit_scope(c);
2810error:
2811 Py_XDECREF(co);
2812 return 0;
2813}
2814
2815static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002816compiler_genexp(struct compiler *c, expr_ty e)
2817{
Nick Coghlan944d3eb2005-11-16 12:46:55 +00002818 static identifier name;
Nick Coghlan944d3eb2005-11-16 12:46:55 +00002819 if (!name) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002820 name = PyString_FromString("<genexpr>");
Nick Coghlan944d3eb2005-11-16 12:46:55 +00002821 if (!name)
2822 return 0;
2823 }
Alexandre Vassalottib6465472010-01-11 22:36:12 +00002824 assert(e->kind == GeneratorExp_kind);
2825 return compiler_comprehension(c, e, COMP_GENEXP, name,
2826 e->v.GeneratorExp.generators,
2827 e->v.GeneratorExp.elt, NULL);
2828}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002829
Alexandre Vassalottib6465472010-01-11 22:36:12 +00002830static int
2831compiler_setcomp(struct compiler *c, expr_ty e)
2832{
2833 static identifier name;
2834 if (!name) {
2835 name = PyString_FromString("<setcomp>");
2836 if (!name)
2837 return 0;
2838 }
2839 assert(e->kind == SetComp_kind);
2840 return compiler_comprehension(c, e, COMP_SETCOMP, name,
2841 e->v.SetComp.generators,
2842 e->v.SetComp.elt, NULL);
2843}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002844
Alexandre Vassalottib6465472010-01-11 22:36:12 +00002845static int
2846compiler_dictcomp(struct compiler *c, expr_ty e)
2847{
2848 static identifier name;
2849 if (!name) {
2850 name = PyString_FromString("<dictcomp>");
2851 if (!name)
2852 return 0;
2853 }
2854 assert(e->kind == DictComp_kind);
2855 return compiler_comprehension(c, e, COMP_DICTCOMP, name,
2856 e->v.DictComp.generators,
2857 e->v.DictComp.key, e->v.DictComp.value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002858}
2859
2860static int
2861compiler_visit_keyword(struct compiler *c, keyword_ty k)
2862{
2863 ADDOP_O(c, LOAD_CONST, k->arg, consts);
2864 VISIT(c, expr, k->value);
2865 return 1;
2866}
2867
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002868/* Test whether expression is constant. For constants, report
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002869 whether they are true or false.
2870
2871 Return values: 1 for true, 0 for false, -1 for non-constant.
2872 */
2873
2874static int
2875expr_constant(expr_ty e)
2876{
2877 switch (e->kind) {
2878 case Num_kind:
2879 return PyObject_IsTrue(e->v.Num.n);
2880 case Str_kind:
2881 return PyObject_IsTrue(e->v.Str.s);
Georg Brandlddbaa662006-06-04 21:56:52 +00002882 case Name_kind:
2883 /* __debug__ is not assignable, so we can optimize
2884 * it away in if and while statements */
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002885 if (strcmp(PyString_AS_STRING(e->v.Name.id),
Jeremy Hylton819de6c2007-02-27 16:13:23 +00002886 "__debug__") == 0)
Georg Brandlddbaa662006-06-04 21:56:52 +00002887 return ! Py_OptimizeFlag;
2888 /* fall through */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002889 default:
2890 return -1;
2891 }
2892}
2893
Guido van Rossumc2e20742006-02-27 22:32:47 +00002894/*
2895 Implements the with statement from PEP 343.
2896
2897 The semantics outlined in that PEP are as follows:
2898
2899 with EXPR as VAR:
2900 BLOCK
2901
2902 It is implemented roughly as:
2903
Guido van Rossumda5b7012006-05-02 19:47:52 +00002904 context = EXPR
Guido van Rossumc2e20742006-02-27 22:32:47 +00002905 exit = context.__exit__ # not calling it
2906 value = context.__enter__()
2907 try:
2908 VAR = value # if VAR present in the syntax
2909 BLOCK
2910 finally:
2911 if an exception was raised:
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002912 exc = copy of (exception, instance, traceback)
Guido van Rossumc2e20742006-02-27 22:32:47 +00002913 else:
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002914 exc = (None, None, None)
Guido van Rossumc2e20742006-02-27 22:32:47 +00002915 exit(*exc)
2916 */
2917static int
2918compiler_with(struct compiler *c, stmt_ty s)
2919{
Guido van Rossumc2e20742006-02-27 22:32:47 +00002920 basicblock *block, *finally;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002921
2922 assert(s->kind == With_kind);
2923
Guido van Rossumc2e20742006-02-27 22:32:47 +00002924 block = compiler_new_block(c);
2925 finally = compiler_new_block(c);
2926 if (!block || !finally)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002927 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002928
Guido van Rossumda5b7012006-05-02 19:47:52 +00002929 /* Evaluate EXPR */
Guido van Rossumc2e20742006-02-27 22:32:47 +00002930 VISIT(c, expr, s->v.With.context_expr);
Benjamin Peterson1880d8b2009-05-25 13:13:44 +00002931 ADDOP_JREL(c, SETUP_WITH, finally);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002932
Benjamin Peterson1880d8b2009-05-25 13:13:44 +00002933 /* SETUP_WITH pushes a finally block. */
Guido van Rossumc2e20742006-02-27 22:32:47 +00002934 compiler_use_next_block(c, block);
Benjamin Peterson565d7852010-02-05 02:12:14 +00002935 /* Note that the block is actually called SETUP_WITH in ceval.c, but
2936 functions the same as SETUP_FINALLY except that exceptions are
2937 normalized. */
Guido van Rossumc2e20742006-02-27 22:32:47 +00002938 if (!compiler_push_fblock(c, FINALLY_TRY, block)) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002939 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002940 }
2941
2942 if (s->v.With.optional_vars) {
Benjamin Peterson1880d8b2009-05-25 13:13:44 +00002943 VISIT(c, expr, s->v.With.optional_vars);
2944 }
2945 else {
2946 /* Discard result from context.__enter__() */
2947 ADDOP(c, POP_TOP);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002948 }
2949
2950 /* BLOCK code */
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002951 VISIT_SEQ(c, stmt, s->v.With.body);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002952
2953 /* End of try block; start the finally block */
2954 ADDOP(c, POP_BLOCK);
2955 compiler_pop_fblock(c, FINALLY_TRY, block);
2956
2957 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2958 compiler_use_next_block(c, finally);
2959 if (!compiler_push_fblock(c, FINALLY_END, finally))
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002960 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002961
Nick Coghlan7af53be2008-03-07 14:13:28 +00002962 /* Finally block starts; context.__exit__ is on the stack under
2963 the exception or return information. Just issue our magic
2964 opcode. */
Guido van Rossumc2e20742006-02-27 22:32:47 +00002965 ADDOP(c, WITH_CLEANUP);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002966
2967 /* Finally block ends. */
2968 ADDOP(c, END_FINALLY);
2969 compiler_pop_fblock(c, FINALLY_END, finally);
2970 return 1;
2971}
2972
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002973static int
2974compiler_visit_expr(struct compiler *c, expr_ty e)
2975{
2976 int i, n;
2977
Neal Norwitzf733a012006-10-29 18:30:10 +00002978 /* If expr e has a different line number than the last expr/stmt,
Jeremy Hylton819de6c2007-02-27 16:13:23 +00002979 set a new line number for the next instruction.
2980 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002981 if (e->lineno > c->u->u_lineno) {
2982 c->u->u_lineno = e->lineno;
2983 c->u->u_lineno_set = false;
2984 }
2985 switch (e->kind) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002986 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002987 return compiler_boolop(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002988 case BinOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002989 VISIT(c, expr, e->v.BinOp.left);
2990 VISIT(c, expr, e->v.BinOp.right);
2991 ADDOP(c, binop(c, e->v.BinOp.op));
2992 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002993 case UnaryOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002994 VISIT(c, expr, e->v.UnaryOp.operand);
2995 ADDOP(c, unaryop(e->v.UnaryOp.op));
2996 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002997 case Lambda_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002998 return compiler_lambda(c, e);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002999 case IfExp_kind:
3000 return compiler_ifexp(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003001 case Dict_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003002 n = asdl_seq_LEN(e->v.Dict.values);
Raymond Hettinger70fcfd02007-12-19 22:14:34 +00003003 ADDOP_I(c, BUILD_MAP, (n>0xFFFF ? 0xFFFF : n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003004 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00003005 VISIT(c, expr,
Jeremy Hylton819de6c2007-02-27 16:13:23 +00003006 (expr_ty)asdl_seq_GET(e->v.Dict.values, i));
Anthony Baxter7b782b62006-04-11 12:01:56 +00003007 VISIT(c, expr,
Jeremy Hylton819de6c2007-02-27 16:13:23 +00003008 (expr_ty)asdl_seq_GET(e->v.Dict.keys, i));
Raymond Hettingereffde122007-12-18 18:26:18 +00003009 ADDOP(c, STORE_MAP);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003010 }
3011 break;
Alexandre Vassalottiee936a22010-01-09 23:35:54 +00003012 case Set_kind:
3013 n = asdl_seq_LEN(e->v.Set.elts);
3014 VISIT_SEQ(c, expr, e->v.Set.elts);
3015 ADDOP_I(c, BUILD_SET, n);
3016 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003017 case ListComp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003018 return compiler_listcomp(c, e);
Alexandre Vassalottib6465472010-01-11 22:36:12 +00003019 case SetComp_kind:
3020 return compiler_setcomp(c, e);
3021 case DictComp_kind:
3022 return compiler_dictcomp(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003023 case GeneratorExp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003024 return compiler_genexp(c, e);
3025 case Yield_kind:
3026 if (c->u->u_ste->ste_type != FunctionBlock)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003027 return compiler_error(c, "'yield' outside function");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003028 if (e->v.Yield.value) {
3029 VISIT(c, expr, e->v.Yield.value);
3030 }
3031 else {
3032 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3033 }
3034 ADDOP(c, YIELD_VALUE);
3035 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003036 case Compare_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003037 return compiler_compare(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003038 case Call_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003039 return compiler_call(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003040 case Repr_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003041 VISIT(c, expr, e->v.Repr.value);
3042 ADDOP(c, UNARY_CONVERT);
3043 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003044 case Num_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003045 ADDOP_O(c, LOAD_CONST, e->v.Num.n, consts);
3046 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003047 case Str_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003048 ADDOP_O(c, LOAD_CONST, e->v.Str.s, consts);
3049 break;
3050 /* The following exprs can be assignment targets. */
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003051 case Attribute_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003052 if (e->v.Attribute.ctx != AugStore)
3053 VISIT(c, expr, e->v.Attribute.value);
3054 switch (e->v.Attribute.ctx) {
3055 case AugLoad:
3056 ADDOP(c, DUP_TOP);
3057 /* Fall through to load */
3058 case Load:
3059 ADDOP_NAME(c, LOAD_ATTR, e->v.Attribute.attr, names);
3060 break;
3061 case AugStore:
3062 ADDOP(c, ROT_TWO);
3063 /* Fall through to save */
3064 case Store:
3065 ADDOP_NAME(c, STORE_ATTR, e->v.Attribute.attr, names);
3066 break;
3067 case Del:
3068 ADDOP_NAME(c, DELETE_ATTR, e->v.Attribute.attr, names);
3069 break;
3070 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003071 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00003072 PyErr_SetString(PyExc_SystemError,
3073 "param invalid in attribute expression");
3074 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003075 }
3076 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003077 case Subscript_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003078 switch (e->v.Subscript.ctx) {
3079 case AugLoad:
3080 VISIT(c, expr, e->v.Subscript.value);
3081 VISIT_SLICE(c, e->v.Subscript.slice, AugLoad);
3082 break;
3083 case Load:
3084 VISIT(c, expr, e->v.Subscript.value);
3085 VISIT_SLICE(c, e->v.Subscript.slice, Load);
3086 break;
3087 case AugStore:
3088 VISIT_SLICE(c, e->v.Subscript.slice, AugStore);
3089 break;
3090 case Store:
3091 VISIT(c, expr, e->v.Subscript.value);
3092 VISIT_SLICE(c, e->v.Subscript.slice, Store);
3093 break;
3094 case Del:
3095 VISIT(c, expr, e->v.Subscript.value);
3096 VISIT_SLICE(c, e->v.Subscript.slice, Del);
3097 break;
3098 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003099 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00003100 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003101 "param invalid in subscript expression");
Neal Norwitz4737b232005-11-19 23:58:29 +00003102 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003103 }
3104 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003105 case Name_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003106 return compiler_nameop(c, e->v.Name.id, e->v.Name.ctx);
3107 /* child nodes of List and Tuple will have expr_context set */
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003108 case List_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003109 return compiler_list(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003110 case Tuple_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003111 return compiler_tuple(c, e);
3112 }
3113 return 1;
3114}
3115
3116static int
3117compiler_augassign(struct compiler *c, stmt_ty s)
3118{
3119 expr_ty e = s->v.AugAssign.target;
3120 expr_ty auge;
3121
3122 assert(s->kind == AugAssign_kind);
3123
3124 switch (e->kind) {
Neal Norwitz2585ad52006-06-12 02:09:34 +00003125 case Attribute_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003126 auge = Attribute(e->v.Attribute.value, e->v.Attribute.attr,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003127 AugLoad, e->lineno, e->col_offset, c->c_arena);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003128 if (auge == NULL)
3129 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003130 VISIT(c, expr, auge);
3131 VISIT(c, expr, s->v.AugAssign.value);
3132 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
3133 auge->v.Attribute.ctx = AugStore;
3134 VISIT(c, expr, auge);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003135 break;
3136 case Subscript_kind:
3137 auge = Subscript(e->v.Subscript.value, e->v.Subscript.slice,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003138 AugLoad, e->lineno, e->col_offset, c->c_arena);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003139 if (auge == NULL)
3140 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003141 VISIT(c, expr, auge);
3142 VISIT(c, expr, s->v.AugAssign.value);
3143 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003144 auge->v.Subscript.ctx = AugStore;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003145 VISIT(c, expr, auge);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003146 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003147 case Name_kind:
Neil Schemenauer0e07b602006-07-09 16:16:34 +00003148 if (!compiler_nameop(c, e->v.Name.id, Load))
3149 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003150 VISIT(c, expr, s->v.AugAssign.value);
3151 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
3152 return compiler_nameop(c, e->v.Name.id, Store);
3153 default:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003154 PyErr_Format(PyExc_SystemError,
3155 "invalid node type (%d) for augmented assignment",
3156 e->kind);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003157 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003158 }
3159 return 1;
3160}
3161
3162static int
3163compiler_push_fblock(struct compiler *c, enum fblocktype t, basicblock *b)
3164{
3165 struct fblockinfo *f;
Neal Norwitz21997af2006-10-28 21:19:07 +00003166 if (c->u->u_nfblocks >= CO_MAXBLOCKS) {
3167 PyErr_SetString(PyExc_SystemError,
3168 "too many statically nested blocks");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003169 return 0;
Neal Norwitz21997af2006-10-28 21:19:07 +00003170 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003171 f = &c->u->u_fblock[c->u->u_nfblocks++];
3172 f->fb_type = t;
3173 f->fb_block = b;
3174 return 1;
3175}
3176
3177static void
3178compiler_pop_fblock(struct compiler *c, enum fblocktype t, basicblock *b)
3179{
3180 struct compiler_unit *u = c->u;
3181 assert(u->u_nfblocks > 0);
3182 u->u_nfblocks--;
3183 assert(u->u_fblock[u->u_nfblocks].fb_type == t);
3184 assert(u->u_fblock[u->u_nfblocks].fb_block == b);
3185}
3186
Jeremy Hylton82271f12006-10-04 02:24:52 +00003187static int
3188compiler_in_loop(struct compiler *c) {
Jeremy Hylton819de6c2007-02-27 16:13:23 +00003189 int i;
3190 struct compiler_unit *u = c->u;
3191 for (i = 0; i < u->u_nfblocks; ++i) {
3192 if (u->u_fblock[i].fb_type == LOOP)
3193 return 1;
3194 }
3195 return 0;
Jeremy Hylton82271f12006-10-04 02:24:52 +00003196}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003197/* Raises a SyntaxError and returns 0.
3198 If something goes wrong, a different exception may be raised.
3199*/
3200
3201static int
3202compiler_error(struct compiler *c, const char *errstr)
3203{
3204 PyObject *loc;
3205 PyObject *u = NULL, *v = NULL;
3206
3207 loc = PyErr_ProgramText(c->c_filename, c->u->u_lineno);
3208 if (!loc) {
3209 Py_INCREF(Py_None);
3210 loc = Py_None;
3211 }
3212 u = Py_BuildValue("(ziOO)", c->c_filename, c->u->u_lineno,
3213 Py_None, loc);
3214 if (!u)
3215 goto exit;
3216 v = Py_BuildValue("(zO)", errstr, u);
3217 if (!v)
3218 goto exit;
3219 PyErr_SetObject(PyExc_SyntaxError, v);
3220 exit:
3221 Py_DECREF(loc);
3222 Py_XDECREF(u);
3223 Py_XDECREF(v);
3224 return 0;
3225}
3226
3227static int
3228compiler_handle_subscr(struct compiler *c, const char *kind,
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003229 expr_context_ty ctx)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003230{
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003231 int op = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003232
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003233 /* XXX this code is duplicated */
3234 switch (ctx) {
3235 case AugLoad: /* fall through to Load */
3236 case Load: op = BINARY_SUBSCR; break;
3237 case AugStore:/* fall through to Store */
3238 case Store: op = STORE_SUBSCR; break;
3239 case Del: op = DELETE_SUBSCR; break;
3240 case Param:
3241 PyErr_Format(PyExc_SystemError,
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003242 "invalid %s kind %d in subscript\n",
3243 kind, ctx);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003244 return 0;
3245 }
3246 if (ctx == AugLoad) {
3247 ADDOP_I(c, DUP_TOPX, 2);
3248 }
3249 else if (ctx == AugStore) {
3250 ADDOP(c, ROT_THREE);
3251 }
3252 ADDOP(c, op);
3253 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003254}
3255
3256static int
3257compiler_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)
3258{
3259 int n = 2;
3260 assert(s->kind == Slice_kind);
3261
3262 /* only handles the cases where BUILD_SLICE is emitted */
3263 if (s->v.Slice.lower) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003264 VISIT(c, expr, s->v.Slice.lower);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003265 }
3266 else {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003267 ADDOP_O(c, LOAD_CONST, Py_None, consts);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003268 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003269
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003270 if (s->v.Slice.upper) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003271 VISIT(c, expr, s->v.Slice.upper);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003272 }
3273 else {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003274 ADDOP_O(c, LOAD_CONST, Py_None, consts);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003275 }
3276
3277 if (s->v.Slice.step) {
3278 n++;
3279 VISIT(c, expr, s->v.Slice.step);
3280 }
3281 ADDOP_I(c, BUILD_SLICE, n);
3282 return 1;
3283}
3284
3285static int
3286compiler_simple_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)
3287{
3288 int op = 0, slice_offset = 0, stack_count = 0;
3289
3290 assert(s->v.Slice.step == NULL);
3291 if (s->v.Slice.lower) {
3292 slice_offset++;
3293 stack_count++;
3294 if (ctx != AugStore)
3295 VISIT(c, expr, s->v.Slice.lower);
3296 }
3297 if (s->v.Slice.upper) {
3298 slice_offset += 2;
3299 stack_count++;
3300 if (ctx != AugStore)
3301 VISIT(c, expr, s->v.Slice.upper);
3302 }
3303
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003304 if (ctx == AugLoad) {
3305 switch (stack_count) {
3306 case 0: ADDOP(c, DUP_TOP); break;
3307 case 1: ADDOP_I(c, DUP_TOPX, 2); break;
3308 case 2: ADDOP_I(c, DUP_TOPX, 3); break;
3309 }
3310 }
3311 else if (ctx == AugStore) {
3312 switch (stack_count) {
3313 case 0: ADDOP(c, ROT_TWO); break;
3314 case 1: ADDOP(c, ROT_THREE); break;
3315 case 2: ADDOP(c, ROT_FOUR); break;
3316 }
3317 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003318
3319 switch (ctx) {
3320 case AugLoad: /* fall through to Load */
3321 case Load: op = SLICE; break;
3322 case AugStore:/* fall through to Store */
3323 case Store: op = STORE_SLICE; break;
3324 case Del: op = DELETE_SLICE; break;
Neal Norwitz4737b232005-11-19 23:58:29 +00003325 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003326 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00003327 PyErr_SetString(PyExc_SystemError,
3328 "param invalid in simple slice");
3329 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003330 }
3331
3332 ADDOP(c, op + slice_offset);
3333 return 1;
3334}
3335
3336static int
3337compiler_visit_nested_slice(struct compiler *c, slice_ty s,
3338 expr_context_ty ctx)
3339{
3340 switch (s->kind) {
3341 case Ellipsis_kind:
3342 ADDOP_O(c, LOAD_CONST, Py_Ellipsis, consts);
3343 break;
3344 case Slice_kind:
3345 return compiler_slice(c, s, ctx);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003346 case Index_kind:
3347 VISIT(c, expr, s->v.Index.value);
3348 break;
3349 case ExtSlice_kind:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003350 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00003351 PyErr_SetString(PyExc_SystemError,
3352 "extended slice invalid in nested slice");
3353 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003354 }
3355 return 1;
3356}
3357
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003358static int
3359compiler_visit_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)
3360{
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003361 char * kindname = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003362 switch (s->kind) {
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003363 case Index_kind:
3364 kindname = "index";
3365 if (ctx != AugStore) {
3366 VISIT(c, expr, s->v.Index.value);
3367 }
3368 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003369 case Ellipsis_kind:
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003370 kindname = "ellipsis";
3371 if (ctx != AugStore) {
3372 ADDOP_O(c, LOAD_CONST, Py_Ellipsis, consts);
3373 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003374 break;
3375 case Slice_kind:
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003376 kindname = "slice";
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003377 if (!s->v.Slice.step)
3378 return compiler_simple_slice(c, s, ctx);
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003379 if (ctx != AugStore) {
3380 if (!compiler_slice(c, s, ctx))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003381 return 0;
3382 }
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003383 break;
3384 case ExtSlice_kind:
3385 kindname = "extended slice";
3386 if (ctx != AugStore) {
3387 int i, n = asdl_seq_LEN(s->v.ExtSlice.dims);
3388 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00003389 slice_ty sub = (slice_ty)asdl_seq_GET(
Jeremy Hylton819de6c2007-02-27 16:13:23 +00003390 s->v.ExtSlice.dims, i);
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003391 if (!compiler_visit_nested_slice(c, sub, ctx))
3392 return 0;
3393 }
3394 ADDOP_I(c, BUILD_TUPLE, n);
3395 }
3396 break;
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003397 default:
3398 PyErr_Format(PyExc_SystemError,
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003399 "invalid subscript kind %d", s->kind);
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003400 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003401 }
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003402 return compiler_handle_subscr(c, kindname, ctx);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003403}
3404
Neal Norwitzf733a012006-10-29 18:30:10 +00003405
3406/* End of the compiler section, beginning of the assembler section */
3407
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003408/* do depth-first search of basic block graph, starting with block.
3409 post records the block indices in post-order.
3410
3411 XXX must handle implicit jumps from one block to next
3412*/
3413
Neal Norwitzf733a012006-10-29 18:30:10 +00003414struct assembler {
3415 PyObject *a_bytecode; /* string containing bytecode */
3416 int a_offset; /* offset into bytecode */
3417 int a_nblocks; /* number of reachable blocks */
3418 basicblock **a_postorder; /* list of blocks in dfs postorder */
3419 PyObject *a_lnotab; /* string containing lnotab */
3420 int a_lnotab_off; /* offset into lnotab */
3421 int a_lineno; /* last lineno of emitted instruction */
3422 int a_lineno_off; /* bytecode offset of last lineno */
3423};
3424
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003425static void
3426dfs(struct compiler *c, basicblock *b, struct assembler *a)
3427{
3428 int i;
3429 struct instr *instr = NULL;
3430
3431 if (b->b_seen)
3432 return;
3433 b->b_seen = 1;
3434 if (b->b_next != NULL)
3435 dfs(c, b->b_next, a);
3436 for (i = 0; i < b->b_iused; i++) {
3437 instr = &b->b_instr[i];
3438 if (instr->i_jrel || instr->i_jabs)
3439 dfs(c, instr->i_target, a);
3440 }
3441 a->a_postorder[a->a_nblocks++] = b;
3442}
3443
Neal Norwitz2744c6c2005-11-13 01:08:38 +00003444static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003445stackdepth_walk(struct compiler *c, basicblock *b, int depth, int maxdepth)
3446{
Neil Schemenauer7fdd1cb2009-10-14 17:17:14 +00003447 int i, target_depth;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003448 struct instr *instr;
3449 if (b->b_seen || b->b_startdepth >= depth)
3450 return maxdepth;
3451 b->b_seen = 1;
3452 b->b_startdepth = depth;
3453 for (i = 0; i < b->b_iused; i++) {
3454 instr = &b->b_instr[i];
3455 depth += opcode_stack_effect(instr->i_opcode, instr->i_oparg);
3456 if (depth > maxdepth)
3457 maxdepth = depth;
3458 assert(depth >= 0); /* invalid code or bug in stackdepth() */
3459 if (instr->i_jrel || instr->i_jabs) {
Neil Schemenauer7fdd1cb2009-10-14 17:17:14 +00003460 target_depth = depth;
3461 if (instr->i_opcode == FOR_ITER) {
3462 target_depth = depth-2;
3463 } else if (instr->i_opcode == SETUP_FINALLY ||
3464 instr->i_opcode == SETUP_EXCEPT) {
3465 target_depth = depth+3;
3466 if (target_depth > maxdepth)
3467 maxdepth = target_depth;
3468 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003469 maxdepth = stackdepth_walk(c, instr->i_target,
Neil Schemenauer7fdd1cb2009-10-14 17:17:14 +00003470 target_depth, maxdepth);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003471 if (instr->i_opcode == JUMP_ABSOLUTE ||
3472 instr->i_opcode == JUMP_FORWARD) {
3473 goto out; /* remaining code is dead */
3474 }
3475 }
3476 }
3477 if (b->b_next)
3478 maxdepth = stackdepth_walk(c, b->b_next, depth, maxdepth);
3479out:
3480 b->b_seen = 0;
3481 return maxdepth;
3482}
3483
3484/* Find the flow path that needs the largest stack. We assume that
3485 * cycles in the flow graph have no net effect on the stack depth.
3486 */
3487static int
3488stackdepth(struct compiler *c)
3489{
3490 basicblock *b, *entryblock;
3491 entryblock = NULL;
3492 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
3493 b->b_seen = 0;
3494 b->b_startdepth = INT_MIN;
3495 entryblock = b;
3496 }
Neal Norwitzf71847e2006-07-23 07:51:58 +00003497 if (!entryblock)
3498 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003499 return stackdepth_walk(c, entryblock, 0, 0);
3500}
3501
3502static int
3503assemble_init(struct assembler *a, int nblocks, int firstlineno)
3504{
3505 memset(a, 0, sizeof(struct assembler));
3506 a->a_lineno = firstlineno;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003507 a->a_bytecode = PyString_FromStringAndSize(NULL, DEFAULT_CODE_SIZE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003508 if (!a->a_bytecode)
3509 return 0;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003510 a->a_lnotab = PyString_FromStringAndSize(NULL, DEFAULT_LNOTAB_SIZE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003511 if (!a->a_lnotab)
3512 return 0;
Gregory P. Smith9d534572008-06-11 07:41:16 +00003513 if (nblocks > PY_SIZE_MAX / sizeof(basicblock *)) {
3514 PyErr_NoMemory();
3515 return 0;
3516 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003517 a->a_postorder = (basicblock **)PyObject_Malloc(
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003518 sizeof(basicblock *) * nblocks);
Neal Norwitz87b801c2005-12-18 04:42:47 +00003519 if (!a->a_postorder) {
3520 PyErr_NoMemory();
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003521 return 0;
Neal Norwitz87b801c2005-12-18 04:42:47 +00003522 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003523 return 1;
3524}
3525
3526static void
3527assemble_free(struct assembler *a)
3528{
3529 Py_XDECREF(a->a_bytecode);
3530 Py_XDECREF(a->a_lnotab);
3531 if (a->a_postorder)
3532 PyObject_Free(a->a_postorder);
3533}
3534
3535/* Return the size of a basic block in bytes. */
3536
3537static int
3538instrsize(struct instr *instr)
3539{
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003540 if (!instr->i_hasarg)
Raymond Hettingerdff1fd92007-12-20 01:25:05 +00003541 return 1; /* 1 byte for the opcode*/
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003542 if (instr->i_oparg > 0xffff)
Raymond Hettingerdff1fd92007-12-20 01:25:05 +00003543 return 6; /* 1 (opcode) + 1 (EXTENDED_ARG opcode) + 2 (oparg) + 2(oparg extended) */
3544 return 3; /* 1 (opcode) + 2 (oparg) */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003545}
3546
3547static int
3548blocksize(basicblock *b)
3549{
3550 int i;
3551 int size = 0;
3552
3553 for (i = 0; i < b->b_iused; i++)
3554 size += instrsize(&b->b_instr[i]);
3555 return size;
3556}
3557
Jeffrey Yasskin655d8352009-05-23 23:23:01 +00003558/* Appends a pair to the end of the line number table, a_lnotab, representing
3559 the instruction's bytecode offset and line number. See
3560 Objects/lnotab_notes.txt for the description of the line number table. */
Tim Peters2a7f3842001-06-09 09:26:21 +00003561
Guido van Rossumf68d8e52001-04-14 17:55:09 +00003562static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003563assemble_lnotab(struct assembler *a, struct instr *i)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003564{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003565 int d_bytecode, d_lineno;
3566 int len;
Neal Norwitzb183a252006-04-10 01:03:32 +00003567 unsigned char *lnotab;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003568
3569 d_bytecode = a->a_offset - a->a_lineno_off;
3570 d_lineno = i->i_lineno - a->a_lineno;
3571
3572 assert(d_bytecode >= 0);
3573 assert(d_lineno >= 0);
3574
Amaury Forgeot d'Arc99af7db2008-02-05 00:26:21 +00003575 if(d_bytecode == 0 && d_lineno == 0)
3576 return 1;
3577
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003578 if (d_bytecode > 255) {
Neal Norwitz08b401f2006-01-07 21:24:09 +00003579 int j, nbytes, ncodes = d_bytecode / 255;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003580 nbytes = a->a_lnotab_off + 2 * ncodes;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003581 len = PyString_GET_SIZE(a->a_lnotab);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003582 if (nbytes >= len) {
Gregory P. Smith9d534572008-06-11 07:41:16 +00003583 if ((len <= INT_MAX / 2) && (len * 2 < nbytes))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003584 len = nbytes;
Gregory P. Smith9d534572008-06-11 07:41:16 +00003585 else if (len <= INT_MAX / 2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003586 len *= 2;
Gregory P. Smith9d534572008-06-11 07:41:16 +00003587 else {
3588 PyErr_NoMemory();
3589 return 0;
3590 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003591 if (_PyString_Resize(&a->a_lnotab, len) < 0)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003592 return 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003593 }
Neal Norwitzb183a252006-04-10 01:03:32 +00003594 lnotab = (unsigned char *)
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003595 PyString_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
Neal Norwitz08b401f2006-01-07 21:24:09 +00003596 for (j = 0; j < ncodes; j++) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003597 *lnotab++ = 255;
3598 *lnotab++ = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003599 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003600 d_bytecode -= ncodes * 255;
3601 a->a_lnotab_off += ncodes * 2;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003602 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003603 assert(d_bytecode <= 255);
3604 if (d_lineno > 255) {
Neal Norwitz08b401f2006-01-07 21:24:09 +00003605 int j, nbytes, ncodes = d_lineno / 255;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003606 nbytes = a->a_lnotab_off + 2 * ncodes;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003607 len = PyString_GET_SIZE(a->a_lnotab);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003608 if (nbytes >= len) {
Gregory P. Smith9d534572008-06-11 07:41:16 +00003609 if ((len <= INT_MAX / 2) && len * 2 < nbytes)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003610 len = nbytes;
Gregory P. Smith9d534572008-06-11 07:41:16 +00003611 else if (len <= INT_MAX / 2)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003612 len *= 2;
Gregory P. Smith9d534572008-06-11 07:41:16 +00003613 else {
3614 PyErr_NoMemory();
3615 return 0;
3616 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003617 if (_PyString_Resize(&a->a_lnotab, len) < 0)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003618 return 0;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003619 }
Neal Norwitzb183a252006-04-10 01:03:32 +00003620 lnotab = (unsigned char *)
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003621 PyString_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003622 *lnotab++ = d_bytecode;
Neal Norwitz84be93b2006-07-16 01:50:38 +00003623 *lnotab++ = 255;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003624 d_bytecode = 0;
Neal Norwitz08b401f2006-01-07 21:24:09 +00003625 for (j = 1; j < ncodes; j++) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003626 *lnotab++ = 0;
Neal Norwitz84be93b2006-07-16 01:50:38 +00003627 *lnotab++ = 255;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003628 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003629 d_lineno -= ncodes * 255;
3630 a->a_lnotab_off += ncodes * 2;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003631 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003632
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003633 len = PyString_GET_SIZE(a->a_lnotab);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003634 if (a->a_lnotab_off + 2 >= len) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003635 if (_PyString_Resize(&a->a_lnotab, len * 2) < 0)
Tim Peters51e26512001-09-07 08:45:55 +00003636 return 0;
Tim Peters51e26512001-09-07 08:45:55 +00003637 }
Neal Norwitzb183a252006-04-10 01:03:32 +00003638 lnotab = (unsigned char *)
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003639 PyString_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
Tim Peters51e26512001-09-07 08:45:55 +00003640
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003641 a->a_lnotab_off += 2;
3642 if (d_bytecode) {
3643 *lnotab++ = d_bytecode;
3644 *lnotab++ = d_lineno;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00003645 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003646 else { /* First line of a block; def stmt, etc. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003647 *lnotab++ = 0;
3648 *lnotab++ = d_lineno;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003649 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003650 a->a_lineno = i->i_lineno;
3651 a->a_lineno_off = a->a_offset;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003652 return 1;
3653}
3654
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003655/* assemble_emit()
3656 Extend the bytecode with a new instruction.
3657 Update lnotab if necessary.
Jeremy Hylton376e63d2003-08-28 14:42:14 +00003658*/
3659
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003660static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003661assemble_emit(struct assembler *a, struct instr *i)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003662{
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003663 int size, arg = 0, ext = 0;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003664 Py_ssize_t len = PyString_GET_SIZE(a->a_bytecode);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003665 char *code;
3666
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003667 size = instrsize(i);
3668 if (i->i_hasarg) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003669 arg = i->i_oparg;
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003670 ext = arg >> 16;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003671 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003672 if (i->i_lineno && !assemble_lnotab(a, i))
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003673 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003674 if (a->a_offset + size >= len) {
Gregory P. Smith9d534572008-06-11 07:41:16 +00003675 if (len > PY_SSIZE_T_MAX / 2)
3676 return 0;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003677 if (_PyString_Resize(&a->a_bytecode, len * 2) < 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003678 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003679 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003680 code = PyString_AS_STRING(a->a_bytecode) + a->a_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003681 a->a_offset += size;
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003682 if (size == 6) {
3683 assert(i->i_hasarg);
3684 *code++ = (char)EXTENDED_ARG;
3685 *code++ = ext & 0xff;
3686 *code++ = ext >> 8;
3687 arg &= 0xffff;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00003688 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003689 *code++ = i->i_opcode;
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003690 if (i->i_hasarg) {
3691 assert(size == 3 || size == 6);
3692 *code++ = arg & 0xff;
3693 *code++ = arg >> 8;
3694 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003695 return 1;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00003696}
3697
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003698static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003699assemble_jump_offsets(struct assembler *a, struct compiler *c)
Anthony Baxterc2a5a632004-08-02 06:10:11 +00003700{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003701 basicblock *b;
Benjamin Petersoncef97822009-11-20 02:15:50 +00003702 int bsize, totsize, extended_arg_count = 0, last_extended_arg_count;
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003703 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003704
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003705 /* Compute the size of each block and fixup jump args.
3706 Replace block pointer with position in bytecode. */
Benjamin Petersoncef97822009-11-20 02:15:50 +00003707 do {
3708 totsize = 0;
3709 for (i = a->a_nblocks - 1; i >= 0; i--) {
3710 b = a->a_postorder[i];
3711 bsize = blocksize(b);
3712 b->b_offset = totsize;
3713 totsize += bsize;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003714 }
Benjamin Petersoncef97822009-11-20 02:15:50 +00003715 last_extended_arg_count = extended_arg_count;
3716 extended_arg_count = 0;
3717 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
3718 bsize = b->b_offset;
3719 for (i = 0; i < b->b_iused; i++) {
3720 struct instr *instr = &b->b_instr[i];
3721 /* Relative jumps are computed relative to
3722 the instruction pointer after fetching
3723 the jump instruction.
3724 */
3725 bsize += instrsize(instr);
3726 if (instr->i_jabs)
3727 instr->i_oparg = instr->i_target->b_offset;
3728 else if (instr->i_jrel) {
3729 int delta = instr->i_target->b_offset - bsize;
3730 instr->i_oparg = delta;
3731 }
3732 else
3733 continue;
3734 if (instr->i_oparg > 0xffff)
3735 extended_arg_count++;
3736 }
3737 }
Neal Norwitzf1d50682005-10-23 23:00:41 +00003738
3739 /* XXX: This is an awful hack that could hurt performance, but
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003740 on the bright side it should work until we come up
Neal Norwitzf1d50682005-10-23 23:00:41 +00003741 with a better solution.
3742
Neal Norwitzf1d50682005-10-23 23:00:41 +00003743 The issue is that in the first loop blocksize() is called
3744 which calls instrsize() which requires i_oparg be set
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003745 appropriately. There is a bootstrap problem because
Neal Norwitzf1d50682005-10-23 23:00:41 +00003746 i_oparg is calculated in the second loop above.
3747
3748 So we loop until we stop seeing new EXTENDED_ARGs.
3749 The only EXTENDED_ARGs that could be popping up are
3750 ones in jump instructions. So this should converge
3751 fairly quickly.
3752 */
Benjamin Petersoncef97822009-11-20 02:15:50 +00003753 } while (last_extended_arg_count != extended_arg_count);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003754}
3755
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003756static PyObject *
3757dict_keys_inorder(PyObject *dict, int offset)
3758{
3759 PyObject *tuple, *k, *v;
Martin v. Löwis18e16552006-02-15 17:27:45 +00003760 Py_ssize_t i, pos = 0, size = PyDict_Size(dict);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003761
3762 tuple = PyTuple_New(size);
3763 if (tuple == NULL)
3764 return NULL;
3765 while (PyDict_Next(dict, &pos, &k, &v)) {
3766 i = PyInt_AS_LONG(v);
Benjamin Petersonda9327f2009-01-31 23:43:25 +00003767 /* The keys of the dictionary are tuples. (see compiler_add_o)
3768 The object we want is always first, though. */
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003769 k = PyTuple_GET_ITEM(k, 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003770 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00003771 assert((i - offset) < size);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003772 assert((i - offset) >= 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003773 PyTuple_SET_ITEM(tuple, i - offset, k);
3774 }
3775 return tuple;
3776}
3777
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003778static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003779compute_code_flags(struct compiler *c)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003780{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003781 PySTEntryObject *ste = c->u->u_ste;
3782 int flags = 0, n;
3783 if (ste->ste_type != ModuleBlock)
3784 flags |= CO_NEWLOCALS;
3785 if (ste->ste_type == FunctionBlock) {
3786 if (!ste->ste_unoptimized)
3787 flags |= CO_OPTIMIZED;
3788 if (ste->ste_nested)
3789 flags |= CO_NESTED;
3790 if (ste->ste_generator)
3791 flags |= CO_GENERATOR;
Benjamin Peterson12554cb2009-01-31 23:54:38 +00003792 if (ste->ste_varargs)
3793 flags |= CO_VARARGS;
3794 if (ste->ste_varkeywords)
3795 flags |= CO_VARKEYWORDS;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003796 }
Thomas Wouters5e9f1fa2006-02-28 20:02:27 +00003797
3798 /* (Only) inherit compilerflags in PyCF_MASK */
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003799 flags |= (c->c_flags->cf_flags & PyCF_MASK);
Thomas Wouters5e9f1fa2006-02-28 20:02:27 +00003800
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003801 n = PyDict_Size(c->u->u_freevars);
3802 if (n < 0)
3803 return -1;
3804 if (n == 0) {
3805 n = PyDict_Size(c->u->u_cellvars);
3806 if (n < 0)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00003807 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003808 if (n == 0) {
3809 flags |= CO_NOFREE;
3810 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003811 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00003812
Jeremy Hylton29906ee2001-02-27 04:23:34 +00003813 return flags;
3814}
3815
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003816static PyCodeObject *
3817makecode(struct compiler *c, struct assembler *a)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003818{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003819 PyObject *tmp;
3820 PyCodeObject *co = NULL;
3821 PyObject *consts = NULL;
3822 PyObject *names = NULL;
3823 PyObject *varnames = NULL;
3824 PyObject *filename = NULL;
3825 PyObject *name = NULL;
3826 PyObject *freevars = NULL;
3827 PyObject *cellvars = NULL;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003828 PyObject *bytecode = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003829 int nlocals, flags;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003830
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003831 tmp = dict_keys_inorder(c->u->u_consts, 0);
3832 if (!tmp)
3833 goto error;
3834 consts = PySequence_List(tmp); /* optimize_code requires a list */
3835 Py_DECREF(tmp);
3836
3837 names = dict_keys_inorder(c->u->u_names, 0);
3838 varnames = dict_keys_inorder(c->u->u_varnames, 0);
3839 if (!consts || !names || !varnames)
3840 goto error;
3841
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003842 cellvars = dict_keys_inorder(c->u->u_cellvars, 0);
3843 if (!cellvars)
3844 goto error;
3845 freevars = dict_keys_inorder(c->u->u_freevars, PyTuple_Size(cellvars));
3846 if (!freevars)
3847 goto error;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003848 filename = PyString_FromString(c->c_filename);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003849 if (!filename)
3850 goto error;
3851
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003852 nlocals = PyDict_Size(c->u->u_varnames);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003853 flags = compute_code_flags(c);
3854 if (flags < 0)
3855 goto error;
3856
Jeremy Hylton644dddc2006-08-21 16:19:37 +00003857 bytecode = PyCode_Optimize(a->a_bytecode, consts, names, a->a_lnotab);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003858 if (!bytecode)
3859 goto error;
3860
3861 tmp = PyList_AsTuple(consts); /* PyCode_New requires a tuple */
3862 if (!tmp)
3863 goto error;
3864 Py_DECREF(consts);
3865 consts = tmp;
3866
3867 co = PyCode_New(c->u->u_argcount, nlocals, stackdepth(c), flags,
3868 bytecode, consts, names, varnames,
3869 freevars, cellvars,
3870 filename, c->u->u_name,
3871 c->u->u_firstlineno,
3872 a->a_lnotab);
3873 error:
3874 Py_XDECREF(consts);
3875 Py_XDECREF(names);
3876 Py_XDECREF(varnames);
3877 Py_XDECREF(filename);
3878 Py_XDECREF(name);
3879 Py_XDECREF(freevars);
3880 Py_XDECREF(cellvars);
3881 Py_XDECREF(bytecode);
3882 return co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003883}
3884
Neal Norwitz4ffedad2006-08-04 04:58:47 +00003885
3886/* For debugging purposes only */
3887#if 0
3888static void
3889dump_instr(const struct instr *i)
3890{
3891 const char *jrel = i->i_jrel ? "jrel " : "";
3892 const char *jabs = i->i_jabs ? "jabs " : "";
3893 char arg[128];
3894
3895 *arg = '\0';
3896 if (i->i_hasarg)
3897 sprintf(arg, "arg: %d ", i->i_oparg);
3898
3899 fprintf(stderr, "line: %d, opcode: %d %s%s%s\n",
3900 i->i_lineno, i->i_opcode, arg, jabs, jrel);
3901}
3902
3903static void
3904dump_basicblock(const basicblock *b)
3905{
3906 const char *seen = b->b_seen ? "seen " : "";
3907 const char *b_return = b->b_return ? "return " : "";
3908 fprintf(stderr, "used: %d, depth: %d, offset: %d %s%s\n",
3909 b->b_iused, b->b_startdepth, b->b_offset, seen, b_return);
3910 if (b->b_instr) {
3911 int i;
3912 for (i = 0; i < b->b_iused; i++) {
3913 fprintf(stderr, " [%02d] ", i);
3914 dump_instr(b->b_instr + i);
3915 }
3916 }
3917}
3918#endif
3919
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003920static PyCodeObject *
3921assemble(struct compiler *c, int addNone)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003922{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003923 basicblock *b, *entryblock;
3924 struct assembler a;
3925 int i, j, nblocks;
3926 PyCodeObject *co = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003927
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003928 /* Make sure every block that falls off the end returns None.
3929 XXX NEXT_BLOCK() isn't quite right, because if the last
3930 block ends with a jump or return b_next shouldn't set.
3931 */
3932 if (!c->u->u_curblock->b_return) {
3933 NEXT_BLOCK(c);
3934 if (addNone)
3935 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3936 ADDOP(c, RETURN_VALUE);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003937 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003938
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003939 nblocks = 0;
3940 entryblock = NULL;
3941 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
3942 nblocks++;
3943 entryblock = b;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003944 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003945
Neal Norwitzed657552006-07-10 00:04:44 +00003946 /* Set firstlineno if it wasn't explicitly set. */
3947 if (!c->u->u_firstlineno) {
3948 if (entryblock && entryblock->b_instr)
3949 c->u->u_firstlineno = entryblock->b_instr->i_lineno;
3950 else
3951 c->u->u_firstlineno = 1;
3952 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003953 if (!assemble_init(&a, nblocks, c->u->u_firstlineno))
3954 goto error;
3955 dfs(c, entryblock, &a);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003956
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003957 /* Can't modify the bytecode after computing jump offsets. */
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003958 assemble_jump_offsets(&a, c);
Tim Petersb6c3cea2001-06-26 03:36:28 +00003959
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003960 /* Emit code in reverse postorder from dfs. */
3961 for (i = a.a_nblocks - 1; i >= 0; i--) {
Neal Norwitz08b401f2006-01-07 21:24:09 +00003962 b = a.a_postorder[i];
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003963 for (j = 0; j < b->b_iused; j++)
3964 if (!assemble_emit(&a, &b->b_instr[j]))
3965 goto error;
Tim Petersb6c3cea2001-06-26 03:36:28 +00003966 }
Tim Petersb6c3cea2001-06-26 03:36:28 +00003967
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003968 if (_PyString_Resize(&a.a_lnotab, a.a_lnotab_off) < 0)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003969 goto error;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00003970 if (_PyString_Resize(&a.a_bytecode, a.a_offset) < 0)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003971 goto error;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003972
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003973 co = makecode(c, &a);
3974 error:
3975 assemble_free(&a);
3976 return co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003977}