blob: 193d52076ab0b591fd92f386e01f1ba97627420a [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;
732 case DELETE_SUBSCR:
733 return -2;
734
735 case BINARY_LSHIFT:
736 case BINARY_RSHIFT:
737 case BINARY_AND:
738 case BINARY_XOR:
739 case BINARY_OR:
740 return -1;
741 case INPLACE_POWER:
742 return -1;
743 case GET_ITER:
744 return 0;
745
746 case PRINT_EXPR:
747 return -1;
748 case PRINT_ITEM:
749 return -1;
750 case PRINT_NEWLINE:
751 return 0;
752 case PRINT_ITEM_TO:
753 return -2;
754 case PRINT_NEWLINE_TO:
755 return -1;
756 case INPLACE_LSHIFT:
757 case INPLACE_RSHIFT:
758 case INPLACE_AND:
759 case INPLACE_XOR:
760 case INPLACE_OR:
761 return -1;
762 case BREAK_LOOP:
763 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +0000764 case WITH_CLEANUP:
Guido van Rossumf6694362006-03-10 02:28:35 +0000765 return -1; /* XXX Sometimes more */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000766 case LOAD_LOCALS:
767 return 1;
768 case RETURN_VALUE:
769 return -1;
770 case IMPORT_STAR:
771 return -1;
772 case EXEC_STMT:
773 return -3;
774 case YIELD_VALUE:
775 return 0;
776
777 case POP_BLOCK:
778 return 0;
779 case END_FINALLY:
780 return -1; /* or -2 or -3 if exception occurred */
781 case BUILD_CLASS:
782 return -2;
783
784 case STORE_NAME:
785 return -1;
786 case DELETE_NAME:
787 return 0;
788 case UNPACK_SEQUENCE:
789 return oparg-1;
790 case FOR_ITER:
791 return 1;
792
793 case STORE_ATTR:
794 return -2;
795 case DELETE_ATTR:
796 return -1;
797 case STORE_GLOBAL:
798 return -1;
799 case DELETE_GLOBAL:
800 return 0;
801 case DUP_TOPX:
802 return oparg;
803 case LOAD_CONST:
804 return 1;
805 case LOAD_NAME:
806 return 1;
807 case BUILD_TUPLE:
808 case BUILD_LIST:
809 return 1-oparg;
810 case BUILD_MAP:
811 return 1;
812 case LOAD_ATTR:
813 return 0;
814 case COMPARE_OP:
815 return -1;
816 case IMPORT_NAME:
817 return 0;
818 case IMPORT_FROM:
819 return 1;
820
821 case JUMP_FORWARD:
822 case JUMP_IF_FALSE:
823 case JUMP_IF_TRUE:
824 case JUMP_ABSOLUTE:
825 return 0;
826
827 case LOAD_GLOBAL:
828 return 1;
829
830 case CONTINUE_LOOP:
831 return 0;
832 case SETUP_LOOP:
833 return 0;
834 case SETUP_EXCEPT:
835 case SETUP_FINALLY:
836 return 3; /* actually pushed by an exception */
837
838 case LOAD_FAST:
839 return 1;
840 case STORE_FAST:
841 return -1;
842 case DELETE_FAST:
843 return 0;
844
845 case RAISE_VARARGS:
846 return -oparg;
847#define NARGS(o) (((o) % 256) + 2*((o) / 256))
848 case CALL_FUNCTION:
849 return -NARGS(oparg);
850 case CALL_FUNCTION_VAR:
851 case CALL_FUNCTION_KW:
852 return -NARGS(oparg)-1;
853 case CALL_FUNCTION_VAR_KW:
854 return -NARGS(oparg)-2;
855#undef NARGS
856 case MAKE_FUNCTION:
857 return -oparg;
858 case BUILD_SLICE:
859 if (oparg == 3)
860 return -2;
861 else
862 return -1;
863
864 case MAKE_CLOSURE:
865 return -oparg;
866 case LOAD_CLOSURE:
867 return 1;
868 case LOAD_DEREF:
869 return 1;
870 case STORE_DEREF:
871 return -1;
872 default:
873 fprintf(stderr, "opcode = %d\n", opcode);
874 Py_FatalError("opcode_stack_effect()");
875
876 }
877 return 0; /* not reachable */
878}
879
880/* Add an opcode with no argument.
881 Returns 0 on failure, 1 on success.
882*/
883
884static int
885compiler_addop(struct compiler *c, int opcode)
886{
887 basicblock *b;
888 struct instr *i;
889 int off;
890 off = compiler_next_instr(c, c->u->u_curblock);
891 if (off < 0)
892 return 0;
893 b = c->u->u_curblock;
894 i = &b->b_instr[off];
895 i->i_opcode = opcode;
896 i->i_hasarg = 0;
897 if (opcode == RETURN_VALUE)
898 b->b_return = 1;
899 compiler_set_lineno(c, off);
900 return 1;
901}
902
903static int
904compiler_add_o(struct compiler *c, PyObject *dict, PyObject *o)
905{
906 PyObject *t, *v;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000907 Py_ssize_t arg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000908
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000909 /* necessary to make sure types aren't coerced (e.g., int and long) */
Alex Martellid8672aa2007-08-22 21:14:17 +0000910 /* _and_ to distinguish 0.0 from -0.0 e.g. on IEEE platforms */
911 if (PyFloat_Check(o)) {
912 double d = PyFloat_AS_DOUBLE(o);
913 unsigned char* p = (unsigned char*) &d;
914 /* all we need is to make the tuple different in either the 0.0
915 * or -0.0 case from all others, just to avoid the "coercion".
916 */
917 if (*p==0 && p[sizeof(double)-1]==0)
918 t = PyTuple_Pack(3, o, o->ob_type, Py_None);
919 else
920 t = PyTuple_Pack(2, o, o->ob_type);
921 } else {
922 t = PyTuple_Pack(2, o, o->ob_type);
923 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000924 if (t == NULL)
925 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000926
927 v = PyDict_GetItem(dict, t);
928 if (!v) {
929 arg = PyDict_Size(dict);
930 v = PyInt_FromLong(arg);
931 if (!v) {
932 Py_DECREF(t);
933 return -1;
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000934 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000935 if (PyDict_SetItem(dict, t, v) < 0) {
936 Py_DECREF(t);
937 Py_DECREF(v);
938 return -1;
939 }
940 Py_DECREF(v);
941 }
942 else
943 arg = PyInt_AsLong(v);
944 Py_DECREF(t);
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000945 return arg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000946}
947
948static int
949compiler_addop_o(struct compiler *c, int opcode, PyObject *dict,
950 PyObject *o)
951{
952 int arg = compiler_add_o(c, dict, o);
953 if (arg < 0)
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000954 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000955 return compiler_addop_i(c, opcode, arg);
956}
957
958static int
959compiler_addop_name(struct compiler *c, int opcode, PyObject *dict,
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000960 PyObject *o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000961{
962 int arg;
963 PyObject *mangled = _Py_Mangle(c->u->u_private, o);
964 if (!mangled)
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000965 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000966 arg = compiler_add_o(c, dict, mangled);
967 Py_DECREF(mangled);
968 if (arg < 0)
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000969 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000970 return compiler_addop_i(c, opcode, arg);
971}
972
973/* Add an opcode with an integer argument.
974 Returns 0 on failure, 1 on success.
975*/
976
977static int
978compiler_addop_i(struct compiler *c, int opcode, int oparg)
979{
980 struct instr *i;
981 int off;
982 off = compiler_next_instr(c, c->u->u_curblock);
983 if (off < 0)
984 return 0;
985 i = &c->u->u_curblock->b_instr[off];
986 i->i_opcode = opcode;
987 i->i_oparg = oparg;
988 i->i_hasarg = 1;
989 compiler_set_lineno(c, off);
990 return 1;
991}
992
993static int
994compiler_addop_j(struct compiler *c, int opcode, basicblock *b, int absolute)
995{
996 struct instr *i;
997 int off;
998
999 assert(b != NULL);
1000 off = compiler_next_instr(c, c->u->u_curblock);
1001 if (off < 0)
1002 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001003 i = &c->u->u_curblock->b_instr[off];
1004 i->i_opcode = opcode;
1005 i->i_target = b;
1006 i->i_hasarg = 1;
1007 if (absolute)
1008 i->i_jabs = 1;
1009 else
1010 i->i_jrel = 1;
Jeremy Hylton12603c42006-04-01 16:18:02 +00001011 compiler_set_lineno(c, off);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001012 return 1;
1013}
1014
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001015/* The distinction between NEW_BLOCK and NEXT_BLOCK is subtle. (I'd
1016 like to find better names.) NEW_BLOCK() creates a new block and sets
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001017 it as the current block. NEXT_BLOCK() also creates an implicit jump
1018 from the current block to the new block.
1019*/
1020
Neal Norwitzf733a012006-10-29 18:30:10 +00001021/* The returns inside these macros make it impossible to decref objects
1022 created in the local function. Local objects should use the arena.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001023*/
1024
1025
1026#define NEW_BLOCK(C) { \
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001027 if (compiler_use_new_block((C)) == NULL) \
1028 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001029}
1030
1031#define NEXT_BLOCK(C) { \
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001032 if (compiler_next_block((C)) == NULL) \
1033 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001034}
1035
1036#define ADDOP(C, OP) { \
1037 if (!compiler_addop((C), (OP))) \
1038 return 0; \
1039}
1040
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001041#define ADDOP_IN_SCOPE(C, OP) { \
1042 if (!compiler_addop((C), (OP))) { \
1043 compiler_exit_scope(c); \
1044 return 0; \
1045 } \
1046}
1047
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001048#define ADDOP_O(C, OP, O, TYPE) { \
1049 if (!compiler_addop_o((C), (OP), (C)->u->u_ ## TYPE, (O))) \
1050 return 0; \
1051}
1052
1053#define ADDOP_NAME(C, OP, O, TYPE) { \
1054 if (!compiler_addop_name((C), (OP), (C)->u->u_ ## TYPE, (O))) \
1055 return 0; \
1056}
1057
1058#define ADDOP_I(C, OP, O) { \
1059 if (!compiler_addop_i((C), (OP), (O))) \
1060 return 0; \
1061}
1062
1063#define ADDOP_JABS(C, OP, O) { \
1064 if (!compiler_addop_j((C), (OP), (O), 1)) \
1065 return 0; \
1066}
1067
1068#define ADDOP_JREL(C, OP, O) { \
1069 if (!compiler_addop_j((C), (OP), (O), 0)) \
1070 return 0; \
1071}
1072
1073/* VISIT and VISIT_SEQ takes an ASDL type as their second argument. They use
1074 the ASDL name to synthesize the name of the C type and the visit function.
1075*/
1076
1077#define VISIT(C, TYPE, V) {\
1078 if (!compiler_visit_ ## TYPE((C), (V))) \
1079 return 0; \
1080}
1081
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001082#define VISIT_IN_SCOPE(C, TYPE, V) {\
1083 if (!compiler_visit_ ## TYPE((C), (V))) { \
1084 compiler_exit_scope(c); \
1085 return 0; \
1086 } \
1087}
1088
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001089#define VISIT_SLICE(C, V, CTX) {\
1090 if (!compiler_visit_slice((C), (V), (CTX))) \
1091 return 0; \
1092}
1093
1094#define VISIT_SEQ(C, TYPE, SEQ) { \
Neal Norwitz08b401f2006-01-07 21:24:09 +00001095 int _i; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001096 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
Neal Norwitz08b401f2006-01-07 21:24:09 +00001097 for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001098 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \
Anthony Baxter7b782b62006-04-11 12:01:56 +00001099 if (!compiler_visit_ ## TYPE((C), elt)) \
1100 return 0; \
1101 } \
1102}
1103
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001104#define VISIT_SEQ_IN_SCOPE(C, TYPE, SEQ) { \
Neal Norwitz08b401f2006-01-07 21:24:09 +00001105 int _i; \
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001106 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
Neal Norwitz08b401f2006-01-07 21:24:09 +00001107 for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001108 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \
Anthony Baxter7b782b62006-04-11 12:01:56 +00001109 if (!compiler_visit_ ## TYPE((C), elt)) { \
1110 compiler_exit_scope(c); \
1111 return 0; \
1112 } \
1113 } \
1114}
1115
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001116static int
1117compiler_isdocstring(stmt_ty s)
1118{
1119 if (s->kind != Expr_kind)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001120 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001121 return s->v.Expr.value->kind == Str_kind;
1122}
1123
1124/* Compile a sequence of statements, checking for a docstring. */
1125
1126static int
1127compiler_body(struct compiler *c, asdl_seq *stmts)
1128{
1129 int i = 0;
1130 stmt_ty st;
1131
1132 if (!asdl_seq_LEN(stmts))
1133 return 1;
Anthony Baxter7b782b62006-04-11 12:01:56 +00001134 st = (stmt_ty)asdl_seq_GET(stmts, 0);
Georg Brandla5ea6892007-06-01 11:33:33 +00001135 if (compiler_isdocstring(st) && Py_OptimizeFlag < 2) {
1136 /* don't generate docstrings if -OO */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001137 i = 1;
1138 VISIT(c, expr, st->v.Expr.value);
1139 if (!compiler_nameop(c, __doc__, Store))
1140 return 0;
1141 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001142 for (; i < asdl_seq_LEN(stmts); i++)
Anthony Baxter7b782b62006-04-11 12:01:56 +00001143 VISIT(c, stmt, (stmt_ty)asdl_seq_GET(stmts, i));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001144 return 1;
1145}
1146
1147static PyCodeObject *
1148compiler_mod(struct compiler *c, mod_ty mod)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001149{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001150 PyCodeObject *co;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001151 int addNone = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001152 static PyObject *module;
1153 if (!module) {
1154 module = PyString_FromString("<module>");
1155 if (!module)
1156 return NULL;
1157 }
Neal Norwitzed657552006-07-10 00:04:44 +00001158 /* Use 0 for firstlineno initially, will fixup in assemble(). */
1159 if (!compiler_enter_scope(c, module, mod, 0))
Guido van Rossumd076c731998-10-07 19:42:25 +00001160 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001161 switch (mod->kind) {
1162 case Module_kind:
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001163 if (!compiler_body(c, mod->v.Module.body)) {
1164 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001165 return 0;
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001166 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001167 break;
1168 case Interactive_kind:
1169 c->c_interactive = 1;
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001170 VISIT_SEQ_IN_SCOPE(c, stmt,
Jeremy Hylton819de6c2007-02-27 16:13:23 +00001171 mod->v.Interactive.body);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001172 break;
1173 case Expression_kind:
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001174 VISIT_IN_SCOPE(c, expr, mod->v.Expression.body);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001175 addNone = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001176 break;
1177 case Suite_kind:
Neal Norwitz4737b232005-11-19 23:58:29 +00001178 PyErr_SetString(PyExc_SystemError,
1179 "suite should not be possible");
1180 return 0;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001181 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00001182 PyErr_Format(PyExc_SystemError,
1183 "module kind %d should not be possible",
1184 mod->kind);
1185 return 0;
Guido van Rossumd076c731998-10-07 19:42:25 +00001186 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001187 co = assemble(c, addNone);
1188 compiler_exit_scope(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001189 return co;
1190}
1191
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001192/* The test for LOCAL must come before the test for FREE in order to
1193 handle classes where name is both local and free. The local var is
1194 a method and the free var is a free var referenced within a method.
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001195*/
1196
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001197static int
1198get_ref_type(struct compiler *c, PyObject *name)
1199{
1200 int scope = PyST_GetScope(c->u->u_ste, name);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001201 if (scope == 0) {
1202 char buf[350];
1203 PyOS_snprintf(buf, sizeof(buf),
1204 "unknown scope for %.100s in %.100s(%s) in %s\n"
1205 "symbols: %s\nlocals: %s\nglobals: %s\n",
1206 PyString_AS_STRING(name),
1207 PyString_AS_STRING(c->u->u_name),
1208 PyObject_REPR(c->u->u_ste->ste_id),
1209 c->c_filename,
1210 PyObject_REPR(c->u->u_ste->ste_symbols),
1211 PyObject_REPR(c->u->u_varnames),
1212 PyObject_REPR(c->u->u_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001213 );
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001214 Py_FatalError(buf);
1215 }
Tim Peters2a7f3842001-06-09 09:26:21 +00001216
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001217 return scope;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001218}
1219
1220static int
1221compiler_lookup_arg(PyObject *dict, PyObject *name)
1222{
1223 PyObject *k, *v;
Georg Brandl7784f122006-05-26 20:04:44 +00001224 k = PyTuple_Pack(2, name, name->ob_type);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001225 if (k == NULL)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001226 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001227 v = PyDict_GetItem(dict, k);
Neal Norwitz3715c3e2005-11-24 22:09:18 +00001228 Py_DECREF(k);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001229 if (v == NULL)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001230 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001231 return PyInt_AS_LONG(v);
1232}
1233
1234static int
1235compiler_make_closure(struct compiler *c, PyCodeObject *co, int args)
1236{
1237 int i, free = PyCode_GetNumFree(co);
1238 if (free == 0) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001239 ADDOP_O(c, LOAD_CONST, (PyObject*)co, consts);
1240 ADDOP_I(c, MAKE_FUNCTION, args);
1241 return 1;
1242 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001243 for (i = 0; i < free; ++i) {
1244 /* Bypass com_addop_varname because it will generate
1245 LOAD_DEREF but LOAD_CLOSURE is needed.
1246 */
1247 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
1248 int arg, reftype;
1249
1250 /* Special case: If a class contains a method with a
1251 free variable that has the same name as a method,
1252 the name will be considered free *and* local in the
1253 class. It should be handled by the closure, as
1254 well as by the normal name loookup logic.
1255 */
1256 reftype = get_ref_type(c, name);
1257 if (reftype == CELL)
1258 arg = compiler_lookup_arg(c->u->u_cellvars, name);
1259 else /* (reftype == FREE) */
1260 arg = compiler_lookup_arg(c->u->u_freevars, name);
1261 if (arg == -1) {
1262 printf("lookup %s in %s %d %d\n"
1263 "freevars of %s: %s\n",
1264 PyObject_REPR(name),
1265 PyString_AS_STRING(c->u->u_name),
1266 reftype, arg,
1267 PyString_AS_STRING(co->co_name),
1268 PyObject_REPR(co->co_freevars));
1269 Py_FatalError("compiler_make_closure()");
1270 }
1271 ADDOP_I(c, LOAD_CLOSURE, arg);
1272 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001273 ADDOP_I(c, BUILD_TUPLE, free);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001274 ADDOP_O(c, LOAD_CONST, (PyObject*)co, consts);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001275 ADDOP_I(c, MAKE_CLOSURE, args);
1276 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001277}
1278
1279static int
1280compiler_decorators(struct compiler *c, asdl_seq* decos)
1281{
1282 int i;
1283
1284 if (!decos)
1285 return 1;
1286
1287 for (i = 0; i < asdl_seq_LEN(decos); i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00001288 VISIT(c, expr, (expr_ty)asdl_seq_GET(decos, i));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001289 }
1290 return 1;
1291}
1292
1293static int
1294compiler_arguments(struct compiler *c, arguments_ty args)
1295{
1296 int i;
1297 int n = asdl_seq_LEN(args->args);
1298 /* Correctly handle nested argument lists */
1299 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00001300 expr_ty arg = (expr_ty)asdl_seq_GET(args->args, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001301 if (arg->kind == Tuple_kind) {
1302 PyObject *id = PyString_FromFormat(".%d", i);
1303 if (id == NULL) {
1304 return 0;
1305 }
1306 if (!compiler_nameop(c, id, Load)) {
1307 Py_DECREF(id);
1308 return 0;
1309 }
1310 Py_DECREF(id);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001311 VISIT(c, expr, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001312 }
1313 }
1314 return 1;
1315}
1316
1317static int
1318compiler_function(struct compiler *c, stmt_ty s)
1319{
1320 PyCodeObject *co;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001321 PyObject *first_const = Py_None;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001322 arguments_ty args = s->v.FunctionDef.args;
1323 asdl_seq* decos = s->v.FunctionDef.decorators;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001324 stmt_ty st;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001325 int i, n, docstring;
1326
1327 assert(s->kind == FunctionDef_kind);
1328
1329 if (!compiler_decorators(c, decos))
1330 return 0;
1331 if (args->defaults)
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001332 VISIT_SEQ(c, expr, args->defaults);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001333 if (!compiler_enter_scope(c, s->v.FunctionDef.name, (void *)s,
1334 s->lineno))
1335 return 0;
1336
Anthony Baxter7b782b62006-04-11 12:01:56 +00001337 st = (stmt_ty)asdl_seq_GET(s->v.FunctionDef.body, 0);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001338 docstring = compiler_isdocstring(st);
Georg Brandl5a5bc7b2007-09-19 06:37:19 +00001339 if (docstring && Py_OptimizeFlag < 2)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001340 first_const = st->v.Expr.value->v.Str.s;
1341 if (compiler_add_o(c, c->u->u_consts, first_const) < 0) {
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001342 compiler_exit_scope(c);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001343 return 0;
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001344 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001345
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001346 /* unpack nested arguments */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001347 compiler_arguments(c, args);
1348
1349 c->u->u_argcount = asdl_seq_LEN(args->args);
1350 n = asdl_seq_LEN(s->v.FunctionDef.body);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001351 /* if there was a docstring, we need to skip the first statement */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001352 for (i = docstring; i < n; i++) {
Neal Norwitz4ffedad2006-08-04 04:58:47 +00001353 st = (stmt_ty)asdl_seq_GET(s->v.FunctionDef.body, i);
1354 VISIT_IN_SCOPE(c, stmt, st);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001355 }
1356 co = assemble(c, 1);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001357 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001358 if (co == NULL)
1359 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001360
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001361 compiler_make_closure(c, co, asdl_seq_LEN(args->defaults));
Neal Norwitz4737b232005-11-19 23:58:29 +00001362 Py_DECREF(co);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001363
1364 for (i = 0; i < asdl_seq_LEN(decos); i++) {
1365 ADDOP_I(c, CALL_FUNCTION, 1);
1366 }
1367
1368 return compiler_nameop(c, s->v.FunctionDef.name, Store);
1369}
1370
1371static int
1372compiler_class(struct compiler *c, stmt_ty s)
1373{
1374 int n;
1375 PyCodeObject *co;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001376 PyObject *str;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001377 /* push class name on stack, needed by BUILD_CLASS */
1378 ADDOP_O(c, LOAD_CONST, s->v.ClassDef.name, consts);
1379 /* push the tuple of base classes on the stack */
1380 n = asdl_seq_LEN(s->v.ClassDef.bases);
1381 if (n > 0)
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001382 VISIT_SEQ(c, expr, s->v.ClassDef.bases);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001383 ADDOP_I(c, BUILD_TUPLE, n);
1384 if (!compiler_enter_scope(c, s->v.ClassDef.name, (void *)s,
1385 s->lineno))
1386 return 0;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001387 c->u->u_private = s->v.ClassDef.name;
1388 Py_INCREF(c->u->u_private);
1389 str = PyString_InternFromString("__name__");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001390 if (!str || !compiler_nameop(c, str, Load)) {
1391 Py_XDECREF(str);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001392 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001393 return 0;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001394 }
1395
1396 Py_DECREF(str);
1397 str = PyString_InternFromString("__module__");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001398 if (!str || !compiler_nameop(c, str, Store)) {
1399 Py_XDECREF(str);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001400 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001401 return 0;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001402 }
1403 Py_DECREF(str);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001404
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001405 if (!compiler_body(c, s->v.ClassDef.body)) {
1406 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001407 return 0;
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001408 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001409
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001410 ADDOP_IN_SCOPE(c, LOAD_LOCALS);
1411 ADDOP_IN_SCOPE(c, RETURN_VALUE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001412 co = assemble(c, 1);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001413 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001414 if (co == NULL)
1415 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001416
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001417 compiler_make_closure(c, co, 0);
Neal Norwitz4737b232005-11-19 23:58:29 +00001418 Py_DECREF(co);
1419
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001420 ADDOP_I(c, CALL_FUNCTION, 0);
1421 ADDOP(c, BUILD_CLASS);
1422 if (!compiler_nameop(c, s->v.ClassDef.name, Store))
1423 return 0;
1424 return 1;
1425}
1426
1427static int
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001428compiler_ifexp(struct compiler *c, expr_ty e)
1429{
1430 basicblock *end, *next;
1431
1432 assert(e->kind == IfExp_kind);
1433 end = compiler_new_block(c);
1434 if (end == NULL)
1435 return 0;
1436 next = compiler_new_block(c);
1437 if (next == NULL)
1438 return 0;
1439 VISIT(c, expr, e->v.IfExp.test);
1440 ADDOP_JREL(c, JUMP_IF_FALSE, next);
1441 ADDOP(c, POP_TOP);
1442 VISIT(c, expr, e->v.IfExp.body);
1443 ADDOP_JREL(c, JUMP_FORWARD, end);
1444 compiler_use_next_block(c, next);
1445 ADDOP(c, POP_TOP);
1446 VISIT(c, expr, e->v.IfExp.orelse);
1447 compiler_use_next_block(c, end);
1448 return 1;
1449}
1450
1451static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001452compiler_lambda(struct compiler *c, expr_ty e)
1453{
1454 PyCodeObject *co;
Nick Coghlan944d3eb2005-11-16 12:46:55 +00001455 static identifier name;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001456 arguments_ty args = e->v.Lambda.args;
1457 assert(e->kind == Lambda_kind);
1458
Nick Coghlan944d3eb2005-11-16 12:46:55 +00001459 if (!name) {
1460 name = PyString_InternFromString("<lambda>");
1461 if (!name)
1462 return 0;
1463 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001464
1465 if (args->defaults)
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001466 VISIT_SEQ(c, expr, args->defaults);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001467 if (!compiler_enter_scope(c, name, (void *)e, e->lineno))
1468 return 0;
Neal Norwitz4737b232005-11-19 23:58:29 +00001469
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001470 /* unpack nested arguments */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001471 compiler_arguments(c, args);
1472
1473 c->u->u_argcount = asdl_seq_LEN(args->args);
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001474 VISIT_IN_SCOPE(c, expr, e->v.Lambda.body);
1475 ADDOP_IN_SCOPE(c, RETURN_VALUE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001476 co = assemble(c, 1);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001477 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001478 if (co == NULL)
1479 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001480
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001481 compiler_make_closure(c, co, asdl_seq_LEN(args->defaults));
Neal Norwitz4737b232005-11-19 23:58:29 +00001482 Py_DECREF(co);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001483
1484 return 1;
1485}
1486
1487static int
1488compiler_print(struct compiler *c, stmt_ty s)
1489{
1490 int i, n;
1491 bool dest;
1492
1493 assert(s->kind == Print_kind);
1494 n = asdl_seq_LEN(s->v.Print.values);
1495 dest = false;
1496 if (s->v.Print.dest) {
1497 VISIT(c, expr, s->v.Print.dest);
1498 dest = true;
1499 }
1500 for (i = 0; i < n; i++) {
1501 expr_ty e = (expr_ty)asdl_seq_GET(s->v.Print.values, i);
1502 if (dest) {
1503 ADDOP(c, DUP_TOP);
1504 VISIT(c, expr, e);
1505 ADDOP(c, ROT_TWO);
1506 ADDOP(c, PRINT_ITEM_TO);
1507 }
1508 else {
1509 VISIT(c, expr, e);
1510 ADDOP(c, PRINT_ITEM);
1511 }
1512 }
1513 if (s->v.Print.nl) {
1514 if (dest)
1515 ADDOP(c, PRINT_NEWLINE_TO)
1516 else
1517 ADDOP(c, PRINT_NEWLINE)
1518 }
1519 else if (dest)
1520 ADDOP(c, POP_TOP);
1521 return 1;
1522}
1523
1524static int
1525compiler_if(struct compiler *c, stmt_ty s)
1526{
1527 basicblock *end, *next;
Georg Brandlddbaa662006-06-04 21:56:52 +00001528 int constant;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001529 assert(s->kind == If_kind);
1530 end = compiler_new_block(c);
1531 if (end == NULL)
1532 return 0;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001533 next = compiler_new_block(c);
1534 if (next == NULL)
1535 return 0;
Georg Brandlddbaa662006-06-04 21:56:52 +00001536
1537 constant = expr_constant(s->v.If.test);
1538 /* constant = 0: "if 0"
1539 * constant = 1: "if 1", "if 2", ...
1540 * constant = -1: rest */
1541 if (constant == 0) {
1542 if (s->v.If.orelse)
1543 VISIT_SEQ(c, stmt, s->v.If.orelse);
1544 } else if (constant == 1) {
1545 VISIT_SEQ(c, stmt, s->v.If.body);
1546 } else {
1547 VISIT(c, expr, s->v.If.test);
1548 ADDOP_JREL(c, JUMP_IF_FALSE, next);
1549 ADDOP(c, POP_TOP);
1550 VISIT_SEQ(c, stmt, s->v.If.body);
1551 ADDOP_JREL(c, JUMP_FORWARD, end);
1552 compiler_use_next_block(c, next);
1553 ADDOP(c, POP_TOP);
1554 if (s->v.If.orelse)
Jeremy Hylton819de6c2007-02-27 16:13:23 +00001555 VISIT_SEQ(c, stmt, s->v.If.orelse);
Georg Brandlddbaa662006-06-04 21:56:52 +00001556 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001557 compiler_use_next_block(c, end);
1558 return 1;
1559}
1560
1561static int
1562compiler_for(struct compiler *c, stmt_ty s)
1563{
1564 basicblock *start, *cleanup, *end;
1565
1566 start = compiler_new_block(c);
1567 cleanup = compiler_new_block(c);
1568 end = compiler_new_block(c);
1569 if (start == NULL || end == NULL || cleanup == NULL)
1570 return 0;
1571 ADDOP_JREL(c, SETUP_LOOP, end);
1572 if (!compiler_push_fblock(c, LOOP, start))
1573 return 0;
1574 VISIT(c, expr, s->v.For.iter);
1575 ADDOP(c, GET_ITER);
1576 compiler_use_next_block(c, start);
Neal Norwitz4ffedad2006-08-04 04:58:47 +00001577 /* XXX(nnorwitz): is there a better way to handle this?
1578 for loops are special, we want to be able to trace them
1579 each time around, so we need to set an extra line number. */
1580 c->u->u_lineno_set = false;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001581 ADDOP_JREL(c, FOR_ITER, cleanup);
1582 VISIT(c, expr, s->v.For.target);
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001583 VISIT_SEQ(c, stmt, s->v.For.body);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001584 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
1585 compiler_use_next_block(c, cleanup);
1586 ADDOP(c, POP_BLOCK);
1587 compiler_pop_fblock(c, LOOP, start);
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001588 VISIT_SEQ(c, stmt, s->v.For.orelse);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001589 compiler_use_next_block(c, end);
1590 return 1;
1591}
1592
1593static int
1594compiler_while(struct compiler *c, stmt_ty s)
1595{
1596 basicblock *loop, *orelse, *end, *anchor = NULL;
1597 int constant = expr_constant(s->v.While.test);
1598
1599 if (constant == 0)
1600 return 1;
1601 loop = compiler_new_block(c);
1602 end = compiler_new_block(c);
1603 if (constant == -1) {
1604 anchor = compiler_new_block(c);
1605 if (anchor == NULL)
1606 return 0;
1607 }
1608 if (loop == NULL || end == NULL)
1609 return 0;
1610 if (s->v.While.orelse) {
1611 orelse = compiler_new_block(c);
1612 if (orelse == NULL)
1613 return 0;
1614 }
1615 else
1616 orelse = NULL;
1617
1618 ADDOP_JREL(c, SETUP_LOOP, end);
Nick Coghlanb90f52e2007-08-25 04:35:54 +00001619 compiler_use_next_block(c, loop);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001620 if (!compiler_push_fblock(c, LOOP, loop))
1621 return 0;
1622 if (constant == -1) {
1623 VISIT(c, expr, s->v.While.test);
1624 ADDOP_JREL(c, JUMP_IF_FALSE, anchor);
1625 ADDOP(c, POP_TOP);
1626 }
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001627 VISIT_SEQ(c, stmt, s->v.While.body);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001628 ADDOP_JABS(c, JUMP_ABSOLUTE, loop);
1629
1630 /* XXX should the two POP instructions be in a separate block
1631 if there is no else clause ?
1632 */
1633
1634 if (constant == -1) {
1635 compiler_use_next_block(c, anchor);
1636 ADDOP(c, POP_TOP);
1637 ADDOP(c, POP_BLOCK);
1638 }
1639 compiler_pop_fblock(c, LOOP, loop);
Jeremy Hylton12603c42006-04-01 16:18:02 +00001640 if (orelse != NULL) /* what if orelse is just pass? */
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001641 VISIT_SEQ(c, stmt, s->v.While.orelse);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001642 compiler_use_next_block(c, end);
1643
1644 return 1;
1645}
1646
1647static int
1648compiler_continue(struct compiler *c)
1649{
1650 static const char LOOP_ERROR_MSG[] = "'continue' not properly in loop";
Neal Norwitz4f096d92006-08-21 19:47:08 +00001651 static const char IN_FINALLY_ERROR_MSG[] =
1652 "'continue' not supported inside 'finally' clause";
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001653 int i;
1654
1655 if (!c->u->u_nfblocks)
1656 return compiler_error(c, LOOP_ERROR_MSG);
1657 i = c->u->u_nfblocks - 1;
1658 switch (c->u->u_fblock[i].fb_type) {
1659 case LOOP:
1660 ADDOP_JABS(c, JUMP_ABSOLUTE, c->u->u_fblock[i].fb_block);
1661 break;
1662 case EXCEPT:
1663 case FINALLY_TRY:
Neal Norwitz4f096d92006-08-21 19:47:08 +00001664 while (--i >= 0 && c->u->u_fblock[i].fb_type != LOOP) {
1665 /* Prevent continue anywhere under a finally
1666 even if hidden in a sub-try or except. */
1667 if (c->u->u_fblock[i].fb_type == FINALLY_END)
1668 return compiler_error(c, IN_FINALLY_ERROR_MSG);
1669 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001670 if (i == -1)
1671 return compiler_error(c, LOOP_ERROR_MSG);
1672 ADDOP_JABS(c, CONTINUE_LOOP, c->u->u_fblock[i].fb_block);
1673 break;
1674 case FINALLY_END:
Neal Norwitz4f096d92006-08-21 19:47:08 +00001675 return compiler_error(c, IN_FINALLY_ERROR_MSG);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001676 }
1677
1678 return 1;
1679}
1680
1681/* Code generated for "try: <body> finally: <finalbody>" is as follows:
1682
1683 SETUP_FINALLY L
1684 <code for body>
1685 POP_BLOCK
1686 LOAD_CONST <None>
1687 L: <code for finalbody>
1688 END_FINALLY
1689
1690 The special instructions use the block stack. Each block
1691 stack entry contains the instruction that created it (here
1692 SETUP_FINALLY), the level of the value stack at the time the
1693 block stack entry was created, and a label (here L).
1694
1695 SETUP_FINALLY:
1696 Pushes the current value stack level and the label
1697 onto the block stack.
1698 POP_BLOCK:
1699 Pops en entry from the block stack, and pops the value
1700 stack until its level is the same as indicated on the
1701 block stack. (The label is ignored.)
1702 END_FINALLY:
1703 Pops a variable number of entries from the *value* stack
1704 and re-raises the exception they specify. The number of
1705 entries popped depends on the (pseudo) exception type.
1706
1707 The block stack is unwound when an exception is raised:
1708 when a SETUP_FINALLY entry is found, the exception is pushed
1709 onto the value stack (and the exception condition is cleared),
1710 and the interpreter jumps to the label gotten from the block
1711 stack.
1712*/
1713
1714static int
1715compiler_try_finally(struct compiler *c, stmt_ty s)
1716{
1717 basicblock *body, *end;
1718 body = compiler_new_block(c);
1719 end = compiler_new_block(c);
1720 if (body == NULL || end == NULL)
1721 return 0;
1722
1723 ADDOP_JREL(c, SETUP_FINALLY, end);
1724 compiler_use_next_block(c, body);
1725 if (!compiler_push_fblock(c, FINALLY_TRY, body))
1726 return 0;
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001727 VISIT_SEQ(c, stmt, s->v.TryFinally.body);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001728 ADDOP(c, POP_BLOCK);
1729 compiler_pop_fblock(c, FINALLY_TRY, body);
1730
1731 ADDOP_O(c, LOAD_CONST, Py_None, consts);
1732 compiler_use_next_block(c, end);
1733 if (!compiler_push_fblock(c, FINALLY_END, end))
1734 return 0;
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001735 VISIT_SEQ(c, stmt, s->v.TryFinally.finalbody);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001736 ADDOP(c, END_FINALLY);
1737 compiler_pop_fblock(c, FINALLY_END, end);
1738
1739 return 1;
1740}
1741
1742/*
1743 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
1744 (The contents of the value stack is shown in [], with the top
1745 at the right; 'tb' is trace-back info, 'val' the exception's
1746 associated value, and 'exc' the exception.)
1747
1748 Value stack Label Instruction Argument
1749 [] SETUP_EXCEPT L1
1750 [] <code for S>
1751 [] POP_BLOCK
1752 [] JUMP_FORWARD L0
1753
1754 [tb, val, exc] L1: DUP )
1755 [tb, val, exc, exc] <evaluate E1> )
1756 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
1757 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
1758 [tb, val, exc, 1] POP )
1759 [tb, val, exc] POP
1760 [tb, val] <assign to V1> (or POP if no V1)
1761 [tb] POP
1762 [] <code for S1>
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001763 JUMP_FORWARD L0
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001764
1765 [tb, val, exc, 0] L2: POP
1766 [tb, val, exc] DUP
1767 .............................etc.......................
1768
1769 [tb, val, exc, 0] Ln+1: POP
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001770 [tb, val, exc] END_FINALLY # re-raise exception
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001771
1772 [] L0: <next statement>
1773
1774 Of course, parts are not generated if Vi or Ei is not present.
1775*/
1776static int
1777compiler_try_except(struct compiler *c, stmt_ty s)
1778{
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001779 basicblock *body, *orelse, *except, *end;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001780 int i, n;
1781
1782 body = compiler_new_block(c);
1783 except = compiler_new_block(c);
1784 orelse = compiler_new_block(c);
1785 end = compiler_new_block(c);
1786 if (body == NULL || except == NULL || orelse == NULL || end == NULL)
1787 return 0;
1788 ADDOP_JREL(c, SETUP_EXCEPT, except);
1789 compiler_use_next_block(c, body);
1790 if (!compiler_push_fblock(c, EXCEPT, body))
1791 return 0;
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001792 VISIT_SEQ(c, stmt, s->v.TryExcept.body);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001793 ADDOP(c, POP_BLOCK);
1794 compiler_pop_fblock(c, EXCEPT, body);
1795 ADDOP_JREL(c, JUMP_FORWARD, orelse);
1796 n = asdl_seq_LEN(s->v.TryExcept.handlers);
1797 compiler_use_next_block(c, except);
1798 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00001799 excepthandler_ty handler = (excepthandler_ty)asdl_seq_GET(
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001800 s->v.TryExcept.handlers, i);
1801 if (!handler->type && i < n-1)
1802 return compiler_error(c, "default 'except:' must be last");
Jeremy Hylton819de6c2007-02-27 16:13:23 +00001803 c->u->u_lineno_set = false;
1804 c->u->u_lineno = handler->lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001805 except = compiler_new_block(c);
1806 if (except == NULL)
1807 return 0;
1808 if (handler->type) {
1809 ADDOP(c, DUP_TOP);
1810 VISIT(c, expr, handler->type);
1811 ADDOP_I(c, COMPARE_OP, PyCmp_EXC_MATCH);
1812 ADDOP_JREL(c, JUMP_IF_FALSE, except);
1813 ADDOP(c, POP_TOP);
1814 }
1815 ADDOP(c, POP_TOP);
1816 if (handler->name) {
1817 VISIT(c, expr, handler->name);
1818 }
1819 else {
1820 ADDOP(c, POP_TOP);
1821 }
1822 ADDOP(c, POP_TOP);
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001823 VISIT_SEQ(c, stmt, handler->body);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001824 ADDOP_JREL(c, JUMP_FORWARD, end);
1825 compiler_use_next_block(c, except);
1826 if (handler->type)
1827 ADDOP(c, POP_TOP);
1828 }
1829 ADDOP(c, END_FINALLY);
1830 compiler_use_next_block(c, orelse);
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001831 VISIT_SEQ(c, stmt, s->v.TryExcept.orelse);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001832 compiler_use_next_block(c, end);
1833 return 1;
1834}
1835
1836static int
1837compiler_import_as(struct compiler *c, identifier name, identifier asname)
1838{
1839 /* The IMPORT_NAME opcode was already generated. This function
1840 merely needs to bind the result to a name.
1841
1842 If there is a dot in name, we need to split it and emit a
1843 LOAD_ATTR for each name.
1844 */
1845 const char *src = PyString_AS_STRING(name);
1846 const char *dot = strchr(src, '.');
1847 if (dot) {
1848 /* Consume the base module name to get the first attribute */
1849 src = dot + 1;
1850 while (dot) {
1851 /* NB src is only defined when dot != NULL */
Armin Rigo31441302005-10-21 12:57:31 +00001852 PyObject *attr;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001853 dot = strchr(src, '.');
Armin Rigo31441302005-10-21 12:57:31 +00001854 attr = PyString_FromStringAndSize(src,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001855 dot ? dot - src : strlen(src));
Neal Norwitz7bcabc62005-11-20 23:58:38 +00001856 if (!attr)
1857 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001858 ADDOP_O(c, LOAD_ATTR, attr, names);
Neal Norwitz7bcabc62005-11-20 23:58:38 +00001859 Py_DECREF(attr);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001860 src = dot + 1;
1861 }
1862 }
1863 return compiler_nameop(c, asname, Store);
1864}
1865
1866static int
1867compiler_import(struct compiler *c, stmt_ty s)
1868{
1869 /* The Import node stores a module name like a.b.c as a single
1870 string. This is convenient for all cases except
1871 import a.b.c as d
1872 where we need to parse that string to extract the individual
1873 module names.
1874 XXX Perhaps change the representation to make this case simpler?
1875 */
1876 int i, n = asdl_seq_LEN(s->v.Import.names);
Thomas Woutersf7f438b2006-02-28 16:09:29 +00001877
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001878 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00001879 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.Import.names, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001880 int r;
Thomas Woutersf7f438b2006-02-28 16:09:29 +00001881 PyObject *level;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001882
Neal Norwitzcbce2802006-04-03 06:26:32 +00001883 if (c->c_flags && (c->c_flags->cf_flags & CO_FUTURE_ABSOLUTE_IMPORT))
Thomas Woutersf7f438b2006-02-28 16:09:29 +00001884 level = PyInt_FromLong(0);
1885 else
1886 level = PyInt_FromLong(-1);
1887
1888 if (level == NULL)
1889 return 0;
1890
1891 ADDOP_O(c, LOAD_CONST, level, consts);
1892 Py_DECREF(level);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001893 ADDOP_O(c, LOAD_CONST, Py_None, consts);
1894 ADDOP_NAME(c, IMPORT_NAME, alias->name, names);
1895
1896 if (alias->asname) {
Neil Schemenauerac699ef2005-10-23 03:45:42 +00001897 r = compiler_import_as(c, alias->name, alias->asname);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001898 if (!r)
1899 return r;
1900 }
1901 else {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001902 identifier tmp = alias->name;
1903 const char *base = PyString_AS_STRING(alias->name);
1904 char *dot = strchr(base, '.');
1905 if (dot)
1906 tmp = PyString_FromStringAndSize(base,
1907 dot - base);
1908 r = compiler_nameop(c, tmp, Store);
1909 if (dot) {
1910 Py_DECREF(tmp);
1911 }
1912 if (!r)
1913 return r;
1914 }
1915 }
1916 return 1;
1917}
1918
1919static int
1920compiler_from_import(struct compiler *c, stmt_ty s)
1921{
1922 int i, n = asdl_seq_LEN(s->v.ImportFrom.names);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001923
1924 PyObject *names = PyTuple_New(n);
Thomas Woutersf7f438b2006-02-28 16:09:29 +00001925 PyObject *level;
1926
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001927 if (!names)
1928 return 0;
1929
Thomas Woutersf7f438b2006-02-28 16:09:29 +00001930 if (s->v.ImportFrom.level == 0 && c->c_flags &&
Neal Norwitzcbce2802006-04-03 06:26:32 +00001931 !(c->c_flags->cf_flags & CO_FUTURE_ABSOLUTE_IMPORT))
Thomas Woutersf7f438b2006-02-28 16:09:29 +00001932 level = PyInt_FromLong(-1);
1933 else
1934 level = PyInt_FromLong(s->v.ImportFrom.level);
1935
1936 if (!level) {
1937 Py_DECREF(names);
1938 return 0;
1939 }
1940
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001941 /* build up the names */
1942 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00001943 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001944 Py_INCREF(alias->name);
1945 PyTuple_SET_ITEM(names, i, alias->name);
1946 }
1947
1948 if (s->lineno > c->c_future->ff_lineno) {
1949 if (!strcmp(PyString_AS_STRING(s->v.ImportFrom.module),
1950 "__future__")) {
Neal Norwitzd9cf85f2006-03-02 08:08:42 +00001951 Py_DECREF(level);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001952 Py_DECREF(names);
1953 return compiler_error(c,
1954 "from __future__ imports must occur "
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001955 "at the beginning of the file");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001956
1957 }
1958 }
1959
Thomas Woutersf7f438b2006-02-28 16:09:29 +00001960 ADDOP_O(c, LOAD_CONST, level, consts);
1961 Py_DECREF(level);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001962 ADDOP_O(c, LOAD_CONST, names, consts);
Neal Norwitz3715c3e2005-11-24 22:09:18 +00001963 Py_DECREF(names);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001964 ADDOP_NAME(c, IMPORT_NAME, s->v.ImportFrom.module, names);
1965 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00001966 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001967 identifier store_name;
1968
1969 if (i == 0 && *PyString_AS_STRING(alias->name) == '*') {
1970 assert(n == 1);
1971 ADDOP(c, IMPORT_STAR);
Neal Norwitz28b32ac2005-12-06 07:41:30 +00001972 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001973 }
1974
1975 ADDOP_NAME(c, IMPORT_FROM, alias->name, names);
1976 store_name = alias->name;
1977 if (alias->asname)
1978 store_name = alias->asname;
1979
1980 if (!compiler_nameop(c, store_name, Store)) {
1981 Py_DECREF(names);
1982 return 0;
1983 }
1984 }
Neal Norwitz28b32ac2005-12-06 07:41:30 +00001985 /* remove imported module */
1986 ADDOP(c, POP_TOP);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001987 return 1;
1988}
1989
1990static int
1991compiler_assert(struct compiler *c, stmt_ty s)
1992{
1993 static PyObject *assertion_error = NULL;
1994 basicblock *end;
1995
1996 if (Py_OptimizeFlag)
1997 return 1;
1998 if (assertion_error == NULL) {
1999 assertion_error = PyString_FromString("AssertionError");
2000 if (assertion_error == NULL)
2001 return 0;
2002 }
2003 VISIT(c, expr, s->v.Assert.test);
2004 end = compiler_new_block(c);
2005 if (end == NULL)
2006 return 0;
2007 ADDOP_JREL(c, JUMP_IF_TRUE, end);
2008 ADDOP(c, POP_TOP);
2009 ADDOP_O(c, LOAD_GLOBAL, assertion_error, names);
2010 if (s->v.Assert.msg) {
2011 VISIT(c, expr, s->v.Assert.msg);
2012 ADDOP_I(c, RAISE_VARARGS, 2);
2013 }
2014 else {
2015 ADDOP_I(c, RAISE_VARARGS, 1);
2016 }
Neal Norwitz51abbc72005-12-18 07:06:23 +00002017 compiler_use_next_block(c, end);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002018 ADDOP(c, POP_TOP);
2019 return 1;
2020}
2021
2022static int
2023compiler_visit_stmt(struct compiler *c, stmt_ty s)
2024{
2025 int i, n;
2026
Neal Norwitzf733a012006-10-29 18:30:10 +00002027 /* Always assign a lineno to the next instruction for a stmt. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002028 c->u->u_lineno = s->lineno;
2029 c->u->u_lineno_set = false;
Jeremy Hylton12603c42006-04-01 16:18:02 +00002030
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002031 switch (s->kind) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002032 case FunctionDef_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002033 return compiler_function(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002034 case ClassDef_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002035 return compiler_class(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002036 case Return_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002037 if (c->u->u_ste->ste_type != FunctionBlock)
2038 return compiler_error(c, "'return' outside function");
2039 if (s->v.Return.value) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002040 VISIT(c, expr, s->v.Return.value);
2041 }
2042 else
2043 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2044 ADDOP(c, RETURN_VALUE);
2045 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002046 case Delete_kind:
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002047 VISIT_SEQ(c, expr, s->v.Delete.targets)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002048 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002049 case Assign_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002050 n = asdl_seq_LEN(s->v.Assign.targets);
2051 VISIT(c, expr, s->v.Assign.value);
2052 for (i = 0; i < n; i++) {
2053 if (i < n - 1)
2054 ADDOP(c, DUP_TOP);
2055 VISIT(c, expr,
2056 (expr_ty)asdl_seq_GET(s->v.Assign.targets, i));
2057 }
2058 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002059 case AugAssign_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002060 return compiler_augassign(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002061 case Print_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002062 return compiler_print(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002063 case For_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002064 return compiler_for(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002065 case While_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002066 return compiler_while(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002067 case If_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002068 return compiler_if(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002069 case Raise_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002070 n = 0;
2071 if (s->v.Raise.type) {
2072 VISIT(c, expr, s->v.Raise.type);
2073 n++;
2074 if (s->v.Raise.inst) {
2075 VISIT(c, expr, s->v.Raise.inst);
2076 n++;
2077 if (s->v.Raise.tback) {
2078 VISIT(c, expr, s->v.Raise.tback);
2079 n++;
2080 }
2081 }
2082 }
2083 ADDOP_I(c, RAISE_VARARGS, n);
2084 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002085 case TryExcept_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002086 return compiler_try_except(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002087 case TryFinally_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002088 return compiler_try_finally(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002089 case Assert_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002090 return compiler_assert(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002091 case Import_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002092 return compiler_import(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002093 case ImportFrom_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002094 return compiler_from_import(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002095 case Exec_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002096 VISIT(c, expr, s->v.Exec.body);
2097 if (s->v.Exec.globals) {
2098 VISIT(c, expr, s->v.Exec.globals);
2099 if (s->v.Exec.locals) {
2100 VISIT(c, expr, s->v.Exec.locals);
2101 } else {
2102 ADDOP(c, DUP_TOP);
2103 }
2104 } else {
2105 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2106 ADDOP(c, DUP_TOP);
2107 }
2108 ADDOP(c, EXEC_STMT);
2109 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002110 case Global_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002111 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002112 case Expr_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002113 if (c->c_interactive && c->c_nestlevel <= 1) {
Neal Norwitz0cbd8052006-08-04 05:09:28 +00002114 VISIT(c, expr, s->v.Expr.value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002115 ADDOP(c, PRINT_EXPR);
2116 }
Neal Norwitz0cbd8052006-08-04 05:09:28 +00002117 else if (s->v.Expr.value->kind != Str_kind &&
2118 s->v.Expr.value->kind != Num_kind) {
2119 VISIT(c, expr, s->v.Expr.value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002120 ADDOP(c, POP_TOP);
2121 }
2122 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002123 case Pass_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002124 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002125 case Break_kind:
Jeremy Hylton819de6c2007-02-27 16:13:23 +00002126 if (!compiler_in_loop(c))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002127 return compiler_error(c, "'break' outside loop");
2128 ADDOP(c, BREAK_LOOP);
2129 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002130 case Continue_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002131 return compiler_continue(c);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002132 case With_kind:
2133 return compiler_with(c, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002134 }
2135 return 1;
2136}
2137
2138static int
2139unaryop(unaryop_ty op)
2140{
2141 switch (op) {
2142 case Invert:
2143 return UNARY_INVERT;
2144 case Not:
2145 return UNARY_NOT;
2146 case UAdd:
2147 return UNARY_POSITIVE;
2148 case USub:
2149 return UNARY_NEGATIVE;
2150 }
2151 return 0;
2152}
2153
2154static int
2155binop(struct compiler *c, operator_ty op)
2156{
2157 switch (op) {
2158 case Add:
2159 return BINARY_ADD;
2160 case Sub:
2161 return BINARY_SUBTRACT;
2162 case Mult:
2163 return BINARY_MULTIPLY;
2164 case Div:
2165 if (c->c_flags && c->c_flags->cf_flags & CO_FUTURE_DIVISION)
2166 return BINARY_TRUE_DIVIDE;
2167 else
2168 return BINARY_DIVIDE;
2169 case Mod:
2170 return BINARY_MODULO;
2171 case Pow:
2172 return BINARY_POWER;
2173 case LShift:
2174 return BINARY_LSHIFT;
2175 case RShift:
2176 return BINARY_RSHIFT;
2177 case BitOr:
2178 return BINARY_OR;
2179 case BitXor:
2180 return BINARY_XOR;
2181 case BitAnd:
2182 return BINARY_AND;
2183 case FloorDiv:
2184 return BINARY_FLOOR_DIVIDE;
2185 }
2186 return 0;
2187}
2188
2189static int
2190cmpop(cmpop_ty op)
2191{
2192 switch (op) {
2193 case Eq:
2194 return PyCmp_EQ;
2195 case NotEq:
2196 return PyCmp_NE;
2197 case Lt:
2198 return PyCmp_LT;
2199 case LtE:
2200 return PyCmp_LE;
2201 case Gt:
2202 return PyCmp_GT;
2203 case GtE:
2204 return PyCmp_GE;
2205 case Is:
2206 return PyCmp_IS;
2207 case IsNot:
2208 return PyCmp_IS_NOT;
2209 case In:
2210 return PyCmp_IN;
2211 case NotIn:
2212 return PyCmp_NOT_IN;
2213 }
2214 return PyCmp_BAD;
2215}
2216
2217static int
2218inplace_binop(struct compiler *c, operator_ty op)
2219{
2220 switch (op) {
2221 case Add:
2222 return INPLACE_ADD;
2223 case Sub:
2224 return INPLACE_SUBTRACT;
2225 case Mult:
2226 return INPLACE_MULTIPLY;
2227 case Div:
2228 if (c->c_flags && c->c_flags->cf_flags & CO_FUTURE_DIVISION)
2229 return INPLACE_TRUE_DIVIDE;
2230 else
2231 return INPLACE_DIVIDE;
2232 case Mod:
2233 return INPLACE_MODULO;
2234 case Pow:
2235 return INPLACE_POWER;
2236 case LShift:
2237 return INPLACE_LSHIFT;
2238 case RShift:
2239 return INPLACE_RSHIFT;
2240 case BitOr:
2241 return INPLACE_OR;
2242 case BitXor:
2243 return INPLACE_XOR;
2244 case BitAnd:
2245 return INPLACE_AND;
2246 case FloorDiv:
2247 return INPLACE_FLOOR_DIVIDE;
2248 }
Neal Norwitz4737b232005-11-19 23:58:29 +00002249 PyErr_Format(PyExc_SystemError,
Neal Norwitz4e6bf492005-12-18 05:32:41 +00002250 "inplace binary op %d should not be possible", op);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002251 return 0;
2252}
2253
2254static int
2255compiler_nameop(struct compiler *c, identifier name, expr_context_ty ctx)
2256{
Neil Schemenauerdad06a12005-10-23 18:52:36 +00002257 int op, scope, arg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002258 enum { OP_FAST, OP_GLOBAL, OP_DEREF, OP_NAME } optype;
2259
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002260 PyObject *dict = c->u->u_names;
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002261 PyObject *mangled;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002262 /* XXX AugStore isn't used anywhere! */
2263
2264 /* First check for assignment to __debug__. Param? */
2265 if ((ctx == Store || ctx == AugStore || ctx == Del)
2266 && !strcmp(PyString_AS_STRING(name), "__debug__")) {
2267 return compiler_error(c, "can not assign to __debug__");
2268 }
2269
Jeremy Hylton37075c52007-02-27 01:01:59 +00002270mangled = _Py_Mangle(c->u->u_private, name);
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002271 if (!mangled)
2272 return 0;
2273
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002274 op = 0;
2275 optype = OP_NAME;
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002276 scope = PyST_GetScope(c->u->u_ste, mangled);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002277 switch (scope) {
2278 case FREE:
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002279 dict = c->u->u_freevars;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002280 optype = OP_DEREF;
2281 break;
2282 case CELL:
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002283 dict = c->u->u_cellvars;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002284 optype = OP_DEREF;
2285 break;
2286 case LOCAL:
2287 if (c->u->u_ste->ste_type == FunctionBlock)
2288 optype = OP_FAST;
2289 break;
2290 case GLOBAL_IMPLICIT:
Neil Schemenauerd403c452005-10-23 04:24:49 +00002291 if (c->u->u_ste->ste_type == FunctionBlock &&
2292 !c->u->u_ste->ste_unoptimized)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002293 optype = OP_GLOBAL;
2294 break;
2295 case GLOBAL_EXPLICIT:
2296 optype = OP_GLOBAL;
2297 break;
Neal Norwitz4e6bf492005-12-18 05:32:41 +00002298 default:
2299 /* scope can be 0 */
2300 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002301 }
2302
2303 /* XXX Leave assert here, but handle __doc__ and the like better */
2304 assert(scope || PyString_AS_STRING(name)[0] == '_');
2305
2306 switch (optype) {
2307 case OP_DEREF:
2308 switch (ctx) {
2309 case Load: op = LOAD_DEREF; break;
2310 case Store: op = STORE_DEREF; break;
2311 case AugLoad:
2312 case AugStore:
2313 break;
2314 case Del:
2315 PyErr_Format(PyExc_SyntaxError,
2316 "can not delete variable '%s' referenced "
2317 "in nested scope",
2318 PyString_AS_STRING(name));
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002319 Py_DECREF(mangled);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002320 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002321 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00002322 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00002323 PyErr_SetString(PyExc_SystemError,
2324 "param invalid for deref variable");
2325 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002326 }
2327 break;
2328 case OP_FAST:
2329 switch (ctx) {
2330 case Load: op = LOAD_FAST; break;
2331 case Store: op = STORE_FAST; break;
2332 case Del: op = DELETE_FAST; break;
2333 case AugLoad:
2334 case AugStore:
2335 break;
2336 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00002337 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00002338 PyErr_SetString(PyExc_SystemError,
2339 "param invalid for local variable");
2340 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002341 }
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002342 ADDOP_O(c, op, mangled, varnames);
2343 Py_DECREF(mangled);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002344 return 1;
2345 case OP_GLOBAL:
2346 switch (ctx) {
2347 case Load: op = LOAD_GLOBAL; break;
2348 case Store: op = STORE_GLOBAL; break;
2349 case Del: op = DELETE_GLOBAL; break;
2350 case AugLoad:
2351 case AugStore:
2352 break;
2353 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00002354 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00002355 PyErr_SetString(PyExc_SystemError,
2356 "param invalid for global variable");
2357 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002358 }
2359 break;
2360 case OP_NAME:
2361 switch (ctx) {
2362 case Load: op = LOAD_NAME; break;
2363 case Store: op = STORE_NAME; break;
2364 case Del: op = DELETE_NAME; break;
2365 case AugLoad:
2366 case AugStore:
2367 break;
2368 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00002369 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00002370 PyErr_SetString(PyExc_SystemError,
2371 "param invalid for name variable");
2372 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002373 }
2374 break;
2375 }
2376
2377 assert(op);
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002378 arg = compiler_add_o(c, dict, mangled);
Neal Norwitz4737b232005-11-19 23:58:29 +00002379 Py_DECREF(mangled);
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002380 if (arg < 0)
2381 return 0;
Neil Schemenauerdad06a12005-10-23 18:52:36 +00002382 return compiler_addop_i(c, op, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002383}
2384
2385static int
2386compiler_boolop(struct compiler *c, expr_ty e)
2387{
2388 basicblock *end;
2389 int jumpi, i, n;
2390 asdl_seq *s;
2391
2392 assert(e->kind == BoolOp_kind);
2393 if (e->v.BoolOp.op == And)
2394 jumpi = JUMP_IF_FALSE;
2395 else
2396 jumpi = JUMP_IF_TRUE;
2397 end = compiler_new_block(c);
Martin v. Löwis94962612006-01-02 21:15:05 +00002398 if (end == NULL)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002399 return 0;
2400 s = e->v.BoolOp.values;
2401 n = asdl_seq_LEN(s) - 1;
Neal Norwitzc173b482006-07-30 19:18:13 +00002402 assert(n >= 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002403 for (i = 0; i < n; ++i) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00002404 VISIT(c, expr, (expr_ty)asdl_seq_GET(s, i));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002405 ADDOP_JREL(c, jumpi, end);
2406 ADDOP(c, POP_TOP)
2407 }
Anthony Baxter7b782b62006-04-11 12:01:56 +00002408 VISIT(c, expr, (expr_ty)asdl_seq_GET(s, n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002409 compiler_use_next_block(c, end);
2410 return 1;
2411}
2412
2413static int
2414compiler_list(struct compiler *c, expr_ty e)
2415{
2416 int n = asdl_seq_LEN(e->v.List.elts);
2417 if (e->v.List.ctx == Store) {
2418 ADDOP_I(c, UNPACK_SEQUENCE, n);
2419 }
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002420 VISIT_SEQ(c, expr, e->v.List.elts);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002421 if (e->v.List.ctx == Load) {
2422 ADDOP_I(c, BUILD_LIST, n);
2423 }
2424 return 1;
2425}
2426
2427static int
2428compiler_tuple(struct compiler *c, expr_ty e)
2429{
2430 int n = asdl_seq_LEN(e->v.Tuple.elts);
2431 if (e->v.Tuple.ctx == Store) {
2432 ADDOP_I(c, UNPACK_SEQUENCE, n);
2433 }
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002434 VISIT_SEQ(c, expr, e->v.Tuple.elts);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002435 if (e->v.Tuple.ctx == Load) {
2436 ADDOP_I(c, BUILD_TUPLE, n);
2437 }
2438 return 1;
2439}
2440
2441static int
2442compiler_compare(struct compiler *c, expr_ty e)
2443{
2444 int i, n;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002445 basicblock *cleanup = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002446
2447 /* XXX the logic can be cleaned up for 1 or multiple comparisons */
2448 VISIT(c, expr, e->v.Compare.left);
2449 n = asdl_seq_LEN(e->v.Compare.ops);
2450 assert(n > 0);
2451 if (n > 1) {
2452 cleanup = compiler_new_block(c);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002453 if (cleanup == NULL)
2454 return 0;
Anthony Baxter7b782b62006-04-11 12:01:56 +00002455 VISIT(c, expr,
Jeremy Hylton819de6c2007-02-27 16:13:23 +00002456 (expr_ty)asdl_seq_GET(e->v.Compare.comparators, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002457 }
2458 for (i = 1; i < n; i++) {
2459 ADDOP(c, DUP_TOP);
2460 ADDOP(c, ROT_THREE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002461 ADDOP_I(c, COMPARE_OP,
Martin v. Löwis0cc56e52006-04-13 12:29:43 +00002462 cmpop((cmpop_ty)(asdl_seq_GET(
Jeremy Hylton819de6c2007-02-27 16:13:23 +00002463 e->v.Compare.ops, i - 1))));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002464 ADDOP_JREL(c, JUMP_IF_FALSE, cleanup);
2465 NEXT_BLOCK(c);
2466 ADDOP(c, POP_TOP);
2467 if (i < (n - 1))
Anthony Baxter7b782b62006-04-11 12:01:56 +00002468 VISIT(c, expr,
Jeremy Hylton819de6c2007-02-27 16:13:23 +00002469 (expr_ty)asdl_seq_GET(e->v.Compare.comparators, i));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002470 }
Anthony Baxter7b782b62006-04-11 12:01:56 +00002471 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, n - 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002472 ADDOP_I(c, COMPARE_OP,
Martin v. Löwis0cc56e52006-04-13 12:29:43 +00002473 cmpop((cmpop_ty)(asdl_seq_GET(e->v.Compare.ops, n - 1))));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002474 if (n > 1) {
2475 basicblock *end = compiler_new_block(c);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002476 if (end == NULL)
2477 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002478 ADDOP_JREL(c, JUMP_FORWARD, end);
2479 compiler_use_next_block(c, cleanup);
2480 ADDOP(c, ROT_TWO);
2481 ADDOP(c, POP_TOP);
2482 compiler_use_next_block(c, end);
2483 }
2484 return 1;
2485}
2486
2487static int
2488compiler_call(struct compiler *c, expr_ty e)
2489{
2490 int n, code = 0;
2491
2492 VISIT(c, expr, e->v.Call.func);
2493 n = asdl_seq_LEN(e->v.Call.args);
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002494 VISIT_SEQ(c, expr, e->v.Call.args);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002495 if (e->v.Call.keywords) {
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002496 VISIT_SEQ(c, keyword, e->v.Call.keywords);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002497 n |= asdl_seq_LEN(e->v.Call.keywords) << 8;
2498 }
2499 if (e->v.Call.starargs) {
2500 VISIT(c, expr, e->v.Call.starargs);
2501 code |= 1;
2502 }
2503 if (e->v.Call.kwargs) {
2504 VISIT(c, expr, e->v.Call.kwargs);
2505 code |= 2;
2506 }
2507 switch (code) {
2508 case 0:
2509 ADDOP_I(c, CALL_FUNCTION, n);
2510 break;
2511 case 1:
2512 ADDOP_I(c, CALL_FUNCTION_VAR, n);
2513 break;
2514 case 2:
2515 ADDOP_I(c, CALL_FUNCTION_KW, n);
2516 break;
2517 case 3:
2518 ADDOP_I(c, CALL_FUNCTION_VAR_KW, n);
2519 break;
2520 }
2521 return 1;
2522}
2523
2524static int
2525compiler_listcomp_generator(struct compiler *c, PyObject *tmpname,
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002526 asdl_seq *generators, int gen_index,
2527 expr_ty elt)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002528{
2529 /* generate code for the iterator, then each of the ifs,
2530 and then write to the element */
2531
2532 comprehension_ty l;
2533 basicblock *start, *anchor, *skip, *if_cleanup;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002534 int i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002535
2536 start = compiler_new_block(c);
2537 skip = compiler_new_block(c);
2538 if_cleanup = compiler_new_block(c);
2539 anchor = compiler_new_block(c);
2540
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002541 if (start == NULL || skip == NULL || if_cleanup == NULL ||
2542 anchor == NULL)
2543 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002544
Anthony Baxter7b782b62006-04-11 12:01:56 +00002545 l = (comprehension_ty)asdl_seq_GET(generators, gen_index);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002546 VISIT(c, expr, l->iter);
2547 ADDOP(c, GET_ITER);
2548 compiler_use_next_block(c, start);
2549 ADDOP_JREL(c, FOR_ITER, anchor);
2550 NEXT_BLOCK(c);
2551 VISIT(c, expr, l->target);
2552
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002553 /* XXX this needs to be cleaned up...a lot! */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002554 n = asdl_seq_LEN(l->ifs);
2555 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00002556 expr_ty e = (expr_ty)asdl_seq_GET(l->ifs, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002557 VISIT(c, expr, e);
2558 ADDOP_JREL(c, JUMP_IF_FALSE, if_cleanup);
2559 NEXT_BLOCK(c);
2560 ADDOP(c, POP_TOP);
2561 }
2562
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002563 if (++gen_index < asdl_seq_LEN(generators))
2564 if (!compiler_listcomp_generator(c, tmpname,
2565 generators, gen_index, elt))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002566 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002567
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002568 /* only append after the last for generator */
2569 if (gen_index >= asdl_seq_LEN(generators)) {
2570 if (!compiler_nameop(c, tmpname, Load))
2571 return 0;
2572 VISIT(c, expr, elt);
Neal Norwitz10be2ea2006-03-03 20:29:11 +00002573 ADDOP(c, LIST_APPEND);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002574
2575 compiler_use_next_block(c, skip);
2576 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002577 for (i = 0; i < n; i++) {
2578 ADDOP_I(c, JUMP_FORWARD, 1);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002579 if (i == 0)
2580 compiler_use_next_block(c, if_cleanup);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002581 ADDOP(c, POP_TOP);
2582 }
2583 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
2584 compiler_use_next_block(c, anchor);
Georg Brandl2c4fb8d2006-10-29 08:47:08 +00002585 /* delete the temporary list name added to locals */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002586 if (gen_index == 1)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002587 if (!compiler_nameop(c, tmpname, Del))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002588 return 0;
2589
2590 return 1;
2591}
2592
2593static int
2594compiler_listcomp(struct compiler *c, expr_ty e)
2595{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002596 identifier tmp;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002597 int rc = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002598 asdl_seq *generators = e->v.ListComp.generators;
2599
2600 assert(e->kind == ListComp_kind);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002601 tmp = compiler_new_tmpname(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002602 if (!tmp)
2603 return 0;
2604 ADDOP_I(c, BUILD_LIST, 0);
2605 ADDOP(c, DUP_TOP);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002606 if (compiler_nameop(c, tmp, Store))
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002607 rc = compiler_listcomp_generator(c, tmp, generators, 0,
2608 e->v.ListComp.elt);
2609 Py_DECREF(tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002610 return rc;
2611}
2612
2613static int
2614compiler_genexp_generator(struct compiler *c,
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002615 asdl_seq *generators, int gen_index,
2616 expr_ty elt)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002617{
2618 /* generate code for the iterator, then each of the ifs,
2619 and then write to the element */
2620
2621 comprehension_ty ge;
2622 basicblock *start, *anchor, *skip, *if_cleanup, *end;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002623 int i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002624
2625 start = compiler_new_block(c);
2626 skip = compiler_new_block(c);
2627 if_cleanup = compiler_new_block(c);
2628 anchor = compiler_new_block(c);
2629 end = compiler_new_block(c);
2630
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002631 if (start == NULL || skip == NULL || if_cleanup == NULL ||
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002632 anchor == NULL || end == NULL)
2633 return 0;
2634
Anthony Baxter7b782b62006-04-11 12:01:56 +00002635 ge = (comprehension_ty)asdl_seq_GET(generators, gen_index);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002636 ADDOP_JREL(c, SETUP_LOOP, end);
2637 if (!compiler_push_fblock(c, LOOP, start))
2638 return 0;
2639
2640 if (gen_index == 0) {
2641 /* Receive outermost iter as an implicit argument */
2642 c->u->u_argcount = 1;
2643 ADDOP_I(c, LOAD_FAST, 0);
2644 }
2645 else {
2646 /* Sub-iter - calculate on the fly */
2647 VISIT(c, expr, ge->iter);
2648 ADDOP(c, GET_ITER);
2649 }
2650 compiler_use_next_block(c, start);
2651 ADDOP_JREL(c, FOR_ITER, anchor);
2652 NEXT_BLOCK(c);
2653 VISIT(c, expr, ge->target);
2654
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002655 /* XXX this needs to be cleaned up...a lot! */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002656 n = asdl_seq_LEN(ge->ifs);
2657 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00002658 expr_ty e = (expr_ty)asdl_seq_GET(ge->ifs, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002659 VISIT(c, expr, e);
2660 ADDOP_JREL(c, JUMP_IF_FALSE, if_cleanup);
2661 NEXT_BLOCK(c);
2662 ADDOP(c, POP_TOP);
2663 }
2664
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002665 if (++gen_index < asdl_seq_LEN(generators))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002666 if (!compiler_genexp_generator(c, generators, gen_index, elt))
2667 return 0;
2668
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002669 /* only append after the last 'for' generator */
2670 if (gen_index >= asdl_seq_LEN(generators)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002671 VISIT(c, expr, elt);
2672 ADDOP(c, YIELD_VALUE);
2673 ADDOP(c, POP_TOP);
2674
2675 compiler_use_next_block(c, skip);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002676 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002677 for (i = 0; i < n; i++) {
2678 ADDOP_I(c, JUMP_FORWARD, 1);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002679 if (i == 0)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002680 compiler_use_next_block(c, if_cleanup);
2681
2682 ADDOP(c, POP_TOP);
2683 }
2684 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
2685 compiler_use_next_block(c, anchor);
2686 ADDOP(c, POP_BLOCK);
2687 compiler_pop_fblock(c, LOOP, start);
2688 compiler_use_next_block(c, end);
2689
2690 return 1;
2691}
2692
2693static int
2694compiler_genexp(struct compiler *c, expr_ty e)
2695{
Nick Coghlan944d3eb2005-11-16 12:46:55 +00002696 static identifier name;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002697 PyCodeObject *co;
2698 expr_ty outermost_iter = ((comprehension_ty)
2699 (asdl_seq_GET(e->v.GeneratorExp.generators,
2700 0)))->iter;
2701
Nick Coghlan944d3eb2005-11-16 12:46:55 +00002702 if (!name) {
2703 name = PyString_FromString("<genexpr>");
2704 if (!name)
2705 return 0;
2706 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002707
2708 if (!compiler_enter_scope(c, name, (void *)e, e->lineno))
2709 return 0;
2710 compiler_genexp_generator(c, e->v.GeneratorExp.generators, 0,
2711 e->v.GeneratorExp.elt);
2712 co = assemble(c, 1);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00002713 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002714 if (co == NULL)
2715 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002716
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002717 compiler_make_closure(c, co, 0);
Neal Norwitz4737b232005-11-19 23:58:29 +00002718 Py_DECREF(co);
2719
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002720 VISIT(c, expr, outermost_iter);
2721 ADDOP(c, GET_ITER);
2722 ADDOP_I(c, CALL_FUNCTION, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002723
2724 return 1;
2725}
2726
2727static int
2728compiler_visit_keyword(struct compiler *c, keyword_ty k)
2729{
2730 ADDOP_O(c, LOAD_CONST, k->arg, consts);
2731 VISIT(c, expr, k->value);
2732 return 1;
2733}
2734
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002735/* Test whether expression is constant. For constants, report
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002736 whether they are true or false.
2737
2738 Return values: 1 for true, 0 for false, -1 for non-constant.
2739 */
2740
2741static int
2742expr_constant(expr_ty e)
2743{
2744 switch (e->kind) {
2745 case Num_kind:
2746 return PyObject_IsTrue(e->v.Num.n);
2747 case Str_kind:
2748 return PyObject_IsTrue(e->v.Str.s);
Georg Brandlddbaa662006-06-04 21:56:52 +00002749 case Name_kind:
2750 /* __debug__ is not assignable, so we can optimize
2751 * it away in if and while statements */
2752 if (strcmp(PyString_AS_STRING(e->v.Name.id),
Jeremy Hylton819de6c2007-02-27 16:13:23 +00002753 "__debug__") == 0)
Georg Brandlddbaa662006-06-04 21:56:52 +00002754 return ! Py_OptimizeFlag;
2755 /* fall through */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002756 default:
2757 return -1;
2758 }
2759}
2760
Guido van Rossumc2e20742006-02-27 22:32:47 +00002761/*
2762 Implements the with statement from PEP 343.
2763
2764 The semantics outlined in that PEP are as follows:
2765
2766 with EXPR as VAR:
2767 BLOCK
2768
2769 It is implemented roughly as:
2770
Guido van Rossumda5b7012006-05-02 19:47:52 +00002771 context = EXPR
Guido van Rossumc2e20742006-02-27 22:32:47 +00002772 exit = context.__exit__ # not calling it
2773 value = context.__enter__()
2774 try:
2775 VAR = value # if VAR present in the syntax
2776 BLOCK
2777 finally:
2778 if an exception was raised:
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002779 exc = copy of (exception, instance, traceback)
Guido van Rossumc2e20742006-02-27 22:32:47 +00002780 else:
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002781 exc = (None, None, None)
Guido van Rossumc2e20742006-02-27 22:32:47 +00002782 exit(*exc)
2783 */
2784static int
2785compiler_with(struct compiler *c, stmt_ty s)
2786{
Guido van Rossumda5b7012006-05-02 19:47:52 +00002787 static identifier enter_attr, exit_attr;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002788 basicblock *block, *finally;
2789 identifier tmpexit, tmpvalue = NULL;
2790
2791 assert(s->kind == With_kind);
2792
Guido van Rossumc2e20742006-02-27 22:32:47 +00002793 if (!enter_attr) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002794 enter_attr = PyString_InternFromString("__enter__");
2795 if (!enter_attr)
2796 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002797 }
2798 if (!exit_attr) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002799 exit_attr = PyString_InternFromString("__exit__");
2800 if (!exit_attr)
2801 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002802 }
2803
2804 block = compiler_new_block(c);
2805 finally = compiler_new_block(c);
2806 if (!block || !finally)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002807 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002808
2809 /* Create a temporary variable to hold context.__exit__ */
2810 tmpexit = compiler_new_tmpname(c);
2811 if (tmpexit == NULL)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002812 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002813 PyArena_AddPyObject(c->c_arena, tmpexit);
2814
2815 if (s->v.With.optional_vars) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002816 /* Create a temporary variable to hold context.__enter__().
Guido van Rossumc2e20742006-02-27 22:32:47 +00002817 We need to do this rather than preserving it on the stack
2818 because SETUP_FINALLY remembers the stack level.
2819 We need to do the assignment *inside* the try/finally
2820 so that context.__exit__() is called when the assignment
2821 fails. But we need to call context.__enter__() *before*
2822 the try/finally so that if it fails we won't call
2823 context.__exit__().
2824 */
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002825 tmpvalue = compiler_new_tmpname(c);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002826 if (tmpvalue == NULL)
2827 return 0;
2828 PyArena_AddPyObject(c->c_arena, tmpvalue);
2829 }
2830
Guido van Rossumda5b7012006-05-02 19:47:52 +00002831 /* Evaluate EXPR */
Guido van Rossumc2e20742006-02-27 22:32:47 +00002832 VISIT(c, expr, s->v.With.context_expr);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002833
2834 /* Squirrel away context.__exit__ */
2835 ADDOP(c, DUP_TOP);
2836 ADDOP_O(c, LOAD_ATTR, exit_attr, names);
2837 if (!compiler_nameop(c, tmpexit, Store))
2838 return 0;
2839
2840 /* Call context.__enter__() */
2841 ADDOP_O(c, LOAD_ATTR, enter_attr, names);
2842 ADDOP_I(c, CALL_FUNCTION, 0);
2843
2844 if (s->v.With.optional_vars) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002845 /* Store it in tmpvalue */
2846 if (!compiler_nameop(c, tmpvalue, Store))
Guido van Rossumc2e20742006-02-27 22:32:47 +00002847 return 0;
2848 }
2849 else {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002850 /* Discard result from context.__enter__() */
2851 ADDOP(c, POP_TOP);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002852 }
2853
2854 /* Start the try block */
2855 ADDOP_JREL(c, SETUP_FINALLY, finally);
2856
2857 compiler_use_next_block(c, block);
2858 if (!compiler_push_fblock(c, FINALLY_TRY, block)) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002859 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002860 }
2861
2862 if (s->v.With.optional_vars) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002863 /* Bind saved result of context.__enter__() to VAR */
2864 if (!compiler_nameop(c, tmpvalue, Load) ||
Guido van Rossumc2e20742006-02-27 22:32:47 +00002865 !compiler_nameop(c, tmpvalue, Del))
2866 return 0;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002867 VISIT(c, expr, s->v.With.optional_vars);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002868 }
2869
2870 /* BLOCK code */
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002871 VISIT_SEQ(c, stmt, s->v.With.body);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002872
2873 /* End of try block; start the finally block */
2874 ADDOP(c, POP_BLOCK);
2875 compiler_pop_fblock(c, FINALLY_TRY, block);
2876
2877 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2878 compiler_use_next_block(c, finally);
2879 if (!compiler_push_fblock(c, FINALLY_END, finally))
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002880 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002881
2882 /* Finally block starts; push tmpexit and issue our magic opcode. */
2883 if (!compiler_nameop(c, tmpexit, Load) ||
2884 !compiler_nameop(c, tmpexit, Del))
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002885 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002886 ADDOP(c, WITH_CLEANUP);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002887
2888 /* Finally block ends. */
2889 ADDOP(c, END_FINALLY);
2890 compiler_pop_fblock(c, FINALLY_END, finally);
2891 return 1;
2892}
2893
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002894static int
2895compiler_visit_expr(struct compiler *c, expr_ty e)
2896{
2897 int i, n;
2898
Neal Norwitzf733a012006-10-29 18:30:10 +00002899 /* If expr e has a different line number than the last expr/stmt,
Jeremy Hylton819de6c2007-02-27 16:13:23 +00002900 set a new line number for the next instruction.
2901 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002902 if (e->lineno > c->u->u_lineno) {
2903 c->u->u_lineno = e->lineno;
2904 c->u->u_lineno_set = false;
2905 }
2906 switch (e->kind) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002907 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002908 return compiler_boolop(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002909 case BinOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002910 VISIT(c, expr, e->v.BinOp.left);
2911 VISIT(c, expr, e->v.BinOp.right);
2912 ADDOP(c, binop(c, e->v.BinOp.op));
2913 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002914 case UnaryOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002915 VISIT(c, expr, e->v.UnaryOp.operand);
2916 ADDOP(c, unaryop(e->v.UnaryOp.op));
2917 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002918 case Lambda_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002919 return compiler_lambda(c, e);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002920 case IfExp_kind:
2921 return compiler_ifexp(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002922 case Dict_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002923 /* XXX get rid of arg? */
2924 ADDOP_I(c, BUILD_MAP, 0);
2925 n = asdl_seq_LEN(e->v.Dict.values);
2926 /* We must arrange things just right for STORE_SUBSCR.
2927 It wants the stack to look like (value) (dict) (key) */
2928 for (i = 0; i < n; i++) {
2929 ADDOP(c, DUP_TOP);
Anthony Baxter7b782b62006-04-11 12:01:56 +00002930 VISIT(c, expr,
Jeremy Hylton819de6c2007-02-27 16:13:23 +00002931 (expr_ty)asdl_seq_GET(e->v.Dict.values, i));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002932 ADDOP(c, ROT_TWO);
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));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002935 ADDOP(c, STORE_SUBSCR);
2936 }
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)
3445 return 1;
3446 if (instr->i_oparg > 0xffff)
3447 return 6;
3448 return 3;
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}