blob: aee7bda9ae532dbd672db6b6b87b6f3c3c8d425f [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
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000042struct instr {
Neal Norwitz08b401f2006-01-07 21:24:09 +000043 unsigned i_jabs : 1;
44 unsigned i_jrel : 1;
45 unsigned i_hasarg : 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000046 unsigned char i_opcode;
47 int i_oparg;
48 struct basicblock_ *i_target; /* target block (if jump instruction) */
49 int i_lineno;
Guido van Rossum3f5da241990-12-20 15:06:42 +000050};
51
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000052typedef struct basicblock_ {
Jeremy Hylton12603c42006-04-01 16:18:02 +000053 /* Each basicblock in a compilation unit is linked via b_list in the
54 reverse order that the block are allocated. b_list points to the next
55 block, not to be confused with b_next, which is next by control flow. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000056 struct basicblock_ *b_list;
57 /* number of instructions used */
58 int b_iused;
59 /* length of instruction array (b_instr) */
60 int b_ialloc;
61 /* pointer to an array of instructions, initially NULL */
62 struct instr *b_instr;
63 /* If b_next is non-NULL, it is a pointer to the next
64 block reached by normal control flow. */
65 struct basicblock_ *b_next;
66 /* b_seen is used to perform a DFS of basicblocks. */
Neal Norwitz08b401f2006-01-07 21:24:09 +000067 unsigned b_seen : 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000068 /* b_return is true if a RETURN_VALUE opcode is inserted. */
Neal Norwitz08b401f2006-01-07 21:24:09 +000069 unsigned b_return : 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000070 /* depth of stack upon entry of block, computed by stackdepth() */
71 int b_startdepth;
72 /* instruction offset for block, computed by assemble_jump_offsets() */
Jeremy Hyltone9357b22006-03-01 15:47:05 +000073 int b_offset;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000074} basicblock;
75
76/* fblockinfo tracks the current frame block.
77
Jeremy Hyltone9357b22006-03-01 15:47:05 +000078A frame block is used to handle loops, try/except, and try/finally.
79It's called a frame block to distinguish it from a basic block in the
80compiler IR.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000081*/
82
83enum fblocktype { LOOP, EXCEPT, FINALLY_TRY, FINALLY_END };
84
85struct fblockinfo {
Jeremy Hyltone9357b22006-03-01 15:47:05 +000086 enum fblocktype fb_type;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000087 basicblock *fb_block;
88};
89
90/* The following items change on entry and exit of code blocks.
91 They must be saved and restored when returning to a block.
92*/
93struct compiler_unit {
94 PySTEntryObject *u_ste;
95
96 PyObject *u_name;
97 /* The following fields are dicts that map objects to
Jeremy Hyltone9357b22006-03-01 15:47:05 +000098 the index of them in co_XXX. The index is used as
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000099 the argument for opcodes that refer to those collections.
100 */
101 PyObject *u_consts; /* all constants */
102 PyObject *u_names; /* all names */
103 PyObject *u_varnames; /* local variables */
104 PyObject *u_cellvars; /* cell variables */
105 PyObject *u_freevars; /* free variables */
106
107 PyObject *u_private; /* for private name mangling */
108
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000109 int u_argcount; /* number of arguments for block */
Neal Norwitzf733a012006-10-29 18:30:10 +0000110 /* Pointer to the most recently allocated block. By following b_list
111 members, you can reach all early allocated blocks. */
Jeremy Hylton12603c42006-04-01 16:18:02 +0000112 basicblock *u_blocks;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000113 basicblock *u_curblock; /* pointer to current block */
Neal Norwitzf733a012006-10-29 18:30:10 +0000114 int u_tmpname; /* temporary variables for list comps */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000115
116 int u_nfblocks;
117 struct fblockinfo u_fblock[CO_MAXBLOCKS];
118
119 int u_firstlineno; /* the first lineno of the block */
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000120 int u_lineno; /* the lineno for the current stmt */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000121 bool u_lineno_set; /* boolean to indicate whether instr
122 has been generated with current lineno */
123};
124
125/* This struct captures the global state of a compilation.
126
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000127The u pointer points to the current compilation unit, while units
128for enclosing blocks are stored in c_stack. The u and c_stack are
129managed by compiler_enter_scope() and compiler_exit_scope().
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000130*/
131
132struct compiler {
133 const char *c_filename;
134 struct symtable *c_st;
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000135 PyFutureFeatures *c_future; /* pointer to module's __future__ */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000136 PyCompilerFlags *c_flags;
137
Neal Norwitz4ffedad2006-08-04 04:58:47 +0000138 int c_interactive; /* true if in interactive mode */
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000139 int c_nestlevel;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000140
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000141 struct compiler_unit *u; /* compiler state for current block */
142 PyObject *c_stack; /* Python list holding compiler_unit ptrs */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000143 char *c_encoding; /* source encoding (a borrowed reference) */
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000144 PyArena *c_arena; /* pointer to memory allocation arena */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000145};
146
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000147static int compiler_enter_scope(struct compiler *, identifier, void *, int);
148static void compiler_free(struct compiler *);
149static basicblock *compiler_new_block(struct compiler *);
150static int compiler_next_instr(struct compiler *, basicblock *);
151static int compiler_addop(struct compiler *, int);
152static int compiler_addop_o(struct compiler *, int, PyObject *, PyObject *);
153static int compiler_addop_i(struct compiler *, int, int);
154static int compiler_addop_j(struct compiler *, int, basicblock *, int);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000155static basicblock *compiler_use_new_block(struct compiler *);
156static int compiler_error(struct compiler *, const char *);
157static int compiler_nameop(struct compiler *, identifier, expr_context_ty);
158
159static PyCodeObject *compiler_mod(struct compiler *, mod_ty);
160static int compiler_visit_stmt(struct compiler *, stmt_ty);
161static int compiler_visit_keyword(struct compiler *, keyword_ty);
162static int compiler_visit_expr(struct compiler *, expr_ty);
163static int compiler_augassign(struct compiler *, stmt_ty);
164static int compiler_visit_slice(struct compiler *, slice_ty,
165 expr_context_ty);
166
167static int compiler_push_fblock(struct compiler *, enum fblocktype,
168 basicblock *);
169static void compiler_pop_fblock(struct compiler *, enum fblocktype,
170 basicblock *);
Jeremy Hylton82271f12006-10-04 02:24:52 +0000171/* Returns true if there is a loop on the fblock stack. */
172static int compiler_in_loop(struct compiler *);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000173
174static int inplace_binop(struct compiler *, operator_ty);
175static int expr_constant(expr_ty e);
176
Guido van Rossumc2e20742006-02-27 22:32:47 +0000177static int compiler_with(struct compiler *, stmt_ty);
178
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000179static PyCodeObject *assemble(struct compiler *, int addNone);
180static PyObject *__doc__;
181
182PyObject *
Anthony Baxter7b782b62006-04-11 12:01:56 +0000183_Py_Mangle(PyObject *privateobj, PyObject *ident)
Michael W. Hudson60934622004-08-12 17:56:29 +0000184{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000185 /* Name mangling: __private becomes _classname__private.
186 This is independent from how the name is used. */
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000187 const char *p, *name = PyString_AsString(ident);
188 char *buffer;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000189 size_t nlen, plen;
Neal Norwitz84167d02006-08-12 01:45:47 +0000190 if (privateobj == NULL || !PyString_Check(privateobj) ||
191 name == NULL || name[0] != '_' || name[1] != '_') {
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000192 Py_INCREF(ident);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000193 return ident;
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000194 }
Anthony Baxter7b782b62006-04-11 12:01:56 +0000195 p = PyString_AsString(privateobj);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000196 nlen = strlen(name);
Jeremy Hylton819de6c2007-02-27 16:13:23 +0000197 /* Don't mangle __id__ or names with dots.
Jeremy Hylton37075c52007-02-27 01:01:59 +0000198
Jeremy Hylton819de6c2007-02-27 16:13:23 +0000199 The only time a name with a dot can occur is when
200 we are compiling an import statement that has a
201 package name.
Jeremy Hylton37075c52007-02-27 01:01:59 +0000202
Jeremy Hylton819de6c2007-02-27 16:13:23 +0000203 TODO(jhylton): Decide whether we want to support
204 mangling of the module name, e.g. __M.X.
205 */
Jeremy Hylton37075c52007-02-27 01:01:59 +0000206 if ((name[nlen-1] == '_' && name[nlen-2] == '_')
Jeremy Hylton819de6c2007-02-27 16:13:23 +0000207 || strchr(name, '.')) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000208 Py_INCREF(ident);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000209 return ident; /* Don't mangle __whatever__ */
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000210 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000211 /* Strip leading underscores from class name */
212 while (*p == '_')
213 p++;
214 if (*p == '\0') {
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000215 Py_INCREF(ident);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000216 return ident; /* Don't mangle if class is just underscores */
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000217 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000218 plen = strlen(p);
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000219 ident = PyString_FromStringAndSize(NULL, 1 + nlen + plen);
220 if (!ident)
221 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000222 /* ident = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000223 buffer = PyString_AS_STRING(ident);
224 buffer[0] = '_';
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000225 strncpy(buffer+1, p, plen);
226 strcpy(buffer+1+plen, name);
227 return ident;
Michael W. Hudson60934622004-08-12 17:56:29 +0000228}
229
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000230static int
231compiler_init(struct compiler *c)
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000232{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000233 memset(c, 0, sizeof(struct compiler));
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000234
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000235 c->c_stack = PyList_New(0);
236 if (!c->c_stack)
237 return 0;
238
239 return 1;
240}
241
242PyCodeObject *
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000243PyAST_Compile(mod_ty mod, const char *filename, PyCompilerFlags *flags,
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000244 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000245{
246 struct compiler c;
247 PyCodeObject *co = NULL;
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000248 PyCompilerFlags local_flags;
249 int merged;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000250
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000251 if (!__doc__) {
252 __doc__ = PyString_InternFromString("__doc__");
253 if (!__doc__)
254 return NULL;
255 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000256
257 if (!compiler_init(&c))
Thomas Woutersbfe51ea2006-02-27 22:48:55 +0000258 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000259 c.c_filename = filename;
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000260 c.c_arena = arena;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000261 c.c_future = PyFuture_FromAST(mod, filename);
262 if (c.c_future == NULL)
Thomas Wouters1175c432006-02-27 22:49:54 +0000263 goto finally;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000264 if (!flags) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000265 local_flags.cf_flags = 0;
266 flags = &local_flags;
267 }
268 merged = c.c_future->ff_features | flags->cf_flags;
269 c.c_future->ff_features = merged;
270 flags->cf_flags = merged;
271 c.c_flags = flags;
272 c.c_nestlevel = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000273
274 c.c_st = PySymtable_Build(mod, filename, c.c_future);
275 if (c.c_st == NULL) {
276 if (!PyErr_Occurred())
277 PyErr_SetString(PyExc_SystemError, "no symtable");
Thomas Wouters1175c432006-02-27 22:49:54 +0000278 goto finally;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000279 }
280
281 /* XXX initialize to NULL for now, need to handle */
282 c.c_encoding = NULL;
283
284 co = compiler_mod(&c, mod);
285
Thomas Wouters1175c432006-02-27 22:49:54 +0000286 finally:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000287 compiler_free(&c);
Thomas Woutersbfe51ea2006-02-27 22:48:55 +0000288 assert(co || PyErr_Occurred());
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000289 return co;
290}
291
292PyCodeObject *
293PyNode_Compile(struct _node *n, const char *filename)
294{
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000295 PyCodeObject *co = NULL;
Neal Norwitzb59d08c2006-07-22 16:20:49 +0000296 mod_ty mod;
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000297 PyArena *arena = PyArena_New();
Neal Norwitzb59d08c2006-07-22 16:20:49 +0000298 if (!arena)
299 return NULL;
300 mod = PyAST_FromNode(n, NULL, filename, arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000301 if (mod)
302 co = PyAST_Compile(mod, filename, NULL, arena);
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000303 PyArena_Free(arena);
Raymond Hettinger37a724d2003-09-15 21:43:16 +0000304 return co;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000305}
306
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000307static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000308compiler_free(struct compiler *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000309{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000310 if (c->c_st)
311 PySymtable_Free(c->c_st);
312 if (c->c_future)
Neal Norwitz14bc4e42006-04-10 06:57:06 +0000313 PyObject_Free(c->c_future);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000314 Py_DECREF(c->c_stack);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000315}
316
Guido van Rossum79f25d91997-04-29 20:08:16 +0000317static PyObject *
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000318list2dict(PyObject *list)
Guido van Rossum2dff9911992-09-03 20:50:59 +0000319{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000320 Py_ssize_t i, n;
Georg Brandl5c170fd2006-03-17 19:03:25 +0000321 PyObject *v, *k;
322 PyObject *dict = PyDict_New();
323 if (!dict) return NULL;
Guido van Rossumd076c731998-10-07 19:42:25 +0000324
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000325 n = PyList_Size(list);
326 for (i = 0; i < n; i++) {
327 v = PyInt_FromLong(i);
328 if (!v) {
329 Py_DECREF(dict);
330 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000331 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000332 k = PyList_GET_ITEM(list, i);
Georg Brandl7784f122006-05-26 20:04:44 +0000333 k = PyTuple_Pack(2, k, k->ob_type);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000334 if (k == NULL || PyDict_SetItem(dict, k, v) < 0) {
335 Py_XDECREF(k);
336 Py_DECREF(v);
337 Py_DECREF(dict);
338 return NULL;
339 }
Neal Norwitz4737b232005-11-19 23:58:29 +0000340 Py_DECREF(k);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000341 Py_DECREF(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000342 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000343 return dict;
344}
345
346/* Return new dict containing names from src that match scope(s).
347
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000348src is a symbol table dictionary. If the scope of a name matches
349either scope_type or flag is set, insert it into the new dict. The
350values are integers, starting at offset and increasing by one for
351each key.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000352*/
353
354static PyObject *
355dictbytype(PyObject *src, int scope_type, int flag, int offset)
356{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000357 Py_ssize_t pos = 0, i = offset, scope;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000358 PyObject *k, *v, *dest = PyDict_New();
359
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000360 assert(offset >= 0);
361 if (dest == NULL)
362 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000363
364 while (PyDict_Next(src, &pos, &k, &v)) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000365 /* XXX this should probably be a macro in symtable.h */
366 assert(PyInt_Check(v));
367 scope = (PyInt_AS_LONG(v) >> SCOPE_OFF) & SCOPE_MASK;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000368
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000369 if (scope == scope_type || PyInt_AS_LONG(v) & flag) {
370 PyObject *tuple, *item = PyInt_FromLong(i);
371 if (item == NULL) {
372 Py_DECREF(dest);
373 return NULL;
374 }
375 i++;
Georg Brandl7784f122006-05-26 20:04:44 +0000376 tuple = PyTuple_Pack(2, k, k->ob_type);
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000377 if (!tuple || PyDict_SetItem(dest, tuple, item) < 0) {
378 Py_DECREF(item);
379 Py_DECREF(dest);
380 Py_XDECREF(tuple);
381 return NULL;
382 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000383 Py_DECREF(item);
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000384 Py_DECREF(tuple);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000385 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000386 }
387 return dest;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000388}
389
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000390static void
391compiler_unit_check(struct compiler_unit *u)
392{
393 basicblock *block;
394 for (block = u->u_blocks; block != NULL; block = block->b_list) {
395 assert(block != (void *)0xcbcbcbcb);
396 assert(block != (void *)0xfbfbfbfb);
397 assert(block != (void *)0xdbdbdbdb);
398 if (block->b_instr != NULL) {
399 assert(block->b_ialloc > 0);
400 assert(block->b_iused > 0);
401 assert(block->b_ialloc >= block->b_iused);
402 }
403 else {
404 assert (block->b_iused == 0);
405 assert (block->b_ialloc == 0);
406 }
407 }
408}
409
410static void
411compiler_unit_free(struct compiler_unit *u)
412{
413 basicblock *b, *next;
414
415 compiler_unit_check(u);
416 b = u->u_blocks;
417 while (b != NULL) {
418 if (b->b_instr)
419 PyObject_Free((void *)b->b_instr);
420 next = b->b_list;
421 PyObject_Free((void *)b);
422 b = next;
423 }
Neal Norwitzb59d08c2006-07-22 16:20:49 +0000424 Py_CLEAR(u->u_ste);
425 Py_CLEAR(u->u_name);
426 Py_CLEAR(u->u_consts);
427 Py_CLEAR(u->u_names);
428 Py_CLEAR(u->u_varnames);
429 Py_CLEAR(u->u_freevars);
430 Py_CLEAR(u->u_cellvars);
431 Py_CLEAR(u->u_private);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000432 PyObject_Free(u);
433}
434
435static int
436compiler_enter_scope(struct compiler *c, identifier name, void *key,
437 int lineno)
438{
439 struct compiler_unit *u;
440
Anthony Baxter7b782b62006-04-11 12:01:56 +0000441 u = (struct compiler_unit *)PyObject_Malloc(sizeof(
Jeremy Hylton819de6c2007-02-27 16:13:23 +0000442 struct compiler_unit));
Neal Norwitz87b801c2005-12-18 04:42:47 +0000443 if (!u) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000444 PyErr_NoMemory();
445 return 0;
Neal Norwitz87b801c2005-12-18 04:42:47 +0000446 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000447 memset(u, 0, sizeof(struct compiler_unit));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000448 u->u_argcount = 0;
449 u->u_ste = PySymtable_Lookup(c->c_st, key);
450 if (!u->u_ste) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000451 compiler_unit_free(u);
452 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000453 }
454 Py_INCREF(name);
455 u->u_name = name;
456 u->u_varnames = list2dict(u->u_ste->ste_varnames);
457 u->u_cellvars = dictbytype(u->u_ste->ste_symbols, CELL, 0, 0);
Neal Norwitzd12bd012006-07-21 07:59:47 +0000458 if (!u->u_varnames || !u->u_cellvars) {
459 compiler_unit_free(u);
460 return 0;
461 }
462
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000463 u->u_freevars = dictbytype(u->u_ste->ste_symbols, FREE, DEF_FREE_CLASS,
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000464 PyDict_Size(u->u_cellvars));
Neal Norwitzd12bd012006-07-21 07:59:47 +0000465 if (!u->u_freevars) {
466 compiler_unit_free(u);
467 return 0;
468 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000469
470 u->u_blocks = NULL;
471 u->u_tmpname = 0;
472 u->u_nfblocks = 0;
473 u->u_firstlineno = lineno;
474 u->u_lineno = 0;
475 u->u_lineno_set = false;
476 u->u_consts = PyDict_New();
477 if (!u->u_consts) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000478 compiler_unit_free(u);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000479 return 0;
480 }
481 u->u_names = PyDict_New();
482 if (!u->u_names) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000483 compiler_unit_free(u);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000484 return 0;
485 }
486
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000487 u->u_private = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000488
489 /* Push the old compiler_unit on the stack. */
490 if (c->u) {
491 PyObject *wrapper = PyCObject_FromVoidPtr(c->u, NULL);
Neal Norwitzb59d08c2006-07-22 16:20:49 +0000492 if (!wrapper || PyList_Append(c->c_stack, wrapper) < 0) {
493 Py_XDECREF(wrapper);
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000494 compiler_unit_free(u);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000495 return 0;
496 }
497 Py_DECREF(wrapper);
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000498 u->u_private = c->u->u_private;
499 Py_XINCREF(u->u_private);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000500 }
501 c->u = u;
502
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000503 c->c_nestlevel++;
Martin v. Löwis94962612006-01-02 21:15:05 +0000504 if (compiler_use_new_block(c) == NULL)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000505 return 0;
506
507 return 1;
508}
509
Neil Schemenauerc396d9e2005-10-25 06:30:14 +0000510static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000511compiler_exit_scope(struct compiler *c)
512{
513 int n;
514 PyObject *wrapper;
515
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000516 c->c_nestlevel--;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000517 compiler_unit_free(c->u);
518 /* Restore c->u to the parent unit. */
519 n = PyList_GET_SIZE(c->c_stack) - 1;
520 if (n >= 0) {
521 wrapper = PyList_GET_ITEM(c->c_stack, n);
522 c->u = (struct compiler_unit *)PyCObject_AsVoidPtr(wrapper);
Neal Norwitz87557cd2006-08-21 18:01:30 +0000523 assert(c->u);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +0000524 /* we are deleting from a list so this really shouldn't fail */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000525 if (PySequence_DelItem(c->c_stack, n) < 0)
Neil Schemenauerc396d9e2005-10-25 06:30:14 +0000526 Py_FatalError("compiler_exit_scope()");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000527 compiler_unit_check(c->u);
528 }
529 else
530 c->u = NULL;
531
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000532}
533
Guido van Rossumc2e20742006-02-27 22:32:47 +0000534/* Allocate a new "anonymous" local variable.
535 Used by list comprehensions and with statements.
536*/
537
538static PyObject *
539compiler_new_tmpname(struct compiler *c)
540{
541 char tmpname[256];
542 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++c->u->u_tmpname);
543 return PyString_FromString(tmpname);
544}
545
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000546/* Allocate a new block and return a pointer to it.
547 Returns NULL on error.
548*/
549
550static basicblock *
551compiler_new_block(struct compiler *c)
552{
553 basicblock *b;
554 struct compiler_unit *u;
555
556 u = c->u;
557 b = (basicblock *)PyObject_Malloc(sizeof(basicblock));
Neal Norwitz87b801c2005-12-18 04:42:47 +0000558 if (b == NULL) {
559 PyErr_NoMemory();
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000560 return NULL;
Neal Norwitz87b801c2005-12-18 04:42:47 +0000561 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000562 memset((void *)b, 0, sizeof(basicblock));
Neal Norwitzf733a012006-10-29 18:30:10 +0000563 /* Extend the singly linked list of blocks with new block. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000564 b->b_list = u->u_blocks;
565 u->u_blocks = b;
566 return b;
567}
568
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000569static basicblock *
570compiler_use_new_block(struct compiler *c)
571{
572 basicblock *block = compiler_new_block(c);
573 if (block == NULL)
574 return NULL;
575 c->u->u_curblock = block;
576 return block;
577}
578
579static basicblock *
580compiler_next_block(struct compiler *c)
581{
582 basicblock *block = compiler_new_block(c);
583 if (block == NULL)
584 return NULL;
585 c->u->u_curblock->b_next = block;
586 c->u->u_curblock = block;
587 return block;
588}
589
590static basicblock *
591compiler_use_next_block(struct compiler *c, basicblock *block)
592{
593 assert(block != NULL);
594 c->u->u_curblock->b_next = block;
595 c->u->u_curblock = block;
596 return block;
597}
598
599/* Returns the offset of the next instruction in the current block's
600 b_instr array. Resizes the b_instr as necessary.
601 Returns -1 on failure.
Neal Norwitzf733a012006-10-29 18:30:10 +0000602*/
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000603
604static int
605compiler_next_instr(struct compiler *c, basicblock *b)
606{
607 assert(b != NULL);
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000608 if (b->b_instr == NULL) {
Anthony Baxter7b782b62006-04-11 12:01:56 +0000609 b->b_instr = (struct instr *)PyObject_Malloc(
Jeremy Hylton819de6c2007-02-27 16:13:23 +0000610 sizeof(struct instr) * DEFAULT_BLOCK_SIZE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000611 if (b->b_instr == NULL) {
612 PyErr_NoMemory();
613 return -1;
614 }
615 b->b_ialloc = DEFAULT_BLOCK_SIZE;
616 memset((char *)b->b_instr, 0,
617 sizeof(struct instr) * DEFAULT_BLOCK_SIZE);
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000618 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000619 else if (b->b_iused == b->b_ialloc) {
Neal Norwitzb59d08c2006-07-22 16:20:49 +0000620 struct instr *tmp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000621 size_t oldsize, newsize;
622 oldsize = b->b_ialloc * sizeof(struct instr);
623 newsize = oldsize << 1;
624 if (newsize == 0) {
625 PyErr_NoMemory();
626 return -1;
627 }
628 b->b_ialloc <<= 1;
Neal Norwitzb59d08c2006-07-22 16:20:49 +0000629 tmp = (struct instr *)PyObject_Realloc(
Jeremy Hylton819de6c2007-02-27 16:13:23 +0000630 (void *)b->b_instr, newsize);
Neal Norwitzb59d08c2006-07-22 16:20:49 +0000631 if (tmp == NULL) {
632 PyErr_NoMemory();
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000633 return -1;
Neal Norwitzb59d08c2006-07-22 16:20:49 +0000634 }
635 b->b_instr = tmp;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000636 memset((char *)b->b_instr + oldsize, 0, newsize - oldsize);
637 }
638 return b->b_iused++;
639}
640
Jeremy Hylton12603c42006-04-01 16:18:02 +0000641/* Set the i_lineno member of the instruction at offse off if the
642 line number for the current expression/statement (?) has not
643 already been set. If it has been set, the call has no effect.
644
645 Every time a new node is b
Neal Norwitzf733a012006-10-29 18:30:10 +0000646*/
Jeremy Hylton12603c42006-04-01 16:18:02 +0000647
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000648static void
649compiler_set_lineno(struct compiler *c, int off)
650{
651 basicblock *b;
652 if (c->u->u_lineno_set)
653 return;
654 c->u->u_lineno_set = true;
655 b = c->u->u_curblock;
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000656 b->b_instr[off].i_lineno = c->u->u_lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000657}
658
659static int
660opcode_stack_effect(int opcode, int oparg)
661{
662 switch (opcode) {
663 case POP_TOP:
664 return -1;
665 case ROT_TWO:
666 case ROT_THREE:
667 return 0;
668 case DUP_TOP:
669 return 1;
670 case ROT_FOUR:
671 return 0;
672
673 case UNARY_POSITIVE:
674 case UNARY_NEGATIVE:
675 case UNARY_NOT:
676 case UNARY_CONVERT:
677 case UNARY_INVERT:
678 return 0;
679
Neal Norwitz10be2ea2006-03-03 20:29:11 +0000680 case LIST_APPEND:
681 return -2;
682
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000683 case BINARY_POWER:
684 case BINARY_MULTIPLY:
685 case BINARY_DIVIDE:
686 case BINARY_MODULO:
687 case BINARY_ADD:
688 case BINARY_SUBTRACT:
689 case BINARY_SUBSCR:
690 case BINARY_FLOOR_DIVIDE:
691 case BINARY_TRUE_DIVIDE:
692 return -1;
693 case INPLACE_FLOOR_DIVIDE:
694 case INPLACE_TRUE_DIVIDE:
695 return -1;
696
697 case SLICE+0:
698 return 1;
699 case SLICE+1:
700 return 0;
701 case SLICE+2:
702 return 0;
703 case SLICE+3:
704 return -1;
705
706 case STORE_SLICE+0:
707 return -2;
708 case STORE_SLICE+1:
709 return -3;
710 case STORE_SLICE+2:
711 return -3;
712 case STORE_SLICE+3:
713 return -4;
714
715 case DELETE_SLICE+0:
716 return -1;
717 case DELETE_SLICE+1:
718 return -2;
719 case DELETE_SLICE+2:
720 return -2;
721 case DELETE_SLICE+3:
722 return -3;
723
724 case INPLACE_ADD:
725 case INPLACE_SUBTRACT:
726 case INPLACE_MULTIPLY:
727 case INPLACE_DIVIDE:
728 case INPLACE_MODULO:
729 return -1;
730 case STORE_SUBSCR:
731 return -3;
Raymond Hettingereffde122007-12-18 18:26:18 +0000732 case STORE_MAP:
733 return -2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000734 case DELETE_SUBSCR:
735 return -2;
736
737 case BINARY_LSHIFT:
738 case BINARY_RSHIFT:
739 case BINARY_AND:
740 case BINARY_XOR:
741 case BINARY_OR:
742 return -1;
743 case INPLACE_POWER:
744 return -1;
745 case GET_ITER:
746 return 0;
747
748 case PRINT_EXPR:
749 return -1;
750 case PRINT_ITEM:
751 return -1;
752 case PRINT_NEWLINE:
753 return 0;
754 case PRINT_ITEM_TO:
755 return -2;
756 case PRINT_NEWLINE_TO:
757 return -1;
758 case INPLACE_LSHIFT:
759 case INPLACE_RSHIFT:
760 case INPLACE_AND:
761 case INPLACE_XOR:
762 case INPLACE_OR:
763 return -1;
764 case BREAK_LOOP:
765 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +0000766 case WITH_CLEANUP:
Guido van Rossumf6694362006-03-10 02:28:35 +0000767 return -1; /* XXX Sometimes more */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000768 case LOAD_LOCALS:
769 return 1;
770 case RETURN_VALUE:
771 return -1;
772 case IMPORT_STAR:
773 return -1;
774 case EXEC_STMT:
775 return -3;
776 case YIELD_VALUE:
777 return 0;
778
779 case POP_BLOCK:
780 return 0;
781 case END_FINALLY:
782 return -1; /* or -2 or -3 if exception occurred */
783 case BUILD_CLASS:
784 return -2;
785
786 case STORE_NAME:
787 return -1;
788 case DELETE_NAME:
789 return 0;
790 case UNPACK_SEQUENCE:
791 return oparg-1;
792 case FOR_ITER:
793 return 1;
794
795 case STORE_ATTR:
796 return -2;
797 case DELETE_ATTR:
798 return -1;
799 case STORE_GLOBAL:
800 return -1;
801 case DELETE_GLOBAL:
802 return 0;
803 case DUP_TOPX:
804 return oparg;
805 case LOAD_CONST:
806 return 1;
807 case LOAD_NAME:
808 return 1;
809 case BUILD_TUPLE:
810 case BUILD_LIST:
811 return 1-oparg;
812 case BUILD_MAP:
813 return 1;
814 case LOAD_ATTR:
815 return 0;
816 case COMPARE_OP:
817 return -1;
818 case IMPORT_NAME:
819 return 0;
820 case IMPORT_FROM:
821 return 1;
822
823 case JUMP_FORWARD:
824 case JUMP_IF_FALSE:
825 case JUMP_IF_TRUE:
826 case JUMP_ABSOLUTE:
827 return 0;
828
829 case LOAD_GLOBAL:
830 return 1;
831
832 case CONTINUE_LOOP:
833 return 0;
834 case SETUP_LOOP:
835 return 0;
836 case SETUP_EXCEPT:
837 case SETUP_FINALLY:
838 return 3; /* actually pushed by an exception */
839
840 case LOAD_FAST:
841 return 1;
842 case STORE_FAST:
843 return -1;
844 case DELETE_FAST:
845 return 0;
846
847 case RAISE_VARARGS:
848 return -oparg;
849#define NARGS(o) (((o) % 256) + 2*((o) / 256))
850 case CALL_FUNCTION:
851 return -NARGS(oparg);
852 case CALL_FUNCTION_VAR:
853 case CALL_FUNCTION_KW:
854 return -NARGS(oparg)-1;
855 case CALL_FUNCTION_VAR_KW:
856 return -NARGS(oparg)-2;
857#undef NARGS
858 case MAKE_FUNCTION:
859 return -oparg;
860 case BUILD_SLICE:
861 if (oparg == 3)
862 return -2;
863 else
864 return -1;
865
866 case MAKE_CLOSURE:
867 return -oparg;
868 case LOAD_CLOSURE:
869 return 1;
870 case LOAD_DEREF:
871 return 1;
872 case STORE_DEREF:
873 return -1;
874 default:
875 fprintf(stderr, "opcode = %d\n", opcode);
876 Py_FatalError("opcode_stack_effect()");
877
878 }
879 return 0; /* not reachable */
880}
881
882/* Add an opcode with no argument.
883 Returns 0 on failure, 1 on success.
884*/
885
886static int
887compiler_addop(struct compiler *c, int opcode)
888{
889 basicblock *b;
890 struct instr *i;
891 int off;
892 off = compiler_next_instr(c, c->u->u_curblock);
893 if (off < 0)
894 return 0;
895 b = c->u->u_curblock;
896 i = &b->b_instr[off];
897 i->i_opcode = opcode;
898 i->i_hasarg = 0;
899 if (opcode == RETURN_VALUE)
900 b->b_return = 1;
901 compiler_set_lineno(c, off);
902 return 1;
903}
904
905static int
906compiler_add_o(struct compiler *c, PyObject *dict, PyObject *o)
907{
908 PyObject *t, *v;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000909 Py_ssize_t arg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000910
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000911 /* necessary to make sure types aren't coerced (e.g., int and long) */
Alex Martellid8672aa2007-08-22 21:14:17 +0000912 /* _and_ to distinguish 0.0 from -0.0 e.g. on IEEE platforms */
913 if (PyFloat_Check(o)) {
914 double d = PyFloat_AS_DOUBLE(o);
915 unsigned char* p = (unsigned char*) &d;
916 /* all we need is to make the tuple different in either the 0.0
917 * or -0.0 case from all others, just to avoid the "coercion".
918 */
919 if (*p==0 && p[sizeof(double)-1]==0)
920 t = PyTuple_Pack(3, o, o->ob_type, Py_None);
921 else
922 t = PyTuple_Pack(2, o, o->ob_type);
923 } else {
924 t = PyTuple_Pack(2, o, o->ob_type);
925 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000926 if (t == NULL)
927 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000928
929 v = PyDict_GetItem(dict, t);
930 if (!v) {
931 arg = PyDict_Size(dict);
932 v = PyInt_FromLong(arg);
933 if (!v) {
934 Py_DECREF(t);
935 return -1;
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000936 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000937 if (PyDict_SetItem(dict, t, v) < 0) {
938 Py_DECREF(t);
939 Py_DECREF(v);
940 return -1;
941 }
942 Py_DECREF(v);
943 }
944 else
945 arg = PyInt_AsLong(v);
946 Py_DECREF(t);
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000947 return arg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000948}
949
950static int
951compiler_addop_o(struct compiler *c, int opcode, PyObject *dict,
952 PyObject *o)
953{
954 int arg = compiler_add_o(c, dict, o);
955 if (arg < 0)
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000956 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000957 return compiler_addop_i(c, opcode, arg);
958}
959
960static int
961compiler_addop_name(struct compiler *c, int opcode, PyObject *dict,
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000962 PyObject *o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000963{
964 int arg;
965 PyObject *mangled = _Py_Mangle(c->u->u_private, o);
966 if (!mangled)
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000967 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000968 arg = compiler_add_o(c, dict, mangled);
969 Py_DECREF(mangled);
970 if (arg < 0)
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000971 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000972 return compiler_addop_i(c, opcode, arg);
973}
974
975/* Add an opcode with an integer argument.
976 Returns 0 on failure, 1 on success.
977*/
978
979static int
980compiler_addop_i(struct compiler *c, int opcode, int oparg)
981{
982 struct instr *i;
983 int off;
984 off = compiler_next_instr(c, c->u->u_curblock);
985 if (off < 0)
986 return 0;
987 i = &c->u->u_curblock->b_instr[off];
988 i->i_opcode = opcode;
989 i->i_oparg = oparg;
990 i->i_hasarg = 1;
991 compiler_set_lineno(c, off);
992 return 1;
993}
994
995static int
996compiler_addop_j(struct compiler *c, int opcode, basicblock *b, int absolute)
997{
998 struct instr *i;
999 int off;
1000
1001 assert(b != NULL);
1002 off = compiler_next_instr(c, c->u->u_curblock);
1003 if (off < 0)
1004 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001005 i = &c->u->u_curblock->b_instr[off];
1006 i->i_opcode = opcode;
1007 i->i_target = b;
1008 i->i_hasarg = 1;
1009 if (absolute)
1010 i->i_jabs = 1;
1011 else
1012 i->i_jrel = 1;
Jeremy Hylton12603c42006-04-01 16:18:02 +00001013 compiler_set_lineno(c, off);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001014 return 1;
1015}
1016
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001017/* The distinction between NEW_BLOCK and NEXT_BLOCK is subtle. (I'd
1018 like to find better names.) NEW_BLOCK() creates a new block and sets
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001019 it as the current block. NEXT_BLOCK() also creates an implicit jump
1020 from the current block to the new block.
1021*/
1022
Neal Norwitzf733a012006-10-29 18:30:10 +00001023/* The returns inside these macros make it impossible to decref objects
1024 created in the local function. Local objects should use the arena.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001025*/
1026
1027
1028#define NEW_BLOCK(C) { \
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001029 if (compiler_use_new_block((C)) == NULL) \
1030 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001031}
1032
1033#define NEXT_BLOCK(C) { \
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001034 if (compiler_next_block((C)) == NULL) \
1035 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001036}
1037
1038#define ADDOP(C, OP) { \
1039 if (!compiler_addop((C), (OP))) \
1040 return 0; \
1041}
1042
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001043#define ADDOP_IN_SCOPE(C, OP) { \
1044 if (!compiler_addop((C), (OP))) { \
1045 compiler_exit_scope(c); \
1046 return 0; \
1047 } \
1048}
1049
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001050#define ADDOP_O(C, OP, O, TYPE) { \
1051 if (!compiler_addop_o((C), (OP), (C)->u->u_ ## TYPE, (O))) \
1052 return 0; \
1053}
1054
1055#define ADDOP_NAME(C, OP, O, TYPE) { \
1056 if (!compiler_addop_name((C), (OP), (C)->u->u_ ## TYPE, (O))) \
1057 return 0; \
1058}
1059
1060#define ADDOP_I(C, OP, O) { \
1061 if (!compiler_addop_i((C), (OP), (O))) \
1062 return 0; \
1063}
1064
1065#define ADDOP_JABS(C, OP, O) { \
1066 if (!compiler_addop_j((C), (OP), (O), 1)) \
1067 return 0; \
1068}
1069
1070#define ADDOP_JREL(C, OP, O) { \
1071 if (!compiler_addop_j((C), (OP), (O), 0)) \
1072 return 0; \
1073}
1074
1075/* VISIT and VISIT_SEQ takes an ASDL type as their second argument. They use
1076 the ASDL name to synthesize the name of the C type and the visit function.
1077*/
1078
1079#define VISIT(C, TYPE, V) {\
1080 if (!compiler_visit_ ## TYPE((C), (V))) \
1081 return 0; \
1082}
1083
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001084#define VISIT_IN_SCOPE(C, TYPE, V) {\
1085 if (!compiler_visit_ ## TYPE((C), (V))) { \
1086 compiler_exit_scope(c); \
1087 return 0; \
1088 } \
1089}
1090
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001091#define VISIT_SLICE(C, V, CTX) {\
1092 if (!compiler_visit_slice((C), (V), (CTX))) \
1093 return 0; \
1094}
1095
1096#define VISIT_SEQ(C, TYPE, SEQ) { \
Neal Norwitz08b401f2006-01-07 21:24:09 +00001097 int _i; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001098 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
Neal Norwitz08b401f2006-01-07 21:24:09 +00001099 for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001100 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \
Anthony Baxter7b782b62006-04-11 12:01:56 +00001101 if (!compiler_visit_ ## TYPE((C), elt)) \
1102 return 0; \
1103 } \
1104}
1105
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001106#define VISIT_SEQ_IN_SCOPE(C, TYPE, SEQ) { \
Neal Norwitz08b401f2006-01-07 21:24:09 +00001107 int _i; \
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001108 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
Neal Norwitz08b401f2006-01-07 21:24:09 +00001109 for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001110 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \
Anthony Baxter7b782b62006-04-11 12:01:56 +00001111 if (!compiler_visit_ ## TYPE((C), elt)) { \
1112 compiler_exit_scope(c); \
1113 return 0; \
1114 } \
1115 } \
1116}
1117
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001118static int
1119compiler_isdocstring(stmt_ty s)
1120{
1121 if (s->kind != Expr_kind)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001122 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001123 return s->v.Expr.value->kind == Str_kind;
1124}
1125
1126/* Compile a sequence of statements, checking for a docstring. */
1127
1128static int
1129compiler_body(struct compiler *c, asdl_seq *stmts)
1130{
1131 int i = 0;
1132 stmt_ty st;
1133
1134 if (!asdl_seq_LEN(stmts))
1135 return 1;
Anthony Baxter7b782b62006-04-11 12:01:56 +00001136 st = (stmt_ty)asdl_seq_GET(stmts, 0);
Georg Brandla5ea6892007-06-01 11:33:33 +00001137 if (compiler_isdocstring(st) && Py_OptimizeFlag < 2) {
1138 /* don't generate docstrings if -OO */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001139 i = 1;
1140 VISIT(c, expr, st->v.Expr.value);
1141 if (!compiler_nameop(c, __doc__, Store))
1142 return 0;
1143 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001144 for (; i < asdl_seq_LEN(stmts); i++)
Anthony Baxter7b782b62006-04-11 12:01:56 +00001145 VISIT(c, stmt, (stmt_ty)asdl_seq_GET(stmts, i));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001146 return 1;
1147}
1148
1149static PyCodeObject *
1150compiler_mod(struct compiler *c, mod_ty mod)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001151{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001152 PyCodeObject *co;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001153 int addNone = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001154 static PyObject *module;
1155 if (!module) {
1156 module = PyString_FromString("<module>");
1157 if (!module)
1158 return NULL;
1159 }
Neal Norwitzed657552006-07-10 00:04:44 +00001160 /* Use 0 for firstlineno initially, will fixup in assemble(). */
1161 if (!compiler_enter_scope(c, module, mod, 0))
Guido van Rossumd076c731998-10-07 19:42:25 +00001162 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001163 switch (mod->kind) {
1164 case Module_kind:
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001165 if (!compiler_body(c, mod->v.Module.body)) {
1166 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001167 return 0;
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001168 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001169 break;
1170 case Interactive_kind:
1171 c->c_interactive = 1;
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001172 VISIT_SEQ_IN_SCOPE(c, stmt,
Jeremy Hylton819de6c2007-02-27 16:13:23 +00001173 mod->v.Interactive.body);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001174 break;
1175 case Expression_kind:
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001176 VISIT_IN_SCOPE(c, expr, mod->v.Expression.body);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001177 addNone = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001178 break;
1179 case Suite_kind:
Neal Norwitz4737b232005-11-19 23:58:29 +00001180 PyErr_SetString(PyExc_SystemError,
1181 "suite should not be possible");
1182 return 0;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001183 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00001184 PyErr_Format(PyExc_SystemError,
1185 "module kind %d should not be possible",
1186 mod->kind);
1187 return 0;
Guido van Rossumd076c731998-10-07 19:42:25 +00001188 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001189 co = assemble(c, addNone);
1190 compiler_exit_scope(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001191 return co;
1192}
1193
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001194/* The test for LOCAL must come before the test for FREE in order to
1195 handle classes where name is both local and free. The local var is
1196 a method and the free var is a free var referenced within a method.
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001197*/
1198
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001199static int
1200get_ref_type(struct compiler *c, PyObject *name)
1201{
1202 int scope = PyST_GetScope(c->u->u_ste, name);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001203 if (scope == 0) {
1204 char buf[350];
1205 PyOS_snprintf(buf, sizeof(buf),
1206 "unknown scope for %.100s in %.100s(%s) in %s\n"
1207 "symbols: %s\nlocals: %s\nglobals: %s\n",
1208 PyString_AS_STRING(name),
1209 PyString_AS_STRING(c->u->u_name),
1210 PyObject_REPR(c->u->u_ste->ste_id),
1211 c->c_filename,
1212 PyObject_REPR(c->u->u_ste->ste_symbols),
1213 PyObject_REPR(c->u->u_varnames),
1214 PyObject_REPR(c->u->u_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001215 );
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001216 Py_FatalError(buf);
1217 }
Tim Peters2a7f3842001-06-09 09:26:21 +00001218
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001219 return scope;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001220}
1221
1222static int
1223compiler_lookup_arg(PyObject *dict, PyObject *name)
1224{
1225 PyObject *k, *v;
Georg Brandl7784f122006-05-26 20:04:44 +00001226 k = PyTuple_Pack(2, name, name->ob_type);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001227 if (k == NULL)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001228 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001229 v = PyDict_GetItem(dict, k);
Neal Norwitz3715c3e2005-11-24 22:09:18 +00001230 Py_DECREF(k);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001231 if (v == NULL)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001232 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001233 return PyInt_AS_LONG(v);
1234}
1235
1236static int
1237compiler_make_closure(struct compiler *c, PyCodeObject *co, int args)
1238{
1239 int i, free = PyCode_GetNumFree(co);
1240 if (free == 0) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001241 ADDOP_O(c, LOAD_CONST, (PyObject*)co, consts);
1242 ADDOP_I(c, MAKE_FUNCTION, args);
1243 return 1;
1244 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001245 for (i = 0; i < free; ++i) {
1246 /* Bypass com_addop_varname because it will generate
1247 LOAD_DEREF but LOAD_CLOSURE is needed.
1248 */
1249 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
1250 int arg, reftype;
1251
1252 /* Special case: If a class contains a method with a
1253 free variable that has the same name as a method,
1254 the name will be considered free *and* local in the
1255 class. It should be handled by the closure, as
1256 well as by the normal name loookup logic.
1257 */
1258 reftype = get_ref_type(c, name);
1259 if (reftype == CELL)
1260 arg = compiler_lookup_arg(c->u->u_cellvars, name);
1261 else /* (reftype == FREE) */
1262 arg = compiler_lookup_arg(c->u->u_freevars, name);
1263 if (arg == -1) {
1264 printf("lookup %s in %s %d %d\n"
1265 "freevars of %s: %s\n",
1266 PyObject_REPR(name),
1267 PyString_AS_STRING(c->u->u_name),
1268 reftype, arg,
1269 PyString_AS_STRING(co->co_name),
1270 PyObject_REPR(co->co_freevars));
1271 Py_FatalError("compiler_make_closure()");
1272 }
1273 ADDOP_I(c, LOAD_CLOSURE, arg);
1274 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001275 ADDOP_I(c, BUILD_TUPLE, free);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001276 ADDOP_O(c, LOAD_CONST, (PyObject*)co, consts);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001277 ADDOP_I(c, MAKE_CLOSURE, args);
1278 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001279}
1280
1281static int
1282compiler_decorators(struct compiler *c, asdl_seq* decos)
1283{
1284 int i;
1285
1286 if (!decos)
1287 return 1;
1288
1289 for (i = 0; i < asdl_seq_LEN(decos); i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00001290 VISIT(c, expr, (expr_ty)asdl_seq_GET(decos, i));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001291 }
1292 return 1;
1293}
1294
1295static int
1296compiler_arguments(struct compiler *c, arguments_ty args)
1297{
1298 int i;
1299 int n = asdl_seq_LEN(args->args);
1300 /* Correctly handle nested argument lists */
1301 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00001302 expr_ty arg = (expr_ty)asdl_seq_GET(args->args, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001303 if (arg->kind == Tuple_kind) {
1304 PyObject *id = PyString_FromFormat(".%d", i);
1305 if (id == NULL) {
1306 return 0;
1307 }
1308 if (!compiler_nameop(c, id, Load)) {
1309 Py_DECREF(id);
1310 return 0;
1311 }
1312 Py_DECREF(id);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001313 VISIT(c, expr, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001314 }
1315 }
1316 return 1;
1317}
1318
1319static int
1320compiler_function(struct compiler *c, stmt_ty s)
1321{
1322 PyCodeObject *co;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001323 PyObject *first_const = Py_None;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001324 arguments_ty args = s->v.FunctionDef.args;
1325 asdl_seq* decos = s->v.FunctionDef.decorators;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001326 stmt_ty st;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001327 int i, n, docstring;
1328
1329 assert(s->kind == FunctionDef_kind);
1330
1331 if (!compiler_decorators(c, decos))
1332 return 0;
1333 if (args->defaults)
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001334 VISIT_SEQ(c, expr, args->defaults);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001335 if (!compiler_enter_scope(c, s->v.FunctionDef.name, (void *)s,
1336 s->lineno))
1337 return 0;
1338
Anthony Baxter7b782b62006-04-11 12:01:56 +00001339 st = (stmt_ty)asdl_seq_GET(s->v.FunctionDef.body, 0);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001340 docstring = compiler_isdocstring(st);
Georg Brandl5a5bc7b2007-09-19 06:37:19 +00001341 if (docstring && Py_OptimizeFlag < 2)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001342 first_const = st->v.Expr.value->v.Str.s;
1343 if (compiler_add_o(c, c->u->u_consts, first_const) < 0) {
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001344 compiler_exit_scope(c);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001345 return 0;
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001346 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001347
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001348 /* unpack nested arguments */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001349 compiler_arguments(c, args);
1350
1351 c->u->u_argcount = asdl_seq_LEN(args->args);
1352 n = asdl_seq_LEN(s->v.FunctionDef.body);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001353 /* if there was a docstring, we need to skip the first statement */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001354 for (i = docstring; i < n; i++) {
Neal Norwitz4ffedad2006-08-04 04:58:47 +00001355 st = (stmt_ty)asdl_seq_GET(s->v.FunctionDef.body, i);
1356 VISIT_IN_SCOPE(c, stmt, st);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001357 }
1358 co = assemble(c, 1);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001359 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001360 if (co == NULL)
1361 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001362
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001363 compiler_make_closure(c, co, asdl_seq_LEN(args->defaults));
Neal Norwitz4737b232005-11-19 23:58:29 +00001364 Py_DECREF(co);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001365
1366 for (i = 0; i < asdl_seq_LEN(decos); i++) {
1367 ADDOP_I(c, CALL_FUNCTION, 1);
1368 }
1369
1370 return compiler_nameop(c, s->v.FunctionDef.name, Store);
1371}
1372
1373static int
1374compiler_class(struct compiler *c, stmt_ty s)
1375{
1376 int n;
1377 PyCodeObject *co;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001378 PyObject *str;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001379 /* push class name on stack, needed by BUILD_CLASS */
1380 ADDOP_O(c, LOAD_CONST, s->v.ClassDef.name, consts);
1381 /* push the tuple of base classes on the stack */
1382 n = asdl_seq_LEN(s->v.ClassDef.bases);
1383 if (n > 0)
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001384 VISIT_SEQ(c, expr, s->v.ClassDef.bases);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001385 ADDOP_I(c, BUILD_TUPLE, n);
1386 if (!compiler_enter_scope(c, s->v.ClassDef.name, (void *)s,
1387 s->lineno))
1388 return 0;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001389 c->u->u_private = s->v.ClassDef.name;
1390 Py_INCREF(c->u->u_private);
1391 str = PyString_InternFromString("__name__");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001392 if (!str || !compiler_nameop(c, str, Load)) {
1393 Py_XDECREF(str);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001394 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001395 return 0;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001396 }
1397
1398 Py_DECREF(str);
1399 str = PyString_InternFromString("__module__");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001400 if (!str || !compiler_nameop(c, str, Store)) {
1401 Py_XDECREF(str);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001402 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001403 return 0;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001404 }
1405 Py_DECREF(str);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001406
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001407 if (!compiler_body(c, s->v.ClassDef.body)) {
1408 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001409 return 0;
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001410 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001411
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001412 ADDOP_IN_SCOPE(c, LOAD_LOCALS);
1413 ADDOP_IN_SCOPE(c, RETURN_VALUE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001414 co = assemble(c, 1);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001415 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001416 if (co == NULL)
1417 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001418
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001419 compiler_make_closure(c, co, 0);
Neal Norwitz4737b232005-11-19 23:58:29 +00001420 Py_DECREF(co);
1421
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001422 ADDOP_I(c, CALL_FUNCTION, 0);
1423 ADDOP(c, BUILD_CLASS);
1424 if (!compiler_nameop(c, s->v.ClassDef.name, Store))
1425 return 0;
1426 return 1;
1427}
1428
1429static int
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001430compiler_ifexp(struct compiler *c, expr_ty e)
1431{
1432 basicblock *end, *next;
1433
1434 assert(e->kind == IfExp_kind);
1435 end = compiler_new_block(c);
1436 if (end == NULL)
1437 return 0;
1438 next = compiler_new_block(c);
1439 if (next == NULL)
1440 return 0;
1441 VISIT(c, expr, e->v.IfExp.test);
1442 ADDOP_JREL(c, JUMP_IF_FALSE, next);
1443 ADDOP(c, POP_TOP);
1444 VISIT(c, expr, e->v.IfExp.body);
1445 ADDOP_JREL(c, JUMP_FORWARD, end);
1446 compiler_use_next_block(c, next);
1447 ADDOP(c, POP_TOP);
1448 VISIT(c, expr, e->v.IfExp.orelse);
1449 compiler_use_next_block(c, end);
1450 return 1;
1451}
1452
1453static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001454compiler_lambda(struct compiler *c, expr_ty e)
1455{
1456 PyCodeObject *co;
Nick Coghlan944d3eb2005-11-16 12:46:55 +00001457 static identifier name;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001458 arguments_ty args = e->v.Lambda.args;
1459 assert(e->kind == Lambda_kind);
1460
Nick Coghlan944d3eb2005-11-16 12:46:55 +00001461 if (!name) {
1462 name = PyString_InternFromString("<lambda>");
1463 if (!name)
1464 return 0;
1465 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001466
1467 if (args->defaults)
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001468 VISIT_SEQ(c, expr, args->defaults);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001469 if (!compiler_enter_scope(c, name, (void *)e, e->lineno))
1470 return 0;
Neal Norwitz4737b232005-11-19 23:58:29 +00001471
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001472 /* unpack nested arguments */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001473 compiler_arguments(c, args);
1474
1475 c->u->u_argcount = asdl_seq_LEN(args->args);
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001476 VISIT_IN_SCOPE(c, expr, e->v.Lambda.body);
1477 ADDOP_IN_SCOPE(c, RETURN_VALUE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001478 co = assemble(c, 1);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001479 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001480 if (co == NULL)
1481 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001482
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001483 compiler_make_closure(c, co, asdl_seq_LEN(args->defaults));
Neal Norwitz4737b232005-11-19 23:58:29 +00001484 Py_DECREF(co);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001485
1486 return 1;
1487}
1488
1489static int
1490compiler_print(struct compiler *c, stmt_ty s)
1491{
1492 int i, n;
1493 bool dest;
1494
1495 assert(s->kind == Print_kind);
1496 n = asdl_seq_LEN(s->v.Print.values);
1497 dest = false;
1498 if (s->v.Print.dest) {
1499 VISIT(c, expr, s->v.Print.dest);
1500 dest = true;
1501 }
1502 for (i = 0; i < n; i++) {
1503 expr_ty e = (expr_ty)asdl_seq_GET(s->v.Print.values, i);
1504 if (dest) {
1505 ADDOP(c, DUP_TOP);
1506 VISIT(c, expr, e);
1507 ADDOP(c, ROT_TWO);
1508 ADDOP(c, PRINT_ITEM_TO);
1509 }
1510 else {
1511 VISIT(c, expr, e);
1512 ADDOP(c, PRINT_ITEM);
1513 }
1514 }
1515 if (s->v.Print.nl) {
1516 if (dest)
1517 ADDOP(c, PRINT_NEWLINE_TO)
1518 else
1519 ADDOP(c, PRINT_NEWLINE)
1520 }
1521 else if (dest)
1522 ADDOP(c, POP_TOP);
1523 return 1;
1524}
1525
1526static int
1527compiler_if(struct compiler *c, stmt_ty s)
1528{
1529 basicblock *end, *next;
Georg Brandlddbaa662006-06-04 21:56:52 +00001530 int constant;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001531 assert(s->kind == If_kind);
1532 end = compiler_new_block(c);
1533 if (end == NULL)
1534 return 0;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001535 next = compiler_new_block(c);
1536 if (next == NULL)
1537 return 0;
Georg Brandlddbaa662006-06-04 21:56:52 +00001538
1539 constant = expr_constant(s->v.If.test);
1540 /* constant = 0: "if 0"
1541 * constant = 1: "if 1", "if 2", ...
1542 * constant = -1: rest */
1543 if (constant == 0) {
1544 if (s->v.If.orelse)
1545 VISIT_SEQ(c, stmt, s->v.If.orelse);
1546 } else if (constant == 1) {
1547 VISIT_SEQ(c, stmt, s->v.If.body);
1548 } else {
1549 VISIT(c, expr, s->v.If.test);
1550 ADDOP_JREL(c, JUMP_IF_FALSE, next);
1551 ADDOP(c, POP_TOP);
1552 VISIT_SEQ(c, stmt, s->v.If.body);
1553 ADDOP_JREL(c, JUMP_FORWARD, end);
1554 compiler_use_next_block(c, next);
1555 ADDOP(c, POP_TOP);
1556 if (s->v.If.orelse)
Jeremy Hylton819de6c2007-02-27 16:13:23 +00001557 VISIT_SEQ(c, stmt, s->v.If.orelse);
Georg Brandlddbaa662006-06-04 21:56:52 +00001558 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001559 compiler_use_next_block(c, end);
1560 return 1;
1561}
1562
1563static int
1564compiler_for(struct compiler *c, stmt_ty s)
1565{
1566 basicblock *start, *cleanup, *end;
1567
1568 start = compiler_new_block(c);
1569 cleanup = compiler_new_block(c);
1570 end = compiler_new_block(c);
1571 if (start == NULL || end == NULL || cleanup == NULL)
1572 return 0;
1573 ADDOP_JREL(c, SETUP_LOOP, end);
1574 if (!compiler_push_fblock(c, LOOP, start))
1575 return 0;
1576 VISIT(c, expr, s->v.For.iter);
1577 ADDOP(c, GET_ITER);
1578 compiler_use_next_block(c, start);
Neal Norwitz4ffedad2006-08-04 04:58:47 +00001579 /* XXX(nnorwitz): is there a better way to handle this?
1580 for loops are special, we want to be able to trace them
1581 each time around, so we need to set an extra line number. */
1582 c->u->u_lineno_set = false;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001583 ADDOP_JREL(c, FOR_ITER, cleanup);
1584 VISIT(c, expr, s->v.For.target);
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001585 VISIT_SEQ(c, stmt, s->v.For.body);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001586 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
1587 compiler_use_next_block(c, cleanup);
1588 ADDOP(c, POP_BLOCK);
1589 compiler_pop_fblock(c, LOOP, start);
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001590 VISIT_SEQ(c, stmt, s->v.For.orelse);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001591 compiler_use_next_block(c, end);
1592 return 1;
1593}
1594
1595static int
1596compiler_while(struct compiler *c, stmt_ty s)
1597{
1598 basicblock *loop, *orelse, *end, *anchor = NULL;
1599 int constant = expr_constant(s->v.While.test);
1600
Amaury Forgeot d'Arc16570f52008-01-24 22:51:18 +00001601 if (constant == 0) {
1602 if (s->v.While.orelse)
1603 VISIT_SEQ(c, stmt, s->v.While.orelse);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001604 return 1;
Amaury Forgeot d'Arc16570f52008-01-24 22:51:18 +00001605 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001606 loop = compiler_new_block(c);
1607 end = compiler_new_block(c);
1608 if (constant == -1) {
1609 anchor = compiler_new_block(c);
1610 if (anchor == NULL)
1611 return 0;
1612 }
1613 if (loop == NULL || end == NULL)
1614 return 0;
1615 if (s->v.While.orelse) {
1616 orelse = compiler_new_block(c);
1617 if (orelse == NULL)
1618 return 0;
1619 }
1620 else
1621 orelse = NULL;
1622
1623 ADDOP_JREL(c, SETUP_LOOP, end);
Nick Coghlanb90f52e2007-08-25 04:35:54 +00001624 compiler_use_next_block(c, loop);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001625 if (!compiler_push_fblock(c, LOOP, loop))
1626 return 0;
1627 if (constant == -1) {
1628 VISIT(c, expr, s->v.While.test);
1629 ADDOP_JREL(c, JUMP_IF_FALSE, anchor);
1630 ADDOP(c, POP_TOP);
1631 }
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001632 VISIT_SEQ(c, stmt, s->v.While.body);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001633 ADDOP_JABS(c, JUMP_ABSOLUTE, loop);
1634
1635 /* XXX should the two POP instructions be in a separate block
1636 if there is no else clause ?
1637 */
1638
1639 if (constant == -1) {
1640 compiler_use_next_block(c, anchor);
1641 ADDOP(c, POP_TOP);
1642 ADDOP(c, POP_BLOCK);
1643 }
1644 compiler_pop_fblock(c, LOOP, loop);
Jeremy Hylton12603c42006-04-01 16:18:02 +00001645 if (orelse != NULL) /* what if orelse is just pass? */
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001646 VISIT_SEQ(c, stmt, s->v.While.orelse);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001647 compiler_use_next_block(c, end);
1648
1649 return 1;
1650}
1651
1652static int
1653compiler_continue(struct compiler *c)
1654{
1655 static const char LOOP_ERROR_MSG[] = "'continue' not properly in loop";
Neal Norwitz4f096d92006-08-21 19:47:08 +00001656 static const char IN_FINALLY_ERROR_MSG[] =
1657 "'continue' not supported inside 'finally' clause";
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001658 int i;
1659
1660 if (!c->u->u_nfblocks)
1661 return compiler_error(c, LOOP_ERROR_MSG);
1662 i = c->u->u_nfblocks - 1;
1663 switch (c->u->u_fblock[i].fb_type) {
1664 case LOOP:
1665 ADDOP_JABS(c, JUMP_ABSOLUTE, c->u->u_fblock[i].fb_block);
1666 break;
1667 case EXCEPT:
1668 case FINALLY_TRY:
Neal Norwitz4f096d92006-08-21 19:47:08 +00001669 while (--i >= 0 && c->u->u_fblock[i].fb_type != LOOP) {
1670 /* Prevent continue anywhere under a finally
1671 even if hidden in a sub-try or except. */
1672 if (c->u->u_fblock[i].fb_type == FINALLY_END)
1673 return compiler_error(c, IN_FINALLY_ERROR_MSG);
1674 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001675 if (i == -1)
1676 return compiler_error(c, LOOP_ERROR_MSG);
1677 ADDOP_JABS(c, CONTINUE_LOOP, c->u->u_fblock[i].fb_block);
1678 break;
1679 case FINALLY_END:
Neal Norwitz4f096d92006-08-21 19:47:08 +00001680 return compiler_error(c, IN_FINALLY_ERROR_MSG);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001681 }
1682
1683 return 1;
1684}
1685
1686/* Code generated for "try: <body> finally: <finalbody>" is as follows:
1687
1688 SETUP_FINALLY L
1689 <code for body>
1690 POP_BLOCK
1691 LOAD_CONST <None>
1692 L: <code for finalbody>
1693 END_FINALLY
1694
1695 The special instructions use the block stack. Each block
1696 stack entry contains the instruction that created it (here
1697 SETUP_FINALLY), the level of the value stack at the time the
1698 block stack entry was created, and a label (here L).
1699
1700 SETUP_FINALLY:
1701 Pushes the current value stack level and the label
1702 onto the block stack.
1703 POP_BLOCK:
1704 Pops en entry from the block stack, and pops the value
1705 stack until its level is the same as indicated on the
1706 block stack. (The label is ignored.)
1707 END_FINALLY:
1708 Pops a variable number of entries from the *value* stack
1709 and re-raises the exception they specify. The number of
1710 entries popped depends on the (pseudo) exception type.
1711
1712 The block stack is unwound when an exception is raised:
1713 when a SETUP_FINALLY entry is found, the exception is pushed
1714 onto the value stack (and the exception condition is cleared),
1715 and the interpreter jumps to the label gotten from the block
1716 stack.
1717*/
1718
1719static int
1720compiler_try_finally(struct compiler *c, stmt_ty s)
1721{
1722 basicblock *body, *end;
1723 body = compiler_new_block(c);
1724 end = compiler_new_block(c);
1725 if (body == NULL || end == NULL)
1726 return 0;
1727
1728 ADDOP_JREL(c, SETUP_FINALLY, end);
1729 compiler_use_next_block(c, body);
1730 if (!compiler_push_fblock(c, FINALLY_TRY, body))
1731 return 0;
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001732 VISIT_SEQ(c, stmt, s->v.TryFinally.body);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001733 ADDOP(c, POP_BLOCK);
1734 compiler_pop_fblock(c, FINALLY_TRY, body);
1735
1736 ADDOP_O(c, LOAD_CONST, Py_None, consts);
1737 compiler_use_next_block(c, end);
1738 if (!compiler_push_fblock(c, FINALLY_END, end))
1739 return 0;
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001740 VISIT_SEQ(c, stmt, s->v.TryFinally.finalbody);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001741 ADDOP(c, END_FINALLY);
1742 compiler_pop_fblock(c, FINALLY_END, end);
1743
1744 return 1;
1745}
1746
1747/*
1748 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
1749 (The contents of the value stack is shown in [], with the top
1750 at the right; 'tb' is trace-back info, 'val' the exception's
1751 associated value, and 'exc' the exception.)
1752
1753 Value stack Label Instruction Argument
1754 [] SETUP_EXCEPT L1
1755 [] <code for S>
1756 [] POP_BLOCK
1757 [] JUMP_FORWARD L0
1758
1759 [tb, val, exc] L1: DUP )
1760 [tb, val, exc, exc] <evaluate E1> )
1761 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
1762 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
1763 [tb, val, exc, 1] POP )
1764 [tb, val, exc] POP
1765 [tb, val] <assign to V1> (or POP if no V1)
1766 [tb] POP
1767 [] <code for S1>
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001768 JUMP_FORWARD L0
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001769
1770 [tb, val, exc, 0] L2: POP
1771 [tb, val, exc] DUP
1772 .............................etc.......................
1773
1774 [tb, val, exc, 0] Ln+1: POP
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001775 [tb, val, exc] END_FINALLY # re-raise exception
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001776
1777 [] L0: <next statement>
1778
1779 Of course, parts are not generated if Vi or Ei is not present.
1780*/
1781static int
1782compiler_try_except(struct compiler *c, stmt_ty s)
1783{
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001784 basicblock *body, *orelse, *except, *end;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001785 int i, n;
1786
1787 body = compiler_new_block(c);
1788 except = compiler_new_block(c);
1789 orelse = compiler_new_block(c);
1790 end = compiler_new_block(c);
1791 if (body == NULL || except == NULL || orelse == NULL || end == NULL)
1792 return 0;
1793 ADDOP_JREL(c, SETUP_EXCEPT, except);
1794 compiler_use_next_block(c, body);
1795 if (!compiler_push_fblock(c, EXCEPT, body))
1796 return 0;
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001797 VISIT_SEQ(c, stmt, s->v.TryExcept.body);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001798 ADDOP(c, POP_BLOCK);
1799 compiler_pop_fblock(c, EXCEPT, body);
1800 ADDOP_JREL(c, JUMP_FORWARD, orelse);
1801 n = asdl_seq_LEN(s->v.TryExcept.handlers);
1802 compiler_use_next_block(c, except);
1803 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00001804 excepthandler_ty handler = (excepthandler_ty)asdl_seq_GET(
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001805 s->v.TryExcept.handlers, i);
1806 if (!handler->type && i < n-1)
1807 return compiler_error(c, "default 'except:' must be last");
Jeremy Hylton819de6c2007-02-27 16:13:23 +00001808 c->u->u_lineno_set = false;
1809 c->u->u_lineno = handler->lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001810 except = compiler_new_block(c);
1811 if (except == NULL)
1812 return 0;
1813 if (handler->type) {
1814 ADDOP(c, DUP_TOP);
1815 VISIT(c, expr, handler->type);
1816 ADDOP_I(c, COMPARE_OP, PyCmp_EXC_MATCH);
1817 ADDOP_JREL(c, JUMP_IF_FALSE, except);
1818 ADDOP(c, POP_TOP);
1819 }
1820 ADDOP(c, POP_TOP);
1821 if (handler->name) {
1822 VISIT(c, expr, handler->name);
1823 }
1824 else {
1825 ADDOP(c, POP_TOP);
1826 }
1827 ADDOP(c, POP_TOP);
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001828 VISIT_SEQ(c, stmt, handler->body);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001829 ADDOP_JREL(c, JUMP_FORWARD, end);
1830 compiler_use_next_block(c, except);
1831 if (handler->type)
1832 ADDOP(c, POP_TOP);
1833 }
1834 ADDOP(c, END_FINALLY);
1835 compiler_use_next_block(c, orelse);
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001836 VISIT_SEQ(c, stmt, s->v.TryExcept.orelse);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001837 compiler_use_next_block(c, end);
1838 return 1;
1839}
1840
1841static int
1842compiler_import_as(struct compiler *c, identifier name, identifier asname)
1843{
1844 /* The IMPORT_NAME opcode was already generated. This function
1845 merely needs to bind the result to a name.
1846
1847 If there is a dot in name, we need to split it and emit a
1848 LOAD_ATTR for each name.
1849 */
1850 const char *src = PyString_AS_STRING(name);
1851 const char *dot = strchr(src, '.');
1852 if (dot) {
1853 /* Consume the base module name to get the first attribute */
1854 src = dot + 1;
1855 while (dot) {
1856 /* NB src is only defined when dot != NULL */
Armin Rigo31441302005-10-21 12:57:31 +00001857 PyObject *attr;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001858 dot = strchr(src, '.');
Armin Rigo31441302005-10-21 12:57:31 +00001859 attr = PyString_FromStringAndSize(src,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001860 dot ? dot - src : strlen(src));
Neal Norwitz7bcabc62005-11-20 23:58:38 +00001861 if (!attr)
1862 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001863 ADDOP_O(c, LOAD_ATTR, attr, names);
Neal Norwitz7bcabc62005-11-20 23:58:38 +00001864 Py_DECREF(attr);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001865 src = dot + 1;
1866 }
1867 }
1868 return compiler_nameop(c, asname, Store);
1869}
1870
1871static int
1872compiler_import(struct compiler *c, stmt_ty s)
1873{
1874 /* The Import node stores a module name like a.b.c as a single
1875 string. This is convenient for all cases except
1876 import a.b.c as d
1877 where we need to parse that string to extract the individual
1878 module names.
1879 XXX Perhaps change the representation to make this case simpler?
1880 */
1881 int i, n = asdl_seq_LEN(s->v.Import.names);
Thomas Woutersf7f438b2006-02-28 16:09:29 +00001882
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001883 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00001884 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.Import.names, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001885 int r;
Thomas Woutersf7f438b2006-02-28 16:09:29 +00001886 PyObject *level;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001887
Neal Norwitzcbce2802006-04-03 06:26:32 +00001888 if (c->c_flags && (c->c_flags->cf_flags & CO_FUTURE_ABSOLUTE_IMPORT))
Thomas Woutersf7f438b2006-02-28 16:09:29 +00001889 level = PyInt_FromLong(0);
1890 else
1891 level = PyInt_FromLong(-1);
1892
1893 if (level == NULL)
1894 return 0;
1895
1896 ADDOP_O(c, LOAD_CONST, level, consts);
1897 Py_DECREF(level);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001898 ADDOP_O(c, LOAD_CONST, Py_None, consts);
1899 ADDOP_NAME(c, IMPORT_NAME, alias->name, names);
1900
1901 if (alias->asname) {
Neil Schemenauerac699ef2005-10-23 03:45:42 +00001902 r = compiler_import_as(c, alias->name, alias->asname);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001903 if (!r)
1904 return r;
1905 }
1906 else {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001907 identifier tmp = alias->name;
1908 const char *base = PyString_AS_STRING(alias->name);
1909 char *dot = strchr(base, '.');
1910 if (dot)
1911 tmp = PyString_FromStringAndSize(base,
1912 dot - base);
1913 r = compiler_nameop(c, tmp, Store);
1914 if (dot) {
1915 Py_DECREF(tmp);
1916 }
1917 if (!r)
1918 return r;
1919 }
1920 }
1921 return 1;
1922}
1923
1924static int
1925compiler_from_import(struct compiler *c, stmt_ty s)
1926{
1927 int i, n = asdl_seq_LEN(s->v.ImportFrom.names);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001928
1929 PyObject *names = PyTuple_New(n);
Thomas Woutersf7f438b2006-02-28 16:09:29 +00001930 PyObject *level;
1931
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001932 if (!names)
1933 return 0;
1934
Thomas Woutersf7f438b2006-02-28 16:09:29 +00001935 if (s->v.ImportFrom.level == 0 && c->c_flags &&
Neal Norwitzcbce2802006-04-03 06:26:32 +00001936 !(c->c_flags->cf_flags & CO_FUTURE_ABSOLUTE_IMPORT))
Thomas Woutersf7f438b2006-02-28 16:09:29 +00001937 level = PyInt_FromLong(-1);
1938 else
1939 level = PyInt_FromLong(s->v.ImportFrom.level);
1940
1941 if (!level) {
1942 Py_DECREF(names);
1943 return 0;
1944 }
1945
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001946 /* build up the names */
1947 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00001948 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001949 Py_INCREF(alias->name);
1950 PyTuple_SET_ITEM(names, i, alias->name);
1951 }
1952
1953 if (s->lineno > c->c_future->ff_lineno) {
1954 if (!strcmp(PyString_AS_STRING(s->v.ImportFrom.module),
1955 "__future__")) {
Neal Norwitzd9cf85f2006-03-02 08:08:42 +00001956 Py_DECREF(level);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001957 Py_DECREF(names);
1958 return compiler_error(c,
1959 "from __future__ imports must occur "
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001960 "at the beginning of the file");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001961
1962 }
1963 }
1964
Thomas Woutersf7f438b2006-02-28 16:09:29 +00001965 ADDOP_O(c, LOAD_CONST, level, consts);
1966 Py_DECREF(level);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001967 ADDOP_O(c, LOAD_CONST, names, consts);
Neal Norwitz3715c3e2005-11-24 22:09:18 +00001968 Py_DECREF(names);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001969 ADDOP_NAME(c, IMPORT_NAME, s->v.ImportFrom.module, names);
1970 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00001971 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001972 identifier store_name;
1973
1974 if (i == 0 && *PyString_AS_STRING(alias->name) == '*') {
1975 assert(n == 1);
1976 ADDOP(c, IMPORT_STAR);
Neal Norwitz28b32ac2005-12-06 07:41:30 +00001977 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001978 }
1979
1980 ADDOP_NAME(c, IMPORT_FROM, alias->name, names);
1981 store_name = alias->name;
1982 if (alias->asname)
1983 store_name = alias->asname;
1984
1985 if (!compiler_nameop(c, store_name, Store)) {
1986 Py_DECREF(names);
1987 return 0;
1988 }
1989 }
Neal Norwitz28b32ac2005-12-06 07:41:30 +00001990 /* remove imported module */
1991 ADDOP(c, POP_TOP);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001992 return 1;
1993}
1994
1995static int
1996compiler_assert(struct compiler *c, stmt_ty s)
1997{
1998 static PyObject *assertion_error = NULL;
1999 basicblock *end;
2000
2001 if (Py_OptimizeFlag)
2002 return 1;
2003 if (assertion_error == NULL) {
2004 assertion_error = PyString_FromString("AssertionError");
2005 if (assertion_error == NULL)
2006 return 0;
2007 }
2008 VISIT(c, expr, s->v.Assert.test);
2009 end = compiler_new_block(c);
2010 if (end == NULL)
2011 return 0;
2012 ADDOP_JREL(c, JUMP_IF_TRUE, end);
2013 ADDOP(c, POP_TOP);
2014 ADDOP_O(c, LOAD_GLOBAL, assertion_error, names);
2015 if (s->v.Assert.msg) {
2016 VISIT(c, expr, s->v.Assert.msg);
2017 ADDOP_I(c, RAISE_VARARGS, 2);
2018 }
2019 else {
2020 ADDOP_I(c, RAISE_VARARGS, 1);
2021 }
Neal Norwitz51abbc72005-12-18 07:06:23 +00002022 compiler_use_next_block(c, end);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002023 ADDOP(c, POP_TOP);
2024 return 1;
2025}
2026
2027static int
2028compiler_visit_stmt(struct compiler *c, stmt_ty s)
2029{
2030 int i, n;
2031
Neal Norwitzf733a012006-10-29 18:30:10 +00002032 /* Always assign a lineno to the next instruction for a stmt. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002033 c->u->u_lineno = s->lineno;
2034 c->u->u_lineno_set = false;
Jeremy Hylton12603c42006-04-01 16:18:02 +00002035
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002036 switch (s->kind) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002037 case FunctionDef_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002038 return compiler_function(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002039 case ClassDef_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002040 return compiler_class(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002041 case Return_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002042 if (c->u->u_ste->ste_type != FunctionBlock)
2043 return compiler_error(c, "'return' outside function");
2044 if (s->v.Return.value) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002045 VISIT(c, expr, s->v.Return.value);
2046 }
2047 else
2048 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2049 ADDOP(c, RETURN_VALUE);
2050 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002051 case Delete_kind:
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002052 VISIT_SEQ(c, expr, s->v.Delete.targets)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002053 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002054 case Assign_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002055 n = asdl_seq_LEN(s->v.Assign.targets);
2056 VISIT(c, expr, s->v.Assign.value);
2057 for (i = 0; i < n; i++) {
2058 if (i < n - 1)
2059 ADDOP(c, DUP_TOP);
2060 VISIT(c, expr,
2061 (expr_ty)asdl_seq_GET(s->v.Assign.targets, i));
2062 }
2063 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002064 case AugAssign_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002065 return compiler_augassign(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002066 case Print_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002067 return compiler_print(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002068 case For_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002069 return compiler_for(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002070 case While_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002071 return compiler_while(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002072 case If_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002073 return compiler_if(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002074 case Raise_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002075 n = 0;
2076 if (s->v.Raise.type) {
2077 VISIT(c, expr, s->v.Raise.type);
2078 n++;
2079 if (s->v.Raise.inst) {
2080 VISIT(c, expr, s->v.Raise.inst);
2081 n++;
2082 if (s->v.Raise.tback) {
2083 VISIT(c, expr, s->v.Raise.tback);
2084 n++;
2085 }
2086 }
2087 }
2088 ADDOP_I(c, RAISE_VARARGS, n);
2089 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002090 case TryExcept_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002091 return compiler_try_except(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002092 case TryFinally_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002093 return compiler_try_finally(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002094 case Assert_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002095 return compiler_assert(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002096 case Import_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002097 return compiler_import(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002098 case ImportFrom_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002099 return compiler_from_import(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002100 case Exec_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002101 VISIT(c, expr, s->v.Exec.body);
2102 if (s->v.Exec.globals) {
2103 VISIT(c, expr, s->v.Exec.globals);
2104 if (s->v.Exec.locals) {
2105 VISIT(c, expr, s->v.Exec.locals);
2106 } else {
2107 ADDOP(c, DUP_TOP);
2108 }
2109 } else {
2110 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2111 ADDOP(c, DUP_TOP);
2112 }
2113 ADDOP(c, EXEC_STMT);
2114 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002115 case Global_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002116 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002117 case Expr_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002118 if (c->c_interactive && c->c_nestlevel <= 1) {
Neal Norwitz0cbd8052006-08-04 05:09:28 +00002119 VISIT(c, expr, s->v.Expr.value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002120 ADDOP(c, PRINT_EXPR);
2121 }
Neal Norwitz0cbd8052006-08-04 05:09:28 +00002122 else if (s->v.Expr.value->kind != Str_kind &&
2123 s->v.Expr.value->kind != Num_kind) {
2124 VISIT(c, expr, s->v.Expr.value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002125 ADDOP(c, POP_TOP);
2126 }
2127 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002128 case Pass_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002129 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002130 case Break_kind:
Jeremy Hylton819de6c2007-02-27 16:13:23 +00002131 if (!compiler_in_loop(c))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002132 return compiler_error(c, "'break' outside loop");
2133 ADDOP(c, BREAK_LOOP);
2134 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002135 case Continue_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002136 return compiler_continue(c);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002137 case With_kind:
2138 return compiler_with(c, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002139 }
2140 return 1;
2141}
2142
2143static int
2144unaryop(unaryop_ty op)
2145{
2146 switch (op) {
2147 case Invert:
2148 return UNARY_INVERT;
2149 case Not:
2150 return UNARY_NOT;
2151 case UAdd:
2152 return UNARY_POSITIVE;
2153 case USub:
2154 return UNARY_NEGATIVE;
2155 }
2156 return 0;
2157}
2158
2159static int
2160binop(struct compiler *c, operator_ty op)
2161{
2162 switch (op) {
2163 case Add:
2164 return BINARY_ADD;
2165 case Sub:
2166 return BINARY_SUBTRACT;
2167 case Mult:
2168 return BINARY_MULTIPLY;
2169 case Div:
2170 if (c->c_flags && c->c_flags->cf_flags & CO_FUTURE_DIVISION)
2171 return BINARY_TRUE_DIVIDE;
2172 else
2173 return BINARY_DIVIDE;
2174 case Mod:
2175 return BINARY_MODULO;
2176 case Pow:
2177 return BINARY_POWER;
2178 case LShift:
2179 return BINARY_LSHIFT;
2180 case RShift:
2181 return BINARY_RSHIFT;
2182 case BitOr:
2183 return BINARY_OR;
2184 case BitXor:
2185 return BINARY_XOR;
2186 case BitAnd:
2187 return BINARY_AND;
2188 case FloorDiv:
2189 return BINARY_FLOOR_DIVIDE;
2190 }
2191 return 0;
2192}
2193
2194static int
2195cmpop(cmpop_ty op)
2196{
2197 switch (op) {
2198 case Eq:
2199 return PyCmp_EQ;
2200 case NotEq:
2201 return PyCmp_NE;
2202 case Lt:
2203 return PyCmp_LT;
2204 case LtE:
2205 return PyCmp_LE;
2206 case Gt:
2207 return PyCmp_GT;
2208 case GtE:
2209 return PyCmp_GE;
2210 case Is:
2211 return PyCmp_IS;
2212 case IsNot:
2213 return PyCmp_IS_NOT;
2214 case In:
2215 return PyCmp_IN;
2216 case NotIn:
2217 return PyCmp_NOT_IN;
2218 }
2219 return PyCmp_BAD;
2220}
2221
2222static int
2223inplace_binop(struct compiler *c, operator_ty op)
2224{
2225 switch (op) {
2226 case Add:
2227 return INPLACE_ADD;
2228 case Sub:
2229 return INPLACE_SUBTRACT;
2230 case Mult:
2231 return INPLACE_MULTIPLY;
2232 case Div:
2233 if (c->c_flags && c->c_flags->cf_flags & CO_FUTURE_DIVISION)
2234 return INPLACE_TRUE_DIVIDE;
2235 else
2236 return INPLACE_DIVIDE;
2237 case Mod:
2238 return INPLACE_MODULO;
2239 case Pow:
2240 return INPLACE_POWER;
2241 case LShift:
2242 return INPLACE_LSHIFT;
2243 case RShift:
2244 return INPLACE_RSHIFT;
2245 case BitOr:
2246 return INPLACE_OR;
2247 case BitXor:
2248 return INPLACE_XOR;
2249 case BitAnd:
2250 return INPLACE_AND;
2251 case FloorDiv:
2252 return INPLACE_FLOOR_DIVIDE;
2253 }
Neal Norwitz4737b232005-11-19 23:58:29 +00002254 PyErr_Format(PyExc_SystemError,
Neal Norwitz4e6bf492005-12-18 05:32:41 +00002255 "inplace binary op %d should not be possible", op);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002256 return 0;
2257}
2258
2259static int
2260compiler_nameop(struct compiler *c, identifier name, expr_context_ty ctx)
2261{
Neil Schemenauerdad06a12005-10-23 18:52:36 +00002262 int op, scope, arg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002263 enum { OP_FAST, OP_GLOBAL, OP_DEREF, OP_NAME } optype;
2264
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002265 PyObject *dict = c->u->u_names;
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002266 PyObject *mangled;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002267 /* XXX AugStore isn't used anywhere! */
2268
2269 /* First check for assignment to __debug__. Param? */
2270 if ((ctx == Store || ctx == AugStore || ctx == Del)
2271 && !strcmp(PyString_AS_STRING(name), "__debug__")) {
2272 return compiler_error(c, "can not assign to __debug__");
2273 }
2274
Jeremy Hylton37075c52007-02-27 01:01:59 +00002275mangled = _Py_Mangle(c->u->u_private, name);
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002276 if (!mangled)
2277 return 0;
2278
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002279 op = 0;
2280 optype = OP_NAME;
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002281 scope = PyST_GetScope(c->u->u_ste, mangled);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002282 switch (scope) {
2283 case FREE:
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002284 dict = c->u->u_freevars;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002285 optype = OP_DEREF;
2286 break;
2287 case CELL:
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002288 dict = c->u->u_cellvars;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002289 optype = OP_DEREF;
2290 break;
2291 case LOCAL:
2292 if (c->u->u_ste->ste_type == FunctionBlock)
2293 optype = OP_FAST;
2294 break;
2295 case GLOBAL_IMPLICIT:
Neil Schemenauerd403c452005-10-23 04:24:49 +00002296 if (c->u->u_ste->ste_type == FunctionBlock &&
2297 !c->u->u_ste->ste_unoptimized)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002298 optype = OP_GLOBAL;
2299 break;
2300 case GLOBAL_EXPLICIT:
2301 optype = OP_GLOBAL;
2302 break;
Neal Norwitz4e6bf492005-12-18 05:32:41 +00002303 default:
2304 /* scope can be 0 */
2305 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002306 }
2307
2308 /* XXX Leave assert here, but handle __doc__ and the like better */
2309 assert(scope || PyString_AS_STRING(name)[0] == '_');
2310
2311 switch (optype) {
2312 case OP_DEREF:
2313 switch (ctx) {
2314 case Load: op = LOAD_DEREF; break;
2315 case Store: op = STORE_DEREF; break;
2316 case AugLoad:
2317 case AugStore:
2318 break;
2319 case Del:
2320 PyErr_Format(PyExc_SyntaxError,
2321 "can not delete variable '%s' referenced "
2322 "in nested scope",
2323 PyString_AS_STRING(name));
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002324 Py_DECREF(mangled);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002325 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002326 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00002327 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00002328 PyErr_SetString(PyExc_SystemError,
2329 "param invalid for deref variable");
2330 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002331 }
2332 break;
2333 case OP_FAST:
2334 switch (ctx) {
2335 case Load: op = LOAD_FAST; break;
2336 case Store: op = STORE_FAST; break;
2337 case Del: op = DELETE_FAST; break;
2338 case AugLoad:
2339 case AugStore:
2340 break;
2341 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00002342 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00002343 PyErr_SetString(PyExc_SystemError,
2344 "param invalid for local variable");
2345 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002346 }
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002347 ADDOP_O(c, op, mangled, varnames);
2348 Py_DECREF(mangled);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002349 return 1;
2350 case OP_GLOBAL:
2351 switch (ctx) {
2352 case Load: op = LOAD_GLOBAL; break;
2353 case Store: op = STORE_GLOBAL; break;
2354 case Del: op = DELETE_GLOBAL; break;
2355 case AugLoad:
2356 case AugStore:
2357 break;
2358 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00002359 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00002360 PyErr_SetString(PyExc_SystemError,
2361 "param invalid for global variable");
2362 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002363 }
2364 break;
2365 case OP_NAME:
2366 switch (ctx) {
2367 case Load: op = LOAD_NAME; break;
2368 case Store: op = STORE_NAME; break;
2369 case Del: op = DELETE_NAME; break;
2370 case AugLoad:
2371 case AugStore:
2372 break;
2373 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00002374 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00002375 PyErr_SetString(PyExc_SystemError,
2376 "param invalid for name variable");
2377 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002378 }
2379 break;
2380 }
2381
2382 assert(op);
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002383 arg = compiler_add_o(c, dict, mangled);
Neal Norwitz4737b232005-11-19 23:58:29 +00002384 Py_DECREF(mangled);
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002385 if (arg < 0)
2386 return 0;
Neil Schemenauerdad06a12005-10-23 18:52:36 +00002387 return compiler_addop_i(c, op, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002388}
2389
2390static int
2391compiler_boolop(struct compiler *c, expr_ty e)
2392{
2393 basicblock *end;
2394 int jumpi, i, n;
2395 asdl_seq *s;
2396
2397 assert(e->kind == BoolOp_kind);
2398 if (e->v.BoolOp.op == And)
2399 jumpi = JUMP_IF_FALSE;
2400 else
2401 jumpi = JUMP_IF_TRUE;
2402 end = compiler_new_block(c);
Martin v. Löwis94962612006-01-02 21:15:05 +00002403 if (end == NULL)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002404 return 0;
2405 s = e->v.BoolOp.values;
2406 n = asdl_seq_LEN(s) - 1;
Neal Norwitzc173b482006-07-30 19:18:13 +00002407 assert(n >= 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002408 for (i = 0; i < n; ++i) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00002409 VISIT(c, expr, (expr_ty)asdl_seq_GET(s, i));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002410 ADDOP_JREL(c, jumpi, end);
2411 ADDOP(c, POP_TOP)
2412 }
Anthony Baxter7b782b62006-04-11 12:01:56 +00002413 VISIT(c, expr, (expr_ty)asdl_seq_GET(s, n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002414 compiler_use_next_block(c, end);
2415 return 1;
2416}
2417
2418static int
2419compiler_list(struct compiler *c, expr_ty e)
2420{
2421 int n = asdl_seq_LEN(e->v.List.elts);
2422 if (e->v.List.ctx == Store) {
2423 ADDOP_I(c, UNPACK_SEQUENCE, n);
2424 }
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002425 VISIT_SEQ(c, expr, e->v.List.elts);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002426 if (e->v.List.ctx == Load) {
2427 ADDOP_I(c, BUILD_LIST, n);
2428 }
2429 return 1;
2430}
2431
2432static int
2433compiler_tuple(struct compiler *c, expr_ty e)
2434{
2435 int n = asdl_seq_LEN(e->v.Tuple.elts);
2436 if (e->v.Tuple.ctx == Store) {
2437 ADDOP_I(c, UNPACK_SEQUENCE, n);
2438 }
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002439 VISIT_SEQ(c, expr, e->v.Tuple.elts);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002440 if (e->v.Tuple.ctx == Load) {
2441 ADDOP_I(c, BUILD_TUPLE, n);
2442 }
2443 return 1;
2444}
2445
2446static int
2447compiler_compare(struct compiler *c, expr_ty e)
2448{
2449 int i, n;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002450 basicblock *cleanup = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002451
2452 /* XXX the logic can be cleaned up for 1 or multiple comparisons */
2453 VISIT(c, expr, e->v.Compare.left);
2454 n = asdl_seq_LEN(e->v.Compare.ops);
2455 assert(n > 0);
2456 if (n > 1) {
2457 cleanup = compiler_new_block(c);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002458 if (cleanup == NULL)
2459 return 0;
Anthony Baxter7b782b62006-04-11 12:01:56 +00002460 VISIT(c, expr,
Jeremy Hylton819de6c2007-02-27 16:13:23 +00002461 (expr_ty)asdl_seq_GET(e->v.Compare.comparators, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002462 }
2463 for (i = 1; i < n; i++) {
2464 ADDOP(c, DUP_TOP);
2465 ADDOP(c, ROT_THREE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002466 ADDOP_I(c, COMPARE_OP,
Martin v. Löwis0cc56e52006-04-13 12:29:43 +00002467 cmpop((cmpop_ty)(asdl_seq_GET(
Jeremy Hylton819de6c2007-02-27 16:13:23 +00002468 e->v.Compare.ops, i - 1))));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002469 ADDOP_JREL(c, JUMP_IF_FALSE, cleanup);
2470 NEXT_BLOCK(c);
2471 ADDOP(c, POP_TOP);
2472 if (i < (n - 1))
Anthony Baxter7b782b62006-04-11 12:01:56 +00002473 VISIT(c, expr,
Jeremy Hylton819de6c2007-02-27 16:13:23 +00002474 (expr_ty)asdl_seq_GET(e->v.Compare.comparators, i));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002475 }
Anthony Baxter7b782b62006-04-11 12:01:56 +00002476 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, n - 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002477 ADDOP_I(c, COMPARE_OP,
Martin v. Löwis0cc56e52006-04-13 12:29:43 +00002478 cmpop((cmpop_ty)(asdl_seq_GET(e->v.Compare.ops, n - 1))));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002479 if (n > 1) {
2480 basicblock *end = compiler_new_block(c);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002481 if (end == NULL)
2482 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002483 ADDOP_JREL(c, JUMP_FORWARD, end);
2484 compiler_use_next_block(c, cleanup);
2485 ADDOP(c, ROT_TWO);
2486 ADDOP(c, POP_TOP);
2487 compiler_use_next_block(c, end);
2488 }
2489 return 1;
2490}
2491
2492static int
2493compiler_call(struct compiler *c, expr_ty e)
2494{
2495 int n, code = 0;
2496
2497 VISIT(c, expr, e->v.Call.func);
2498 n = asdl_seq_LEN(e->v.Call.args);
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002499 VISIT_SEQ(c, expr, e->v.Call.args);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002500 if (e->v.Call.keywords) {
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002501 VISIT_SEQ(c, keyword, e->v.Call.keywords);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002502 n |= asdl_seq_LEN(e->v.Call.keywords) << 8;
2503 }
2504 if (e->v.Call.starargs) {
2505 VISIT(c, expr, e->v.Call.starargs);
2506 code |= 1;
2507 }
2508 if (e->v.Call.kwargs) {
2509 VISIT(c, expr, e->v.Call.kwargs);
2510 code |= 2;
2511 }
2512 switch (code) {
2513 case 0:
2514 ADDOP_I(c, CALL_FUNCTION, n);
2515 break;
2516 case 1:
2517 ADDOP_I(c, CALL_FUNCTION_VAR, n);
2518 break;
2519 case 2:
2520 ADDOP_I(c, CALL_FUNCTION_KW, n);
2521 break;
2522 case 3:
2523 ADDOP_I(c, CALL_FUNCTION_VAR_KW, n);
2524 break;
2525 }
2526 return 1;
2527}
2528
2529static int
2530compiler_listcomp_generator(struct compiler *c, PyObject *tmpname,
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002531 asdl_seq *generators, int gen_index,
2532 expr_ty elt)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002533{
2534 /* generate code for the iterator, then each of the ifs,
2535 and then write to the element */
2536
2537 comprehension_ty l;
2538 basicblock *start, *anchor, *skip, *if_cleanup;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002539 int i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002540
2541 start = compiler_new_block(c);
2542 skip = compiler_new_block(c);
2543 if_cleanup = compiler_new_block(c);
2544 anchor = compiler_new_block(c);
2545
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002546 if (start == NULL || skip == NULL || if_cleanup == NULL ||
2547 anchor == NULL)
2548 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002549
Anthony Baxter7b782b62006-04-11 12:01:56 +00002550 l = (comprehension_ty)asdl_seq_GET(generators, gen_index);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002551 VISIT(c, expr, l->iter);
2552 ADDOP(c, GET_ITER);
2553 compiler_use_next_block(c, start);
2554 ADDOP_JREL(c, FOR_ITER, anchor);
2555 NEXT_BLOCK(c);
2556 VISIT(c, expr, l->target);
2557
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002558 /* XXX this needs to be cleaned up...a lot! */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002559 n = asdl_seq_LEN(l->ifs);
2560 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00002561 expr_ty e = (expr_ty)asdl_seq_GET(l->ifs, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002562 VISIT(c, expr, e);
2563 ADDOP_JREL(c, JUMP_IF_FALSE, if_cleanup);
2564 NEXT_BLOCK(c);
2565 ADDOP(c, POP_TOP);
2566 }
2567
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002568 if (++gen_index < asdl_seq_LEN(generators))
2569 if (!compiler_listcomp_generator(c, tmpname,
2570 generators, gen_index, elt))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002571 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002572
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002573 /* only append after the last for generator */
2574 if (gen_index >= asdl_seq_LEN(generators)) {
2575 if (!compiler_nameop(c, tmpname, Load))
2576 return 0;
2577 VISIT(c, expr, elt);
Neal Norwitz10be2ea2006-03-03 20:29:11 +00002578 ADDOP(c, LIST_APPEND);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002579
2580 compiler_use_next_block(c, skip);
2581 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002582 for (i = 0; i < n; i++) {
2583 ADDOP_I(c, JUMP_FORWARD, 1);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002584 if (i == 0)
2585 compiler_use_next_block(c, if_cleanup);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002586 ADDOP(c, POP_TOP);
2587 }
2588 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
2589 compiler_use_next_block(c, anchor);
Georg Brandl2c4fb8d2006-10-29 08:47:08 +00002590 /* delete the temporary list name added to locals */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002591 if (gen_index == 1)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002592 if (!compiler_nameop(c, tmpname, Del))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002593 return 0;
2594
2595 return 1;
2596}
2597
2598static int
2599compiler_listcomp(struct compiler *c, expr_ty e)
2600{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002601 identifier tmp;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002602 int rc = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002603 asdl_seq *generators = e->v.ListComp.generators;
2604
2605 assert(e->kind == ListComp_kind);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002606 tmp = compiler_new_tmpname(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002607 if (!tmp)
2608 return 0;
2609 ADDOP_I(c, BUILD_LIST, 0);
2610 ADDOP(c, DUP_TOP);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002611 if (compiler_nameop(c, tmp, Store))
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002612 rc = compiler_listcomp_generator(c, tmp, generators, 0,
2613 e->v.ListComp.elt);
2614 Py_DECREF(tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002615 return rc;
2616}
2617
2618static int
2619compiler_genexp_generator(struct compiler *c,
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002620 asdl_seq *generators, int gen_index,
2621 expr_ty elt)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002622{
2623 /* generate code for the iterator, then each of the ifs,
2624 and then write to the element */
2625
2626 comprehension_ty ge;
2627 basicblock *start, *anchor, *skip, *if_cleanup, *end;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002628 int i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002629
2630 start = compiler_new_block(c);
2631 skip = compiler_new_block(c);
2632 if_cleanup = compiler_new_block(c);
2633 anchor = compiler_new_block(c);
2634 end = compiler_new_block(c);
2635
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002636 if (start == NULL || skip == NULL || if_cleanup == NULL ||
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002637 anchor == NULL || end == NULL)
2638 return 0;
2639
Anthony Baxter7b782b62006-04-11 12:01:56 +00002640 ge = (comprehension_ty)asdl_seq_GET(generators, gen_index);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002641 ADDOP_JREL(c, SETUP_LOOP, end);
2642 if (!compiler_push_fblock(c, LOOP, start))
2643 return 0;
2644
2645 if (gen_index == 0) {
2646 /* Receive outermost iter as an implicit argument */
2647 c->u->u_argcount = 1;
2648 ADDOP_I(c, LOAD_FAST, 0);
2649 }
2650 else {
2651 /* Sub-iter - calculate on the fly */
2652 VISIT(c, expr, ge->iter);
2653 ADDOP(c, GET_ITER);
2654 }
2655 compiler_use_next_block(c, start);
2656 ADDOP_JREL(c, FOR_ITER, anchor);
2657 NEXT_BLOCK(c);
2658 VISIT(c, expr, ge->target);
2659
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002660 /* XXX this needs to be cleaned up...a lot! */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002661 n = asdl_seq_LEN(ge->ifs);
2662 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00002663 expr_ty e = (expr_ty)asdl_seq_GET(ge->ifs, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002664 VISIT(c, expr, e);
2665 ADDOP_JREL(c, JUMP_IF_FALSE, if_cleanup);
2666 NEXT_BLOCK(c);
2667 ADDOP(c, POP_TOP);
2668 }
2669
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002670 if (++gen_index < asdl_seq_LEN(generators))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002671 if (!compiler_genexp_generator(c, generators, gen_index, elt))
2672 return 0;
2673
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002674 /* only append after the last 'for' generator */
2675 if (gen_index >= asdl_seq_LEN(generators)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002676 VISIT(c, expr, elt);
2677 ADDOP(c, YIELD_VALUE);
2678 ADDOP(c, POP_TOP);
2679
2680 compiler_use_next_block(c, skip);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002681 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002682 for (i = 0; i < n; i++) {
2683 ADDOP_I(c, JUMP_FORWARD, 1);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002684 if (i == 0)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002685 compiler_use_next_block(c, if_cleanup);
2686
2687 ADDOP(c, POP_TOP);
2688 }
2689 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
2690 compiler_use_next_block(c, anchor);
2691 ADDOP(c, POP_BLOCK);
2692 compiler_pop_fblock(c, LOOP, start);
2693 compiler_use_next_block(c, end);
2694
2695 return 1;
2696}
2697
2698static int
2699compiler_genexp(struct compiler *c, expr_ty e)
2700{
Nick Coghlan944d3eb2005-11-16 12:46:55 +00002701 static identifier name;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002702 PyCodeObject *co;
2703 expr_ty outermost_iter = ((comprehension_ty)
2704 (asdl_seq_GET(e->v.GeneratorExp.generators,
2705 0)))->iter;
2706
Nick Coghlan944d3eb2005-11-16 12:46:55 +00002707 if (!name) {
2708 name = PyString_FromString("<genexpr>");
2709 if (!name)
2710 return 0;
2711 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002712
2713 if (!compiler_enter_scope(c, name, (void *)e, e->lineno))
2714 return 0;
2715 compiler_genexp_generator(c, e->v.GeneratorExp.generators, 0,
2716 e->v.GeneratorExp.elt);
2717 co = assemble(c, 1);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00002718 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002719 if (co == NULL)
2720 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002721
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002722 compiler_make_closure(c, co, 0);
Neal Norwitz4737b232005-11-19 23:58:29 +00002723 Py_DECREF(co);
2724
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002725 VISIT(c, expr, outermost_iter);
2726 ADDOP(c, GET_ITER);
2727 ADDOP_I(c, CALL_FUNCTION, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002728
2729 return 1;
2730}
2731
2732static int
2733compiler_visit_keyword(struct compiler *c, keyword_ty k)
2734{
2735 ADDOP_O(c, LOAD_CONST, k->arg, consts);
2736 VISIT(c, expr, k->value);
2737 return 1;
2738}
2739
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002740/* Test whether expression is constant. For constants, report
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002741 whether they are true or false.
2742
2743 Return values: 1 for true, 0 for false, -1 for non-constant.
2744 */
2745
2746static int
2747expr_constant(expr_ty e)
2748{
2749 switch (e->kind) {
2750 case Num_kind:
2751 return PyObject_IsTrue(e->v.Num.n);
2752 case Str_kind:
2753 return PyObject_IsTrue(e->v.Str.s);
Georg Brandlddbaa662006-06-04 21:56:52 +00002754 case Name_kind:
2755 /* __debug__ is not assignable, so we can optimize
2756 * it away in if and while statements */
2757 if (strcmp(PyString_AS_STRING(e->v.Name.id),
Jeremy Hylton819de6c2007-02-27 16:13:23 +00002758 "__debug__") == 0)
Georg Brandlddbaa662006-06-04 21:56:52 +00002759 return ! Py_OptimizeFlag;
2760 /* fall through */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002761 default:
2762 return -1;
2763 }
2764}
2765
Guido van Rossumc2e20742006-02-27 22:32:47 +00002766/*
2767 Implements the with statement from PEP 343.
2768
2769 The semantics outlined in that PEP are as follows:
2770
2771 with EXPR as VAR:
2772 BLOCK
2773
2774 It is implemented roughly as:
2775
Guido van Rossumda5b7012006-05-02 19:47:52 +00002776 context = EXPR
Guido van Rossumc2e20742006-02-27 22:32:47 +00002777 exit = context.__exit__ # not calling it
2778 value = context.__enter__()
2779 try:
2780 VAR = value # if VAR present in the syntax
2781 BLOCK
2782 finally:
2783 if an exception was raised:
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002784 exc = copy of (exception, instance, traceback)
Guido van Rossumc2e20742006-02-27 22:32:47 +00002785 else:
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002786 exc = (None, None, None)
Guido van Rossumc2e20742006-02-27 22:32:47 +00002787 exit(*exc)
2788 */
2789static int
2790compiler_with(struct compiler *c, stmt_ty s)
2791{
Guido van Rossumda5b7012006-05-02 19:47:52 +00002792 static identifier enter_attr, exit_attr;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002793 basicblock *block, *finally;
2794 identifier tmpexit, tmpvalue = NULL;
2795
2796 assert(s->kind == With_kind);
2797
Guido van Rossumc2e20742006-02-27 22:32:47 +00002798 if (!enter_attr) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002799 enter_attr = PyString_InternFromString("__enter__");
2800 if (!enter_attr)
2801 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002802 }
2803 if (!exit_attr) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002804 exit_attr = PyString_InternFromString("__exit__");
2805 if (!exit_attr)
2806 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002807 }
2808
2809 block = compiler_new_block(c);
2810 finally = compiler_new_block(c);
2811 if (!block || !finally)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002812 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002813
2814 /* Create a temporary variable to hold context.__exit__ */
2815 tmpexit = compiler_new_tmpname(c);
2816 if (tmpexit == NULL)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002817 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002818 PyArena_AddPyObject(c->c_arena, tmpexit);
2819
2820 if (s->v.With.optional_vars) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002821 /* Create a temporary variable to hold context.__enter__().
Guido van Rossumc2e20742006-02-27 22:32:47 +00002822 We need to do this rather than preserving it on the stack
2823 because SETUP_FINALLY remembers the stack level.
2824 We need to do the assignment *inside* the try/finally
2825 so that context.__exit__() is called when the assignment
2826 fails. But we need to call context.__enter__() *before*
2827 the try/finally so that if it fails we won't call
2828 context.__exit__().
2829 */
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002830 tmpvalue = compiler_new_tmpname(c);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002831 if (tmpvalue == NULL)
2832 return 0;
2833 PyArena_AddPyObject(c->c_arena, tmpvalue);
2834 }
2835
Guido van Rossumda5b7012006-05-02 19:47:52 +00002836 /* Evaluate EXPR */
Guido van Rossumc2e20742006-02-27 22:32:47 +00002837 VISIT(c, expr, s->v.With.context_expr);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002838
2839 /* Squirrel away context.__exit__ */
2840 ADDOP(c, DUP_TOP);
2841 ADDOP_O(c, LOAD_ATTR, exit_attr, names);
2842 if (!compiler_nameop(c, tmpexit, Store))
2843 return 0;
2844
2845 /* Call context.__enter__() */
2846 ADDOP_O(c, LOAD_ATTR, enter_attr, names);
2847 ADDOP_I(c, CALL_FUNCTION, 0);
2848
2849 if (s->v.With.optional_vars) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002850 /* Store it in tmpvalue */
2851 if (!compiler_nameop(c, tmpvalue, Store))
Guido van Rossumc2e20742006-02-27 22:32:47 +00002852 return 0;
2853 }
2854 else {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002855 /* Discard result from context.__enter__() */
2856 ADDOP(c, POP_TOP);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002857 }
2858
2859 /* Start the try block */
2860 ADDOP_JREL(c, SETUP_FINALLY, finally);
2861
2862 compiler_use_next_block(c, block);
2863 if (!compiler_push_fblock(c, FINALLY_TRY, block)) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002864 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002865 }
2866
2867 if (s->v.With.optional_vars) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002868 /* Bind saved result of context.__enter__() to VAR */
2869 if (!compiler_nameop(c, tmpvalue, Load) ||
Guido van Rossumc2e20742006-02-27 22:32:47 +00002870 !compiler_nameop(c, tmpvalue, Del))
2871 return 0;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002872 VISIT(c, expr, s->v.With.optional_vars);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002873 }
2874
2875 /* BLOCK code */
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002876 VISIT_SEQ(c, stmt, s->v.With.body);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002877
2878 /* End of try block; start the finally block */
2879 ADDOP(c, POP_BLOCK);
2880 compiler_pop_fblock(c, FINALLY_TRY, block);
2881
2882 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2883 compiler_use_next_block(c, finally);
2884 if (!compiler_push_fblock(c, FINALLY_END, finally))
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002885 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002886
2887 /* Finally block starts; push tmpexit and issue our magic opcode. */
2888 if (!compiler_nameop(c, tmpexit, Load) ||
2889 !compiler_nameop(c, tmpexit, Del))
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002890 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002891 ADDOP(c, WITH_CLEANUP);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002892
2893 /* Finally block ends. */
2894 ADDOP(c, END_FINALLY);
2895 compiler_pop_fblock(c, FINALLY_END, finally);
2896 return 1;
2897}
2898
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002899static int
2900compiler_visit_expr(struct compiler *c, expr_ty e)
2901{
2902 int i, n;
2903
Neal Norwitzf733a012006-10-29 18:30:10 +00002904 /* If expr e has a different line number than the last expr/stmt,
Jeremy Hylton819de6c2007-02-27 16:13:23 +00002905 set a new line number for the next instruction.
2906 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002907 if (e->lineno > c->u->u_lineno) {
2908 c->u->u_lineno = e->lineno;
2909 c->u->u_lineno_set = false;
2910 }
2911 switch (e->kind) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002912 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002913 return compiler_boolop(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002914 case BinOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002915 VISIT(c, expr, e->v.BinOp.left);
2916 VISIT(c, expr, e->v.BinOp.right);
2917 ADDOP(c, binop(c, e->v.BinOp.op));
2918 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002919 case UnaryOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002920 VISIT(c, expr, e->v.UnaryOp.operand);
2921 ADDOP(c, unaryop(e->v.UnaryOp.op));
2922 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002923 case Lambda_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002924 return compiler_lambda(c, e);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002925 case IfExp_kind:
2926 return compiler_ifexp(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002927 case Dict_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002928 n = asdl_seq_LEN(e->v.Dict.values);
Raymond Hettinger70fcfd02007-12-19 22:14:34 +00002929 ADDOP_I(c, BUILD_MAP, (n>0xFFFF ? 0xFFFF : n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002930 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00002931 VISIT(c, expr,
Jeremy Hylton819de6c2007-02-27 16:13:23 +00002932 (expr_ty)asdl_seq_GET(e->v.Dict.values, i));
Anthony Baxter7b782b62006-04-11 12:01:56 +00002933 VISIT(c, expr,
Jeremy Hylton819de6c2007-02-27 16:13:23 +00002934 (expr_ty)asdl_seq_GET(e->v.Dict.keys, i));
Raymond Hettingereffde122007-12-18 18:26:18 +00002935 ADDOP(c, STORE_MAP);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002936 }
2937 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002938 case ListComp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002939 return compiler_listcomp(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002940 case GeneratorExp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002941 return compiler_genexp(c, e);
2942 case Yield_kind:
2943 if (c->u->u_ste->ste_type != FunctionBlock)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002944 return compiler_error(c, "'yield' outside function");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002945 if (e->v.Yield.value) {
2946 VISIT(c, expr, e->v.Yield.value);
2947 }
2948 else {
2949 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2950 }
2951 ADDOP(c, YIELD_VALUE);
2952 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002953 case Compare_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002954 return compiler_compare(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002955 case Call_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002956 return compiler_call(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002957 case Repr_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002958 VISIT(c, expr, e->v.Repr.value);
2959 ADDOP(c, UNARY_CONVERT);
2960 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002961 case Num_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002962 ADDOP_O(c, LOAD_CONST, e->v.Num.n, consts);
2963 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002964 case Str_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002965 ADDOP_O(c, LOAD_CONST, e->v.Str.s, consts);
2966 break;
2967 /* The following exprs can be assignment targets. */
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002968 case Attribute_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002969 if (e->v.Attribute.ctx != AugStore)
2970 VISIT(c, expr, e->v.Attribute.value);
2971 switch (e->v.Attribute.ctx) {
2972 case AugLoad:
2973 ADDOP(c, DUP_TOP);
2974 /* Fall through to load */
2975 case Load:
2976 ADDOP_NAME(c, LOAD_ATTR, e->v.Attribute.attr, names);
2977 break;
2978 case AugStore:
2979 ADDOP(c, ROT_TWO);
2980 /* Fall through to save */
2981 case Store:
2982 ADDOP_NAME(c, STORE_ATTR, e->v.Attribute.attr, names);
2983 break;
2984 case Del:
2985 ADDOP_NAME(c, DELETE_ATTR, e->v.Attribute.attr, names);
2986 break;
2987 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00002988 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00002989 PyErr_SetString(PyExc_SystemError,
2990 "param invalid in attribute expression");
2991 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002992 }
2993 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002994 case Subscript_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002995 switch (e->v.Subscript.ctx) {
2996 case AugLoad:
2997 VISIT(c, expr, e->v.Subscript.value);
2998 VISIT_SLICE(c, e->v.Subscript.slice, AugLoad);
2999 break;
3000 case Load:
3001 VISIT(c, expr, e->v.Subscript.value);
3002 VISIT_SLICE(c, e->v.Subscript.slice, Load);
3003 break;
3004 case AugStore:
3005 VISIT_SLICE(c, e->v.Subscript.slice, AugStore);
3006 break;
3007 case Store:
3008 VISIT(c, expr, e->v.Subscript.value);
3009 VISIT_SLICE(c, e->v.Subscript.slice, Store);
3010 break;
3011 case Del:
3012 VISIT(c, expr, e->v.Subscript.value);
3013 VISIT_SLICE(c, e->v.Subscript.slice, Del);
3014 break;
3015 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003016 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00003017 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003018 "param invalid in subscript expression");
Neal Norwitz4737b232005-11-19 23:58:29 +00003019 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003020 }
3021 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003022 case Name_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003023 return compiler_nameop(c, e->v.Name.id, e->v.Name.ctx);
3024 /* child nodes of List and Tuple will have expr_context set */
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003025 case List_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003026 return compiler_list(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003027 case Tuple_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003028 return compiler_tuple(c, e);
3029 }
3030 return 1;
3031}
3032
3033static int
3034compiler_augassign(struct compiler *c, stmt_ty s)
3035{
3036 expr_ty e = s->v.AugAssign.target;
3037 expr_ty auge;
3038
3039 assert(s->kind == AugAssign_kind);
3040
3041 switch (e->kind) {
Neal Norwitz2585ad52006-06-12 02:09:34 +00003042 case Attribute_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003043 auge = Attribute(e->v.Attribute.value, e->v.Attribute.attr,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003044 AugLoad, e->lineno, e->col_offset, c->c_arena);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003045 if (auge == NULL)
3046 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003047 VISIT(c, expr, auge);
3048 VISIT(c, expr, s->v.AugAssign.value);
3049 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
3050 auge->v.Attribute.ctx = AugStore;
3051 VISIT(c, expr, auge);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003052 break;
3053 case Subscript_kind:
3054 auge = Subscript(e->v.Subscript.value, e->v.Subscript.slice,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003055 AugLoad, e->lineno, e->col_offset, c->c_arena);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003056 if (auge == NULL)
3057 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003058 VISIT(c, expr, auge);
3059 VISIT(c, expr, s->v.AugAssign.value);
3060 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003061 auge->v.Subscript.ctx = AugStore;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003062 VISIT(c, expr, auge);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003063 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003064 case Name_kind:
Neil Schemenauer0e07b602006-07-09 16:16:34 +00003065 if (!compiler_nameop(c, e->v.Name.id, Load))
3066 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003067 VISIT(c, expr, s->v.AugAssign.value);
3068 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
3069 return compiler_nameop(c, e->v.Name.id, Store);
3070 default:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003071 PyErr_Format(PyExc_SystemError,
3072 "invalid node type (%d) for augmented assignment",
3073 e->kind);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003074 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003075 }
3076 return 1;
3077}
3078
3079static int
3080compiler_push_fblock(struct compiler *c, enum fblocktype t, basicblock *b)
3081{
3082 struct fblockinfo *f;
Neal Norwitz21997af2006-10-28 21:19:07 +00003083 if (c->u->u_nfblocks >= CO_MAXBLOCKS) {
3084 PyErr_SetString(PyExc_SystemError,
3085 "too many statically nested blocks");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003086 return 0;
Neal Norwitz21997af2006-10-28 21:19:07 +00003087 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003088 f = &c->u->u_fblock[c->u->u_nfblocks++];
3089 f->fb_type = t;
3090 f->fb_block = b;
3091 return 1;
3092}
3093
3094static void
3095compiler_pop_fblock(struct compiler *c, enum fblocktype t, basicblock *b)
3096{
3097 struct compiler_unit *u = c->u;
3098 assert(u->u_nfblocks > 0);
3099 u->u_nfblocks--;
3100 assert(u->u_fblock[u->u_nfblocks].fb_type == t);
3101 assert(u->u_fblock[u->u_nfblocks].fb_block == b);
3102}
3103
Jeremy Hylton82271f12006-10-04 02:24:52 +00003104static int
3105compiler_in_loop(struct compiler *c) {
Jeremy Hylton819de6c2007-02-27 16:13:23 +00003106 int i;
3107 struct compiler_unit *u = c->u;
3108 for (i = 0; i < u->u_nfblocks; ++i) {
3109 if (u->u_fblock[i].fb_type == LOOP)
3110 return 1;
3111 }
3112 return 0;
Jeremy Hylton82271f12006-10-04 02:24:52 +00003113}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003114/* Raises a SyntaxError and returns 0.
3115 If something goes wrong, a different exception may be raised.
3116*/
3117
3118static int
3119compiler_error(struct compiler *c, const char *errstr)
3120{
3121 PyObject *loc;
3122 PyObject *u = NULL, *v = NULL;
3123
3124 loc = PyErr_ProgramText(c->c_filename, c->u->u_lineno);
3125 if (!loc) {
3126 Py_INCREF(Py_None);
3127 loc = Py_None;
3128 }
3129 u = Py_BuildValue("(ziOO)", c->c_filename, c->u->u_lineno,
3130 Py_None, loc);
3131 if (!u)
3132 goto exit;
3133 v = Py_BuildValue("(zO)", errstr, u);
3134 if (!v)
3135 goto exit;
3136 PyErr_SetObject(PyExc_SyntaxError, v);
3137 exit:
3138 Py_DECREF(loc);
3139 Py_XDECREF(u);
3140 Py_XDECREF(v);
3141 return 0;
3142}
3143
3144static int
3145compiler_handle_subscr(struct compiler *c, const char *kind,
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003146 expr_context_ty ctx)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003147{
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003148 int op = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003149
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003150 /* XXX this code is duplicated */
3151 switch (ctx) {
3152 case AugLoad: /* fall through to Load */
3153 case Load: op = BINARY_SUBSCR; break;
3154 case AugStore:/* fall through to Store */
3155 case Store: op = STORE_SUBSCR; break;
3156 case Del: op = DELETE_SUBSCR; break;
3157 case Param:
3158 PyErr_Format(PyExc_SystemError,
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003159 "invalid %s kind %d in subscript\n",
3160 kind, ctx);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003161 return 0;
3162 }
3163 if (ctx == AugLoad) {
3164 ADDOP_I(c, DUP_TOPX, 2);
3165 }
3166 else if (ctx == AugStore) {
3167 ADDOP(c, ROT_THREE);
3168 }
3169 ADDOP(c, op);
3170 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003171}
3172
3173static int
3174compiler_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)
3175{
3176 int n = 2;
3177 assert(s->kind == Slice_kind);
3178
3179 /* only handles the cases where BUILD_SLICE is emitted */
3180 if (s->v.Slice.lower) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003181 VISIT(c, expr, s->v.Slice.lower);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003182 }
3183 else {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003184 ADDOP_O(c, LOAD_CONST, Py_None, consts);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003185 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003186
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003187 if (s->v.Slice.upper) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003188 VISIT(c, expr, s->v.Slice.upper);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003189 }
3190 else {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003191 ADDOP_O(c, LOAD_CONST, Py_None, consts);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003192 }
3193
3194 if (s->v.Slice.step) {
3195 n++;
3196 VISIT(c, expr, s->v.Slice.step);
3197 }
3198 ADDOP_I(c, BUILD_SLICE, n);
3199 return 1;
3200}
3201
3202static int
3203compiler_simple_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)
3204{
3205 int op = 0, slice_offset = 0, stack_count = 0;
3206
3207 assert(s->v.Slice.step == NULL);
3208 if (s->v.Slice.lower) {
3209 slice_offset++;
3210 stack_count++;
3211 if (ctx != AugStore)
3212 VISIT(c, expr, s->v.Slice.lower);
3213 }
3214 if (s->v.Slice.upper) {
3215 slice_offset += 2;
3216 stack_count++;
3217 if (ctx != AugStore)
3218 VISIT(c, expr, s->v.Slice.upper);
3219 }
3220
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003221 if (ctx == AugLoad) {
3222 switch (stack_count) {
3223 case 0: ADDOP(c, DUP_TOP); break;
3224 case 1: ADDOP_I(c, DUP_TOPX, 2); break;
3225 case 2: ADDOP_I(c, DUP_TOPX, 3); break;
3226 }
3227 }
3228 else if (ctx == AugStore) {
3229 switch (stack_count) {
3230 case 0: ADDOP(c, ROT_TWO); break;
3231 case 1: ADDOP(c, ROT_THREE); break;
3232 case 2: ADDOP(c, ROT_FOUR); break;
3233 }
3234 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003235
3236 switch (ctx) {
3237 case AugLoad: /* fall through to Load */
3238 case Load: op = SLICE; break;
3239 case AugStore:/* fall through to Store */
3240 case Store: op = STORE_SLICE; break;
3241 case Del: op = DELETE_SLICE; break;
Neal Norwitz4737b232005-11-19 23:58:29 +00003242 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003243 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00003244 PyErr_SetString(PyExc_SystemError,
3245 "param invalid in simple slice");
3246 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003247 }
3248
3249 ADDOP(c, op + slice_offset);
3250 return 1;
3251}
3252
3253static int
3254compiler_visit_nested_slice(struct compiler *c, slice_ty s,
3255 expr_context_ty ctx)
3256{
3257 switch (s->kind) {
3258 case Ellipsis_kind:
3259 ADDOP_O(c, LOAD_CONST, Py_Ellipsis, consts);
3260 break;
3261 case Slice_kind:
3262 return compiler_slice(c, s, ctx);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003263 case Index_kind:
3264 VISIT(c, expr, s->v.Index.value);
3265 break;
3266 case ExtSlice_kind:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003267 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00003268 PyErr_SetString(PyExc_SystemError,
3269 "extended slice invalid in nested slice");
3270 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003271 }
3272 return 1;
3273}
3274
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003275static int
3276compiler_visit_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)
3277{
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003278 char * kindname = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003279 switch (s->kind) {
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003280 case Index_kind:
3281 kindname = "index";
3282 if (ctx != AugStore) {
3283 VISIT(c, expr, s->v.Index.value);
3284 }
3285 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003286 case Ellipsis_kind:
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003287 kindname = "ellipsis";
3288 if (ctx != AugStore) {
3289 ADDOP_O(c, LOAD_CONST, Py_Ellipsis, consts);
3290 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003291 break;
3292 case Slice_kind:
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003293 kindname = "slice";
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003294 if (!s->v.Slice.step)
3295 return compiler_simple_slice(c, s, ctx);
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003296 if (ctx != AugStore) {
3297 if (!compiler_slice(c, s, ctx))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003298 return 0;
3299 }
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003300 break;
3301 case ExtSlice_kind:
3302 kindname = "extended slice";
3303 if (ctx != AugStore) {
3304 int i, n = asdl_seq_LEN(s->v.ExtSlice.dims);
3305 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00003306 slice_ty sub = (slice_ty)asdl_seq_GET(
Jeremy Hylton819de6c2007-02-27 16:13:23 +00003307 s->v.ExtSlice.dims, i);
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003308 if (!compiler_visit_nested_slice(c, sub, ctx))
3309 return 0;
3310 }
3311 ADDOP_I(c, BUILD_TUPLE, n);
3312 }
3313 break;
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003314 default:
3315 PyErr_Format(PyExc_SystemError,
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003316 "invalid subscript kind %d", s->kind);
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003317 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003318 }
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003319 return compiler_handle_subscr(c, kindname, ctx);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003320}
3321
Neal Norwitzf733a012006-10-29 18:30:10 +00003322
3323/* End of the compiler section, beginning of the assembler section */
3324
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003325/* do depth-first search of basic block graph, starting with block.
3326 post records the block indices in post-order.
3327
3328 XXX must handle implicit jumps from one block to next
3329*/
3330
Neal Norwitzf733a012006-10-29 18:30:10 +00003331struct assembler {
3332 PyObject *a_bytecode; /* string containing bytecode */
3333 int a_offset; /* offset into bytecode */
3334 int a_nblocks; /* number of reachable blocks */
3335 basicblock **a_postorder; /* list of blocks in dfs postorder */
3336 PyObject *a_lnotab; /* string containing lnotab */
3337 int a_lnotab_off; /* offset into lnotab */
3338 int a_lineno; /* last lineno of emitted instruction */
3339 int a_lineno_off; /* bytecode offset of last lineno */
3340};
3341
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003342static void
3343dfs(struct compiler *c, basicblock *b, struct assembler *a)
3344{
3345 int i;
3346 struct instr *instr = NULL;
3347
3348 if (b->b_seen)
3349 return;
3350 b->b_seen = 1;
3351 if (b->b_next != NULL)
3352 dfs(c, b->b_next, a);
3353 for (i = 0; i < b->b_iused; i++) {
3354 instr = &b->b_instr[i];
3355 if (instr->i_jrel || instr->i_jabs)
3356 dfs(c, instr->i_target, a);
3357 }
3358 a->a_postorder[a->a_nblocks++] = b;
3359}
3360
Neal Norwitz2744c6c2005-11-13 01:08:38 +00003361static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003362stackdepth_walk(struct compiler *c, basicblock *b, int depth, int maxdepth)
3363{
3364 int i;
3365 struct instr *instr;
3366 if (b->b_seen || b->b_startdepth >= depth)
3367 return maxdepth;
3368 b->b_seen = 1;
3369 b->b_startdepth = depth;
3370 for (i = 0; i < b->b_iused; i++) {
3371 instr = &b->b_instr[i];
3372 depth += opcode_stack_effect(instr->i_opcode, instr->i_oparg);
3373 if (depth > maxdepth)
3374 maxdepth = depth;
3375 assert(depth >= 0); /* invalid code or bug in stackdepth() */
3376 if (instr->i_jrel || instr->i_jabs) {
3377 maxdepth = stackdepth_walk(c, instr->i_target,
3378 depth, maxdepth);
3379 if (instr->i_opcode == JUMP_ABSOLUTE ||
3380 instr->i_opcode == JUMP_FORWARD) {
3381 goto out; /* remaining code is dead */
3382 }
3383 }
3384 }
3385 if (b->b_next)
3386 maxdepth = stackdepth_walk(c, b->b_next, depth, maxdepth);
3387out:
3388 b->b_seen = 0;
3389 return maxdepth;
3390}
3391
3392/* Find the flow path that needs the largest stack. We assume that
3393 * cycles in the flow graph have no net effect on the stack depth.
3394 */
3395static int
3396stackdepth(struct compiler *c)
3397{
3398 basicblock *b, *entryblock;
3399 entryblock = NULL;
3400 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
3401 b->b_seen = 0;
3402 b->b_startdepth = INT_MIN;
3403 entryblock = b;
3404 }
Neal Norwitzf71847e2006-07-23 07:51:58 +00003405 if (!entryblock)
3406 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003407 return stackdepth_walk(c, entryblock, 0, 0);
3408}
3409
3410static int
3411assemble_init(struct assembler *a, int nblocks, int firstlineno)
3412{
3413 memset(a, 0, sizeof(struct assembler));
3414 a->a_lineno = firstlineno;
3415 a->a_bytecode = PyString_FromStringAndSize(NULL, DEFAULT_CODE_SIZE);
3416 if (!a->a_bytecode)
3417 return 0;
3418 a->a_lnotab = PyString_FromStringAndSize(NULL, DEFAULT_LNOTAB_SIZE);
3419 if (!a->a_lnotab)
3420 return 0;
3421 a->a_postorder = (basicblock **)PyObject_Malloc(
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003422 sizeof(basicblock *) * nblocks);
Neal Norwitz87b801c2005-12-18 04:42:47 +00003423 if (!a->a_postorder) {
3424 PyErr_NoMemory();
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003425 return 0;
Neal Norwitz87b801c2005-12-18 04:42:47 +00003426 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003427 return 1;
3428}
3429
3430static void
3431assemble_free(struct assembler *a)
3432{
3433 Py_XDECREF(a->a_bytecode);
3434 Py_XDECREF(a->a_lnotab);
3435 if (a->a_postorder)
3436 PyObject_Free(a->a_postorder);
3437}
3438
3439/* Return the size of a basic block in bytes. */
3440
3441static int
3442instrsize(struct instr *instr)
3443{
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003444 if (!instr->i_hasarg)
Raymond Hettingerdff1fd92007-12-20 01:25:05 +00003445 return 1; /* 1 byte for the opcode*/
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003446 if (instr->i_oparg > 0xffff)
Raymond Hettingerdff1fd92007-12-20 01:25:05 +00003447 return 6; /* 1 (opcode) + 1 (EXTENDED_ARG opcode) + 2 (oparg) + 2(oparg extended) */
3448 return 3; /* 1 (opcode) + 2 (oparg) */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003449}
3450
3451static int
3452blocksize(basicblock *b)
3453{
3454 int i;
3455 int size = 0;
3456
3457 for (i = 0; i < b->b_iused; i++)
3458 size += instrsize(&b->b_instr[i]);
3459 return size;
3460}
3461
3462/* All about a_lnotab.
3463
3464c_lnotab is an array of unsigned bytes disguised as a Python string.
3465It is used to map bytecode offsets to source code line #s (when needed
3466for tracebacks).
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003467
Tim Peters2a7f3842001-06-09 09:26:21 +00003468The array is conceptually a list of
3469 (bytecode offset increment, line number increment)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003470pairs. The details are important and delicate, best illustrated by example:
Tim Peters2a7f3842001-06-09 09:26:21 +00003471
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003472 byte code offset source code line number
3473 0 1
3474 6 2
Tim Peters2a7f3842001-06-09 09:26:21 +00003475 50 7
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003476 350 307
3477 361 308
Tim Peters2a7f3842001-06-09 09:26:21 +00003478
3479The first trick is that these numbers aren't stored, only the increments
3480from one row to the next (this doesn't really work, but it's a start):
3481
3482 0, 1, 6, 1, 44, 5, 300, 300, 11, 1
3483
3484The second trick is that an unsigned byte can't hold negative values, or
3485values larger than 255, so (a) there's a deep assumption that byte code
3486offsets and their corresponding line #s both increase monotonically, and (b)
3487if at least one column jumps by more than 255 from one row to the next, more
3488than one pair is written to the table. In case #b, there's no way to know
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003489from looking at the table later how many were written. That's the delicate
Tim Peters2a7f3842001-06-09 09:26:21 +00003490part. A user of c_lnotab desiring to find the source line number
3491corresponding to a bytecode address A should do something like this
3492
3493 lineno = addr = 0
3494 for addr_incr, line_incr in c_lnotab:
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003495 addr += addr_incr
3496 if addr > A:
3497 return lineno
3498 lineno += line_incr
Tim Peters2a7f3842001-06-09 09:26:21 +00003499
3500In order for this to work, when the addr field increments by more than 255,
3501the line # increment in each pair generated must be 0 until the remaining addr
Neal Norwitz84be93b2006-07-16 01:50:38 +00003502increment is < 256. So, in the example above, assemble_lnotab (it used
3503to be called com_set_lineno) should not (as was actually done until 2.2)
3504expand 300, 300 to 255, 255, 45, 45,
Jeremy Hylton819de6c2007-02-27 16:13:23 +00003505 but to 255, 0, 45, 255, 0, 45.
Tim Peters2a7f3842001-06-09 09:26:21 +00003506*/
3507
Guido van Rossumf68d8e52001-04-14 17:55:09 +00003508static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003509assemble_lnotab(struct assembler *a, struct instr *i)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003510{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003511 int d_bytecode, d_lineno;
3512 int len;
Neal Norwitzb183a252006-04-10 01:03:32 +00003513 unsigned char *lnotab;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003514
3515 d_bytecode = a->a_offset - a->a_lineno_off;
3516 d_lineno = i->i_lineno - a->a_lineno;
3517
3518 assert(d_bytecode >= 0);
3519 assert(d_lineno >= 0);
3520
Neal Norwitz4ffedad2006-08-04 04:58:47 +00003521 /* XXX(nnorwitz): is there a better way to handle this?
3522 for loops are special, we want to be able to trace them
3523 each time around, so we need to set an extra line number. */
Nick Coghlanb90f52e2007-08-25 04:35:54 +00003524 if (d_lineno == 0 && i->i_opcode != FOR_ITER)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003525 return 1;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003526
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003527 if (d_bytecode > 255) {
Neal Norwitz08b401f2006-01-07 21:24:09 +00003528 int j, nbytes, ncodes = d_bytecode / 255;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003529 nbytes = a->a_lnotab_off + 2 * ncodes;
3530 len = PyString_GET_SIZE(a->a_lnotab);
3531 if (nbytes >= len) {
3532 if (len * 2 < nbytes)
3533 len = nbytes;
Phillip J. Eby0d6615f2005-08-02 00:46:46 +00003534 else
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003535 len *= 2;
3536 if (_PyString_Resize(&a->a_lnotab, len) < 0)
3537 return 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003538 }
Neal Norwitzb183a252006-04-10 01:03:32 +00003539 lnotab = (unsigned char *)
3540 PyString_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
Neal Norwitz08b401f2006-01-07 21:24:09 +00003541 for (j = 0; j < ncodes; j++) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003542 *lnotab++ = 255;
3543 *lnotab++ = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003544 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003545 d_bytecode -= ncodes * 255;
3546 a->a_lnotab_off += ncodes * 2;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003547 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003548 assert(d_bytecode <= 255);
3549 if (d_lineno > 255) {
Neal Norwitz08b401f2006-01-07 21:24:09 +00003550 int j, nbytes, ncodes = d_lineno / 255;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003551 nbytes = a->a_lnotab_off + 2 * ncodes;
3552 len = PyString_GET_SIZE(a->a_lnotab);
3553 if (nbytes >= len) {
3554 if (len * 2 < nbytes)
3555 len = nbytes;
Guido van Rossum635abd21997-01-06 22:56:52 +00003556 else
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003557 len *= 2;
3558 if (_PyString_Resize(&a->a_lnotab, len) < 0)
3559 return 0;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003560 }
Neal Norwitzb183a252006-04-10 01:03:32 +00003561 lnotab = (unsigned char *)
3562 PyString_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003563 *lnotab++ = d_bytecode;
Neal Norwitz84be93b2006-07-16 01:50:38 +00003564 *lnotab++ = 255;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003565 d_bytecode = 0;
Neal Norwitz08b401f2006-01-07 21:24:09 +00003566 for (j = 1; j < ncodes; j++) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003567 *lnotab++ = 0;
Neal Norwitz84be93b2006-07-16 01:50:38 +00003568 *lnotab++ = 255;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003569 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003570 d_lineno -= ncodes * 255;
3571 a->a_lnotab_off += ncodes * 2;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003572 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003573
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003574 len = PyString_GET_SIZE(a->a_lnotab);
3575 if (a->a_lnotab_off + 2 >= len) {
3576 if (_PyString_Resize(&a->a_lnotab, len * 2) < 0)
Tim Peters51e26512001-09-07 08:45:55 +00003577 return 0;
Tim Peters51e26512001-09-07 08:45:55 +00003578 }
Neal Norwitzb183a252006-04-10 01:03:32 +00003579 lnotab = (unsigned char *)
3580 PyString_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
Tim Peters51e26512001-09-07 08:45:55 +00003581
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003582 a->a_lnotab_off += 2;
3583 if (d_bytecode) {
3584 *lnotab++ = d_bytecode;
3585 *lnotab++ = d_lineno;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00003586 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003587 else { /* First line of a block; def stmt, etc. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003588 *lnotab++ = 0;
3589 *lnotab++ = d_lineno;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003590 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003591 a->a_lineno = i->i_lineno;
3592 a->a_lineno_off = a->a_offset;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003593 return 1;
3594}
3595
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003596/* assemble_emit()
3597 Extend the bytecode with a new instruction.
3598 Update lnotab if necessary.
Jeremy Hylton376e63d2003-08-28 14:42:14 +00003599*/
3600
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003601static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003602assemble_emit(struct assembler *a, struct instr *i)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003603{
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003604 int size, arg = 0, ext = 0;
Neal Norwitz2585ad52006-06-12 02:09:34 +00003605 Py_ssize_t len = PyString_GET_SIZE(a->a_bytecode);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003606 char *code;
3607
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003608 size = instrsize(i);
3609 if (i->i_hasarg) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003610 arg = i->i_oparg;
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003611 ext = arg >> 16;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003612 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003613 if (i->i_lineno && !assemble_lnotab(a, i))
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003614 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003615 if (a->a_offset + size >= len) {
3616 if (_PyString_Resize(&a->a_bytecode, len * 2) < 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003617 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003618 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003619 code = PyString_AS_STRING(a->a_bytecode) + a->a_offset;
3620 a->a_offset += size;
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003621 if (size == 6) {
3622 assert(i->i_hasarg);
3623 *code++ = (char)EXTENDED_ARG;
3624 *code++ = ext & 0xff;
3625 *code++ = ext >> 8;
3626 arg &= 0xffff;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00003627 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003628 *code++ = i->i_opcode;
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003629 if (i->i_hasarg) {
3630 assert(size == 3 || size == 6);
3631 *code++ = arg & 0xff;
3632 *code++ = arg >> 8;
3633 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003634 return 1;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00003635}
3636
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003637static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003638assemble_jump_offsets(struct assembler *a, struct compiler *c)
Anthony Baxterc2a5a632004-08-02 06:10:11 +00003639{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003640 basicblock *b;
Neal Norwitzf1d50682005-10-23 23:00:41 +00003641 int bsize, totsize, extended_arg_count, last_extended_arg_count = 0;
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003642 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003643
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003644 /* Compute the size of each block and fixup jump args.
3645 Replace block pointer with position in bytecode. */
Neal Norwitzf1d50682005-10-23 23:00:41 +00003646start:
3647 totsize = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003648 for (i = a->a_nblocks - 1; i >= 0; i--) {
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003649 b = a->a_postorder[i];
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003650 bsize = blocksize(b);
3651 b->b_offset = totsize;
3652 totsize += bsize;
Guido van Rossum25831651993-05-19 14:50:45 +00003653 }
Neal Norwitzf1d50682005-10-23 23:00:41 +00003654 extended_arg_count = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003655 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
3656 bsize = b->b_offset;
3657 for (i = 0; i < b->b_iused; i++) {
3658 struct instr *instr = &b->b_instr[i];
3659 /* Relative jumps are computed relative to
3660 the instruction pointer after fetching
3661 the jump instruction.
3662 */
3663 bsize += instrsize(instr);
3664 if (instr->i_jabs)
3665 instr->i_oparg = instr->i_target->b_offset;
3666 else if (instr->i_jrel) {
3667 int delta = instr->i_target->b_offset - bsize;
3668 instr->i_oparg = delta;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003669 }
Neal Norwitzf1d50682005-10-23 23:00:41 +00003670 else
3671 continue;
3672 if (instr->i_oparg > 0xffff)
3673 extended_arg_count++;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003674 }
3675 }
Neal Norwitzf1d50682005-10-23 23:00:41 +00003676
3677 /* XXX: This is an awful hack that could hurt performance, but
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003678 on the bright side it should work until we come up
Neal Norwitzf1d50682005-10-23 23:00:41 +00003679 with a better solution.
3680
3681 In the meantime, should the goto be dropped in favor
3682 of a loop?
3683
3684 The issue is that in the first loop blocksize() is called
3685 which calls instrsize() which requires i_oparg be set
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003686 appropriately. There is a bootstrap problem because
Neal Norwitzf1d50682005-10-23 23:00:41 +00003687 i_oparg is calculated in the second loop above.
3688
3689 So we loop until we stop seeing new EXTENDED_ARGs.
3690 The only EXTENDED_ARGs that could be popping up are
3691 ones in jump instructions. So this should converge
3692 fairly quickly.
3693 */
3694 if (last_extended_arg_count != extended_arg_count) {
3695 last_extended_arg_count = extended_arg_count;
3696 goto start;
3697 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003698}
3699
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003700static PyObject *
3701dict_keys_inorder(PyObject *dict, int offset)
3702{
3703 PyObject *tuple, *k, *v;
Martin v. Löwis18e16552006-02-15 17:27:45 +00003704 Py_ssize_t i, pos = 0, size = PyDict_Size(dict);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003705
3706 tuple = PyTuple_New(size);
3707 if (tuple == NULL)
3708 return NULL;
3709 while (PyDict_Next(dict, &pos, &k, &v)) {
3710 i = PyInt_AS_LONG(v);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003711 k = PyTuple_GET_ITEM(k, 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003712 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00003713 assert((i - offset) < size);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003714 assert((i - offset) >= 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003715 PyTuple_SET_ITEM(tuple, i - offset, k);
3716 }
3717 return tuple;
3718}
3719
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003720static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003721compute_code_flags(struct compiler *c)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003722{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003723 PySTEntryObject *ste = c->u->u_ste;
3724 int flags = 0, n;
3725 if (ste->ste_type != ModuleBlock)
3726 flags |= CO_NEWLOCALS;
3727 if (ste->ste_type == FunctionBlock) {
3728 if (!ste->ste_unoptimized)
3729 flags |= CO_OPTIMIZED;
3730 if (ste->ste_nested)
3731 flags |= CO_NESTED;
3732 if (ste->ste_generator)
3733 flags |= CO_GENERATOR;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003734 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003735 if (ste->ste_varargs)
3736 flags |= CO_VARARGS;
3737 if (ste->ste_varkeywords)
3738 flags |= CO_VARKEYWORDS;
Tim Peters5ca576e2001-06-18 22:08:13 +00003739 if (ste->ste_generator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003740 flags |= CO_GENERATOR;
Thomas Wouters5e9f1fa2006-02-28 20:02:27 +00003741
3742 /* (Only) inherit compilerflags in PyCF_MASK */
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003743 flags |= (c->c_flags->cf_flags & PyCF_MASK);
Thomas Wouters5e9f1fa2006-02-28 20:02:27 +00003744
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003745 n = PyDict_Size(c->u->u_freevars);
3746 if (n < 0)
3747 return -1;
3748 if (n == 0) {
3749 n = PyDict_Size(c->u->u_cellvars);
3750 if (n < 0)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00003751 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003752 if (n == 0) {
3753 flags |= CO_NOFREE;
3754 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003755 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00003756
Jeremy Hylton29906ee2001-02-27 04:23:34 +00003757 return flags;
3758}
3759
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003760static PyCodeObject *
3761makecode(struct compiler *c, struct assembler *a)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003762{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003763 PyObject *tmp;
3764 PyCodeObject *co = NULL;
3765 PyObject *consts = NULL;
3766 PyObject *names = NULL;
3767 PyObject *varnames = NULL;
3768 PyObject *filename = NULL;
3769 PyObject *name = NULL;
3770 PyObject *freevars = NULL;
3771 PyObject *cellvars = NULL;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003772 PyObject *bytecode = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003773 int nlocals, flags;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003774
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003775 tmp = dict_keys_inorder(c->u->u_consts, 0);
3776 if (!tmp)
3777 goto error;
3778 consts = PySequence_List(tmp); /* optimize_code requires a list */
3779 Py_DECREF(tmp);
3780
3781 names = dict_keys_inorder(c->u->u_names, 0);
3782 varnames = dict_keys_inorder(c->u->u_varnames, 0);
3783 if (!consts || !names || !varnames)
3784 goto error;
3785
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003786 cellvars = dict_keys_inorder(c->u->u_cellvars, 0);
3787 if (!cellvars)
3788 goto error;
3789 freevars = dict_keys_inorder(c->u->u_freevars, PyTuple_Size(cellvars));
3790 if (!freevars)
3791 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003792 filename = PyString_FromString(c->c_filename);
3793 if (!filename)
3794 goto error;
3795
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003796 nlocals = PyDict_Size(c->u->u_varnames);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003797 flags = compute_code_flags(c);
3798 if (flags < 0)
3799 goto error;
3800
Jeremy Hylton644dddc2006-08-21 16:19:37 +00003801 bytecode = PyCode_Optimize(a->a_bytecode, consts, names, a->a_lnotab);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003802 if (!bytecode)
3803 goto error;
3804
3805 tmp = PyList_AsTuple(consts); /* PyCode_New requires a tuple */
3806 if (!tmp)
3807 goto error;
3808 Py_DECREF(consts);
3809 consts = tmp;
3810
3811 co = PyCode_New(c->u->u_argcount, nlocals, stackdepth(c), flags,
3812 bytecode, consts, names, varnames,
3813 freevars, cellvars,
3814 filename, c->u->u_name,
3815 c->u->u_firstlineno,
3816 a->a_lnotab);
3817 error:
3818 Py_XDECREF(consts);
3819 Py_XDECREF(names);
3820 Py_XDECREF(varnames);
3821 Py_XDECREF(filename);
3822 Py_XDECREF(name);
3823 Py_XDECREF(freevars);
3824 Py_XDECREF(cellvars);
3825 Py_XDECREF(bytecode);
3826 return co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003827}
3828
Neal Norwitz4ffedad2006-08-04 04:58:47 +00003829
3830/* For debugging purposes only */
3831#if 0
3832static void
3833dump_instr(const struct instr *i)
3834{
3835 const char *jrel = i->i_jrel ? "jrel " : "";
3836 const char *jabs = i->i_jabs ? "jabs " : "";
3837 char arg[128];
3838
3839 *arg = '\0';
3840 if (i->i_hasarg)
3841 sprintf(arg, "arg: %d ", i->i_oparg);
3842
3843 fprintf(stderr, "line: %d, opcode: %d %s%s%s\n",
3844 i->i_lineno, i->i_opcode, arg, jabs, jrel);
3845}
3846
3847static void
3848dump_basicblock(const basicblock *b)
3849{
3850 const char *seen = b->b_seen ? "seen " : "";
3851 const char *b_return = b->b_return ? "return " : "";
3852 fprintf(stderr, "used: %d, depth: %d, offset: %d %s%s\n",
3853 b->b_iused, b->b_startdepth, b->b_offset, seen, b_return);
3854 if (b->b_instr) {
3855 int i;
3856 for (i = 0; i < b->b_iused; i++) {
3857 fprintf(stderr, " [%02d] ", i);
3858 dump_instr(b->b_instr + i);
3859 }
3860 }
3861}
3862#endif
3863
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003864static PyCodeObject *
3865assemble(struct compiler *c, int addNone)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003866{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003867 basicblock *b, *entryblock;
3868 struct assembler a;
3869 int i, j, nblocks;
3870 PyCodeObject *co = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003871
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003872 /* Make sure every block that falls off the end returns None.
3873 XXX NEXT_BLOCK() isn't quite right, because if the last
3874 block ends with a jump or return b_next shouldn't set.
3875 */
3876 if (!c->u->u_curblock->b_return) {
3877 NEXT_BLOCK(c);
3878 if (addNone)
3879 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3880 ADDOP(c, RETURN_VALUE);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003881 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003882
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003883 nblocks = 0;
3884 entryblock = NULL;
3885 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
3886 nblocks++;
3887 entryblock = b;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003888 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003889
Neal Norwitzed657552006-07-10 00:04:44 +00003890 /* Set firstlineno if it wasn't explicitly set. */
3891 if (!c->u->u_firstlineno) {
3892 if (entryblock && entryblock->b_instr)
3893 c->u->u_firstlineno = entryblock->b_instr->i_lineno;
3894 else
3895 c->u->u_firstlineno = 1;
3896 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003897 if (!assemble_init(&a, nblocks, c->u->u_firstlineno))
3898 goto error;
3899 dfs(c, entryblock, &a);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003900
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003901 /* Can't modify the bytecode after computing jump offsets. */
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003902 assemble_jump_offsets(&a, c);
Tim Petersb6c3cea2001-06-26 03:36:28 +00003903
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003904 /* Emit code in reverse postorder from dfs. */
3905 for (i = a.a_nblocks - 1; i >= 0; i--) {
Neal Norwitz08b401f2006-01-07 21:24:09 +00003906 b = a.a_postorder[i];
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003907 for (j = 0; j < b->b_iused; j++)
3908 if (!assemble_emit(&a, &b->b_instr[j]))
3909 goto error;
Tim Petersb6c3cea2001-06-26 03:36:28 +00003910 }
Tim Petersb6c3cea2001-06-26 03:36:28 +00003911
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003912 if (_PyString_Resize(&a.a_lnotab, a.a_lnotab_off) < 0)
3913 goto error;
3914 if (_PyString_Resize(&a.a_bytecode, a.a_offset) < 0)
3915 goto error;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003916
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003917 co = makecode(c, &a);
3918 error:
3919 assemble_free(&a);
3920 return co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003921}