blob: 83a8fc07cee2f77837d10a8c514cc014947e4c66 [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
Amaury Forgeot d'Arc6fd03bb2008-02-04 21:45:05 +0000641/* Set the i_lineno member of the instruction at offset off if the
642 line number for the current expression/statement has not
Jeremy Hylton12603c42006-04-01 16:18:02 +0000643 already been set. If it has been set, the call has no effect.
644
Amaury Forgeot d'Arc6fd03bb2008-02-04 21:45:05 +0000645 The line number is reset in the following cases:
646 - when entering a new scope
647 - on each statement
648 - on each expression that start a new line
649 - before the "except" clause
650 - before the "for" and "while" expressions
Neal Norwitzf733a012006-10-29 18:30:10 +0000651*/
Jeremy Hylton12603c42006-04-01 16:18:02 +0000652
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000653static void
654compiler_set_lineno(struct compiler *c, int off)
655{
656 basicblock *b;
657 if (c->u->u_lineno_set)
658 return;
659 c->u->u_lineno_set = true;
660 b = c->u->u_curblock;
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000661 b->b_instr[off].i_lineno = c->u->u_lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000662}
663
664static int
665opcode_stack_effect(int opcode, int oparg)
666{
667 switch (opcode) {
668 case POP_TOP:
669 return -1;
670 case ROT_TWO:
671 case ROT_THREE:
672 return 0;
673 case DUP_TOP:
674 return 1;
675 case ROT_FOUR:
676 return 0;
677
678 case UNARY_POSITIVE:
679 case UNARY_NEGATIVE:
680 case UNARY_NOT:
681 case UNARY_CONVERT:
682 case UNARY_INVERT:
683 return 0;
684
Neal Norwitz10be2ea2006-03-03 20:29:11 +0000685 case LIST_APPEND:
686 return -2;
687
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000688 case BINARY_POWER:
689 case BINARY_MULTIPLY:
690 case BINARY_DIVIDE:
691 case BINARY_MODULO:
692 case BINARY_ADD:
693 case BINARY_SUBTRACT:
694 case BINARY_SUBSCR:
695 case BINARY_FLOOR_DIVIDE:
696 case BINARY_TRUE_DIVIDE:
697 return -1;
698 case INPLACE_FLOOR_DIVIDE:
699 case INPLACE_TRUE_DIVIDE:
700 return -1;
701
702 case SLICE+0:
703 return 1;
704 case SLICE+1:
705 return 0;
706 case SLICE+2:
707 return 0;
708 case SLICE+3:
709 return -1;
710
711 case STORE_SLICE+0:
712 return -2;
713 case STORE_SLICE+1:
714 return -3;
715 case STORE_SLICE+2:
716 return -3;
717 case STORE_SLICE+3:
718 return -4;
719
720 case DELETE_SLICE+0:
721 return -1;
722 case DELETE_SLICE+1:
723 return -2;
724 case DELETE_SLICE+2:
725 return -2;
726 case DELETE_SLICE+3:
727 return -3;
728
729 case INPLACE_ADD:
730 case INPLACE_SUBTRACT:
731 case INPLACE_MULTIPLY:
732 case INPLACE_DIVIDE:
733 case INPLACE_MODULO:
734 return -1;
735 case STORE_SUBSCR:
736 return -3;
Raymond Hettingereffde122007-12-18 18:26:18 +0000737 case STORE_MAP:
738 return -2;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000739 case DELETE_SUBSCR:
740 return -2;
741
742 case BINARY_LSHIFT:
743 case BINARY_RSHIFT:
744 case BINARY_AND:
745 case BINARY_XOR:
746 case BINARY_OR:
747 return -1;
748 case INPLACE_POWER:
749 return -1;
750 case GET_ITER:
751 return 0;
752
753 case PRINT_EXPR:
754 return -1;
755 case PRINT_ITEM:
756 return -1;
757 case PRINT_NEWLINE:
758 return 0;
759 case PRINT_ITEM_TO:
760 return -2;
761 case PRINT_NEWLINE_TO:
762 return -1;
763 case INPLACE_LSHIFT:
764 case INPLACE_RSHIFT:
765 case INPLACE_AND:
766 case INPLACE_XOR:
767 case INPLACE_OR:
768 return -1;
769 case BREAK_LOOP:
770 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +0000771 case WITH_CLEANUP:
Guido van Rossumf6694362006-03-10 02:28:35 +0000772 return -1; /* XXX Sometimes more */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000773 case LOAD_LOCALS:
774 return 1;
775 case RETURN_VALUE:
776 return -1;
777 case IMPORT_STAR:
778 return -1;
779 case EXEC_STMT:
780 return -3;
781 case YIELD_VALUE:
782 return 0;
783
784 case POP_BLOCK:
785 return 0;
786 case END_FINALLY:
787 return -1; /* or -2 or -3 if exception occurred */
788 case BUILD_CLASS:
789 return -2;
790
791 case STORE_NAME:
792 return -1;
793 case DELETE_NAME:
794 return 0;
795 case UNPACK_SEQUENCE:
796 return oparg-1;
797 case FOR_ITER:
798 return 1;
799
800 case STORE_ATTR:
801 return -2;
802 case DELETE_ATTR:
803 return -1;
804 case STORE_GLOBAL:
805 return -1;
806 case DELETE_GLOBAL:
807 return 0;
808 case DUP_TOPX:
809 return oparg;
810 case LOAD_CONST:
811 return 1;
812 case LOAD_NAME:
813 return 1;
814 case BUILD_TUPLE:
815 case BUILD_LIST:
816 return 1-oparg;
817 case BUILD_MAP:
818 return 1;
819 case LOAD_ATTR:
820 return 0;
821 case COMPARE_OP:
822 return -1;
823 case IMPORT_NAME:
824 return 0;
825 case IMPORT_FROM:
826 return 1;
827
828 case JUMP_FORWARD:
829 case JUMP_IF_FALSE:
830 case JUMP_IF_TRUE:
831 case JUMP_ABSOLUTE:
832 return 0;
833
834 case LOAD_GLOBAL:
835 return 1;
836
837 case CONTINUE_LOOP:
838 return 0;
839 case SETUP_LOOP:
840 return 0;
841 case SETUP_EXCEPT:
842 case SETUP_FINALLY:
843 return 3; /* actually pushed by an exception */
844
845 case LOAD_FAST:
846 return 1;
847 case STORE_FAST:
848 return -1;
849 case DELETE_FAST:
850 return 0;
851
852 case RAISE_VARARGS:
853 return -oparg;
854#define NARGS(o) (((o) % 256) + 2*((o) / 256))
855 case CALL_FUNCTION:
856 return -NARGS(oparg);
857 case CALL_FUNCTION_VAR:
858 case CALL_FUNCTION_KW:
859 return -NARGS(oparg)-1;
860 case CALL_FUNCTION_VAR_KW:
861 return -NARGS(oparg)-2;
862#undef NARGS
863 case MAKE_FUNCTION:
864 return -oparg;
865 case BUILD_SLICE:
866 if (oparg == 3)
867 return -2;
868 else
869 return -1;
870
871 case MAKE_CLOSURE:
872 return -oparg;
873 case LOAD_CLOSURE:
874 return 1;
875 case LOAD_DEREF:
876 return 1;
877 case STORE_DEREF:
878 return -1;
879 default:
880 fprintf(stderr, "opcode = %d\n", opcode);
881 Py_FatalError("opcode_stack_effect()");
882
883 }
884 return 0; /* not reachable */
885}
886
887/* Add an opcode with no argument.
888 Returns 0 on failure, 1 on success.
889*/
890
891static int
892compiler_addop(struct compiler *c, int opcode)
893{
894 basicblock *b;
895 struct instr *i;
896 int off;
897 off = compiler_next_instr(c, c->u->u_curblock);
898 if (off < 0)
899 return 0;
900 b = c->u->u_curblock;
901 i = &b->b_instr[off];
902 i->i_opcode = opcode;
903 i->i_hasarg = 0;
904 if (opcode == RETURN_VALUE)
905 b->b_return = 1;
906 compiler_set_lineno(c, off);
907 return 1;
908}
909
910static int
911compiler_add_o(struct compiler *c, PyObject *dict, PyObject *o)
912{
913 PyObject *t, *v;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000914 Py_ssize_t arg;
Mark Dickinson105be772008-01-31 22:17:37 +0000915 unsigned char *p, *q;
916 Py_complex z;
917 double d;
918 int real_part_zero, imag_part_zero;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000919
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000920 /* necessary to make sure types aren't coerced (e.g., int and long) */
Alex Martellid8672aa2007-08-22 21:14:17 +0000921 /* _and_ to distinguish 0.0 from -0.0 e.g. on IEEE platforms */
922 if (PyFloat_Check(o)) {
Mark Dickinson105be772008-01-31 22:17:37 +0000923 d = PyFloat_AS_DOUBLE(o);
924 p = (unsigned char*) &d;
925 /* all we need is to make the tuple different in either the 0.0
926 * or -0.0 case from all others, just to avoid the "coercion".
927 */
928 if (*p==0 && p[sizeof(double)-1]==0)
929 t = PyTuple_Pack(3, o, o->ob_type, Py_None);
930 else
931 t = PyTuple_Pack(2, o, o->ob_type);
932 }
933 else if (PyComplex_Check(o)) {
934 /* complex case is even messier: we need to make complex(x,
935 0.) different from complex(x, -0.) and complex(0., y)
936 different from complex(-0., y), for any x and y. In
937 particular, all four complex zeros should be
938 distinguished.*/
939 z = PyComplex_AsCComplex(o);
940 p = (unsigned char*) &(z.real);
941 q = (unsigned char*) &(z.imag);
942 /* all that matters here is that on IEEE platforms
943 real_part_zero will be true if z.real == 0., and false if
944 z.real == -0. In fact, real_part_zero will also be true
945 for some other rarely occurring nonzero floats, but this
946 doesn't matter. Similar comments apply to
947 imag_part_zero. */
948 real_part_zero = *p==0 && p[sizeof(double)-1]==0;
949 imag_part_zero = *q==0 && q[sizeof(double)-1]==0;
950 if (real_part_zero && imag_part_zero) {
951 t = PyTuple_Pack(4, o, o->ob_type, Py_True, Py_True);
952 }
953 else if (real_part_zero && !imag_part_zero) {
954 t = PyTuple_Pack(4, o, o->ob_type, Py_True, Py_False);
955 }
956 else if (!real_part_zero && imag_part_zero) {
957 t = PyTuple_Pack(4, o, o->ob_type, Py_False, Py_True);
958 }
959 else {
960 t = PyTuple_Pack(2, o, o->ob_type);
961 }
962 }
963 else {
964 t = PyTuple_Pack(2, o, o->ob_type);
Alex Martellid8672aa2007-08-22 21:14:17 +0000965 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000966 if (t == NULL)
Mark Dickinson105be772008-01-31 22:17:37 +0000967 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000968
969 v = PyDict_GetItem(dict, t);
970 if (!v) {
971 arg = PyDict_Size(dict);
972 v = PyInt_FromLong(arg);
973 if (!v) {
974 Py_DECREF(t);
975 return -1;
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000976 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000977 if (PyDict_SetItem(dict, t, v) < 0) {
978 Py_DECREF(t);
979 Py_DECREF(v);
980 return -1;
981 }
982 Py_DECREF(v);
983 }
984 else
985 arg = PyInt_AsLong(v);
986 Py_DECREF(t);
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000987 return arg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000988}
989
990static int
991compiler_addop_o(struct compiler *c, int opcode, PyObject *dict,
992 PyObject *o)
993{
994 int arg = compiler_add_o(c, dict, o);
995 if (arg < 0)
Jeremy Hyltone9357b22006-03-01 15:47:05 +0000996 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000997 return compiler_addop_i(c, opcode, arg);
998}
999
1000static int
1001compiler_addop_name(struct compiler *c, int opcode, PyObject *dict,
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001002 PyObject *o)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001003{
1004 int arg;
1005 PyObject *mangled = _Py_Mangle(c->u->u_private, o);
1006 if (!mangled)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001007 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001008 arg = compiler_add_o(c, dict, mangled);
1009 Py_DECREF(mangled);
1010 if (arg < 0)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001011 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001012 return compiler_addop_i(c, opcode, arg);
1013}
1014
1015/* Add an opcode with an integer argument.
1016 Returns 0 on failure, 1 on success.
1017*/
1018
1019static int
1020compiler_addop_i(struct compiler *c, int opcode, int oparg)
1021{
1022 struct instr *i;
1023 int off;
1024 off = compiler_next_instr(c, c->u->u_curblock);
1025 if (off < 0)
1026 return 0;
1027 i = &c->u->u_curblock->b_instr[off];
1028 i->i_opcode = opcode;
1029 i->i_oparg = oparg;
1030 i->i_hasarg = 1;
1031 compiler_set_lineno(c, off);
1032 return 1;
1033}
1034
1035static int
1036compiler_addop_j(struct compiler *c, int opcode, basicblock *b, int absolute)
1037{
1038 struct instr *i;
1039 int off;
1040
1041 assert(b != NULL);
1042 off = compiler_next_instr(c, c->u->u_curblock);
1043 if (off < 0)
1044 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001045 i = &c->u->u_curblock->b_instr[off];
1046 i->i_opcode = opcode;
1047 i->i_target = b;
1048 i->i_hasarg = 1;
1049 if (absolute)
1050 i->i_jabs = 1;
1051 else
1052 i->i_jrel = 1;
Jeremy Hylton12603c42006-04-01 16:18:02 +00001053 compiler_set_lineno(c, off);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001054 return 1;
1055}
1056
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001057/* The distinction between NEW_BLOCK and NEXT_BLOCK is subtle. (I'd
1058 like to find better names.) NEW_BLOCK() creates a new block and sets
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001059 it as the current block. NEXT_BLOCK() also creates an implicit jump
1060 from the current block to the new block.
1061*/
1062
Neal Norwitzf733a012006-10-29 18:30:10 +00001063/* The returns inside these macros make it impossible to decref objects
1064 created in the local function. Local objects should use the arena.
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001065*/
1066
1067
1068#define NEW_BLOCK(C) { \
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001069 if (compiler_use_new_block((C)) == NULL) \
1070 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001071}
1072
1073#define NEXT_BLOCK(C) { \
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001074 if (compiler_next_block((C)) == NULL) \
1075 return 0; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001076}
1077
1078#define ADDOP(C, OP) { \
1079 if (!compiler_addop((C), (OP))) \
1080 return 0; \
1081}
1082
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001083#define ADDOP_IN_SCOPE(C, OP) { \
1084 if (!compiler_addop((C), (OP))) { \
1085 compiler_exit_scope(c); \
1086 return 0; \
1087 } \
1088}
1089
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001090#define ADDOP_O(C, OP, O, TYPE) { \
1091 if (!compiler_addop_o((C), (OP), (C)->u->u_ ## TYPE, (O))) \
1092 return 0; \
1093}
1094
1095#define ADDOP_NAME(C, OP, O, TYPE) { \
1096 if (!compiler_addop_name((C), (OP), (C)->u->u_ ## TYPE, (O))) \
1097 return 0; \
1098}
1099
1100#define ADDOP_I(C, OP, O) { \
1101 if (!compiler_addop_i((C), (OP), (O))) \
1102 return 0; \
1103}
1104
1105#define ADDOP_JABS(C, OP, O) { \
1106 if (!compiler_addop_j((C), (OP), (O), 1)) \
1107 return 0; \
1108}
1109
1110#define ADDOP_JREL(C, OP, O) { \
1111 if (!compiler_addop_j((C), (OP), (O), 0)) \
1112 return 0; \
1113}
1114
1115/* VISIT and VISIT_SEQ takes an ASDL type as their second argument. They use
1116 the ASDL name to synthesize the name of the C type and the visit function.
1117*/
1118
1119#define VISIT(C, TYPE, V) {\
1120 if (!compiler_visit_ ## TYPE((C), (V))) \
1121 return 0; \
1122}
1123
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001124#define VISIT_IN_SCOPE(C, TYPE, V) {\
1125 if (!compiler_visit_ ## TYPE((C), (V))) { \
1126 compiler_exit_scope(c); \
1127 return 0; \
1128 } \
1129}
1130
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001131#define VISIT_SLICE(C, V, CTX) {\
1132 if (!compiler_visit_slice((C), (V), (CTX))) \
1133 return 0; \
1134}
1135
1136#define VISIT_SEQ(C, TYPE, SEQ) { \
Neal Norwitz08b401f2006-01-07 21:24:09 +00001137 int _i; \
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001138 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
Neal Norwitz08b401f2006-01-07 21:24:09 +00001139 for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001140 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \
Anthony Baxter7b782b62006-04-11 12:01:56 +00001141 if (!compiler_visit_ ## TYPE((C), elt)) \
1142 return 0; \
1143 } \
1144}
1145
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001146#define VISIT_SEQ_IN_SCOPE(C, TYPE, SEQ) { \
Neal Norwitz08b401f2006-01-07 21:24:09 +00001147 int _i; \
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001148 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
Neal Norwitz08b401f2006-01-07 21:24:09 +00001149 for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001150 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \
Anthony Baxter7b782b62006-04-11 12:01:56 +00001151 if (!compiler_visit_ ## TYPE((C), elt)) { \
1152 compiler_exit_scope(c); \
1153 return 0; \
1154 } \
1155 } \
1156}
1157
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001158static int
1159compiler_isdocstring(stmt_ty s)
1160{
1161 if (s->kind != Expr_kind)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001162 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001163 return s->v.Expr.value->kind == Str_kind;
1164}
1165
1166/* Compile a sequence of statements, checking for a docstring. */
1167
1168static int
1169compiler_body(struct compiler *c, asdl_seq *stmts)
1170{
1171 int i = 0;
1172 stmt_ty st;
1173
1174 if (!asdl_seq_LEN(stmts))
1175 return 1;
Anthony Baxter7b782b62006-04-11 12:01:56 +00001176 st = (stmt_ty)asdl_seq_GET(stmts, 0);
Georg Brandla5ea6892007-06-01 11:33:33 +00001177 if (compiler_isdocstring(st) && Py_OptimizeFlag < 2) {
1178 /* don't generate docstrings if -OO */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001179 i = 1;
1180 VISIT(c, expr, st->v.Expr.value);
1181 if (!compiler_nameop(c, __doc__, Store))
1182 return 0;
1183 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001184 for (; i < asdl_seq_LEN(stmts); i++)
Anthony Baxter7b782b62006-04-11 12:01:56 +00001185 VISIT(c, stmt, (stmt_ty)asdl_seq_GET(stmts, i));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001186 return 1;
1187}
1188
1189static PyCodeObject *
1190compiler_mod(struct compiler *c, mod_ty mod)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001191{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001192 PyCodeObject *co;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001193 int addNone = 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001194 static PyObject *module;
1195 if (!module) {
Christian Heimesd7e1b2b2008-01-28 02:07:53 +00001196 module = PyString_InternFromString("<module>");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001197 if (!module)
1198 return NULL;
1199 }
Neal Norwitzed657552006-07-10 00:04:44 +00001200 /* Use 0 for firstlineno initially, will fixup in assemble(). */
1201 if (!compiler_enter_scope(c, module, mod, 0))
Guido van Rossumd076c731998-10-07 19:42:25 +00001202 return NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001203 switch (mod->kind) {
1204 case Module_kind:
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001205 if (!compiler_body(c, mod->v.Module.body)) {
1206 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001207 return 0;
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001208 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001209 break;
1210 case Interactive_kind:
1211 c->c_interactive = 1;
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001212 VISIT_SEQ_IN_SCOPE(c, stmt,
Jeremy Hylton819de6c2007-02-27 16:13:23 +00001213 mod->v.Interactive.body);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001214 break;
1215 case Expression_kind:
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001216 VISIT_IN_SCOPE(c, expr, mod->v.Expression.body);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001217 addNone = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001218 break;
1219 case Suite_kind:
Neal Norwitz4737b232005-11-19 23:58:29 +00001220 PyErr_SetString(PyExc_SystemError,
1221 "suite should not be possible");
1222 return 0;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001223 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00001224 PyErr_Format(PyExc_SystemError,
1225 "module kind %d should not be possible",
1226 mod->kind);
1227 return 0;
Guido van Rossumd076c731998-10-07 19:42:25 +00001228 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001229 co = assemble(c, addNone);
1230 compiler_exit_scope(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001231 return co;
1232}
1233
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001234/* The test for LOCAL must come before the test for FREE in order to
1235 handle classes where name is both local and free. The local var is
1236 a method and the free var is a free var referenced within a method.
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001237*/
1238
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001239static int
1240get_ref_type(struct compiler *c, PyObject *name)
1241{
1242 int scope = PyST_GetScope(c->u->u_ste, name);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001243 if (scope == 0) {
1244 char buf[350];
1245 PyOS_snprintf(buf, sizeof(buf),
1246 "unknown scope for %.100s in %.100s(%s) in %s\n"
1247 "symbols: %s\nlocals: %s\nglobals: %s\n",
1248 PyString_AS_STRING(name),
1249 PyString_AS_STRING(c->u->u_name),
1250 PyObject_REPR(c->u->u_ste->ste_id),
1251 c->c_filename,
1252 PyObject_REPR(c->u->u_ste->ste_symbols),
1253 PyObject_REPR(c->u->u_varnames),
1254 PyObject_REPR(c->u->u_names)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001255 );
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001256 Py_FatalError(buf);
1257 }
Tim Peters2a7f3842001-06-09 09:26:21 +00001258
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001259 return scope;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001260}
1261
1262static int
1263compiler_lookup_arg(PyObject *dict, PyObject *name)
1264{
1265 PyObject *k, *v;
Georg Brandl7784f122006-05-26 20:04:44 +00001266 k = PyTuple_Pack(2, name, name->ob_type);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001267 if (k == NULL)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001268 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001269 v = PyDict_GetItem(dict, k);
Neal Norwitz3715c3e2005-11-24 22:09:18 +00001270 Py_DECREF(k);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001271 if (v == NULL)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001272 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001273 return PyInt_AS_LONG(v);
1274}
1275
1276static int
1277compiler_make_closure(struct compiler *c, PyCodeObject *co, int args)
1278{
1279 int i, free = PyCode_GetNumFree(co);
1280 if (free == 0) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001281 ADDOP_O(c, LOAD_CONST, (PyObject*)co, consts);
1282 ADDOP_I(c, MAKE_FUNCTION, args);
1283 return 1;
1284 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001285 for (i = 0; i < free; ++i) {
1286 /* Bypass com_addop_varname because it will generate
1287 LOAD_DEREF but LOAD_CLOSURE is needed.
1288 */
1289 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
1290 int arg, reftype;
1291
1292 /* Special case: If a class contains a method with a
1293 free variable that has the same name as a method,
1294 the name will be considered free *and* local in the
1295 class. It should be handled by the closure, as
1296 well as by the normal name loookup logic.
1297 */
1298 reftype = get_ref_type(c, name);
1299 if (reftype == CELL)
1300 arg = compiler_lookup_arg(c->u->u_cellvars, name);
1301 else /* (reftype == FREE) */
1302 arg = compiler_lookup_arg(c->u->u_freevars, name);
1303 if (arg == -1) {
1304 printf("lookup %s in %s %d %d\n"
1305 "freevars of %s: %s\n",
1306 PyObject_REPR(name),
1307 PyString_AS_STRING(c->u->u_name),
1308 reftype, arg,
1309 PyString_AS_STRING(co->co_name),
1310 PyObject_REPR(co->co_freevars));
1311 Py_FatalError("compiler_make_closure()");
1312 }
1313 ADDOP_I(c, LOAD_CLOSURE, arg);
1314 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001315 ADDOP_I(c, BUILD_TUPLE, free);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001316 ADDOP_O(c, LOAD_CONST, (PyObject*)co, consts);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001317 ADDOP_I(c, MAKE_CLOSURE, args);
1318 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001319}
1320
1321static int
1322compiler_decorators(struct compiler *c, asdl_seq* decos)
1323{
1324 int i;
1325
1326 if (!decos)
1327 return 1;
1328
1329 for (i = 0; i < asdl_seq_LEN(decos); i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00001330 VISIT(c, expr, (expr_ty)asdl_seq_GET(decos, i));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001331 }
1332 return 1;
1333}
1334
1335static int
1336compiler_arguments(struct compiler *c, arguments_ty args)
1337{
1338 int i;
1339 int n = asdl_seq_LEN(args->args);
1340 /* Correctly handle nested argument lists */
1341 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00001342 expr_ty arg = (expr_ty)asdl_seq_GET(args->args, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001343 if (arg->kind == Tuple_kind) {
1344 PyObject *id = PyString_FromFormat(".%d", i);
1345 if (id == NULL) {
1346 return 0;
1347 }
1348 if (!compiler_nameop(c, id, Load)) {
1349 Py_DECREF(id);
1350 return 0;
1351 }
1352 Py_DECREF(id);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001353 VISIT(c, expr, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001354 }
1355 }
1356 return 1;
1357}
1358
1359static int
1360compiler_function(struct compiler *c, stmt_ty s)
1361{
1362 PyCodeObject *co;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001363 PyObject *first_const = Py_None;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001364 arguments_ty args = s->v.FunctionDef.args;
1365 asdl_seq* decos = s->v.FunctionDef.decorators;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001366 stmt_ty st;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001367 int i, n, docstring;
1368
1369 assert(s->kind == FunctionDef_kind);
1370
1371 if (!compiler_decorators(c, decos))
1372 return 0;
1373 if (args->defaults)
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001374 VISIT_SEQ(c, expr, args->defaults);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001375 if (!compiler_enter_scope(c, s->v.FunctionDef.name, (void *)s,
1376 s->lineno))
1377 return 0;
1378
Anthony Baxter7b782b62006-04-11 12:01:56 +00001379 st = (stmt_ty)asdl_seq_GET(s->v.FunctionDef.body, 0);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001380 docstring = compiler_isdocstring(st);
Georg Brandl5a5bc7b2007-09-19 06:37:19 +00001381 if (docstring && Py_OptimizeFlag < 2)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001382 first_const = st->v.Expr.value->v.Str.s;
1383 if (compiler_add_o(c, c->u->u_consts, first_const) < 0) {
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001384 compiler_exit_scope(c);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001385 return 0;
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001386 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001387
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001388 /* unpack nested arguments */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001389 compiler_arguments(c, args);
1390
1391 c->u->u_argcount = asdl_seq_LEN(args->args);
1392 n = asdl_seq_LEN(s->v.FunctionDef.body);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001393 /* if there was a docstring, we need to skip the first statement */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001394 for (i = docstring; i < n; i++) {
Neal Norwitz4ffedad2006-08-04 04:58:47 +00001395 st = (stmt_ty)asdl_seq_GET(s->v.FunctionDef.body, i);
1396 VISIT_IN_SCOPE(c, stmt, st);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001397 }
1398 co = assemble(c, 1);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001399 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001400 if (co == NULL)
1401 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001402
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001403 compiler_make_closure(c, co, asdl_seq_LEN(args->defaults));
Neal Norwitz4737b232005-11-19 23:58:29 +00001404 Py_DECREF(co);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001405
1406 for (i = 0; i < asdl_seq_LEN(decos); i++) {
1407 ADDOP_I(c, CALL_FUNCTION, 1);
1408 }
1409
1410 return compiler_nameop(c, s->v.FunctionDef.name, Store);
1411}
1412
1413static int
1414compiler_class(struct compiler *c, stmt_ty s)
1415{
1416 int n;
1417 PyCodeObject *co;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001418 PyObject *str;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001419 /* push class name on stack, needed by BUILD_CLASS */
1420 ADDOP_O(c, LOAD_CONST, s->v.ClassDef.name, consts);
1421 /* push the tuple of base classes on the stack */
1422 n = asdl_seq_LEN(s->v.ClassDef.bases);
1423 if (n > 0)
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001424 VISIT_SEQ(c, expr, s->v.ClassDef.bases);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001425 ADDOP_I(c, BUILD_TUPLE, n);
1426 if (!compiler_enter_scope(c, s->v.ClassDef.name, (void *)s,
1427 s->lineno))
1428 return 0;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001429 c->u->u_private = s->v.ClassDef.name;
1430 Py_INCREF(c->u->u_private);
1431 str = PyString_InternFromString("__name__");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001432 if (!str || !compiler_nameop(c, str, Load)) {
1433 Py_XDECREF(str);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001434 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001435 return 0;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001436 }
1437
1438 Py_DECREF(str);
1439 str = PyString_InternFromString("__module__");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001440 if (!str || !compiler_nameop(c, str, Store)) {
1441 Py_XDECREF(str);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001442 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001443 return 0;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001444 }
1445 Py_DECREF(str);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001446
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001447 if (!compiler_body(c, s->v.ClassDef.body)) {
1448 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001449 return 0;
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001450 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001451
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001452 ADDOP_IN_SCOPE(c, LOAD_LOCALS);
1453 ADDOP_IN_SCOPE(c, RETURN_VALUE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001454 co = assemble(c, 1);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001455 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001456 if (co == NULL)
1457 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001458
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001459 compiler_make_closure(c, co, 0);
Neal Norwitz4737b232005-11-19 23:58:29 +00001460 Py_DECREF(co);
1461
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001462 ADDOP_I(c, CALL_FUNCTION, 0);
1463 ADDOP(c, BUILD_CLASS);
1464 if (!compiler_nameop(c, s->v.ClassDef.name, Store))
1465 return 0;
1466 return 1;
1467}
1468
1469static int
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00001470compiler_ifexp(struct compiler *c, expr_ty e)
1471{
1472 basicblock *end, *next;
1473
1474 assert(e->kind == IfExp_kind);
1475 end = compiler_new_block(c);
1476 if (end == NULL)
1477 return 0;
1478 next = compiler_new_block(c);
1479 if (next == NULL)
1480 return 0;
1481 VISIT(c, expr, e->v.IfExp.test);
1482 ADDOP_JREL(c, JUMP_IF_FALSE, next);
1483 ADDOP(c, POP_TOP);
1484 VISIT(c, expr, e->v.IfExp.body);
1485 ADDOP_JREL(c, JUMP_FORWARD, end);
1486 compiler_use_next_block(c, next);
1487 ADDOP(c, POP_TOP);
1488 VISIT(c, expr, e->v.IfExp.orelse);
1489 compiler_use_next_block(c, end);
1490 return 1;
1491}
1492
1493static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001494compiler_lambda(struct compiler *c, expr_ty e)
1495{
1496 PyCodeObject *co;
Nick Coghlan944d3eb2005-11-16 12:46:55 +00001497 static identifier name;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001498 arguments_ty args = e->v.Lambda.args;
1499 assert(e->kind == Lambda_kind);
1500
Nick Coghlan944d3eb2005-11-16 12:46:55 +00001501 if (!name) {
1502 name = PyString_InternFromString("<lambda>");
1503 if (!name)
1504 return 0;
1505 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001506
1507 if (args->defaults)
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001508 VISIT_SEQ(c, expr, args->defaults);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001509 if (!compiler_enter_scope(c, name, (void *)e, e->lineno))
1510 return 0;
Neal Norwitz4737b232005-11-19 23:58:29 +00001511
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001512 /* unpack nested arguments */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001513 compiler_arguments(c, args);
1514
1515 c->u->u_argcount = asdl_seq_LEN(args->args);
Neal Norwitzb6fc9df2005-11-13 18:50:34 +00001516 VISIT_IN_SCOPE(c, expr, e->v.Lambda.body);
1517 ADDOP_IN_SCOPE(c, RETURN_VALUE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001518 co = assemble(c, 1);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00001519 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001520 if (co == NULL)
1521 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001522
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001523 compiler_make_closure(c, co, asdl_seq_LEN(args->defaults));
Neal Norwitz4737b232005-11-19 23:58:29 +00001524 Py_DECREF(co);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001525
1526 return 1;
1527}
1528
1529static int
1530compiler_print(struct compiler *c, stmt_ty s)
1531{
1532 int i, n;
1533 bool dest;
1534
1535 assert(s->kind == Print_kind);
1536 n = asdl_seq_LEN(s->v.Print.values);
1537 dest = false;
1538 if (s->v.Print.dest) {
1539 VISIT(c, expr, s->v.Print.dest);
1540 dest = true;
1541 }
1542 for (i = 0; i < n; i++) {
1543 expr_ty e = (expr_ty)asdl_seq_GET(s->v.Print.values, i);
1544 if (dest) {
1545 ADDOP(c, DUP_TOP);
1546 VISIT(c, expr, e);
1547 ADDOP(c, ROT_TWO);
1548 ADDOP(c, PRINT_ITEM_TO);
1549 }
1550 else {
1551 VISIT(c, expr, e);
1552 ADDOP(c, PRINT_ITEM);
1553 }
1554 }
1555 if (s->v.Print.nl) {
1556 if (dest)
1557 ADDOP(c, PRINT_NEWLINE_TO)
1558 else
1559 ADDOP(c, PRINT_NEWLINE)
1560 }
1561 else if (dest)
1562 ADDOP(c, POP_TOP);
1563 return 1;
1564}
1565
1566static int
1567compiler_if(struct compiler *c, stmt_ty s)
1568{
1569 basicblock *end, *next;
Georg Brandlddbaa662006-06-04 21:56:52 +00001570 int constant;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001571 assert(s->kind == If_kind);
1572 end = compiler_new_block(c);
1573 if (end == NULL)
1574 return 0;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001575 next = compiler_new_block(c);
1576 if (next == NULL)
1577 return 0;
Georg Brandlddbaa662006-06-04 21:56:52 +00001578
1579 constant = expr_constant(s->v.If.test);
1580 /* constant = 0: "if 0"
1581 * constant = 1: "if 1", "if 2", ...
1582 * constant = -1: rest */
1583 if (constant == 0) {
1584 if (s->v.If.orelse)
1585 VISIT_SEQ(c, stmt, s->v.If.orelse);
1586 } else if (constant == 1) {
1587 VISIT_SEQ(c, stmt, s->v.If.body);
1588 } else {
1589 VISIT(c, expr, s->v.If.test);
1590 ADDOP_JREL(c, JUMP_IF_FALSE, next);
1591 ADDOP(c, POP_TOP);
1592 VISIT_SEQ(c, stmt, s->v.If.body);
1593 ADDOP_JREL(c, JUMP_FORWARD, end);
1594 compiler_use_next_block(c, next);
1595 ADDOP(c, POP_TOP);
1596 if (s->v.If.orelse)
Jeremy Hylton819de6c2007-02-27 16:13:23 +00001597 VISIT_SEQ(c, stmt, s->v.If.orelse);
Georg Brandlddbaa662006-06-04 21:56:52 +00001598 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001599 compiler_use_next_block(c, end);
1600 return 1;
1601}
1602
1603static int
1604compiler_for(struct compiler *c, stmt_ty s)
1605{
1606 basicblock *start, *cleanup, *end;
1607
1608 start = compiler_new_block(c);
1609 cleanup = compiler_new_block(c);
1610 end = compiler_new_block(c);
1611 if (start == NULL || end == NULL || cleanup == NULL)
1612 return 0;
1613 ADDOP_JREL(c, SETUP_LOOP, end);
1614 if (!compiler_push_fblock(c, LOOP, start))
1615 return 0;
1616 VISIT(c, expr, s->v.For.iter);
1617 ADDOP(c, GET_ITER);
1618 compiler_use_next_block(c, start);
Amaury Forgeot d'Arc6fd03bb2008-02-04 21:45:05 +00001619 /* for expressions must be traced on each iteration,
1620 so we need to set an extra line number. */
Neal Norwitz4ffedad2006-08-04 04:58:47 +00001621 c->u->u_lineno_set = false;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001622 ADDOP_JREL(c, FOR_ITER, cleanup);
1623 VISIT(c, expr, s->v.For.target);
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001624 VISIT_SEQ(c, stmt, s->v.For.body);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001625 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
1626 compiler_use_next_block(c, cleanup);
1627 ADDOP(c, POP_BLOCK);
1628 compiler_pop_fblock(c, LOOP, start);
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001629 VISIT_SEQ(c, stmt, s->v.For.orelse);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001630 compiler_use_next_block(c, end);
1631 return 1;
1632}
1633
1634static int
1635compiler_while(struct compiler *c, stmt_ty s)
1636{
1637 basicblock *loop, *orelse, *end, *anchor = NULL;
1638 int constant = expr_constant(s->v.While.test);
1639
Amaury Forgeot d'Arc16570f52008-01-24 22:51:18 +00001640 if (constant == 0) {
1641 if (s->v.While.orelse)
1642 VISIT_SEQ(c, stmt, s->v.While.orelse);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001643 return 1;
Amaury Forgeot d'Arc16570f52008-01-24 22:51:18 +00001644 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001645 loop = compiler_new_block(c);
1646 end = compiler_new_block(c);
1647 if (constant == -1) {
1648 anchor = compiler_new_block(c);
1649 if (anchor == NULL)
1650 return 0;
1651 }
1652 if (loop == NULL || end == NULL)
1653 return 0;
1654 if (s->v.While.orelse) {
1655 orelse = compiler_new_block(c);
1656 if (orelse == NULL)
1657 return 0;
1658 }
1659 else
1660 orelse = NULL;
1661
1662 ADDOP_JREL(c, SETUP_LOOP, end);
Nick Coghlanb90f52e2007-08-25 04:35:54 +00001663 compiler_use_next_block(c, loop);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001664 if (!compiler_push_fblock(c, LOOP, loop))
1665 return 0;
1666 if (constant == -1) {
Amaury Forgeot d'Arc6fd03bb2008-02-04 21:45:05 +00001667 /* while expressions must be traced on each iteration,
1668 so we need to set an extra line number. */
1669 c->u->u_lineno_set = false;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001670 VISIT(c, expr, s->v.While.test);
1671 ADDOP_JREL(c, JUMP_IF_FALSE, anchor);
1672 ADDOP(c, POP_TOP);
1673 }
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001674 VISIT_SEQ(c, stmt, s->v.While.body);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001675 ADDOP_JABS(c, JUMP_ABSOLUTE, loop);
1676
1677 /* XXX should the two POP instructions be in a separate block
1678 if there is no else clause ?
1679 */
1680
1681 if (constant == -1) {
1682 compiler_use_next_block(c, anchor);
1683 ADDOP(c, POP_TOP);
1684 ADDOP(c, POP_BLOCK);
1685 }
1686 compiler_pop_fblock(c, LOOP, loop);
Jeremy Hylton12603c42006-04-01 16:18:02 +00001687 if (orelse != NULL) /* what if orelse is just pass? */
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001688 VISIT_SEQ(c, stmt, s->v.While.orelse);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001689 compiler_use_next_block(c, end);
1690
1691 return 1;
1692}
1693
1694static int
1695compiler_continue(struct compiler *c)
1696{
1697 static const char LOOP_ERROR_MSG[] = "'continue' not properly in loop";
Neal Norwitz4f096d92006-08-21 19:47:08 +00001698 static const char IN_FINALLY_ERROR_MSG[] =
1699 "'continue' not supported inside 'finally' clause";
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001700 int i;
1701
1702 if (!c->u->u_nfblocks)
1703 return compiler_error(c, LOOP_ERROR_MSG);
1704 i = c->u->u_nfblocks - 1;
1705 switch (c->u->u_fblock[i].fb_type) {
1706 case LOOP:
1707 ADDOP_JABS(c, JUMP_ABSOLUTE, c->u->u_fblock[i].fb_block);
1708 break;
1709 case EXCEPT:
1710 case FINALLY_TRY:
Neal Norwitz4f096d92006-08-21 19:47:08 +00001711 while (--i >= 0 && c->u->u_fblock[i].fb_type != LOOP) {
1712 /* Prevent continue anywhere under a finally
1713 even if hidden in a sub-try or except. */
1714 if (c->u->u_fblock[i].fb_type == FINALLY_END)
1715 return compiler_error(c, IN_FINALLY_ERROR_MSG);
1716 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001717 if (i == -1)
1718 return compiler_error(c, LOOP_ERROR_MSG);
1719 ADDOP_JABS(c, CONTINUE_LOOP, c->u->u_fblock[i].fb_block);
1720 break;
1721 case FINALLY_END:
Neal Norwitz4f096d92006-08-21 19:47:08 +00001722 return compiler_error(c, IN_FINALLY_ERROR_MSG);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001723 }
1724
1725 return 1;
1726}
1727
1728/* Code generated for "try: <body> finally: <finalbody>" is as follows:
1729
1730 SETUP_FINALLY L
1731 <code for body>
1732 POP_BLOCK
1733 LOAD_CONST <None>
1734 L: <code for finalbody>
1735 END_FINALLY
1736
1737 The special instructions use the block stack. Each block
1738 stack entry contains the instruction that created it (here
1739 SETUP_FINALLY), the level of the value stack at the time the
1740 block stack entry was created, and a label (here L).
1741
1742 SETUP_FINALLY:
1743 Pushes the current value stack level and the label
1744 onto the block stack.
1745 POP_BLOCK:
1746 Pops en entry from the block stack, and pops the value
1747 stack until its level is the same as indicated on the
1748 block stack. (The label is ignored.)
1749 END_FINALLY:
1750 Pops a variable number of entries from the *value* stack
1751 and re-raises the exception they specify. The number of
1752 entries popped depends on the (pseudo) exception type.
1753
1754 The block stack is unwound when an exception is raised:
1755 when a SETUP_FINALLY entry is found, the exception is pushed
1756 onto the value stack (and the exception condition is cleared),
1757 and the interpreter jumps to the label gotten from the block
1758 stack.
1759*/
1760
1761static int
1762compiler_try_finally(struct compiler *c, stmt_ty s)
1763{
1764 basicblock *body, *end;
1765 body = compiler_new_block(c);
1766 end = compiler_new_block(c);
1767 if (body == NULL || end == NULL)
1768 return 0;
1769
1770 ADDOP_JREL(c, SETUP_FINALLY, end);
1771 compiler_use_next_block(c, body);
1772 if (!compiler_push_fblock(c, FINALLY_TRY, body))
1773 return 0;
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001774 VISIT_SEQ(c, stmt, s->v.TryFinally.body);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001775 ADDOP(c, POP_BLOCK);
1776 compiler_pop_fblock(c, FINALLY_TRY, body);
1777
1778 ADDOP_O(c, LOAD_CONST, Py_None, consts);
1779 compiler_use_next_block(c, end);
1780 if (!compiler_push_fblock(c, FINALLY_END, end))
1781 return 0;
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001782 VISIT_SEQ(c, stmt, s->v.TryFinally.finalbody);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001783 ADDOP(c, END_FINALLY);
1784 compiler_pop_fblock(c, FINALLY_END, end);
1785
1786 return 1;
1787}
1788
1789/*
1790 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
1791 (The contents of the value stack is shown in [], with the top
1792 at the right; 'tb' is trace-back info, 'val' the exception's
1793 associated value, and 'exc' the exception.)
1794
1795 Value stack Label Instruction Argument
1796 [] SETUP_EXCEPT L1
1797 [] <code for S>
1798 [] POP_BLOCK
1799 [] JUMP_FORWARD L0
1800
1801 [tb, val, exc] L1: DUP )
1802 [tb, val, exc, exc] <evaluate E1> )
1803 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
1804 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
1805 [tb, val, exc, 1] POP )
1806 [tb, val, exc] POP
1807 [tb, val] <assign to V1> (or POP if no V1)
1808 [tb] POP
1809 [] <code for S1>
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001810 JUMP_FORWARD L0
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001811
1812 [tb, val, exc, 0] L2: POP
1813 [tb, val, exc] DUP
1814 .............................etc.......................
1815
1816 [tb, val, exc, 0] Ln+1: POP
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001817 [tb, val, exc] END_FINALLY # re-raise exception
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001818
1819 [] L0: <next statement>
1820
1821 Of course, parts are not generated if Vi or Ei is not present.
1822*/
1823static int
1824compiler_try_except(struct compiler *c, stmt_ty s)
1825{
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001826 basicblock *body, *orelse, *except, *end;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001827 int i, n;
1828
1829 body = compiler_new_block(c);
1830 except = compiler_new_block(c);
1831 orelse = compiler_new_block(c);
1832 end = compiler_new_block(c);
1833 if (body == NULL || except == NULL || orelse == NULL || end == NULL)
1834 return 0;
1835 ADDOP_JREL(c, SETUP_EXCEPT, except);
1836 compiler_use_next_block(c, body);
1837 if (!compiler_push_fblock(c, EXCEPT, body))
1838 return 0;
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001839 VISIT_SEQ(c, stmt, s->v.TryExcept.body);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001840 ADDOP(c, POP_BLOCK);
1841 compiler_pop_fblock(c, EXCEPT, body);
1842 ADDOP_JREL(c, JUMP_FORWARD, orelse);
1843 n = asdl_seq_LEN(s->v.TryExcept.handlers);
1844 compiler_use_next_block(c, except);
1845 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00001846 excepthandler_ty handler = (excepthandler_ty)asdl_seq_GET(
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001847 s->v.TryExcept.handlers, i);
1848 if (!handler->type && i < n-1)
1849 return compiler_error(c, "default 'except:' must be last");
Amaury Forgeot d'Arc6fd03bb2008-02-04 21:45:05 +00001850 c->u->u_lineno_set = false;
1851 c->u->u_lineno = handler->lineno;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001852 except = compiler_new_block(c);
1853 if (except == NULL)
1854 return 0;
1855 if (handler->type) {
1856 ADDOP(c, DUP_TOP);
1857 VISIT(c, expr, handler->type);
1858 ADDOP_I(c, COMPARE_OP, PyCmp_EXC_MATCH);
1859 ADDOP_JREL(c, JUMP_IF_FALSE, except);
1860 ADDOP(c, POP_TOP);
1861 }
1862 ADDOP(c, POP_TOP);
1863 if (handler->name) {
1864 VISIT(c, expr, handler->name);
1865 }
1866 else {
1867 ADDOP(c, POP_TOP);
1868 }
1869 ADDOP(c, POP_TOP);
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001870 VISIT_SEQ(c, stmt, handler->body);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001871 ADDOP_JREL(c, JUMP_FORWARD, end);
1872 compiler_use_next_block(c, except);
1873 if (handler->type)
1874 ADDOP(c, POP_TOP);
1875 }
1876 ADDOP(c, END_FINALLY);
1877 compiler_use_next_block(c, orelse);
Anthony Baxter2c33fc72006-04-12 00:43:09 +00001878 VISIT_SEQ(c, stmt, s->v.TryExcept.orelse);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001879 compiler_use_next_block(c, end);
1880 return 1;
1881}
1882
1883static int
1884compiler_import_as(struct compiler *c, identifier name, identifier asname)
1885{
1886 /* The IMPORT_NAME opcode was already generated. This function
1887 merely needs to bind the result to a name.
1888
1889 If there is a dot in name, we need to split it and emit a
1890 LOAD_ATTR for each name.
1891 */
1892 const char *src = PyString_AS_STRING(name);
1893 const char *dot = strchr(src, '.');
1894 if (dot) {
1895 /* Consume the base module name to get the first attribute */
1896 src = dot + 1;
1897 while (dot) {
1898 /* NB src is only defined when dot != NULL */
Armin Rigo31441302005-10-21 12:57:31 +00001899 PyObject *attr;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001900 dot = strchr(src, '.');
Armin Rigo31441302005-10-21 12:57:31 +00001901 attr = PyString_FromStringAndSize(src,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001902 dot ? dot - src : strlen(src));
Neal Norwitz7bcabc62005-11-20 23:58:38 +00001903 if (!attr)
1904 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001905 ADDOP_O(c, LOAD_ATTR, attr, names);
Neal Norwitz7bcabc62005-11-20 23:58:38 +00001906 Py_DECREF(attr);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001907 src = dot + 1;
1908 }
1909 }
1910 return compiler_nameop(c, asname, Store);
1911}
1912
1913static int
1914compiler_import(struct compiler *c, stmt_ty s)
1915{
1916 /* The Import node stores a module name like a.b.c as a single
1917 string. This is convenient for all cases except
1918 import a.b.c as d
1919 where we need to parse that string to extract the individual
1920 module names.
1921 XXX Perhaps change the representation to make this case simpler?
1922 */
1923 int i, n = asdl_seq_LEN(s->v.Import.names);
Thomas Woutersf7f438b2006-02-28 16:09:29 +00001924
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001925 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00001926 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.Import.names, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001927 int r;
Thomas Woutersf7f438b2006-02-28 16:09:29 +00001928 PyObject *level;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001929
Neal Norwitzcbce2802006-04-03 06:26:32 +00001930 if (c->c_flags && (c->c_flags->cf_flags & CO_FUTURE_ABSOLUTE_IMPORT))
Thomas Woutersf7f438b2006-02-28 16:09:29 +00001931 level = PyInt_FromLong(0);
1932 else
1933 level = PyInt_FromLong(-1);
1934
1935 if (level == NULL)
1936 return 0;
1937
1938 ADDOP_O(c, LOAD_CONST, level, consts);
1939 Py_DECREF(level);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001940 ADDOP_O(c, LOAD_CONST, Py_None, consts);
1941 ADDOP_NAME(c, IMPORT_NAME, alias->name, names);
1942
1943 if (alias->asname) {
Neil Schemenauerac699ef2005-10-23 03:45:42 +00001944 r = compiler_import_as(c, alias->name, alias->asname);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00001945 if (!r)
1946 return r;
1947 }
1948 else {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001949 identifier tmp = alias->name;
1950 const char *base = PyString_AS_STRING(alias->name);
1951 char *dot = strchr(base, '.');
1952 if (dot)
1953 tmp = PyString_FromStringAndSize(base,
1954 dot - base);
1955 r = compiler_nameop(c, tmp, Store);
1956 if (dot) {
1957 Py_DECREF(tmp);
1958 }
1959 if (!r)
1960 return r;
1961 }
1962 }
1963 return 1;
1964}
1965
1966static int
1967compiler_from_import(struct compiler *c, stmt_ty s)
1968{
1969 int i, n = asdl_seq_LEN(s->v.ImportFrom.names);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001970
1971 PyObject *names = PyTuple_New(n);
Thomas Woutersf7f438b2006-02-28 16:09:29 +00001972 PyObject *level;
1973
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001974 if (!names)
1975 return 0;
1976
Thomas Woutersf7f438b2006-02-28 16:09:29 +00001977 if (s->v.ImportFrom.level == 0 && c->c_flags &&
Neal Norwitzcbce2802006-04-03 06:26:32 +00001978 !(c->c_flags->cf_flags & CO_FUTURE_ABSOLUTE_IMPORT))
Thomas Woutersf7f438b2006-02-28 16:09:29 +00001979 level = PyInt_FromLong(-1);
1980 else
1981 level = PyInt_FromLong(s->v.ImportFrom.level);
1982
1983 if (!level) {
1984 Py_DECREF(names);
1985 return 0;
1986 }
1987
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001988 /* build up the names */
1989 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00001990 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001991 Py_INCREF(alias->name);
1992 PyTuple_SET_ITEM(names, i, alias->name);
1993 }
1994
1995 if (s->lineno > c->c_future->ff_lineno) {
1996 if (!strcmp(PyString_AS_STRING(s->v.ImportFrom.module),
1997 "__future__")) {
Neal Norwitzd9cf85f2006-03-02 08:08:42 +00001998 Py_DECREF(level);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001999 Py_DECREF(names);
2000 return compiler_error(c,
2001 "from __future__ imports must occur "
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002002 "at the beginning of the file");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002003
2004 }
2005 }
2006
Thomas Woutersf7f438b2006-02-28 16:09:29 +00002007 ADDOP_O(c, LOAD_CONST, level, consts);
2008 Py_DECREF(level);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002009 ADDOP_O(c, LOAD_CONST, names, consts);
Neal Norwitz3715c3e2005-11-24 22:09:18 +00002010 Py_DECREF(names);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002011 ADDOP_NAME(c, IMPORT_NAME, s->v.ImportFrom.module, names);
2012 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00002013 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002014 identifier store_name;
2015
2016 if (i == 0 && *PyString_AS_STRING(alias->name) == '*') {
2017 assert(n == 1);
2018 ADDOP(c, IMPORT_STAR);
Neal Norwitz28b32ac2005-12-06 07:41:30 +00002019 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002020 }
2021
2022 ADDOP_NAME(c, IMPORT_FROM, alias->name, names);
2023 store_name = alias->name;
2024 if (alias->asname)
2025 store_name = alias->asname;
2026
2027 if (!compiler_nameop(c, store_name, Store)) {
2028 Py_DECREF(names);
2029 return 0;
2030 }
2031 }
Neal Norwitz28b32ac2005-12-06 07:41:30 +00002032 /* remove imported module */
2033 ADDOP(c, POP_TOP);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002034 return 1;
2035}
2036
2037static int
2038compiler_assert(struct compiler *c, stmt_ty s)
2039{
2040 static PyObject *assertion_error = NULL;
2041 basicblock *end;
2042
2043 if (Py_OptimizeFlag)
2044 return 1;
2045 if (assertion_error == NULL) {
Christian Heimesd7e1b2b2008-01-28 02:07:53 +00002046 assertion_error = PyString_InternFromString("AssertionError");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002047 if (assertion_error == NULL)
2048 return 0;
2049 }
2050 VISIT(c, expr, s->v.Assert.test);
2051 end = compiler_new_block(c);
2052 if (end == NULL)
2053 return 0;
2054 ADDOP_JREL(c, JUMP_IF_TRUE, end);
2055 ADDOP(c, POP_TOP);
2056 ADDOP_O(c, LOAD_GLOBAL, assertion_error, names);
2057 if (s->v.Assert.msg) {
2058 VISIT(c, expr, s->v.Assert.msg);
2059 ADDOP_I(c, RAISE_VARARGS, 2);
2060 }
2061 else {
2062 ADDOP_I(c, RAISE_VARARGS, 1);
2063 }
Neal Norwitz51abbc72005-12-18 07:06:23 +00002064 compiler_use_next_block(c, end);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002065 ADDOP(c, POP_TOP);
2066 return 1;
2067}
2068
2069static int
2070compiler_visit_stmt(struct compiler *c, stmt_ty s)
2071{
2072 int i, n;
2073
Neal Norwitzf733a012006-10-29 18:30:10 +00002074 /* Always assign a lineno to the next instruction for a stmt. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002075 c->u->u_lineno = s->lineno;
2076 c->u->u_lineno_set = false;
Jeremy Hylton12603c42006-04-01 16:18:02 +00002077
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002078 switch (s->kind) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002079 case FunctionDef_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002080 return compiler_function(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002081 case ClassDef_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002082 return compiler_class(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002083 case Return_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002084 if (c->u->u_ste->ste_type != FunctionBlock)
2085 return compiler_error(c, "'return' outside function");
2086 if (s->v.Return.value) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002087 VISIT(c, expr, s->v.Return.value);
2088 }
2089 else
2090 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2091 ADDOP(c, RETURN_VALUE);
2092 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002093 case Delete_kind:
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002094 VISIT_SEQ(c, expr, s->v.Delete.targets)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002095 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002096 case Assign_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002097 n = asdl_seq_LEN(s->v.Assign.targets);
2098 VISIT(c, expr, s->v.Assign.value);
2099 for (i = 0; i < n; i++) {
2100 if (i < n - 1)
2101 ADDOP(c, DUP_TOP);
2102 VISIT(c, expr,
2103 (expr_ty)asdl_seq_GET(s->v.Assign.targets, i));
2104 }
2105 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002106 case AugAssign_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002107 return compiler_augassign(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002108 case Print_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002109 return compiler_print(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002110 case For_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002111 return compiler_for(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002112 case While_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002113 return compiler_while(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002114 case If_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002115 return compiler_if(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002116 case Raise_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002117 n = 0;
2118 if (s->v.Raise.type) {
2119 VISIT(c, expr, s->v.Raise.type);
2120 n++;
2121 if (s->v.Raise.inst) {
2122 VISIT(c, expr, s->v.Raise.inst);
2123 n++;
2124 if (s->v.Raise.tback) {
2125 VISIT(c, expr, s->v.Raise.tback);
2126 n++;
2127 }
2128 }
2129 }
2130 ADDOP_I(c, RAISE_VARARGS, n);
2131 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002132 case TryExcept_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002133 return compiler_try_except(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002134 case TryFinally_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002135 return compiler_try_finally(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002136 case Assert_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002137 return compiler_assert(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002138 case Import_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002139 return compiler_import(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002140 case ImportFrom_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002141 return compiler_from_import(c, s);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002142 case Exec_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002143 VISIT(c, expr, s->v.Exec.body);
2144 if (s->v.Exec.globals) {
2145 VISIT(c, expr, s->v.Exec.globals);
2146 if (s->v.Exec.locals) {
2147 VISIT(c, expr, s->v.Exec.locals);
2148 } else {
2149 ADDOP(c, DUP_TOP);
2150 }
2151 } else {
2152 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2153 ADDOP(c, DUP_TOP);
2154 }
2155 ADDOP(c, EXEC_STMT);
2156 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002157 case Global_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002158 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002159 case Expr_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002160 if (c->c_interactive && c->c_nestlevel <= 1) {
Neal Norwitz0cbd8052006-08-04 05:09:28 +00002161 VISIT(c, expr, s->v.Expr.value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002162 ADDOP(c, PRINT_EXPR);
2163 }
Neal Norwitz0cbd8052006-08-04 05:09:28 +00002164 else if (s->v.Expr.value->kind != Str_kind &&
2165 s->v.Expr.value->kind != Num_kind) {
2166 VISIT(c, expr, s->v.Expr.value);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002167 ADDOP(c, POP_TOP);
2168 }
2169 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002170 case Pass_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002171 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002172 case Break_kind:
Jeremy Hylton819de6c2007-02-27 16:13:23 +00002173 if (!compiler_in_loop(c))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002174 return compiler_error(c, "'break' outside loop");
2175 ADDOP(c, BREAK_LOOP);
2176 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002177 case Continue_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002178 return compiler_continue(c);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002179 case With_kind:
2180 return compiler_with(c, s);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002181 }
2182 return 1;
2183}
2184
2185static int
2186unaryop(unaryop_ty op)
2187{
2188 switch (op) {
2189 case Invert:
2190 return UNARY_INVERT;
2191 case Not:
2192 return UNARY_NOT;
2193 case UAdd:
2194 return UNARY_POSITIVE;
2195 case USub:
2196 return UNARY_NEGATIVE;
2197 }
2198 return 0;
2199}
2200
2201static int
2202binop(struct compiler *c, operator_ty op)
2203{
2204 switch (op) {
2205 case Add:
2206 return BINARY_ADD;
2207 case Sub:
2208 return BINARY_SUBTRACT;
2209 case Mult:
2210 return BINARY_MULTIPLY;
2211 case Div:
2212 if (c->c_flags && c->c_flags->cf_flags & CO_FUTURE_DIVISION)
2213 return BINARY_TRUE_DIVIDE;
2214 else
2215 return BINARY_DIVIDE;
2216 case Mod:
2217 return BINARY_MODULO;
2218 case Pow:
2219 return BINARY_POWER;
2220 case LShift:
2221 return BINARY_LSHIFT;
2222 case RShift:
2223 return BINARY_RSHIFT;
2224 case BitOr:
2225 return BINARY_OR;
2226 case BitXor:
2227 return BINARY_XOR;
2228 case BitAnd:
2229 return BINARY_AND;
2230 case FloorDiv:
2231 return BINARY_FLOOR_DIVIDE;
2232 }
2233 return 0;
2234}
2235
2236static int
2237cmpop(cmpop_ty op)
2238{
2239 switch (op) {
2240 case Eq:
2241 return PyCmp_EQ;
2242 case NotEq:
2243 return PyCmp_NE;
2244 case Lt:
2245 return PyCmp_LT;
2246 case LtE:
2247 return PyCmp_LE;
2248 case Gt:
2249 return PyCmp_GT;
2250 case GtE:
2251 return PyCmp_GE;
2252 case Is:
2253 return PyCmp_IS;
2254 case IsNot:
2255 return PyCmp_IS_NOT;
2256 case In:
2257 return PyCmp_IN;
2258 case NotIn:
2259 return PyCmp_NOT_IN;
2260 }
2261 return PyCmp_BAD;
2262}
2263
2264static int
2265inplace_binop(struct compiler *c, operator_ty op)
2266{
2267 switch (op) {
2268 case Add:
2269 return INPLACE_ADD;
2270 case Sub:
2271 return INPLACE_SUBTRACT;
2272 case Mult:
2273 return INPLACE_MULTIPLY;
2274 case Div:
2275 if (c->c_flags && c->c_flags->cf_flags & CO_FUTURE_DIVISION)
2276 return INPLACE_TRUE_DIVIDE;
2277 else
2278 return INPLACE_DIVIDE;
2279 case Mod:
2280 return INPLACE_MODULO;
2281 case Pow:
2282 return INPLACE_POWER;
2283 case LShift:
2284 return INPLACE_LSHIFT;
2285 case RShift:
2286 return INPLACE_RSHIFT;
2287 case BitOr:
2288 return INPLACE_OR;
2289 case BitXor:
2290 return INPLACE_XOR;
2291 case BitAnd:
2292 return INPLACE_AND;
2293 case FloorDiv:
2294 return INPLACE_FLOOR_DIVIDE;
2295 }
Neal Norwitz4737b232005-11-19 23:58:29 +00002296 PyErr_Format(PyExc_SystemError,
Neal Norwitz4e6bf492005-12-18 05:32:41 +00002297 "inplace binary op %d should not be possible", op);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002298 return 0;
2299}
2300
2301static int
2302compiler_nameop(struct compiler *c, identifier name, expr_context_ty ctx)
2303{
Neil Schemenauerdad06a12005-10-23 18:52:36 +00002304 int op, scope, arg;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002305 enum { OP_FAST, OP_GLOBAL, OP_DEREF, OP_NAME } optype;
2306
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002307 PyObject *dict = c->u->u_names;
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002308 PyObject *mangled;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002309 /* XXX AugStore isn't used anywhere! */
2310
2311 /* First check for assignment to __debug__. Param? */
2312 if ((ctx == Store || ctx == AugStore || ctx == Del)
2313 && !strcmp(PyString_AS_STRING(name), "__debug__")) {
2314 return compiler_error(c, "can not assign to __debug__");
2315 }
2316
Jeremy Hylton37075c52007-02-27 01:01:59 +00002317mangled = _Py_Mangle(c->u->u_private, name);
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002318 if (!mangled)
2319 return 0;
2320
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002321 op = 0;
2322 optype = OP_NAME;
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002323 scope = PyST_GetScope(c->u->u_ste, mangled);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002324 switch (scope) {
2325 case FREE:
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002326 dict = c->u->u_freevars;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002327 optype = OP_DEREF;
2328 break;
2329 case CELL:
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002330 dict = c->u->u_cellvars;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002331 optype = OP_DEREF;
2332 break;
2333 case LOCAL:
2334 if (c->u->u_ste->ste_type == FunctionBlock)
2335 optype = OP_FAST;
2336 break;
2337 case GLOBAL_IMPLICIT:
Neil Schemenauerd403c452005-10-23 04:24:49 +00002338 if (c->u->u_ste->ste_type == FunctionBlock &&
2339 !c->u->u_ste->ste_unoptimized)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002340 optype = OP_GLOBAL;
2341 break;
2342 case GLOBAL_EXPLICIT:
2343 optype = OP_GLOBAL;
2344 break;
Neal Norwitz4e6bf492005-12-18 05:32:41 +00002345 default:
2346 /* scope can be 0 */
2347 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002348 }
2349
2350 /* XXX Leave assert here, but handle __doc__ and the like better */
2351 assert(scope || PyString_AS_STRING(name)[0] == '_');
2352
2353 switch (optype) {
2354 case OP_DEREF:
2355 switch (ctx) {
2356 case Load: op = LOAD_DEREF; break;
2357 case Store: op = STORE_DEREF; break;
2358 case AugLoad:
2359 case AugStore:
2360 break;
2361 case Del:
2362 PyErr_Format(PyExc_SyntaxError,
2363 "can not delete variable '%s' referenced "
2364 "in nested scope",
2365 PyString_AS_STRING(name));
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002366 Py_DECREF(mangled);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002367 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002368 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 deref variable");
2372 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002373 }
2374 break;
2375 case OP_FAST:
2376 switch (ctx) {
2377 case Load: op = LOAD_FAST; break;
2378 case Store: op = STORE_FAST; break;
2379 case Del: op = DELETE_FAST; break;
2380 case AugLoad:
2381 case AugStore:
2382 break;
2383 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00002384 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00002385 PyErr_SetString(PyExc_SystemError,
2386 "param invalid for local variable");
2387 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002388 }
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002389 ADDOP_O(c, op, mangled, varnames);
2390 Py_DECREF(mangled);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002391 return 1;
2392 case OP_GLOBAL:
2393 switch (ctx) {
2394 case Load: op = LOAD_GLOBAL; break;
2395 case Store: op = STORE_GLOBAL; break;
2396 case Del: op = DELETE_GLOBAL; break;
2397 case AugLoad:
2398 case AugStore:
2399 break;
2400 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00002401 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00002402 PyErr_SetString(PyExc_SystemError,
2403 "param invalid for global variable");
2404 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002405 }
2406 break;
2407 case OP_NAME:
2408 switch (ctx) {
2409 case Load: op = LOAD_NAME; break;
2410 case Store: op = STORE_NAME; break;
2411 case Del: op = DELETE_NAME; break;
2412 case AugLoad:
2413 case AugStore:
2414 break;
2415 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00002416 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00002417 PyErr_SetString(PyExc_SystemError,
2418 "param invalid for name variable");
2419 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002420 }
2421 break;
2422 }
2423
2424 assert(op);
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002425 arg = compiler_add_o(c, dict, mangled);
Neal Norwitz4737b232005-11-19 23:58:29 +00002426 Py_DECREF(mangled);
Neil Schemenauer8b528b22005-10-23 18:37:42 +00002427 if (arg < 0)
2428 return 0;
Neil Schemenauerdad06a12005-10-23 18:52:36 +00002429 return compiler_addop_i(c, op, arg);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002430}
2431
2432static int
2433compiler_boolop(struct compiler *c, expr_ty e)
2434{
2435 basicblock *end;
2436 int jumpi, i, n;
2437 asdl_seq *s;
2438
2439 assert(e->kind == BoolOp_kind);
2440 if (e->v.BoolOp.op == And)
2441 jumpi = JUMP_IF_FALSE;
2442 else
2443 jumpi = JUMP_IF_TRUE;
2444 end = compiler_new_block(c);
Martin v. Löwis94962612006-01-02 21:15:05 +00002445 if (end == NULL)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002446 return 0;
2447 s = e->v.BoolOp.values;
2448 n = asdl_seq_LEN(s) - 1;
Neal Norwitzc173b482006-07-30 19:18:13 +00002449 assert(n >= 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002450 for (i = 0; i < n; ++i) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00002451 VISIT(c, expr, (expr_ty)asdl_seq_GET(s, i));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002452 ADDOP_JREL(c, jumpi, end);
2453 ADDOP(c, POP_TOP)
2454 }
Anthony Baxter7b782b62006-04-11 12:01:56 +00002455 VISIT(c, expr, (expr_ty)asdl_seq_GET(s, n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002456 compiler_use_next_block(c, end);
2457 return 1;
2458}
2459
2460static int
2461compiler_list(struct compiler *c, expr_ty e)
2462{
2463 int n = asdl_seq_LEN(e->v.List.elts);
2464 if (e->v.List.ctx == Store) {
2465 ADDOP_I(c, UNPACK_SEQUENCE, n);
2466 }
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002467 VISIT_SEQ(c, expr, e->v.List.elts);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002468 if (e->v.List.ctx == Load) {
2469 ADDOP_I(c, BUILD_LIST, n);
2470 }
2471 return 1;
2472}
2473
2474static int
2475compiler_tuple(struct compiler *c, expr_ty e)
2476{
2477 int n = asdl_seq_LEN(e->v.Tuple.elts);
2478 if (e->v.Tuple.ctx == Store) {
2479 ADDOP_I(c, UNPACK_SEQUENCE, n);
2480 }
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002481 VISIT_SEQ(c, expr, e->v.Tuple.elts);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002482 if (e->v.Tuple.ctx == Load) {
2483 ADDOP_I(c, BUILD_TUPLE, n);
2484 }
2485 return 1;
2486}
2487
2488static int
2489compiler_compare(struct compiler *c, expr_ty e)
2490{
2491 int i, n;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002492 basicblock *cleanup = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002493
2494 /* XXX the logic can be cleaned up for 1 or multiple comparisons */
2495 VISIT(c, expr, e->v.Compare.left);
2496 n = asdl_seq_LEN(e->v.Compare.ops);
2497 assert(n > 0);
2498 if (n > 1) {
2499 cleanup = compiler_new_block(c);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002500 if (cleanup == NULL)
2501 return 0;
Anthony Baxter7b782b62006-04-11 12:01:56 +00002502 VISIT(c, expr,
Jeremy Hylton819de6c2007-02-27 16:13:23 +00002503 (expr_ty)asdl_seq_GET(e->v.Compare.comparators, 0));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002504 }
2505 for (i = 1; i < n; i++) {
2506 ADDOP(c, DUP_TOP);
2507 ADDOP(c, ROT_THREE);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002508 ADDOP_I(c, COMPARE_OP,
Martin v. Löwis0cc56e52006-04-13 12:29:43 +00002509 cmpop((cmpop_ty)(asdl_seq_GET(
Jeremy Hylton819de6c2007-02-27 16:13:23 +00002510 e->v.Compare.ops, i - 1))));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002511 ADDOP_JREL(c, JUMP_IF_FALSE, cleanup);
2512 NEXT_BLOCK(c);
2513 ADDOP(c, POP_TOP);
2514 if (i < (n - 1))
Anthony Baxter7b782b62006-04-11 12:01:56 +00002515 VISIT(c, expr,
Jeremy Hylton819de6c2007-02-27 16:13:23 +00002516 (expr_ty)asdl_seq_GET(e->v.Compare.comparators, i));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002517 }
Anthony Baxter7b782b62006-04-11 12:01:56 +00002518 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, n - 1));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002519 ADDOP_I(c, COMPARE_OP,
Martin v. Löwis0cc56e52006-04-13 12:29:43 +00002520 cmpop((cmpop_ty)(asdl_seq_GET(e->v.Compare.ops, n - 1))));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002521 if (n > 1) {
2522 basicblock *end = compiler_new_block(c);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002523 if (end == NULL)
2524 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002525 ADDOP_JREL(c, JUMP_FORWARD, end);
2526 compiler_use_next_block(c, cleanup);
2527 ADDOP(c, ROT_TWO);
2528 ADDOP(c, POP_TOP);
2529 compiler_use_next_block(c, end);
2530 }
2531 return 1;
2532}
2533
2534static int
2535compiler_call(struct compiler *c, expr_ty e)
2536{
2537 int n, code = 0;
2538
2539 VISIT(c, expr, e->v.Call.func);
2540 n = asdl_seq_LEN(e->v.Call.args);
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002541 VISIT_SEQ(c, expr, e->v.Call.args);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002542 if (e->v.Call.keywords) {
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002543 VISIT_SEQ(c, keyword, e->v.Call.keywords);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002544 n |= asdl_seq_LEN(e->v.Call.keywords) << 8;
2545 }
2546 if (e->v.Call.starargs) {
2547 VISIT(c, expr, e->v.Call.starargs);
2548 code |= 1;
2549 }
2550 if (e->v.Call.kwargs) {
2551 VISIT(c, expr, e->v.Call.kwargs);
2552 code |= 2;
2553 }
2554 switch (code) {
2555 case 0:
2556 ADDOP_I(c, CALL_FUNCTION, n);
2557 break;
2558 case 1:
2559 ADDOP_I(c, CALL_FUNCTION_VAR, n);
2560 break;
2561 case 2:
2562 ADDOP_I(c, CALL_FUNCTION_KW, n);
2563 break;
2564 case 3:
2565 ADDOP_I(c, CALL_FUNCTION_VAR_KW, n);
2566 break;
2567 }
2568 return 1;
2569}
2570
2571static int
2572compiler_listcomp_generator(struct compiler *c, PyObject *tmpname,
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002573 asdl_seq *generators, int gen_index,
2574 expr_ty elt)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002575{
2576 /* generate code for the iterator, then each of the ifs,
2577 and then write to the element */
2578
2579 comprehension_ty l;
2580 basicblock *start, *anchor, *skip, *if_cleanup;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002581 int i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002582
2583 start = compiler_new_block(c);
2584 skip = compiler_new_block(c);
2585 if_cleanup = compiler_new_block(c);
2586 anchor = compiler_new_block(c);
2587
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002588 if (start == NULL || skip == NULL || if_cleanup == NULL ||
2589 anchor == NULL)
2590 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002591
Anthony Baxter7b782b62006-04-11 12:01:56 +00002592 l = (comprehension_ty)asdl_seq_GET(generators, gen_index);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002593 VISIT(c, expr, l->iter);
2594 ADDOP(c, GET_ITER);
2595 compiler_use_next_block(c, start);
2596 ADDOP_JREL(c, FOR_ITER, anchor);
2597 NEXT_BLOCK(c);
2598 VISIT(c, expr, l->target);
2599
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002600 /* XXX this needs to be cleaned up...a lot! */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002601 n = asdl_seq_LEN(l->ifs);
2602 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00002603 expr_ty e = (expr_ty)asdl_seq_GET(l->ifs, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002604 VISIT(c, expr, e);
2605 ADDOP_JREL(c, JUMP_IF_FALSE, if_cleanup);
2606 NEXT_BLOCK(c);
2607 ADDOP(c, POP_TOP);
2608 }
2609
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002610 if (++gen_index < asdl_seq_LEN(generators))
2611 if (!compiler_listcomp_generator(c, tmpname,
2612 generators, gen_index, elt))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002613 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002614
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002615 /* only append after the last for generator */
2616 if (gen_index >= asdl_seq_LEN(generators)) {
2617 if (!compiler_nameop(c, tmpname, Load))
2618 return 0;
2619 VISIT(c, expr, elt);
Neal Norwitz10be2ea2006-03-03 20:29:11 +00002620 ADDOP(c, LIST_APPEND);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002621
2622 compiler_use_next_block(c, skip);
2623 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002624 for (i = 0; i < n; i++) {
2625 ADDOP_I(c, JUMP_FORWARD, 1);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002626 if (i == 0)
2627 compiler_use_next_block(c, if_cleanup);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002628 ADDOP(c, POP_TOP);
2629 }
2630 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
2631 compiler_use_next_block(c, anchor);
Georg Brandl2c4fb8d2006-10-29 08:47:08 +00002632 /* delete the temporary list name added to locals */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002633 if (gen_index == 1)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002634 if (!compiler_nameop(c, tmpname, Del))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002635 return 0;
2636
2637 return 1;
2638}
2639
2640static int
2641compiler_listcomp(struct compiler *c, expr_ty e)
2642{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002643 identifier tmp;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002644 int rc = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002645 asdl_seq *generators = e->v.ListComp.generators;
2646
2647 assert(e->kind == ListComp_kind);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002648 tmp = compiler_new_tmpname(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002649 if (!tmp)
2650 return 0;
2651 ADDOP_I(c, BUILD_LIST, 0);
2652 ADDOP(c, DUP_TOP);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002653 if (compiler_nameop(c, tmp, Store))
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002654 rc = compiler_listcomp_generator(c, tmp, generators, 0,
2655 e->v.ListComp.elt);
2656 Py_DECREF(tmp);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002657 return rc;
2658}
2659
2660static int
2661compiler_genexp_generator(struct compiler *c,
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002662 asdl_seq *generators, int gen_index,
2663 expr_ty elt)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002664{
2665 /* generate code for the iterator, then each of the ifs,
2666 and then write to the element */
2667
2668 comprehension_ty ge;
2669 basicblock *start, *anchor, *skip, *if_cleanup, *end;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002670 int i, n;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002671
2672 start = compiler_new_block(c);
2673 skip = compiler_new_block(c);
2674 if_cleanup = compiler_new_block(c);
2675 anchor = compiler_new_block(c);
2676 end = compiler_new_block(c);
2677
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002678 if (start == NULL || skip == NULL || if_cleanup == NULL ||
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002679 anchor == NULL || end == NULL)
2680 return 0;
2681
Anthony Baxter7b782b62006-04-11 12:01:56 +00002682 ge = (comprehension_ty)asdl_seq_GET(generators, gen_index);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002683 ADDOP_JREL(c, SETUP_LOOP, end);
2684 if (!compiler_push_fblock(c, LOOP, start))
2685 return 0;
2686
2687 if (gen_index == 0) {
2688 /* Receive outermost iter as an implicit argument */
2689 c->u->u_argcount = 1;
2690 ADDOP_I(c, LOAD_FAST, 0);
2691 }
2692 else {
2693 /* Sub-iter - calculate on the fly */
2694 VISIT(c, expr, ge->iter);
2695 ADDOP(c, GET_ITER);
2696 }
2697 compiler_use_next_block(c, start);
2698 ADDOP_JREL(c, FOR_ITER, anchor);
2699 NEXT_BLOCK(c);
2700 VISIT(c, expr, ge->target);
2701
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002702 /* XXX this needs to be cleaned up...a lot! */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002703 n = asdl_seq_LEN(ge->ifs);
2704 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00002705 expr_ty e = (expr_ty)asdl_seq_GET(ge->ifs, i);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002706 VISIT(c, expr, e);
2707 ADDOP_JREL(c, JUMP_IF_FALSE, if_cleanup);
2708 NEXT_BLOCK(c);
2709 ADDOP(c, POP_TOP);
2710 }
2711
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002712 if (++gen_index < asdl_seq_LEN(generators))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002713 if (!compiler_genexp_generator(c, generators, gen_index, elt))
2714 return 0;
2715
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002716 /* only append after the last 'for' generator */
2717 if (gen_index >= asdl_seq_LEN(generators)) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002718 VISIT(c, expr, elt);
2719 ADDOP(c, YIELD_VALUE);
2720 ADDOP(c, POP_TOP);
2721
2722 compiler_use_next_block(c, skip);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002723 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002724 for (i = 0; i < n; i++) {
2725 ADDOP_I(c, JUMP_FORWARD, 1);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002726 if (i == 0)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002727 compiler_use_next_block(c, if_cleanup);
2728
2729 ADDOP(c, POP_TOP);
2730 }
2731 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
2732 compiler_use_next_block(c, anchor);
2733 ADDOP(c, POP_BLOCK);
2734 compiler_pop_fblock(c, LOOP, start);
2735 compiler_use_next_block(c, end);
2736
2737 return 1;
2738}
2739
2740static int
2741compiler_genexp(struct compiler *c, expr_ty e)
2742{
Nick Coghlan944d3eb2005-11-16 12:46:55 +00002743 static identifier name;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002744 PyCodeObject *co;
2745 expr_ty outermost_iter = ((comprehension_ty)
2746 (asdl_seq_GET(e->v.GeneratorExp.generators,
2747 0)))->iter;
2748
Nick Coghlan944d3eb2005-11-16 12:46:55 +00002749 if (!name) {
2750 name = PyString_FromString("<genexpr>");
2751 if (!name)
2752 return 0;
2753 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002754
2755 if (!compiler_enter_scope(c, name, (void *)e, e->lineno))
2756 return 0;
2757 compiler_genexp_generator(c, e->v.GeneratorExp.generators, 0,
2758 e->v.GeneratorExp.elt);
2759 co = assemble(c, 1);
Neil Schemenauerc396d9e2005-10-25 06:30:14 +00002760 compiler_exit_scope(c);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002761 if (co == NULL)
2762 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002763
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002764 compiler_make_closure(c, co, 0);
Neal Norwitz4737b232005-11-19 23:58:29 +00002765 Py_DECREF(co);
2766
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002767 VISIT(c, expr, outermost_iter);
2768 ADDOP(c, GET_ITER);
2769 ADDOP_I(c, CALL_FUNCTION, 1);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002770
2771 return 1;
2772}
2773
2774static int
2775compiler_visit_keyword(struct compiler *c, keyword_ty k)
2776{
2777 ADDOP_O(c, LOAD_CONST, k->arg, consts);
2778 VISIT(c, expr, k->value);
2779 return 1;
2780}
2781
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002782/* Test whether expression is constant. For constants, report
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002783 whether they are true or false.
2784
2785 Return values: 1 for true, 0 for false, -1 for non-constant.
2786 */
2787
2788static int
2789expr_constant(expr_ty e)
2790{
2791 switch (e->kind) {
2792 case Num_kind:
2793 return PyObject_IsTrue(e->v.Num.n);
2794 case Str_kind:
2795 return PyObject_IsTrue(e->v.Str.s);
Georg Brandlddbaa662006-06-04 21:56:52 +00002796 case Name_kind:
2797 /* __debug__ is not assignable, so we can optimize
2798 * it away in if and while statements */
2799 if (strcmp(PyString_AS_STRING(e->v.Name.id),
Jeremy Hylton819de6c2007-02-27 16:13:23 +00002800 "__debug__") == 0)
Georg Brandlddbaa662006-06-04 21:56:52 +00002801 return ! Py_OptimizeFlag;
2802 /* fall through */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002803 default:
2804 return -1;
2805 }
2806}
2807
Guido van Rossumc2e20742006-02-27 22:32:47 +00002808/*
2809 Implements the with statement from PEP 343.
2810
2811 The semantics outlined in that PEP are as follows:
2812
2813 with EXPR as VAR:
2814 BLOCK
2815
2816 It is implemented roughly as:
2817
Guido van Rossumda5b7012006-05-02 19:47:52 +00002818 context = EXPR
Guido van Rossumc2e20742006-02-27 22:32:47 +00002819 exit = context.__exit__ # not calling it
2820 value = context.__enter__()
2821 try:
2822 VAR = value # if VAR present in the syntax
2823 BLOCK
2824 finally:
2825 if an exception was raised:
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002826 exc = copy of (exception, instance, traceback)
Guido van Rossumc2e20742006-02-27 22:32:47 +00002827 else:
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002828 exc = (None, None, None)
Guido van Rossumc2e20742006-02-27 22:32:47 +00002829 exit(*exc)
2830 */
2831static int
2832compiler_with(struct compiler *c, stmt_ty s)
2833{
Guido van Rossumda5b7012006-05-02 19:47:52 +00002834 static identifier enter_attr, exit_attr;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002835 basicblock *block, *finally;
2836 identifier tmpexit, tmpvalue = NULL;
2837
2838 assert(s->kind == With_kind);
2839
Guido van Rossumc2e20742006-02-27 22:32:47 +00002840 if (!enter_attr) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002841 enter_attr = PyString_InternFromString("__enter__");
2842 if (!enter_attr)
2843 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002844 }
2845 if (!exit_attr) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002846 exit_attr = PyString_InternFromString("__exit__");
2847 if (!exit_attr)
2848 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002849 }
2850
2851 block = compiler_new_block(c);
2852 finally = compiler_new_block(c);
2853 if (!block || !finally)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002854 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002855
2856 /* Create a temporary variable to hold context.__exit__ */
2857 tmpexit = compiler_new_tmpname(c);
2858 if (tmpexit == NULL)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002859 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002860 PyArena_AddPyObject(c->c_arena, tmpexit);
2861
2862 if (s->v.With.optional_vars) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002863 /* Create a temporary variable to hold context.__enter__().
Guido van Rossumc2e20742006-02-27 22:32:47 +00002864 We need to do this rather than preserving it on the stack
2865 because SETUP_FINALLY remembers the stack level.
2866 We need to do the assignment *inside* the try/finally
2867 so that context.__exit__() is called when the assignment
2868 fails. But we need to call context.__enter__() *before*
2869 the try/finally so that if it fails we won't call
2870 context.__exit__().
2871 */
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002872 tmpvalue = compiler_new_tmpname(c);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002873 if (tmpvalue == NULL)
2874 return 0;
2875 PyArena_AddPyObject(c->c_arena, tmpvalue);
2876 }
2877
Guido van Rossumda5b7012006-05-02 19:47:52 +00002878 /* Evaluate EXPR */
Guido van Rossumc2e20742006-02-27 22:32:47 +00002879 VISIT(c, expr, s->v.With.context_expr);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002880
2881 /* Squirrel away context.__exit__ */
2882 ADDOP(c, DUP_TOP);
2883 ADDOP_O(c, LOAD_ATTR, exit_attr, names);
2884 if (!compiler_nameop(c, tmpexit, Store))
2885 return 0;
2886
2887 /* Call context.__enter__() */
2888 ADDOP_O(c, LOAD_ATTR, enter_attr, names);
2889 ADDOP_I(c, CALL_FUNCTION, 0);
2890
2891 if (s->v.With.optional_vars) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002892 /* Store it in tmpvalue */
2893 if (!compiler_nameop(c, tmpvalue, Store))
Guido van Rossumc2e20742006-02-27 22:32:47 +00002894 return 0;
2895 }
2896 else {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002897 /* Discard result from context.__enter__() */
2898 ADDOP(c, POP_TOP);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002899 }
2900
2901 /* Start the try block */
2902 ADDOP_JREL(c, SETUP_FINALLY, finally);
2903
2904 compiler_use_next_block(c, block);
2905 if (!compiler_push_fblock(c, FINALLY_TRY, block)) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002906 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002907 }
2908
2909 if (s->v.With.optional_vars) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002910 /* Bind saved result of context.__enter__() to VAR */
2911 if (!compiler_nameop(c, tmpvalue, Load) ||
Guido van Rossumc2e20742006-02-27 22:32:47 +00002912 !compiler_nameop(c, tmpvalue, Del))
2913 return 0;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002914 VISIT(c, expr, s->v.With.optional_vars);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002915 }
2916
2917 /* BLOCK code */
Anthony Baxter2c33fc72006-04-12 00:43:09 +00002918 VISIT_SEQ(c, stmt, s->v.With.body);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002919
2920 /* End of try block; start the finally block */
2921 ADDOP(c, POP_BLOCK);
2922 compiler_pop_fblock(c, FINALLY_TRY, block);
2923
2924 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2925 compiler_use_next_block(c, finally);
2926 if (!compiler_push_fblock(c, FINALLY_END, finally))
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002927 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002928
2929 /* Finally block starts; push tmpexit and issue our magic opcode. */
2930 if (!compiler_nameop(c, tmpexit, Load) ||
2931 !compiler_nameop(c, tmpexit, Del))
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002932 return 0;
Guido van Rossumc2e20742006-02-27 22:32:47 +00002933 ADDOP(c, WITH_CLEANUP);
Guido van Rossumc2e20742006-02-27 22:32:47 +00002934
2935 /* Finally block ends. */
2936 ADDOP(c, END_FINALLY);
2937 compiler_pop_fblock(c, FINALLY_END, finally);
2938 return 1;
2939}
2940
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002941static int
2942compiler_visit_expr(struct compiler *c, expr_ty e)
2943{
2944 int i, n;
2945
Neal Norwitzf733a012006-10-29 18:30:10 +00002946 /* If expr e has a different line number than the last expr/stmt,
Jeremy Hylton819de6c2007-02-27 16:13:23 +00002947 set a new line number for the next instruction.
2948 */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002949 if (e->lineno > c->u->u_lineno) {
2950 c->u->u_lineno = e->lineno;
2951 c->u->u_lineno_set = false;
2952 }
2953 switch (e->kind) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002954 case BoolOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002955 return compiler_boolop(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002956 case BinOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002957 VISIT(c, expr, e->v.BinOp.left);
2958 VISIT(c, expr, e->v.BinOp.right);
2959 ADDOP(c, binop(c, e->v.BinOp.op));
2960 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002961 case UnaryOp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002962 VISIT(c, expr, e->v.UnaryOp.operand);
2963 ADDOP(c, unaryop(e->v.UnaryOp.op));
2964 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002965 case Lambda_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002966 return compiler_lambda(c, e);
Thomas Woutersdca3b9c2006-02-27 00:24:13 +00002967 case IfExp_kind:
2968 return compiler_ifexp(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002969 case Dict_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002970 n = asdl_seq_LEN(e->v.Dict.values);
Raymond Hettinger70fcfd02007-12-19 22:14:34 +00002971 ADDOP_I(c, BUILD_MAP, (n>0xFFFF ? 0xFFFF : n));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002972 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00002973 VISIT(c, expr,
Jeremy Hylton819de6c2007-02-27 16:13:23 +00002974 (expr_ty)asdl_seq_GET(e->v.Dict.values, i));
Anthony Baxter7b782b62006-04-11 12:01:56 +00002975 VISIT(c, expr,
Jeremy Hylton819de6c2007-02-27 16:13:23 +00002976 (expr_ty)asdl_seq_GET(e->v.Dict.keys, i));
Raymond Hettingereffde122007-12-18 18:26:18 +00002977 ADDOP(c, STORE_MAP);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002978 }
2979 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002980 case ListComp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002981 return compiler_listcomp(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002982 case GeneratorExp_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002983 return compiler_genexp(c, e);
2984 case Yield_kind:
2985 if (c->u->u_ste->ste_type != FunctionBlock)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002986 return compiler_error(c, "'yield' outside function");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002987 if (e->v.Yield.value) {
2988 VISIT(c, expr, e->v.Yield.value);
2989 }
2990 else {
2991 ADDOP_O(c, LOAD_CONST, Py_None, consts);
2992 }
2993 ADDOP(c, YIELD_VALUE);
2994 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002995 case Compare_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002996 return compiler_compare(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002997 case Call_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002998 return compiler_call(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00002999 case Repr_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003000 VISIT(c, expr, e->v.Repr.value);
3001 ADDOP(c, UNARY_CONVERT);
3002 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003003 case Num_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003004 ADDOP_O(c, LOAD_CONST, e->v.Num.n, consts);
3005 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003006 case Str_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003007 ADDOP_O(c, LOAD_CONST, e->v.Str.s, consts);
3008 break;
3009 /* The following exprs can be assignment targets. */
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003010 case Attribute_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003011 if (e->v.Attribute.ctx != AugStore)
3012 VISIT(c, expr, e->v.Attribute.value);
3013 switch (e->v.Attribute.ctx) {
3014 case AugLoad:
3015 ADDOP(c, DUP_TOP);
3016 /* Fall through to load */
3017 case Load:
3018 ADDOP_NAME(c, LOAD_ATTR, e->v.Attribute.attr, names);
3019 break;
3020 case AugStore:
3021 ADDOP(c, ROT_TWO);
3022 /* Fall through to save */
3023 case Store:
3024 ADDOP_NAME(c, STORE_ATTR, e->v.Attribute.attr, names);
3025 break;
3026 case Del:
3027 ADDOP_NAME(c, DELETE_ATTR, e->v.Attribute.attr, names);
3028 break;
3029 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003030 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00003031 PyErr_SetString(PyExc_SystemError,
3032 "param invalid in attribute expression");
3033 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003034 }
3035 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003036 case Subscript_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003037 switch (e->v.Subscript.ctx) {
3038 case AugLoad:
3039 VISIT(c, expr, e->v.Subscript.value);
3040 VISIT_SLICE(c, e->v.Subscript.slice, AugLoad);
3041 break;
3042 case Load:
3043 VISIT(c, expr, e->v.Subscript.value);
3044 VISIT_SLICE(c, e->v.Subscript.slice, Load);
3045 break;
3046 case AugStore:
3047 VISIT_SLICE(c, e->v.Subscript.slice, AugStore);
3048 break;
3049 case Store:
3050 VISIT(c, expr, e->v.Subscript.value);
3051 VISIT_SLICE(c, e->v.Subscript.slice, Store);
3052 break;
3053 case Del:
3054 VISIT(c, expr, e->v.Subscript.value);
3055 VISIT_SLICE(c, e->v.Subscript.slice, Del);
3056 break;
3057 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003058 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00003059 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003060 "param invalid in subscript expression");
Neal Norwitz4737b232005-11-19 23:58:29 +00003061 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003062 }
3063 break;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003064 case Name_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003065 return compiler_nameop(c, e->v.Name.id, e->v.Name.ctx);
3066 /* child nodes of List and Tuple will have expr_context set */
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003067 case List_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003068 return compiler_list(c, e);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003069 case Tuple_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003070 return compiler_tuple(c, e);
3071 }
3072 return 1;
3073}
3074
3075static int
3076compiler_augassign(struct compiler *c, stmt_ty s)
3077{
3078 expr_ty e = s->v.AugAssign.target;
3079 expr_ty auge;
3080
3081 assert(s->kind == AugAssign_kind);
3082
3083 switch (e->kind) {
Neal Norwitz2585ad52006-06-12 02:09:34 +00003084 case Attribute_kind:
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003085 auge = Attribute(e->v.Attribute.value, e->v.Attribute.attr,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003086 AugLoad, e->lineno, e->col_offset, c->c_arena);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003087 if (auge == NULL)
3088 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003089 VISIT(c, expr, auge);
3090 VISIT(c, expr, s->v.AugAssign.value);
3091 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
3092 auge->v.Attribute.ctx = AugStore;
3093 VISIT(c, expr, auge);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003094 break;
3095 case Subscript_kind:
3096 auge = Subscript(e->v.Subscript.value, e->v.Subscript.slice,
Martin v. Löwis49c5da12006-03-01 22:49:05 +00003097 AugLoad, e->lineno, e->col_offset, c->c_arena);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003098 if (auge == NULL)
3099 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003100 VISIT(c, expr, auge);
3101 VISIT(c, expr, s->v.AugAssign.value);
3102 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003103 auge->v.Subscript.ctx = AugStore;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003104 VISIT(c, expr, auge);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003105 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003106 case Name_kind:
Neil Schemenauer0e07b602006-07-09 16:16:34 +00003107 if (!compiler_nameop(c, e->v.Name.id, Load))
3108 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003109 VISIT(c, expr, s->v.AugAssign.value);
3110 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
3111 return compiler_nameop(c, e->v.Name.id, Store);
3112 default:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003113 PyErr_Format(PyExc_SystemError,
3114 "invalid node type (%d) for augmented assignment",
3115 e->kind);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003116 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003117 }
3118 return 1;
3119}
3120
3121static int
3122compiler_push_fblock(struct compiler *c, enum fblocktype t, basicblock *b)
3123{
3124 struct fblockinfo *f;
Neal Norwitz21997af2006-10-28 21:19:07 +00003125 if (c->u->u_nfblocks >= CO_MAXBLOCKS) {
3126 PyErr_SetString(PyExc_SystemError,
3127 "too many statically nested blocks");
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003128 return 0;
Neal Norwitz21997af2006-10-28 21:19:07 +00003129 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003130 f = &c->u->u_fblock[c->u->u_nfblocks++];
3131 f->fb_type = t;
3132 f->fb_block = b;
3133 return 1;
3134}
3135
3136static void
3137compiler_pop_fblock(struct compiler *c, enum fblocktype t, basicblock *b)
3138{
3139 struct compiler_unit *u = c->u;
3140 assert(u->u_nfblocks > 0);
3141 u->u_nfblocks--;
3142 assert(u->u_fblock[u->u_nfblocks].fb_type == t);
3143 assert(u->u_fblock[u->u_nfblocks].fb_block == b);
3144}
3145
Jeremy Hylton82271f12006-10-04 02:24:52 +00003146static int
3147compiler_in_loop(struct compiler *c) {
Jeremy Hylton819de6c2007-02-27 16:13:23 +00003148 int i;
3149 struct compiler_unit *u = c->u;
3150 for (i = 0; i < u->u_nfblocks; ++i) {
3151 if (u->u_fblock[i].fb_type == LOOP)
3152 return 1;
3153 }
3154 return 0;
Jeremy Hylton82271f12006-10-04 02:24:52 +00003155}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003156/* Raises a SyntaxError and returns 0.
3157 If something goes wrong, a different exception may be raised.
3158*/
3159
3160static int
3161compiler_error(struct compiler *c, const char *errstr)
3162{
3163 PyObject *loc;
3164 PyObject *u = NULL, *v = NULL;
3165
3166 loc = PyErr_ProgramText(c->c_filename, c->u->u_lineno);
3167 if (!loc) {
3168 Py_INCREF(Py_None);
3169 loc = Py_None;
3170 }
3171 u = Py_BuildValue("(ziOO)", c->c_filename, c->u->u_lineno,
3172 Py_None, loc);
3173 if (!u)
3174 goto exit;
3175 v = Py_BuildValue("(zO)", errstr, u);
3176 if (!v)
3177 goto exit;
3178 PyErr_SetObject(PyExc_SyntaxError, v);
3179 exit:
3180 Py_DECREF(loc);
3181 Py_XDECREF(u);
3182 Py_XDECREF(v);
3183 return 0;
3184}
3185
3186static int
3187compiler_handle_subscr(struct compiler *c, const char *kind,
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003188 expr_context_ty ctx)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003189{
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003190 int op = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003191
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003192 /* XXX this code is duplicated */
3193 switch (ctx) {
3194 case AugLoad: /* fall through to Load */
3195 case Load: op = BINARY_SUBSCR; break;
3196 case AugStore:/* fall through to Store */
3197 case Store: op = STORE_SUBSCR; break;
3198 case Del: op = DELETE_SUBSCR; break;
3199 case Param:
3200 PyErr_Format(PyExc_SystemError,
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003201 "invalid %s kind %d in subscript\n",
3202 kind, ctx);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003203 return 0;
3204 }
3205 if (ctx == AugLoad) {
3206 ADDOP_I(c, DUP_TOPX, 2);
3207 }
3208 else if (ctx == AugStore) {
3209 ADDOP(c, ROT_THREE);
3210 }
3211 ADDOP(c, op);
3212 return 1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003213}
3214
3215static int
3216compiler_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)
3217{
3218 int n = 2;
3219 assert(s->kind == Slice_kind);
3220
3221 /* only handles the cases where BUILD_SLICE is emitted */
3222 if (s->v.Slice.lower) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003223 VISIT(c, expr, s->v.Slice.lower);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003224 }
3225 else {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003226 ADDOP_O(c, LOAD_CONST, Py_None, consts);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003227 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003228
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003229 if (s->v.Slice.upper) {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003230 VISIT(c, expr, s->v.Slice.upper);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003231 }
3232 else {
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003233 ADDOP_O(c, LOAD_CONST, Py_None, consts);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003234 }
3235
3236 if (s->v.Slice.step) {
3237 n++;
3238 VISIT(c, expr, s->v.Slice.step);
3239 }
3240 ADDOP_I(c, BUILD_SLICE, n);
3241 return 1;
3242}
3243
3244static int
3245compiler_simple_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)
3246{
3247 int op = 0, slice_offset = 0, stack_count = 0;
3248
3249 assert(s->v.Slice.step == NULL);
3250 if (s->v.Slice.lower) {
3251 slice_offset++;
3252 stack_count++;
3253 if (ctx != AugStore)
3254 VISIT(c, expr, s->v.Slice.lower);
3255 }
3256 if (s->v.Slice.upper) {
3257 slice_offset += 2;
3258 stack_count++;
3259 if (ctx != AugStore)
3260 VISIT(c, expr, s->v.Slice.upper);
3261 }
3262
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003263 if (ctx == AugLoad) {
3264 switch (stack_count) {
3265 case 0: ADDOP(c, DUP_TOP); break;
3266 case 1: ADDOP_I(c, DUP_TOPX, 2); break;
3267 case 2: ADDOP_I(c, DUP_TOPX, 3); break;
3268 }
3269 }
3270 else if (ctx == AugStore) {
3271 switch (stack_count) {
3272 case 0: ADDOP(c, ROT_TWO); break;
3273 case 1: ADDOP(c, ROT_THREE); break;
3274 case 2: ADDOP(c, ROT_FOUR); break;
3275 }
3276 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003277
3278 switch (ctx) {
3279 case AugLoad: /* fall through to Load */
3280 case Load: op = SLICE; break;
3281 case AugStore:/* fall through to Store */
3282 case Store: op = STORE_SLICE; break;
3283 case Del: op = DELETE_SLICE; break;
Neal Norwitz4737b232005-11-19 23:58:29 +00003284 case Param:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003285 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00003286 PyErr_SetString(PyExc_SystemError,
3287 "param invalid in simple slice");
3288 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003289 }
3290
3291 ADDOP(c, op + slice_offset);
3292 return 1;
3293}
3294
3295static int
3296compiler_visit_nested_slice(struct compiler *c, slice_ty s,
3297 expr_context_ty ctx)
3298{
3299 switch (s->kind) {
3300 case Ellipsis_kind:
3301 ADDOP_O(c, LOAD_CONST, Py_Ellipsis, consts);
3302 break;
3303 case Slice_kind:
3304 return compiler_slice(c, s, ctx);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003305 case Index_kind:
3306 VISIT(c, expr, s->v.Index.value);
3307 break;
3308 case ExtSlice_kind:
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003309 default:
Neal Norwitz4737b232005-11-19 23:58:29 +00003310 PyErr_SetString(PyExc_SystemError,
3311 "extended slice invalid in nested slice");
3312 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003313 }
3314 return 1;
3315}
3316
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003317static int
3318compiler_visit_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)
3319{
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003320 char * kindname = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003321 switch (s->kind) {
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003322 case Index_kind:
3323 kindname = "index";
3324 if (ctx != AugStore) {
3325 VISIT(c, expr, s->v.Index.value);
3326 }
3327 break;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003328 case Ellipsis_kind:
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003329 kindname = "ellipsis";
3330 if (ctx != AugStore) {
3331 ADDOP_O(c, LOAD_CONST, Py_Ellipsis, consts);
3332 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003333 break;
3334 case Slice_kind:
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003335 kindname = "slice";
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003336 if (!s->v.Slice.step)
3337 return compiler_simple_slice(c, s, ctx);
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003338 if (ctx != AugStore) {
3339 if (!compiler_slice(c, s, ctx))
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003340 return 0;
3341 }
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003342 break;
3343 case ExtSlice_kind:
3344 kindname = "extended slice";
3345 if (ctx != AugStore) {
3346 int i, n = asdl_seq_LEN(s->v.ExtSlice.dims);
3347 for (i = 0; i < n; i++) {
Anthony Baxter7b782b62006-04-11 12:01:56 +00003348 slice_ty sub = (slice_ty)asdl_seq_GET(
Jeremy Hylton819de6c2007-02-27 16:13:23 +00003349 s->v.ExtSlice.dims, i);
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003350 if (!compiler_visit_nested_slice(c, sub, ctx))
3351 return 0;
3352 }
3353 ADDOP_I(c, BUILD_TUPLE, n);
3354 }
3355 break;
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003356 default:
3357 PyErr_Format(PyExc_SystemError,
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003358 "invalid subscript kind %d", s->kind);
Neal Norwitz4e6bf492005-12-18 05:32:41 +00003359 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003360 }
Nick Coghlaneadee9a2006-03-13 12:31:58 +00003361 return compiler_handle_subscr(c, kindname, ctx);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003362}
3363
Neal Norwitzf733a012006-10-29 18:30:10 +00003364
3365/* End of the compiler section, beginning of the assembler section */
3366
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003367/* do depth-first search of basic block graph, starting with block.
3368 post records the block indices in post-order.
3369
3370 XXX must handle implicit jumps from one block to next
3371*/
3372
Neal Norwitzf733a012006-10-29 18:30:10 +00003373struct assembler {
3374 PyObject *a_bytecode; /* string containing bytecode */
3375 int a_offset; /* offset into bytecode */
3376 int a_nblocks; /* number of reachable blocks */
3377 basicblock **a_postorder; /* list of blocks in dfs postorder */
3378 PyObject *a_lnotab; /* string containing lnotab */
3379 int a_lnotab_off; /* offset into lnotab */
3380 int a_lineno; /* last lineno of emitted instruction */
3381 int a_lineno_off; /* bytecode offset of last lineno */
3382};
3383
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003384static void
3385dfs(struct compiler *c, basicblock *b, struct assembler *a)
3386{
3387 int i;
3388 struct instr *instr = NULL;
3389
3390 if (b->b_seen)
3391 return;
3392 b->b_seen = 1;
3393 if (b->b_next != NULL)
3394 dfs(c, b->b_next, a);
3395 for (i = 0; i < b->b_iused; i++) {
3396 instr = &b->b_instr[i];
3397 if (instr->i_jrel || instr->i_jabs)
3398 dfs(c, instr->i_target, a);
3399 }
3400 a->a_postorder[a->a_nblocks++] = b;
3401}
3402
Neal Norwitz2744c6c2005-11-13 01:08:38 +00003403static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003404stackdepth_walk(struct compiler *c, basicblock *b, int depth, int maxdepth)
3405{
3406 int i;
3407 struct instr *instr;
3408 if (b->b_seen || b->b_startdepth >= depth)
3409 return maxdepth;
3410 b->b_seen = 1;
3411 b->b_startdepth = depth;
3412 for (i = 0; i < b->b_iused; i++) {
3413 instr = &b->b_instr[i];
3414 depth += opcode_stack_effect(instr->i_opcode, instr->i_oparg);
3415 if (depth > maxdepth)
3416 maxdepth = depth;
3417 assert(depth >= 0); /* invalid code or bug in stackdepth() */
3418 if (instr->i_jrel || instr->i_jabs) {
3419 maxdepth = stackdepth_walk(c, instr->i_target,
3420 depth, maxdepth);
3421 if (instr->i_opcode == JUMP_ABSOLUTE ||
3422 instr->i_opcode == JUMP_FORWARD) {
3423 goto out; /* remaining code is dead */
3424 }
3425 }
3426 }
3427 if (b->b_next)
3428 maxdepth = stackdepth_walk(c, b->b_next, depth, maxdepth);
3429out:
3430 b->b_seen = 0;
3431 return maxdepth;
3432}
3433
3434/* Find the flow path that needs the largest stack. We assume that
3435 * cycles in the flow graph have no net effect on the stack depth.
3436 */
3437static int
3438stackdepth(struct compiler *c)
3439{
3440 basicblock *b, *entryblock;
3441 entryblock = NULL;
3442 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
3443 b->b_seen = 0;
3444 b->b_startdepth = INT_MIN;
3445 entryblock = b;
3446 }
Neal Norwitzf71847e2006-07-23 07:51:58 +00003447 if (!entryblock)
3448 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003449 return stackdepth_walk(c, entryblock, 0, 0);
3450}
3451
3452static int
3453assemble_init(struct assembler *a, int nblocks, int firstlineno)
3454{
3455 memset(a, 0, sizeof(struct assembler));
3456 a->a_lineno = firstlineno;
3457 a->a_bytecode = PyString_FromStringAndSize(NULL, DEFAULT_CODE_SIZE);
3458 if (!a->a_bytecode)
3459 return 0;
3460 a->a_lnotab = PyString_FromStringAndSize(NULL, DEFAULT_LNOTAB_SIZE);
3461 if (!a->a_lnotab)
3462 return 0;
3463 a->a_postorder = (basicblock **)PyObject_Malloc(
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003464 sizeof(basicblock *) * nblocks);
Neal Norwitz87b801c2005-12-18 04:42:47 +00003465 if (!a->a_postorder) {
3466 PyErr_NoMemory();
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003467 return 0;
Neal Norwitz87b801c2005-12-18 04:42:47 +00003468 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003469 return 1;
3470}
3471
3472static void
3473assemble_free(struct assembler *a)
3474{
3475 Py_XDECREF(a->a_bytecode);
3476 Py_XDECREF(a->a_lnotab);
3477 if (a->a_postorder)
3478 PyObject_Free(a->a_postorder);
3479}
3480
3481/* Return the size of a basic block in bytes. */
3482
3483static int
3484instrsize(struct instr *instr)
3485{
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003486 if (!instr->i_hasarg)
Raymond Hettingerdff1fd92007-12-20 01:25:05 +00003487 return 1; /* 1 byte for the opcode*/
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003488 if (instr->i_oparg > 0xffff)
Raymond Hettingerdff1fd92007-12-20 01:25:05 +00003489 return 6; /* 1 (opcode) + 1 (EXTENDED_ARG opcode) + 2 (oparg) + 2(oparg extended) */
3490 return 3; /* 1 (opcode) + 2 (oparg) */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003491}
3492
3493static int
3494blocksize(basicblock *b)
3495{
3496 int i;
3497 int size = 0;
3498
3499 for (i = 0; i < b->b_iused; i++)
3500 size += instrsize(&b->b_instr[i]);
3501 return size;
3502}
3503
3504/* All about a_lnotab.
3505
3506c_lnotab is an array of unsigned bytes disguised as a Python string.
3507It is used to map bytecode offsets to source code line #s (when needed
3508for tracebacks).
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003509
Tim Peters2a7f3842001-06-09 09:26:21 +00003510The array is conceptually a list of
3511 (bytecode offset increment, line number increment)
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003512pairs. The details are important and delicate, best illustrated by example:
Tim Peters2a7f3842001-06-09 09:26:21 +00003513
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003514 byte code offset source code line number
3515 0 1
3516 6 2
Tim Peters2a7f3842001-06-09 09:26:21 +00003517 50 7
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003518 350 307
3519 361 308
Tim Peters2a7f3842001-06-09 09:26:21 +00003520
3521The first trick is that these numbers aren't stored, only the increments
3522from one row to the next (this doesn't really work, but it's a start):
3523
3524 0, 1, 6, 1, 44, 5, 300, 300, 11, 1
3525
3526The second trick is that an unsigned byte can't hold negative values, or
3527values larger than 255, so (a) there's a deep assumption that byte code
3528offsets and their corresponding line #s both increase monotonically, and (b)
3529if at least one column jumps by more than 255 from one row to the next, more
3530than one pair is written to the table. In case #b, there's no way to know
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003531from looking at the table later how many were written. That's the delicate
Tim Peters2a7f3842001-06-09 09:26:21 +00003532part. A user of c_lnotab desiring to find the source line number
3533corresponding to a bytecode address A should do something like this
3534
3535 lineno = addr = 0
3536 for addr_incr, line_incr in c_lnotab:
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003537 addr += addr_incr
3538 if addr > A:
3539 return lineno
3540 lineno += line_incr
Tim Peters2a7f3842001-06-09 09:26:21 +00003541
3542In order for this to work, when the addr field increments by more than 255,
3543the line # increment in each pair generated must be 0 until the remaining addr
Neal Norwitz84be93b2006-07-16 01:50:38 +00003544increment is < 256. So, in the example above, assemble_lnotab (it used
3545to be called com_set_lineno) should not (as was actually done until 2.2)
3546expand 300, 300 to 255, 255, 45, 45,
Jeremy Hylton819de6c2007-02-27 16:13:23 +00003547 but to 255, 0, 45, 255, 0, 45.
Tim Peters2a7f3842001-06-09 09:26:21 +00003548*/
3549
Guido van Rossumf68d8e52001-04-14 17:55:09 +00003550static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003551assemble_lnotab(struct assembler *a, struct instr *i)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003552{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003553 int d_bytecode, d_lineno;
3554 int len;
Neal Norwitzb183a252006-04-10 01:03:32 +00003555 unsigned char *lnotab;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003556
3557 d_bytecode = a->a_offset - a->a_lineno_off;
3558 d_lineno = i->i_lineno - a->a_lineno;
3559
3560 assert(d_bytecode >= 0);
3561 assert(d_lineno >= 0);
3562
Amaury Forgeot d'Arc99af7db2008-02-05 00:26:21 +00003563 if(d_bytecode == 0 && d_lineno == 0)
3564 return 1;
3565
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003566 if (d_bytecode > 255) {
Neal Norwitz08b401f2006-01-07 21:24:09 +00003567 int j, nbytes, ncodes = d_bytecode / 255;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003568 nbytes = a->a_lnotab_off + 2 * ncodes;
3569 len = PyString_GET_SIZE(a->a_lnotab);
3570 if (nbytes >= len) {
3571 if (len * 2 < nbytes)
3572 len = nbytes;
Phillip J. Eby0d6615f2005-08-02 00:46:46 +00003573 else
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003574 len *= 2;
3575 if (_PyString_Resize(&a->a_lnotab, len) < 0)
3576 return 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003577 }
Neal Norwitzb183a252006-04-10 01:03:32 +00003578 lnotab = (unsigned char *)
3579 PyString_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
Neal Norwitz08b401f2006-01-07 21:24:09 +00003580 for (j = 0; j < ncodes; j++) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003581 *lnotab++ = 255;
3582 *lnotab++ = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003583 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003584 d_bytecode -= ncodes * 255;
3585 a->a_lnotab_off += ncodes * 2;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003586 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003587 assert(d_bytecode <= 255);
3588 if (d_lineno > 255) {
Neal Norwitz08b401f2006-01-07 21:24:09 +00003589 int j, nbytes, ncodes = d_lineno / 255;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003590 nbytes = a->a_lnotab_off + 2 * ncodes;
3591 len = PyString_GET_SIZE(a->a_lnotab);
3592 if (nbytes >= len) {
3593 if (len * 2 < nbytes)
3594 len = nbytes;
Guido van Rossum635abd21997-01-06 22:56:52 +00003595 else
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003596 len *= 2;
3597 if (_PyString_Resize(&a->a_lnotab, len) < 0)
3598 return 0;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003599 }
Neal Norwitzb183a252006-04-10 01:03:32 +00003600 lnotab = (unsigned char *)
3601 PyString_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003602 *lnotab++ = d_bytecode;
Neal Norwitz84be93b2006-07-16 01:50:38 +00003603 *lnotab++ = 255;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003604 d_bytecode = 0;
Neal Norwitz08b401f2006-01-07 21:24:09 +00003605 for (j = 1; j < ncodes; j++) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003606 *lnotab++ = 0;
Neal Norwitz84be93b2006-07-16 01:50:38 +00003607 *lnotab++ = 255;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003608 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003609 d_lineno -= ncodes * 255;
3610 a->a_lnotab_off += ncodes * 2;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003611 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003612
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003613 len = PyString_GET_SIZE(a->a_lnotab);
3614 if (a->a_lnotab_off + 2 >= len) {
3615 if (_PyString_Resize(&a->a_lnotab, len * 2) < 0)
Tim Peters51e26512001-09-07 08:45:55 +00003616 return 0;
Tim Peters51e26512001-09-07 08:45:55 +00003617 }
Neal Norwitzb183a252006-04-10 01:03:32 +00003618 lnotab = (unsigned char *)
3619 PyString_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
Tim Peters51e26512001-09-07 08:45:55 +00003620
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003621 a->a_lnotab_off += 2;
3622 if (d_bytecode) {
3623 *lnotab++ = d_bytecode;
3624 *lnotab++ = d_lineno;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00003625 }
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003626 else { /* First line of a block; def stmt, etc. */
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003627 *lnotab++ = 0;
3628 *lnotab++ = d_lineno;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003629 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003630 a->a_lineno = i->i_lineno;
3631 a->a_lineno_off = a->a_offset;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003632 return 1;
3633}
3634
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003635/* assemble_emit()
3636 Extend the bytecode with a new instruction.
3637 Update lnotab if necessary.
Jeremy Hylton376e63d2003-08-28 14:42:14 +00003638*/
3639
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003640static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003641assemble_emit(struct assembler *a, struct instr *i)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003642{
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003643 int size, arg = 0, ext = 0;
Neal Norwitz2585ad52006-06-12 02:09:34 +00003644 Py_ssize_t len = PyString_GET_SIZE(a->a_bytecode);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003645 char *code;
3646
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003647 size = instrsize(i);
3648 if (i->i_hasarg) {
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003649 arg = i->i_oparg;
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003650 ext = arg >> 16;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003651 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003652 if (i->i_lineno && !assemble_lnotab(a, i))
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003653 return 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003654 if (a->a_offset + size >= len) {
3655 if (_PyString_Resize(&a->a_bytecode, len * 2) < 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003656 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003657 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003658 code = PyString_AS_STRING(a->a_bytecode) + a->a_offset;
3659 a->a_offset += size;
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003660 if (size == 6) {
3661 assert(i->i_hasarg);
3662 *code++ = (char)EXTENDED_ARG;
3663 *code++ = ext & 0xff;
3664 *code++ = ext >> 8;
3665 arg &= 0xffff;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00003666 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003667 *code++ = i->i_opcode;
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003668 if (i->i_hasarg) {
3669 assert(size == 3 || size == 6);
3670 *code++ = arg & 0xff;
3671 *code++ = arg >> 8;
3672 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003673 return 1;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00003674}
3675
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003676static void
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003677assemble_jump_offsets(struct assembler *a, struct compiler *c)
Anthony Baxterc2a5a632004-08-02 06:10:11 +00003678{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003679 basicblock *b;
Neal Norwitzf1d50682005-10-23 23:00:41 +00003680 int bsize, totsize, extended_arg_count, last_extended_arg_count = 0;
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003681 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003682
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003683 /* Compute the size of each block and fixup jump args.
3684 Replace block pointer with position in bytecode. */
Neal Norwitzf1d50682005-10-23 23:00:41 +00003685start:
3686 totsize = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003687 for (i = a->a_nblocks - 1; i >= 0; i--) {
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003688 b = a->a_postorder[i];
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003689 bsize = blocksize(b);
3690 b->b_offset = totsize;
3691 totsize += bsize;
Guido van Rossum25831651993-05-19 14:50:45 +00003692 }
Neal Norwitzf1d50682005-10-23 23:00:41 +00003693 extended_arg_count = 0;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003694 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
3695 bsize = b->b_offset;
3696 for (i = 0; i < b->b_iused; i++) {
3697 struct instr *instr = &b->b_instr[i];
3698 /* Relative jumps are computed relative to
3699 the instruction pointer after fetching
3700 the jump instruction.
3701 */
3702 bsize += instrsize(instr);
3703 if (instr->i_jabs)
3704 instr->i_oparg = instr->i_target->b_offset;
3705 else if (instr->i_jrel) {
3706 int delta = instr->i_target->b_offset - bsize;
3707 instr->i_oparg = delta;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003708 }
Neal Norwitzf1d50682005-10-23 23:00:41 +00003709 else
3710 continue;
3711 if (instr->i_oparg > 0xffff)
3712 extended_arg_count++;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003713 }
3714 }
Neal Norwitzf1d50682005-10-23 23:00:41 +00003715
3716 /* XXX: This is an awful hack that could hurt performance, but
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003717 on the bright side it should work until we come up
Neal Norwitzf1d50682005-10-23 23:00:41 +00003718 with a better solution.
3719
3720 In the meantime, should the goto be dropped in favor
3721 of a loop?
3722
3723 The issue is that in the first loop blocksize() is called
3724 which calls instrsize() which requires i_oparg be set
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003725 appropriately. There is a bootstrap problem because
Neal Norwitzf1d50682005-10-23 23:00:41 +00003726 i_oparg is calculated in the second loop above.
3727
3728 So we loop until we stop seeing new EXTENDED_ARGs.
3729 The only EXTENDED_ARGs that could be popping up are
3730 ones in jump instructions. So this should converge
3731 fairly quickly.
3732 */
3733 if (last_extended_arg_count != extended_arg_count) {
3734 last_extended_arg_count = extended_arg_count;
3735 goto start;
3736 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003737}
3738
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003739static PyObject *
3740dict_keys_inorder(PyObject *dict, int offset)
3741{
3742 PyObject *tuple, *k, *v;
Martin v. Löwis18e16552006-02-15 17:27:45 +00003743 Py_ssize_t i, pos = 0, size = PyDict_Size(dict);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003744
3745 tuple = PyTuple_New(size);
3746 if (tuple == NULL)
3747 return NULL;
3748 while (PyDict_Next(dict, &pos, &k, &v)) {
3749 i = PyInt_AS_LONG(v);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003750 k = PyTuple_GET_ITEM(k, 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003751 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00003752 assert((i - offset) < size);
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003753 assert((i - offset) >= 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003754 PyTuple_SET_ITEM(tuple, i - offset, k);
3755 }
3756 return tuple;
3757}
3758
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003759static int
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003760compute_code_flags(struct compiler *c)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003761{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003762 PySTEntryObject *ste = c->u->u_ste;
3763 int flags = 0, n;
3764 if (ste->ste_type != ModuleBlock)
3765 flags |= CO_NEWLOCALS;
3766 if (ste->ste_type == FunctionBlock) {
3767 if (!ste->ste_unoptimized)
3768 flags |= CO_OPTIMIZED;
3769 if (ste->ste_nested)
3770 flags |= CO_NESTED;
3771 if (ste->ste_generator)
3772 flags |= CO_GENERATOR;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003773 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003774 if (ste->ste_varargs)
3775 flags |= CO_VARARGS;
3776 if (ste->ste_varkeywords)
3777 flags |= CO_VARKEYWORDS;
Tim Peters5ca576e2001-06-18 22:08:13 +00003778 if (ste->ste_generator)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003779 flags |= CO_GENERATOR;
Thomas Wouters5e9f1fa2006-02-28 20:02:27 +00003780
3781 /* (Only) inherit compilerflags in PyCF_MASK */
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003782 flags |= (c->c_flags->cf_flags & PyCF_MASK);
Thomas Wouters5e9f1fa2006-02-28 20:02:27 +00003783
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003784 n = PyDict_Size(c->u->u_freevars);
3785 if (n < 0)
3786 return -1;
3787 if (n == 0) {
3788 n = PyDict_Size(c->u->u_cellvars);
3789 if (n < 0)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00003790 return -1;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003791 if (n == 0) {
3792 flags |= CO_NOFREE;
3793 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003794 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00003795
Jeremy Hylton29906ee2001-02-27 04:23:34 +00003796 return flags;
3797}
3798
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003799static PyCodeObject *
3800makecode(struct compiler *c, struct assembler *a)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003801{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003802 PyObject *tmp;
3803 PyCodeObject *co = NULL;
3804 PyObject *consts = NULL;
3805 PyObject *names = NULL;
3806 PyObject *varnames = NULL;
3807 PyObject *filename = NULL;
3808 PyObject *name = NULL;
3809 PyObject *freevars = NULL;
3810 PyObject *cellvars = NULL;
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003811 PyObject *bytecode = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003812 int nlocals, flags;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003813
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003814 tmp = dict_keys_inorder(c->u->u_consts, 0);
3815 if (!tmp)
3816 goto error;
3817 consts = PySequence_List(tmp); /* optimize_code requires a list */
3818 Py_DECREF(tmp);
3819
3820 names = dict_keys_inorder(c->u->u_names, 0);
3821 varnames = dict_keys_inorder(c->u->u_varnames, 0);
3822 if (!consts || !names || !varnames)
3823 goto error;
3824
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003825 cellvars = dict_keys_inorder(c->u->u_cellvars, 0);
3826 if (!cellvars)
3827 goto error;
3828 freevars = dict_keys_inorder(c->u->u_freevars, PyTuple_Size(cellvars));
3829 if (!freevars)
3830 goto error;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003831 filename = PyString_FromString(c->c_filename);
3832 if (!filename)
3833 goto error;
3834
Jeremy Hyltone9357b22006-03-01 15:47:05 +00003835 nlocals = PyDict_Size(c->u->u_varnames);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003836 flags = compute_code_flags(c);
3837 if (flags < 0)
3838 goto error;
3839
Jeremy Hylton644dddc2006-08-21 16:19:37 +00003840 bytecode = PyCode_Optimize(a->a_bytecode, consts, names, a->a_lnotab);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003841 if (!bytecode)
3842 goto error;
3843
3844 tmp = PyList_AsTuple(consts); /* PyCode_New requires a tuple */
3845 if (!tmp)
3846 goto error;
3847 Py_DECREF(consts);
3848 consts = tmp;
3849
3850 co = PyCode_New(c->u->u_argcount, nlocals, stackdepth(c), flags,
3851 bytecode, consts, names, varnames,
3852 freevars, cellvars,
3853 filename, c->u->u_name,
3854 c->u->u_firstlineno,
3855 a->a_lnotab);
3856 error:
3857 Py_XDECREF(consts);
3858 Py_XDECREF(names);
3859 Py_XDECREF(varnames);
3860 Py_XDECREF(filename);
3861 Py_XDECREF(name);
3862 Py_XDECREF(freevars);
3863 Py_XDECREF(cellvars);
3864 Py_XDECREF(bytecode);
3865 return co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003866}
3867
Neal Norwitz4ffedad2006-08-04 04:58:47 +00003868
3869/* For debugging purposes only */
3870#if 0
3871static void
3872dump_instr(const struct instr *i)
3873{
3874 const char *jrel = i->i_jrel ? "jrel " : "";
3875 const char *jabs = i->i_jabs ? "jabs " : "";
3876 char arg[128];
3877
3878 *arg = '\0';
3879 if (i->i_hasarg)
3880 sprintf(arg, "arg: %d ", i->i_oparg);
3881
3882 fprintf(stderr, "line: %d, opcode: %d %s%s%s\n",
3883 i->i_lineno, i->i_opcode, arg, jabs, jrel);
3884}
3885
3886static void
3887dump_basicblock(const basicblock *b)
3888{
3889 const char *seen = b->b_seen ? "seen " : "";
3890 const char *b_return = b->b_return ? "return " : "";
3891 fprintf(stderr, "used: %d, depth: %d, offset: %d %s%s\n",
3892 b->b_iused, b->b_startdepth, b->b_offset, seen, b_return);
3893 if (b->b_instr) {
3894 int i;
3895 for (i = 0; i < b->b_iused; i++) {
3896 fprintf(stderr, " [%02d] ", i);
3897 dump_instr(b->b_instr + i);
3898 }
3899 }
3900}
3901#endif
3902
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003903static PyCodeObject *
3904assemble(struct compiler *c, int addNone)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003905{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003906 basicblock *b, *entryblock;
3907 struct assembler a;
3908 int i, j, nblocks;
3909 PyCodeObject *co = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003910
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003911 /* Make sure every block that falls off the end returns None.
3912 XXX NEXT_BLOCK() isn't quite right, because if the last
3913 block ends with a jump or return b_next shouldn't set.
3914 */
3915 if (!c->u->u_curblock->b_return) {
3916 NEXT_BLOCK(c);
3917 if (addNone)
3918 ADDOP_O(c, LOAD_CONST, Py_None, consts);
3919 ADDOP(c, RETURN_VALUE);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003920 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003921
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003922 nblocks = 0;
3923 entryblock = NULL;
3924 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
3925 nblocks++;
3926 entryblock = b;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003927 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003928
Neal Norwitzed657552006-07-10 00:04:44 +00003929 /* Set firstlineno if it wasn't explicitly set. */
3930 if (!c->u->u_firstlineno) {
3931 if (entryblock && entryblock->b_instr)
3932 c->u->u_firstlineno = entryblock->b_instr->i_lineno;
3933 else
3934 c->u->u_firstlineno = 1;
3935 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003936 if (!assemble_init(&a, nblocks, c->u->u_firstlineno))
3937 goto error;
3938 dfs(c, entryblock, &a);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003939
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003940 /* Can't modify the bytecode after computing jump offsets. */
Neal Norwitz7d37f2f2005-10-23 22:40:47 +00003941 assemble_jump_offsets(&a, c);
Tim Petersb6c3cea2001-06-26 03:36:28 +00003942
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003943 /* Emit code in reverse postorder from dfs. */
3944 for (i = a.a_nblocks - 1; i >= 0; i--) {
Neal Norwitz08b401f2006-01-07 21:24:09 +00003945 b = a.a_postorder[i];
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003946 for (j = 0; j < b->b_iused; j++)
3947 if (!assemble_emit(&a, &b->b_instr[j]))
3948 goto error;
Tim Petersb6c3cea2001-06-26 03:36:28 +00003949 }
Tim Petersb6c3cea2001-06-26 03:36:28 +00003950
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003951 if (_PyString_Resize(&a.a_lnotab, a.a_lnotab_off) < 0)
3952 goto error;
3953 if (_PyString_Resize(&a.a_bytecode, a.a_offset) < 0)
3954 goto error;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003955
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00003956 co = makecode(c, &a);
3957 error:
3958 assemble_free(&a);
3959 return co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003960}